asma: use >=%xmm8 register
[uebersetzerbau-ss10.git] / asma / asma.s
1         .file   "asma.c"
2         .text
3 .globl asma
4         .type   asma, @function
5 asma:
6 .LFB2:
7         /*init %xmm8 mit "'Z' + 1 + min_t - 'A'" fuer jedes byte
8         * 'Z' + 1 + min_t - 'A' = 90 + 1 - 128 - 65 = -102
9         * 102 = 01100110
10         * ~102 = 10011001
11         * (~102)+1 = 10011010 = 0x9A */
12         mov $0x9a9a9a9a9a9a9a9a, %rbx
13         movq %rbx, %xmm15
14         movddup %xmm15, %xmm8
15
16         //init %xmm9 mit "'a'-'A'= 97-65 = 32 = 0x20
17         mov $0x2020202020202020, %rbx
18         movq %rbx, %xmm15
19         movddup %xmm15, %xmm9
20
21         //speicheradresse des pointers zeigt auf 16*8 feld = 128bit
22         movdqu (%rdi), %xmm11
23         movdqu (%rdi), %xmm12
24
25         /*addiere in %xmm11 "min_t-'A'"
26         * = -128 - 65 = 63 = 0x3f */
27         mov $0x3f3f3f3f3f3f3f3f, %rbx
28         movq %rbx, %xmm15
29         movddup %xmm15, %xmm10
30
31         //c+min_t-'A'
32         paddb %xmm10, %xmm11
33
34         /*"Packed COMpare Greater Than (Byte)"
35         * X = 'Z' + 1 + min_t - 'A' > c + min_t - 'A' ? 0xff : 0
36         * achtung beim intuitiven lesen des befehles. 'kleiner' 
37         * ist mit 'groesser' vertauscht und vice versa */
38         pcmpgtb %xmm11, %xmm8
39
40         //Y = min(X, 'a' - 'A')
41         pminub %xmm9, %xmm8
42
43         //c += Y
44         paddb %xmm8, %xmm12
45
46         //retuniere an die richtige speicheradresse
47         mov %rdi, %rax
48         movapd %xmm12, (%rax)
49         ret
50 .LFE2:
51         .size   asma, .-asma
52         .section        .eh_frame,"a",@progbits
53 .Lframe1:
54         .long   .LECIE1-.LSCIE1
55 .LSCIE1:
56         .long   0x0
57         .byte   0x1
58         .string "zR"
59         .uleb128 0x1
60         .sleb128 -8
61         .byte   0x10
62         .uleb128 0x1
63         .byte   0x3
64         .byte   0xc
65         .uleb128 0x7
66         .uleb128 0x8
67         .byte   0x90
68         .uleb128 0x1
69         .align 8
70 .LECIE1:
71 .LSFDE1:
72         .long   .LEFDE1-.LASFDE1
73 .LASFDE1:
74         .long   .LASFDE1-.Lframe1
75         .long   .LFB2
76         .long   .LFE2-.LFB2
77         .uleb128 0x0
78         .align 8
79 .LEFDE1:
80         .ident  "GCC: (Debian 4.3.2-1.1) 4.3.2"
81         .section        .note.GNU-stack,"",@progbits