xref: /aosp_15_r20/external/llvm/test/CodeGen/Mips/cconv/arguments-varargs.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=mips-linux -relocation-model=static < %s | FileCheck --check-prefixes=ALL,O32,O32-BE %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=mipsel-linux -relocation-model=static < %s | FileCheck --check-prefixes=ALL,O32,O32-LE %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; RUN-TODO: llc -march=mips64 -relocation-model=static -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32 %s
5*9880d681SAndroid Build Coastguard Worker; RUN-TODO: llc -march=mips64el -relocation-model=static -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32 %s
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=mips64-linux -relocation-model=static -target-abi n32 < %s | FileCheck --check-prefixes=ALL,NEW,N32,NEW-BE %s
8*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=mips64el-linux -relocation-model=static -target-abi n32 < %s | FileCheck --check-prefixes=ALL,NEW,N32,NEW-LE %s
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -relocation-model=static -target-abi n64 < %s | FileCheck --check-prefixes=ALL,NEW,N64,NEW-BE %s
11*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -relocation-model=static -target-abi n64 < %s | FileCheck --check-prefixes=ALL,NEW,N64,NEW-LE %s
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker@hwords = global [3 x i16] zeroinitializer, align 1
14*9880d681SAndroid Build Coastguard Worker@words  = global [3 x i32] zeroinitializer, align 1
15*9880d681SAndroid Build Coastguard Worker@dwords = global [3 x i64] zeroinitializer, align 1
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine void @fn_i16_dotdotdot_i16(i16 %a, ...) {
18*9880d681SAndroid Build Coastguard Workerentry:
19*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: fn_i16_dotdotdot_i16:
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; Set up the stack with an 8-byte local area. N32/N64 must also make room for
22*9880d681SAndroid Build Coastguard Worker; the argument save area (56 bytes).
23*9880d681SAndroid Build Coastguard Worker; O32:           addiu  [[SP:\$sp]], $sp, -8
24*9880d681SAndroid Build Coastguard Worker; N32:           addiu  [[SP:\$sp]], $sp, -64
25*9880d681SAndroid Build Coastguard Worker; N64:           daddiu  [[SP:\$sp]], $sp, -64
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; Save variable argument portion on the stack
28*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $7, 20([[SP]])
29*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $6, 16([[SP]])
30*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $5, 12([[SP]])
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $11, 56([[SP]])
33*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $10, 48([[SP]])
34*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $9, 40([[SP]])
35*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $8, 32([[SP]])
36*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $7, 24([[SP]])
37*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $6, 16([[SP]])
38*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $5, 8([[SP]])
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; Initialize variable argument pointer.
41*9880d681SAndroid Build Coastguard Worker; For O32, the offset is 12 due to the 4 bytes used to store local variables,
42*9880d681SAndroid Build Coastguard Worker; 4 bytes padding to maintain stack alignment, and the 4 byte slot for the first
43*9880d681SAndroid Build Coastguard Worker; fixed argument.
44*9880d681SAndroid Build Coastguard Worker; For N32/N64, it is only 8 since the fixed arguments do not reserve stack
45*9880d681SAndroid Build Coastguard Worker; space.
46*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 12
47*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 8
50*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA]], 0([[SP]])
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA:\$[0-9]+]], [[SP]], 8
53*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA]], 0([[SP]])
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; Store [[VA]]
56*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 1
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; Increment [[VA]]
61*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
62*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
63*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
66*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
67*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA2]], 0([[SP]])
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA:\$[0-9]+]], 0([[SP]])
70*9880d681SAndroid Build Coastguard Worker; N64-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
71*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA2]], 0([[SP]])
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; Load the first argument from the variable portion.
74*9880d681SAndroid Build Coastguard Worker; This has used the stack pointer directly rather than the [[VA]] we just set
75*9880d681SAndroid Build Coastguard Worker; up.
76*9880d681SAndroid Build Coastguard Worker; Big-endian mode for N32/N64 must add an additional 4 to the offset due to byte
77*9880d681SAndroid Build Coastguard Worker; order.
78*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG1:\$[0-9]+]], 0([[VA]])
81*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG1:\$[0-9]+]], 4([[VA]])
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
84*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(hwords)
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(hwords)
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[GV:\$[0-9]+]], %got_disp(hwords)(
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sh [[ARG1]], 2([[GV]])
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 2
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] again.
95*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
96*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
97*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA2:\$[0-9]+]], 0([[SP]])
100*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA3:\$[0-9]+]], [[VA2]], 8
101*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA3]], 0([[SP]])
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA2:\$[0-9]+]], 0([[SP]])
104*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA3:\$[0-9]+]], [[VA2]], 8
105*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA3]], 0([[SP]])
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker; Load the second argument from the variable portion.
108*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG2:\$[0-9]+]], 0([[VA2]])
111*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG2:\$[0-9]+]], 4([[VA2]])
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
114*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sh [[ARG2]], 4([[GV]])
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker  %ap = alloca i8*, align 8
117*9880d681SAndroid Build Coastguard Worker  %ap2 = bitcast i8** %ap to i8*
118*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_start(i8* %ap2)
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 1", ""()
121*9880d681SAndroid Build Coastguard Worker  %arg1 = va_arg i8** %ap, i16
122*9880d681SAndroid Build Coastguard Worker  %e1 = getelementptr [3 x i16], [3 x i16]* @hwords, i32 0, i32 1
123*9880d681SAndroid Build Coastguard Worker  store volatile i16 %arg1, i16* %e1, align 2
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 2", ""()
126*9880d681SAndroid Build Coastguard Worker  %arg2 = va_arg i8** %ap, i16
127*9880d681SAndroid Build Coastguard Worker  %e2 = getelementptr [3 x i16], [3 x i16]* @hwords, i32 0, i32 2
128*9880d681SAndroid Build Coastguard Worker  store volatile i16 %arg2, i16* %e2, align 2
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_end(i8* %ap2)
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker  ret void
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine void @fn_i16_dotdotdot_i32(i16 %a, ...) {
136*9880d681SAndroid Build Coastguard Workerentry:
137*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: fn_i16_dotdotdot_i32:
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker; Set up the stack with an 8-byte local area. N32/N64 must also make room for
140*9880d681SAndroid Build Coastguard Worker; the argument save area (56 bytes).
141*9880d681SAndroid Build Coastguard Worker; O32:           addiu  [[SP:\$sp]], $sp, -8
142*9880d681SAndroid Build Coastguard Worker; N32:           addiu  [[SP:\$sp]], $sp, -64
143*9880d681SAndroid Build Coastguard Worker; N64:           daddiu  [[SP:\$sp]], $sp, -64
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; Save variable argument portion on the stack
146*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $7, 20([[SP]])
147*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $6, 16([[SP]])
148*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $5, 12([[SP]])
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $11, 56([[SP]])
151*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $10, 48([[SP]])
152*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $9, 40([[SP]])
153*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $8, 32([[SP]])
154*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $7, 24([[SP]])
155*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $6, 16([[SP]])
156*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $5, 8([[SP]])
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker; Initialize variable argument pointer.
159*9880d681SAndroid Build Coastguard Worker; For O32, the offset is 12 due to the 4 bytes used to store local variables,
160*9880d681SAndroid Build Coastguard Worker; 4 bytes padding to maintain stack alignment, and the 4 byte slot for the first
161*9880d681SAndroid Build Coastguard Worker; fixed argument.
162*9880d681SAndroid Build Coastguard Worker; For N32/N64, it is only 8 since the fixed arguments do not reserve stack
163*9880d681SAndroid Build Coastguard Worker; space.
164*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 12
165*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 8
168*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA]], 0([[SP]])
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA:\$[0-9]+]], [[SP]], 8
171*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA]], 0([[SP]])
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker; Store [[VA]]
174*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 1
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Worker; Increment [[VA]]
179*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
180*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
181*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
184*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
185*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA2]], 0([[SP]])
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA:\$[0-9]+]], 0([[SP]])
188*9880d681SAndroid Build Coastguard Worker; N64-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
189*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA2]], 0([[SP]])
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker; Load the first argument from the variable portion.
192*9880d681SAndroid Build Coastguard Worker; This has used the stack pointer directly rather than the [[VA]] we just set
193*9880d681SAndroid Build Coastguard Worker; up.
194*9880d681SAndroid Build Coastguard Worker; Big-endian mode for N32/N64 must add an additional 4 to the offset due to byte
195*9880d681SAndroid Build Coastguard Worker; order.
196*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG1:\$[0-9]+]], 0([[VA]])
199*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG1:\$[0-9]+]], 4([[VA]])
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
202*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(words)
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(words)
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[GV:\$[0-9]+]], %got_disp(words)(
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sw [[ARG1]], 4([[GV]])
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 2
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] again.
213*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
214*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
215*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA2:\$[0-9]+]], 0([[SP]])
218*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA3:\$[0-9]+]], [[VA2]], 8
219*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA3]], 0([[SP]])
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA2:\$[0-9]+]], 0([[SP]])
222*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA3:\$[0-9]+]], [[VA2]], 8
223*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA3]], 0([[SP]])
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker; Load the second argument from the variable portion.
226*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG2:\$[0-9]+]], 0([[VA2]])
229*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG2:\$[0-9]+]], 4([[VA2]])
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
232*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sw [[ARG2]], 8([[GV]])
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Worker  %ap = alloca i8*, align 8
235*9880d681SAndroid Build Coastguard Worker  %ap2 = bitcast i8** %ap to i8*
236*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_start(i8* %ap2)
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 1", ""()
239*9880d681SAndroid Build Coastguard Worker  %arg1 = va_arg i8** %ap, i32
240*9880d681SAndroid Build Coastguard Worker  %e1 = getelementptr [3 x i32], [3 x i32]* @words, i32 0, i32 1
241*9880d681SAndroid Build Coastguard Worker  store volatile i32 %arg1, i32* %e1, align 4
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 2", ""()
244*9880d681SAndroid Build Coastguard Worker  %arg2 = va_arg i8** %ap, i32
245*9880d681SAndroid Build Coastguard Worker  %e2 = getelementptr [3 x i32], [3 x i32]* @words, i32 0, i32 2
246*9880d681SAndroid Build Coastguard Worker  store volatile i32 %arg2, i32* %e2, align 4
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_end(i8* %ap2)
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker  ret void
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdefine void @fn_i16_dotdotdot_i64(i16 %a, ...) {
254*9880d681SAndroid Build Coastguard Workerentry:
255*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: fn_i16_dotdotdot_i64:
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker; Set up the stack with an 8-byte local area. N32/N64 must also make room for
258*9880d681SAndroid Build Coastguard Worker; the argument save area (56 bytes).
259*9880d681SAndroid Build Coastguard Worker; O32:           addiu  [[SP:\$sp]], $sp, -8
260*9880d681SAndroid Build Coastguard Worker; N32:           addiu  [[SP:\$sp]], $sp, -64
261*9880d681SAndroid Build Coastguard Worker; N64:           daddiu  [[SP:\$sp]], $sp, -64
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Worker; Save variable argument portion on the stack
264*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $7, 20([[SP]])
265*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $6, 16([[SP]])
266*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $5, 12([[SP]])
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $11, 56([[SP]])
269*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $10, 48([[SP]])
270*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $9, 40([[SP]])
271*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $8, 32([[SP]])
272*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $7, 24([[SP]])
273*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $6, 16([[SP]])
274*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $5, 8([[SP]])
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Worker; Initialize variable argument pointer.
277*9880d681SAndroid Build Coastguard Worker; For O32, the offset is 12 due to the 4 bytes used to store local variables,
278*9880d681SAndroid Build Coastguard Worker; 4 bytes padding to maintain stack alignment, and the 4 byte slot for the first
279*9880d681SAndroid Build Coastguard Worker; fixed argument.
280*9880d681SAndroid Build Coastguard Worker; For N32/N64, it is only 8 since the fixed arguments do not reserve stack
281*9880d681SAndroid Build Coastguard Worker; space.
282*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 12
283*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 8
286*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA]], 0([[SP]])
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA:\$[0-9]+]], [[SP]], 8
289*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA]], 0([[SP]])
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Worker; Store [[VA]]
292*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 1
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] (and realign pointer for O32)
297*9880d681SAndroid Build Coastguard Worker; O32:           lw [[VA:\$[0-9]+]], 0([[SP]])
298*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA_TMP0:\$[0-9]+]], [[VA]], 7
299*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA_TMP1:\$[0-9]+]], $zero, -8
300*9880d681SAndroid Build Coastguard Worker; O32-DAG:       and   [[VA_TMP2:\$[0-9]+]], [[VA_TMP0]], [[VA_TMP1]]
301*9880d681SAndroid Build Coastguard Worker; O32-DAG:       ori   [[VA2:\$[0-9]+]], [[VA_TMP2]], 4
302*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
305*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
306*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA2]], 0([[SP]])
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA:\$[0-9]+]], 0([[SP]])
309*9880d681SAndroid Build Coastguard Worker; N64-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
310*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA2]], 0([[SP]])
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Worker; Load the first argument from the variable portion and copy it to the global.
313*9880d681SAndroid Build Coastguard Worker; This has used the stack pointer directly rather than the [[VA]] we just set
314*9880d681SAndroid Build Coastguard Worker; up.
315*9880d681SAndroid Build Coastguard Worker; Big-endian mode for N32/N64 must add an additional 4 to the offset due to byte
316*9880d681SAndroid Build Coastguard Worker; order.
317*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(dwords)
318*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
319*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG1]], 8([[GV]])
320*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
321*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
322*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
323*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
324*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG1]], 12([[GV]])
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(dwords)
327*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[GV:\$[0-9]+]], %got_disp(dwords)(
328*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       ld [[ARG1:\$[0-9]+]], 0([[VA]])
329*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd [[ARG1]], 8([[GV]])
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 2
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] again.
334*9880d681SAndroid Build Coastguard Worker; FIXME: We're still aligned from the last one but CodeGen doesn't spot that.
335*9880d681SAndroid Build Coastguard Worker; O32:           lw [[VA:\$[0-9]+]], 0([[SP]])
336*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA_TMP0:\$[0-9]+]], [[VA]], 7
337*9880d681SAndroid Build Coastguard Worker; O32-DAG:       and   [[VA_TMP2:\$[0-9]+]], [[VA_TMP0]], [[VA_TMP1]]
338*9880d681SAndroid Build Coastguard Worker; O32-DAG:       ori   [[VA2:\$[0-9]+]], [[VA_TMP2]], 4
339*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA2:\$[0-9]+]], 0([[SP]])
342*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA3:\$[0-9]+]], [[VA2]], 8
343*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA3]], 0([[SP]])
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA2:\$[0-9]+]], 0([[SP]])
346*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA3:\$[0-9]+]], [[VA2]], 8
347*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA3]], 0([[SP]])
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Worker; Load the second argument from the variable portion and copy it to the global.
350*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
351*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG2]], 16([[GV]])
352*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
353*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
354*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
355*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
356*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG2]], 20([[GV]])
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       ld [[ARG2:\$[0-9]+]], 0([[VA2]])
359*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd [[ARG2]], 16([[GV]])
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker  %ap = alloca i8*, align 8
362*9880d681SAndroid Build Coastguard Worker  %ap2 = bitcast i8** %ap to i8*
363*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_start(i8* %ap2)
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 1", ""()
366*9880d681SAndroid Build Coastguard Worker  %arg1 = va_arg i8** %ap, i64
367*9880d681SAndroid Build Coastguard Worker  %e1 = getelementptr [3 x i64], [3 x i64]* @dwords, i32 0, i32 1
368*9880d681SAndroid Build Coastguard Worker  store volatile i64 %arg1, i64* %e1, align 8
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 2", ""()
371*9880d681SAndroid Build Coastguard Worker  %arg2 = va_arg i8** %ap, i64
372*9880d681SAndroid Build Coastguard Worker  %e2 = getelementptr [3 x i64], [3 x i64]* @dwords, i32 0, i32 2
373*9880d681SAndroid Build Coastguard Worker  store volatile i64 %arg2, i64* %e2, align 8
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_end(i8* %ap2)
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard Worker  ret void
378*9880d681SAndroid Build Coastguard Worker}
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Workerdefine void @fn_i32_dotdotdot_i16(i32 %a, ...) {
381*9880d681SAndroid Build Coastguard Workerentry:
382*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: fn_i32_dotdotdot_i16:
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Worker; Set up the stack with an 8-byte local area. N32/N64 must also make room for
385*9880d681SAndroid Build Coastguard Worker; the argument save area (56 bytes).
386*9880d681SAndroid Build Coastguard Worker; O32:           addiu  [[SP:\$sp]], $sp, -8
387*9880d681SAndroid Build Coastguard Worker; N32:           addiu  [[SP:\$sp]], $sp, -64
388*9880d681SAndroid Build Coastguard Worker; N64:           daddiu [[SP:\$sp]], $sp, -64
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Worker; Save variable argument portion on the stack
391*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $7, 20([[SP]])
392*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $6, 16([[SP]])
393*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $5, 12([[SP]])
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $11, 56([[SP]])
396*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $10, 48([[SP]])
397*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $9, 40([[SP]])
398*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $8, 32([[SP]])
399*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $7, 24([[SP]])
400*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $6, 16([[SP]])
401*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $5, 8([[SP]])
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Worker; Initialize variable argument pointer.
404*9880d681SAndroid Build Coastguard Worker; For O32, the offset is 12 due to the 4 bytes used to store local variables,
405*9880d681SAndroid Build Coastguard Worker; 4 bytes padding to maintain stack alignment, and the 4 byte slot for the first
406*9880d681SAndroid Build Coastguard Worker; fixed argument.
407*9880d681SAndroid Build Coastguard Worker; For N32/N64, it is only 8 since the fixed arguments do not reserve stack
408*9880d681SAndroid Build Coastguard Worker; space.
409*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 12
410*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 8
413*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA]], 0([[SP]])
414*9880d681SAndroid Build Coastguard Worker
415*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA:\$[0-9]+]], [[SP]], 8
416*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA]], 0([[SP]])
417*9880d681SAndroid Build Coastguard Worker
418*9880d681SAndroid Build Coastguard Worker; Store [[VA]]
419*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
420*9880d681SAndroid Build Coastguard Worker
421*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 1
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Worker; Increment [[VA]]
424*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
425*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
426*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
427*9880d681SAndroid Build Coastguard Worker
428*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
429*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
430*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA2]], 0([[SP]])
431*9880d681SAndroid Build Coastguard Worker
432*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA:\$[0-9]+]], 0([[SP]])
433*9880d681SAndroid Build Coastguard Worker; N64-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
434*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA2]], 0([[SP]])
435*9880d681SAndroid Build Coastguard Worker
436*9880d681SAndroid Build Coastguard Worker; Load the first argument from the variable portion.
437*9880d681SAndroid Build Coastguard Worker; This has used the stack pointer directly rather than the [[VA]] we just set
438*9880d681SAndroid Build Coastguard Worker; up.
439*9880d681SAndroid Build Coastguard Worker; Big-endian mode for N32/N64 must add an additional 4 to the offset due to byte
440*9880d681SAndroid Build Coastguard Worker; order.
441*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
442*9880d681SAndroid Build Coastguard Worker
443*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG1:\$[0-9]+]], 0([[VA]])
444*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG1:\$[0-9]+]], 4([[VA]])
445*9880d681SAndroid Build Coastguard Worker
446*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
447*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(hwords)
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(hwords)
450*9880d681SAndroid Build Coastguard Worker
451*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[GV:\$[0-9]+]], %got_disp(hwords)(
452*9880d681SAndroid Build Coastguard Worker
453*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sh [[ARG1]], 2([[GV]])
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 2
456*9880d681SAndroid Build Coastguard Worker
457*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] again.
458*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
459*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
460*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
461*9880d681SAndroid Build Coastguard Worker
462*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA2:\$[0-9]+]], 0([[SP]])
463*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA3:\$[0-9]+]], [[VA2]], 8
464*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA3]], 0([[SP]])
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA2:\$[0-9]+]], 0([[SP]])
467*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA3:\$[0-9]+]], [[VA2]], 8
468*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA3]], 0([[SP]])
469*9880d681SAndroid Build Coastguard Worker
470*9880d681SAndroid Build Coastguard Worker; Load the second argument from the variable portion.
471*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
472*9880d681SAndroid Build Coastguard Worker
473*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG2:\$[0-9]+]], 0([[VA2]])
474*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG2:\$[0-9]+]], 4([[VA2]])
475*9880d681SAndroid Build Coastguard Worker
476*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
477*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sh [[ARG2]], 4([[GV]])
478*9880d681SAndroid Build Coastguard Worker
479*9880d681SAndroid Build Coastguard Worker  %ap = alloca i8*, align 8
480*9880d681SAndroid Build Coastguard Worker  %ap2 = bitcast i8** %ap to i8*
481*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_start(i8* %ap2)
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 1", ""()
484*9880d681SAndroid Build Coastguard Worker  %arg1 = va_arg i8** %ap, i16
485*9880d681SAndroid Build Coastguard Worker  %e1 = getelementptr [3 x i16], [3 x i16]* @hwords, i32 0, i32 1
486*9880d681SAndroid Build Coastguard Worker  store volatile i16 %arg1, i16* %e1, align 2
487*9880d681SAndroid Build Coastguard Worker
488*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 2", ""()
489*9880d681SAndroid Build Coastguard Worker  %arg2 = va_arg i8** %ap, i16
490*9880d681SAndroid Build Coastguard Worker  %e2 = getelementptr [3 x i16], [3 x i16]* @hwords, i32 0, i32 2
491*9880d681SAndroid Build Coastguard Worker  store volatile i16 %arg2, i16* %e2, align 2
492*9880d681SAndroid Build Coastguard Worker
493*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_end(i8* %ap2)
494*9880d681SAndroid Build Coastguard Worker
495*9880d681SAndroid Build Coastguard Worker  ret void
496*9880d681SAndroid Build Coastguard Worker}
497*9880d681SAndroid Build Coastguard Worker
498*9880d681SAndroid Build Coastguard Workerdefine void @fn_i32_dotdotdot_i32(i32 %a, ...) {
499*9880d681SAndroid Build Coastguard Workerentry:
500*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: fn_i32_dotdotdot_i32:
501*9880d681SAndroid Build Coastguard Worker
502*9880d681SAndroid Build Coastguard Worker; Set up the stack with an 8-byte local area. N32/N64 must also make room for
503*9880d681SAndroid Build Coastguard Worker; the argument save area (56 bytes).
504*9880d681SAndroid Build Coastguard Worker; O32:           addiu  [[SP:\$sp]], $sp, -8
505*9880d681SAndroid Build Coastguard Worker; N32:           addiu  [[SP:\$sp]], $sp, -64
506*9880d681SAndroid Build Coastguard Worker; N64:           daddiu  [[SP:\$sp]], $sp, -64
507*9880d681SAndroid Build Coastguard Worker
508*9880d681SAndroid Build Coastguard Worker; Save variable argument portion on the stack
509*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $7, 20([[SP]])
510*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $6, 16([[SP]])
511*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $5, 12([[SP]])
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $11, 56([[SP]])
514*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $10, 48([[SP]])
515*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $9, 40([[SP]])
516*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $8, 32([[SP]])
517*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $7, 24([[SP]])
518*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $6, 16([[SP]])
519*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $5, 8([[SP]])
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Worker; Initialize variable argument pointer.
522*9880d681SAndroid Build Coastguard Worker; For O32, the offset is 12 due to the 4 bytes used to store local variables,
523*9880d681SAndroid Build Coastguard Worker; 4 bytes padding to maintain stack alignment, and the 4 byte slot for the first
524*9880d681SAndroid Build Coastguard Worker; fixed argument.
525*9880d681SAndroid Build Coastguard Worker; For N32/N64, it is only 8 since the fixed arguments do not reserve stack
526*9880d681SAndroid Build Coastguard Worker; space.
527*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 12
528*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
529*9880d681SAndroid Build Coastguard Worker
530*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 8
531*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA]], 0([[SP]])
532*9880d681SAndroid Build Coastguard Worker
533*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA:\$[0-9]+]], [[SP]], 8
534*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA]], 0([[SP]])
535*9880d681SAndroid Build Coastguard Worker
536*9880d681SAndroid Build Coastguard Worker; Store [[VA]]
537*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
538*9880d681SAndroid Build Coastguard Worker
539*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 1
540*9880d681SAndroid Build Coastguard Worker
541*9880d681SAndroid Build Coastguard Worker; Increment [[VA]]
542*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
543*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
544*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
545*9880d681SAndroid Build Coastguard Worker
546*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
547*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
548*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA2]], 0([[SP]])
549*9880d681SAndroid Build Coastguard Worker
550*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA:\$[0-9]+]], 0([[SP]])
551*9880d681SAndroid Build Coastguard Worker; N64-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
552*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA2]], 0([[SP]])
553*9880d681SAndroid Build Coastguard Worker
554*9880d681SAndroid Build Coastguard Worker; Load the first argument from the variable portion.
555*9880d681SAndroid Build Coastguard Worker; This has used the stack pointer directly rather than the [[VA]] we just set
556*9880d681SAndroid Build Coastguard Worker; up.
557*9880d681SAndroid Build Coastguard Worker; Big-endian mode for N32/N64 must add an additional 4 to the offset due to byte
558*9880d681SAndroid Build Coastguard Worker; order.
559*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
560*9880d681SAndroid Build Coastguard Worker
561*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG1:\$[0-9]+]], 0([[VA]])
562*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG1:\$[0-9]+]], 4([[VA]])
563*9880d681SAndroid Build Coastguard Worker
564*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
565*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(words)
566*9880d681SAndroid Build Coastguard Worker
567*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(words)
568*9880d681SAndroid Build Coastguard Worker
569*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[GV:\$[0-9]+]], %got_disp(words)(
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sw [[ARG1]], 4([[GV]])
572*9880d681SAndroid Build Coastguard Worker
573*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 2
574*9880d681SAndroid Build Coastguard Worker
575*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] again.
576*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
577*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
578*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
579*9880d681SAndroid Build Coastguard Worker
580*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA2:\$[0-9]+]], 0([[SP]])
581*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA3:\$[0-9]+]], [[VA2]], 8
582*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA3]], 0([[SP]])
583*9880d681SAndroid Build Coastguard Worker
584*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA2:\$[0-9]+]], 0([[SP]])
585*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA3:\$[0-9]+]], [[VA2]], 8
586*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA3]], 0([[SP]])
587*9880d681SAndroid Build Coastguard Worker
588*9880d681SAndroid Build Coastguard Worker; Load the second argument from the variable portion.
589*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
590*9880d681SAndroid Build Coastguard Worker
591*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG2:\$[0-9]+]], 0([[VA2]])
592*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG2:\$[0-9]+]], 4([[VA2]])
593*9880d681SAndroid Build Coastguard Worker
594*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
595*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sw [[ARG2]], 8([[GV]])
596*9880d681SAndroid Build Coastguard Worker
597*9880d681SAndroid Build Coastguard Worker  %ap = alloca i8*, align 8
598*9880d681SAndroid Build Coastguard Worker  %ap2 = bitcast i8** %ap to i8*
599*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_start(i8* %ap2)
600*9880d681SAndroid Build Coastguard Worker
601*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 1", ""()
602*9880d681SAndroid Build Coastguard Worker  %arg1 = va_arg i8** %ap, i32
603*9880d681SAndroid Build Coastguard Worker  %e1 = getelementptr [3 x i32], [3 x i32]* @words, i32 0, i32 1
604*9880d681SAndroid Build Coastguard Worker  store volatile i32 %arg1, i32* %e1, align 4
605*9880d681SAndroid Build Coastguard Worker
606*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 2", ""()
607*9880d681SAndroid Build Coastguard Worker  %arg2 = va_arg i8** %ap, i32
608*9880d681SAndroid Build Coastguard Worker  %e2 = getelementptr [3 x i32], [3 x i32]* @words, i32 0, i32 2
609*9880d681SAndroid Build Coastguard Worker  store volatile i32 %arg2, i32* %e2, align 4
610*9880d681SAndroid Build Coastguard Worker
611*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_end(i8* %ap2)
612*9880d681SAndroid Build Coastguard Worker
613*9880d681SAndroid Build Coastguard Worker  ret void
614*9880d681SAndroid Build Coastguard Worker}
615*9880d681SAndroid Build Coastguard Worker
616*9880d681SAndroid Build Coastguard Workerdefine void @fn_i32_dotdotdot_i64(i32 %a, ...) {
617*9880d681SAndroid Build Coastguard Workerentry:
618*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: fn_i32_dotdotdot_i64:
619*9880d681SAndroid Build Coastguard Worker
620*9880d681SAndroid Build Coastguard Worker; Set up the stack with an 8-byte local area. N32/N64 must also make room for
621*9880d681SAndroid Build Coastguard Worker; the argument save area (56 bytes).
622*9880d681SAndroid Build Coastguard Worker; O32:           addiu  [[SP:\$sp]], $sp, -8
623*9880d681SAndroid Build Coastguard Worker; N32:           addiu  [[SP:\$sp]], $sp, -64
624*9880d681SAndroid Build Coastguard Worker; N64:           daddiu  [[SP:\$sp]], $sp, -64
625*9880d681SAndroid Build Coastguard Worker
626*9880d681SAndroid Build Coastguard Worker; Save variable argument portion on the stack
627*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $7, 20([[SP]])
628*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $6, 16([[SP]])
629*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $5, 12([[SP]])
630*9880d681SAndroid Build Coastguard Worker
631*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $11, 56([[SP]])
632*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $10, 48([[SP]])
633*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $9, 40([[SP]])
634*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $8, 32([[SP]])
635*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $7, 24([[SP]])
636*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $6, 16([[SP]])
637*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $5, 8([[SP]])
638*9880d681SAndroid Build Coastguard Worker
639*9880d681SAndroid Build Coastguard Worker; Initialize variable argument pointer.
640*9880d681SAndroid Build Coastguard Worker; For O32, the offset is 12 due to the 4 bytes used to store local variables,
641*9880d681SAndroid Build Coastguard Worker; 4 bytes padding to maintain stack alignment, and the 4 byte slot for the first
642*9880d681SAndroid Build Coastguard Worker; fixed argument.
643*9880d681SAndroid Build Coastguard Worker; For N32/N64, it is only 8 since the fixed arguments do not reserve stack
644*9880d681SAndroid Build Coastguard Worker; space.
645*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 12
646*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
647*9880d681SAndroid Build Coastguard Worker
648*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 8
649*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA]], 0([[SP]])
650*9880d681SAndroid Build Coastguard Worker
651*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA:\$[0-9]+]], [[SP]], 8
652*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA]], 0([[SP]])
653*9880d681SAndroid Build Coastguard Worker
654*9880d681SAndroid Build Coastguard Worker; Store [[VA]]
655*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
656*9880d681SAndroid Build Coastguard Worker
657*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 1
658*9880d681SAndroid Build Coastguard Worker
659*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] (and realign pointer for O32)
660*9880d681SAndroid Build Coastguard Worker; O32:           lw [[VA:\$[0-9]+]], 0([[SP]])
661*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA_TMP0:\$[0-9]+]], [[VA]], 7
662*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA_TMP1:\$[0-9]+]], $zero, -8
663*9880d681SAndroid Build Coastguard Worker; O32-DAG:       and   [[VA_TMP2:\$[0-9]+]], [[VA_TMP0]], [[VA_TMP1]]
664*9880d681SAndroid Build Coastguard Worker; O32-DAG:       ori   [[VA2:\$[0-9]+]], [[VA_TMP2]], 4
665*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
666*9880d681SAndroid Build Coastguard Worker
667*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
668*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
669*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA2]], 0([[SP]])
670*9880d681SAndroid Build Coastguard Worker
671*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA:\$[0-9]+]], 0([[SP]])
672*9880d681SAndroid Build Coastguard Worker; N64-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
673*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA2]], 0([[SP]])
674*9880d681SAndroid Build Coastguard Worker
675*9880d681SAndroid Build Coastguard Worker; Load the first argument from the variable portion and copy it to the global.
676*9880d681SAndroid Build Coastguard Worker; This has used the stack pointer directly rather than the [[VA]] we just set
677*9880d681SAndroid Build Coastguard Worker; up.
678*9880d681SAndroid Build Coastguard Worker; Big-endian mode for N32/N64 must add an additional 4 to the offset due to byte
679*9880d681SAndroid Build Coastguard Worker; order.
680*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(dwords)
681*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
682*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG1]], 8([[GV]])
683*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
684*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
685*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
686*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
687*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG1]], 12([[GV]])
688*9880d681SAndroid Build Coastguard Worker
689*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(dwords)
690*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[GV:\$[0-9]+]], %got_disp(dwords)(
691*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       ld [[ARG1:\$[0-9]+]], 0([[VA]])
692*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd [[ARG1]], 8([[GV]])
693*9880d681SAndroid Build Coastguard Worker
694*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 2
695*9880d681SAndroid Build Coastguard Worker
696*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] again.
697*9880d681SAndroid Build Coastguard Worker; FIXME: We're still aligned from the last one but CodeGen doesn't spot that.
698*9880d681SAndroid Build Coastguard Worker; O32:           lw [[VA:\$[0-9]+]], 0([[SP]])
699*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA_TMP0:\$[0-9]+]], [[VA]], 7
700*9880d681SAndroid Build Coastguard Worker; O32-DAG:       and   [[VA_TMP2:\$[0-9]+]], [[VA_TMP0]], [[VA_TMP1]]
701*9880d681SAndroid Build Coastguard Worker; O32-DAG:       ori   [[VA2:\$[0-9]+]], [[VA_TMP2]], 4
702*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
703*9880d681SAndroid Build Coastguard Worker
704*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA2:\$[0-9]+]], 0([[SP]])
705*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA3:\$[0-9]+]], [[VA2]], 8
706*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA3]], 0([[SP]])
707*9880d681SAndroid Build Coastguard Worker
708*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA2:\$[0-9]+]], 0([[SP]])
709*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA3:\$[0-9]+]], [[VA2]], 8
710*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA3]], 0([[SP]])
711*9880d681SAndroid Build Coastguard Worker
712*9880d681SAndroid Build Coastguard Worker; Load the second argument from the variable portion and copy it to the global.
713*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
714*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG2]], 16([[GV]])
715*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
716*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
717*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
718*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
719*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG2]], 20([[GV]])
720*9880d681SAndroid Build Coastguard Worker
721*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       ld [[ARG2:\$[0-9]+]], 0([[VA2]])
722*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd [[ARG2]], 16([[GV]])
723*9880d681SAndroid Build Coastguard Worker
724*9880d681SAndroid Build Coastguard Worker  %ap = alloca i8*, align 8
725*9880d681SAndroid Build Coastguard Worker  %ap2 = bitcast i8** %ap to i8*
726*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_start(i8* %ap2)
727*9880d681SAndroid Build Coastguard Worker
728*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 1", ""()
729*9880d681SAndroid Build Coastguard Worker  %arg1 = va_arg i8** %ap, i64
730*9880d681SAndroid Build Coastguard Worker  %e1 = getelementptr [3 x i64], [3 x i64]* @dwords, i32 0, i32 1
731*9880d681SAndroid Build Coastguard Worker  store volatile i64 %arg1, i64* %e1, align 8
732*9880d681SAndroid Build Coastguard Worker
733*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 2", ""()
734*9880d681SAndroid Build Coastguard Worker  %arg2 = va_arg i8** %ap, i64
735*9880d681SAndroid Build Coastguard Worker  %e2 = getelementptr [3 x i64], [3 x i64]* @dwords, i32 0, i32 2
736*9880d681SAndroid Build Coastguard Worker  store volatile i64 %arg2, i64* %e2, align 8
737*9880d681SAndroid Build Coastguard Worker
738*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_end(i8* %ap2)
739*9880d681SAndroid Build Coastguard Worker
740*9880d681SAndroid Build Coastguard Worker  ret void
741*9880d681SAndroid Build Coastguard Worker}
742*9880d681SAndroid Build Coastguard Worker
743*9880d681SAndroid Build Coastguard Workerdefine void @fn_i64_dotdotdot_i16(i64 %a, ...) {
744*9880d681SAndroid Build Coastguard Workerentry:
745*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: fn_i64_dotdotdot_i16:
746*9880d681SAndroid Build Coastguard Worker
747*9880d681SAndroid Build Coastguard Worker; Set up the stack with an 8-byte local area. N32/N64 must also make room for
748*9880d681SAndroid Build Coastguard Worker; the argument save area (56 bytes).
749*9880d681SAndroid Build Coastguard Worker; O32:           addiu  [[SP:\$sp]], $sp, -8
750*9880d681SAndroid Build Coastguard Worker; N32:           addiu  [[SP:\$sp]], $sp, -64
751*9880d681SAndroid Build Coastguard Worker; N64:           daddiu [[SP:\$sp]], $sp, -64
752*9880d681SAndroid Build Coastguard Worker
753*9880d681SAndroid Build Coastguard Worker; Save variable argument portion on the stack
754*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $7, 20([[SP]])
755*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $6, 16([[SP]])
756*9880d681SAndroid Build Coastguard Worker
757*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $11, 56([[SP]])
758*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $10, 48([[SP]])
759*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $9, 40([[SP]])
760*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $8, 32([[SP]])
761*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $7, 24([[SP]])
762*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $6, 16([[SP]])
763*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $5, 8([[SP]])
764*9880d681SAndroid Build Coastguard Worker
765*9880d681SAndroid Build Coastguard Worker; Initialize variable argument pointer.
766*9880d681SAndroid Build Coastguard Worker; For O32, the offset is 16 due to the 4 bytes used to store local variables,
767*9880d681SAndroid Build Coastguard Worker; 4 bytes padding to maintain stack alignment, and the two 4 byte slots for the
768*9880d681SAndroid Build Coastguard Worker; first fixed argument.
769*9880d681SAndroid Build Coastguard Worker; For N32/N64, it is only 8 since the fixed arguments do not reserve stack
770*9880d681SAndroid Build Coastguard Worker; space.
771*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 16
772*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
773*9880d681SAndroid Build Coastguard Worker
774*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 8
775*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA]], 0([[SP]])
776*9880d681SAndroid Build Coastguard Worker
777*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA:\$[0-9]+]], [[SP]], 8
778*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA]], 0([[SP]])
779*9880d681SAndroid Build Coastguard Worker
780*9880d681SAndroid Build Coastguard Worker; Store [[VA]]
781*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
782*9880d681SAndroid Build Coastguard Worker
783*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 1
784*9880d681SAndroid Build Coastguard Worker
785*9880d681SAndroid Build Coastguard Worker; Increment [[VA]]
786*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
787*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
788*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
789*9880d681SAndroid Build Coastguard Worker
790*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
791*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
792*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA2]], 0([[SP]])
793*9880d681SAndroid Build Coastguard Worker
794*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA:\$[0-9]+]], 0([[SP]])
795*9880d681SAndroid Build Coastguard Worker; N64-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
796*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA2]], 0([[SP]])
797*9880d681SAndroid Build Coastguard Worker
798*9880d681SAndroid Build Coastguard Worker; Load the first argument from the variable portion.
799*9880d681SAndroid Build Coastguard Worker; This has used the stack pointer directly rather than the [[VA]] we just set
800*9880d681SAndroid Build Coastguard Worker; up.
801*9880d681SAndroid Build Coastguard Worker; Big-endian mode for N32/N64 must add an additional 4 to the offset due to byte
802*9880d681SAndroid Build Coastguard Worker; order.
803*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
804*9880d681SAndroid Build Coastguard Worker
805*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG1:\$[0-9]+]], 0([[VA]])
806*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG1:\$[0-9]+]], 4([[VA]])
807*9880d681SAndroid Build Coastguard Worker
808*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
809*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(hwords)
810*9880d681SAndroid Build Coastguard Worker
811*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(hwords)
812*9880d681SAndroid Build Coastguard Worker
813*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[GV:\$[0-9]+]], %got_disp(hwords)(
814*9880d681SAndroid Build Coastguard Worker
815*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sh [[ARG1]], 2([[GV]])
816*9880d681SAndroid Build Coastguard Worker
817*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 2
818*9880d681SAndroid Build Coastguard Worker
819*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] again.
820*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
821*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
822*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
823*9880d681SAndroid Build Coastguard Worker
824*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA2:\$[0-9]+]], 0([[SP]])
825*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA3:\$[0-9]+]], [[VA2]], 8
826*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA3]], 0([[SP]])
827*9880d681SAndroid Build Coastguard Worker
828*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA2:\$[0-9]+]], 0([[SP]])
829*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA3:\$[0-9]+]], [[VA2]], 8
830*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA3]], 0([[SP]])
831*9880d681SAndroid Build Coastguard Worker
832*9880d681SAndroid Build Coastguard Worker; Load the second argument from the variable portion.
833*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
834*9880d681SAndroid Build Coastguard Worker
835*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG2:\$[0-9]+]], 0([[VA2]])
836*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG2:\$[0-9]+]], 4([[VA2]])
837*9880d681SAndroid Build Coastguard Worker
838*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
839*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sh [[ARG2]], 4([[GV]])
840*9880d681SAndroid Build Coastguard Worker
841*9880d681SAndroid Build Coastguard Worker  %ap = alloca i8*, align 8
842*9880d681SAndroid Build Coastguard Worker  %ap2 = bitcast i8** %ap to i8*
843*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_start(i8* %ap2)
844*9880d681SAndroid Build Coastguard Worker
845*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 1", ""()
846*9880d681SAndroid Build Coastguard Worker  %arg1 = va_arg i8** %ap, i16
847*9880d681SAndroid Build Coastguard Worker  %e1 = getelementptr [3 x i16], [3 x i16]* @hwords, i32 0, i32 1
848*9880d681SAndroid Build Coastguard Worker  store volatile i16 %arg1, i16* %e1, align 2
849*9880d681SAndroid Build Coastguard Worker
850*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 2", ""()
851*9880d681SAndroid Build Coastguard Worker  %arg2 = va_arg i8** %ap, i16
852*9880d681SAndroid Build Coastguard Worker  %e2 = getelementptr [3 x i16], [3 x i16]* @hwords, i32 0, i32 2
853*9880d681SAndroid Build Coastguard Worker  store volatile i16 %arg2, i16* %e2, align 2
854*9880d681SAndroid Build Coastguard Worker
855*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_end(i8* %ap2)
856*9880d681SAndroid Build Coastguard Worker
857*9880d681SAndroid Build Coastguard Worker  ret void
858*9880d681SAndroid Build Coastguard Worker}
859*9880d681SAndroid Build Coastguard Worker
860*9880d681SAndroid Build Coastguard Workerdefine void @fn_i64_dotdotdot_i32(i64 %a, ...) {
861*9880d681SAndroid Build Coastguard Workerentry:
862*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: fn_i64_dotdotdot_i32:
863*9880d681SAndroid Build Coastguard Worker
864*9880d681SAndroid Build Coastguard Worker; Set up the stack with an 8-byte local area. N32/N64 must also make room for
865*9880d681SAndroid Build Coastguard Worker; the argument save area (56 bytes).
866*9880d681SAndroid Build Coastguard Worker; O32:           addiu  [[SP:\$sp]], $sp, -8
867*9880d681SAndroid Build Coastguard Worker; N32:           addiu  [[SP:\$sp]], $sp, -64
868*9880d681SAndroid Build Coastguard Worker; N64:           daddiu  [[SP:\$sp]], $sp, -64
869*9880d681SAndroid Build Coastguard Worker
870*9880d681SAndroid Build Coastguard Worker; Save variable argument portion on the stack
871*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $7, 20([[SP]])
872*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $6, 16([[SP]])
873*9880d681SAndroid Build Coastguard Worker
874*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $11, 56([[SP]])
875*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $10, 48([[SP]])
876*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $9, 40([[SP]])
877*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $8, 32([[SP]])
878*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $7, 24([[SP]])
879*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $6, 16([[SP]])
880*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $5, 8([[SP]])
881*9880d681SAndroid Build Coastguard Worker
882*9880d681SAndroid Build Coastguard Worker; Initialize variable argument pointer.
883*9880d681SAndroid Build Coastguard Worker; For O32, the offset is 16 due to the 4 bytes used to store local variables,
884*9880d681SAndroid Build Coastguard Worker; 4 bytes padding to maintain stack alignment, and the two 4 byte slots for the
885*9880d681SAndroid Build Coastguard Worker; first fixed argument.
886*9880d681SAndroid Build Coastguard Worker; For N32/N64, it is only 8 since the fixed arguments do not reserve stack
887*9880d681SAndroid Build Coastguard Worker; space.
888*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 16
889*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
890*9880d681SAndroid Build Coastguard Worker
891*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 8
892*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA]], 0([[SP]])
893*9880d681SAndroid Build Coastguard Worker
894*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA:\$[0-9]+]], [[SP]], 8
895*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA]], 0([[SP]])
896*9880d681SAndroid Build Coastguard Worker
897*9880d681SAndroid Build Coastguard Worker; Store [[VA]]
898*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
899*9880d681SAndroid Build Coastguard Worker
900*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 1
901*9880d681SAndroid Build Coastguard Worker
902*9880d681SAndroid Build Coastguard Worker; Increment [[VA]]
903*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
904*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
905*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
906*9880d681SAndroid Build Coastguard Worker
907*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
908*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
909*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA2]], 0([[SP]])
910*9880d681SAndroid Build Coastguard Worker
911*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA:\$[0-9]+]], 0([[SP]])
912*9880d681SAndroid Build Coastguard Worker; N64-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
913*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA2]], 0([[SP]])
914*9880d681SAndroid Build Coastguard Worker
915*9880d681SAndroid Build Coastguard Worker; Load the first argument from the variable portion.
916*9880d681SAndroid Build Coastguard Worker; This has used the stack pointer directly rather than the [[VA]] we just set
917*9880d681SAndroid Build Coastguard Worker; up.
918*9880d681SAndroid Build Coastguard Worker; Big-endian mode for N32/N64 must add an additional 4 to the offset due to byte
919*9880d681SAndroid Build Coastguard Worker; order.
920*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
921*9880d681SAndroid Build Coastguard Worker
922*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG1:\$[0-9]+]], 0([[VA]])
923*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG1:\$[0-9]+]], 4([[VA]])
924*9880d681SAndroid Build Coastguard Worker
925*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
926*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(words)
927*9880d681SAndroid Build Coastguard Worker
928*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(words)
929*9880d681SAndroid Build Coastguard Worker
930*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[GV:\$[0-9]+]], %got_disp(words)(
931*9880d681SAndroid Build Coastguard Worker
932*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sw [[ARG1]], 4([[GV]])
933*9880d681SAndroid Build Coastguard Worker
934*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 2
935*9880d681SAndroid Build Coastguard Worker
936*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] again.
937*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
938*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
939*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
940*9880d681SAndroid Build Coastguard Worker
941*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA2:\$[0-9]+]], 0([[SP]])
942*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA3:\$[0-9]+]], [[VA2]], 8
943*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA3]], 0([[SP]])
944*9880d681SAndroid Build Coastguard Worker
945*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA2:\$[0-9]+]], 0([[SP]])
946*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA3:\$[0-9]+]], [[VA2]], 8
947*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA3]], 0([[SP]])
948*9880d681SAndroid Build Coastguard Worker
949*9880d681SAndroid Build Coastguard Worker; Load the second argument from the variable portion.
950*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
951*9880d681SAndroid Build Coastguard Worker
952*9880d681SAndroid Build Coastguard Worker; NEW-LE-DAG:    lw [[ARG2:\$[0-9]+]], 0([[VA2]])
953*9880d681SAndroid Build Coastguard Worker; NEW-BE-DAG:    lw [[ARG2:\$[0-9]+]], 4([[VA2]])
954*9880d681SAndroid Build Coastguard Worker
955*9880d681SAndroid Build Coastguard Worker; Copy the arg to the global
956*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       sw [[ARG2]], 8([[GV]])
957*9880d681SAndroid Build Coastguard Worker
958*9880d681SAndroid Build Coastguard Worker  %ap = alloca i8*, align 8
959*9880d681SAndroid Build Coastguard Worker  %ap2 = bitcast i8** %ap to i8*
960*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_start(i8* %ap2)
961*9880d681SAndroid Build Coastguard Worker
962*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 1", ""()
963*9880d681SAndroid Build Coastguard Worker  %arg1 = va_arg i8** %ap, i32
964*9880d681SAndroid Build Coastguard Worker  %e1 = getelementptr [3 x i32], [3 x i32]* @words, i32 0, i32 1
965*9880d681SAndroid Build Coastguard Worker  store volatile i32 %arg1, i32* %e1, align 4
966*9880d681SAndroid Build Coastguard Worker
967*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 2", ""()
968*9880d681SAndroid Build Coastguard Worker  %arg2 = va_arg i8** %ap, i32
969*9880d681SAndroid Build Coastguard Worker  %e2 = getelementptr [3 x i32], [3 x i32]* @words, i32 0, i32 2
970*9880d681SAndroid Build Coastguard Worker  store volatile i32 %arg2, i32* %e2, align 4
971*9880d681SAndroid Build Coastguard Worker
972*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_end(i8* %ap2)
973*9880d681SAndroid Build Coastguard Worker
974*9880d681SAndroid Build Coastguard Worker  ret void
975*9880d681SAndroid Build Coastguard Worker}
976*9880d681SAndroid Build Coastguard Worker
977*9880d681SAndroid Build Coastguard Workerdefine void @fn_i64_dotdotdot_i64(i64 %a, ...) {
978*9880d681SAndroid Build Coastguard Workerentry:
979*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: fn_i64_dotdotdot_i64:
980*9880d681SAndroid Build Coastguard Worker
981*9880d681SAndroid Build Coastguard Worker; Set up the stack with an 8-byte local area. N32/N64 must also make room for
982*9880d681SAndroid Build Coastguard Worker; the argument save area (56 bytes).
983*9880d681SAndroid Build Coastguard Worker; O32:           addiu  [[SP:\$sp]], $sp, -8
984*9880d681SAndroid Build Coastguard Worker; N32:           addiu  [[SP:\$sp]], $sp, -64
985*9880d681SAndroid Build Coastguard Worker; N64:           daddiu  [[SP:\$sp]], $sp, -64
986*9880d681SAndroid Build Coastguard Worker
987*9880d681SAndroid Build Coastguard Worker; Save variable argument portion on the stack
988*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $7, 20([[SP]])
989*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw $6, 16([[SP]])
990*9880d681SAndroid Build Coastguard Worker
991*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $11, 56([[SP]])
992*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $10, 48([[SP]])
993*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $9, 40([[SP]])
994*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $8, 32([[SP]])
995*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $7, 24([[SP]])
996*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $6, 16([[SP]])
997*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd $5, 8([[SP]])
998*9880d681SAndroid Build Coastguard Worker
999*9880d681SAndroid Build Coastguard Worker; Initialize variable argument pointer.
1000*9880d681SAndroid Build Coastguard Worker; For O32, the offset is 16 due to the 4 bytes used to store local variables,
1001*9880d681SAndroid Build Coastguard Worker; 4 bytes padding to maintain stack alignment, and the two 4 byte slots for the
1002*9880d681SAndroid Build Coastguard Worker; first fixed argument.
1003*9880d681SAndroid Build Coastguard Worker; For N32/N64, it is only 8 since the fixed arguments do not reserve stack
1004*9880d681SAndroid Build Coastguard Worker; space.
1005*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 16
1006*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
1007*9880d681SAndroid Build Coastguard Worker
1008*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA:\$[0-9]+]], [[SP]], 8
1009*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA]], 0([[SP]])
1010*9880d681SAndroid Build Coastguard Worker
1011*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA:\$[0-9]+]], [[SP]], 8
1012*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA]], 0([[SP]])
1013*9880d681SAndroid Build Coastguard Worker
1014*9880d681SAndroid Build Coastguard Worker; Store [[VA]]
1015*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA]], 0([[SP]])
1016*9880d681SAndroid Build Coastguard Worker
1017*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 1
1018*9880d681SAndroid Build Coastguard Worker
1019*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] (and realign pointer for O32)
1020*9880d681SAndroid Build Coastguard Worker; O32:           lw [[VA:\$[0-9]+]], 0([[SP]])
1021*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA_TMP0:\$[0-9]+]], [[VA]], 7
1022*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA_TMP1:\$[0-9]+]], $zero, -8
1023*9880d681SAndroid Build Coastguard Worker; O32-DAG:       and   [[VA_TMP2:\$[0-9]+]], [[VA_TMP0]], [[VA_TMP1]]
1024*9880d681SAndroid Build Coastguard Worker; O32-DAG:       ori   [[VA2:\$[0-9]+]], [[VA_TMP2]], 4
1025*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
1026*9880d681SAndroid Build Coastguard Worker
1027*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
1028*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
1029*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA2]], 0([[SP]])
1030*9880d681SAndroid Build Coastguard Worker
1031*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA:\$[0-9]+]], 0([[SP]])
1032*9880d681SAndroid Build Coastguard Worker; N64-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 8
1033*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA2]], 0([[SP]])
1034*9880d681SAndroid Build Coastguard Worker
1035*9880d681SAndroid Build Coastguard Worker; Load the first argument from the variable portion and copy it to the global.
1036*9880d681SAndroid Build Coastguard Worker; This has used the stack pointer directly rather than the [[VA]] we just set
1037*9880d681SAndroid Build Coastguard Worker; up.
1038*9880d681SAndroid Build Coastguard Worker; Big-endian mode for N32/N64 must add an additional 4 to the offset due to byte
1039*9880d681SAndroid Build Coastguard Worker; order.
1040*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(dwords)
1041*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
1042*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG1]], 8([[GV]])
1043*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
1044*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
1045*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
1046*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG1:\$[0-9]+]], 0([[VA]])
1047*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG1]], 12([[GV]])
1048*9880d681SAndroid Build Coastguard Worker
1049*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[GV:\$[0-9]+]], ${{[0-9]+}}, %lo(dwords)
1050*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[GV:\$[0-9]+]], %got_disp(dwords)(
1051*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       ld [[ARG1:\$[0-9]+]], 0([[VA]])
1052*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd [[ARG1]], 8([[GV]])
1053*9880d681SAndroid Build Coastguard Worker
1054*9880d681SAndroid Build Coastguard Worker; ALL: teqi $zero, 2
1055*9880d681SAndroid Build Coastguard Worker
1056*9880d681SAndroid Build Coastguard Worker; Increment [[VA]] again.
1057*9880d681SAndroid Build Coastguard Worker; FIXME: We're still aligned from the last one but CodeGen doesn't spot that.
1058*9880d681SAndroid Build Coastguard Worker; O32:           lw [[VA:\$[0-9]+]], 0([[SP]])
1059*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA_TMP0:\$[0-9]+]], [[VA]], 7
1060*9880d681SAndroid Build Coastguard Worker; O32-DAG:       and   [[VA_TMP2:\$[0-9]+]], [[VA_TMP0]], [[VA_TMP1]]
1061*9880d681SAndroid Build Coastguard Worker; O32-DAG:       ori   [[VA2:\$[0-9]+]], [[VA_TMP2]], 4
1062*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
1063*9880d681SAndroid Build Coastguard Worker
1064*9880d681SAndroid Build Coastguard Worker; N32-DAG:       lw [[VA2:\$[0-9]+]], 0([[SP]])
1065*9880d681SAndroid Build Coastguard Worker; N32-DAG:       addiu [[VA3:\$[0-9]+]], [[VA2]], 8
1066*9880d681SAndroid Build Coastguard Worker; N32-DAG:       sw [[VA3]], 0([[SP]])
1067*9880d681SAndroid Build Coastguard Worker
1068*9880d681SAndroid Build Coastguard Worker; N64-DAG:       ld [[VA2:\$[0-9]+]], 0([[SP]])
1069*9880d681SAndroid Build Coastguard Worker; N64-DAG:       daddiu [[VA3:\$[0-9]+]], [[VA2]], 8
1070*9880d681SAndroid Build Coastguard Worker; N64-DAG:       sd [[VA3]], 0([[SP]])
1071*9880d681SAndroid Build Coastguard Worker
1072*9880d681SAndroid Build Coastguard Worker; Load the second argument from the variable portion and copy it to the global.
1073*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
1074*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG2]], 16([[GV]])
1075*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[VA:\$[0-9]+]], 0([[SP]])
1076*9880d681SAndroid Build Coastguard Worker; O32-DAG:       addiu [[VA2:\$[0-9]+]], [[VA]], 4
1077*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[VA2]], 0([[SP]])
1078*9880d681SAndroid Build Coastguard Worker; O32-DAG:       lw [[ARG2:\$[0-9]+]], 0([[VA]])
1079*9880d681SAndroid Build Coastguard Worker; O32-DAG:       sw [[ARG2]], 20([[GV]])
1080*9880d681SAndroid Build Coastguard Worker
1081*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       ld [[ARG2:\$[0-9]+]], 0([[VA2]])
1082*9880d681SAndroid Build Coastguard Worker; NEW-DAG:       sd [[ARG2]], 16([[GV]])
1083*9880d681SAndroid Build Coastguard Worker
1084*9880d681SAndroid Build Coastguard Worker  %ap = alloca i8*, align 8
1085*9880d681SAndroid Build Coastguard Worker  %ap2 = bitcast i8** %ap to i8*
1086*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_start(i8* %ap2)
1087*9880d681SAndroid Build Coastguard Worker
1088*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 1", ""()
1089*9880d681SAndroid Build Coastguard Worker  %arg1 = va_arg i8** %ap, i64
1090*9880d681SAndroid Build Coastguard Worker  %e1 = getelementptr [3 x i64], [3 x i64]* @dwords, i32 0, i32 1
1091*9880d681SAndroid Build Coastguard Worker  store volatile i64 %arg1, i64* %e1, align 8
1092*9880d681SAndroid Build Coastguard Worker
1093*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "teqi $$zero, 2", ""()
1094*9880d681SAndroid Build Coastguard Worker  %arg2 = va_arg i8** %ap, i64
1095*9880d681SAndroid Build Coastguard Worker  %e2 = getelementptr [3 x i64], [3 x i64]* @dwords, i32 0, i32 2
1096*9880d681SAndroid Build Coastguard Worker  store volatile i64 %arg2, i64* %e2, align 8
1097*9880d681SAndroid Build Coastguard Worker
1098*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_end(i8* %ap2)
1099*9880d681SAndroid Build Coastguard Worker
1100*9880d681SAndroid Build Coastguard Worker  ret void
1101*9880d681SAndroid Build Coastguard Worker}
1102*9880d681SAndroid Build Coastguard Worker
1103*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.va_start(i8*)
1104*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.va_end(i8*)
1105