Alors, il ne code pas si mal ce bon vieux Ben! ;-) Ben On Wed, Mar 13, 2002 at 10:53:36AM, Michael Stilmant wrote: > bonjour, > > ca fait quelque temps que je me demandais si une manipulation de bits via > champs de bit pourrais être fait de façon optimisé en assembleur. Alors j'ai > fait ce teste une fois pour toute. > vous avez ci dessous du code source en C avec le résultat en assembleur > intercalé. > > Il semblerais que ce soit très bien comme solution et ca rend le code source > plus clair. > > donc ... > > main() > { > > int i; > unsigned char test; > > struct One_by_One > { > unsigned char a:1; > unsigned char b:1; > unsigned char c:1; > unsigned char d:1; > unsigned char e:1; > unsigned char f:1; > unsigned char g:1; > unsigned char h:1; > }; > > union > { > unsigned char o; > struct One_by_One b; > } plok; > > plok.o = 145; > > .LM3: > mov r3, #145 > mov r2, r3 > strb r2, [fp, #-18] /* plok se trouve sur le stack en -18 */ > .stabn 68,0,27,.LM4-_main > > test = 145; > > .LM4: > mov r3, #145 > mov r2, r3 > strb r2, [fp, #-17] /* test se trouve sur le stack en -17 */ > .stabn 68,0,29,.LM5-_main > > plok.b.a = 1; > > .LM5: > ldrb r3, [fp, #-18] /* on cas rechercher plok from stack */ > orr r2, r3, #1 /* le OR attendus (! bits inversés en > mémoire) */ > mov r3, r2 > strb r3, [fp, #-18] > .stabn 68,0,31,.LM6-_main > > plok.b.e = 1; > > .LM6: > ldrb r3, [fp, #-18] > orr r2, r3, #16 > mov r3, r2 > strb r3, [fp, #-18] > .stabn 68,0,33,.LM7-_main > > plok.b.g = 0; > > .LM7: > ldrb r3, [fp, #-18] > and r2, r3, #191 /* pil poil se qu'on peux imaginer */ > mov r3, r2 > strb r3, [fp, #-18] > .stabn 68,0,35,.LM8-_main > > if (plok.b.d == 1) > > .LM8: > ldrb r3, [fp, #-18] > and r2, r3, #8 /* tout a zero sauf le bit d */ > and r3, r2, #255 /* partie haute du registre a zero, c'est > ici qu'on pourrais suspecter un > manque d'optimisation, mais j'ai pas > compilé, ici en full optimisation */ > cmp r3, #0 > beq L2 > .stabn 68,0,36,.LM9-_main > > i = 632; > else > i = 237; > > if ((plok.o & 4) == 4) > > .LM11: > ldrb r3, [fp, #-18] > and r2, r3, #4 > and r3, r2, #255 /* ca à l'air pas mal finalement les champs > de bits */ > cmp r3, #0 > beq L4 > .stabn 68,0,41,.LM12-_main > > i = 92; > else > i = 402; > > if(test == 23) /* test juste pour se rendre compte comment se > passe une comparaison classique */ > > .LM14: > ldrb r3, [fp, #-17] @ zero_extendqisi2 > /* tiens je ne connaissais pas cette > méthode de mise à zero du reste du registre > faut dire que je programme tresssss tressss > rarement en assembleur :-) */ > cmp r3, #23 > bne L6 > .stabn 68,0,46,.LM15-_main > > i = 53; > else > i = 321; > > } > _______________________________________________ > Linux Mailing List > Archives: http://unixtech.be/mailman/listinfo/linux ---end quoted text--- -- Benoit JOSEPH Manex SPRL: benoit.joseph@manex.be Perso: joker@baby-linux.net benoit.joseph@teledisnet.be
Attachment:
pgp01002.pgp
Description: PGP signature