91cc957ade766afecd42b5983dfcd6a256d203e5
[uebersetzerbau-ss10.git] / asmb / asmb.s
1         .file   "asmb.c"
2         .text
3 .globl asmb
4         .type   asmb, @function
5 asmb:
6 .LFB2:
7         xor %rdx, %rdx
8
9         //soll einfach null sein
10         pxor %xmm14, %xmm14
11
12         /*init %xmm8 mit "'Z' + 1 + min_t - 'A'" fuer jedes byte
13         * 'Z' + 1 + min_t - 'A' = 90 + 1 - 128 - 65 = -102
14         * 102 = 01100110
15         * ~102 = 10011001
16         * (~102)+1 = 10011010 = 0x9A */
17         mov $0x9a9a9a9a9a9a9a9a, %rax
18         movq %rax, %xmm15
19         movddup %xmm15, %xmm8
20
21         //init %xmm9 mit "'a'-'A'= 97-65 = 32 = 0x20
22         mov $0x2020202020202020, %rax
23         movq %rax, %xmm15
24         movddup %xmm15, %xmm9
25
26         //speicheradresse des pointers zeigt auf 16*8 feld = 128bit
27         movdqu (%rdi, %rdx, 8), %xmm11
28         movdqu (%rdi, %rdx, 8), %xmm12
29
30         /*addiere in %xmm11 "min_t-'A'"
31         * = -128 - 65 = 63 = 0x3f */
32         mov $0x3f3f3f3f3f3f3f3f, %rax
33         movq %rax, %xmm15
34         movddup %xmm15, %xmm10
35
36 .nextround:
37         //speicheradresse des pointers zeigt auf 16*8 feld = 128bit
38         movdqu (%rdi, %rdx, 8), %xmm11
39         movdqu (%rdi, %rdx, 8), %xmm12
40
41         //c+min_t-'A'
42         paddb %xmm10, %xmm11
43
44         //0x9a9a... zwischenspeichern
45         movdqa %xmm8, %xmm15
46
47         /*"Packed COMpare Greater Than (Byte)"
48         * X = 'Z' + 1 + min_t - 'A' > c + min_t - 'A' ? 0xff : 0
49         * achtung beim intuitiven lesen des befehles. 'kleiner' 
50         * ist mit 'groesser' vertauscht und vice versa */
51         pcmpgtb %xmm11, %xmm15
52
53         //Y = min(X, 'a' - 'A')
54         pminub %xmm9, %xmm15
55
56         //c += Y
57         paddb %xmm15, %xmm12
58
59         //retuniere an die richtige speicheradresse
60         movapd %xmm12, (%rdi, %rdx, 8)
61
62         //ist ein byte groesser als 0? dann steht 0xff drin
63         pcmpeqb %xmm14, %xmm12
64         //hol die MSBs aller bytes raus
65         pmovmskb %xmm12, %ecx
66         add $2, %rdx
67
68         //ist %ecx gleich null? dann die naechsten 16byte bitte
69         jecxz .nextround
70
71         mov %rdi, %rax
72         ret
73 .LFE2:
74         .size   asmb, .-asmb
75         .section        .eh_frame,"a",@progbits
76 .Lframe1:
77         .long   .LECIE1-.LSCIE1
78 .LSCIE1:
79         .long   0x0
80         .byte   0x1
81         .string "zR"
82         .uleb128 0x1
83         .sleb128 -8
84         .byte   0x10
85         .uleb128 0x1
86         .byte   0x3
87         .byte   0xc
88         .uleb128 0x7
89         .uleb128 0x8
90         .byte   0x90
91         .uleb128 0x1
92         .align 8
93 .LECIE1:
94 .LSFDE1:
95         .long   .LEFDE1-.LASFDE1
96 .LASFDE1:
97         .long   .LASFDE1-.Lframe1
98         .long   .LFB2
99         .long   .LFE2-.LFB2
100         .uleb128 0x0
101         .align 8
102 .LEFDE1:
103         .ident  "GCC: (Debian 4.3.2-1.1) 4.3.2"
104         .section        .note.GNU-stack,"",@progbits