Jump to content

    
jcxz

Баг IAR 7.80.4 (ARM) при работе с float.

Recommended Posts

8 минут назад, jcxz сказал:

Но если целевая переменная в памяти - u16, то не поможет:

Гм... нехорошо. Ждём-с ответа шведов:crazy: Но вот действительно вопрос: как жи никто не напоролся на этот баг? Хотя бы на этом форуме кто-то же должен был. Я тоже не работаю активно с float, да и не всегда с cortex-m4f. Может быть народ просто молчал, думая, что это их собственный глюк, но никак ни компилятора...

Edited by MrBearManul

Share this post


Link to post
Share on other sites
4 минуты назад, MrBearManul сказал:

Но вот действительно вопрос: как жи никто не напоролся на этот баг?

Каков процент пользователей IAR из общего количества эмбеддеров? Сколько из них пользуется float? Как  часто те кто пользуется умножают на 2^n и усекают до 16 бит?

Лично я последний раз в 2006 году использовал плавучку и то в double.

Share this post


Link to post
Share on other sites

Вобщем шведы признали баг существующим, поблагодарили и взяли время на обдумывание.

Наверное это всё будет не быстро, так как Christmas на носу...

Share this post


Link to post
Share on other sites
3 часа назад, jcxz сказал:

поблагодарили и взяли время на обдумывание

Спасибо, что пишите/создаете интересные посты/темы. Я ИАР-ом никогда не пользовался (может очень давно для пик-ов пробовал один просто раз запустить/посмотреть и все) и надеюсь не буду им пользоваться. Но в этой теме некоторое кол-во полезной инфы подчерпнул как всегда. Просто случайно видел несколько раз, что на радиохвосте Вас постоянно минусуют просто так и от нечего делать (а скорее видать там "каста" какая-то "избранных" и пр.) и решил по справедливости поблагодарить хотя бы тут (на радиокоте не участвую).

Share this post


Link to post
Share on other sites
49 минут назад, AleksBak сказал:

радиохвосте Вас постоянно минусуют просто так

Это же форум радиолюбителей, т.е. непрофессионалов. Им простительно непонимать некоторые наши заморочки. Хотя несколько толковых людей, которые делают уникальные вещи на очень высоком уровне там есть.

50 минут назад, AleksBak сказал:

Спасибо, что пишите/создаете интересные посты/темы.

+1!

Share this post


Link to post
Share on other sites

Наконец-то появились подвижки по этому багу.  :dance4:

Сегодня от IAR получил письмо: багу присвоен идентификатор "EWARM-8271" и исправление его поставлено в план на 2-й квартал этого года.

Ближайшая версия IAR выйдет уже скоро и ещё с этим багом, а потом вроде будет какой-то сервис-пак, который его пофиксит.

Причину его они вроде уже нашли и это гуд! Вот что пишут:

The compiler-developer (who has made the initial examination) has found (1) reason for the bug and a suggestion (2) for a workaround.
His comments:
(1) This bug triggers in all optimization levels as it occurs in the phase where instructions are selected.
(2) The problem is that the signedness of res16/res32 is used. Declaring these as signed is a workaround.

Share this post


Link to post
Share on other sites

Вчера получил хорошую весть от IAR-овцев по поводу этого бага:

The bug got so much attention so it will be corrected in version 9.10.1.
(I earlier informed you that correction wa planned in the next service pack 9.10.2) 
So instead of having to wait till May (for the 9.10.2) the bug will be corrected in 9.10.1 in February/March,

Так что в ближайшем выпуске ждём исправления.   :dance4:

Share this post


Link to post
Share on other sites

Пофиксили. Должно заработать. Но что-то я не уверен в оптимальности того что получается.

Вот, например, на "size"

        VMOV.F32 S0,#8.0                        
//res16 = (int)(x * 8) + 0x00008000ul;  
        VLDR     S1,[R1, #0]    
        VMUL.F32 S1,S1,S0       
        VCVT.S32.F32 S1,S1          
        VMOV     R3,S1          
        SUB      R3,R3,#+32768           

//res32 = (int)(x * 16) + 0x00008000ul;  
        VLDR     S0,[R1, #0]    
        VCVT.S32.F32 S0,S0,#+4      
        VMOV     R4,S0          
        ADD      R4,R4,#+32768  

А это на "speed"

//res16 = (int)(x * 8) + 0x00008000ul;  
        VLDR     S0,[R2, #0]    
        VCVT.S32.F32 S0,S0,#+3      
        VMOV     R3,S0          
        SUB      R3,R3,#+32768  

//res32 = (int)(x * 16) + 0x00008000ul; 
        VMOV.F32 S0,#16.0       
        VLDR     S1,[R2, #0]    
        VMUL.F32 S1,S1,S0       
        VCVT.S32.F32 S1,S1          
        VMOV     R3,S1          
        ADD      R3,R3,#+32768 

PS: Я правда циклы и загрузки в память из памяти в листинге почикал.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.