[fpc-devel] div creates wrong results on cortexm0

Michael Ring mail at michael-ring.org
Sat Jan 26 18:16:55 CET 2019


My basic testcase looks fine now and also the 'real' code now works as 
expected when I switch back from shr commands to div

Thank you very much, Jeppe!


Michael

Am 26.01.19 um 15:20 schrieb Jeppe Johansen:
> Does the attached patch work?
>
> On 1/26/19 12:20 PM, Michael Ring wrote:
>> I thought I was going crazy when debugging code that worked fine on 
>> cortex m3/4 but created unexpected results on cortex m0.
>>
>> Turns out that the compiler creates incorrect assembler code for 
>> cortexm0 for div when used with constant expressions. Optimization 
>> level was -O1 and -O-
>>
>> Take this code:
>>
>> program divtest;
>> var
>>   a,b,c,d : word;
>> begin
>>   a := 64;
>>   b := 8;
>>   c := a div 8; //.LI4
>>   d := a div b; //.LI5
>> end.
>>
>> looking at the assembler code it is very evident that no shift 
>> operations are done on cortex m0 (see .LI4). Is this a known issue or 
>> should I create a new one in bugzilla? (Search did not reveal a hit 
>> that looked like a match)
>>
>> Michael
>>
>> assembler cortex m0:
>>
>> .Ll2:
>>     mov    r1,#64
>>     ldr    r0,.Lj3
>>     strh    r1,[r0]
>> .Ll3:
>>     mov    r1,#8
>>     ldr    r0,.Lj4
>>     strh    r1,[r0]
>> .Ll4:
>>     ldr    r0,.Lj3
>>     ldrh    r0,[r0]
>>     uxth    r0,r0
>>     ldr    r1,.Lj6
>>     strh    r0,[r1]
>> .Ll5:
>>     ldr    r0,.Lj3
>>     ldrh    r1,[r0]
>>     ldr    r0,.Lj4
>>     ldrh    r0,[r0]
>>     bl    fpc_div_longint
>>     uxth    r0,r0
>>     ldr    r1,.Lj9
>>     strh    r0,[r1]
>>
>> assembler cortex m4:
>>
>> .Ll2:
>>     movs    r1,#64
>>     ldr    r0,.Lj3
>>     strh    r1,[r0]
>> .Ll3:
>>     movs    r1,#8
>>     ldr    r0,.Lj4
>>     strh    r1,[r0]
>> .Ll4:
>>     ldr    r0,.Lj3
>>     ldrh    r0,[r0]
>>     asrs    r1,r0,#31
>>     add    r0,r0,r1,lsr #29
>>     asrs    r0,#3
>>     uxth    r1,r0
>>     ldr    r0,.Lj6
>>     strh    r1,[r0]
>> .Ll5:
>>     ldr    r0,.Lj3
>>     ldrh    r0,[r0]
>>     ldr    r1,.Lj4
>>     ldrh    r1,[r1]
>>     sdiv    r0,r0,r1
>>     uxth    r0,r0
>>     ldr    r1,.Lj9
>>     strh    r0,[r1]



More information about the fpc-devel mailing list