Richard Pennington
2013-Oct-03 10:49 UTC
[LLVMdev] Help with a Microblaze code generation problem.
Sorry if this is a duplicate: I tried to send it last night and it didn't go through. I'm trimming some text to see if it helps. I have a simple program that fails on the Microblaze: int main() { unsigned long long x, y; x = 100; y = 0x8000000000000000ULL; return !(x > y); } As you can see, the test case compares two unsigned long long values. To try to track the problem down I tried compiling it for the Mips (which works, of course) for both unsigned long long and signed long long with the following results: unsigned long long: main: .frame $fp,24,$ra .mask 0x40000000,-4 .fmask 0x00000000,0 .set noreorder .set nomacro .set noat addiu $sp, $sp, -24 sw $fp, 20($sp) move $fp, $sp sw $zero, 16($fp) addiu $1, $zero, 100 sw $1, 12($fp) sw $zero, 8($fp) lui $1, 32768 sw $1, 0($fp) sw $zero, 4($fp) lw $2, 8($fp) xor $1, $2, $1 addiu $3, $zero, -1 slt $2, $3, $2 lw $3, 12($fp) sltiu $3, $3, 1 movz $2, $3, $1 move $sp, $fp lw $fp, 20($sp) addiu $sp, $sp, 24 jr $ra nop signed long long: main: .frame $fp,24,$ra .mask 0x40000000,-4 .fmask 0x00000000,0 .set noreorder .set nomacro .set noat addiu $sp, $sp, -24 sw $fp, 20($sp) move $fp, $sp sw $zero, 16($fp) addiu $1, $zero, 100 sw $1, 12($fp) sw $zero, 8($fp) lui $1, 32768 sw $1, 0($fp) sw $zero, 4($fp) lw $2, 8($fp) xor $1, $2, $1 lw $2, 12($fp) or $1, $2, $1 sltiu $2, $1, 1 move $sp, $fp lw $fp, 20($sp) addiu $sp, $sp, 24 jr $ra nop The two comparisons are very similar. For the Microblaze, I get: signed long long: main: .frame r19,40,r15 .mask 0x80000 addik r1, r1, -40 swi r19, r1, 4 add r19, r1, r0 swi r0, r19, 8 addik r3, r0, 100 swi r3, r19, 20 swi r0, r19, 16 addik r3, r0, -2147483648 swi r3, r19, 24 swi r0, r19, 28 lwi r4, r19, 16 xor r3, r4, r3 lwi r4, r19, 20 or r3, r4, r3 addik r4, r0, 0 addik r5, r0, 1 swi r5, r19, 32 beqid r3, ($BB0_2) swi r4, r19, 36 lwi r3, r19, 36 swi r3, r19, 32 $BB0_2: lwi r3, r19, 32 add r1, r19, r0 lwi r19, r1, 4 rtsd r15, 8 addik r1, r1, 40 .end main Which is very similar to the Mips version. But for unsigned long long, I get: main: .frame r19,76,r15 .mask 0x80000 addik r1, r1, -76 swi r19, r1, 4 add r19, r1, r0 swi r0, r19, 8 addik r3, r0, 100 swi r3, r19, 20 swi r0, r19, 16 addik r3, r0, -2147483648 swi r3, r19, 24 swi r0, r19, 28 addik r4, r0, -1 lwi r5, r19, 16 cmp r4, r4, r5 cmp r3, r3, r5 main% cat PR54.mbu .file "PR54.c" .text .globl main .align 2 .type main, at function .ent main addik r5, r0, 0 addik r6, r0, 1 lwi r7, r19, 20 addk r8, r6, r0 swi r4, r19, 32 swi r3, r19, 36 swi r5, r19, 40 swi r6, r19, 44 beqid r7, ($BB0_2) swi r8, r19, 48 lwi r3, r19, 40 swi r3, r19, 48 $BB0_2: lwi r3, r19, 48 lwi r4, r19, 44 lwi r5, r19, 36 swi r3, r19, 52 beqid r5, ($BB0_4) swi r4, r19, 56 lwi r3, r19, 40 swi r3, r19, 56 $BB0_4: lwi r3, r19, 56 lwi r4, r19, 44 lwi r5, r19, 32 swi r3, r19, 60 bgtid r5, ($BB0_6) swi r4, r19, 64 lwi r3, r19, 40 swi r3, r19, 64 $BB0_6: lwi r3, r19, 64 lwi r4, r19, 52 lwi r5, r19, 60 swi r3, r19, 68 bneid r5, ($BB0_8) swi r4, r19, 72 lwi r3, r19, 68 swi r3, r19, 72 $BB0_8: lwi r3, r19, 72 add r1, r19, r0 lwi r19, r1, 4 rtsd r15, 8 addik r1, r1, 76 which is quite a bit different from the signed version and obviously quite a bit longer. I have two questions. 1. Where is the transformation made for a 64 bit comparison to this code? I can't seem to find it. 2. What might be missing in the Microblaze code generator that the unsigned case is failing so badly? I know that the Microblaze has been removed from current. This is part of my feeble attempt to keep it alive in my source tree until I can devote the time to bring it back to the main line. Thanks for any help or suggestions. -Rich
Richard Pennington
2013-Oct-03 11:06 UTC
[LLVMdev] Help with a Microblaze code generation problem.
On 10/03/2013 05:49 AM, Richard Pennington wrote:> Sorry if this is a duplicate: I tried to send it last night and it > didn't go through. I'm trimming some text to see if it helps.Cut and paste error for the unsigned long long Microblaze version. It should be: .globl main .align 2 .type main, at function .ent main main: .frame r19,76,r15 .mask 0x80000 addik r1, r1, -76 swi r19, r1, 4 add r19, r1, r0 swi r0, r19, 8 addik r3, r0, 100 swi r3, r19, 20 swi r0, r19, 16 addik r3, r0, -2147483648 swi r3, r19, 24 swi r0, r19, 28 addik r4, r0, -1 lwi r5, r19, 16 cmp r4, r4, r5 cmp r3, r3, r5 addik r5, r0, 0 addik r6, r0, 1 lwi r7, r19, 20 addk r8, r6, r0 swi r4, r19, 32 swi r3, r19, 36 swi r5, r19, 40 swi r6, r19, 44 beqid r7, ($BB0_2) swi r8, r19, 48 lwi r3, r19, 40 swi r3, r19, 48 $BB0_2: lwi r3, r19, 48 lwi r4, r19, 44 lwi r5, r19, 36 swi r3, r19, 52 beqid r5, ($BB0_4) swi r4, r19, 56 lwi r3, r19, 40 swi r3, r19, 56 $BB0_4: lwi r3, r19, 56 lwi r4, r19, 44 lwi r5, r19, 32 swi r3, r19, 60 bgtid r5, ($BB0_6) swi r4, r19, 64 lwi r3, r19, 40 swi r3, r19, 64 $BB0_6: lwi r3, r19, 64 lwi r4, r19, 52 lwi r5, r19, 60 swi r3, r19, 68 bneid r5, ($BB0_8) swi r4, r19, 72 lwi r3, r19, 68 swi r3, r19, 72 $BB0_8: lwi r3, r19, 72 add r1, r19, r0 lwi r19, r1, 4 rtsd r15, 8 addik r1, r1, 76 .end main $tmp0: .size main, ($tmp0)-main -Rich