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 --filetype=obj --disassemble -i %s --args -O2 | FileCheck %s | 3 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 | FileCheck %s |
4 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 | FileCheck %s | 4 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 | FileCheck %s |
5 | 5 |
6 declare void @useInt(i32 %x) | 6 declare void @useInt(i32 %x) |
7 | 7 |
8 define internal i32 @add8Bit(i32 %a, i32 %b) { | 8 define internal i32 @add8Bit(i32 %a, i32 %b) { |
9 entry: | 9 entry: |
10 %a_8 = trunc i32 %a to i8 | 10 %a_8 = trunc i32 %a to i8 |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 %ret = zext i1 %icmp to i32 | 246 %ret = zext i1 %icmp to i32 |
247 ret i32 %ret | 247 ret i32 %ret |
248 } | 248 } |
249 ; CHECK-LABEL: icmp8BitConstSwapped | 249 ; CHECK-LABEL: icmp8BitConstSwapped |
250 ; CHECK: cmp {{[abcd]l|BYTE PTR}} | 250 ; CHECK: cmp {{[abcd]l|BYTE PTR}} |
251 | 251 |
252 define internal i32 @icmp8BitMem(i32 %a, i32 %b_iptr) { | 252 define internal i32 @icmp8BitMem(i32 %a, i32 %b_iptr) { |
253 entry: | 253 entry: |
254 %a_8 = trunc i32 %a to i8 | 254 %a_8 = trunc i32 %a to i8 |
255 %bptr = inttoptr i32 %b_iptr to i8* | 255 %bptr = inttoptr i32 %b_iptr to i8* |
256 %b_8 = load i8* %bptr, align 1 | 256 %b_8 = load i8, i8* %bptr, align 1 |
257 %icmp = icmp ne i8 %b_8, %a_8 | 257 %icmp = icmp ne i8 %b_8, %a_8 |
258 %ret = zext i1 %icmp to i32 | 258 %ret = zext i1 %icmp to i32 |
259 ret i32 %ret | 259 ret i32 %ret |
260 } | 260 } |
261 ; CHECK-LABEL: icmp8BitMem | 261 ; CHECK-LABEL: icmp8BitMem |
262 ; CHECK: cmp {{[abcd]l|BYTE PTR}} | 262 ; CHECK: cmp {{[abcd]l|BYTE PTR}} |
263 | 263 |
264 define internal i32 @icmp8BitMemSwapped(i32 %a, i32 %b_iptr) { | 264 define internal i32 @icmp8BitMemSwapped(i32 %a, i32 %b_iptr) { |
265 entry: | 265 entry: |
266 %a_8 = trunc i32 %a to i8 | 266 %a_8 = trunc i32 %a to i8 |
267 %bptr = inttoptr i32 %b_iptr to i8* | 267 %bptr = inttoptr i32 %b_iptr to i8* |
268 %b_8 = load i8* %bptr, align 1 | 268 %b_8 = load i8, i8* %bptr, align 1 |
269 %icmp = icmp ne i8 %a_8, %b_8 | 269 %icmp = icmp ne i8 %a_8, %b_8 |
270 %ret = zext i1 %icmp to i32 | 270 %ret = zext i1 %icmp to i32 |
271 ret i32 %ret | 271 ret i32 %ret |
272 } | 272 } |
273 ; CHECK-LABEL: icmp8BitMemSwapped | 273 ; CHECK-LABEL: icmp8BitMemSwapped |
274 ; CHECK: cmp {{[abcd]l|BYTE PTR}} | 274 ; CHECK: cmp {{[abcd]l|BYTE PTR}} |
275 | 275 |
276 define internal i32 @selectI8Var(i32 %a, i32 %b) { | 276 define internal i32 @selectI8Var(i32 %a, i32 %b) { |
277 entry: | 277 entry: |
278 %a_8 = trunc i32 %a to i8 | 278 %a_8 = trunc i32 %a to i8 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 ; This assumes there will be some copy from an 8-bit register / stack slot. | 327 ; This assumes there will be some copy from an 8-bit register / stack slot. |
328 ; CHECK-DAG: mov {{.*}},{{[a-d]}}l | 328 ; CHECK-DAG: mov {{.*}},{{[a-d]}}l |
329 ; CHECK-DAG: mov {{.*}},BYTE PTR | 329 ; CHECK-DAG: mov {{.*}},BYTE PTR |
330 ; CHECK-DAG: mov BYTE PTR {{.*}} | 330 ; CHECK-DAG: mov BYTE PTR {{.*}} |
331 | 331 |
332 @global8 = internal global [1 x i8] c"\01", align 4 | 332 @global8 = internal global [1 x i8] c"\01", align 4 |
333 | 333 |
334 define i32 @load_i8(i32 %addr_arg) { | 334 define i32 @load_i8(i32 %addr_arg) { |
335 entry: | 335 entry: |
336 %addr = inttoptr i32 %addr_arg to i8* | 336 %addr = inttoptr i32 %addr_arg to i8* |
337 %ret = load i8* %addr, align 1 | 337 %ret = load i8, i8* %addr, align 1 |
338 %ret2 = sub i8 %ret, 0 | 338 %ret2 = sub i8 %ret, 0 |
339 %ret_ext = zext i8 %ret2 to i32 | 339 %ret_ext = zext i8 %ret2 to i32 |
340 ret i32 %ret_ext | 340 ret i32 %ret_ext |
341 } | 341 } |
342 ; CHECK-LABEL: load_i8 | 342 ; CHECK-LABEL: load_i8 |
343 ; CHECK: mov {{[a-d]l}},BYTE PTR | 343 ; CHECK: mov {{[a-d]l}},BYTE PTR |
344 | 344 |
345 define i32 @load_i8_global(i32 %addr_arg) { | 345 define i32 @load_i8_global(i32 %addr_arg) { |
346 entry: | 346 entry: |
347 %addr = bitcast [1 x i8]* @global8 to i8* | 347 %addr = bitcast [1 x i8]* @global8 to i8* |
348 %ret = load i8* %addr, align 1 | 348 %ret = load i8, i8* %addr, align 1 |
349 %ret2 = sub i8 %ret, 0 | 349 %ret2 = sub i8 %ret, 0 |
350 %ret_ext = zext i8 %ret2 to i32 | 350 %ret_ext = zext i8 %ret2 to i32 |
351 ret i32 %ret_ext | 351 ret i32 %ret_ext |
352 } | 352 } |
353 ; CHECK-LABEL: load_i8_global | 353 ; CHECK-LABEL: load_i8_global |
354 ; CHECK: mov {{[a-d]l}},BYTE PTR | 354 ; CHECK: mov {{[a-d]l}},BYTE PTR |
355 | 355 |
356 define void @store_i8(i32 %addr_arg, i32 %val) { | 356 define void @store_i8(i32 %addr_arg, i32 %val) { |
357 entry: | 357 entry: |
358 %val_trunc = trunc i32 %val to i8 | 358 %val_trunc = trunc i32 %val to i8 |
359 %addr = inttoptr i32 %addr_arg to i8* | 359 %addr = inttoptr i32 %addr_arg to i8* |
360 store i8 %val_trunc, i8* %addr, align 1 | 360 store i8 %val_trunc, i8* %addr, align 1 |
361 ret void | 361 ret void |
362 } | 362 } |
363 ; CHECK-LABEL: store_i8 | 363 ; CHECK-LABEL: store_i8 |
364 ; CHECK: mov BYTE PTR {{.*}},{{[a-d]l}} | 364 ; CHECK: mov BYTE PTR {{.*}},{{[a-d]l}} |
365 | 365 |
366 define void @store_i8_const(i32 %addr_arg) { | 366 define void @store_i8_const(i32 %addr_arg) { |
367 entry: | 367 entry: |
368 %addr = inttoptr i32 %addr_arg to i8* | 368 %addr = inttoptr i32 %addr_arg to i8* |
369 store i8 123, i8* %addr, align 1 | 369 store i8 123, i8* %addr, align 1 |
370 ret void | 370 ret void |
371 } | 371 } |
372 ; CHECK-LABEL: store_i8_const | 372 ; CHECK-LABEL: store_i8_const |
373 ; CHECK: mov BYTE PTR {{.*}},0x7b | 373 ; CHECK: mov BYTE PTR {{.*}},0x7b |
OLD | NEW |