| 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+0x4] |
| 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+0x8],0x7b |
| 37 ; CHECK: mov dword ptr [esp + 16] | 34 ; CHECK: mov DWORD PTR [esp+0x10] |
| 38 ; CHECK: mov dword ptr [esp + 12] | 35 ; CHECK: mov DWORD PTR [esp+0xc] |
| 39 ; CHECK: call ignore64BitArgNoInline | 36 ; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
| 40 ; CHECK: sub esp | 37 ; CHECK: sub esp |
| 41 ; CHECK: mov dword ptr [esp + 4] | 38 ; CHECK: mov DWORD PTR [esp+0x4] |
| 42 ; CHECK: mov dword ptr [esp] | 39 ; CHECK: mov DWORD PTR [esp] |
| 43 ; CHECK: mov dword ptr [esp + 8], 123 | 40 ; CHECK: mov DWORD PTR [esp+0x8],0x7b |
| 44 ; CHECK: mov dword ptr [esp + 16] | 41 ; CHECK: mov DWORD PTR [esp+0x10] |
| 45 ; CHECK: mov dword ptr [esp + 12] | 42 ; CHECK: mov DWORD PTR [esp+0xc] |
| 46 ; CHECK: call ignore64BitArgNoInline | 43 ; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
| 47 ; CHECK: sub esp | 44 ; CHECK: sub esp |
| 48 ; CHECK: mov dword ptr [esp + 4] | 45 ; CHECK: mov DWORD PTR [esp+0x4] |
| 49 ; CHECK: mov dword ptr [esp] | 46 ; CHECK: mov DWORD PTR [esp] |
| 50 ; CHECK: mov dword ptr [esp + 8], 123 | 47 ; CHECK: mov DWORD PTR [esp+0x8],0x7b |
| 51 ; CHECK: mov dword ptr [esp + 16] | 48 ; CHECK: mov DWORD PTR [esp+0x10] |
| 52 ; CHECK: mov dword ptr [esp + 12] | 49 ; CHECK: mov DWORD PTR [esp+0xc] |
| 53 ; CHECK: call ignore64BitArgNoInline | 50 ; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
| 54 ; | 51 ; |
| 55 ; OPTM1-LABEL: pass64BitArg | 52 ; OPTM1-LABEL: pass64BitArg |
| 56 ; OPTM1: sub esp | 53 ; OPTM1: sub esp |
| 57 ; OPTM1: mov dword ptr [esp + 4] | 54 ; OPTM1: mov DWORD PTR [esp+0x4] |
| 58 ; OPTM1: mov dword ptr [esp] | 55 ; OPTM1: mov DWORD PTR [esp] |
| 59 ; OPTM1: mov dword ptr [esp + 8], 123 | 56 ; OPTM1: mov DWORD PTR [esp+0x8],0x7b |
| 60 ; OPTM1: mov dword ptr [esp + 16] | 57 ; OPTM1: mov DWORD PTR [esp+0x10] |
| 61 ; OPTM1: mov dword ptr [esp + 12] | 58 ; OPTM1: mov DWORD PTR [esp+0xc] |
| 62 ; OPTM1: call ignore64BitArgNoInline | 59 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
| 63 ; OPTM1: sub esp | 60 ; OPTM1: sub esp |
| 64 ; OPTM1: mov dword ptr [esp + 4] | 61 ; OPTM1: mov DWORD PTR [esp+0x4] |
| 65 ; OPTM1: mov dword ptr [esp] | 62 ; OPTM1: mov DWORD PTR [esp] |
| 66 ; OPTM1: mov dword ptr [esp + 8], 123 | 63 ; OPTM1: mov DWORD PTR [esp+0x8],0x7b |
| 67 ; OPTM1: mov dword ptr [esp + 16] | 64 ; OPTM1: mov DWORD PTR [esp+0x10] |
| 68 ; OPTM1: mov dword ptr [esp + 12] | 65 ; OPTM1: mov DWORD PTR [esp+0xc] |
| 69 ; OPTM1: call ignore64BitArgNoInline | 66 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
| 70 ; OPTM1: sub esp | 67 ; OPTM1: sub esp |
| 71 ; OPTM1: mov dword ptr [esp + 4] | 68 ; OPTM1: mov DWORD PTR [esp+0x4] |
| 72 ; OPTM1: mov dword ptr [esp] | 69 ; OPTM1: mov DWORD PTR [esp] |
| 73 ; OPTM1: mov dword ptr [esp + 8], 123 | 70 ; OPTM1: mov DWORD PTR [esp+0x8],0x7b |
| 74 ; OPTM1: mov dword ptr [esp + 16] | 71 ; OPTM1: mov DWORD PTR [esp+0x10] |
| 75 ; OPTM1: mov dword ptr [esp + 12] | 72 ; OPTM1: mov DWORD PTR [esp+0xc] |
| 76 ; OPTM1: call ignore64BitArgNoInline | 73 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
| 77 | 74 |
| 78 declare i32 @ignore64BitArgNoInline(i64, i32, i64) | 75 declare i32 @ignore64BitArgNoInline(i64, i32, i64) |
| 79 | 76 |
| 80 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { | 77 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { |
| 81 entry: | 78 entry: |
| 82 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 -240105309230672
5256) | 79 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 -240105309230672
5256) |
| 83 ret i32 %call | 80 ret i32 %call |
| 84 } | 81 } |
| 85 ; CHECK-LABEL: pass64BitConstArg | 82 ; CHECK-LABEL: pass64BitConstArg |
| 86 ; CHECK: sub esp | 83 ; CHECK: sub esp |
| 87 ; CHECK: mov dword ptr [esp + 4] | 84 ; CHECK: mov DWORD PTR [esp+0x4] |
| 88 ; CHECK-NEXT: mov dword ptr [esp] | 85 ; CHECK-NEXT: mov DWORD PTR [esp] |
| 89 ; CHECK-NEXT: mov dword ptr [esp + 8], 123 | 86 ; CHECK-NEXT: mov DWORD PTR [esp+0x8],0x7b |
| 90 ; Bundle padding might be added (so not using -NEXT). | 87 ; Bundle padding might be added (so not using -NEXT). |
| 91 ; CHECK: mov dword ptr [esp + 16], 3735928559 | 88 ; CHECK: mov DWORD PTR [esp+0x10],0xdeadbeef |
| 92 ; CHECK-NEXT: mov dword ptr [esp + 12], 305419896 | 89 ; CHECK-NEXT: mov DWORD PTR [esp+0xc],0x12345678 |
| 93 ; Bundle padding will push the call down. | 90 ; Bundle padding will push the call down. |
| 94 ; CHECK-NOT: mov | 91 ; CHECK-NOT: mov |
| 95 ; CHECK: call ignore64BitArgNoInline | 92 ; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
| 96 ; | 93 ; |
| 97 ; OPTM1-LABEL: pass64BitConstArg | 94 ; OPTM1-LABEL: pass64BitConstArg |
| 98 ; OPTM1: sub esp | 95 ; OPTM1: sub esp |
| 99 ; OPTM1: mov dword ptr [esp + 4] | 96 ; OPTM1: mov DWORD PTR [esp+0x4] |
| 100 ; OPTM1-NEXT: mov dword ptr [esp] | 97 ; OPTM1-NEXT: mov DWORD PTR [esp] |
| 101 ; OPTM1-NEXT: mov dword ptr [esp + 8], 123 | 98 ; OPTM1-NEXT: mov DWORD PTR [esp+0x8],0x7b |
| 102 ; Bundle padding might be added (so not using -NEXT). | 99 ; Bundle padding might be added (so not using -NEXT). |
| 103 ; OPTM1: mov dword ptr [esp + 16], 3735928559 | 100 ; OPTM1: mov DWORD PTR [esp+0x10],0xdeadbeef |
| 104 ; OPTM1-NEXT: mov dword ptr [esp + 12], 305419896 | 101 ; OPTM1-NEXT: mov DWORD PTR [esp+0xc],0x12345678 |
| 105 ; OPTM1-NOT: mov | 102 ; OPTM1-NOT: mov |
| 106 ; OPTM1: call ignore64BitArgNoInline | 103 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
| 107 | 104 |
| 108 define internal i64 @return64BitArg(i64 %a) { | 105 define internal i64 @return64BitArg(i64 %a) { |
| 109 entry: | 106 entry: |
| 110 ret i64 %a | 107 ret i64 %a |
| 111 } | 108 } |
| 112 ; CHECK-LABEL: return64BitArg | 109 ; CHECK-LABEL: return64BitArg |
| 113 ; CHECK: mov {{.*}}, dword ptr [esp + 4] | 110 ; CHECK: mov {{.*}},DWORD PTR [esp+0x4] |
| 114 ; CHECK: mov {{.*}}, dword ptr [esp + 8] | 111 ; CHECK: mov {{.*}},DWORD PTR [esp+0x8] |
| 115 ; | 112 ; |
| 116 ; OPTM1-LABEL: return64BitArg | 113 ; OPTM1-LABEL: return64BitArg |
| 117 ; OPTM1: mov {{.*}}, dword ptr [esp + 4] | 114 ; OPTM1: mov {{.*}},DWORD PTR [esp+0x4] |
| 118 ; OPTM1: mov {{.*}}, dword ptr [esp + 8] | 115 ; OPTM1: mov {{.*}},DWORD PTR [esp+0x8] |
| 119 | 116 |
| 120 define internal i64 @return64BitConst() { | 117 define internal i64 @return64BitConst() { |
| 121 entry: | 118 entry: |
| 122 ret i64 -2401053092306725256 | 119 ret i64 -2401053092306725256 |
| 123 } | 120 } |
| 124 ; CHECK-LABEL: return64BitConst | 121 ; CHECK-LABEL: return64BitConst |
| 125 ; CHECK: mov eax, 305419896 | 122 ; CHECK: mov eax,0x12345678 |
| 126 ; CHECK: mov edx, 3735928559 | 123 ; CHECK: mov edx,0xdeadbeef |
| 127 ; | 124 ; |
| 128 ; OPTM1-LABEL: return64BitConst | 125 ; OPTM1-LABEL: return64BitConst |
| 129 ; OPTM1: mov eax, 305419896 | 126 ; OPTM1: mov eax,0x12345678 |
| 130 ; OPTM1: mov edx, 3735928559 | 127 ; OPTM1: mov edx,0xdeadbeef |
| 131 | 128 |
| 132 define internal i64 @add64BitSigned(i64 %a, i64 %b) { | 129 define internal i64 @add64BitSigned(i64 %a, i64 %b) { |
| 133 entry: | 130 entry: |
| 134 %add = add i64 %b, %a | 131 %add = add i64 %b, %a |
| 135 ret i64 %add | 132 ret i64 %add |
| 136 } | 133 } |
| 137 ; CHECK-LABEL: add64BitSigned | 134 ; CHECK-LABEL: add64BitSigned |
| 138 ; CHECK: add | 135 ; CHECK: add |
| 139 ; CHECK: adc | 136 ; CHECK: adc |
| 140 ; | 137 ; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 ; OPTM1: mul | 215 ; OPTM1: mul |
| 219 ; OPTM1: add | 216 ; OPTM1: add |
| 220 ; OPTM1: add | 217 ; OPTM1: add |
| 221 | 218 |
| 222 define internal i64 @div64BitSigned(i64 %a, i64 %b) { | 219 define internal i64 @div64BitSigned(i64 %a, i64 %b) { |
| 223 entry: | 220 entry: |
| 224 %div = sdiv i64 %a, %b | 221 %div = sdiv i64 %a, %b |
| 225 ret i64 %div | 222 ret i64 %div |
| 226 } | 223 } |
| 227 ; CHECK-LABEL: div64BitSigned | 224 ; CHECK-LABEL: div64BitSigned |
| 228 ; CHECK: call __divdi3 | 225 ; CHECK: call {{.*}} R_{{.*}} __divdi3 |
| 229 | 226 |
| 230 ; OPTM1-LABEL: div64BitSigned | 227 ; OPTM1-LABEL: div64BitSigned |
| 231 ; OPTM1: call __divdi3 | 228 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 |
| 232 | 229 |
| 233 define internal i64 @div64BitSignedConst(i64 %a) { | 230 define internal i64 @div64BitSignedConst(i64 %a) { |
| 234 entry: | 231 entry: |
| 235 %div = sdiv i64 %a, 12345678901234 | 232 %div = sdiv i64 %a, 12345678901234 |
| 236 ret i64 %div | 233 ret i64 %div |
| 237 } | 234 } |
| 238 ; CHECK-LABEL: div64BitSignedConst | 235 ; CHECK-LABEL: div64BitSignedConst |
| 239 ; CHECK: mov dword ptr [esp + 12], 2874 | 236 ; CHECK: mov DWORD PTR [esp+0xc],0xb3a |
| 240 ; CHECK: mov dword ptr [esp + 8], 1942892530 | 237 ; CHECK: mov DWORD PTR [esp+0x8],0x73ce2ff2 |
| 241 ; CHECK: call __divdi3 | 238 ; CHECK: call {{.*}} R_{{.*}} __divdi3 |
| 242 ; | 239 ; |
| 243 ; OPTM1-LABEL: div64BitSignedConst | 240 ; OPTM1-LABEL: div64BitSignedConst |
| 244 ; OPTM1: mov dword ptr [esp + 12], 2874 | 241 ; OPTM1: mov DWORD PTR [esp+0xc],0xb3a |
| 245 ; OPTM1: mov dword ptr [esp + 8], 1942892530 | 242 ; OPTM1: mov DWORD PTR [esp+0x8],0x73ce2ff2 |
| 246 ; OPTM1: call __divdi3 | 243 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 |
| 247 | 244 |
| 248 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { | 245 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { |
| 249 entry: | 246 entry: |
| 250 %div = udiv i64 %a, %b | 247 %div = udiv i64 %a, %b |
| 251 ret i64 %div | 248 ret i64 %div |
| 252 } | 249 } |
| 253 ; CHECK-LABEL: div64BitUnsigned | 250 ; CHECK-LABEL: div64BitUnsigned |
| 254 ; CHECK: call __udivdi3 | 251 ; CHECK: call {{.*}} R_{{.*}} __udivdi3 |
| 255 ; | 252 ; |
| 256 ; OPTM1-LABEL: div64BitUnsigned | 253 ; OPTM1-LABEL: div64BitUnsigned |
| 257 ; OPTM1: call __udivdi3 | 254 ; OPTM1: call {{.*}} R_{{.*}} __udivdi3 |
| 258 | 255 |
| 259 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { | 256 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { |
| 260 entry: | 257 entry: |
| 261 %rem = srem i64 %a, %b | 258 %rem = srem i64 %a, %b |
| 262 ret i64 %rem | 259 ret i64 %rem |
| 263 } | 260 } |
| 264 ; CHECK-LABEL: rem64BitSigned | 261 ; CHECK-LABEL: rem64BitSigned |
| 265 ; CHECK: call __moddi3 | 262 ; CHECK: call {{.*}} R_{{.*}} __moddi3 |
| 266 ; | 263 ; |
| 267 ; OPTM1-LABEL: rem64BitSigned | 264 ; OPTM1-LABEL: rem64BitSigned |
| 268 ; OPTM1: call __moddi3 | 265 ; OPTM1: call {{.*}} R_{{.*}} __moddi3 |
| 269 | 266 |
| 270 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { | 267 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { |
| 271 entry: | 268 entry: |
| 272 %rem = urem i64 %a, %b | 269 %rem = urem i64 %a, %b |
| 273 ret i64 %rem | 270 ret i64 %rem |
| 274 } | 271 } |
| 275 ; CHECK-LABEL: rem64BitUnsigned | 272 ; CHECK-LABEL: rem64BitUnsigned |
| 276 ; CHECK: call __umoddi3 | 273 ; CHECK: call {{.*}} R_{{.*}} __umoddi3 |
| 277 ; | 274 ; |
| 278 ; OPTM1-LABEL: rem64BitUnsigned | 275 ; OPTM1-LABEL: rem64BitUnsigned |
| 279 ; OPTM1: call __umoddi3 | 276 ; OPTM1: call {{.*}} R_{{.*}} __umoddi3 |
| 280 | 277 |
| 281 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { | 278 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { |
| 282 entry: | 279 entry: |
| 283 %shl = shl i64 %a, %b | 280 %shl = shl i64 %a, %b |
| 284 ret i64 %shl | 281 ret i64 %shl |
| 285 } | 282 } |
| 286 ; CHECK-LABEL: shl64BitSigned | 283 ; CHECK-LABEL: shl64BitSigned |
| 287 ; CHECK: shld | 284 ; CHECK: shld |
| 288 ; CHECK: shl e | 285 ; CHECK: shl e |
| 289 ; CHECK: test {{.*}}, 32 | 286 ; CHECK: test {{.*}},0x20 |
| 290 ; CHECK: je | 287 ; CHECK: je |
| 291 ; | 288 ; |
| 292 ; OPTM1-LABEL: shl64BitSigned | 289 ; OPTM1-LABEL: shl64BitSigned |
| 293 ; OPTM1: shld | 290 ; OPTM1: shld |
| 294 ; OPTM1: shl e | 291 ; OPTM1: shl e |
| 295 ; OPTM1: test {{.*}}, 32 | 292 ; OPTM1: test {{.*}},0x20 |
| 296 ; OPTM1: je | 293 ; OPTM1: je |
| 297 | 294 |
| 298 define internal i32 @shl64BitSignedTrunc(i64 %a, i64 %b) { | 295 define internal i32 @shl64BitSignedTrunc(i64 %a, i64 %b) { |
| 299 entry: | 296 entry: |
| 300 %shl = shl i64 %a, %b | 297 %shl = shl i64 %a, %b |
| 301 %result = trunc i64 %shl to i32 | 298 %result = trunc i64 %shl to i32 |
| 302 ret i32 %result | 299 ret i32 %result |
| 303 } | 300 } |
| 304 ; CHECK-LABEL: shl64BitSignedTrunc | 301 ; CHECK-LABEL: shl64BitSignedTrunc |
| 305 ; CHECK: mov | 302 ; CHECK: mov |
| 306 ; CHECK: shl e | 303 ; CHECK: shl e |
| 307 ; CHECK: test {{.*}}, 32 | 304 ; CHECK: test {{.*}},0x20 |
| 308 ; CHECK: je | 305 ; CHECK: je |
| 309 ; | 306 ; |
| 310 ; OPTM1-LABEL: shl64BitSignedTrunc | 307 ; OPTM1-LABEL: shl64BitSignedTrunc |
| 311 ; OPTM1: shld | 308 ; OPTM1: shld |
| 312 ; OPTM1: shl e | 309 ; OPTM1: shl e |
| 313 ; OPTM1: test {{.*}}, 32 | 310 ; OPTM1: test {{.*}},0x20 |
| 314 ; OPTM1: je | 311 ; OPTM1: je |
| 315 | 312 |
| 316 define internal i64 @shl64BitUnsigned(i64 %a, i64 %b) { | 313 define internal i64 @shl64BitUnsigned(i64 %a, i64 %b) { |
| 317 entry: | 314 entry: |
| 318 %shl = shl i64 %a, %b | 315 %shl = shl i64 %a, %b |
| 319 ret i64 %shl | 316 ret i64 %shl |
| 320 } | 317 } |
| 321 ; CHECK-LABEL: shl64BitUnsigned | 318 ; CHECK-LABEL: shl64BitUnsigned |
| 322 ; CHECK: shld | 319 ; CHECK: shld |
| 323 ; CHECK: shl e | 320 ; CHECK: shl e |
| 324 ; CHECK: test {{.*}}, 32 | 321 ; CHECK: test {{.*}},0x20 |
| 325 ; CHECK: je | 322 ; CHECK: je |
| 326 ; | 323 ; |
| 327 ; OPTM1-LABEL: shl64BitUnsigned | 324 ; OPTM1-LABEL: shl64BitUnsigned |
| 328 ; OPTM1: shld | 325 ; OPTM1: shld |
| 329 ; OPTM1: shl e | 326 ; OPTM1: shl e |
| 330 ; OPTM1: test {{.*}}, 32 | 327 ; OPTM1: test {{.*}},0x20 |
| 331 ; OPTM1: je | 328 ; OPTM1: je |
| 332 | 329 |
| 333 define internal i64 @shr64BitSigned(i64 %a, i64 %b) { | 330 define internal i64 @shr64BitSigned(i64 %a, i64 %b) { |
| 334 entry: | 331 entry: |
| 335 %shr = ashr i64 %a, %b | 332 %shr = ashr i64 %a, %b |
| 336 ret i64 %shr | 333 ret i64 %shr |
| 337 } | 334 } |
| 338 ; CHECK-LABEL: shr64BitSigned | 335 ; CHECK-LABEL: shr64BitSigned |
| 339 ; CHECK: shrd | 336 ; CHECK: shrd |
| 340 ; CHECK: sar | 337 ; CHECK: sar |
| 341 ; CHECK: test {{.*}}, 32 | 338 ; CHECK: test {{.*}},0x20 |
| 342 ; CHECK: je | 339 ; CHECK: je |
| 343 ; CHECK: sar {{.*}}, 31 | 340 ; CHECK: sar {{.*}},0x1f |
| 344 ; | 341 ; |
| 345 ; OPTM1-LABEL: shr64BitSigned | 342 ; OPTM1-LABEL: shr64BitSigned |
| 346 ; OPTM1: shrd | 343 ; OPTM1: shrd |
| 347 ; OPTM1: sar | 344 ; OPTM1: sar |
| 348 ; OPTM1: test {{.*}}, 32 | 345 ; OPTM1: test {{.*}},0x20 |
| 349 ; OPTM1: je | 346 ; OPTM1: je |
| 350 ; OPTM1: sar {{.*}}, 31 | 347 ; OPTM1: sar {{.*}},0x1f |
| 351 | 348 |
| 352 define internal i32 @shr64BitSignedTrunc(i64 %a, i64 %b) { | 349 define internal i32 @shr64BitSignedTrunc(i64 %a, i64 %b) { |
| 353 entry: | 350 entry: |
| 354 %shr = ashr i64 %a, %b | 351 %shr = ashr i64 %a, %b |
| 355 %result = trunc i64 %shr to i32 | 352 %result = trunc i64 %shr to i32 |
| 356 ret i32 %result | 353 ret i32 %result |
| 357 } | 354 } |
| 358 ; CHECK-LABEL: shr64BitSignedTrunc | 355 ; CHECK-LABEL: shr64BitSignedTrunc |
| 359 ; CHECK: shrd | 356 ; CHECK: shrd |
| 360 ; CHECK: sar | 357 ; CHECK: sar |
| 361 ; CHECK: test {{.*}}, 32 | 358 ; CHECK: test {{.*}},0x20 |
| 362 ; CHECK: je | 359 ; CHECK: je |
| 363 ; | 360 ; |
| 364 ; OPTM1-LABEL: shr64BitSignedTrunc | 361 ; OPTM1-LABEL: shr64BitSignedTrunc |
| 365 ; OPTM1: shrd | 362 ; OPTM1: shrd |
| 366 ; OPTM1: sar | 363 ; OPTM1: sar |
| 367 ; OPTM1: test {{.*}}, 32 | 364 ; OPTM1: test {{.*}},0x20 |
| 368 ; OPTM1: je | 365 ; OPTM1: je |
| 369 ; OPTM1: sar {{.*}}, 31 | 366 ; OPTM1: sar {{.*}},0x1f |
| 370 | 367 |
| 371 define internal i64 @shr64BitUnsigned(i64 %a, i64 %b) { | 368 define internal i64 @shr64BitUnsigned(i64 %a, i64 %b) { |
| 372 entry: | 369 entry: |
| 373 %shr = lshr i64 %a, %b | 370 %shr = lshr i64 %a, %b |
| 374 ret i64 %shr | 371 ret i64 %shr |
| 375 } | 372 } |
| 376 ; CHECK-LABEL: shr64BitUnsigned | 373 ; CHECK-LABEL: shr64BitUnsigned |
| 377 ; CHECK: shrd | 374 ; CHECK: shrd |
| 378 ; CHECK: shr | 375 ; CHECK: shr |
| 379 ; CHECK: test {{.*}}, 32 | 376 ; CHECK: test {{.*}},0x20 |
| 380 ; CHECK: je | 377 ; CHECK: je |
| 381 ; | 378 ; |
| 382 ; OPTM1-LABEL: shr64BitUnsigned | 379 ; OPTM1-LABEL: shr64BitUnsigned |
| 383 ; OPTM1: shrd | 380 ; OPTM1: shrd |
| 384 ; OPTM1: shr | 381 ; OPTM1: shr |
| 385 ; OPTM1: test {{.*}}, 32 | 382 ; OPTM1: test {{.*}},0x20 |
| 386 ; OPTM1: je | 383 ; OPTM1: je |
| 387 | 384 |
| 388 define internal i32 @shr64BitUnsignedTrunc(i64 %a, i64 %b) { | 385 define internal i32 @shr64BitUnsignedTrunc(i64 %a, i64 %b) { |
| 389 entry: | 386 entry: |
| 390 %shr = lshr i64 %a, %b | 387 %shr = lshr i64 %a, %b |
| 391 %result = trunc i64 %shr to i32 | 388 %result = trunc i64 %shr to i32 |
| 392 ret i32 %result | 389 ret i32 %result |
| 393 } | 390 } |
| 394 ; CHECK-LABEL: shr64BitUnsignedTrunc | 391 ; CHECK-LABEL: shr64BitUnsignedTrunc |
| 395 ; CHECK: shrd | 392 ; CHECK: shrd |
| 396 ; CHECK: shr | 393 ; CHECK: shr |
| 397 ; CHECK: test {{.*}}, 32 | 394 ; CHECK: test {{.*}},0x20 |
| 398 ; CHECK: je | 395 ; CHECK: je |
| 399 ; | 396 ; |
| 400 ; OPTM1-LABEL: shr64BitUnsignedTrunc | 397 ; OPTM1-LABEL: shr64BitUnsignedTrunc |
| 401 ; OPTM1: shrd | 398 ; OPTM1: shrd |
| 402 ; OPTM1: shr | 399 ; OPTM1: shr |
| 403 ; OPTM1: test {{.*}}, 32 | 400 ; OPTM1: test {{.*}},0x20 |
| 404 ; OPTM1: je | 401 ; OPTM1: je |
| 405 | 402 |
| 406 define internal i64 @and64BitSigned(i64 %a, i64 %b) { | 403 define internal i64 @and64BitSigned(i64 %a, i64 %b) { |
| 407 entry: | 404 entry: |
| 408 %and = and i64 %b, %a | 405 %and = and i64 %b, %a |
| 409 ret i64 %and | 406 ret i64 %and |
| 410 } | 407 } |
| 411 ; CHECK-LABEL: and64BitSigned | 408 ; CHECK-LABEL: and64BitSigned |
| 412 ; CHECK: and | 409 ; CHECK: and |
| 413 ; CHECK: and | 410 ; CHECK: and |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 480 ; OPTM1-LABEL: xor64BitUnsigned | 477 ; OPTM1-LABEL: xor64BitUnsigned |
| 481 ; OPTM1: xor | 478 ; OPTM1: xor |
| 482 ; OPTM1: xor | 479 ; OPTM1: xor |
| 483 | 480 |
| 484 define internal i32 @trunc64To32Signed(i64 %a) { | 481 define internal i32 @trunc64To32Signed(i64 %a) { |
| 485 entry: | 482 entry: |
| 486 %conv = trunc i64 %a to i32 | 483 %conv = trunc i64 %a to i32 |
| 487 ret i32 %conv | 484 ret i32 %conv |
| 488 } | 485 } |
| 489 ; CHECK-LABEL: trunc64To32Signed | 486 ; CHECK-LABEL: trunc64To32Signed |
| 490 ; CHECK: mov eax, dword ptr [esp + 4] | 487 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
| 491 ; | 488 ; |
| 492 ; OPTM1-LABEL: trunc64To32Signed | 489 ; OPTM1-LABEL: trunc64To32Signed |
| 493 ; OPTM1: mov eax, dword ptr [esp + | 490 ; OPTM1: mov eax,DWORD PTR [esp+ |
| 494 | 491 |
| 495 define internal i32 @trunc64To16Signed(i64 %a) { | 492 define internal i32 @trunc64To16Signed(i64 %a) { |
| 496 entry: | 493 entry: |
| 497 %conv = trunc i64 %a to i16 | 494 %conv = trunc i64 %a to i16 |
| 498 %conv.ret_ext = sext i16 %conv to i32 | 495 %conv.ret_ext = sext i16 %conv to i32 |
| 499 ret i32 %conv.ret_ext | 496 ret i32 %conv.ret_ext |
| 500 } | 497 } |
| 501 ; CHECK-LABEL: trunc64To16Signed | 498 ; CHECK-LABEL: trunc64To16Signed |
| 502 ; CHECK: mov eax, dword ptr [esp + 4] | 499 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
| 503 ; CHECK-NEXT: movsx eax, ax | 500 ; CHECK-NEXT: movsx eax,ax |
| 504 ; | 501 ; |
| 505 ; OPTM1-LABEL: trunc64To16Signed | 502 ; OPTM1-LABEL: trunc64To16Signed |
| 506 ; OPTM1: mov eax, dword ptr [esp + | 503 ; OPTM1: mov eax,DWORD PTR [esp+ |
| 507 ; OPTM1: movsx eax, | 504 ; OPTM1: movsx eax, |
| 508 | 505 |
| 509 define internal i32 @trunc64To8Signed(i64 %a) { | 506 define internal i32 @trunc64To8Signed(i64 %a) { |
| 510 entry: | 507 entry: |
| 511 %conv = trunc i64 %a to i8 | 508 %conv = trunc i64 %a to i8 |
| 512 %conv.ret_ext = sext i8 %conv to i32 | 509 %conv.ret_ext = sext i8 %conv to i32 |
| 513 ret i32 %conv.ret_ext | 510 ret i32 %conv.ret_ext |
| 514 } | 511 } |
| 515 ; CHECK-LABEL: trunc64To8Signed | 512 ; CHECK-LABEL: trunc64To8Signed |
| 516 ; CHECK: mov eax, dword ptr [esp + 4] | 513 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
| 517 ; CHECK-NEXT: movsx eax, al | 514 ; CHECK-NEXT: movsx eax,al |
| 518 ; | 515 ; |
| 519 ; OPTM1-LABEL: trunc64To8Signed | 516 ; OPTM1-LABEL: trunc64To8Signed |
| 520 ; OPTM1: mov eax, dword ptr [esp + | 517 ; OPTM1: mov eax,DWORD PTR [esp+ |
| 521 ; OPTM1: movsx eax, | 518 ; OPTM1: movsx eax, |
| 522 | 519 |
| 523 define internal i32 @trunc64To32SignedConst() { | 520 define internal i32 @trunc64To32SignedConst() { |
| 524 entry: | 521 entry: |
| 525 %conv = trunc i64 12345678901234 to i32 | 522 %conv = trunc i64 12345678901234 to i32 |
| 526 ret i32 %conv | 523 ret i32 %conv |
| 527 } | 524 } |
| 528 ; CHECK-LABEL: trunc64To32SignedConst | 525 ; CHECK-LABEL: trunc64To32SignedConst |
| 529 ; CHECK: mov eax, 1942892530 | 526 ; CHECK: mov eax,0x73ce2ff2 |
| 530 ; | 527 ; |
| 531 ; OPTM1-LABEL: trunc64To32SignedConst | 528 ; OPTM1-LABEL: trunc64To32SignedConst |
| 532 ; OPTM1: mov eax, 1942892530 | 529 ; OPTM1: mov eax,0x73ce2ff2 |
| 533 | 530 |
| 534 define internal i32 @trunc64To16SignedConst() { | 531 define internal i32 @trunc64To16SignedConst() { |
| 535 entry: | 532 entry: |
| 536 %conv = trunc i64 12345678901234 to i16 | 533 %conv = trunc i64 12345678901234 to i16 |
| 537 %conv.ret_ext = sext i16 %conv to i32 | 534 %conv.ret_ext = sext i16 %conv to i32 |
| 538 ret i32 %conv.ret_ext | 535 ret i32 %conv.ret_ext |
| 539 } | 536 } |
| 540 ; CHECK-LABEL: trunc64To16SignedConst | 537 ; CHECK-LABEL: trunc64To16SignedConst |
| 541 ; CHECK: mov eax, 1942892530 | 538 ; CHECK: mov eax,0x73ce2ff2 |
| 542 ; CHECK: movsx eax, ax | 539 ; CHECK: movsx eax,ax |
| 543 ; | 540 ; |
| 544 ; OPTM1-LABEL: trunc64To16SignedConst | 541 ; OPTM1-LABEL: trunc64To16SignedConst |
| 545 ; OPTM1: mov eax, 1942892530 | 542 ; OPTM1: mov eax,0x73ce2ff2 |
| 546 ; OPTM1: movsx eax, | 543 ; OPTM1: movsx eax, |
| 547 | 544 |
| 548 define internal i32 @trunc64To32Unsigned(i64 %a) { | 545 define internal i32 @trunc64To32Unsigned(i64 %a) { |
| 549 entry: | 546 entry: |
| 550 %conv = trunc i64 %a to i32 | 547 %conv = trunc i64 %a to i32 |
| 551 ret i32 %conv | 548 ret i32 %conv |
| 552 } | 549 } |
| 553 ; CHECK-LABEL: trunc64To32Unsigned | 550 ; CHECK-LABEL: trunc64To32Unsigned |
| 554 ; CHECK: mov eax, dword ptr [esp + 4] | 551 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
| 555 ; | 552 ; |
| 556 ; OPTM1-LABEL: trunc64To32Unsigned | 553 ; OPTM1-LABEL: trunc64To32Unsigned |
| 557 ; OPTM1: mov eax, dword ptr [esp + | 554 ; OPTM1: mov eax,DWORD PTR [esp+ |
| 558 | 555 |
| 559 define internal i32 @trunc64To16Unsigned(i64 %a) { | 556 define internal i32 @trunc64To16Unsigned(i64 %a) { |
| 560 entry: | 557 entry: |
| 561 %conv = trunc i64 %a to i16 | 558 %conv = trunc i64 %a to i16 |
| 562 %conv.ret_ext = zext i16 %conv to i32 | 559 %conv.ret_ext = zext i16 %conv to i32 |
| 563 ret i32 %conv.ret_ext | 560 ret i32 %conv.ret_ext |
| 564 } | 561 } |
| 565 ; CHECK-LABEL: trunc64To16Unsigned | 562 ; CHECK-LABEL: trunc64To16Unsigned |
| 566 ; CHECK: mov eax, dword ptr [esp + 4] | 563 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
| 567 ; CHECK-NEXT: movzx eax, ax | 564 ; CHECK-NEXT: movzx eax,ax |
| 568 ; | 565 ; |
| 569 ; OPTM1-LABEL: trunc64To16Unsigned | 566 ; OPTM1-LABEL: trunc64To16Unsigned |
| 570 ; OPTM1: mov eax, dword ptr [esp + | 567 ; OPTM1: mov eax,DWORD PTR [esp+ |
| 571 ; OPTM1: movzx eax, | 568 ; OPTM1: movzx eax, |
| 572 | 569 |
| 573 define internal i32 @trunc64To8Unsigned(i64 %a) { | 570 define internal i32 @trunc64To8Unsigned(i64 %a) { |
| 574 entry: | 571 entry: |
| 575 %conv = trunc i64 %a to i8 | 572 %conv = trunc i64 %a to i8 |
| 576 %conv.ret_ext = zext i8 %conv to i32 | 573 %conv.ret_ext = zext i8 %conv to i32 |
| 577 ret i32 %conv.ret_ext | 574 ret i32 %conv.ret_ext |
| 578 } | 575 } |
| 579 ; CHECK-LABEL: trunc64To8Unsigned | 576 ; CHECK-LABEL: trunc64To8Unsigned |
| 580 ; CHECK: mov eax, dword ptr [esp + 4] | 577 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
| 581 ; CHECK-NEXT: movzx eax, al | 578 ; CHECK-NEXT: movzx eax,al |
| 582 ; | 579 ; |
| 583 ; OPTM1-LABEL: trunc64To8Unsigned | 580 ; OPTM1-LABEL: trunc64To8Unsigned |
| 584 ; OPTM1: mov eax, dword ptr [esp + | 581 ; OPTM1: mov eax,DWORD PTR [esp+ |
| 585 ; OPTM1: movzx eax, | 582 ; OPTM1: movzx eax, |
| 586 | 583 |
| 587 define internal i32 @trunc64To1(i64 %a) { | 584 define internal i32 @trunc64To1(i64 %a) { |
| 588 entry: | 585 entry: |
| 589 ; %tobool = icmp ne i64 %a, 0 | 586 ; %tobool = icmp ne i64 %a, 0 |
| 590 %tobool = trunc i64 %a to i1 | 587 %tobool = trunc i64 %a to i1 |
| 591 %tobool.ret_ext = zext i1 %tobool to i32 | 588 %tobool.ret_ext = zext i1 %tobool to i32 |
| 592 ret i32 %tobool.ret_ext | 589 ret i32 %tobool.ret_ext |
| 593 } | 590 } |
| 594 ; CHECK-LABEL: trunc64To1 | 591 ; CHECK-LABEL: trunc64To1 |
| 595 ; CHECK: mov eax, dword ptr [esp + 4] | 592 ; CHECK: mov eax,DWORD PTR [esp+0x4] |
| 596 ; CHECK: and eax, 1 | 593 ; CHECK: and eax,0x1 |
| 597 ; CHECK: and eax, 1 | 594 ; CHECK: and eax,0x1 |
| 598 ; | 595 ; |
| 599 ; OPTM1-LABEL: trunc64To1 | 596 ; OPTM1-LABEL: trunc64To1 |
| 600 ; OPTM1: mov eax, dword ptr [esp + | 597 ; OPTM1: mov eax,DWORD PTR [esp+ |
| 601 ; OPTM1: and eax, 1 | 598 ; OPTM1: and eax,0x1 |
| 602 ; OPTM1: and eax, 1 | 599 ; OPTM1: and eax,0x1 |
| 603 | 600 |
| 604 define internal i64 @sext32To64(i32 %a) { | 601 define internal i64 @sext32To64(i32 %a) { |
| 605 entry: | 602 entry: |
| 606 %conv = sext i32 %a to i64 | 603 %conv = sext i32 %a to i64 |
| 607 ret i64 %conv | 604 ret i64 %conv |
| 608 } | 605 } |
| 609 ; CHECK-LABEL: sext32To64 | 606 ; CHECK-LABEL: sext32To64 |
| 610 ; CHECK: mov | 607 ; CHECK: mov |
| 611 ; CHECK: sar {{.*}}, 31 | 608 ; CHECK: sar {{.*}},0x1f |
| 612 ; | 609 ; |
| 613 ; OPTM1-LABEL: sext32To64 | 610 ; OPTM1-LABEL: sext32To64 |
| 614 ; OPTM1: mov | 611 ; OPTM1: mov |
| 615 ; OPTM1: sar {{.*}}, 31 | 612 ; OPTM1: sar {{.*}},0x1f |
| 616 | 613 |
| 617 define internal i64 @sext16To64(i32 %a) { | 614 define internal i64 @sext16To64(i32 %a) { |
| 618 entry: | 615 entry: |
| 619 %a.arg_trunc = trunc i32 %a to i16 | 616 %a.arg_trunc = trunc i32 %a to i16 |
| 620 %conv = sext i16 %a.arg_trunc to i64 | 617 %conv = sext i16 %a.arg_trunc to i64 |
| 621 ret i64 %conv | 618 ret i64 %conv |
| 622 } | 619 } |
| 623 ; CHECK-LABEL: sext16To64 | 620 ; CHECK-LABEL: sext16To64 |
| 624 ; CHECK: movsx | 621 ; CHECK: movsx |
| 625 ; CHECK: sar {{.*}}, 31 | 622 ; CHECK: sar {{.*}},0x1f |
| 626 ; | 623 ; |
| 627 ; OPTM1-LABEL: sext16To64 | 624 ; OPTM1-LABEL: sext16To64 |
| 628 ; OPTM1: movsx | 625 ; OPTM1: movsx |
| 629 ; OPTM1: sar {{.*}}, 31 | 626 ; OPTM1: sar {{.*}},0x1f |
| 630 | 627 |
| 631 define internal i64 @sext8To64(i32 %a) { | 628 define internal i64 @sext8To64(i32 %a) { |
| 632 entry: | 629 entry: |
| 633 %a.arg_trunc = trunc i32 %a to i8 | 630 %a.arg_trunc = trunc i32 %a to i8 |
| 634 %conv = sext i8 %a.arg_trunc to i64 | 631 %conv = sext i8 %a.arg_trunc to i64 |
| 635 ret i64 %conv | 632 ret i64 %conv |
| 636 } | 633 } |
| 637 ; CHECK-LABEL: sext8To64 | 634 ; CHECK-LABEL: sext8To64 |
| 638 ; CHECK: movsx | 635 ; CHECK: movsx |
| 639 ; CHECK: sar {{.*}}, 31 | 636 ; CHECK: sar {{.*}},0x1f |
| 640 ; | 637 ; |
| 641 ; OPTM1-LABEL: sext8To64 | 638 ; OPTM1-LABEL: sext8To64 |
| 642 ; OPTM1: movsx | 639 ; OPTM1: movsx |
| 643 ; OPTM1: sar {{.*}}, 31 | 640 ; OPTM1: sar {{.*}},0x1f |
| 644 | 641 |
| 645 define internal i64 @sext1To64(i32 %a) { | 642 define internal i64 @sext1To64(i32 %a) { |
| 646 entry: | 643 entry: |
| 647 %a.arg_trunc = trunc i32 %a to i1 | 644 %a.arg_trunc = trunc i32 %a to i1 |
| 648 %conv = sext i1 %a.arg_trunc to i64 | 645 %conv = sext i1 %a.arg_trunc to i64 |
| 649 ret i64 %conv | 646 ret i64 %conv |
| 650 } | 647 } |
| 651 ; CHECK-LABEL: sext1To64 | 648 ; CHECK-LABEL: sext1To64 |
| 652 ; CHECK: mov | 649 ; CHECK: mov |
| 653 ; CHECK: shl {{.*}}, 31 | 650 ; CHECK: shl {{.*}},0x1f |
| 654 ; CHECK: sar {{.*}}, 31 | 651 ; CHECK: sar {{.*}},0x1f |
| 655 ; | 652 ; |
| 656 ; OPTM1-LABEL: sext1To64 | 653 ; OPTM1-LABEL: sext1To64 |
| 657 ; OPTM1: mov | 654 ; OPTM1: mov |
| 658 ; OPTM1: shl {{.*}}, 31 | 655 ; OPTM1: shl {{.*}},0x1f |
| 659 ; OPTM1: sar {{.*}}, 31 | 656 ; OPTM1: sar {{.*}},0x1f |
| 660 | 657 |
| 661 define internal i64 @zext32To64(i32 %a) { | 658 define internal i64 @zext32To64(i32 %a) { |
| 662 entry: | 659 entry: |
| 663 %conv = zext i32 %a to i64 | 660 %conv = zext i32 %a to i64 |
| 664 ret i64 %conv | 661 ret i64 %conv |
| 665 } | 662 } |
| 666 ; CHECK-LABEL: zext32To64 | 663 ; CHECK-LABEL: zext32To64 |
| 667 ; CHECK: mov | 664 ; CHECK: mov |
| 668 ; CHECK: mov {{.*}}, 0 | 665 ; CHECK: mov {{.*}},0x0 |
| 669 ; | 666 ; |
| 670 ; OPTM1-LABEL: zext32To64 | 667 ; OPTM1-LABEL: zext32To64 |
| 671 ; OPTM1: mov | 668 ; OPTM1: mov |
| 672 ; OPTM1: mov {{.*}}, 0 | 669 ; OPTM1: mov {{.*}},0x0 |
| 673 | 670 |
| 674 define internal i64 @zext16To64(i32 %a) { | 671 define internal i64 @zext16To64(i32 %a) { |
| 675 entry: | 672 entry: |
| 676 %a.arg_trunc = trunc i32 %a to i16 | 673 %a.arg_trunc = trunc i32 %a to i16 |
| 677 %conv = zext i16 %a.arg_trunc to i64 | 674 %conv = zext i16 %a.arg_trunc to i64 |
| 678 ret i64 %conv | 675 ret i64 %conv |
| 679 } | 676 } |
| 680 ; CHECK-LABEL: zext16To64 | 677 ; CHECK-LABEL: zext16To64 |
| 681 ; CHECK: movzx | 678 ; CHECK: movzx |
| 682 ; CHECK: mov {{.*}}, 0 | 679 ; CHECK: mov {{.*}},0x0 |
| 683 ; | 680 ; |
| 684 ; OPTM1-LABEL: zext16To64 | 681 ; OPTM1-LABEL: zext16To64 |
| 685 ; OPTM1: movzx | 682 ; OPTM1: movzx |
| 686 ; OPTM1: mov {{.*}}, 0 | 683 ; OPTM1: mov {{.*}},0x0 |
| 687 | 684 |
| 688 define internal i64 @zext8To64(i32 %a) { | 685 define internal i64 @zext8To64(i32 %a) { |
| 689 entry: | 686 entry: |
| 690 %a.arg_trunc = trunc i32 %a to i8 | 687 %a.arg_trunc = trunc i32 %a to i8 |
| 691 %conv = zext i8 %a.arg_trunc to i64 | 688 %conv = zext i8 %a.arg_trunc to i64 |
| 692 ret i64 %conv | 689 ret i64 %conv |
| 693 } | 690 } |
| 694 ; CHECK-LABEL: zext8To64 | 691 ; CHECK-LABEL: zext8To64 |
| 695 ; CHECK: movzx | 692 ; CHECK: movzx |
| 696 ; CHECK: mov {{.*}}, 0 | 693 ; CHECK: mov {{.*}},0x0 |
| 697 ; | 694 ; |
| 698 ; OPTM1-LABEL: zext8To64 | 695 ; OPTM1-LABEL: zext8To64 |
| 699 ; OPTM1: movzx | 696 ; OPTM1: movzx |
| 700 ; OPTM1: mov {{.*}}, 0 | 697 ; OPTM1: mov {{.*}},0x0 |
| 701 | 698 |
| 702 define internal i64 @zext1To64(i32 %a) { | 699 define internal i64 @zext1To64(i32 %a) { |
| 703 entry: | 700 entry: |
| 704 %a.arg_trunc = trunc i32 %a to i1 | 701 %a.arg_trunc = trunc i32 %a to i1 |
| 705 %conv = zext i1 %a.arg_trunc to i64 | 702 %conv = zext i1 %a.arg_trunc to i64 |
| 706 ret i64 %conv | 703 ret i64 %conv |
| 707 } | 704 } |
| 708 ; CHECK-LABEL: zext1To64 | 705 ; CHECK-LABEL: zext1To64 |
| 709 ; CHECK: and {{.*}}, 1 | 706 ; CHECK: and {{.*}},0x1 |
| 710 ; CHECK: mov {{.*}}, 0 | 707 ; CHECK: mov {{.*}},0x0 |
| 711 ; | 708 ; |
| 712 ; OPTM1-LABEL: zext1To64 | 709 ; OPTM1-LABEL: zext1To64 |
| 713 ; OPTM1: and {{.*}}, 1 | 710 ; OPTM1: and {{.*}},0x1 |
| 714 ; OPTM1: mov {{.*}}, 0 | 711 ; OPTM1: mov {{.*}},0x0 |
| 715 | 712 |
| 716 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { | 713 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { |
| 717 entry: | 714 entry: |
| 718 %cmp = icmp eq i64 %a, %b | 715 %cmp = icmp eq i64 %a, %b |
| 719 br i1 %cmp, label %if.then, label %if.end | 716 br i1 %cmp, label %if.then, label %if.end |
| 720 | 717 |
| 721 if.then: ; preds = %entry | 718 if.then: ; preds = %entry |
| 722 call void @func() | 719 call void @func() |
| 723 br label %if.end | 720 br label %if.end |
| 724 | 721 |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1135 ; OPTM1: cmp | 1132 ; OPTM1: cmp |
| 1136 ; OPTM1: jbe | 1133 ; OPTM1: jbe |
| 1137 | 1134 |
| 1138 define internal i64 @load64(i32 %a) { | 1135 define internal i64 @load64(i32 %a) { |
| 1139 entry: | 1136 entry: |
| 1140 %__1 = inttoptr i32 %a to i64* | 1137 %__1 = inttoptr i32 %a to i64* |
| 1141 %v0 = load i64* %__1, align 1 | 1138 %v0 = load i64* %__1, align 1 |
| 1142 ret i64 %v0 | 1139 ret i64 %v0 |
| 1143 } | 1140 } |
| 1144 ; CHECK-LABEL: load64 | 1141 ; CHECK-LABEL: load64 |
| 1145 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp + 4] | 1142 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] |
| 1146 ; CHECK-NEXT: mov {{.*}}, dword ptr [e[[REGISTER]]] | 1143 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]] |
| 1147 ; CHECK-NEXT: mov {{.*}}, dword ptr [e[[REGISTER]] + 4] | 1144 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]+0x4] |
| 1148 ; | 1145 ; |
| 1149 ; OPTM1-LABEL: load64 | 1146 ; OPTM1-LABEL: load64 |
| 1150 ; OPTM1: mov e{{..}}, dword ptr [e{{..}}] | 1147 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}] |
| 1151 ; OPTM1: mov e{{..}}, dword ptr [e{{..}} + 4] | 1148 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}+0x4] |
| 1152 | 1149 |
| 1153 define internal void @store64(i32 %a, i64 %value) { | 1150 define internal void @store64(i32 %a, i64 %value) { |
| 1154 entry: | 1151 entry: |
| 1155 %__2 = inttoptr i32 %a to i64* | 1152 %__2 = inttoptr i32 %a to i64* |
| 1156 store i64 %value, i64* %__2, align 1 | 1153 store i64 %value, i64* %__2, align 1 |
| 1157 ret void | 1154 ret void |
| 1158 } | 1155 } |
| 1159 ; CHECK-LABEL: store64 | 1156 ; CHECK-LABEL: store64 |
| 1160 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp + 4] | 1157 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] |
| 1161 ; CHECK: mov dword ptr [e[[REGISTER]] + 4], | 1158 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4], |
| 1162 ; CHECK: mov dword ptr [e[[REGISTER]]], | 1159 ; CHECK: mov DWORD PTR [e[[REGISTER]]], |
| 1163 ; | 1160 ; |
| 1164 ; OPTM1-LABEL: store64 | 1161 ; OPTM1-LABEL: store64 |
| 1165 ; OPTM1: mov dword ptr [e[[REGISTER:[a-z]+]] + 4], | 1162 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4], |
| 1166 ; OPTM1: mov dword ptr [e[[REGISTER]]], | 1163 ; OPTM1: mov DWORD PTR [e[[REGISTER]]], |
| 1167 | 1164 |
| 1168 define internal void @store64Const(i32 %a) { | 1165 define internal void @store64Const(i32 %a) { |
| 1169 entry: | 1166 entry: |
| 1170 %__1 = inttoptr i32 %a to i64* | 1167 %__1 = inttoptr i32 %a to i64* |
| 1171 store i64 -2401053092306725256, i64* %__1, align 1 | 1168 store i64 -2401053092306725256, i64* %__1, align 1 |
| 1172 ret void | 1169 ret void |
| 1173 } | 1170 } |
| 1174 ; CHECK-LABEL: store64Const | 1171 ; CHECK-LABEL: store64Const |
| 1175 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp + 4] | 1172 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4] |
| 1176 ; CHECK: mov dword ptr [e[[REGISTER]] + 4], 3735928559 | 1173 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4],0xdeadbeef |
| 1177 ; CHECK: mov dword ptr [e[[REGISTER]]], 305419896 | 1174 ; CHECK: mov DWORD PTR [e[[REGISTER]]],0x12345678 |
| 1178 ; | 1175 ; |
| 1179 ; OPTM1-LABEL: store64Const | 1176 ; OPTM1-LABEL: store64Const |
| 1180 ; OPTM1: mov dword ptr [e[[REGISTER:[a-z]+]] + 4], 3735928559 | 1177 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4],0xdeadbeef |
| 1181 ; OPTM1: mov dword ptr [e[[REGISTER]]], 305419896 | 1178 ; OPTM1: mov DWORD PTR [e[[REGISTER]]],0x12345678 |
| 1182 | 1179 |
| 1183 define internal i64 @select64VarVar(i64 %a, i64 %b) { | 1180 define internal i64 @select64VarVar(i64 %a, i64 %b) { |
| 1184 entry: | 1181 entry: |
| 1185 %cmp = icmp ult i64 %a, %b | 1182 %cmp = icmp ult i64 %a, %b |
| 1186 %cond = select i1 %cmp, i64 %a, i64 %b | 1183 %cond = select i1 %cmp, i64 %a, i64 %b |
| 1187 ret i64 %cond | 1184 ret i64 %cond |
| 1188 } | 1185 } |
| 1189 ; CHECK-LABEL: select64VarVar | 1186 ; CHECK-LABEL: select64VarVar |
| 1190 ; CHECK: cmp | 1187 ; CHECK: cmp |
| 1191 ; CHECK: jb | 1188 ; CHECK: jb |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1268 if.then2: ; preds = %if.end | 1265 if.then2: ; preds = %if.end |
| 1269 call void @func() | 1266 call void @func() |
| 1270 br label %if.end3 | 1267 br label %if.end3 |
| 1271 | 1268 |
| 1272 if.end3: ; preds = %if.then2, %if.end | 1269 if.end3: ; preds = %if.then2, %if.end |
| 1273 ret void | 1270 ret void |
| 1274 } | 1271 } |
| 1275 ; The following checks are not strictly necessary since one of the RUN | 1272 ; The following checks are not strictly necessary since one of the RUN |
| 1276 ; lines actually runs the output through the assembler. | 1273 ; lines actually runs the output through the assembler. |
| 1277 ; CHECK-LABEL: icmpEq64Imm | 1274 ; CHECK-LABEL: icmpEq64Imm |
| 1278 ; CHECK-NOT: cmp {{[0-9]+}}, | 1275 ; CHECK-NOT: cmp 0x{{[0-9]+}}, |
| 1279 ; OPTM1-LABEL: icmpEq64Imm | 1276 ; OPTM1-LABEL: icmpEq64Imm |
| 1280 ; OPTM1-LABEL-NOT: cmp {{[0-9]+}}, | 1277 ; OPTM1-LABEL-NOT: cmp 0x{{[0-9]+}}, |
| 1281 | 1278 |
| 1282 define internal void @icmpLt64Imm() { | 1279 define internal void @icmpLt64Imm() { |
| 1283 entry: | 1280 entry: |
| 1284 %cmp = icmp ult i64 123, 234 | 1281 %cmp = icmp ult i64 123, 234 |
| 1285 br i1 %cmp, label %if.then, label %if.end | 1282 br i1 %cmp, label %if.then, label %if.end |
| 1286 | 1283 |
| 1287 if.then: ; preds = %entry | 1284 if.then: ; preds = %entry |
| 1288 call void @func() | 1285 call void @func() |
| 1289 br label %if.end | 1286 br label %if.end |
| 1290 | 1287 |
| 1291 if.end: ; preds = %if.then, %entry | 1288 if.end: ; preds = %if.then, %entry |
| 1292 %cmp1 = icmp slt i64 345, 456 | 1289 %cmp1 = icmp slt i64 345, 456 |
| 1293 br i1 %cmp1, label %if.then2, label %if.end3 | 1290 br i1 %cmp1, label %if.then2, label %if.end3 |
| 1294 | 1291 |
| 1295 if.then2: ; preds = %if.end | 1292 if.then2: ; preds = %if.end |
| 1296 call void @func() | 1293 call void @func() |
| 1297 br label %if.end3 | 1294 br label %if.end3 |
| 1298 | 1295 |
| 1299 if.end3: ; preds = %if.then2, %if.end | 1296 if.end3: ; preds = %if.then2, %if.end |
| 1300 ret void | 1297 ret void |
| 1301 } | 1298 } |
| 1302 ; The following checks are not strictly necessary since one of the RUN | 1299 ; The following checks are not strictly necessary since one of the RUN |
| 1303 ; lines actually runs the output through the assembler. | 1300 ; lines actually runs the output through the assembler. |
| 1304 ; CHECK-LABEL: icmpLt64Imm | 1301 ; CHECK-LABEL: icmpLt64Imm |
| 1305 ; CHECK-NOT: cmp {{[0-9]+}}, | 1302 ; CHECK-NOT: cmp 0x{{[0-9]+}}, |
| 1306 ; OPTM1-LABEL: icmpLt64Imm | 1303 ; OPTM1-LABEL: icmpLt64Imm |
| 1307 ; OPTM1-NOT: cmp {{[0-9]+}}, | 1304 ; OPTM1-NOT: cmp 0x{{[0-9]+}}, |
| OLD | NEW |