asma: fu, geht ned. gn8
[uebersetzerbau-ss10.git] / asma / asma.s
1         .file   "asma.c"
2         .text
3 .globl asma
4         .type   asma, @function
5 asma:
6 .LFB2:
7
8 /* unsigned char *asma(unsigned char *s)  
9 {  
10   int i;  
11   for (i=0; i<16; i++) {  
12     unsigned char c=s[i];  
13     c += (c>=’A’ && c<=’Z’) ? ’a’-’A’ : 0;  
14     s[i] = c;  
15   }  
16   return s;  
17 }
18
19 Schreiben Sie diese Funktion in Assembler unter Verwendung von pcmpgtb. Dabei ist folgende Äquivalenz hilfreich:
20 (c>=’A’ && c<=’Z’) ? ’a’-’A’ : 0;
21
22 ist (bei Verwendung von Überlauf-Arithmetik) äquivalent zu
23 min(’Z’+1+min_t-’A’ > c+min_t-’A’ ? 0xff : 0, ’a’-’A’)
24
25 wobei min_t der minimale Wert des Datentyps ist, den der Vergleich behandelt (bei pcmpgtb also -128). Zusätzlich zu dem oben genannten dürften die Befehle pminub, paddb, und psubb nützlich sein. */
26         pxor %xmm1, %xmm1
27         pxor %xmm2, %xmm2
28
29         #init %xmm2 mit "'Z' + 1" fuer jedes byte
30         mov $0x5a5a5a5a5a5a5a5a, %rbx
31         movq %rbx, %xmm2
32         pslldq $8, %xmm2
33         movq %rbx, %xmm2
34
35         #init %xmm4 mit "'a'-'A'= 97-65 = 32 = 0x20
36         mov $0x2020202020202020, %rbx
37         movq %rbx, %xmm4
38         pslldq $8, %xmm4
39         movq %rbx, %xmm4
40
41         #speicheradresse des pointers zeigt auf 16*8 feld = 128bit
42         movdqu (%rdi), %xmm1
43         movdqu (%rdi), %xmm3
44
45         #"Packed COMpare Greater Than (Byte)"
46         pcmpgtb %xmm2, %xmm1
47
48         pminub %xmm4, %xmm1
49
50         paddb %xmm1, %xmm3
51
52         movq %xmm3, (%rax)
53         ret
54 .LFE2:
55         .size   asma, .-asma
56         .section        .eh_frame,"a",@progbits
57 .Lframe1:
58         .long   .LECIE1-.LSCIE1
59 .LSCIE1:
60         .long   0x0
61         .byte   0x1
62         .string "zR"
63         .uleb128 0x1
64         .sleb128 -8
65         .byte   0x10
66         .uleb128 0x1
67         .byte   0x3
68         .byte   0xc
69         .uleb128 0x7
70         .uleb128 0x8
71         .byte   0x90
72         .uleb128 0x1
73         .align 8
74 .LECIE1:
75 .LSFDE1:
76         .long   .LEFDE1-.LASFDE1
77 .LASFDE1:
78         .long   .LASFDE1-.Lframe1
79         .long   .LFB2
80         .long   .LFE2-.LFB2
81         .uleb128 0x0
82         .align 8
83 .LEFDE1:
84         .ident  "GCC: (Debian 4.3.2-1.1) 4.3.2"
85         .section        .note.GNU-stack,"",@progbits