Écrire ffs/ffc avec des compiler builtin
TODO faire une branche et proposer le changement a Alain
Raison: Moins de code à maintenir, plus lisible, pas besoin de modifier pour avoir des perfs correctes sur plusieurs architectures.
Comparaison des 2 asm emits:
Tailles des binaires finaux:
Sans builtin
bitmap_ffs
0001f13c <bitmap_ffs>:
1f13c: 10a00019 beqz a1,1f1a4 <bitmap_ffs+0x68>
1f140: 24a5ffff addiu a1,a1,-1
1f144: 00054942 srl t1,a1,0x5
1f148: 8c850000 lw a1,0(a0)
1f14c: 00003025 move a2,zero
1f150: 24070001 li a3,1
1f154: 14a00007 bnez a1,1f174 <bitmap_ffs+0x38>
1f158: 24080020 li t0,32
1f15c: 24c20001 addiu v0,a2,1
1f160: 11260010 beq t1,a2,1f1a4 <bitmap_ffs+0x68>
1f164: 24840004 addiu a0,a0,4
1f168: 8c850000 lw a1,0(a0)
1f16c: 10a0fffb beqz a1,1f15c <bitmap_ffs+0x20>
1f170: 00403025 move a2,v0
1f174: 10000003 b 1f184 <bitmap_ffs+0x48>
1f178: 00001025 move v0,zero
1f17c: 1048fff7 beq v0,t0,1f15c <bitmap_ffs+0x20>
1f180: 00000000 nop
1f184: 00471804 sllv v1,a3,v0
1f188: 00651824 and v1,v1,a1
1f18c: 1060fffb beqz v1,1f17c <bitmap_ffs+0x40>
1f190: 24420001 addiu v0,v0,1
1f194: 2442ffff addiu v0,v0,-1
1f198: 00063140 sll a2,a2,0x5
1f19c: 03e00008 jr ra
1f1a0: 00c21021 addu v0,a2,v0
1f1a4: 03e00008 jr ra
1f1a8: 2402ffff li v0,-1
bitmap_ffc
0001f1ac <bitmap_ffc>:
1f1ac: 10a0001a beqz a1,1f218 <bitmap_ffc+0x6c>
1f1b0: 24a5ffff addiu a1,a1,-1
1f1b4: 00054942 srl t1,a1,0x5
1f1b8: 8c850000 lw a1,0(a0)
1f1bc: 240affff li t2,-1
1f1c0: 00004025 move t0,zero
1f1c4: 24060001 li a2,1
1f1c8: 14aa0007 bne a1,t2,1f1e8 <bitmap_ffc+0x3c>
1f1cc: 24070020 li a3,32
1f1d0: 25020001 addiu v0,t0,1
1f1d4: 11280010 beq t1,t0,1f218 <bitmap_ffc+0x6c>
1f1d8: 24840004 addiu a0,a0,4
1f1dc: 8c850000 lw a1,0(a0)
1f1e0: 10aafffb beq a1,t2,1f1d0 <bitmap_ffc+0x24>
1f1e4: 00404025 move t0,v0
1f1e8: 10000003 b 1f1f8 <bitmap_ffc+0x4c>
1f1ec: 00001025 move v0,zero
1f1f0: 1047fff7 beq v0,a3,1f1d0 <bitmap_ffc+0x24>
1f1f4: 00000000 nop
1f1f8: 00461804 sllv v1,a2,v0
1f1fc: 00651824 and v1,v1,a1
1f200: 1460fffb bnez v1,1f1f0 <bitmap_ffc+0x44>
1f204: 24420001 addiu v0,v0,1
1f208: 2442ffff addiu v0,v0,-1
1f20c: 00084140 sll t0,t0,0x5
1f210: 03e00008 jr ra
1f214: 01021021 addu v0,t0,v0
1f218: 03e00008 jr ra
1f21c: 2402ffff li v0,-1
Avec builtins
0001f0b0 <bitmap_ffs>:
1f0b0: 24a5ffff addiu a1,a1,-1
1f0b4: 00051942 srl v1,a1,0x5
1f0b8: 00031880 sll v1,v1,0x2
1f0bc: 24820004 addiu v0,a0,4
1f0c0: 00621821 addu v1,v1,v0
1f0c4: 8c820000 lw v0,0(a0)
1f0c8: 14400005 bnez v0,1f0e0 <bitmap_ffs+0x30>
1f0cc: 24840004 addiu a0,a0,4
1f0d0: 1464fffc bne v1,a0,1f0c4 <bitmap_ffs+0x14>
1f0d4: 2402ffff li v0,-1
1f0d8: 03e00008 jr ra
1f0dc: 00000000 nop
1f0e0: 00021823 negu v1,v0
1f0e4: 00431024 and v0,v0,v1
1f0e8: 70421020 clz v0,v0
1f0ec: 2403001f li v1,31
1f0f0: 03e00008 jr ra
1f0f4: 00621023 subu v0,v1,v0
0001f0f8 <bitmap_ffc>:
1f0f8: 24a5ffff addiu a1,a1,-1
1f0fc: 00051942 srl v1,a1,0x5
1f100: 00031880 sll v1,v1,0x2
1f104: 24820004 addiu v0,a0,4
1f108: 00621821 addu v1,v1,v0
1f10c: 2405ffff li a1,-1
1f110: 8c820000 lw v0,0(a0)
1f114: 14450005 bne v0,a1,1f12c <bitmap_ffc+0x34>
1f118: 24840004 addiu a0,a0,4
1f11c: 1464fffc bne v1,a0,1f110 <bitmap_ffc+0x18>
1f120: 2402ffff li v0,-1
1f124: 03e00008 jr ra
1f128: 00000000 nop
1f12c: 00021027 nor v0,zero,v0
1f130: 00021823 negu v1,v0
1f134: 00431024 and v0,v0,v1
1f138: 70421020 clz v0,v0
1f13c: 2403001f li v1,31
1f140: 03e00008 jr ra
1f144: 00621023 subu v0,v1,v0
Aller plus loin
Implementer bitmap_ffc avec bitmap_ffs si la taille du binaire est une contrainte.
Edited by Viala axel