]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/return-ext.ll
Vendor import of llvm trunk r291274:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / return-ext.ll
1 ; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -fixup-byte-word-insts=0 | \
2 ; RUN:   FileCheck -check-prefix=CHECK -check-prefix=BWOFF %s
3 ; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -fixup-byte-word-insts=1 | \
4 ; RUN:   FileCheck -check-prefix=CHECK -check-prefix=BWON %s
5 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -fixup-byte-word-insts=0 | \
6 ; RUN:   FileCheck -check-prefix=CHECK -check-prefix=BWOFF %s
7 ; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -fixup-byte-word-insts=1 | \
8 ; RUN:   FileCheck -check-prefix=CHECK -check-prefix=BWON %s
9 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -fixup-byte-word-insts=0 | \
10 ; RUN:   FileCheck -check-prefix=DARWIN -check-prefix=DARWIN-BWOFF %s
11 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -fixup-byte-word-insts=1 | \
12 ; RUN:   FileCheck -check-prefix=DARWIN -check-prefix=DARWIN-BWON %s
13
14
15 @x = common global i32 0, align 4
16
17 define zeroext i1 @unsigned_i1() {
18 entry:
19   %0 = load i32, i32* @x
20   %cmp = icmp eq i32 %0, 42
21   ret i1 %cmp
22
23 ; Unsigned i1 return values are not extended.
24 ; CHECK-LABEL: unsigned_i1:
25 ; CHECK:                         cmp
26 ; CHECK-NEXT:  sete
27 ; CHECK-NEXT:  ret
28 }
29
30 define zeroext i8 @unsigned_i8() {
31 entry:
32   %0 = load i32, i32* @x
33   %cmp = icmp eq i32 %0, 42
34   %retval = zext i1 %cmp to i8
35   ret i8 %retval
36
37 ; Unsigned i8 return values are not extended.
38 ; CHECK-LABEL: unsigned_i8:
39 ; CHECK:                         cmp
40 ; CHECK-NEXT:  sete
41 ; CHECK-NEXT:  ret
42
43 ; Except on Darwin, for legacy reasons.
44 ; DARWIN-LABEL: unsigned_i8:
45 ; DARWIN:       xorl
46 ; DARWIN-NEXT:  cmp
47 ; DARWIN-NEXT:  sete
48 ; DARWIN-NEXT:  ret
49 }
50
51 define signext i8 @signed_i8() {
52 entry:
53   %0 = load i32, i32* @x
54   %cmp = icmp eq i32 %0, 42
55   %retval = zext i1 %cmp to i8
56   ret i8 %retval
57
58 ; Signed i8 return values are not extended.
59 ; CHECK-LABEL: signed_i8:
60 ; CHECK:                         cmp
61 ; CHECK-NEXT:  sete
62 ; CHECK-NEXT:  ret
63
64 ; Except on Darwin, for legacy reasons.
65 ; DARWIN-LABEL: signed_i8:
66 ; DARWIN:       xorl
67 ; DARWIN-NEXT:  cmp
68 ; DARWIN-NEXT:  sete
69 ; DARWIN-NEXT:  ret
70 }
71
72 @a = common global i16 0
73 @b = common global i16 0
74 define zeroext i16 @unsigned_i16() {
75 entry:
76   %0 = load i16, i16* @a
77   %1 = load i16, i16* @b
78   %add = add i16 %1, %0
79   ret i16 %add
80
81 ; i16 return values are not extended.
82 ; CHECK-LABEL: unsigned_i16:
83 ; BWOFF:       movw
84 ; BWON:        movzwl
85 ; CHECK-NEXT:  addw
86 ; CHECK-NEXT:  ret
87
88 ; Except on Darwin, for legacy reasons.
89 ; DARWIN-LABEL: unsigned_i16:
90 ; DARWIN-BWOFF: movw
91 ; DARWIN-BWON:  movzwl
92 ; DARWIN-NEXT:  addw
93 ; DARWIN-NEXT:  movzwl
94 ; DARWIN-NEXT:  ret
95 }
96
97
98 define i32 @use_i1() {
99 entry:
100   %0 = call i1 @unsigned_i1();
101   %1 = zext i1 %0 to i32
102   ret i32 %1
103
104 ; The high 24 bits of %eax from a function returning i1 are undefined.
105 ; CHECK-LABEL: use_i1:
106 ; CHECK: call
107 ; CHECK-NEXT: movzbl
108 ; CHECK-NEXT: {{pop|add}}
109 ; CHECK-NEXT: ret
110 }
111
112 define i32 @use_i8() {
113 entry:
114   %0 = call i8 @unsigned_i8();
115   %1 = zext i8 %0 to i32
116   ret i32 %1
117
118 ; The high 24 bits of %eax from a function returning i8 are undefined.
119 ; CHECK-LABEL: use_i8:
120 ; CHECK: call
121 ; CHECK-NEXT: movzbl
122 ; CHECK-NEXT: {{pop|add}}
123 ; CHECK-NEXT: ret
124 }
125
126 define i32 @use_i16() {
127 entry:
128   %0 = call i16 @unsigned_i16();
129   %1 = zext i16 %0 to i32
130   ret i32 %1
131
132 ; The high 16 bits of %eax from a function returning i16 are undefined.
133 ; CHECK-LABEL: use_i16:
134 ; CHECK: call
135 ; CHECK-NEXT: movzwl
136 ; CHECK-NEXT: {{pop|add}}
137 ; CHECK-NEXT: ret
138 }