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

[linux] Re: Manipuler un bit en c



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