397e9b25840b4d47bbd122c466bd9caa3ddc5da8
[platform/upstream/nettle.git] / x86_64 / machine.m4
1 C OFFSET(i)
2 C Expands to 4*i, or to the empty string if i is zero
3 define(<OFFSET>, <ifelse($1,0,,eval(4*$1))>)
4
5 C OFFSET64(i)
6 C Expands to 8*i, or to the empty string if i is zero
7 define(<OFFSET64>, <ifelse($1,0,,eval(8*$1))>)
8
9 dnl LREG(reg) gives the 8-bit register corresponding to the given 64-bit register.
10 define(<LREG>,<ifelse(
11         $1, %rax, %al,
12         $1, %rbx, %bl,
13         $1, %rcx, %cl,
14         $1, %rdx, %dl,
15         $1, %rsi, %sil,
16         $1, %rdi, %dil,
17         $1, %rbp, %bpl,
18         $1, %r8, %r8b,
19         $1, %r9, %r9b,
20         $1, %r10, %r10b,
21         $1, %r11, %r11b,
22         $1, %r12, %r12b,
23         $1, %r13, %r13b,
24         $1, %r14, %r14b,
25         $1, %r15, %r15b)>)dnl
26
27 define(<HREG>,<ifelse(
28         $1, %rax, %ah,
29         $1, %rbx, %bh,
30         $1, %rcx, %ch,
31         $1, %rdx, %dh)>)dnl
32
33 define(<WREG>,<ifelse(
34         $1, %rax, %ax,
35         $1, %rbx, %bx,
36         $1, %rcx, %cx,
37         $1, %rdx, %dx,
38         $1, %rsi, %si,
39         $1, %rdi, %di,
40         $1, %rbp, %bp,
41         $1, %r8, %r8w,
42         $1, %r9, %r9w,
43         $1, %r10, %r10w,
44         $1, %r11, %r11w,
45         $1, %r12, %r12w,
46         $1, %r13, %r13w,
47         $1, %r14, %r14w,
48         $1, %r15, %r15w)>)dnl
49
50 define(<XREG>,<ifelse(
51         $1, %rax, %eax,
52         $1, %rbx, %ebx,
53         $1, %rcx, %ecx,
54         $1, %rdx, %edx,
55         $1, %rsi, %esi,
56         $1, %rdi, %edi,
57         $1, %rbp, %ebp,
58         $1, %r8, %r8d,
59         $1, %r9, %r9d,
60         $1, %r10, %r10d,
61         $1, %r11, %r11d,
62         $1, %r12, %r12d,
63         $1, %r13, %r13d,
64         $1, %r14, %r14d,
65         $1, %r15, %r15d)>)dnl
66
67 dnl W64_ENTRY(nargs, xmm_used)
68 define(<W64_ENTRY>, <
69   changequote([,])dnl
70   ifelse(<<<<<<<<<<<<<<<<<< ignored; only for balancing)
71   ifelse(W64_ABI,yes,[
72     dnl unconditionally push %rdi, making %rsp 16-byte aligned
73     push        %rdi
74     dnl Save %xmm6, ..., if needed
75     ifelse(eval($2 > 6), 1, [
76       sub       [$]eval(16*($2 - 6)), %rsp
77       movdqa    %xmm6, 0(%rsp)
78     ])
79     ifelse(eval($2 > 7), 1, [
80       movdqa    %xmm7, 16(%rsp)
81     ])
82     ifelse(eval($2 > 8), 1, [
83       movdqa    %xmm8, 32(%rsp)
84     ])
85     ifelse(eval($2 > 9), 1, [
86       movdqa    %xmm9, 48(%rsp)
87     ])
88     ifelse(eval($2 > 10), 1, [
89       movdqa    %xmm10, 64(%rsp)
90     ])
91     ifelse(eval($2 > 11), 1, [
92       movdqa    %xmm11, 80(%rsp)
93     ])
94     ifelse(eval($2 > 12), 1, [
95       movdqa    %xmm12, 96(%rsp)
96     ])
97     ifelse(eval($2 > 13), 1, [
98       movdqa    %xmm13, 112(%rsp)
99     ])
100     ifelse(eval($2 > 14), 1, [
101       movdqa    %xmm14, 128(%rsp)
102     ])
103     ifelse(eval($2 > 15), 1, [
104       movdqa    %xmm15, 144(%rsp)
105     ])
106     dnl Move around arguments
107     ifelse(eval($1 >= 1), 1, [
108       mov       %rcx, %rdi
109     ])
110     ifelse(eval($1 >= 2), 1, [
111       dnl NOTE: Breaks 16-byte %rsp alignment
112       push      %rsi
113       mov       %rdx, %rsi
114     ])
115     ifelse(eval($1 >= 3), 1, [
116       mov       %r8, %rdx
117     ])
118     ifelse(eval($1 >= 4), 1, [
119       mov       %r9, %rcx
120     ])
121     ifelse(eval($1 >= 5), 1, [
122       mov       ifelse(eval($2 > 6), 1, eval(16*($2-6)+56),56)(%rsp), %r8
123     ])
124     ifelse(eval($1 >= 6), 1, [
125       mov       ifelse(eval($2 > 6), 1, eval(16*($2-6)+64),64)(%rsp), %r9
126     ])
127   ])
128   changequote(<,>)dnl
129 >)
130
131 dnl W64_EXIT(nargs, xmm_used)
132 define(<W64_EXIT>, <
133   changequote([,])dnl
134   ifelse(<<<<<<<<<<< ignored; only for balancing)
135   ifelse(W64_ABI,yes,[
136     ifelse(eval($1 >= 2), 1, [
137       pop       %rsi
138     ])  
139     ifelse(eval($2 > 15), 1, [
140       movdqa    144(%rsp), %xmm15
141     ])
142     ifelse(eval($2 > 14), 1, [
143       movdqa    128(%rsp), %xmm14
144     ])
145     ifelse(eval($2 > 13), 1, [
146       movdqa    112(%rsp), %xmm13
147     ])
148     ifelse(eval($2 > 12), 1, [
149       movdqa    96(%rsp), %xmm12
150     ])
151     ifelse(eval($2 > 11), 1, [
152       movdqa    80(%rsp), %xmm11
153     ])
154     ifelse(eval($2 > 10), 1, [
155       movdqa    64(%rsp), %xmm10
156     ])
157     ifelse(eval($2 > 9), 1, [
158       movdqa    48(%rsp), %xmm9
159     ])
160     ifelse(eval($2 > 8), 1, [
161       movdqa    32(%rsp), %xmm8
162     ])
163     ifelse(eval($2 > 7), 1, [
164       movdqa    16(%rsp), %xmm7
165     ])
166     ifelse(eval($2 > 6), 1, [
167       movdqa    (%rsp), %xmm6
168       add       [$]eval(16*($2 - 6)), %rsp
169     ])
170     pop %rdi
171   ])
172   changequote(<,>)dnl
173 >)