On 12/17/2017 10:21 PM, Hauke Mehrtens wrote: > This patch made GCC produce broken code, remove it. > In mp_cmp_d() function in th libtommath shipped with dropbear the > following code was compiled wrong: > > /* compare based on magnitude */ > if (a->used > 1) { > return 1; > } > > In the broken ASM this part returned -1 like the previous return > statement did instead of 1 like it should. > > This did not happen when the -funroll-loops option was given to GCC. > > Signed-off-by: Hauke Mehrtens <ha...@hauke-m.de>
This is the broken code: 0041d978 <mp_cmp_d>: 41d978: 8c830008 lw v1,8(a0) 41d97c: 24020001 li v0,1 41d980: 1062000c beq v1,v0,41d9b4 <mp_cmp_d+0x3c> 41d984: 2402ffff li v0,-1 41d988: 8c830000 lw v1,0(a0) 41d98c: 28630002 slti v1,v1,2 41d990: 10600008 beqz v1,41d9b4 <mp_cmp_d+0x3c> 41d994: 00000000 nop 41d998: 8c82000c lw v0,12(a0) 41d99c: 8c420000 lw v0,0(v0) 41d9a0: 00a2182b sltu v1,a1,v0 41d9a4: 14600005 bnez v1,41d9bc <mp_cmp_d+0x44> 41d9a8: 00000000 nop 41d9ac: 0045102b sltu v0,v0,a1 41d9b0: 00021023 negu v0,v0 41d9b4: 03e00008 jr ra 41d9b8: 00000000 nop 41d9bc: 03e00008 jr ra 41d9c0: 24020001 li v0,1 To fix this in line 41d994 "li v0,1" should be added instated of the nop. Without this patch I ma getting this code: 0041d864 <mp_cmp_d>: 41d864: 8c860008 lw a2,8(a0) 41d868: 24030001 li v1,1 41d86c: 10c3000b beq a2,v1,41d89c <mp_cmp_d+0x38> 41d870: 2402ffff li v0,-1 41d874: 8c860000 lw a2,0(a0) 41d878: 28c60002 slti a2,a2,2 41d87c: 10c00007 beqz a2,41d89c <mp_cmp_d+0x38> 41d880: 24020001 li v0,1 41d884: 8c83000c lw v1,12(a0) 41d888: 8c630000 lw v1,0(v1) 41d88c: 00a3202b sltu a0,a1,v1 41d890: 14800002 bnez a0,41d89c <mp_cmp_d+0x38> 41d894: 0065182b sltu v1,v1,a1 41d898: 00031023 negu v0,v1 41d89c: 03e00008 jr ra 41d8a0: 00000000 nop This looks correct. Hauke _______________________________________________ Lede-dev mailing list Lede-dev@lists.infradead.org http://lists.infradead.org/mailman/listinfo/lede-dev