| OLD | NEW |
| 1 ; This tries to be a comprehensive test of i64 operations, in | 1 ; This tries to be a comprehensive test of i64 operations, in |
| 2 ; particular the patterns for lowering i64 operations into constituent | 2 ; particular the patterns for lowering i64 operations into constituent |
| 3 ; i32 operations on x86-32. | 3 ; i32 operations on x86-32. |
| 4 | 4 |
| 5 ; RUN: %p2i -i %s --args -O2 --verbose none \ | 5 ; RUN: %p2i --assemble --disassemble -i %s --args -O2 --verbose none \ |
| 6 ; RUN: | llvm-mc -triple=i686-none-nacl -filetype=obj \ | 6 ; RUN: | FileCheck %s |
| 7 ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s | 7 ; RUN: %p2i --assemble --disassemble -i %s --args -Om1 --verbose none \ |
| 8 ; RUN: %p2i -i %s --args -Om1 --verbose none \ | |
| 9 ; RUN: | llvm-mc -triple=i686-none-nacl -filetype=obj \ | |
| 10 ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - \ | |
| 11 ; RUN: | FileCheck --check-prefix=OPTM1 %s | 8 ; RUN: | FileCheck --check-prefix=OPTM1 %s |
| 12 | 9 |
| 13 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 10 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
| 14 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 11 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
| 15 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 | 12 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 |
| 16 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 | 13 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 |
| 17 | 14 |
| 18 define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) { | 15 define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) { |
| 19 entry: | 16 entry: |
| 20 ret i32 %b | 17 ret i32 %b |
| 21 } | 18 } |
| 22 | 19 |
| 23 define internal i32 @pass64BitArg(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f
) { | 20 define internal i32 @pass64BitArg(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f
) { |
| 24 entry: | 21 entry: |
| 25 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 %b) | 22 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 %b) |
| 26 %call1 = call i32 @ignore64BitArgNoInline(i64 %c, i32 123, i64 %d) | 23 %call1 = call i32 @ignore64BitArgNoInline(i64 %c, i32 123, i64 %d) |
| 27 %call2 = call i32 @ignore64BitArgNoInline(i64 %e, i32 123, i64 %f) | 24 %call2 = call i32 @ignore64BitArgNoInline(i64 %e, i32 123, i64 %f) |
| 28 %add = add i32 %call1, %call | 25 %add = add i32 %call1, %call |
| 29 %add3 = add i32 %add, %call2 | 26 %add3 = add i32 %add, %call2 |
| 30 ret i32 %add3 | 27 ret i32 %add3 |
| 31 } | 28 } |
| 32 ; CHECK-LABEL: pass64BitArg | 29 ; CHECK-LABEL: pass64BitArg |
| 33 ; CHECK: sub esp | 30 ; CHECK: sub esp |
| 34 ; CHECK: mov dword ptr [esp + 4] | 31 ; CHECK: mov DWORD PTR [esp+4] |
| 35 ; CHECK: mov dword ptr [esp] | 32 ; CHECK: mov DWORD PTR [esp] |
| 36 ; CHECK: mov dword ptr [esp + 8], 123 | 33 ; CHECK: mov DWORD PTR [esp+8],123 |
| 37 ; CHECK: mov dword ptr [esp + 16] | 34 ; CHECK: mov DWORD PTR [esp+16] |
| 38 ; CHECK: mov dword ptr [esp + 12] | 35 ; CHECK: mov DWORD PTR [esp+12] |
| 39 ; CHECK: call ignore64BitArgNoInline | 36 ; CHECK: call |
| 37 ; CHECK-NEXT: R_{{.*}} ignore64BitArgNoInline |
| 40 ; CHECK: sub esp | 38 ; CHECK: sub esp |
| 41 ; CHECK: mov dword ptr [esp + 4] | 39 ; CHECK: mov DWORD PTR [esp+4] |
| 42 ; CHECK: mov dword ptr [esp] | 40 ; CHECK: mov DWORD PTR [esp] |
| 43 ; CHECK: mov dword ptr [esp + 8], 123 | 41 ; CHECK: mov DWORD PTR [esp+8],123 |
| 44 ; CHECK: mov dword ptr [esp + 16] | 42 ; CHECK: mov DWORD PTR [esp+16] |
| 45 ; CHECK: mov dword ptr [esp + 12] | 43 ; CHECK: mov DWORD PTR [esp+12] |
| 46 ; CHECK: call ignore64BitArgNoInline | 44 ; CHECK: call |
| 45 ; CHECK-NEXT: R_{{.*}} ignore64BitArgNoInline |
| 47 ; CHECK: sub esp | 46 ; CHECK: sub esp |
| 48 ; CHECK: mov dword ptr [esp + 4] | 47 ; CHECK: mov DWORD PTR [esp+4] |
| 49 ; CHECK: mov dword ptr [esp] | 48 ; CHECK: mov DWORD PTR [esp] |
| 50 ; CHECK: mov dword ptr [esp + 8], 123 | 49 ; CHECK: mov DWORD PTR [esp+8],123 |
| 51 ; CHECK: mov dword ptr [esp + 16] | 50 ; CHECK: mov DWORD PTR [esp+16] |
| 52 ; CHECK: mov dword ptr [esp + 12] | 51 ; CHECK: mov DWORD PTR [esp+12] |
| 53 ; CHECK: call ignore64BitArgNoInline | 52 ; CHECK: call |
| 53 ; CHECK-NEXT: R_{{.*}} ignore64BitArgNoInline |
| 54 ; | 54 ; |
| 55 ; OPTM1-LABEL: pass64BitArg | 55 ; OPTM1-LABEL: pass64BitArg |
| 56 ; OPTM1: sub esp | 56 ; OPTM1: sub esp |
| 57 ; OPTM1: mov dword ptr [esp + 4] | 57 ; OPTM1: mov DWORD PTR [esp + 4] |
| 58 ; OPTM1: mov dword ptr [esp] | 58 ; OPTM1: mov DWORD PTR [esp] |
| 59 ; OPTM1: mov dword ptr [esp + 8], 123 | 59 ; OPTM1: mov DWORD PTR [esp + 8], 123 |
| 60 ; OPTM1: mov dword ptr [esp + 16] | 60 ; OPTM1: mov DWORD PTR [esp + 16] |
| 61 ; OPTM1: mov dword ptr [esp + 12] | 61 ; OPTM1: mov DWORD PTR [esp + 12] |
| 62 ; OPTM1: call ignore64BitArgNoInline | 62 ; OPTM1: call ignore64BitArgNoInline |
| 63 ; OPTM1: sub esp | 63 ; OPTM1: sub esp |
| 64 ; OPTM1: mov dword ptr [esp + 4] | 64 ; OPTM1: mov DWORD PTR [esp + 4] |
| 65 ; OPTM1: mov dword ptr [esp] | 65 ; OPTM1: mov DWORD PTR [esp] |
| 66 ; OPTM1: mov dword ptr [esp + 8], 123 | 66 ; OPTM1: mov DWORD PTR [esp + 8], 123 |
| 67 ; OPTM1: mov dword ptr [esp + 16] | 67 ; OPTM1: mov DWORD PTR [esp + 16] |
| 68 ; OPTM1: mov dword ptr [esp + 12] | 68 ; OPTM1: mov DWORD PTR [esp + 12] |
| 69 ; OPTM1: call ignore64BitArgNoInline | 69 ; OPTM1: call ignore64BitArgNoInline |
| 70 ; OPTM1: sub esp | 70 ; OPTM1: sub esp |
| 71 ; OPTM1: mov dword ptr [esp + 4] | 71 ; OPTM1: mov DWORD PTR [esp + 4] |
| 72 ; OPTM1: mov dword ptr [esp] | 72 ; OPTM1: mov DWORD PTR [esp] |
| 73 ; OPTM1: mov dword ptr [esp + 8], 123 | 73 ; OPTM1: mov DWORD PTR [esp + 8], 123 |
| 74 ; OPTM1: mov dword ptr [esp + 16] | 74 ; OPTM1: mov DWORD PTR [esp + 16] |
| 75 ; OPTM1: mov dword ptr [esp + 12] | 75 ; OPTM1: mov DWORD PTR [esp + 12] |
| 76 ; OPTM1: call ignore64BitArgNoInline | 76 ; OPTM1: call ignore64BitArgNoInline |
| 77 | 77 |
| 78 declare i32 @ignore64BitArgNoInline(i64, i32, i64) | 78 declare i32 @ignore64BitArgNoInline(i64, i32, i64) |
| 79 | 79 |
| 80 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { | 80 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { |
| 81 entry: | 81 entry: |
| 82 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 -240105309230672
5256) | 82 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 -240105309230672
5256) |
| 83 ret i32 %call | 83 ret i32 %call |
| 84 } | 84 } |
| 85 ; CHECK-LABEL: pass64BitConstArg | 85 ; CHECK-LABEL: pass64BitConstArg |
| 86 ; CHECK: sub esp | 86 ; CHECK: sub esp |
| 87 ; CHECK: mov dword ptr [esp + 4] | 87 ; CHECK: mov DWORD PTR [esp+4] |
| 88 ; CHECK-NEXT: mov dword ptr [esp] | 88 ; CHECK-NEXT: mov DWORD PTR [esp] |
| 89 ; CHECK-NEXT: mov dword ptr [esp + 8], 123 | 89 ; CHECK-NEXT: mov DWORD PTR [esp + 8], 123 |
| 90 ; Bundle padding might be added (so not using -NEXT). | 90 ; Bundle padding might be added (so not using -NEXT). |
| 91 ; CHECK: mov dword ptr [esp + 16], 3735928559 | 91 ; CHECK: mov DWORD PTR [esp+16],3735928559 |
| 92 ; CHECK-NEXT: mov dword ptr [esp + 12], 305419896 | 92 ; CHECK-NEXT: mov DWORD PTR [esp + 12], 305419896 |
| 93 ; Bundle padding will push the call down. | 93 ; Bundle padding will push the call down. |
| 94 ; CHECK-NOT: mov | 94 ; CHECK-NOT: mov |
| 95 ; CHECK: call ignore64BitArgNoInline | 95 ; CHECK: call |
| 96 ; CHECK-NEXT: R_{{.*}} ignore64BitArgNoInline |
| 96 ; | 97 ; |
| 97 ; OPTM1-LABEL: pass64BitConstArg | 98 ; OPTM1-LABEL: pass64BitConstArg |
| 98 ; OPTM1: sub esp | 99 ; OPTM1: sub esp |
| 99 ; OPTM1: mov dword ptr [esp + 4] | 100 ; OPTM1: mov DWORD PTR [esp + 4] |
| 100 ; OPTM1-NEXT: mov dword ptr [esp] | 101 ; OPTM1-NEXT: mov DWORD PTR [esp] |
| 101 ; OPTM1-NEXT: mov dword ptr [esp + 8], 123 | 102 ; OPTM1-NEXT: mov DWORD PTR [esp + 8], 123 |
| 102 ; Bundle padding might be added (so not using -NEXT). | 103 ; Bundle padding might be added (so not using -NEXT). |
| 103 ; OPTM1: mov dword ptr [esp + 16], 3735928559 | 104 ; OPTM1: mov DWORD PTR [esp + 16], 3735928559 |
| 104 ; OPTM1-NEXT: mov dword ptr [esp + 12], 305419896 | 105 ; OPTM1-NEXT: mov DWORD PTR [esp + 12], 305419896 |
| 105 ; OPTM1-NOT: mov | 106 ; OPTM1-NOT: mov |
| 106 ; OPTM1: call ignore64BitArgNoInline | 107 ; OPTM1: call ignore64BitArgNoInline |
| 107 | 108 |
| 108 define internal i64 @return64BitArg(i64 %a) { | 109 define internal i64 @return64BitArg(i64 %a) { |
| 109 entry: | 110 entry: |
| 110 ret i64 %a | 111 ret i64 %a |
| 111 } | 112 } |
| 112 ; CHECK-LABEL: return64BitArg | 113 ; CHECK-LABEL: return64BitArg |
| 113 ; CHECK: mov {{.*}}, dword ptr [esp + 4] | 114 ; CHECK: mov {{.*}},DWORD ptr [esp+4] |
| 114 ; CHECK: mov {{.*}}, dword ptr [esp + 8] | 115 ; CHECK: mov {{.*}},DWORD ptr [esp+8] |
| 115 ; | 116 ; |
| 116 ; OPTM1-LABEL: return64BitArg | 117 ; OPTM1-LABEL: return64BitArg |
| 117 ; OPTM1: mov {{.*}}, dword ptr [esp + 4] | 118 ; OPTM1: mov {{.*}}, DWORD PTR [esp + 4] |
| 118 ; OPTM1: mov {{.*}}, dword ptr [esp + 8] | 119 ; OPTM1: mov {{.*}}, DWORD PTR [esp + 8] |
| 119 | 120 |
| 120 define internal i64 @return64BitConst() { | 121 define internal i64 @return64BitConst() { |
| 121 entry: | 122 entry: |
| 122 ret i64 -2401053092306725256 | 123 ret i64 -2401053092306725256 |
| 123 } | 124 } |
| 124 ; CHECK-LABEL: return64BitConst | 125 ; CHECK-LABEL: return64BitConst |
| 125 ; CHECK: mov eax, 305419896 | 126 ; CHECK: mov eax,305419896 |
| 126 ; CHECK: mov edx, 3735928559 | 127 ; CHECK: mov edx,3735928559 |
| 127 ; | 128 ; |
| 128 ; OPTM1-LABEL: return64BitConst | 129 ; OPTM1-LABEL: return64BitConst |
| 129 ; OPTM1: mov eax, 305419896 | 130 ; OPTM1: mov eax, 305419896 |
| 130 ; OPTM1: mov edx, 3735928559 | 131 ; OPTM1: mov edx, 3735928559 |
| 131 | 132 |
| 132 define internal i64 @add64BitSigned(i64 %a, i64 %b) { | 133 define internal i64 @add64BitSigned(i64 %a, i64 %b) { |
| 133 entry: | 134 entry: |
| 134 %add = add i64 %b, %a | 135 %add = add i64 %b, %a |
| 135 ret i64 %add | 136 ret i64 %add |
| 136 } | 137 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 ; OPTM1: mul | 219 ; OPTM1: mul |
| 219 ; OPTM1: add | 220 ; OPTM1: add |
| 220 ; OPTM1: add | 221 ; OPTM1: add |
| 221 | 222 |
| 222 define internal i64 @div64BitSigned(i64 %a, i64 %b) { | 223 define internal i64 @div64BitSigned(i64 %a, i64 %b) { |
| 223 entry: | 224 entry: |
| 224 %div = sdiv i64 %a, %b | 225 %div = sdiv i64 %a, %b |
| 225 ret i64 %div | 226 ret i64 %div |
| 226 } | 227 } |
| 227 ; CHECK-LABEL: div64BitSigned | 228 ; CHECK-LABEL: div64BitSigned |
| 228 ; CHECK: call __divdi3 | 229 ; CHECK: call |
| 230 ; CHECK-NEXT: R_{{.*}} __divdi3 |
| 229 | 231 |
| 230 ; OPTM1-LABEL: div64BitSigned | 232 ; OPTM1-LABEL: div64BitSigned |
| 231 ; OPTM1: call __divdi3 | 233 ; OPTM1: call __divdi3 |
| 232 | 234 |
| 233 define internal i64 @div64BitSignedConst(i64 %a) { | 235 define internal i64 @div64BitSignedConst(i64 %a) { |
| 234 entry: | 236 entry: |
| 235 %div = sdiv i64 %a, 12345678901234 | 237 %div = sdiv i64 %a, 12345678901234 |
| 236 ret i64 %div | 238 ret i64 %div |
| 237 } | 239 } |
| 238 ; CHECK-LABEL: div64BitSignedConst | 240 ; CHECK-LABEL: div64BitSignedConst |
| 239 ; CHECK: mov dword ptr [esp + 12], 2874 | 241 ; CHECK: mov DWORD PTR [esp+12],2874 |
| 240 ; CHECK: mov dword ptr [esp + 8], 1942892530 | 242 ; CHECK: mov DWORD PTR [esp+8],1942892530 |
| 241 ; CHECK: call __divdi3 | 243 ; CHECK: call |
| 244 ; CHECK-NEXT: R_{{.*}} __divdi3 |
| 242 ; | 245 ; |
| 243 ; OPTM1-LABEL: div64BitSignedConst | 246 ; OPTM1-LABEL: div64BitSignedConst |
| 244 ; OPTM1: mov dword ptr [esp + 12], 2874 | 247 ; OPTM1: mov DWORD PTR [esp + 12], 2874 |
| 245 ; OPTM1: mov dword ptr [esp + 8], 1942892530 | 248 ; OPTM1: mov DWORD PTR [esp + 8], 1942892530 |
| 246 ; OPTM1: call __divdi3 | 249 ; OPTM1: call __divdi3 |
| 247 | 250 |
| 248 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { | 251 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { |
| 249 entry: | 252 entry: |
| 250 %div = udiv i64 %a, %b | 253 %div = udiv i64 %a, %b |
| 251 ret i64 %div | 254 ret i64 %div |
| 252 } | 255 } |
| 253 ; CHECK-LABEL: div64BitUnsigned | 256 ; CHECK-LABEL: div64BitUnsigned |
| 254 ; CHECK: call __udivdi3 | 257 ; CHECK: call |
| 258 ; CHECK-NEXT: R_{{.*}} __udivdi3 |
| 255 ; | 259 ; |
| 256 ; OPTM1-LABEL: div64BitUnsigned | 260 ; OPTM1-LABEL: div64BitUnsigned |
| 257 ; OPTM1: call __udivdi3 | 261 ; OPTM1: call __udivdi3 |
| 258 | 262 |
| 259 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { | 263 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { |
| 260 entry: | 264 entry: |
| 261 %rem = srem i64 %a, %b | 265 %rem = srem i64 %a, %b |
| 262 ret i64 %rem | 266 ret i64 %rem |
| 263 } | 267 } |
| 264 ; CHECK-LABEL: rem64BitSigned | 268 ; CHECK-LABEL: rem64BitSigned |
| 265 ; CHECK: call __moddi3 | 269 ; CHECK: call |
| 270 ; CHECK-NEXT: R_{{.*}} __moddi3 |
| 266 ; | 271 ; |
| 267 ; OPTM1-LABEL: rem64BitSigned | 272 ; OPTM1-LABEL: rem64BitSigned |
| 268 ; OPTM1: call __moddi3 | 273 ; OPTM1: call __moddi3 |
| 269 | 274 |
| 270 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { | 275 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { |
| 271 entry: | 276 entry: |
| 272 %rem = urem i64 %a, %b | 277 %rem = urem i64 %a, %b |
| 273 ret i64 %rem | 278 ret i64 %rem |
| 274 } | 279 } |
| 275 ; CHECK-LABEL: rem64BitUnsigned | 280 ; CHECK-LABEL: rem64BitUnsigned |
| 276 ; CHECK: call __umoddi3 | 281 ; CHECK: call |
| 282 ; CHECK-NEXT: R_{{.*}} __umoddi3 |
| 277 ; | 283 ; |
| 278 ; OPTM1-LABEL: rem64BitUnsigned | 284 ; OPTM1-LABEL: rem64BitUnsigned |
| 279 ; OPTM1: call __umoddi3 | 285 ; OPTM1: call __umoddi3 |
| 280 | 286 |
| 281 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { | 287 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { |
| 282 entry: | 288 entry: |
| 283 %shl = shl i64 %a, %b | 289 %shl = shl i64 %a, %b |
| 284 ret i64 %shl | 290 ret i64 %shl |
| 285 } | 291 } |
| 286 ; CHECK-LABEL: shl64BitSigned | 292 ; CHECK-LABEL: shl64BitSigned |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 480 ; OPTM1-LABEL: xor64BitUnsigned | 486 ; OPTM1-LABEL: xor64BitUnsigned |
| 481 ; OPTM1: xor | 487 ; OPTM1: xor |
| 482 ; OPTM1: xor | 488 ; OPTM1: xor |
| 483 | 489 |
| 484 define internal i32 @trunc64To32Signed(i64 %a) { | 490 define internal i32 @trunc64To32Signed(i64 %a) { |
| 485 entry: | 491 entry: |
| 486 %conv = trunc i64 %a to i32 | 492 %conv = trunc i64 %a to i32 |
| 487 ret i32 %conv | 493 ret i32 %conv |
| 488 } | 494 } |
| 489 ; CHECK-LABEL: trunc64To32Signed | 495 ; CHECK-LABEL: trunc64To32Signed |
| 490 ; CHECK: mov eax, dword ptr [esp + 4] | 496 ; CHECK: mov eax,DWORD ptr [esp+4] |
| 491 ; | 497 ; |
| 492 ; OPTM1-LABEL: trunc64To32Signed | 498 ; OPTM1-LABEL: trunc64To32Signed |
| 493 ; OPTM1: mov eax, dword ptr [esp + | 499 ; OPTM1: mov eax, DWORD PTR [esp + |
| 494 | 500 |
| 495 define internal i32 @trunc64To16Signed(i64 %a) { | 501 define internal i32 @trunc64To16Signed(i64 %a) { |
| 496 entry: | 502 entry: |
| 497 %conv = trunc i64 %a to i16 | 503 %conv = trunc i64 %a to i16 |
| 498 %conv.ret_ext = sext i16 %conv to i32 | 504 %conv.ret_ext = sext i16 %conv to i32 |
| 499 ret i32 %conv.ret_ext | 505 ret i32 %conv.ret_ext |
| 500 } | 506 } |
| 501 ; CHECK-LABEL: trunc64To16Signed | 507 ; CHECK-LABEL: trunc64To16Signed |
| 502 ; CHECK: mov eax, dword ptr [esp + 4] | 508 ; CHECK: mov eax,DWORD ptr [esp+4] |
| 503 ; CHECK-NEXT: movsx eax, ax | 509 ; CHECK-NEXT: movsx eax, ax |
| 504 ; | 510 ; |
| 505 ; OPTM1-LABEL: trunc64To16Signed | 511 ; OPTM1-LABEL: trunc64To16Signed |
| 506 ; OPTM1: mov eax, dword ptr [esp + | 512 ; OPTM1: mov eax, DWORD PTR [esp + |
| 507 ; OPTM1: movsx eax, | 513 ; OPTM1: movsx eax, |
| 508 | 514 |
| 509 define internal i32 @trunc64To8Signed(i64 %a) { | 515 define internal i32 @trunc64To8Signed(i64 %a) { |
| 510 entry: | 516 entry: |
| 511 %conv = trunc i64 %a to i8 | 517 %conv = trunc i64 %a to i8 |
| 512 %conv.ret_ext = sext i8 %conv to i32 | 518 %conv.ret_ext = sext i8 %conv to i32 |
| 513 ret i32 %conv.ret_ext | 519 ret i32 %conv.ret_ext |
| 514 } | 520 } |
| 515 ; CHECK-LABEL: trunc64To8Signed | 521 ; CHECK-LABEL: trunc64To8Signed |
| 516 ; CHECK: mov eax, dword ptr [esp + 4] | 522 ; CHECK: mov eax,DWORD ptr [esp+4] |
| 517 ; CHECK-NEXT: movsx eax, al | 523 ; CHECK-NEXT: movsx eax, al |
| 518 ; | 524 ; |
| 519 ; OPTM1-LABEL: trunc64To8Signed | 525 ; OPTM1-LABEL: trunc64To8Signed |
| 520 ; OPTM1: mov eax, dword ptr [esp + | 526 ; OPTM1: mov eax, DWORD PTR [esp + |
| 521 ; OPTM1: movsx eax, | 527 ; OPTM1: movsx eax, |
| 522 | 528 |
| 523 define internal i32 @trunc64To32SignedConst() { | 529 define internal i32 @trunc64To32SignedConst() { |
| 524 entry: | 530 entry: |
| 525 %conv = trunc i64 12345678901234 to i32 | 531 %conv = trunc i64 12345678901234 to i32 |
| 526 ret i32 %conv | 532 ret i32 %conv |
| 527 } | 533 } |
| 528 ; CHECK-LABEL: trunc64To32SignedConst | 534 ; CHECK-LABEL: trunc64To32SignedConst |
| 529 ; CHECK: mov eax, 1942892530 | 535 ; CHECK: mov eax,1942892530 |
| 530 ; | 536 ; |
| 531 ; OPTM1-LABEL: trunc64To32SignedConst | 537 ; OPTM1-LABEL: trunc64To32SignedConst |
| 532 ; OPTM1: mov eax, 1942892530 | 538 ; OPTM1: mov eax, 1942892530 |
| 533 | 539 |
| 534 define internal i32 @trunc64To16SignedConst() { | 540 define internal i32 @trunc64To16SignedConst() { |
| 535 entry: | 541 entry: |
| 536 %conv = trunc i64 12345678901234 to i16 | 542 %conv = trunc i64 12345678901234 to i16 |
| 537 %conv.ret_ext = sext i16 %conv to i32 | 543 %conv.ret_ext = sext i16 %conv to i32 |
| 538 ret i32 %conv.ret_ext | 544 ret i32 %conv.ret_ext |
| 539 } | 545 } |
| 540 ; CHECK-LABEL: trunc64To16SignedConst | 546 ; CHECK-LABEL: trunc64To16SignedConst |
| 541 ; CHECK: mov eax, 1942892530 | 547 ; CHECK: mov eax,1942892530 |
| 542 ; CHECK: movsx eax, ax | 548 ; CHECK: movsx eax,ax |
| 543 ; | 549 ; |
| 544 ; OPTM1-LABEL: trunc64To16SignedConst | 550 ; OPTM1-LABEL: trunc64To16SignedConst |
| 545 ; OPTM1: mov eax, 1942892530 | 551 ; OPTM1: mov eax, 1942892530 |
| 546 ; OPTM1: movsx eax, | 552 ; OPTM1: movsx eax, |
| 547 | 553 |
| 548 define internal i32 @trunc64To32Unsigned(i64 %a) { | 554 define internal i32 @trunc64To32Unsigned(i64 %a) { |
| 549 entry: | 555 entry: |
| 550 %conv = trunc i64 %a to i32 | 556 %conv = trunc i64 %a to i32 |
| 551 ret i32 %conv | 557 ret i32 %conv |
| 552 } | 558 } |
| 553 ; CHECK-LABEL: trunc64To32Unsigned | 559 ; CHECK-LABEL: trunc64To32Unsigned |
| 554 ; CHECK: mov eax, dword ptr [esp + 4] | 560 ; CHECK: mov eax,DWORD ptr [esp+4] |
| 555 ; | 561 ; |
| 556 ; OPTM1-LABEL: trunc64To32Unsigned | 562 ; OPTM1-LABEL: trunc64To32Unsigned |
| 557 ; OPTM1: mov eax, dword ptr [esp + | 563 ; OPTM1: mov eax, DWORD PTR [esp + |
| 558 | 564 |
| 559 define internal i32 @trunc64To16Unsigned(i64 %a) { | 565 define internal i32 @trunc64To16Unsigned(i64 %a) { |
| 560 entry: | 566 entry: |
| 561 %conv = trunc i64 %a to i16 | 567 %conv = trunc i64 %a to i16 |
| 562 %conv.ret_ext = zext i16 %conv to i32 | 568 %conv.ret_ext = zext i16 %conv to i32 |
| 563 ret i32 %conv.ret_ext | 569 ret i32 %conv.ret_ext |
| 564 } | 570 } |
| 565 ; CHECK-LABEL: trunc64To16Unsigned | 571 ; CHECK-LABEL: trunc64To16Unsigned |
| 566 ; CHECK: mov eax, dword ptr [esp + 4] | 572 ; CHECK: mov eax,DWORD ptr [esp+4] |
| 567 ; CHECK-NEXT: movzx eax, ax | 573 ; CHECK-NEXT: movzx eax, ax |
| 568 ; | 574 ; |
| 569 ; OPTM1-LABEL: trunc64To16Unsigned | 575 ; OPTM1-LABEL: trunc64To16Unsigned |
| 570 ; OPTM1: mov eax, dword ptr [esp + | 576 ; OPTM1: mov eax, DWORD PTR [esp + |
| 571 ; OPTM1: movzx eax, | 577 ; OPTM1: movzx eax, |
| 572 | 578 |
| 573 define internal i32 @trunc64To8Unsigned(i64 %a) { | 579 define internal i32 @trunc64To8Unsigned(i64 %a) { |
| 574 entry: | 580 entry: |
| 575 %conv = trunc i64 %a to i8 | 581 %conv = trunc i64 %a to i8 |
| 576 %conv.ret_ext = zext i8 %conv to i32 | 582 %conv.ret_ext = zext i8 %conv to i32 |
| 577 ret i32 %conv.ret_ext | 583 ret i32 %conv.ret_ext |
| 578 } | 584 } |
| 579 ; CHECK-LABEL: trunc64To8Unsigned | 585 ; CHECK-LABEL: trunc64To8Unsigned |
| 580 ; CHECK: mov eax, dword ptr [esp + 4] | 586 ; CHECK: mov eax,DWORD ptr [esp+4] |
| 581 ; CHECK-NEXT: movzx eax, al | 587 ; CHECK-NEXT: movzx eax, al |
| 582 ; | 588 ; |
| 583 ; OPTM1-LABEL: trunc64To8Unsigned | 589 ; OPTM1-LABEL: trunc64To8Unsigned |
| 584 ; OPTM1: mov eax, dword ptr [esp + | 590 ; OPTM1: mov eax, DWORD PTR [esp + |
| 585 ; OPTM1: movzx eax, | 591 ; OPTM1: movzx eax, |
| 586 | 592 |
| 587 define internal i32 @trunc64To1(i64 %a) { | 593 define internal i32 @trunc64To1(i64 %a) { |
| 588 entry: | 594 entry: |
| 589 ; %tobool = icmp ne i64 %a, 0 | 595 ; %tobool = icmp ne i64 %a, 0 |
| 590 %tobool = trunc i64 %a to i1 | 596 %tobool = trunc i64 %a to i1 |
| 591 %tobool.ret_ext = zext i1 %tobool to i32 | 597 %tobool.ret_ext = zext i1 %tobool to i32 |
| 592 ret i32 %tobool.ret_ext | 598 ret i32 %tobool.ret_ext |
| 593 } | 599 } |
| 594 ; CHECK-LABEL: trunc64To1 | 600 ; CHECK-LABEL: trunc64To1 |
| 595 ; CHECK: mov eax, dword ptr [esp + 4] | 601 ; CHECK: mov eax,DWORD ptr [esp+4] |
| 596 ; CHECK: and eax, 1 | 602 ; CHECK: and eax, 1 |
| 597 ; CHECK: and eax, 1 | 603 ; CHECK: and eax, 1 |
| 598 ; | 604 ; |
| 599 ; OPTM1-LABEL: trunc64To1 | 605 ; OPTM1-LABEL: trunc64To1 |
| 600 ; OPTM1: mov eax, dword ptr [esp + | 606 ; OPTM1: mov eax, DWORD PTR [esp + |
| 601 ; OPTM1: and eax, 1 | 607 ; OPTM1: and eax, 1 |
| 602 ; OPTM1: and eax, 1 | 608 ; OPTM1: and eax, 1 |
| 603 | 609 |
| 604 define internal i64 @sext32To64(i32 %a) { | 610 define internal i64 @sext32To64(i32 %a) { |
| 605 entry: | 611 entry: |
| 606 %conv = sext i32 %a to i64 | 612 %conv = sext i32 %a to i64 |
| 607 ret i64 %conv | 613 ret i64 %conv |
| 608 } | 614 } |
| 609 ; CHECK-LABEL: sext32To64 | 615 ; CHECK-LABEL: sext32To64 |
| 610 ; CHECK: mov | 616 ; CHECK: mov |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 ; OPTM1: shl {{.*}}, 31 | 664 ; OPTM1: shl {{.*}}, 31 |
| 659 ; OPTM1: sar {{.*}}, 31 | 665 ; OPTM1: sar {{.*}}, 31 |
| 660 | 666 |
| 661 define internal i64 @zext32To64(i32 %a) { | 667 define internal i64 @zext32To64(i32 %a) { |
| 662 entry: | 668 entry: |
| 663 %conv = zext i32 %a to i64 | 669 %conv = zext i32 %a to i64 |
| 664 ret i64 %conv | 670 ret i64 %conv |
| 665 } | 671 } |
| 666 ; CHECK-LABEL: zext32To64 | 672 ; CHECK-LABEL: zext32To64 |
| 667 ; CHECK: mov | 673 ; CHECK: mov |
| 668 ; CHECK: mov {{.*}}, 0 | 674 ; CHECK: mov {{.*}},0 |
| 669 ; | 675 ; |
| 670 ; OPTM1-LABEL: zext32To64 | 676 ; OPTM1-LABEL: zext32To64 |
| 671 ; OPTM1: mov | 677 ; OPTM1: mov |
| 672 ; OPTM1: mov {{.*}}, 0 | 678 ; OPTM1: mov {{.*}}, 0 |
| 673 | 679 |
| 674 define internal i64 @zext16To64(i32 %a) { | 680 define internal i64 @zext16To64(i32 %a) { |
| 675 entry: | 681 entry: |
| 676 %a.arg_trunc = trunc i32 %a to i16 | 682 %a.arg_trunc = trunc i32 %a to i16 |
| 677 %conv = zext i16 %a.arg_trunc to i64 | 683 %conv = zext i16 %a.arg_trunc to i64 |
| 678 ret i64 %conv | 684 ret i64 %conv |
| 679 } | 685 } |
| 680 ; CHECK-LABEL: zext16To64 | 686 ; CHECK-LABEL: zext16To64 |
| 681 ; CHECK: movzx | 687 ; CHECK: movzx |
| 682 ; CHECK: mov {{.*}}, 0 | 688 ; CHECK: mov {{.*}},0 |
| 683 ; | 689 ; |
| 684 ; OPTM1-LABEL: zext16To64 | 690 ; OPTM1-LABEL: zext16To64 |
| 685 ; OPTM1: movzx | 691 ; OPTM1: movzx |
| 686 ; OPTM1: mov {{.*}}, 0 | 692 ; OPTM1: mov {{.*}}, 0 |
| 687 | 693 |
| 688 define internal i64 @zext8To64(i32 %a) { | 694 define internal i64 @zext8To64(i32 %a) { |
| 689 entry: | 695 entry: |
| 690 %a.arg_trunc = trunc i32 %a to i8 | 696 %a.arg_trunc = trunc i32 %a to i8 |
| 691 %conv = zext i8 %a.arg_trunc to i64 | 697 %conv = zext i8 %a.arg_trunc to i64 |
| 692 ret i64 %conv | 698 ret i64 %conv |
| 693 } | 699 } |
| 694 ; CHECK-LABEL: zext8To64 | 700 ; CHECK-LABEL: zext8To64 |
| 695 ; CHECK: movzx | 701 ; CHECK: movzx |
| 696 ; CHECK: mov {{.*}}, 0 | 702 ; CHECK: mov {{.*}},0 |
| 697 ; | 703 ; |
| 698 ; OPTM1-LABEL: zext8To64 | 704 ; OPTM1-LABEL: zext8To64 |
| 699 ; OPTM1: movzx | 705 ; OPTM1: movzx |
| 700 ; OPTM1: mov {{.*}}, 0 | 706 ; OPTM1: mov {{.*}}, 0 |
| 701 | 707 |
| 702 define internal i64 @zext1To64(i32 %a) { | 708 define internal i64 @zext1To64(i32 %a) { |
| 703 entry: | 709 entry: |
| 704 %a.arg_trunc = trunc i32 %a to i1 | 710 %a.arg_trunc = trunc i32 %a to i1 |
| 705 %conv = zext i1 %a.arg_trunc to i64 | 711 %conv = zext i1 %a.arg_trunc to i64 |
| 706 ret i64 %conv | 712 ret i64 %conv |
| 707 } | 713 } |
| 708 ; CHECK-LABEL: zext1To64 | 714 ; CHECK-LABEL: zext1To64 |
| 709 ; CHECK: and {{.*}}, 1 | 715 ; CHECK: and {{.*}}, 1 |
| 710 ; CHECK: mov {{.*}}, 0 | 716 ; CHECK: mov {{.*}},0 |
| 711 ; | 717 ; |
| 712 ; OPTM1-LABEL: zext1To64 | 718 ; OPTM1-LABEL: zext1To64 |
| 713 ; OPTM1: and {{.*}}, 1 | 719 ; OPTM1: and {{.*}}, 1 |
| 714 ; OPTM1: mov {{.*}}, 0 | 720 ; OPTM1: mov {{.*}}, 0 |
| 715 | 721 |
| 716 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { | 722 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { |
| 717 entry: | 723 entry: |
| 718 %cmp = icmp eq i64 %a, %b | 724 %cmp = icmp eq i64 %a, %b |
| 719 br i1 %cmp, label %if.then, label %if.end | 725 br i1 %cmp, label %if.then, label %if.end |
| 720 | 726 |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1135 ; OPTM1: cmp | 1141 ; OPTM1: cmp |
| 1136 ; OPTM1: jbe | 1142 ; OPTM1: jbe |
| 1137 | 1143 |
| 1138 define internal i64 @load64(i32 %a) { | 1144 define internal i64 @load64(i32 %a) { |
| 1139 entry: | 1145 entry: |
| 1140 %__1 = inttoptr i32 %a to i64* | 1146 %__1 = inttoptr i32 %a to i64* |
| 1141 %v0 = load i64* %__1, align 1 | 1147 %v0 = load i64* %__1, align 1 |
| 1142 ret i64 %v0 | 1148 ret i64 %v0 |
| 1143 } | 1149 } |
| 1144 ; CHECK-LABEL: load64 | 1150 ; CHECK-LABEL: load64 |
| 1145 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp + 4] | 1151 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD ptr [esp+4] |
| 1146 ; CHECK-NEXT: mov {{.*}}, dword ptr [e[[REGISTER]]] | 1152 ; CHECK-NEXT: mov {{.*}}, DWORD PTR [e[[REGISTER]]] |
| 1147 ; CHECK-NEXT: mov {{.*}}, dword ptr [e[[REGISTER]] + 4] | 1153 ; CHECK-NEXT: mov {{.*}}, DWORD PTR [e[[REGISTER]] + 4] |
| 1148 ; | 1154 ; |
| 1149 ; OPTM1-LABEL: load64 | 1155 ; OPTM1-LABEL: load64 |
| 1150 ; OPTM1: mov e{{..}}, dword ptr [e{{..}}] | 1156 ; OPTM1: mov e{{..}}, DWORD PTR [e{{..}}] |
| 1151 ; OPTM1: mov e{{..}}, dword ptr [e{{..}} + 4] | 1157 ; OPTM1: mov e{{..}}, DWORD PTR [e{{..}} + 4] |
| 1152 | 1158 |
| 1153 define internal void @store64(i32 %a, i64 %value) { | 1159 define internal void @store64(i32 %a, i64 %value) { |
| 1154 entry: | 1160 entry: |
| 1155 %__2 = inttoptr i32 %a to i64* | 1161 %__2 = inttoptr i32 %a to i64* |
| 1156 store i64 %value, i64* %__2, align 1 | 1162 store i64 %value, i64* %__2, align 1 |
| 1157 ret void | 1163 ret void |
| 1158 } | 1164 } |
| 1159 ; CHECK-LABEL: store64 | 1165 ; CHECK-LABEL: store64 |
| 1160 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp + 4] | 1166 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD ptr [esp+4] |
| 1161 ; CHECK: mov dword ptr [e[[REGISTER]] + 4], | 1167 ; CHECK: mov DWORD PTR [e[[REGISTER]]+4], |
| 1162 ; CHECK: mov dword ptr [e[[REGISTER]]], | 1168 ; CHECK: mov DWORD PTR [e[[REGISTER]]], |
| 1163 ; | 1169 ; |
| 1164 ; OPTM1-LABEL: store64 | 1170 ; OPTM1-LABEL: store64 |
| 1165 ; OPTM1: mov dword ptr [e[[REGISTER:[a-z]+]] + 4], | 1171 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]] + 4], |
| 1166 ; OPTM1: mov dword ptr [e[[REGISTER]]], | 1172 ; OPTM1: mov DWORD PTR [e[[REGISTER]]], |
| 1167 | 1173 |
| 1168 define internal void @store64Const(i32 %a) { | 1174 define internal void @store64Const(i32 %a) { |
| 1169 entry: | 1175 entry: |
| 1170 %__1 = inttoptr i32 %a to i64* | 1176 %__1 = inttoptr i32 %a to i64* |
| 1171 store i64 -2401053092306725256, i64* %__1, align 1 | 1177 store i64 -2401053092306725256, i64* %__1, align 1 |
| 1172 ret void | 1178 ret void |
| 1173 } | 1179 } |
| 1174 ; CHECK-LABEL: store64Const | 1180 ; CHECK-LABEL: store64Const |
| 1175 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp + 4] | 1181 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD ptr [esp+4] |
| 1176 ; CHECK: mov dword ptr [e[[REGISTER]] + 4], 3735928559 | 1182 ; CHECK: mov DWORD PTR [e[[REGISTER]]+4],3735928559 |
| 1177 ; CHECK: mov dword ptr [e[[REGISTER]]], 305419896 | 1183 ; CHECK: mov DWORD PTR [e[[REGISTER]]],305419896 |
| 1178 ; | 1184 ; |
| 1179 ; OPTM1-LABEL: store64Const | 1185 ; OPTM1-LABEL: store64Const |
| 1180 ; OPTM1: mov dword ptr [e[[REGISTER:[a-z]+]] + 4], 3735928559 | 1186 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]] + 4], 3735928559 |
| 1181 ; OPTM1: mov dword ptr [e[[REGISTER]]], 305419896 | 1187 ; OPTM1: mov DWORD PTR [e[[REGISTER]]], 305419896 |
| 1182 | 1188 |
| 1183 define internal i64 @select64VarVar(i64 %a, i64 %b) { | 1189 define internal i64 @select64VarVar(i64 %a, i64 %b) { |
| 1184 entry: | 1190 entry: |
| 1185 %cmp = icmp ult i64 %a, %b | 1191 %cmp = icmp ult i64 %a, %b |
| 1186 %cond = select i1 %cmp, i64 %a, i64 %b | 1192 %cond = select i1 %cmp, i64 %a, i64 %b |
| 1187 ret i64 %cond | 1193 ret i64 %cond |
| 1188 } | 1194 } |
| 1189 ; CHECK-LABEL: select64VarVar | 1195 ; CHECK-LABEL: select64VarVar |
| 1190 ; CHECK: cmp | 1196 ; CHECK: cmp |
| 1191 ; CHECK: jb | 1197 ; CHECK: jb |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1298 | 1304 |
| 1299 if.end3: ; preds = %if.then2, %if.end | 1305 if.end3: ; preds = %if.then2, %if.end |
| 1300 ret void | 1306 ret void |
| 1301 } | 1307 } |
| 1302 ; The following checks are not strictly necessary since one of the RUN | 1308 ; The following checks are not strictly necessary since one of the RUN |
| 1303 ; lines actually runs the output through the assembler. | 1309 ; lines actually runs the output through the assembler. |
| 1304 ; CHECK-LABEL: icmpLt64Imm | 1310 ; CHECK-LABEL: icmpLt64Imm |
| 1305 ; CHECK-NOT: cmp {{[0-9]+}}, | 1311 ; CHECK-NOT: cmp {{[0-9]+}}, |
| 1306 ; OPTM1-LABEL: icmpLt64Imm | 1312 ; OPTM1-LABEL: icmpLt64Imm |
| 1307 ; OPTM1-NOT: cmp {{[0-9]+}}, | 1313 ; OPTM1-NOT: cmp {{[0-9]+}}, |
| OLD | NEW |