Simon Pilgrim | f907e19 | 2018-07-20 13:58:57 +0000 | [diff] [blame] | 1 | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| 2 | ; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=corei7 -mattr=+sse4.1 | FileCheck %s |
Manman Ren | 5b46282 | 2012-11-27 18:09:26 +0000 | [diff] [blame] | 3 | |
| 4 | ; rdar://12721174 |
| 5 | ; We should not fold movss into pshufd since pshufd expects m128 while movss |
| 6 | ; loads from m32. |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 7 | define void @sample_test(ptr %source, ptr %dest) nounwind { |
Simon Pilgrim | f907e19 | 2018-07-20 13:58:57 +0000 | [diff] [blame] | 8 | ; CHECK-LABEL: sample_test: |
| 9 | ; CHECK: # %bb.0: # %entry |
| 10 | ; CHECK-NEXT: subq $24, %rsp |
| 11 | ; CHECK-NEXT: movq %rdi, {{[0-9]+}}(%rsp) |
| 12 | ; CHECK-NEXT: movq %rsi, {{[0-9]+}}(%rsp) |
Simon Pilgrim | f1200ca | 2023-12-07 14:56:12 +0000 | [diff] [blame] | 13 | ; CHECK-NEXT: movq $0, (%rsp) |
Simon Pilgrim | f907e19 | 2018-07-20 13:58:57 +0000 | [diff] [blame] | 14 | ; CHECK-NEXT: xorps %xmm0, %xmm0 |
Craig Topper | 30837ab | 2019-09-08 19:24:29 +0000 | [diff] [blame] | 15 | ; CHECK-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] |
Simon Pilgrim | f907e19 | 2018-07-20 13:58:57 +0000 | [diff] [blame] | 16 | ; CHECK-NEXT: movlps %xmm0, (%rsp) |
| 17 | ; CHECK-NEXT: movlps %xmm0, (%rsi) |
| 18 | ; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax |
Craig Topper | 35d513c | 2018-10-11 20:36:06 +0000 | [diff] [blame] | 19 | ; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero |
| 20 | ; CHECK-NEXT: movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] |
Roman Lebedev | 0aef747 | 2021-06-11 23:26:17 +0300 | [diff] [blame] | 21 | ; CHECK-NEXT: callq ext@PLT |
Simon Pilgrim | f907e19 | 2018-07-20 13:58:57 +0000 | [diff] [blame] | 22 | ; CHECK-NEXT: addq $24, %rsp |
| 23 | ; CHECK-NEXT: retq |
Manman Ren | 5b46282 | 2012-11-27 18:09:26 +0000 | [diff] [blame] | 24 | entry: |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 25 | %source.addr = alloca ptr, align 8 |
| 26 | %dest.addr = alloca ptr, align 8 |
Manman Ren | 5b46282 | 2012-11-27 18:09:26 +0000 | [diff] [blame] | 27 | %tmp = alloca <2 x float>, align 8 |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 28 | store ptr %source, ptr %source.addr, align 8 |
| 29 | store ptr %dest, ptr %dest.addr, align 8 |
| 30 | store <2 x float> zeroinitializer, ptr %tmp, align 8 |
| 31 | %0 = load ptr, ptr %source.addr, align 8 |
| 32 | %1 = load <4 x float>, ptr %0, align 16 |
Manman Ren | 5b46282 | 2012-11-27 18:09:26 +0000 | [diff] [blame] | 33 | %2 = extractelement <4 x float> %1, i32 0 |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 34 | %3 = load <2 x float>, ptr %tmp, align 8 |
Manman Ren | 5b46282 | 2012-11-27 18:09:26 +0000 | [diff] [blame] | 35 | %4 = insertelement <2 x float> %3, float %2, i32 1 |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 36 | store <2 x float> %4, ptr %tmp, align 8 |
| 37 | %5 = load <2 x float>, ptr %tmp, align 8 |
| 38 | %6 = load ptr, ptr %dest.addr, align 8 |
| 39 | store <2 x float> %5, ptr %6, align 8 |
| 40 | %7 = load ptr, ptr %dest.addr, align 8 |
| 41 | %8 = load <2 x float>, ptr %7, align 8 |
Manman Ren | 5b46282 | 2012-11-27 18:09:26 +0000 | [diff] [blame] | 42 | %vecext = extractelement <2 x float> %8, i32 0 |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 43 | %9 = load ptr, ptr %dest.addr, align 8 |
| 44 | %10 = load <2 x float>, ptr %9, align 8 |
Manman Ren | 5b46282 | 2012-11-27 18:09:26 +0000 | [diff] [blame] | 45 | %vecext4 = extractelement <2 x float> %10, i32 1 |
| 46 | call void @ext(float %vecext, float %vecext4) |
| 47 | ret void |
| 48 | } |
| 49 | declare void @ext(float, float) |