<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.arm.com/utility/feedstylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Permenter_w's Groups Activities</title><link>https://community.arm.com/members/permenter_5f00_w</link><description>Recent activity for people in Permenter_w's group</description><dc:language>en-US</dc:language><generator>Telligent Community 10</generator><item><title>arm-none-eabi-gcc uses floating point register to backup GPR in case of -O2 option</title><link>https://community.arm.com/developer/tools-software/oss-platforms/f/gnu-toolchain-forum/47795/arm-none-eabi-gcc-uses-floating-point-register-to-backup-gpr-in-case-of--o2-option</link><pubDate>Thu, 08 Oct 2020 06:08:44 GMT</pubDate><guid isPermaLink="false">dd9e70c8-6d3c-4c71-b136-2456382a7b5c:dd58e382-b004-4e0d-8963-2bd567c1012f</guid><dc:creator>Jacek Wywr&amp;#243;t</dc:creator><description>&lt;p&gt;arm-none-eabi-gcc version:&lt;br /&gt;(GNU Arm Embedded Toolchain 9-2020-q2-update) 9.3.1 20200408 (release)&lt;/p&gt;
&lt;p&gt;When using following compiler flags:&lt;br /&gt;-O2 -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16&lt;/p&gt;
&lt;p&gt;the compiler use floating point register s16 as cache for general pur pose integral registers of Cortex M4 core.&lt;/p&gt;
&lt;p&gt;This is done even though the function doesn&amp;#39;t do explicit floating point operations.&lt;br /&gt;I use RTOS for which FPU usage is restricted to certain tasks/threads.&lt;br /&gt;In that case task executing the function fails with UsageFault/NOCP.&lt;/p&gt;
&lt;p&gt;This happens when O2 optimization is used, in case of lower optimization levels problem doesn&amp;#39;t occur.&lt;br /&gt;Is that maybe possible to prohibit compiler from that kind of agressive optimization (using FPU registers to store GPR data)?&lt;/p&gt;
&lt;p&gt;Some disassembler indication of the issue:&lt;/p&gt;
&lt;p&gt;static void fun(void *args)&lt;br /&gt;{&lt;br /&gt;100149cc: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}&lt;br /&gt;&lt;em&gt;# d8 floating point register pushed&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;100149d0: ed2d 8b02 vpush {d8}&lt;/strong&gt;&lt;br /&gt;100149d4: 4d77 ldr r5, [pc, #476] ; (10014bb4 &amp;lt;fun+0x1e8&amp;gt;)&lt;br /&gt;&lt;em&gt;# r4 being loaded with a static variable pointer (to be used later in call to fun7)&lt;/em&gt;&lt;br /&gt;100149d6: 4c78 ldr r4, [pc, #480] ; (10014bb8 &amp;lt;fun+0x1ec&amp;gt;)&lt;br /&gt;...&lt;br /&gt;100149fa: f001 fd3b bl 10016474 &amp;lt;fun3&amp;gt;&lt;br /&gt;&lt;em&gt;# the pointer been backed up in s16?&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;100149fe: ee08 4a10 vmov s16, r4&lt;/strong&gt;&lt;br /&gt;10014a02: f000 ff9b bl 1001593c &amp;lt;fun4&amp;gt;&lt;br /&gt;10014a06: f000 fb87 bl 10015118 &amp;lt;fun5&amp;gt;&lt;br /&gt;10014a0a: f240 5305 movw r3, #1285 ; 0x505&lt;br /&gt;10014a0e: 2205 movs r2, #5&lt;br /&gt;10014a10: f990 1010 ldrsb.w r1, [r0, #16]&lt;br /&gt;10014a14: 7482 strb r2, [r0, #18]&lt;br /&gt;10014a16: 9105 str r1, [sp, #20]&lt;br /&gt;10014a18: 8a01 ldrh r1, [r0, #16]&lt;br /&gt;10014a1a: 8203 strh r3, [r0, #16]&lt;br /&gt;10014a1c: 9106 str r1, [sp, #24]&lt;br /&gt;10014a1e: 4605 mov r5, r0&lt;br /&gt;10014a20: f001 f816 bl 10015a50 &amp;lt;fun6&amp;gt;&lt;br /&gt;10014a24: f06f 4100 mvn.w r1, #2147483648 ; 0x80000000&lt;br /&gt;&lt;em&gt;# previously backed up pointer being restored to GPR&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;10014a28: ee18 0a10 vmov r0, s16&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;# the pointer being used in function call&lt;/em&gt;&lt;br /&gt;10014a2c: f7fd ff46 bl 100128bc &amp;lt;fun7&amp;gt;&lt;/p&gt;
&lt;p&gt;I&amp;#39;ll appreciate if someone help me with this issue.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>