[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [linux] Re: Manipuler un bit en c



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