OLD | NEW |
1 ; This tries to be a comprehensive test of i8 operations. | 1 ; This tries to be a comprehensive test of i8 operations. |
2 | 2 |
3 ; RUN: %p2i -i %s --args -O2 --verbose none \ | 3 ; RUN: %p2i -i %s --args -O2 --verbose none \ |
4 ; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \ | 4 ; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \ |
5 ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s | 5 ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s |
6 ; RUN: %p2i -i %s --args -Om1 --verbose none \ | 6 ; RUN: %p2i -i %s --args -Om1 --verbose none \ |
7 ; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \ | 7 ; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \ |
8 ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s | 8 ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s |
9 ; RUN: %p2i -i %s --args --verbose none | FileCheck --check-prefix=ERRORS %s | 9 ; RUN: %p2i -i %s --args --verbose none | FileCheck --check-prefix=ERRORS %s |
10 ; RUN: %p2i -i %s --insts | %szdiff %s | FileCheck --check-prefix=DUMP %s | |
11 | 10 |
12 define internal i32 @add8Bit(i32 %a, i32 %b) { | 11 define internal i32 @add8Bit(i32 %a, i32 %b) { |
13 entry: | 12 entry: |
14 %a_8 = trunc i32 %a to i8 | 13 %a_8 = trunc i32 %a to i8 |
15 %b_8 = trunc i32 %b to i8 | 14 %b_8 = trunc i32 %b to i8 |
16 %add = add i8 %b_8, %a_8 | 15 %add = add i8 %b_8, %a_8 |
17 %ret = zext i8 %add to i32 | 16 %ret = zext i8 %add to i32 |
18 ret i32 %ret | 17 ret i32 %ret |
19 } | 18 } |
20 ; CHECK-LABEL: add8Bit | 19 ; CHECK-LABEL: add8Bit |
21 ; CHECK: add {{[abcd]l}} | 20 ; CHECK: add {{[abcd]l}} |
22 | 21 |
23 define internal i32 @add8BitConst(i32 %a, i32 %b) { | 22 define internal i32 @add8BitConst(i32 %a) { |
24 entry: | 23 entry: |
25 %a_8 = trunc i32 %a to i8 | 24 %a_8 = trunc i32 %a to i8 |
26 %add = add i8 %a_8, 123 | 25 %add = add i8 %a_8, 123 |
27 %ret = zext i8 %add to i32 | 26 %ret = zext i8 %add to i32 |
28 ret i32 %ret | 27 ret i32 %ret |
29 } | 28 } |
30 ; CHECK-LABEL: add8BitConst | 29 ; CHECK-LABEL: add8BitConst |
31 ; CHECK: add {{[abcd]l}} | 30 ; CHECK: add {{[abcd]l}} |
32 | 31 |
33 define internal i32 @sub8Bit(i32 %a, i32 %b) { | 32 define internal i32 @sub8Bit(i32 %a, i32 %b) { |
34 entry: | 33 entry: |
35 %a_8 = trunc i32 %a to i8 | 34 %a_8 = trunc i32 %a to i8 |
36 %b_8 = trunc i32 %b to i8 | 35 %b_8 = trunc i32 %b to i8 |
37 %sub = sub i8 %b_8, %a_8 | 36 %sub = sub i8 %b_8, %a_8 |
38 %ret = zext i8 %sub to i32 | 37 %ret = zext i8 %sub to i32 |
39 ret i32 %ret | 38 ret i32 %ret |
40 } | 39 } |
41 ; CHECK-LABEL: sub8Bit | 40 ; CHECK-LABEL: sub8Bit |
42 ; XCHECK: sub {{[abcd]l}} | 41 ; XCHECK: sub {{[abcd]l}} |
43 | 42 |
44 define internal i32 @sub8BitConst(i32 %a, i32 %b) { | 43 define internal i32 @sub8BitConst(i32 %a) { |
45 entry: | 44 entry: |
46 %a_8 = trunc i32 %a to i8 | 45 %a_8 = trunc i32 %a to i8 |
47 %sub = sub i8 %a_8, 123 | 46 %sub = sub i8 %a_8, 123 |
48 %ret = zext i8 %sub to i32 | 47 %ret = zext i8 %sub to i32 |
49 ret i32 %ret | 48 ret i32 %ret |
50 } | 49 } |
51 ; CHECK-LABEL: sub8BitConst | 50 ; CHECK-LABEL: sub8BitConst |
52 ; XCHECK: sub {{[abcd]l}} | 51 ; XCHECK: sub {{[abcd]l}} |
53 | 52 |
54 define internal i32 @mul8Bit(i32 %a, i32 %b) { | 53 define internal i32 @mul8Bit(i32 %a, i32 %b) { |
55 entry: | 54 entry: |
56 %a_8 = trunc i32 %a to i8 | 55 %a_8 = trunc i32 %a to i8 |
57 %b_8 = trunc i32 %b to i8 | 56 %b_8 = trunc i32 %b to i8 |
58 %mul = mul i8 %b_8, %a_8 | 57 %mul = mul i8 %b_8, %a_8 |
59 %ret = zext i8 %mul to i32 | 58 %ret = zext i8 %mul to i32 |
60 ret i32 %ret | 59 ret i32 %ret |
61 } | 60 } |
62 ; CHECK-LABEL: mul8Bit | 61 ; CHECK-LABEL: mul8Bit |
63 ; CHECK: mul {{[abcd]l|byte ptr}} | 62 ; CHECK: mul {{[abcd]l|byte ptr}} |
64 | 63 |
65 define internal i32 @mul8BitConst(i32 %a, i32 %b) { | 64 define internal i32 @mul8BitConst(i32 %a) { |
66 entry: | 65 entry: |
67 %a_8 = trunc i32 %a to i8 | 66 %a_8 = trunc i32 %a to i8 |
68 %mul = mul i8 %a_8, 56 | 67 %mul = mul i8 %a_8, 56 |
69 %ret = zext i8 %mul to i32 | 68 %ret = zext i8 %mul to i32 |
70 ret i32 %ret | 69 ret i32 %ret |
71 } | 70 } |
72 ; CHECK-LABEL: mul8BitConst | 71 ; CHECK-LABEL: mul8BitConst |
73 ; 8-bit imul only accepts r/m, not imm | 72 ; 8-bit imul only accepts r/m, not imm |
74 ; CHECK: mov {{.*}}, 56 | 73 ; CHECK: mov {{.*}}, 56 |
75 ; CHECK: mul {{[abcd]l|byte ptr}} | 74 ; CHECK: mul {{[abcd]l|byte ptr}} |
76 | 75 |
77 define internal i32 @udiv8Bit(i32 %a, i32 %b) { | 76 define internal i32 @udiv8Bit(i32 %a, i32 %b) { |
78 entry: | 77 entry: |
79 %a_8 = trunc i32 %a to i8 | 78 %a_8 = trunc i32 %a to i8 |
80 %b_8 = trunc i32 %b to i8 | 79 %b_8 = trunc i32 %b to i8 |
81 %udiv = udiv i8 %b_8, %a_8 | 80 %udiv = udiv i8 %b_8, %a_8 |
82 %ret = zext i8 %udiv to i32 | 81 %ret = zext i8 %udiv to i32 |
83 ret i32 %ret | 82 ret i32 %ret |
84 } | 83 } |
85 ; CHECK-LABEL: udiv8Bit | 84 ; CHECK-LABEL: udiv8Bit |
86 ; CHECK: div {{[abcd]l|byte ptr}} | 85 ; CHECK: div {{[abcd]l|byte ptr}} |
87 | 86 |
88 define internal i32 @udiv8BitConst(i32 %a, i32 %b) { | 87 define internal i32 @udiv8BitConst(i32 %a) { |
89 entry: | 88 entry: |
90 %a_8 = trunc i32 %a to i8 | 89 %a_8 = trunc i32 %a to i8 |
91 %udiv = udiv i8 %a_8, 123 | 90 %udiv = udiv i8 %a_8, 123 |
92 %ret = zext i8 %udiv to i32 | 91 %ret = zext i8 %udiv to i32 |
93 ret i32 %ret | 92 ret i32 %ret |
94 } | 93 } |
95 ; CHECK-LABEL: udiv8BitConst | 94 ; CHECK-LABEL: udiv8BitConst |
96 ; CHECK: div {{[abcd]l|byte ptr}} | 95 ; CHECK: div {{[abcd]l|byte ptr}} |
97 | 96 |
98 define internal i32 @urem8Bit(i32 %a, i32 %b) { | 97 define internal i32 @urem8Bit(i32 %a, i32 %b) { |
99 entry: | 98 entry: |
100 %a_8 = trunc i32 %a to i8 | 99 %a_8 = trunc i32 %a to i8 |
101 %b_8 = trunc i32 %b to i8 | 100 %b_8 = trunc i32 %b to i8 |
102 %urem = urem i8 %b_8, %a_8 | 101 %urem = urem i8 %b_8, %a_8 |
103 %ret = zext i8 %urem to i32 | 102 %ret = zext i8 %urem to i32 |
104 ret i32 %ret | 103 ret i32 %ret |
105 } | 104 } |
106 ; CHECK-LABEL: urem8Bit | 105 ; CHECK-LABEL: urem8Bit |
107 ; CHECK: div {{[abcd]l|byte ptr}} | 106 ; CHECK: div {{[abcd]l|byte ptr}} |
108 | 107 |
109 define internal i32 @urem8BitConst(i32 %a, i32 %b) { | 108 define internal i32 @urem8BitConst(i32 %a) { |
110 entry: | 109 entry: |
111 %a_8 = trunc i32 %a to i8 | 110 %a_8 = trunc i32 %a to i8 |
112 %urem = urem i8 %a_8, 123 | 111 %urem = urem i8 %a_8, 123 |
113 %ret = zext i8 %urem to i32 | 112 %ret = zext i8 %urem to i32 |
114 ret i32 %ret | 113 ret i32 %ret |
115 } | 114 } |
116 ; CHECK-LABEL: urem8BitConst | 115 ; CHECK-LABEL: urem8BitConst |
117 ; CHECK: div {{[abcd]l|byte ptr}} | 116 ; CHECK: div {{[abcd]l|byte ptr}} |
118 | 117 |
119 | 118 |
120 define internal i32 @sdiv8Bit(i32 %a, i32 %b) { | 119 define internal i32 @sdiv8Bit(i32 %a, i32 %b) { |
121 entry: | 120 entry: |
122 %a_8 = trunc i32 %a to i8 | 121 %a_8 = trunc i32 %a to i8 |
123 %b_8 = trunc i32 %b to i8 | 122 %b_8 = trunc i32 %b to i8 |
124 %sdiv = sdiv i8 %b_8, %a_8 | 123 %sdiv = sdiv i8 %b_8, %a_8 |
125 %ret = zext i8 %sdiv to i32 | 124 %ret = zext i8 %sdiv to i32 |
126 ret i32 %ret | 125 ret i32 %ret |
127 } | 126 } |
128 ; CHECK-LABEL: sdiv8Bit | 127 ; CHECK-LABEL: sdiv8Bit |
129 ; CHECK: idiv {{[abcd]l|byte ptr}} | 128 ; CHECK: idiv {{[abcd]l|byte ptr}} |
130 | 129 |
131 define internal i32 @sdiv8BitConst(i32 %a, i32 %b) { | 130 define internal i32 @sdiv8BitConst(i32 %a) { |
132 entry: | 131 entry: |
133 %a_8 = trunc i32 %a to i8 | 132 %a_8 = trunc i32 %a to i8 |
134 %sdiv = sdiv i8 %a_8, 123 | 133 %sdiv = sdiv i8 %a_8, 123 |
135 %ret = zext i8 %sdiv to i32 | 134 %ret = zext i8 %sdiv to i32 |
136 ret i32 %ret | 135 ret i32 %ret |
137 } | 136 } |
138 ; CHECK-LABEL: sdiv8BitConst | 137 ; CHECK-LABEL: sdiv8BitConst |
139 ; CHECK: idiv {{[abcd]l|byte ptr}} | 138 ; CHECK: idiv {{[abcd]l|byte ptr}} |
140 | 139 |
141 define internal i32 @srem8Bit(i32 %a, i32 %b) { | 140 define internal i32 @srem8Bit(i32 %a, i32 %b) { |
142 entry: | 141 entry: |
143 %a_8 = trunc i32 %a to i8 | 142 %a_8 = trunc i32 %a to i8 |
144 %b_8 = trunc i32 %b to i8 | 143 %b_8 = trunc i32 %b to i8 |
145 %srem = srem i8 %b_8, %a_8 | 144 %srem = srem i8 %b_8, %a_8 |
146 %ret = zext i8 %srem to i32 | 145 %ret = zext i8 %srem to i32 |
147 ret i32 %ret | 146 ret i32 %ret |
148 } | 147 } |
149 ; CHECK-LABEL: srem8Bit | 148 ; CHECK-LABEL: srem8Bit |
150 ; CHECK: idiv {{[abcd]l|byte ptr}} | 149 ; CHECK: idiv {{[abcd]l|byte ptr}} |
151 | 150 |
152 define internal i32 @srem8BitConst(i32 %a, i32 %b) { | 151 define internal i32 @srem8BitConst(i32 %a) { |
153 entry: | 152 entry: |
154 %a_8 = trunc i32 %a to i8 | 153 %a_8 = trunc i32 %a to i8 |
155 %srem = srem i8 %a_8, 123 | 154 %srem = srem i8 %a_8, 123 |
156 %ret = zext i8 %srem to i32 | 155 %ret = zext i8 %srem to i32 |
157 ret i32 %ret | 156 ret i32 %ret |
158 } | 157 } |
159 ; CHECK-LABEL: srem8BitConst | 158 ; CHECK-LABEL: srem8BitConst |
160 ; CHECK: idiv {{[abcd]l|byte ptr}} | 159 ; CHECK: idiv {{[abcd]l|byte ptr}} |
161 | 160 |
162 define internal i32 @shl8Bit(i32 %a, i32 %b) { | 161 define internal i32 @shl8Bit(i32 %a, i32 %b) { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 define internal i32 @ashr8BitConst(i32 %a, i32 %b) { | 214 define internal i32 @ashr8BitConst(i32 %a, i32 %b) { |
216 entry: | 215 entry: |
217 %a_8 = trunc i32 %a to i8 | 216 %a_8 = trunc i32 %a to i8 |
218 %ashr = ashr i8 %a_8, 6 | 217 %ashr = ashr i8 %a_8, 6 |
219 %ret = zext i8 %ashr to i32 | 218 %ret = zext i8 %ashr to i32 |
220 ret i32 %ret | 219 ret i32 %ret |
221 } | 220 } |
222 ; CHECK-LABEL: ashr8BitConst | 221 ; CHECK-LABEL: ashr8BitConst |
223 ; CHECK: sar {{[abcd]l|byte ptr}}, 6 | 222 ; CHECK: sar {{[abcd]l|byte ptr}}, 6 |
224 | 223 |
| 224 define internal i32 @icmp8Bit(i32 %a, i32 %b) { |
| 225 entry: |
| 226 %a_8 = trunc i32 %a to i8 |
| 227 %b_8 = trunc i32 %b to i8 |
| 228 %icmp = icmp ne i8 %b_8, %a_8 |
| 229 %ret = zext i1 %icmp to i32 |
| 230 ret i32 %ret |
| 231 } |
| 232 ; CHECK-LABEL: icmp8Bit |
| 233 ; CHECK: cmp {{[abcd]l|byte ptr}} |
| 234 |
| 235 define internal i32 @icmp8BitConst(i32 %a) { |
| 236 entry: |
| 237 %a_8 = trunc i32 %a to i8 |
| 238 %icmp = icmp ne i8 %a_8, 123 |
| 239 %ret = zext i1 %icmp to i32 |
| 240 ret i32 %ret |
| 241 } |
| 242 ; CHECK-LABEL: icmp8BitConst |
| 243 ; CHECK: cmp {{[abcd]l|byte ptr}} |
| 244 |
| 245 define internal i32 @icmp8BitConstSwapped(i32 %a) { |
| 246 entry: |
| 247 %a_8 = trunc i32 %a to i8 |
| 248 %icmp = icmp ne i8 123, %a_8 |
| 249 %ret = zext i1 %icmp to i32 |
| 250 ret i32 %ret |
| 251 } |
| 252 ; CHECK-LABEL: icmp8BitConstSwapped |
| 253 ; CHECK: cmp {{[abcd]l|byte ptr}} |
| 254 |
| 255 define internal i32 @icmp8BitMem(i32 %a, i32 %b_iptr) { |
| 256 entry: |
| 257 %a_8 = trunc i32 %a to i8 |
| 258 %bptr = inttoptr i32 %b_iptr to i8* |
| 259 %b_8 = load i8* %bptr, align 1 |
| 260 %icmp = icmp ne i8 %b_8, %a_8 |
| 261 %ret = zext i1 %icmp to i32 |
| 262 ret i32 %ret |
| 263 } |
| 264 ; CHECK-LABEL: icmp8BitMem |
| 265 ; CHECK: cmp {{[abcd]l|byte ptr}} |
| 266 |
| 267 define internal i32 @icmp8BitMemSwapped(i32 %a, i32 %b_iptr) { |
| 268 entry: |
| 269 %a_8 = trunc i32 %a to i8 |
| 270 %bptr = inttoptr i32 %b_iptr to i8* |
| 271 %b_8 = load i8* %bptr, align 1 |
| 272 %icmp = icmp ne i8 %a_8, %b_8 |
| 273 %ret = zext i1 %icmp to i32 |
| 274 ret i32 %ret |
| 275 } |
| 276 ; CHECK-LABEL: icmp8BitMemSwapped |
| 277 ; CHECK: cmp {{[abcd]l|byte ptr}} |
225 | 278 |
226 ; ERRORS-NOT: ICE translation error | 279 ; ERRORS-NOT: ICE translation error |
227 ; DUMP-NOT: SZ | 280 ; DUMP-NOT: SZ |
OLD | NEW |