| 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 |