blob: c8da9ea02518d905f7be252d5a2f30705c615991 [file] [log] [blame]
Dan Gohman36a09472009-09-08 23:54:48 +00001; RUN: llc < %s -march=x86 | grep fldz
2; RUN: llc < %s -march=x86-64 | grep fld1
Chris Lattner03535262008-03-21 05:57:20 +00003
Chris Lattner437544f2011-06-17 06:49:41 +00004%0 = type { x86_fp80, x86_fp80 }
5
Chris Lattner03535262008-03-21 05:57:20 +00006; This is basically this code on x86-64:
7; _Complex long double test() { return 1.0; }
Chris Lattner1afcace2011-07-09 17:41:24 +00008define %0 @test() {
Chris Lattner03535262008-03-21 05:57:20 +00009 %A = fpext double 1.0 to x86_fp80
10 %B = fpext double 0.0 to x86_fp80
Chris Lattner437544f2011-06-17 06:49:41 +000011 %mrv = insertvalue %0 undef, x86_fp80 %A, 0
12 %mrv1 = insertvalue %0 %mrv, x86_fp80 %B, 1
13 ret %0 %mrv1
Chris Lattner03535262008-03-21 05:57:20 +000014}
15
Chris Lattnerae60ddc2008-03-21 06:01:05 +000016
17;_test2:
18; fld1
19; fld %st(0)
20; ret
Chris Lattner1afcace2011-07-09 17:41:24 +000021define %0 @test2() {
Chris Lattnerae60ddc2008-03-21 06:01:05 +000022 %A = fpext double 1.0 to x86_fp80
Chris Lattner437544f2011-06-17 06:49:41 +000023 %mrv = insertvalue %0 undef, x86_fp80 %A, 0
24 %mrv1 = insertvalue %0 %mrv, x86_fp80 %A, 1
25 ret %0 %mrv1
Chris Lattnerae60ddc2008-03-21 06:01:05 +000026}
27
Chris Lattner24e0a542008-03-21 06:38:26 +000028; Uses both values.
29define void @call1(x86_fp80 *%P1, x86_fp80 *%P2) {
Chris Lattner1afcace2011-07-09 17:41:24 +000030 %a = call %0 @test()
31 %b = extractvalue %0 %a, 0
Chris Lattner24e0a542008-03-21 06:38:26 +000032 store x86_fp80 %b, x86_fp80* %P1
33
Chris Lattner1afcace2011-07-09 17:41:24 +000034 %c = extractvalue %0 %a, 1
Chris Lattner24e0a542008-03-21 06:38:26 +000035 store x86_fp80 %c, x86_fp80* %P2
36 ret void
37}
38
39; Uses both values, requires fxch
40define void @call2(x86_fp80 *%P1, x86_fp80 *%P2) {
Chris Lattner1afcace2011-07-09 17:41:24 +000041 %a = call %0 @test()
42 %b = extractvalue %0 %a, 1
Chris Lattner24e0a542008-03-21 06:38:26 +000043 store x86_fp80 %b, x86_fp80* %P1
44
Chris Lattner1afcace2011-07-09 17:41:24 +000045 %c = extractvalue %0 %a, 0
Chris Lattner24e0a542008-03-21 06:38:26 +000046 store x86_fp80 %c, x86_fp80* %P2
47 ret void
48}
49
50; Uses ST(0), ST(1) is dead but must be popped.
51define void @call3(x86_fp80 *%P1, x86_fp80 *%P2) {
Chris Lattner1afcace2011-07-09 17:41:24 +000052 %a = call %0 @test()
53 %b = extractvalue %0 %a, 0
Chris Lattner24e0a542008-03-21 06:38:26 +000054 store x86_fp80 %b, x86_fp80* %P1
55 ret void
56}
57
58; Uses ST(1), ST(0) is dead and must be popped.
59define void @call4(x86_fp80 *%P1, x86_fp80 *%P2) {
Chris Lattner1afcace2011-07-09 17:41:24 +000060 %a = call %0 @test()
Chris Lattner24e0a542008-03-21 06:38:26 +000061
Chris Lattner1afcace2011-07-09 17:41:24 +000062 %c = extractvalue %0 %a, 1
Chris Lattner24e0a542008-03-21 06:38:26 +000063 store x86_fp80 %c, x86_fp80* %P2
64 ret void
65}
66