xref: /llvm-project/llvm/test/CodeGen/X86/fp128-libcalls.ll (revision 21630efb5a8f411cdf39b15f21a104888145b03f)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -O2 -mtriple=x86_64-linux-android \
3; RUN:     -enable-legalize-types-checking | FileCheck %s --check-prefix=ANDROID
4; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu \
5; RUN:     -enable-legalize-types-checking | FileCheck %s --check-prefix=GNU
6; RUN: llc < %s -O2 -mtriple=i686-linux-gnu -mattr=sse2 \
7; RUN:     -enable-legalize-types-checking | FileCheck %s --check-prefix=X86
8
9; Check all soft floating point library function calls.
10
11@vf64 = common dso_local global double 0.000000e+00, align 8
12@vf128 = common dso_local global fp128 0xL00000000000000000000000000000000, align 16
13
14define dso_local void @Test128Add(fp128 %d1, fp128 %d2) nounwind {
15; CHECK-LABEL: Test128Add:
16; CHECK:       # %bb.0: # %entry
17; CHECK-NEXT:    pushq %rax
18; CHECK-NEXT:    callq __addtf3@PLT
19; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
20; CHECK-NEXT:    popq %rax
21; CHECK-NEXT:    retq
22;
23; ANDROID-LABEL: Test128Add:
24; ANDROID:       # %bb.0: # %entry
25; ANDROID-NEXT:    pushq %rax
26; ANDROID-NEXT:    callq __addtf3@PLT
27; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
28; ANDROID-NEXT:    popq %rax
29; ANDROID-NEXT:    retq
30;
31; GNU-LABEL: Test128Add:
32; GNU:       # %bb.0: # %entry
33; GNU-NEXT:    pushq %rax
34; GNU-NEXT:    callq __addtf3@PLT
35; GNU-NEXT:    movaps %xmm0, vf128(%rip)
36; GNU-NEXT:    popq %rax
37; GNU-NEXT:    retq
38;
39; X86-LABEL: Test128Add:
40; X86:       # %bb.0: # %entry
41; X86-NEXT:    subl $40, %esp
42; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
43; X86-NEXT:    pushl {{[0-9]+}}(%esp)
44; X86-NEXT:    pushl {{[0-9]+}}(%esp)
45; X86-NEXT:    pushl {{[0-9]+}}(%esp)
46; X86-NEXT:    pushl {{[0-9]+}}(%esp)
47; X86-NEXT:    pushl {{[0-9]+}}(%esp)
48; X86-NEXT:    pushl {{[0-9]+}}(%esp)
49; X86-NEXT:    pushl {{[0-9]+}}(%esp)
50; X86-NEXT:    pushl {{[0-9]+}}(%esp)
51; X86-NEXT:    pushl %eax
52; X86-NEXT:    calll __addtf3
53; X86-NEXT:    addl $44, %esp
54; X86-NEXT:    movaps (%esp), %xmm0
55; X86-NEXT:    movaps %xmm0, vf128
56; X86-NEXT:    addl $28, %esp
57; X86-NEXT:    retl
58entry:
59  %add = fadd fp128 %d1, %d2
60  store fp128 %add, ptr @vf128, align 16
61  ret void
62}
63
64define dso_local void @Test128_1Add(fp128 %d1) nounwind {
65; CHECK-LABEL: Test128_1Add:
66; CHECK:       # %bb.0: # %entry
67; CHECK-NEXT:    pushq %rax
68; CHECK-NEXT:    movaps %xmm0, %xmm1
69; CHECK-NEXT:    movaps vf128(%rip), %xmm0
70; CHECK-NEXT:    callq __addtf3@PLT
71; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
72; CHECK-NEXT:    popq %rax
73; CHECK-NEXT:    retq
74;
75; ANDROID-LABEL: Test128_1Add:
76; ANDROID:       # %bb.0: # %entry
77; ANDROID-NEXT:    pushq %rax
78; ANDROID-NEXT:    movaps %xmm0, %xmm1
79; ANDROID-NEXT:    movaps vf128(%rip), %xmm0
80; ANDROID-NEXT:    callq __addtf3@PLT
81; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
82; ANDROID-NEXT:    popq %rax
83; ANDROID-NEXT:    retq
84;
85; GNU-LABEL: Test128_1Add:
86; GNU:       # %bb.0: # %entry
87; GNU-NEXT:    pushq %rax
88; GNU-NEXT:    movaps %xmm0, %xmm1
89; GNU-NEXT:    movaps vf128(%rip), %xmm0
90; GNU-NEXT:    callq __addtf3@PLT
91; GNU-NEXT:    movaps %xmm0, vf128(%rip)
92; GNU-NEXT:    popq %rax
93; GNU-NEXT:    retq
94;
95; X86-LABEL: Test128_1Add:
96; X86:       # %bb.0: # %entry
97; X86-NEXT:    subl $40, %esp
98; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
99; X86-NEXT:    pushl {{[0-9]+}}(%esp)
100; X86-NEXT:    pushl {{[0-9]+}}(%esp)
101; X86-NEXT:    pushl {{[0-9]+}}(%esp)
102; X86-NEXT:    pushl {{[0-9]+}}(%esp)
103; X86-NEXT:    pushl vf128+12
104; X86-NEXT:    pushl vf128+8
105; X86-NEXT:    pushl vf128+4
106; X86-NEXT:    pushl vf128
107; X86-NEXT:    pushl %eax
108; X86-NEXT:    calll __addtf3
109; X86-NEXT:    addl $44, %esp
110; X86-NEXT:    movaps (%esp), %xmm0
111; X86-NEXT:    movaps %xmm0, vf128
112; X86-NEXT:    addl $28, %esp
113; X86-NEXT:    retl
114entry:
115  %0 = load fp128, ptr @vf128, align 16
116  %add = fadd fp128 %0, %d1
117  store fp128 %add, ptr @vf128, align 16
118  ret void
119}
120
121define dso_local void @Test128Sub(fp128 %d1, fp128 %d2) nounwind {
122; CHECK-LABEL: Test128Sub:
123; CHECK:       # %bb.0: # %entry
124; CHECK-NEXT:    pushq %rax
125; CHECK-NEXT:    callq __subtf3@PLT
126; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
127; CHECK-NEXT:    popq %rax
128; CHECK-NEXT:    retq
129;
130; ANDROID-LABEL: Test128Sub:
131; ANDROID:       # %bb.0: # %entry
132; ANDROID-NEXT:    pushq %rax
133; ANDROID-NEXT:    callq __subtf3@PLT
134; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
135; ANDROID-NEXT:    popq %rax
136; ANDROID-NEXT:    retq
137;
138; GNU-LABEL: Test128Sub:
139; GNU:       # %bb.0: # %entry
140; GNU-NEXT:    pushq %rax
141; GNU-NEXT:    callq __subtf3@PLT
142; GNU-NEXT:    movaps %xmm0, vf128(%rip)
143; GNU-NEXT:    popq %rax
144; GNU-NEXT:    retq
145;
146; X86-LABEL: Test128Sub:
147; X86:       # %bb.0: # %entry
148; X86-NEXT:    subl $40, %esp
149; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
150; X86-NEXT:    pushl {{[0-9]+}}(%esp)
151; X86-NEXT:    pushl {{[0-9]+}}(%esp)
152; X86-NEXT:    pushl {{[0-9]+}}(%esp)
153; X86-NEXT:    pushl {{[0-9]+}}(%esp)
154; X86-NEXT:    pushl {{[0-9]+}}(%esp)
155; X86-NEXT:    pushl {{[0-9]+}}(%esp)
156; X86-NEXT:    pushl {{[0-9]+}}(%esp)
157; X86-NEXT:    pushl {{[0-9]+}}(%esp)
158; X86-NEXT:    pushl %eax
159; X86-NEXT:    calll __subtf3
160; X86-NEXT:    addl $44, %esp
161; X86-NEXT:    movaps (%esp), %xmm0
162; X86-NEXT:    movaps %xmm0, vf128
163; X86-NEXT:    addl $28, %esp
164; X86-NEXT:    retl
165entry:
166  %sub = fsub fp128 %d1, %d2
167  store fp128 %sub, ptr @vf128, align 16
168  ret void
169}
170
171define dso_local void @Test128_1Sub(fp128 %d1) nounwind {
172; CHECK-LABEL: Test128_1Sub:
173; CHECK:       # %bb.0: # %entry
174; CHECK-NEXT:    pushq %rax
175; CHECK-NEXT:    movaps %xmm0, %xmm1
176; CHECK-NEXT:    movaps vf128(%rip), %xmm0
177; CHECK-NEXT:    callq __subtf3@PLT
178; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
179; CHECK-NEXT:    popq %rax
180; CHECK-NEXT:    retq
181;
182; ANDROID-LABEL: Test128_1Sub:
183; ANDROID:       # %bb.0: # %entry
184; ANDROID-NEXT:    pushq %rax
185; ANDROID-NEXT:    movaps %xmm0, %xmm1
186; ANDROID-NEXT:    movaps vf128(%rip), %xmm0
187; ANDROID-NEXT:    callq __subtf3@PLT
188; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
189; ANDROID-NEXT:    popq %rax
190; ANDROID-NEXT:    retq
191;
192; GNU-LABEL: Test128_1Sub:
193; GNU:       # %bb.0: # %entry
194; GNU-NEXT:    pushq %rax
195; GNU-NEXT:    movaps %xmm0, %xmm1
196; GNU-NEXT:    movaps vf128(%rip), %xmm0
197; GNU-NEXT:    callq __subtf3@PLT
198; GNU-NEXT:    movaps %xmm0, vf128(%rip)
199; GNU-NEXT:    popq %rax
200; GNU-NEXT:    retq
201;
202; X86-LABEL: Test128_1Sub:
203; X86:       # %bb.0: # %entry
204; X86-NEXT:    subl $40, %esp
205; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
206; X86-NEXT:    pushl {{[0-9]+}}(%esp)
207; X86-NEXT:    pushl {{[0-9]+}}(%esp)
208; X86-NEXT:    pushl {{[0-9]+}}(%esp)
209; X86-NEXT:    pushl {{[0-9]+}}(%esp)
210; X86-NEXT:    pushl vf128+12
211; X86-NEXT:    pushl vf128+8
212; X86-NEXT:    pushl vf128+4
213; X86-NEXT:    pushl vf128
214; X86-NEXT:    pushl %eax
215; X86-NEXT:    calll __subtf3
216; X86-NEXT:    addl $44, %esp
217; X86-NEXT:    movaps (%esp), %xmm0
218; X86-NEXT:    movaps %xmm0, vf128
219; X86-NEXT:    addl $28, %esp
220; X86-NEXT:    retl
221entry:
222  %0 = load fp128, ptr @vf128, align 16
223  %sub = fsub fp128 %0, %d1
224  store fp128 %sub, ptr @vf128, align 16
225  ret void
226}
227
228define dso_local void @Test128Mul(fp128 %d1, fp128 %d2) nounwind {
229; CHECK-LABEL: Test128Mul:
230; CHECK:       # %bb.0: # %entry
231; CHECK-NEXT:    pushq %rax
232; CHECK-NEXT:    callq __multf3@PLT
233; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
234; CHECK-NEXT:    popq %rax
235; CHECK-NEXT:    retq
236;
237; ANDROID-LABEL: Test128Mul:
238; ANDROID:       # %bb.0: # %entry
239; ANDROID-NEXT:    pushq %rax
240; ANDROID-NEXT:    callq __multf3@PLT
241; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
242; ANDROID-NEXT:    popq %rax
243; ANDROID-NEXT:    retq
244;
245; GNU-LABEL: Test128Mul:
246; GNU:       # %bb.0: # %entry
247; GNU-NEXT:    pushq %rax
248; GNU-NEXT:    callq __multf3@PLT
249; GNU-NEXT:    movaps %xmm0, vf128(%rip)
250; GNU-NEXT:    popq %rax
251; GNU-NEXT:    retq
252;
253; X86-LABEL: Test128Mul:
254; X86:       # %bb.0: # %entry
255; X86-NEXT:    subl $40, %esp
256; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
257; X86-NEXT:    pushl {{[0-9]+}}(%esp)
258; X86-NEXT:    pushl {{[0-9]+}}(%esp)
259; X86-NEXT:    pushl {{[0-9]+}}(%esp)
260; X86-NEXT:    pushl {{[0-9]+}}(%esp)
261; X86-NEXT:    pushl {{[0-9]+}}(%esp)
262; X86-NEXT:    pushl {{[0-9]+}}(%esp)
263; X86-NEXT:    pushl {{[0-9]+}}(%esp)
264; X86-NEXT:    pushl {{[0-9]+}}(%esp)
265; X86-NEXT:    pushl %eax
266; X86-NEXT:    calll __multf3
267; X86-NEXT:    addl $44, %esp
268; X86-NEXT:    movaps (%esp), %xmm0
269; X86-NEXT:    movaps %xmm0, vf128
270; X86-NEXT:    addl $28, %esp
271; X86-NEXT:    retl
272entry:
273  %mul = fmul fp128 %d1, %d2
274  store fp128 %mul, ptr @vf128, align 16
275  ret void
276}
277
278define dso_local void @Test128_1Mul(fp128 %d1) nounwind {
279; CHECK-LABEL: Test128_1Mul:
280; CHECK:       # %bb.0: # %entry
281; CHECK-NEXT:    pushq %rax
282; CHECK-NEXT:    movaps %xmm0, %xmm1
283; CHECK-NEXT:    movaps vf128(%rip), %xmm0
284; CHECK-NEXT:    callq __multf3@PLT
285; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
286; CHECK-NEXT:    popq %rax
287; CHECK-NEXT:    retq
288;
289; ANDROID-LABEL: Test128_1Mul:
290; ANDROID:       # %bb.0: # %entry
291; ANDROID-NEXT:    pushq %rax
292; ANDROID-NEXT:    movaps %xmm0, %xmm1
293; ANDROID-NEXT:    movaps vf128(%rip), %xmm0
294; ANDROID-NEXT:    callq __multf3@PLT
295; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
296; ANDROID-NEXT:    popq %rax
297; ANDROID-NEXT:    retq
298;
299; GNU-LABEL: Test128_1Mul:
300; GNU:       # %bb.0: # %entry
301; GNU-NEXT:    pushq %rax
302; GNU-NEXT:    movaps %xmm0, %xmm1
303; GNU-NEXT:    movaps vf128(%rip), %xmm0
304; GNU-NEXT:    callq __multf3@PLT
305; GNU-NEXT:    movaps %xmm0, vf128(%rip)
306; GNU-NEXT:    popq %rax
307; GNU-NEXT:    retq
308;
309; X86-LABEL: Test128_1Mul:
310; X86:       # %bb.0: # %entry
311; X86-NEXT:    subl $40, %esp
312; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
313; X86-NEXT:    pushl {{[0-9]+}}(%esp)
314; X86-NEXT:    pushl {{[0-9]+}}(%esp)
315; X86-NEXT:    pushl {{[0-9]+}}(%esp)
316; X86-NEXT:    pushl {{[0-9]+}}(%esp)
317; X86-NEXT:    pushl vf128+12
318; X86-NEXT:    pushl vf128+8
319; X86-NEXT:    pushl vf128+4
320; X86-NEXT:    pushl vf128
321; X86-NEXT:    pushl %eax
322; X86-NEXT:    calll __multf3
323; X86-NEXT:    addl $44, %esp
324; X86-NEXT:    movaps (%esp), %xmm0
325; X86-NEXT:    movaps %xmm0, vf128
326; X86-NEXT:    addl $28, %esp
327; X86-NEXT:    retl
328entry:
329  %0 = load fp128, ptr @vf128, align 16
330  %mul = fmul fp128 %0, %d1
331  store fp128 %mul, ptr @vf128, align 16
332  ret void
333}
334
335define dso_local void @Test128Div(fp128 %d1, fp128 %d2) nounwind {
336; CHECK-LABEL: Test128Div:
337; CHECK:       # %bb.0: # %entry
338; CHECK-NEXT:    pushq %rax
339; CHECK-NEXT:    callq __divtf3@PLT
340; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
341; CHECK-NEXT:    popq %rax
342; CHECK-NEXT:    retq
343;
344; ANDROID-LABEL: Test128Div:
345; ANDROID:       # %bb.0: # %entry
346; ANDROID-NEXT:    pushq %rax
347; ANDROID-NEXT:    callq __divtf3@PLT
348; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
349; ANDROID-NEXT:    popq %rax
350; ANDROID-NEXT:    retq
351;
352; GNU-LABEL: Test128Div:
353; GNU:       # %bb.0: # %entry
354; GNU-NEXT:    pushq %rax
355; GNU-NEXT:    callq __divtf3@PLT
356; GNU-NEXT:    movaps %xmm0, vf128(%rip)
357; GNU-NEXT:    popq %rax
358; GNU-NEXT:    retq
359;
360; X86-LABEL: Test128Div:
361; X86:       # %bb.0: # %entry
362; X86-NEXT:    subl $40, %esp
363; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
364; X86-NEXT:    pushl {{[0-9]+}}(%esp)
365; X86-NEXT:    pushl {{[0-9]+}}(%esp)
366; X86-NEXT:    pushl {{[0-9]+}}(%esp)
367; X86-NEXT:    pushl {{[0-9]+}}(%esp)
368; X86-NEXT:    pushl {{[0-9]+}}(%esp)
369; X86-NEXT:    pushl {{[0-9]+}}(%esp)
370; X86-NEXT:    pushl {{[0-9]+}}(%esp)
371; X86-NEXT:    pushl {{[0-9]+}}(%esp)
372; X86-NEXT:    pushl %eax
373; X86-NEXT:    calll __divtf3
374; X86-NEXT:    addl $44, %esp
375; X86-NEXT:    movaps (%esp), %xmm0
376; X86-NEXT:    movaps %xmm0, vf128
377; X86-NEXT:    addl $28, %esp
378; X86-NEXT:    retl
379entry:
380  %div = fdiv fp128 %d1, %d2
381  store fp128 %div, ptr @vf128, align 16
382  ret void
383}
384
385define dso_local void @Test128_1Div(fp128 %d1) nounwind {
386; CHECK-LABEL: Test128_1Div:
387; CHECK:       # %bb.0: # %entry
388; CHECK-NEXT:    pushq %rax
389; CHECK-NEXT:    movaps %xmm0, %xmm1
390; CHECK-NEXT:    movaps vf128(%rip), %xmm0
391; CHECK-NEXT:    callq __divtf3@PLT
392; CHECK-NEXT:    movaps %xmm0, vf128(%rip)
393; CHECK-NEXT:    popq %rax
394; CHECK-NEXT:    retq
395;
396; ANDROID-LABEL: Test128_1Div:
397; ANDROID:       # %bb.0: # %entry
398; ANDROID-NEXT:    pushq %rax
399; ANDROID-NEXT:    movaps %xmm0, %xmm1
400; ANDROID-NEXT:    movaps vf128(%rip), %xmm0
401; ANDROID-NEXT:    callq __divtf3@PLT
402; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
403; ANDROID-NEXT:    popq %rax
404; ANDROID-NEXT:    retq
405;
406; GNU-LABEL: Test128_1Div:
407; GNU:       # %bb.0: # %entry
408; GNU-NEXT:    pushq %rax
409; GNU-NEXT:    movaps %xmm0, %xmm1
410; GNU-NEXT:    movaps vf128(%rip), %xmm0
411; GNU-NEXT:    callq __divtf3@PLT
412; GNU-NEXT:    movaps %xmm0, vf128(%rip)
413; GNU-NEXT:    popq %rax
414; GNU-NEXT:    retq
415;
416; X86-LABEL: Test128_1Div:
417; X86:       # %bb.0: # %entry
418; X86-NEXT:    subl $40, %esp
419; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
420; X86-NEXT:    pushl {{[0-9]+}}(%esp)
421; X86-NEXT:    pushl {{[0-9]+}}(%esp)
422; X86-NEXT:    pushl {{[0-9]+}}(%esp)
423; X86-NEXT:    pushl {{[0-9]+}}(%esp)
424; X86-NEXT:    pushl vf128+12
425; X86-NEXT:    pushl vf128+8
426; X86-NEXT:    pushl vf128+4
427; X86-NEXT:    pushl vf128
428; X86-NEXT:    pushl %eax
429; X86-NEXT:    calll __divtf3
430; X86-NEXT:    addl $44, %esp
431; X86-NEXT:    movaps (%esp), %xmm0
432; X86-NEXT:    movaps %xmm0, vf128
433; X86-NEXT:    addl $28, %esp
434; X86-NEXT:    retl
435entry:
436  %0 = load fp128, ptr @vf128, align 16
437  %div = fdiv fp128 %0, %d1
438  store fp128 %div, ptr @vf128, align 16
439  ret void
440}
441
442define dso_local void @Test128Rem(fp128 %d1, fp128 %d2) nounwind {
443; ANDROID-LABEL: Test128Rem:
444; ANDROID:       # %bb.0: # %entry
445; ANDROID-NEXT:    pushq %rax
446; ANDROID-NEXT:    callq fmodl@PLT
447; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
448; ANDROID-NEXT:    popq %rax
449; ANDROID-NEXT:    retq
450;
451; GNU-LABEL: Test128Rem:
452; GNU:       # %bb.0: # %entry
453; GNU-NEXT:    pushq %rax
454; GNU-NEXT:    callq fmodf128@PLT
455; GNU-NEXT:    movaps %xmm0, vf128(%rip)
456; GNU-NEXT:    popq %rax
457; GNU-NEXT:    retq
458;
459; X86-LABEL: Test128Rem:
460; X86:       # %bb.0: # %entry
461; X86-NEXT:    subl $40, %esp
462; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
463; X86-NEXT:    pushl {{[0-9]+}}(%esp)
464; X86-NEXT:    pushl {{[0-9]+}}(%esp)
465; X86-NEXT:    pushl {{[0-9]+}}(%esp)
466; X86-NEXT:    pushl {{[0-9]+}}(%esp)
467; X86-NEXT:    pushl {{[0-9]+}}(%esp)
468; X86-NEXT:    pushl {{[0-9]+}}(%esp)
469; X86-NEXT:    pushl {{[0-9]+}}(%esp)
470; X86-NEXT:    pushl {{[0-9]+}}(%esp)
471; X86-NEXT:    pushl %eax
472; X86-NEXT:    calll fmodl
473; X86-NEXT:    addl $44, %esp
474; X86-NEXT:    movaps (%esp), %xmm0
475; X86-NEXT:    movaps %xmm0, vf128
476; X86-NEXT:    addl $28, %esp
477; X86-NEXT:    retl
478entry:
479  %div = frem fp128 %d1, %d2
480  store fp128 %div, ptr @vf128, align 16
481  ret void
482}
483
484define dso_local void @Test128_1Rem(fp128 %d1) nounwind {
485; ANDROID-LABEL: Test128_1Rem:
486; ANDROID:       # %bb.0: # %entry
487; ANDROID-NEXT:    pushq %rax
488; ANDROID-NEXT:    movaps %xmm0, %xmm1
489; ANDROID-NEXT:    movaps vf128(%rip), %xmm0
490; ANDROID-NEXT:    callq fmodl@PLT
491; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
492; ANDROID-NEXT:    popq %rax
493; ANDROID-NEXT:    retq
494;
495; GNU-LABEL: Test128_1Rem:
496; GNU:       # %bb.0: # %entry
497; GNU-NEXT:    pushq %rax
498; GNU-NEXT:    movaps %xmm0, %xmm1
499; GNU-NEXT:    movaps vf128(%rip), %xmm0
500; GNU-NEXT:    callq fmodf128@PLT
501; GNU-NEXT:    movaps %xmm0, vf128(%rip)
502; GNU-NEXT:    popq %rax
503; GNU-NEXT:    retq
504;
505; X86-LABEL: Test128_1Rem:
506; X86:       # %bb.0: # %entry
507; X86-NEXT:    subl $40, %esp
508; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
509; X86-NEXT:    pushl {{[0-9]+}}(%esp)
510; X86-NEXT:    pushl {{[0-9]+}}(%esp)
511; X86-NEXT:    pushl {{[0-9]+}}(%esp)
512; X86-NEXT:    pushl {{[0-9]+}}(%esp)
513; X86-NEXT:    pushl vf128+12
514; X86-NEXT:    pushl vf128+8
515; X86-NEXT:    pushl vf128+4
516; X86-NEXT:    pushl vf128
517; X86-NEXT:    pushl %eax
518; X86-NEXT:    calll fmodl
519; X86-NEXT:    addl $44, %esp
520; X86-NEXT:    movaps (%esp), %xmm0
521; X86-NEXT:    movaps %xmm0, vf128
522; X86-NEXT:    addl $28, %esp
523; X86-NEXT:    retl
524entry:
525  %0 = load fp128, ptr @vf128, align 16
526  %div = frem fp128 %0, %d1
527  store fp128 %div, ptr @vf128, align 16
528  ret void
529}
530
531define dso_local void @Test128Sqrt(fp128 %d1) nounwind {
532; ANDROID-LABEL: Test128Sqrt:
533; ANDROID:       # %bb.0: # %entry
534; ANDROID-NEXT:    pushq %rax
535; ANDROID-NEXT:    callq sqrtl@PLT
536; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
537; ANDROID-NEXT:    popq %rax
538; ANDROID-NEXT:    retq
539;
540; GNU-LABEL: Test128Sqrt:
541; GNU:       # %bb.0: # %entry
542; GNU-NEXT:    pushq %rax
543; GNU-NEXT:    callq sqrtf128@PLT
544; GNU-NEXT:    movaps %xmm0, vf128(%rip)
545; GNU-NEXT:    popq %rax
546; GNU-NEXT:    retq
547;
548; X86-LABEL: Test128Sqrt:
549; X86:       # %bb.0: # %entry
550; X86-NEXT:    subl $40, %esp
551; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
552; X86-NEXT:    pushl {{[0-9]+}}(%esp)
553; X86-NEXT:    pushl {{[0-9]+}}(%esp)
554; X86-NEXT:    pushl {{[0-9]+}}(%esp)
555; X86-NEXT:    pushl {{[0-9]+}}(%esp)
556; X86-NEXT:    pushl %eax
557; X86-NEXT:    calll sqrtl
558; X86-NEXT:    addl $28, %esp
559; X86-NEXT:    movaps (%esp), %xmm0
560; X86-NEXT:    movaps %xmm0, vf128
561; X86-NEXT:    addl $28, %esp
562; X86-NEXT:    retl
563entry:
564  %sqrt = call fp128 @llvm.sqrt.f128(fp128 %d1)
565  store fp128 %sqrt, ptr @vf128, align 16
566  ret void
567}
568declare fp128 @llvm.sqrt.f128(fp128)
569
570define dso_local void @Test128Sin(fp128 %d1) nounwind {
571; ANDROID-LABEL: Test128Sin:
572; ANDROID:       # %bb.0: # %entry
573; ANDROID-NEXT:    pushq %rax
574; ANDROID-NEXT:    callq sinl@PLT
575; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
576; ANDROID-NEXT:    popq %rax
577; ANDROID-NEXT:    retq
578;
579; GNU-LABEL: Test128Sin:
580; GNU:       # %bb.0: # %entry
581; GNU-NEXT:    pushq %rax
582; GNU-NEXT:    callq sinf128@PLT
583; GNU-NEXT:    movaps %xmm0, vf128(%rip)
584; GNU-NEXT:    popq %rax
585; GNU-NEXT:    retq
586;
587; X86-LABEL: Test128Sin:
588; X86:       # %bb.0: # %entry
589; X86-NEXT:    subl $40, %esp
590; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
591; X86-NEXT:    pushl {{[0-9]+}}(%esp)
592; X86-NEXT:    pushl {{[0-9]+}}(%esp)
593; X86-NEXT:    pushl {{[0-9]+}}(%esp)
594; X86-NEXT:    pushl {{[0-9]+}}(%esp)
595; X86-NEXT:    pushl %eax
596; X86-NEXT:    calll sinl
597; X86-NEXT:    addl $28, %esp
598; X86-NEXT:    movaps (%esp), %xmm0
599; X86-NEXT:    movaps %xmm0, vf128
600; X86-NEXT:    addl $28, %esp
601; X86-NEXT:    retl
602entry:
603  %sqrt = call fp128 @llvm.sin.f128(fp128 %d1)
604  store fp128 %sqrt, ptr @vf128, align 16
605  ret void
606}
607declare fp128 @llvm.sin.f128(fp128)
608
609define dso_local void @Test128Cos(fp128 %d1) nounwind {
610; ANDROID-LABEL: Test128Cos:
611; ANDROID:       # %bb.0: # %entry
612; ANDROID-NEXT:    pushq %rax
613; ANDROID-NEXT:    callq cosl@PLT
614; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
615; ANDROID-NEXT:    popq %rax
616; ANDROID-NEXT:    retq
617;
618; GNU-LABEL: Test128Cos:
619; GNU:       # %bb.0: # %entry
620; GNU-NEXT:    pushq %rax
621; GNU-NEXT:    callq cosf128@PLT
622; GNU-NEXT:    movaps %xmm0, vf128(%rip)
623; GNU-NEXT:    popq %rax
624; GNU-NEXT:    retq
625;
626; X86-LABEL: Test128Cos:
627; X86:       # %bb.0: # %entry
628; X86-NEXT:    subl $40, %esp
629; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
630; X86-NEXT:    pushl {{[0-9]+}}(%esp)
631; X86-NEXT:    pushl {{[0-9]+}}(%esp)
632; X86-NEXT:    pushl {{[0-9]+}}(%esp)
633; X86-NEXT:    pushl {{[0-9]+}}(%esp)
634; X86-NEXT:    pushl %eax
635; X86-NEXT:    calll cosl
636; X86-NEXT:    addl $28, %esp
637; X86-NEXT:    movaps (%esp), %xmm0
638; X86-NEXT:    movaps %xmm0, vf128
639; X86-NEXT:    addl $28, %esp
640; X86-NEXT:    retl
641entry:
642  %sqrt = call fp128 @llvm.cos.f128(fp128 %d1)
643  store fp128 %sqrt, ptr @vf128, align 16
644  ret void
645}
646declare fp128 @llvm.cos.f128(fp128)
647
648define dso_local void @Test128Ceil(fp128 %d1) nounwind {
649; ANDROID-LABEL: Test128Ceil:
650; ANDROID:       # %bb.0: # %entry
651; ANDROID-NEXT:    pushq %rax
652; ANDROID-NEXT:    callq ceill@PLT
653; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
654; ANDROID-NEXT:    popq %rax
655; ANDROID-NEXT:    retq
656;
657; GNU-LABEL: Test128Ceil:
658; GNU:       # %bb.0: # %entry
659; GNU-NEXT:    pushq %rax
660; GNU-NEXT:    callq ceilf128@PLT
661; GNU-NEXT:    movaps %xmm0, vf128(%rip)
662; GNU-NEXT:    popq %rax
663; GNU-NEXT:    retq
664;
665; X86-LABEL: Test128Ceil:
666; X86:       # %bb.0: # %entry
667; X86-NEXT:    subl $40, %esp
668; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
669; X86-NEXT:    pushl {{[0-9]+}}(%esp)
670; X86-NEXT:    pushl {{[0-9]+}}(%esp)
671; X86-NEXT:    pushl {{[0-9]+}}(%esp)
672; X86-NEXT:    pushl {{[0-9]+}}(%esp)
673; X86-NEXT:    pushl %eax
674; X86-NEXT:    calll ceill
675; X86-NEXT:    addl $28, %esp
676; X86-NEXT:    movaps (%esp), %xmm0
677; X86-NEXT:    movaps %xmm0, vf128
678; X86-NEXT:    addl $28, %esp
679; X86-NEXT:    retl
680entry:
681  %sqrt = call fp128 @llvm.ceil.f128(fp128 %d1)
682  store fp128 %sqrt, ptr @vf128, align 16
683  ret void
684}
685declare fp128 @llvm.ceil.f128(fp128)
686
687define dso_local void @Test128Floor(fp128 %d1) nounwind {
688; ANDROID-LABEL: Test128Floor:
689; ANDROID:       # %bb.0: # %entry
690; ANDROID-NEXT:    pushq %rax
691; ANDROID-NEXT:    callq floorl@PLT
692; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
693; ANDROID-NEXT:    popq %rax
694; ANDROID-NEXT:    retq
695;
696; GNU-LABEL: Test128Floor:
697; GNU:       # %bb.0: # %entry
698; GNU-NEXT:    pushq %rax
699; GNU-NEXT:    callq floorf128@PLT
700; GNU-NEXT:    movaps %xmm0, vf128(%rip)
701; GNU-NEXT:    popq %rax
702; GNU-NEXT:    retq
703;
704; X86-LABEL: Test128Floor:
705; X86:       # %bb.0: # %entry
706; X86-NEXT:    subl $40, %esp
707; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
708; X86-NEXT:    pushl {{[0-9]+}}(%esp)
709; X86-NEXT:    pushl {{[0-9]+}}(%esp)
710; X86-NEXT:    pushl {{[0-9]+}}(%esp)
711; X86-NEXT:    pushl {{[0-9]+}}(%esp)
712; X86-NEXT:    pushl %eax
713; X86-NEXT:    calll floorl
714; X86-NEXT:    addl $28, %esp
715; X86-NEXT:    movaps (%esp), %xmm0
716; X86-NEXT:    movaps %xmm0, vf128
717; X86-NEXT:    addl $28, %esp
718; X86-NEXT:    retl
719entry:
720  %sqrt = call fp128 @llvm.floor.f128(fp128 %d1)
721  store fp128 %sqrt, ptr @vf128, align 16
722  ret void
723}
724declare fp128 @llvm.floor.f128(fp128)
725
726define dso_local void @Test128Trunc(fp128 %d1) nounwind {
727; ANDROID-LABEL: Test128Trunc:
728; ANDROID:       # %bb.0: # %entry
729; ANDROID-NEXT:    pushq %rax
730; ANDROID-NEXT:    callq truncl@PLT
731; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
732; ANDROID-NEXT:    popq %rax
733; ANDROID-NEXT:    retq
734;
735; GNU-LABEL: Test128Trunc:
736; GNU:       # %bb.0: # %entry
737; GNU-NEXT:    pushq %rax
738; GNU-NEXT:    callq truncf128@PLT
739; GNU-NEXT:    movaps %xmm0, vf128(%rip)
740; GNU-NEXT:    popq %rax
741; GNU-NEXT:    retq
742;
743; X86-LABEL: Test128Trunc:
744; X86:       # %bb.0: # %entry
745; X86-NEXT:    subl $40, %esp
746; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
747; X86-NEXT:    pushl {{[0-9]+}}(%esp)
748; X86-NEXT:    pushl {{[0-9]+}}(%esp)
749; X86-NEXT:    pushl {{[0-9]+}}(%esp)
750; X86-NEXT:    pushl {{[0-9]+}}(%esp)
751; X86-NEXT:    pushl %eax
752; X86-NEXT:    calll truncl
753; X86-NEXT:    addl $28, %esp
754; X86-NEXT:    movaps (%esp), %xmm0
755; X86-NEXT:    movaps %xmm0, vf128
756; X86-NEXT:    addl $28, %esp
757; X86-NEXT:    retl
758entry:
759  %sqrt = call fp128 @llvm.trunc.f128(fp128 %d1)
760  store fp128 %sqrt, ptr @vf128, align 16
761  ret void
762}
763declare fp128 @llvm.trunc.f128(fp128)
764
765define dso_local void @Test128Nearbyint(fp128 %d1) nounwind {
766; ANDROID-LABEL: Test128Nearbyint:
767; ANDROID:       # %bb.0: # %entry
768; ANDROID-NEXT:    pushq %rax
769; ANDROID-NEXT:    callq nearbyintl@PLT
770; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
771; ANDROID-NEXT:    popq %rax
772; ANDROID-NEXT:    retq
773;
774; GNU-LABEL: Test128Nearbyint:
775; GNU:       # %bb.0: # %entry
776; GNU-NEXT:    pushq %rax
777; GNU-NEXT:    callq nearbyintf128@PLT
778; GNU-NEXT:    movaps %xmm0, vf128(%rip)
779; GNU-NEXT:    popq %rax
780; GNU-NEXT:    retq
781;
782; X86-LABEL: Test128Nearbyint:
783; X86:       # %bb.0: # %entry
784; X86-NEXT:    subl $40, %esp
785; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
786; X86-NEXT:    pushl {{[0-9]+}}(%esp)
787; X86-NEXT:    pushl {{[0-9]+}}(%esp)
788; X86-NEXT:    pushl {{[0-9]+}}(%esp)
789; X86-NEXT:    pushl {{[0-9]+}}(%esp)
790; X86-NEXT:    pushl %eax
791; X86-NEXT:    calll nearbyintl
792; X86-NEXT:    addl $28, %esp
793; X86-NEXT:    movaps (%esp), %xmm0
794; X86-NEXT:    movaps %xmm0, vf128
795; X86-NEXT:    addl $28, %esp
796; X86-NEXT:    retl
797entry:
798  %sqrt = call fp128 @llvm.nearbyint.f128(fp128 %d1)
799  store fp128 %sqrt, ptr @vf128, align 16
800  ret void
801}
802declare fp128 @llvm.nearbyint.f128(fp128)
803
804define dso_local void @Test128Rint(fp128 %d1) nounwind {
805; ANDROID-LABEL: Test128Rint:
806; ANDROID:       # %bb.0: # %entry
807; ANDROID-NEXT:    pushq %rax
808; ANDROID-NEXT:    callq rintl@PLT
809; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
810; ANDROID-NEXT:    popq %rax
811; ANDROID-NEXT:    retq
812;
813; GNU-LABEL: Test128Rint:
814; GNU:       # %bb.0: # %entry
815; GNU-NEXT:    pushq %rax
816; GNU-NEXT:    callq rintf128@PLT
817; GNU-NEXT:    movaps %xmm0, vf128(%rip)
818; GNU-NEXT:    popq %rax
819; GNU-NEXT:    retq
820;
821; X86-LABEL: Test128Rint:
822; X86:       # %bb.0: # %entry
823; X86-NEXT:    subl $40, %esp
824; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
825; X86-NEXT:    pushl {{[0-9]+}}(%esp)
826; X86-NEXT:    pushl {{[0-9]+}}(%esp)
827; X86-NEXT:    pushl {{[0-9]+}}(%esp)
828; X86-NEXT:    pushl {{[0-9]+}}(%esp)
829; X86-NEXT:    pushl %eax
830; X86-NEXT:    calll rintl
831; X86-NEXT:    addl $28, %esp
832; X86-NEXT:    movaps (%esp), %xmm0
833; X86-NEXT:    movaps %xmm0, vf128
834; X86-NEXT:    addl $28, %esp
835; X86-NEXT:    retl
836entry:
837  %sqrt = call fp128 @llvm.rint.f128(fp128 %d1)
838  store fp128 %sqrt, ptr @vf128, align 16
839  ret void
840}
841declare fp128 @llvm.rint.f128(fp128)
842
843define dso_local void @Test128Round(fp128 %d1) nounwind {
844; ANDROID-LABEL: Test128Round:
845; ANDROID:       # %bb.0: # %entry
846; ANDROID-NEXT:    pushq %rax
847; ANDROID-NEXT:    callq roundl@PLT
848; ANDROID-NEXT:    movaps %xmm0, vf128(%rip)
849; ANDROID-NEXT:    popq %rax
850; ANDROID-NEXT:    retq
851;
852; GNU-LABEL: Test128Round:
853; GNU:       # %bb.0: # %entry
854; GNU-NEXT:    pushq %rax
855; GNU-NEXT:    callq roundf128@PLT
856; GNU-NEXT:    movaps %xmm0, vf128(%rip)
857; GNU-NEXT:    popq %rax
858; GNU-NEXT:    retq
859;
860; X86-LABEL: Test128Round:
861; X86:       # %bb.0: # %entry
862; X86-NEXT:    subl $40, %esp
863; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
864; X86-NEXT:    pushl {{[0-9]+}}(%esp)
865; X86-NEXT:    pushl {{[0-9]+}}(%esp)
866; X86-NEXT:    pushl {{[0-9]+}}(%esp)
867; X86-NEXT:    pushl {{[0-9]+}}(%esp)
868; X86-NEXT:    pushl %eax
869; X86-NEXT:    calll roundl
870; X86-NEXT:    addl $28, %esp
871; X86-NEXT:    movaps (%esp), %xmm0
872; X86-NEXT:    movaps %xmm0, vf128
873; X86-NEXT:    addl $28, %esp
874; X86-NEXT:    retl
875entry:
876  %sqrt = call fp128 @llvm.round.f128(fp128 %d1)
877  store fp128 %sqrt, ptr @vf128, align 16
878  ret void
879}
880declare fp128 @llvm.round.f128(fp128)
881
882define fp128 @Test128FMA(fp128 %a, fp128 %b, fp128 %c) nounwind {
883; ANDROID-LABEL: Test128FMA:
884; ANDROID:       # %bb.0: # %entry
885; ANDROID-NEXT:    jmp fmal@PLT # TAILCALL
886;
887; GNU-LABEL: Test128FMA:
888; GNU:       # %bb.0: # %entry
889; GNU-NEXT:    jmp fmaf128@PLT # TAILCALL
890;
891; X86-LABEL: Test128FMA:
892; X86:       # %bb.0: # %entry
893; X86-NEXT:    pushl %esi
894; X86-NEXT:    subl $24, %esp
895; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
896; X86-NEXT:    subl $12, %esp
897; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
898; X86-NEXT:    pushl {{[0-9]+}}(%esp)
899; X86-NEXT:    pushl {{[0-9]+}}(%esp)
900; X86-NEXT:    pushl {{[0-9]+}}(%esp)
901; X86-NEXT:    pushl {{[0-9]+}}(%esp)
902; X86-NEXT:    pushl {{[0-9]+}}(%esp)
903; X86-NEXT:    pushl {{[0-9]+}}(%esp)
904; X86-NEXT:    pushl {{[0-9]+}}(%esp)
905; X86-NEXT:    pushl {{[0-9]+}}(%esp)
906; X86-NEXT:    pushl {{[0-9]+}}(%esp)
907; X86-NEXT:    pushl {{[0-9]+}}(%esp)
908; X86-NEXT:    pushl {{[0-9]+}}(%esp)
909; X86-NEXT:    pushl {{[0-9]+}}(%esp)
910; X86-NEXT:    pushl %eax
911; X86-NEXT:    calll fmal
912; X86-NEXT:    addl $60, %esp
913; X86-NEXT:    movaps (%esp), %xmm0
914; X86-NEXT:    movaps %xmm0, (%esi)
915; X86-NEXT:    movl %esi, %eax
916; X86-NEXT:    addl $24, %esp
917; X86-NEXT:    popl %esi
918; X86-NEXT:    retl $4
919entry:
920  %call = call fp128 @llvm.fma.f128(fp128 %a, fp128 %b, fp128 %c)
921  ret fp128 %call
922}
923declare fp128 @llvm.fma.f128(fp128, fp128, fp128)
924