summaryrefslogtreecommitdiff
path: root/test/CodeGen/X86
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-04-20 21:19:10 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-04-20 21:19:10 +0000
commitd99dafe2e4a385dd2a6c76da6d8258deb100657b (patch)
treeba60bf957558bd114f25dbff3d4996b5d7a61c82 /test/CodeGen/X86
parent71d5a2540a98c81f5bcaeb48805e0e2881f530ef (diff)
Notes
Diffstat (limited to 'test/CodeGen/X86')
-rw-r--r--test/CodeGen/X86/GlobalISel/X86-regbankselect.mir28
-rw-r--r--test/CodeGen/X86/GlobalISel/binop.ll (renamed from test/CodeGen/X86/GlobalISel/binop-isel.ll)0
-rw-r--r--test/CodeGen/X86/GlobalISel/legalize-constant.mir (renamed from test/CodeGen/X86/GlobalISel/legalize-const.mir)0
-rw-r--r--test/CodeGen/X86/GlobalISel/legalize-trunc.mir31
-rw-r--r--test/CodeGen/X86/GlobalISel/memop.ll (renamed from test/CodeGen/X86/GlobalISel/memop-isel.ll)0
-rw-r--r--test/CodeGen/X86/GlobalISel/select-add.mir226
-rw-r--r--test/CodeGen/X86/GlobalISel/select-frameIndex.mir (renamed from test/CodeGen/X86/GlobalISel/frameIndex-instructionselect.mir)0
-rw-r--r--test/CodeGen/X86/GlobalISel/select-memop.mir (renamed from test/CodeGen/X86/GlobalISel/x86_64-instructionselect.mir)448
-rw-r--r--test/CodeGen/X86/GlobalISel/select-sub.mir225
-rw-r--r--test/CodeGen/X86/GlobalISel/select-trunc.mir183
-rw-r--r--test/CodeGen/X86/GlobalISel/trunc.ll57
-rw-r--r--test/CodeGen/X86/MergeConsecutiveStores.ll19
-rw-r--r--test/CodeGen/X86/avx-logic.ll36
-rw-r--r--test/CodeGen/X86/avx512-ext.ll8
-rw-r--r--test/CodeGen/X86/avx512-mask-op.ll15
-rw-r--r--test/CodeGen/X86/bswap_tree.ll105
-rw-r--r--test/CodeGen/X86/bswap_tree2.ll150
-rw-r--r--test/CodeGen/X86/combine-or.ll16
-rw-r--r--test/CodeGen/X86/dbg-baseptr.ll75
-rw-r--r--test/CodeGen/X86/extract-store.ll37
-rw-r--r--test/CodeGen/X86/fp128-extract.ll22
-rw-r--r--test/CodeGen/X86/i64-to-float.ll46
-rw-r--r--test/CodeGen/X86/known-signbits-vector.ll28
-rw-r--r--test/CodeGen/X86/madd.ll324
-rw-r--r--test/CodeGen/X86/merge_store.ll31
-rw-r--r--test/CodeGen/X86/sse-schedule.ll2415
-rw-r--r--test/CodeGen/X86/sse2-schedule.ll6039
-rw-r--r--test/CodeGen/X86/tail-merge-after-mbp.ll94
-rw-r--r--test/CodeGen/X86/tail-merge-after-mbp.mir105
-rw-r--r--test/CodeGen/X86/vector-rotate-128.ll11
-rw-r--r--test/CodeGen/X86/vector-rotate-256.ll17
-rw-r--r--test/CodeGen/X86/x86-16.ll9
32 files changed, 10150 insertions, 650 deletions
diff --git a/test/CodeGen/X86/GlobalISel/X86-regbankselect.mir b/test/CodeGen/X86/GlobalISel/X86-regbankselect.mir
index c4e5fb2d05fc..8e04239041a8 100644
--- a/test/CodeGen/X86/GlobalISel/X86-regbankselect.mir
+++ b/test/CodeGen/X86/GlobalISel/X86-regbankselect.mir
@@ -106,6 +106,10 @@
ret void
}
+ define void @trunc_check() {
+ ret void
+ }
+
...
---
name: test_add_i8
@@ -632,3 +636,27 @@ body: |
RET 0
...
+---
+name: trunc_check
+alignment: 4
+legalized: true
+# CHECK-LABEL: name: trunc_check
+# CHECK: registers:
+# CHECK-NEXT: - { id: 0, class: gpr }
+# CHECK-NEXT: - { id: 1, class: gpr }
+# CHECK-NEXT: - { id: 2, class: gpr }
+# CHECK-NEXT: - { id: 3, class: gpr }
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+ - { id: 2, class: _ }
+ - { id: 3, class: _ }
+body: |
+ bb.0 (%ir-block.0):
+ %0(s32) = IMPLICIT_DEF
+ %1(s1) = G_TRUNC %0(s32)
+ %2(s8) = G_TRUNC %0(s32)
+ %3(s16) = G_TRUNC %0(s32)
+ RET 0
+
+...
diff --git a/test/CodeGen/X86/GlobalISel/binop-isel.ll b/test/CodeGen/X86/GlobalISel/binop.ll
index 8499dd958447..8499dd958447 100644
--- a/test/CodeGen/X86/GlobalISel/binop-isel.ll
+++ b/test/CodeGen/X86/GlobalISel/binop.ll
diff --git a/test/CodeGen/X86/GlobalISel/legalize-const.mir b/test/CodeGen/X86/GlobalISel/legalize-constant.mir
index 612d33a77fc9..612d33a77fc9 100644
--- a/test/CodeGen/X86/GlobalISel/legalize-const.mir
+++ b/test/CodeGen/X86/GlobalISel/legalize-constant.mir
diff --git a/test/CodeGen/X86/GlobalISel/legalize-trunc.mir b/test/CodeGen/X86/GlobalISel/legalize-trunc.mir
new file mode 100644
index 000000000000..6b390d990ecf
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/legalize-trunc.mir
@@ -0,0 +1,31 @@
+# RUN: llc -mtriple=i386-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X32
+# RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64
+--- |
+ define void @trunc_check() {
+ ret void
+ }
+
+...
+---
+name: trunc_check
+# ALL-LABEL: name: trunc_check
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+ - { id: 2, class: _ }
+ - { id: 3, class: _ }
+body: |
+ bb.1 (%ir-block.0):
+ %0(s32) = IMPLICIT_DEF
+ ; ALL: %1(s1) = G_TRUNC %0(s32)
+ %1(s1) = G_TRUNC %0(s32)
+
+ ; ALL: %2(s8) = G_TRUNC %0(s32)
+ %2(s8) = G_TRUNC %0(s32)
+
+ ; ALL: %3(s16) = G_TRUNC %0(s32)
+ %3(s16) = G_TRUNC %0(s32)
+ RET 0
+
+...
+
diff --git a/test/CodeGen/X86/GlobalISel/memop-isel.ll b/test/CodeGen/X86/GlobalISel/memop.ll
index 6fe66436e4a8..6fe66436e4a8 100644
--- a/test/CodeGen/X86/GlobalISel/memop-isel.ll
+++ b/test/CodeGen/X86/GlobalISel/memop.ll
diff --git a/test/CodeGen/X86/GlobalISel/select-add.mir b/test/CodeGen/X86/GlobalISel/select-add.mir
new file mode 100644
index 000000000000..27fcc223d2bb
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/select-add.mir
@@ -0,0 +1,226 @@
+# RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=NO_AVX512VL --check-prefix=NO_AVX512F --check-prefix=SSE
+# RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=NO_AVX512VL --check-prefix=NO_AVX512F --check-prefix=AVX
+# RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=NO_AVX512VL --check-prefix=AVX512ALL --check-prefix=AVX512F
+# RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f -mattr=+avx512vl -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX512ALL --check-prefix=AVX512VL
+
+--- |
+ define i64 @test_add_i64(i64 %arg1, i64 %arg2) {
+ %ret = add i64 %arg1, %arg2
+ ret i64 %ret
+ }
+
+ define i32 @test_add_i32(i32 %arg1, i32 %arg2) {
+ %ret = add i32 %arg1, %arg2
+ ret i32 %ret
+ }
+
+ define float @test_add_float(float %arg1, float %arg2) {
+ %ret = fadd float %arg1, %arg2
+ ret float %ret
+ }
+
+ define double @test_add_double(double %arg1, double %arg2) {
+ %ret = fadd double %arg1, %arg2
+ ret double %ret
+ }
+
+ define <4 x i32> @test_add_v4i32(<4 x i32> %arg1, <4 x i32> %arg2) {
+ %ret = add <4 x i32> %arg1, %arg2
+ ret <4 x i32> %ret
+ }
+
+ define <4 x float> @test_add_v4f32(<4 x float> %arg1, <4 x float> %arg2) {
+ %ret = fadd <4 x float> %arg1, %arg2
+ ret <4 x float> %ret
+ }
+...
+
+---
+name: test_add_i64
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr64 }
+# ALL-NEXT: - { id: 1, class: gr64 }
+# ALL-NEXT: - { id: 2, class: gr64 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+# ALL: %0 = COPY %rdi
+# ALL-NEXT: %1 = COPY %rsi
+# ALL-NEXT: %2 = ADD64rr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi, %esi
+
+ %0(s64) = COPY %rdi
+ %1(s64) = COPY %rsi
+ %2(s64) = G_ADD %0, %1
+ %rax = COPY %2(s64)
+
+...
+
+---
+name: test_add_i32
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr32 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+# ALL-NEXT: - { id: 2, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+# ALL: %0 = COPY %edi
+# ALL-NEXT: %1 = COPY %esi
+# ALL-NEXT: %2 = ADD32rr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi, %esi
+
+ %0(s32) = COPY %edi
+ %1(s32) = COPY %esi
+ %2(s32) = G_ADD %0, %1
+ %rax = COPY %2(s32)
+
+...
+---
+name: test_add_float
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+tracksRegLiveness: true
+# ALL: registers:
+# NO_AVX512F-NEXT: - { id: 0, class: fr32 }
+# NO_AVX512F-NEXT: - { id: 1, class: fr32 }
+# NO_AVX512F-NEXT: - { id: 2, class: fr32 }
+# AVX512ALL-NEXT: - { id: 0, class: fr32x }
+# AVX512ALL-NEXT: - { id: 1, class: fr32x }
+# AVX512ALL-NEXT: - { id: 2, class: fr32x }
+registers:
+ - { id: 0, class: vecr }
+ - { id: 1, class: vecr }
+ - { id: 2, class: vecr }
+# ALL: %0 = COPY %xmm0
+# ALL-NEXT: %1 = COPY %xmm1
+# SSE-NEXT: %2 = ADDSSrr %0, %1
+# AVX-NEXT: %2 = VADDSSrr %0, %1
+# AVX512F-NEXT: %2 = VADDSSZrr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %xmm0, %xmm1
+
+ %0(s32) = COPY %xmm0
+ %1(s32) = COPY %xmm1
+ %2(s32) = G_FADD %0, %1
+ %xmm0 = COPY %2(s32)
+ RET 0, implicit %xmm0
+
+...
+---
+name: test_add_double
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+tracksRegLiveness: true
+# ALL: registers:
+# NO_AVX512F-NEXT: - { id: 0, class: fr64 }
+# NO_AVX512F-NEXT: - { id: 1, class: fr64 }
+# NO_AVX512F-NEXT: - { id: 2, class: fr64 }
+# AVX512ALL-NEXT: - { id: 0, class: fr64x }
+# AVX512ALL-NEXT: - { id: 1, class: fr64x }
+# AVX512ALL-NEXT: - { id: 2, class: fr64x }
+registers:
+ - { id: 0, class: vecr }
+ - { id: 1, class: vecr }
+ - { id: 2, class: vecr }
+# ALL: %0 = COPY %xmm0
+# ALL-NEXT: %1 = COPY %xmm1
+# SSE-NEXT: %2 = ADDSDrr %0, %1
+# AVX-NEXT: %2 = VADDSDrr %0, %1
+# AVX512F-NEXT: %2 = VADDSDZrr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %xmm0, %xmm1
+
+ %0(s64) = COPY %xmm0
+ %1(s64) = COPY %xmm1
+ %2(s64) = G_FADD %0, %1
+ %xmm0 = COPY %2(s64)
+ RET 0, implicit %xmm0
+
+...
+---
+name: test_add_v4i32
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+tracksRegLiveness: true
+# ALL: registers:
+# NO_AVX512VL-NEXT: - { id: 0, class: vr128 }
+# NO_AVX512VL-NEXT: - { id: 1, class: vr128 }
+# NO_AVX512VL-NEXT: - { id: 2, class: vr128 }
+# AVX512VL-NEXT: - { id: 0, class: vr128x }
+# AVX512VL-NEXT: - { id: 1, class: vr128x }
+# AVX512VL-NEXT: - { id: 2, class: vr128x }
+registers:
+ - { id: 0, class: vecr }
+ - { id: 1, class: vecr }
+ - { id: 2, class: vecr }
+# ALL: %0 = COPY %xmm0
+# ALL-NEXT: %1 = COPY %xmm1
+# SSE-NEXT: %2 = PADDDrr %0, %1
+# AVX-NEXT: %2 = VPADDDrr %0, %1
+# AVX512F-NEXT: %2 = VPADDDrr %0, %1
+# AVX512VL-NEXT: %2 = VPADDDZ128rr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %xmm0, %xmm1
+
+ %0(<4 x s32>) = COPY %xmm0
+ %1(<4 x s32>) = COPY %xmm1
+ %2(<4 x s32>) = G_ADD %0, %1
+ %xmm0 = COPY %2(<4 x s32>)
+ RET 0, implicit %xmm0
+
+...
+---
+name: test_add_v4f32
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+tracksRegLiveness: true
+# ALL: registers:
+# NO_AVX512VL-NEXT: - { id: 0, class: vr128 }
+# NO_AVX512VL-NEXT: - { id: 1, class: vr128 }
+# NO_AVX512VL-NEXT: - { id: 2, class: vr128 }
+# AVX512VL-NEXT: - { id: 0, class: vr128x }
+# AVX512VL-NEXT: - { id: 1, class: vr128x }
+# AVX512VL-NEXT: - { id: 2, class: vr128x }
+registers:
+ - { id: 0, class: vecr }
+ - { id: 1, class: vecr }
+ - { id: 2, class: vecr }
+# ALL: %0 = COPY %xmm0
+# ALL-NEXT: %1 = COPY %xmm1
+# SSE-NEXT: %2 = ADDPSrr %0, %1
+# AVX-NEXT: %2 = VADDPSrr %0, %1
+# AVX512F-NEXT: %2 = VADDPSrr %0, %1
+# AVX512VL-NEXT: %2 = VADDPSZ128rr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %xmm0, %xmm1
+
+ %0(<4 x s32>) = COPY %xmm0
+ %1(<4 x s32>) = COPY %xmm1
+ %2(<4 x s32>) = G_FADD %0, %1
+ %xmm0 = COPY %2(<4 x s32>)
+ RET 0, implicit %xmm0
+
+...
diff --git a/test/CodeGen/X86/GlobalISel/frameIndex-instructionselect.mir b/test/CodeGen/X86/GlobalISel/select-frameIndex.mir
index 2fa9ac23a7af..2fa9ac23a7af 100644
--- a/test/CodeGen/X86/GlobalISel/frameIndex-instructionselect.mir
+++ b/test/CodeGen/X86/GlobalISel/select-frameIndex.mir
diff --git a/test/CodeGen/X86/GlobalISel/x86_64-instructionselect.mir b/test/CodeGen/X86/GlobalISel/select-memop.mir
index 17522c3cb45e..943c9aceb4d1 100644
--- a/test/CodeGen/X86/GlobalISel/x86_64-instructionselect.mir
+++ b/test/CodeGen/X86/GlobalISel/select-memop.mir
@@ -4,67 +4,7 @@
# RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f -mattr=+avx512vl -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX512ALL --check-prefix=AVX512VL
--- |
- define i64 @test_add_i64(i64 %arg1, i64 %arg2) {
- %ret = add i64 %arg1, %arg2
- ret i64 %ret
- }
-
- define i32 @test_add_i32(i32 %arg1, i32 %arg2) {
- %ret = add i32 %arg1, %arg2
- ret i32 %ret
- }
-
- define i64 @test_sub_i64(i64 %arg1, i64 %arg2) {
- %ret = sub i64 %arg1, %arg2
- ret i64 %ret
- }
-
- define i32 @test_sub_i32(i32 %arg1, i32 %arg2) {
- %ret = sub i32 %arg1, %arg2
- ret i32 %ret
- }
-
- define float @test_add_float(float %arg1, float %arg2) {
- %ret = fadd float %arg1, %arg2
- ret float %ret
- }
-
- define double @test_add_double(double %arg1, double %arg2) {
- %ret = fadd double %arg1, %arg2
- ret double %ret
- }
-
- define float @test_sub_float(float %arg1, float %arg2) {
- %ret = fsub float %arg1, %arg2
- ret float %ret
- }
-
- define double @test_sub_double(double %arg1, double %arg2) {
- %ret = fsub double %arg1, %arg2
- ret double %ret
- }
-
- define <4 x i32> @test_add_v4i32(<4 x i32> %arg1, <4 x i32> %arg2) {
- %ret = add <4 x i32> %arg1, %arg2
- ret <4 x i32> %ret
- }
-
- define <4 x i32> @test_sub_v4i32(<4 x i32> %arg1, <4 x i32> %arg2) {
- %ret = sub <4 x i32> %arg1, %arg2
- ret <4 x i32> %ret
- }
-
- define <4 x float> @test_add_v4f32(<4 x float> %arg1, <4 x float> %arg2) {
- %ret = fadd <4 x float> %arg1, %arg2
- ret <4 x float> %ret
- }
-
- define <4 x float> @test_sub_v4f32(<4 x float> %arg1, <4 x float> %arg2) {
- %ret = fsub <4 x float> %arg1, %arg2
- ret <4 x float> %ret
- }
-
- define i8 @test_load_i8(i8* %p1) {
+ define i8 @test_load_i8(i8* %p1) {
%r = load i8, i8* %p1
ret i8 %r
}
@@ -88,12 +28,12 @@
%r = load float, float* %p1
ret float %r
}
-
+
define float @test_load_float_vecreg(float* %p1) {
%r = load float, float* %p1
ret float %r
}
-
+
define double @test_load_double(double* %p1) {
%r = load double, double* %p1
@@ -139,7 +79,7 @@
store double %val, double* %p1
ret double* %p1
}
-
+
define double* @test_store_double_vec(double %val, double* %p1) {
store double %val, double* %p1
ret double* %p1
@@ -156,386 +96,6 @@
}
...
-
----
-name: test_add_i64
-legalized: true
-regBankSelected: true
-# ALL: registers:
-# ALL-NEXT: - { id: 0, class: gr64 }
-# ALL-NEXT: - { id: 1, class: gr64 }
-# ALL-NEXT: - { id: 2, class: gr64 }
-registers:
- - { id: 0, class: gpr }
- - { id: 1, class: gpr }
- - { id: 2, class: gpr }
-# ALL: %0 = COPY %rdi
-# ALL-NEXT: %1 = COPY %rsi
-# ALL-NEXT: %2 = ADD64rr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %edi, %esi
-
- %0(s64) = COPY %rdi
- %1(s64) = COPY %rsi
- %2(s64) = G_ADD %0, %1
- %rax = COPY %2(s64)
-
-...
-
----
-name: test_add_i32
-legalized: true
-regBankSelected: true
-# ALL: registers:
-# ALL-NEXT: - { id: 0, class: gr32 }
-# ALL-NEXT: - { id: 1, class: gr32 }
-# ALL-NEXT: - { id: 2, class: gr32 }
-registers:
- - { id: 0, class: gpr }
- - { id: 1, class: gpr }
- - { id: 2, class: gpr }
-# ALL: %0 = COPY %edi
-# ALL-NEXT: %1 = COPY %esi
-# ALL-NEXT: %2 = ADD32rr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %edi, %esi
-
- %0(s32) = COPY %edi
- %1(s32) = COPY %esi
- %2(s32) = G_ADD %0, %1
- %rax = COPY %2(s32)
-
-...
-
----
-name: test_sub_i64
-legalized: true
-regBankSelected: true
-# ALL: registers:
-# ALL-NEXT: - { id: 0, class: gr64 }
-# ALL-NEXT: - { id: 1, class: gr64 }
-# ALL-NEXT: - { id: 2, class: gr64 }
-registers:
- - { id: 0, class: gpr }
- - { id: 1, class: gpr }
- - { id: 2, class: gpr }
-# ALL: %0 = COPY %rdi
-# ALL-NEXT: %1 = COPY %rsi
-# ALL-NEXT: %2 = SUB64rr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %edi, %esi
-
- %0(s64) = COPY %rdi
- %1(s64) = COPY %rsi
- %2(s64) = G_SUB %0, %1
- %rax = COPY %2(s64)
-
-...
-
----
-name: test_sub_i32
-legalized: true
-regBankSelected: true
-# ALL: registers:
-# ALL-NEXT: - { id: 0, class: gr32 }
-# ALL-NEXT: - { id: 1, class: gr32 }
-# ALL-NEXT: - { id: 2, class: gr32 }
-registers:
- - { id: 0, class: gpr }
- - { id: 1, class: gpr }
- - { id: 2, class: gpr }
-# ALL: %0 = COPY %edi
-# ALL-NEXT: %1 = COPY %esi
-# ALL-NEXT: %2 = SUB32rr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %edi, %esi
-
- %0(s32) = COPY %edi
- %1(s32) = COPY %esi
- %2(s32) = G_SUB %0, %1
- %rax = COPY %2(s32)
-
-...
-
----
-name: test_add_float
-alignment: 4
-legalized: true
-regBankSelected: true
-selected: false
-tracksRegLiveness: true
-# ALL: registers:
-# NO_AVX512F-NEXT: - { id: 0, class: fr32 }
-# NO_AVX512F-NEXT: - { id: 1, class: fr32 }
-# NO_AVX512F-NEXT: - { id: 2, class: fr32 }
-# AVX512ALL-NEXT: - { id: 0, class: fr32x }
-# AVX512ALL-NEXT: - { id: 1, class: fr32x }
-# AVX512ALL-NEXT: - { id: 2, class: fr32x }
-registers:
- - { id: 0, class: vecr }
- - { id: 1, class: vecr }
- - { id: 2, class: vecr }
-# ALL: %0 = COPY %xmm0
-# ALL-NEXT: %1 = COPY %xmm1
-# SSE-NEXT: %2 = ADDSSrr %0, %1
-# AVX-NEXT: %2 = VADDSSrr %0, %1
-# AVX512F-NEXT: %2 = VADDSSZrr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %xmm0, %xmm1
-
- %0(s32) = COPY %xmm0
- %1(s32) = COPY %xmm1
- %2(s32) = G_FADD %0, %1
- %xmm0 = COPY %2(s32)
- RET 0, implicit %xmm0
-
-...
----
-name: test_add_double
-alignment: 4
-legalized: true
-regBankSelected: true
-selected: false
-tracksRegLiveness: true
-# ALL: registers:
-# NO_AVX512F-NEXT: - { id: 0, class: fr64 }
-# NO_AVX512F-NEXT: - { id: 1, class: fr64 }
-# NO_AVX512F-NEXT: - { id: 2, class: fr64 }
-# AVX512ALL-NEXT: - { id: 0, class: fr64x }
-# AVX512ALL-NEXT: - { id: 1, class: fr64x }
-# AVX512ALL-NEXT: - { id: 2, class: fr64x }
-registers:
- - { id: 0, class: vecr }
- - { id: 1, class: vecr }
- - { id: 2, class: vecr }
-# ALL: %0 = COPY %xmm0
-# ALL-NEXT: %1 = COPY %xmm1
-# SSE-NEXT: %2 = ADDSDrr %0, %1
-# AVX-NEXT: %2 = VADDSDrr %0, %1
-# AVX512F-NEXT: %2 = VADDSDZrr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %xmm0, %xmm1
-
- %0(s64) = COPY %xmm0
- %1(s64) = COPY %xmm1
- %2(s64) = G_FADD %0, %1
- %xmm0 = COPY %2(s64)
- RET 0, implicit %xmm0
-
-...
----
-name: test_sub_float
-alignment: 4
-legalized: true
-regBankSelected: true
-selected: false
-tracksRegLiveness: true
-# ALL: registers:
-# NO_AVX512F-NEXT: - { id: 0, class: fr32 }
-# NO_AVX512F-NEXT: - { id: 1, class: fr32 }
-# NO_AVX512F-NEXT: - { id: 2, class: fr32 }
-# AVX512ALL-NEXT: - { id: 0, class: fr32x }
-# AVX512ALL-NEXT: - { id: 1, class: fr32x }
-# AVX512ALL-NEXT: - { id: 2, class: fr32x }
-registers:
- - { id: 0, class: vecr }
- - { id: 1, class: vecr }
- - { id: 2, class: vecr }
-# ALL: %0 = COPY %xmm0
-# ALL-NEXT: %1 = COPY %xmm1
-# SSE-NEXT: %2 = SUBSSrr %0, %1
-# AVX-NEXT: %2 = VSUBSSrr %0, %1
-# AVX512F-NEXT: %2 = VSUBSSZrr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %xmm0, %xmm1
-
- %0(s32) = COPY %xmm0
- %1(s32) = COPY %xmm1
- %2(s32) = G_FSUB %0, %1
- %xmm0 = COPY %2(s32)
- RET 0, implicit %xmm0
-
-...
----
-name: test_sub_double
-alignment: 4
-legalized: true
-regBankSelected: true
-selected: false
-tracksRegLiveness: true
-# ALL: registers:
-# NO_AVX512F-NEXT: - { id: 0, class: fr64 }
-# NO_AVX512F-NEXT: - { id: 1, class: fr64 }
-# NO_AVX512F-NEXT: - { id: 2, class: fr64 }
-# AVX512ALL-NEXT: - { id: 0, class: fr64x }
-# AVX512ALL-NEXT: - { id: 1, class: fr64x }
-# AVX512ALL-NEXT: - { id: 2, class: fr64x }
-registers:
- - { id: 0, class: vecr }
- - { id: 1, class: vecr }
- - { id: 2, class: vecr }
-# ALL: %0 = COPY %xmm0
-# ALL-NEXT: %1 = COPY %xmm1
-# SSE-NEXT: %2 = SUBSDrr %0, %1
-# AVX-NEXT: %2 = VSUBSDrr %0, %1
-# AVX512F-NEXT: %2 = VSUBSDZrr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %xmm0, %xmm1
-
- %0(s64) = COPY %xmm0
- %1(s64) = COPY %xmm1
- %2(s64) = G_FSUB %0, %1
- %xmm0 = COPY %2(s64)
- RET 0, implicit %xmm0
-...
----
-name: test_add_v4i32
-alignment: 4
-legalized: true
-regBankSelected: true
-selected: false
-tracksRegLiveness: true
-# ALL: registers:
-# NO_AVX512VL-NEXT: - { id: 0, class: vr128 }
-# NO_AVX512VL-NEXT: - { id: 1, class: vr128 }
-# NO_AVX512VL-NEXT: - { id: 2, class: vr128 }
-# AVX512VL-NEXT: - { id: 0, class: vr128x }
-# AVX512VL-NEXT: - { id: 1, class: vr128x }
-# AVX512VL-NEXT: - { id: 2, class: vr128x }
-registers:
- - { id: 0, class: vecr }
- - { id: 1, class: vecr }
- - { id: 2, class: vecr }
-# ALL: %0 = COPY %xmm0
-# ALL-NEXT: %1 = COPY %xmm1
-# SSE-NEXT: %2 = PADDDrr %0, %1
-# AVX-NEXT: %2 = VPADDDrr %0, %1
-# AVX512F-NEXT: %2 = VPADDDrr %0, %1
-# AVX512VL-NEXT: %2 = VPADDDZ128rr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %xmm0, %xmm1
-
- %0(<4 x s32>) = COPY %xmm0
- %1(<4 x s32>) = COPY %xmm1
- %2(<4 x s32>) = G_ADD %0, %1
- %xmm0 = COPY %2(<4 x s32>)
- RET 0, implicit %xmm0
-
-...
----
-name: test_sub_v4i32
-alignment: 4
-legalized: true
-regBankSelected: true
-selected: false
-tracksRegLiveness: true
-# ALL: registers:
-# NO_AVX512VL-NEXT: - { id: 0, class: vr128 }
-# NO_AVX512VL-NEXT: - { id: 1, class: vr128 }
-# NO_AVX512VL-NEXT: - { id: 2, class: vr128 }
-# AVX512VL-NEXT: - { id: 0, class: vr128x }
-# AVX512VL-NEXT: - { id: 1, class: vr128x }
-# AVX512VL-NEXT: - { id: 2, class: vr128x }
-registers:
- - { id: 0, class: vecr }
- - { id: 1, class: vecr }
- - { id: 2, class: vecr }
-# ALL: %0 = COPY %xmm0
-# ALL-NEXT: %1 = COPY %xmm1
-# SSE-NEXT: %2 = PSUBDrr %0, %1
-# AVX-NEXT: %2 = VPSUBDrr %0, %1
-# AVX512F-NEXT: %2 = VPSUBDrr %0, %1
-# AVX512VL-NEXT: %2 = VPSUBDZ128rr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %xmm0, %xmm1
-
- %0(<4 x s32>) = COPY %xmm0
- %1(<4 x s32>) = COPY %xmm1
- %2(<4 x s32>) = G_SUB %0, %1
- %xmm0 = COPY %2(<4 x s32>)
- RET 0, implicit %xmm0
-
-...
----
-name: test_add_v4f32
-alignment: 4
-legalized: true
-regBankSelected: true
-selected: false
-tracksRegLiveness: true
-# ALL: registers:
-# NO_AVX512VL-NEXT: - { id: 0, class: vr128 }
-# NO_AVX512VL-NEXT: - { id: 1, class: vr128 }
-# NO_AVX512VL-NEXT: - { id: 2, class: vr128 }
-# AVX512VL-NEXT: - { id: 0, class: vr128x }
-# AVX512VL-NEXT: - { id: 1, class: vr128x }
-# AVX512VL-NEXT: - { id: 2, class: vr128x }
-registers:
- - { id: 0, class: vecr }
- - { id: 1, class: vecr }
- - { id: 2, class: vecr }
-# ALL: %0 = COPY %xmm0
-# ALL-NEXT: %1 = COPY %xmm1
-# SSE-NEXT: %2 = ADDPSrr %0, %1
-# AVX-NEXT: %2 = VADDPSrr %0, %1
-# AVX512F-NEXT: %2 = VADDPSrr %0, %1
-# AVX512VL-NEXT: %2 = VADDPSZ128rr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %xmm0, %xmm1
-
- %0(<4 x s32>) = COPY %xmm0
- %1(<4 x s32>) = COPY %xmm1
- %2(<4 x s32>) = G_FADD %0, %1
- %xmm0 = COPY %2(<4 x s32>)
- RET 0, implicit %xmm0
-
-...
----
-name: test_sub_v4f32
-alignment: 4
-legalized: true
-regBankSelected: true
-selected: false
-tracksRegLiveness: true
-# ALL: registers:
-# NO_AVX512VL-NEXT: - { id: 0, class: vr128 }
-# NO_AVX512VL-NEXT: - { id: 1, class: vr128 }
-# NO_AVX512VL-NEXT: - { id: 2, class: vr128 }
-# AVX512VL-NEXT: - { id: 0, class: vr128x }
-# AVX512VL-NEXT: - { id: 1, class: vr128x }
-# AVX512VL-NEXT: - { id: 2, class: vr128x }
-registers:
- - { id: 0, class: vecr }
- - { id: 1, class: vecr }
- - { id: 2, class: vecr }
-# ALL: %0 = COPY %xmm0
-# ALL-NEXT: %1 = COPY %xmm1
-# SSE-NEXT: %2 = SUBPSrr %0, %1
-# AVX-NEXT: %2 = VSUBPSrr %0, %1
-# AVX512F-NEXT: %2 = VSUBPSrr %0, %1
-# AVX512VL-NEXT: %2 = VSUBPSZ128rr %0, %1
-body: |
- bb.1 (%ir-block.0):
- liveins: %xmm0, %xmm1
-
- %0(<4 x s32>) = COPY %xmm0
- %1(<4 x s32>) = COPY %xmm1
- %2(<4 x s32>) = G_FSUB %0, %1
- %xmm0 = COPY %2(<4 x s32>)
- RET 0, implicit %xmm0
-
-...
---
# ALL-LABEL: name: test_load_i8
name: test_load_i8
diff --git a/test/CodeGen/X86/GlobalISel/select-sub.mir b/test/CodeGen/X86/GlobalISel/select-sub.mir
new file mode 100644
index 000000000000..d4db6eec6d80
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/select-sub.mir
@@ -0,0 +1,225 @@
+# RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=NO_AVX512VL --check-prefix=NO_AVX512F --check-prefix=SSE
+# RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=NO_AVX512VL --check-prefix=NO_AVX512F --check-prefix=AVX
+# RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=NO_AVX512VL --check-prefix=AVX512ALL --check-prefix=AVX512F
+# RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f -mattr=+avx512vl -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX512ALL --check-prefix=AVX512VL
+
+--- |
+ define i64 @test_sub_i64(i64 %arg1, i64 %arg2) {
+ %ret = sub i64 %arg1, %arg2
+ ret i64 %ret
+ }
+
+ define i32 @test_sub_i32(i32 %arg1, i32 %arg2) {
+ %ret = sub i32 %arg1, %arg2
+ ret i32 %ret
+ }
+
+ define float @test_sub_float(float %arg1, float %arg2) {
+ %ret = fsub float %arg1, %arg2
+ ret float %ret
+ }
+
+ define double @test_sub_double(double %arg1, double %arg2) {
+ %ret = fsub double %arg1, %arg2
+ ret double %ret
+ }
+
+ define <4 x i32> @test_sub_v4i32(<4 x i32> %arg1, <4 x i32> %arg2) {
+ %ret = sub <4 x i32> %arg1, %arg2
+ ret <4 x i32> %ret
+ }
+
+ define <4 x float> @test_sub_v4f32(<4 x float> %arg1, <4 x float> %arg2) {
+ %ret = fsub <4 x float> %arg1, %arg2
+ ret <4 x float> %ret
+ }
+
+...
+---
+name: test_sub_i64
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr64 }
+# ALL-NEXT: - { id: 1, class: gr64 }
+# ALL-NEXT: - { id: 2, class: gr64 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+# ALL: %0 = COPY %rdi
+# ALL-NEXT: %1 = COPY %rsi
+# ALL-NEXT: %2 = SUB64rr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi, %esi
+
+ %0(s64) = COPY %rdi
+ %1(s64) = COPY %rsi
+ %2(s64) = G_SUB %0, %1
+ %rax = COPY %2(s64)
+
+...
+
+---
+name: test_sub_i32
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr32 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+# ALL-NEXT: - { id: 2, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+# ALL: %0 = COPY %edi
+# ALL-NEXT: %1 = COPY %esi
+# ALL-NEXT: %2 = SUB32rr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi, %esi
+
+ %0(s32) = COPY %edi
+ %1(s32) = COPY %esi
+ %2(s32) = G_SUB %0, %1
+ %rax = COPY %2(s32)
+
+...
+---
+name: test_sub_float
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+tracksRegLiveness: true
+# ALL: registers:
+# NO_AVX512F-NEXT: - { id: 0, class: fr32 }
+# NO_AVX512F-NEXT: - { id: 1, class: fr32 }
+# NO_AVX512F-NEXT: - { id: 2, class: fr32 }
+# AVX512ALL-NEXT: - { id: 0, class: fr32x }
+# AVX512ALL-NEXT: - { id: 1, class: fr32x }
+# AVX512ALL-NEXT: - { id: 2, class: fr32x }
+registers:
+ - { id: 0, class: vecr }
+ - { id: 1, class: vecr }
+ - { id: 2, class: vecr }
+# ALL: %0 = COPY %xmm0
+# ALL-NEXT: %1 = COPY %xmm1
+# SSE-NEXT: %2 = SUBSSrr %0, %1
+# AVX-NEXT: %2 = VSUBSSrr %0, %1
+# AVX512F-NEXT: %2 = VSUBSSZrr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %xmm0, %xmm1
+
+ %0(s32) = COPY %xmm0
+ %1(s32) = COPY %xmm1
+ %2(s32) = G_FSUB %0, %1
+ %xmm0 = COPY %2(s32)
+ RET 0, implicit %xmm0
+
+...
+---
+name: test_sub_double
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+tracksRegLiveness: true
+# ALL: registers:
+# NO_AVX512F-NEXT: - { id: 0, class: fr64 }
+# NO_AVX512F-NEXT: - { id: 1, class: fr64 }
+# NO_AVX512F-NEXT: - { id: 2, class: fr64 }
+# AVX512ALL-NEXT: - { id: 0, class: fr64x }
+# AVX512ALL-NEXT: - { id: 1, class: fr64x }
+# AVX512ALL-NEXT: - { id: 2, class: fr64x }
+registers:
+ - { id: 0, class: vecr }
+ - { id: 1, class: vecr }
+ - { id: 2, class: vecr }
+# ALL: %0 = COPY %xmm0
+# ALL-NEXT: %1 = COPY %xmm1
+# SSE-NEXT: %2 = SUBSDrr %0, %1
+# AVX-NEXT: %2 = VSUBSDrr %0, %1
+# AVX512F-NEXT: %2 = VSUBSDZrr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %xmm0, %xmm1
+
+ %0(s64) = COPY %xmm0
+ %1(s64) = COPY %xmm1
+ %2(s64) = G_FSUB %0, %1
+ %xmm0 = COPY %2(s64)
+ RET 0, implicit %xmm0
+...
+---
+name: test_sub_v4i32
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+tracksRegLiveness: true
+# ALL: registers:
+# NO_AVX512VL-NEXT: - { id: 0, class: vr128 }
+# NO_AVX512VL-NEXT: - { id: 1, class: vr128 }
+# NO_AVX512VL-NEXT: - { id: 2, class: vr128 }
+# AVX512VL-NEXT: - { id: 0, class: vr128x }
+# AVX512VL-NEXT: - { id: 1, class: vr128x }
+# AVX512VL-NEXT: - { id: 2, class: vr128x }
+registers:
+ - { id: 0, class: vecr }
+ - { id: 1, class: vecr }
+ - { id: 2, class: vecr }
+# ALL: %0 = COPY %xmm0
+# ALL-NEXT: %1 = COPY %xmm1
+# SSE-NEXT: %2 = PSUBDrr %0, %1
+# AVX-NEXT: %2 = VPSUBDrr %0, %1
+# AVX512F-NEXT: %2 = VPSUBDrr %0, %1
+# AVX512VL-NEXT: %2 = VPSUBDZ128rr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %xmm0, %xmm1
+
+ %0(<4 x s32>) = COPY %xmm0
+ %1(<4 x s32>) = COPY %xmm1
+ %2(<4 x s32>) = G_SUB %0, %1
+ %xmm0 = COPY %2(<4 x s32>)
+ RET 0, implicit %xmm0
+
+...
+---
+name: test_sub_v4f32
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+tracksRegLiveness: true
+# ALL: registers:
+# NO_AVX512VL-NEXT: - { id: 0, class: vr128 }
+# NO_AVX512VL-NEXT: - { id: 1, class: vr128 }
+# NO_AVX512VL-NEXT: - { id: 2, class: vr128 }
+# AVX512VL-NEXT: - { id: 0, class: vr128x }
+# AVX512VL-NEXT: - { id: 1, class: vr128x }
+# AVX512VL-NEXT: - { id: 2, class: vr128x }
+registers:
+ - { id: 0, class: vecr }
+ - { id: 1, class: vecr }
+ - { id: 2, class: vecr }
+# ALL: %0 = COPY %xmm0
+# ALL-NEXT: %1 = COPY %xmm1
+# SSE-NEXT: %2 = SUBPSrr %0, %1
+# AVX-NEXT: %2 = VSUBPSrr %0, %1
+# AVX512F-NEXT: %2 = VSUBPSrr %0, %1
+# AVX512VL-NEXT: %2 = VSUBPSZ128rr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %xmm0, %xmm1
+
+ %0(<4 x s32>) = COPY %xmm0
+ %1(<4 x s32>) = COPY %xmm1
+ %2(<4 x s32>) = G_FSUB %0, %1
+ %xmm0 = COPY %2(<4 x s32>)
+ RET 0, implicit %xmm0
+
+...
diff --git a/test/CodeGen/X86/GlobalISel/select-trunc.mir b/test/CodeGen/X86/GlobalISel/select-trunc.mir
new file mode 100644
index 000000000000..714340248ff6
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/select-trunc.mir
@@ -0,0 +1,183 @@
+# RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=instruction-select %s -o - | FileCheck %s --check-prefix=CHECK
+--- |
+ define i1 @trunc_i32toi1(i32 %a) {
+ %r = trunc i32 %a to i1
+ ret i1 %r
+ }
+
+ define i8 @trunc_i32toi8(i32 %a) {
+ %r = trunc i32 %a to i8
+ ret i8 %r
+ }
+
+ define i16 @trunc_i32toi16(i32 %a) {
+ %r = trunc i32 %a to i16
+ ret i16 %r
+ }
+
+ define i8 @trunc_i64toi8(i64 %a) {
+ %r = trunc i64 %a to i8
+ ret i8 %r
+ }
+
+ define i16 @trunc_i64toi16(i64 %a) {
+ %r = trunc i64 %a to i16
+ ret i16 %r
+ }
+
+ define i32 @trunc_i64toi32(i64 %a) {
+ %r = trunc i64 %a to i32
+ ret i32 %r
+ }
+
+...
+---
+name: trunc_i32toi1
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+# CHECK-LABEL: name: trunc_i32toi1
+# CHECK: registers:
+# CHECK-NEXT: - { id: 0, class: gr32 }
+# CHECK-NEXT: - { id: 1, class: gr8 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# CHECK: body:
+# CHECK: %1 = COPY %0.sub_8
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s32) = COPY %edi
+ %1(s1) = G_TRUNC %0(s32)
+ %al = COPY %1(s1)
+ RET 0, implicit %al
+
+...
+---
+name: trunc_i32toi8
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+# CHECK-LABEL: name: trunc_i32toi8
+# CHECK: registers:
+# CHECK-NEXT: - { id: 0, class: gr32 }
+# CHECK-NEXT: - { id: 1, class: gr8 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# CHECK: body:
+# CHECK: %1 = COPY %0.sub_8
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s32) = COPY %edi
+ %1(s8) = G_TRUNC %0(s32)
+ %al = COPY %1(s8)
+ RET 0, implicit %al
+
+...
+---
+name: trunc_i32toi16
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+# CHECK-LABEL: name: trunc_i32toi16
+# CHECK: registers:
+# CHECK-NEXT: - { id: 0, class: gr32 }
+# CHECK-NEXT: - { id: 1, class: gr16 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# CHECK: body:
+# CHECK: %1 = COPY %0.sub_16
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s32) = COPY %edi
+ %1(s16) = G_TRUNC %0(s32)
+ %ax = COPY %1(s16)
+ RET 0, implicit %ax
+
+...
+---
+name: trunc_i64toi8
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+# CHECK-LABEL: name: trunc_i64toi8
+# CHECK: registers:
+# CHECK-NEXT: - { id: 0, class: gr64 }
+# CHECK-NEXT: - { id: 1, class: gr8 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# CHECK: body:
+# CHECK: %1 = COPY %0.sub_8
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %rdi
+
+ %0(s64) = COPY %rdi
+ %1(s8) = G_TRUNC %0(s64)
+ %al = COPY %1(s8)
+ RET 0, implicit %al
+
+...
+---
+name: trunc_i64toi16
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+# CHECK-LABEL: name: trunc_i64toi16
+# CHECK: registers:
+# CHECK-NEXT: - { id: 0, class: gr64 }
+# CHECK-NEXT: - { id: 1, class: gr16 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# CHECK: body:
+# CHECK: %1 = COPY %0.sub_16
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %rdi
+
+ %0(s64) = COPY %rdi
+ %1(s16) = G_TRUNC %0(s64)
+ %ax = COPY %1(s16)
+ RET 0, implicit %ax
+
+...
+---
+name: trunc_i64toi32
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+# CHECK-LABEL: name: trunc_i64toi32
+# CHECK: registers:
+# CHECK-NEXT: - { id: 0, class: gr64 }
+# CHECK-NEXT: - { id: 1, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# CHECK: body:
+# CHECK: %1 = COPY %0.sub_32
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %rdi
+
+ %0(s64) = COPY %rdi
+ %1(s32) = G_TRUNC %0(s64)
+ %eax = COPY %1(s32)
+ RET 0, implicit %eax
+
+...
diff --git a/test/CodeGen/X86/GlobalISel/trunc.ll b/test/CodeGen/X86/GlobalISel/trunc.ll
new file mode 100644
index 000000000000..a56fc3b5a87f
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/trunc.ll
@@ -0,0 +1,57 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=x86_64-linux-gnu -global-isel < %s -o - | FileCheck %s --check-prefix=CHECK
+
+define i1 @trunc_i32toi1(i32 %a) {
+; CHECK-LABEL: trunc_i32toi1:
+; CHECK: # BB#0:
+; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: retq
+ %r = trunc i32 %a to i1
+ ret i1 %r
+}
+
+define i8 @trunc_i32toi8(i32 %a) {
+; CHECK-LABEL: trunc_i32toi8:
+; CHECK: # BB#0:
+; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: retq
+ %r = trunc i32 %a to i8
+ ret i8 %r
+}
+
+define i16 @trunc_i32toi16(i32 %a) {
+; CHECK-LABEL: trunc_i32toi16:
+; CHECK: # BB#0:
+; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: retq
+ %r = trunc i32 %a to i16
+ ret i16 %r
+}
+
+define i8 @trunc_i64toi8(i64 %a) {
+; CHECK-LABEL: trunc_i64toi8:
+; CHECK: # BB#0:
+; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: retq
+ %r = trunc i64 %a to i8
+ ret i8 %r
+}
+
+define i16 @trunc_i64toi16(i64 %a) {
+; CHECK-LABEL: trunc_i64toi16:
+; CHECK: # BB#0:
+; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: retq
+ %r = trunc i64 %a to i16
+ ret i16 %r
+}
+
+define i32 @trunc_i64toi32(i64 %a) {
+; CHECK-LABEL: trunc_i64toi32:
+; CHECK: # BB#0:
+; CHECK-NEXT: movl %edi, %eax
+; CHECK-NEXT: retq
+ %r = trunc i64 %a to i32
+ ret i32 %r
+}
+
diff --git a/test/CodeGen/X86/MergeConsecutiveStores.ll b/test/CodeGen/X86/MergeConsecutiveStores.ll
index 4303b6254464..f89f6e1de1ab 100644
--- a/test/CodeGen/X86/MergeConsecutiveStores.ll
+++ b/test/CodeGen/X86/MergeConsecutiveStores.ll
@@ -582,3 +582,22 @@ define void @merge_vec_element_and_scalar_load([6 x i64]* %array) {
; CHECK-NEXT: movq %rcx, 40(%rdi)
; CHECK-NEXT: retq
}
+
+
+
+; Don't let a non-consecutive store thwart merging of the last two.
+define void @almost_consecutive_stores(i8* %p) {
+ store i8 0, i8* %p
+ %p1 = getelementptr i8, i8* %p, i64 42
+ store i8 1, i8* %p1
+ %p2 = getelementptr i8, i8* %p, i64 2
+ store i8 2, i8* %p2
+ %p3 = getelementptr i8, i8* %p, i64 3
+ store i8 3, i8* %p3
+ ret void
+; CHECK-LABEL: almost_consecutive_stores
+; CHECK-DAG: movb $0, (%rdi)
+; CHECK-DAG: movb $1, 42(%rdi)
+; CHECK-DAG: movw $770, 2(%rdi)
+; CHECK: retq
+}
diff --git a/test/CodeGen/X86/avx-logic.ll b/test/CodeGen/X86/avx-logic.ll
index e9e7d5aea273..89abbabee27c 100644
--- a/test/CodeGen/X86/avx-logic.ll
+++ b/test/CodeGen/X86/avx-logic.ll
@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=CHECK --check-prefix=AVX
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512
define <4 x double> @andpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {
; CHECK-LABEL: andpd256:
@@ -271,3 +271,35 @@ entry:
ret <2 x i64> %x
}
+define <4 x i32> @and_xor_splat1_v4i32(<4 x i32> %x) nounwind {
+; AVX-LABEL: and_xor_splat1_v4i32:
+; AVX: # BB#0:
+; AVX-NEXT: vandnps {{.*}}(%rip), %xmm0, %xmm0
+; AVX-NEXT: retq
+;
+; AVX512-LABEL: and_xor_splat1_v4i32:
+; AVX512: # BB#0:
+; AVX512-NEXT: vbroadcastss {{.*}}(%rip), %xmm1
+; AVX512-NEXT: vandnps %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: retq
+ %xor = xor <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>
+ %and = and <4 x i32> %xor, <i32 1, i32 1, i32 1, i32 1>
+ ret <4 x i32> %and
+}
+
+define <4 x i64> @and_xor_splat1_v4i64(<4 x i64> %x) nounwind {
+; AVX-LABEL: and_xor_splat1_v4i64:
+; AVX: # BB#0:
+; AVX-NEXT: vandnps {{.*}}(%rip), %ymm0, %ymm0
+; AVX-NEXT: retq
+;
+; AVX512-LABEL: and_xor_splat1_v4i64:
+; AVX512: # BB#0:
+; AVX512-NEXT: vbroadcastsd {{.*}}(%rip), %ymm1
+; AVX512-NEXT: vandnps %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: retq
+ %xor = xor <4 x i64> %x, <i64 1, i64 1, i64 1, i64 1>
+ %and = and <4 x i64> %xor, <i64 1, i64 1, i64 1, i64 1>
+ ret <4 x i64> %and
+}
+
diff --git a/test/CodeGen/X86/avx512-ext.ll b/test/CodeGen/X86/avx512-ext.ll
index 796ee83b6fa7..b31b00e54e83 100644
--- a/test/CodeGen/X86/avx512-ext.ll
+++ b/test/CodeGen/X86/avx512-ext.ll
@@ -542,7 +542,7 @@ define <4 x i64> @zext_4x8mem_to_4x64(<4 x i8> *%i , <4 x i1> %mask) nounwind re
; KNL: ## BB#0:
; KNL-NEXT: vpslld $31, %xmm0, %xmm0
; KNL-NEXT: vpsrad $31, %xmm0, %xmm0
-; KNL-NEXT: vpmovsxdq %xmm0, %ymm0
+; KNL-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
; KNL-NEXT: vpmovzxbq {{.*#+}} ymm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero,mem[2],zero,zero,zero,zero,zero,zero,zero,mem[3],zero,zero,zero,zero,zero,zero,zero
; KNL-NEXT: vpand %ymm1, %ymm0, %ymm0
; KNL-NEXT: retq
@@ -923,7 +923,7 @@ define <4 x i64> @zext_4x16mem_to_4x64(<4 x i16> *%i , <4 x i1> %mask) nounwind
; KNL: ## BB#0:
; KNL-NEXT: vpslld $31, %xmm0, %xmm0
; KNL-NEXT: vpsrad $31, %xmm0, %xmm0
-; KNL-NEXT: vpmovsxdq %xmm0, %ymm0
+; KNL-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
; KNL-NEXT: vpmovzxwq {{.*#+}} ymm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
; KNL-NEXT: vpand %ymm1, %ymm0, %ymm0
; KNL-NEXT: retq
@@ -1110,7 +1110,7 @@ define <4 x i64> @zext_4x32mem_to_4x64(<4 x i32> *%i , <4 x i1> %mask) nounwind
; KNL: ## BB#0:
; KNL-NEXT: vpslld $31, %xmm0, %xmm0
; KNL-NEXT: vpsrad $31, %xmm0, %xmm0
-; KNL-NEXT: vpmovsxdq %xmm0, %ymm0
+; KNL-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
; KNL-NEXT: vpmovzxdq {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
; KNL-NEXT: vpand %ymm1, %ymm0, %ymm0
; KNL-NEXT: retq
@@ -1173,7 +1173,7 @@ define <4 x i64> @zext_4x32_to_4x64mask(<4 x i32> %a , <4 x i1> %mask) nounwind
; KNL: ## BB#0:
; KNL-NEXT: vpslld $31, %xmm1, %xmm1
; KNL-NEXT: vpsrad $31, %xmm1, %xmm1
-; KNL-NEXT: vpmovsxdq %xmm1, %ymm1
+; KNL-NEXT: vpmovzxdq {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
; KNL-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
; KNL-NEXT: vpand %ymm0, %ymm1, %ymm0
; KNL-NEXT: retq
diff --git a/test/CodeGen/X86/avx512-mask-op.ll b/test/CodeGen/X86/avx512-mask-op.ll
index aec1339d653d..7103efe050a4 100644
--- a/test/CodeGen/X86/avx512-mask-op.ll
+++ b/test/CodeGen/X86/avx512-mask-op.ll
@@ -1430,7 +1430,8 @@ define void @store_v1i1(<1 x i1> %c , <1 x i1>* %ptr) {
define void @store_v2i1(<2 x i1> %c , <2 x i1>* %ptr) {
; KNL-LABEL: store_v2i1:
; KNL: ## BB#0:
-; KNL-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
+; KNL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; KNL-NEXT: vpxor %xmm1, %xmm0, %xmm0
; KNL-NEXT: vpsllq $63, %zmm0, %zmm0
; KNL-NEXT: vptestmq %zmm0, %zmm0, %k0
; KNL-NEXT: kmovw %k0, %eax
@@ -1447,7 +1448,8 @@ define void @store_v2i1(<2 x i1> %c , <2 x i1>* %ptr) {
;
; AVX512BW-LABEL: store_v2i1:
; AVX512BW: ## BB#0:
-; AVX512BW-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
+; AVX512BW-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX512BW-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX512BW-NEXT: vpsllq $63, %zmm0, %zmm0
; AVX512BW-NEXT: vptestmq %zmm0, %zmm0, %k0
; AVX512BW-NEXT: kmovd %k0, %eax
@@ -1457,7 +1459,8 @@ define void @store_v2i1(<2 x i1> %c , <2 x i1>* %ptr) {
;
; AVX512DQ-LABEL: store_v2i1:
; AVX512DQ: ## BB#0:
-; AVX512DQ-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
+; AVX512DQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX512DQ-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX512DQ-NEXT: vpsllq $63, %zmm0, %zmm0
; AVX512DQ-NEXT: vptestmq %zmm0, %zmm0, %k0
; AVX512DQ-NEXT: kmovb %k0, (%rdi)
@@ -1471,7 +1474,7 @@ define void @store_v2i1(<2 x i1> %c , <2 x i1>* %ptr) {
define void @store_v4i1(<4 x i1> %c , <4 x i1>* %ptr) {
; KNL-LABEL: store_v4i1:
; KNL: ## BB#0:
-; KNL-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1
+; KNL-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; KNL-NEXT: vpxor %xmm1, %xmm0, %xmm0
; KNL-NEXT: vpslld $31, %ymm0, %ymm0
; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0
@@ -1489,7 +1492,7 @@ define void @store_v4i1(<4 x i1> %c , <4 x i1>* %ptr) {
;
; AVX512BW-LABEL: store_v4i1:
; AVX512BW: ## BB#0:
-; AVX512BW-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1
+; AVX512BW-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX512BW-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX512BW-NEXT: vpslld $31, %ymm0, %ymm0
; AVX512BW-NEXT: vptestmd %zmm0, %zmm0, %k0
@@ -1500,7 +1503,7 @@ define void @store_v4i1(<4 x i1> %c , <4 x i1>* %ptr) {
;
; AVX512DQ-LABEL: store_v4i1:
; AVX512DQ: ## BB#0:
-; AVX512DQ-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1
+; AVX512DQ-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX512DQ-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX512DQ-NEXT: vpslld $31, %ymm0, %ymm0
; AVX512DQ-NEXT: vptestmd %zmm0, %zmm0, %k0
diff --git a/test/CodeGen/X86/bswap_tree.ll b/test/CodeGen/X86/bswap_tree.ll
new file mode 100644
index 000000000000..35a28af85579
--- /dev/null
+++ b/test/CodeGen/X86/bswap_tree.ll
@@ -0,0 +1,105 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=CHECK64
+
+; Check reconstructing bswap from shifted masks and tree of ORs
+
+; Match a 32-bit packed halfword bswap. That is
+; ((x & 0x000000ff) << 8) |
+; ((x & 0x0000ff00) >> 8) |
+; ((x & 0x00ff0000) << 8) |
+; ((x & 0xff000000) >> 8)
+; => (rotl (bswap x), 16)
+define i32 @test1(i32 %x) nounwind {
+; CHECK-LABEL: test1:
+; CHECK: # BB#0:
+; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; CHECK-NEXT: movl %ecx, %edx
+; CHECK-NEXT: andl $16711680, %edx # imm = 0xFF0000
+; CHECK-NEXT: movl %ecx, %eax
+; CHECK-NEXT: andl $-16777216, %eax # imm = 0xFF000000
+; CHECK-NEXT: shll $8, %edx
+; CHECK-NEXT: shrl $8, %eax
+; CHECK-NEXT: bswapl %ecx
+; CHECK-NEXT: shrl $16, %ecx
+; CHECK-NEXT: orl %edx, %eax
+; CHECK-NEXT: orl %ecx, %eax
+; CHECK-NEXT: retl
+;
+; CHECK64-LABEL: test1:
+; CHECK64: # BB#0:
+; CHECK64-NEXT: # kill: %EDI<def> %EDI<kill> %RDI<def>
+; CHECK64-NEXT: movl %edi, %eax
+; CHECK64-NEXT: andl $16711680, %eax # imm = 0xFF0000
+; CHECK64-NEXT: movl %edi, %ecx
+; CHECK64-NEXT: andl $-16777216, %ecx # imm = 0xFF000000
+; CHECK64-NEXT: shll $8, %eax
+; CHECK64-NEXT: shrl $8, %ecx
+; CHECK64-NEXT: bswapl %edi
+; CHECK64-NEXT: shrl $16, %edi
+; CHECK64-NEXT: orl %eax, %ecx
+; CHECK64-NEXT: leal (%rcx,%rdi), %eax
+; CHECK64-NEXT: retq
+ %byte0 = and i32 %x, 255 ; 0x000000ff
+ %byte1 = and i32 %x, 65280 ; 0x0000ff00
+ %byte2 = and i32 %x, 16711680 ; 0x00ff0000
+ %byte3 = and i32 %x, 4278190080 ; 0xff000000
+ %tmp0 = shl i32 %byte0, 8
+ %tmp1 = lshr i32 %byte1, 8
+ %tmp2 = shl i32 %byte2, 8
+ %tmp3 = lshr i32 %byte3, 8
+ %or0 = or i32 %tmp0, %tmp1
+ %or1 = or i32 %tmp2, %tmp3
+ %result = or i32 %or0, %or1
+ ret i32 %result
+}
+
+; the same as test1, just shifts before the "and"
+; ((x << 8) & 0x0000ff00) |
+; ((x >> 8) & 0x000000ff) |
+; ((x << 8) & 0xff000000) |
+; ((x >> 8) & 0x00ff0000)
+define i32 @test2(i32 %x) nounwind {
+; CHECK-LABEL: test2:
+; CHECK: # BB#0:
+; CHECK-NEXT: pushl %esi
+; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
+; CHECK-NEXT: movl %eax, %ecx
+; CHECK-NEXT: shll $8, %ecx
+; CHECK-NEXT: shrl $8, %eax
+; CHECK-NEXT: movzwl %cx, %edx
+; CHECK-NEXT: movzbl %al, %esi
+; CHECK-NEXT: andl $-16777216, %ecx # imm = 0xFF000000
+; CHECK-NEXT: andl $16711680, %eax # imm = 0xFF0000
+; CHECK-NEXT: orl %edx, %esi
+; CHECK-NEXT: orl %ecx, %eax
+; CHECK-NEXT: orl %esi, %eax
+; CHECK-NEXT: popl %esi
+; CHECK-NEXT: retl
+;
+; CHECK64-LABEL: test2:
+; CHECK64: # BB#0:
+; CHECK64-NEXT: movl %edi, %ecx
+; CHECK64-NEXT: shll $8, %ecx
+; CHECK64-NEXT: shrl $8, %edi
+; CHECK64-NEXT: movzwl %cx, %edx
+; CHECK64-NEXT: movzbl %dil, %eax
+; CHECK64-NEXT: andl $-16777216, %ecx # imm = 0xFF000000
+; CHECK64-NEXT: andl $16711680, %edi # imm = 0xFF0000
+; CHECK64-NEXT: orl %edx, %eax
+; CHECK64-NEXT: orl %ecx, %edi
+; CHECK64-NEXT: orl %edi, %eax
+; CHECK64-NEXT: retq
+ %byte1 = shl i32 %x, 8
+ %byte0 = lshr i32 %x, 8
+ %byte3 = shl i32 %x, 8
+ %byte2 = lshr i32 %x, 8
+ %tmp1 = and i32 %byte1, 65280 ; 0x0000ff00
+ %tmp0 = and i32 %byte0, 255 ; 0x000000ff
+ %tmp3 = and i32 %byte3, 4278190080 ; 0xff000000
+ %tmp2 = and i32 %byte2, 16711680 ; 0x00ff0000
+ %or0 = or i32 %tmp0, %tmp1
+ %or1 = or i32 %tmp2, %tmp3
+ %result = or i32 %or0, %or1
+ ret i32 %result
+}
diff --git a/test/CodeGen/X86/bswap_tree2.ll b/test/CodeGen/X86/bswap_tree2.ll
new file mode 100644
index 000000000000..a9c74df9d0d9
--- /dev/null
+++ b/test/CodeGen/X86/bswap_tree2.ll
@@ -0,0 +1,150 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=CHECK64
+
+; Check a few invalid patterns for halfword bswap pattern matching
+
+; Don't match a near-miss 32-bit packed halfword bswap
+; (with only half of the swap tree valid).
+ define i32 @test1(i32 %x) nounwind {
+; CHECK-LABEL: test1:
+; CHECK: # BB#0:
+; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; CHECK-NEXT: movl %ecx, %edx
+; CHECK-NEXT: andl $16711680, %edx # imm = 0xFF0000
+; CHECK-NEXT: movl %ecx, %eax
+; CHECK-NEXT: orl $-16777216, %eax # imm = 0xFF000000
+; CHECK-NEXT: shll $8, %edx
+; CHECK-NEXT: shrl $8, %eax
+; CHECK-NEXT: bswapl %ecx
+; CHECK-NEXT: shrl $16, %ecx
+; CHECK-NEXT: orl %edx, %eax
+; CHECK-NEXT: orl %ecx, %eax
+; CHECK-NEXT: retl
+;
+; CHECK64-LABEL: test1:
+; CHECK64: # BB#0:
+; CHECK64-NEXT: movl %edi, %ecx
+; CHECK64-NEXT: andl $16711680, %ecx # imm = 0xFF0000
+; CHECK64-NEXT: movl %edi, %eax
+; CHECK64-NEXT: orl $-16777216, %eax # imm = 0xFF000000
+; CHECK64-NEXT: shll $8, %ecx
+; CHECK64-NEXT: shrl $8, %eax
+; CHECK64-NEXT: bswapl %edi
+; CHECK64-NEXT: shrl $16, %edi
+; CHECK64-NEXT: orl %ecx, %eax
+; CHECK64-NEXT: orl %edi, %eax
+; CHECK64-NEXT: retq
+ %byte0 = and i32 %x, 255 ; 0x000000ff
+ %byte1 = and i32 %x, 65280 ; 0x0000ff00
+ %byte2 = and i32 %x, 16711680 ; 0x00ff0000
+ %byte3 = or i32 %x, 4278190080 ; 0xff000000
+ %tmp0 = shl i32 %byte0, 8
+ %tmp1 = lshr i32 %byte1, 8
+ %tmp2 = shl i32 %byte2, 8
+ %tmp3 = lshr i32 %byte3, 8
+ %or0 = or i32 %tmp0, %tmp1
+ %or1 = or i32 %tmp2, %tmp3
+ %result = or i32 %or0, %or1
+ ret i32 %result
+}
+
+; Don't match a near-miss 32-bit packed halfword bswap
+; (with swapped lshr/shl)
+; ((x >> 8) & 0x0000ff00) |
+; ((x << 8) & 0x000000ff) |
+; ((x << 8) & 0xff000000) |
+; ((x >> 8) & 0x00ff0000)
+define i32 @test2(i32 %x) nounwind {
+; CHECK-LABEL: test2:
+; CHECK: # BB#0:
+; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; CHECK-NEXT: movl %ecx, %eax
+; CHECK-NEXT: shrl $8, %eax
+; CHECK-NEXT: shll $8, %ecx
+; CHECK-NEXT: movl %eax, %edx
+; CHECK-NEXT: andl $65280, %edx # imm = 0xFF00
+; CHECK-NEXT: andl $-16777216, %ecx # imm = 0xFF000000
+; CHECK-NEXT: andl $16711680, %eax # imm = 0xFF0000
+; CHECK-NEXT: orl %ecx, %eax
+; CHECK-NEXT: orl %edx, %eax
+; CHECK-NEXT: retl
+;
+; CHECK64-LABEL: test2:
+; CHECK64: # BB#0:
+; CHECK64-NEXT: movl %edi, %eax
+; CHECK64-NEXT: shrl $8, %eax
+; CHECK64-NEXT: shll $8, %edi
+; CHECK64-NEXT: movl %eax, %ecx
+; CHECK64-NEXT: andl $65280, %ecx # imm = 0xFF00
+; CHECK64-NEXT: andl $-16777216, %edi # imm = 0xFF000000
+; CHECK64-NEXT: andl $16711680, %eax # imm = 0xFF0000
+; CHECK64-NEXT: orl %edi, %eax
+; CHECK64-NEXT: leal (%rax,%rcx), %eax
+; CHECK64-NEXT: retq
+ %byte1 = lshr i32 %x, 8
+ %byte0 = shl i32 %x, 8
+ %byte3 = shl i32 %x, 8
+ %byte2 = lshr i32 %x, 8
+ %tmp1 = and i32 %byte1, 65280 ; 0x0000ff00
+ %tmp0 = and i32 %byte0, 255 ; 0x000000ff
+ %tmp3 = and i32 %byte3, 4278190080 ; 0xff000000
+ %tmp2 = and i32 %byte2, 16711680 ; 0x00ff0000
+ %or0 = or i32 %tmp0, %tmp1
+ %or1 = or i32 %tmp2, %tmp3
+ %result = or i32 %or0, %or1
+ ret i32 %result
+}
+
+; Invalid pattern involving a unary op
+define i32 @test3(float %x) nounwind {
+; CHECK-LABEL: test3:
+; CHECK: # BB#0:
+; CHECK-NEXT: subl $8, %esp
+; CHECK-NEXT: flds {{[0-9]+}}(%esp)
+; CHECK-NEXT: fnstcw {{[0-9]+}}(%esp)
+; CHECK-NEXT: movzwl {{[0-9]+}}(%esp), %eax
+; CHECK-NEXT: movw $3199, {{[0-9]+}}(%esp) # imm = 0xC7F
+; CHECK-NEXT: fldcw {{[0-9]+}}(%esp)
+; CHECK-NEXT: movw %ax, {{[0-9]+}}(%esp)
+; CHECK-NEXT: fistpl {{[0-9]+}}(%esp)
+; CHECK-NEXT: fldcw {{[0-9]+}}(%esp)
+; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; CHECK-NEXT: movl %ecx, %edx
+; CHECK-NEXT: shll $8, %edx
+; CHECK-NEXT: movl %ecx, %eax
+; CHECK-NEXT: shrl $8, %eax
+; CHECK-NEXT: andl $65280, %ecx # imm = 0xFF00
+; CHECK-NEXT: andl $-16777216, %edx # imm = 0xFF000000
+; CHECK-NEXT: andl $16711680, %eax # imm = 0xFF0000
+; CHECK-NEXT: orl %edx, %eax
+; CHECK-NEXT: orl %ecx, %eax
+; CHECK-NEXT: addl $8, %esp
+; CHECK-NEXT: retl
+;
+; CHECK64-LABEL: test3:
+; CHECK64: # BB#0:
+; CHECK64-NEXT: cvttss2si %xmm0, %ecx
+; CHECK64-NEXT: movl %ecx, %edx
+; CHECK64-NEXT: shll $8, %edx
+; CHECK64-NEXT: movl %ecx, %eax
+; CHECK64-NEXT: shrl $8, %eax
+; CHECK64-NEXT: andl $65280, %ecx # imm = 0xFF00
+; CHECK64-NEXT: andl $-16777216, %edx # imm = 0xFF000000
+; CHECK64-NEXT: andl $16711680, %eax # imm = 0xFF0000
+; CHECK64-NEXT: orl %edx, %eax
+; CHECK64-NEXT: orl %ecx, %eax
+; CHECK64-NEXT: retq
+ %integer = fptosi float %x to i32
+ %byte0 = shl i32 %integer, 8
+ %byte3 = shl i32 %integer, 8
+ %byte2 = lshr i32 %integer, 8
+ %tmp1 = and i32 %integer, 65280 ; 0x0000ff00
+ %tmp0 = and i32 %byte0, 255 ; 0x000000ff
+ %tmp3 = and i32 %byte3, 4278190080 ; 0xff000000
+ %tmp2 = and i32 %byte2, 16711680 ; 0x00ff0000
+ %or0 = or i32 %tmp0, %tmp1
+ %or1 = or i32 %tmp2, %tmp3
+ %result = or i32 %or0, %or1
+ ret i32 %result
+}
diff --git a/test/CodeGen/X86/combine-or.ll b/test/CodeGen/X86/combine-or.ll
index e4cf296432ba..d7f52d247988 100644
--- a/test/CodeGen/X86/combine-or.ll
+++ b/test/CodeGen/X86/combine-or.ll
@@ -430,6 +430,7 @@ define <4 x i32> @test2f(<4 x i32> %a, <4 x i32> %b) {
ret <4 x i32> %or
}
+; TODO: Why would we do this?
; (or (and X, c1), c2) -> (and (or X, c2), c1|c2)
define <2 x i64> @or_and_v2i64(<2 x i64> %a0) {
@@ -438,16 +439,17 @@ define <2 x i64> @or_and_v2i64(<2 x i64> %a0) {
; CHECK-NEXT: andps {{.*}}(%rip), %xmm0
; CHECK-NEXT: orps {{.*}}(%rip), %xmm0
; CHECK-NEXT: retq
- %1 = and <2 x i64> %a0, <i64 1, i64 1>
+ %1 = and <2 x i64> %a0, <i64 7, i64 7>
%2 = or <2 x i64> %1, <i64 3, i64 3>
ret <2 x i64> %2
}
+; If all masked bits are going to be set, that's a constant fold.
+
define <4 x i32> @or_and_v4i32(<4 x i32> %a0) {
; CHECK-LABEL: or_and_v4i32:
; CHECK: # BB#0:
-; CHECK-NEXT: andps {{.*}}(%rip), %xmm0
-; CHECK-NEXT: orps {{.*}}(%rip), %xmm0
+; CHECK-NEXT: movaps {{.*#+}} xmm0 = [3,3,3,3]
; CHECK-NEXT: retq
%1 = and <4 x i32> %a0, <i32 1, i32 1, i32 1, i32 1>
%2 = or <4 x i32> %1, <i32 3, i32 3, i32 3, i32 3>
@@ -459,9 +461,7 @@ define <4 x i32> @or_and_v4i32(<4 x i32> %a0) {
define <2 x i64> @or_zext_v2i32(<2 x i32> %a0) {
; CHECK-LABEL: or_zext_v2i32:
; CHECK: # BB#0:
-; CHECK-NEXT: pxor %xmm1, %xmm1
-; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
-; CHECK-NEXT: por {{.*}}(%rip), %xmm0
+; CHECK-NEXT: movaps {{.*#+}} xmm0 = [4294967295,4294967295]
; CHECK-NEXT: retq
%1 = zext <2 x i32> %a0 to <2 x i64>
%2 = or <2 x i64> %1, <i64 4294967295, i64 4294967295>
@@ -471,9 +471,7 @@ define <2 x i64> @or_zext_v2i32(<2 x i32> %a0) {
define <4 x i32> @or_zext_v4i16(<4 x i16> %a0) {
; CHECK-LABEL: or_zext_v4i16:
; CHECK: # BB#0:
-; CHECK-NEXT: pxor %xmm1, %xmm1
-; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
-; CHECK-NEXT: por {{.*}}(%rip), %xmm0
+; CHECK-NEXT: movaps {{.*#+}} xmm0 = [65535,65535,65535,65535]
; CHECK-NEXT: retq
%1 = zext <4 x i16> %a0 to <4 x i32>
%2 = or <4 x i32> %1, <i32 65535, i32 65535, i32 65535, i32 65535>
diff --git a/test/CodeGen/X86/dbg-baseptr.ll b/test/CodeGen/X86/dbg-baseptr.ll
new file mode 100644
index 000000000000..f69c78af7367
--- /dev/null
+++ b/test/CodeGen/X86/dbg-baseptr.ll
@@ -0,0 +1,75 @@
+; RUN: llc -o - %s | FileCheck %s
+; This test checks that parameters on the stack pointer are correctly
+; referenced by debug info.
+target triple = "x86_64--"
+
+@glob = external global i64
+@ptr = external global i32*
+%struct.s = type { i32, i32, i32, i32, i32 }
+
+; CHECK-LABEL: f0:
+; CHECK: DEBUG_VALUE: f:input <- [%RSP+8]
+define i32 @f0(%struct.s* byval align 8 %input) !dbg !8 {
+ call void @llvm.dbg.declare(metadata %struct.s* %input, metadata !4, metadata !17), !dbg !18
+ ret i32 42
+}
+
+; CHECK-LABEL: f1:
+; CHECK: DEBUG_VALUE: f:input <- [%RBP+16]
+define i32 @f1(%struct.s* byval align 8 %input) !dbg !8 {
+ %val = load i64, i64* @glob
+ ; this alloca should force FP usage.
+ %stackspace = alloca i32, i64 %val, align 1
+ store i32* %stackspace, i32** @ptr
+ call void @llvm.dbg.declare(metadata %struct.s* %input, metadata !4, metadata !17), !dbg !18
+ ret i32 42
+}
+
+; CHECK-LABEL: f2:
+; Just check that we are indeed aligning the stack and setting up a base pointer
+; in RBX.
+; CHECK: pushq %rbp
+; CHECK: movq %rsp, %rbp
+; CHECK: pushq %rbx
+; CHECK: andq $-64, %rsp
+; CHECK: subq $64, %rsp
+; CHECK: movq %rsp, %rbx
+; The parameter should still be referenced through RBP though.
+; CHECK-NOT: DEBUG_VALUE: f:input <- [%RBX
+; CHECK: DEBUG_VALUE: f:input <- [%RBP+16]
+define i32 @f2(%struct.s* byval align 8 %input) !dbg !8 {
+ %val = load i64, i64* @glob
+ %stackspace = alloca i32, i64 %val, align 64
+ store i32* %stackspace, i32** @ptr
+ call void @llvm.dbg.declare(metadata %struct.s* %input, metadata !4, metadata !17), !dbg !18
+ ret i32 42
+}
+
+declare void @llvm.dbg.declare(metadata, metadata, metadata)
+
+!llvm.dbg.cu = !{!2}
+!llvm.module.flags = !{!0, !1}
+
+!0 = !{i32 2, !"Dwarf Version", i32 4}
+!1 = !{i32 2, !"Debug Info Version", i32 3}
+!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3)
+!3 = !DIFile(filename: "dbg-baseptr.ll", directory: "/")
+!4 = !DILocalVariable(name: "input", arg: 1, scope: !8, file: !3, line: 5, type: !9)
+!5 = !{}
+
+!6 = !DISubroutineType(types: !7)
+!7 = !{!10, !9}
+
+!8 = distinct !DISubprogram(name: "f", file: !3, line: 5, type: !6, isLocal: false, isDefinition: true, flags: DIFlagPrototyped, unit: !2, variables: !5)
+
+!9 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "s", elements: !11)
+!10 = !DIBasicType(name: "unsigned int", size: 32, encoding: DW_ATE_unsigned)
+!11 = !{!12, !13, !14, !15, !16}
+!12 = !DIDerivedType(tag: DW_TAG_member, name: "a", baseType: !10, size: 32)
+!13 = !DIDerivedType(tag: DW_TAG_member, name: "b", baseType: !10, size: 32, offset: 32)
+!14 = !DIDerivedType(tag: DW_TAG_member, name: "c", baseType: !10, size: 32, offset: 64)
+!15 = !DIDerivedType(tag: DW_TAG_member, name: "d", baseType: !10, size: 32, offset: 96)
+!16 = !DIDerivedType(tag: DW_TAG_member, name: "e", baseType: !10, size: 32, offset: 128)
+
+!17 = !DIExpression()
+!18 = !DILocation(line: 5, scope: !8)
diff --git a/test/CodeGen/X86/extract-store.ll b/test/CodeGen/X86/extract-store.ll
index 1751f03731d3..5286a1b635d1 100644
--- a/test/CodeGen/X86/extract-store.ll
+++ b/test/CodeGen/X86/extract-store.ll
@@ -5,6 +5,10 @@
; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X64 --check-prefix=SSE-X64 --check-prefix=SSE41-X64
; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx | FileCheck %s --check-prefix=X32 --check-prefix=AVX-X32
; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=X64 --check-prefix=AVX-X64
+; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+mmx -enable-legalize-types-checking \
+; RUN: | FileCheck %s --check-prefix=X64 --check-prefix=SSE-X64 --check-prefix=SSE-F128
+; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+mmx -enable-legalize-types-checking \
+; RUN: | FileCheck %s --check-prefix=X64 --check-prefix=SSE-X64 --check-prefix=SSE-F128
define void @extract_i8_0(i8* nocapture %dst, <16 x i8> %foo) nounwind {
; SSE2-X32-LABEL: extract_i8_0:
@@ -458,6 +462,26 @@ define void @extract_f64_1(double* nocapture %dst, <2 x double> %foo) nounwind {
ret void
}
+define void @extract_f128_0(fp128* nocapture %dst, <2 x fp128> %foo) nounwind {
+; SSE-F128-LABEL: extract_f128_0:
+; SSE-F128: # BB#0:
+; SSE-F128-NEXT: movaps %xmm0, (%rdi)
+; SSE-F128-NEXT: retq
+ %vecext = extractelement <2 x fp128> %foo, i32 0
+ store fp128 %vecext, fp128* %dst, align 1
+ ret void
+}
+
+define void @extract_f128_1(fp128* nocapture %dst, <2 x fp128> %foo) nounwind {
+; SSE-F128-LABEL: extract_f128_1:
+; SSE-F128: # BB#0:
+; SSE-F128-NEXT: movaps %xmm1, (%rdi)
+; SSE-F128-NEXT: retq
+ %vecext = extractelement <2 x fp128> %foo, i32 1
+ store fp128 %vecext, fp128* %dst, align 1
+ ret void
+}
+
define void @extract_i8_undef(i8* nocapture %dst, <16 x i8> %foo) nounwind {
; X32-LABEL: extract_i8_undef:
; X32: # BB#0:
@@ -535,3 +559,16 @@ define void @extract_f64_undef(double* nocapture %dst, <2 x double> %foo) nounwi
store double %vecext, double* %dst, align 1
ret void
}
+
+define void @extract_f128_undef(fp128* nocapture %dst, <2 x fp128> %foo) nounwind {
+; X32-LABEL: extract_f128_undef:
+; X32: # BB#0:
+; X32-NEXT: retl
+;
+; X64-LABEL: extract_f128_undef:
+; X64: # BB#0:
+; X64-NEXT: retq
+ %vecext = extractelement <2 x fp128> %foo, i32 2 ; undef
+ store fp128 %vecext, fp128* %dst, align 1
+ ret void
+}
diff --git a/test/CodeGen/X86/fp128-extract.ll b/test/CodeGen/X86/fp128-extract.ll
new file mode 100644
index 000000000000..5006ac898c71
--- /dev/null
+++ b/test/CodeGen/X86/fp128-extract.ll
@@ -0,0 +1,22 @@
+; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+mmx \
+; RUN: -enable-legalize-types-checking | FileCheck %s
+; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+mmx \
+; RUN: -enable-legalize-types-checking | FileCheck %s
+
+; Test the softened result of extractelement op code.
+define fp128 @TestExtract(<2 x double> %x) {
+entry:
+ ; Simplified instruction pattern from the output of llvm before r289042,
+ ; for a boost function ...::insert<...>::traverse<...>().
+ %a = fpext <2 x double> %x to <2 x fp128>
+ %0 = extractelement <2 x fp128> %a, i32 0
+ %1 = extractelement <2 x fp128> %a, i32 1
+ %2 = fmul fp128 %0, %1
+ ret fp128 %2
+; CHECK-LABEL: TestExtract:
+; CHECK: movaps %xmm0, (%rsp)
+; CHECK: callq __extenddftf2
+; CHECK: callq __extenddftf2
+; CHECK: callq __multf3
+; CHECK: retq
+}
diff --git a/test/CodeGen/X86/i64-to-float.ll b/test/CodeGen/X86/i64-to-float.ll
index da92bdb55d7c..3da1a360e290 100644
--- a/test/CodeGen/X86/i64-to-float.ll
+++ b/test/CodeGen/X86/i64-to-float.ll
@@ -224,36 +224,32 @@ define <2 x double> @clamp_sitofp_2i64_2f64(<2 x i64> %a) nounwind {
; X64-SSE-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,0,2147483648,0]
; X64-SSE-NEXT: movdqa %xmm0, %xmm2
; X64-SSE-NEXT: pxor %xmm1, %xmm2
-; X64-SSE-NEXT: movdqa {{.*#+}} xmm3 = [18446744073709551361,18446744073709551361]
-; X64-SSE-NEXT: movdqa %xmm1, %xmm4
-; X64-SSE-NEXT: pxor %xmm3, %xmm4
-; X64-SSE-NEXT: movdqa %xmm4, %xmm5
-; X64-SSE-NEXT: pcmpgtd %xmm2, %xmm5
-; X64-SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; X64-SSE-NEXT: pcmpeqd %xmm2, %xmm4
-; X64-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X64-SSE-NEXT: pand %xmm6, %xmm2
-; X64-SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
-; X64-SSE-NEXT: por %xmm2, %xmm4
-; X64-SSE-NEXT: movdqa %xmm4, %xmm2
+; X64-SSE-NEXT: movdqa {{.*#+}} xmm3 = [18446744071562067713,18446744071562067713]
+; X64-SSE-NEXT: movdqa %xmm3, %xmm4
+; X64-SSE-NEXT: pcmpgtd %xmm2, %xmm4
+; X64-SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X64-SSE-NEXT: pcmpeqd %xmm3, %xmm2
+; X64-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
+; X64-SSE-NEXT: pand %xmm5, %xmm2
+; X64-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; X64-SSE-NEXT: por %xmm2, %xmm3
+; X64-SSE-NEXT: movdqa %xmm3, %xmm2
; X64-SSE-NEXT: pandn %xmm0, %xmm2
-; X64-SSE-NEXT: pand %xmm3, %xmm4
-; X64-SSE-NEXT: por %xmm2, %xmm4
-; X64-SSE-NEXT: movdqa %xmm4, %xmm0
-; X64-SSE-NEXT: pxor %xmm1, %xmm0
-; X64-SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255]
-; X64-SSE-NEXT: pxor %xmm2, %xmm1
-; X64-SSE-NEXT: movdqa %xmm0, %xmm3
-; X64-SSE-NEXT: pcmpgtd %xmm1, %xmm3
-; X64-SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
+; X64-SSE-NEXT: pand {{.*}}(%rip), %xmm3
+; X64-SSE-NEXT: por %xmm2, %xmm3
+; X64-SSE-NEXT: pxor %xmm3, %xmm1
+; X64-SSE-NEXT: movdqa {{.*#+}} xmm0 = [2147483903,2147483903]
+; X64-SSE-NEXT: movdqa %xmm1, %xmm2
+; X64-SSE-NEXT: pcmpgtd %xmm0, %xmm2
+; X64-SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm1
; X64-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
-; X64-SSE-NEXT: pand %xmm5, %xmm0
-; X64-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
+; X64-SSE-NEXT: pand %xmm4, %xmm0
+; X64-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
; X64-SSE-NEXT: por %xmm0, %xmm1
; X64-SSE-NEXT: movdqa %xmm1, %xmm0
-; X64-SSE-NEXT: pandn %xmm4, %xmm0
-; X64-SSE-NEXT: pand %xmm2, %xmm1
+; X64-SSE-NEXT: pandn %xmm3, %xmm0
+; X64-SSE-NEXT: pand {{.*}}(%rip), %xmm1
; X64-SSE-NEXT: por %xmm0, %xmm1
; X64-SSE-NEXT: movd %xmm1, %rax
; X64-SSE-NEXT: xorps %xmm0, %xmm0
diff --git a/test/CodeGen/X86/known-signbits-vector.ll b/test/CodeGen/X86/known-signbits-vector.ll
index cea9ac26edbc..4c3c8bbd793e 100644
--- a/test/CodeGen/X86/known-signbits-vector.ll
+++ b/test/CodeGen/X86/known-signbits-vector.ll
@@ -100,21 +100,27 @@ define float @signbits_ashr_extract_sitofp(<2 x i64> %a0) nounwind {
define float @signbits_ashr_insert_ashr_extract_sitofp(i64 %a0, i64 %a1) nounwind {
; X32-LABEL: signbits_ashr_insert_ashr_extract_sitofp:
; X32: # BB#0:
-; X32-NEXT: pushl %eax
-; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X32-NEXT: pushl %ebp
+; X32-NEXT: movl %esp, %ebp
+; X32-NEXT: andl $-8, %esp
+; X32-NEXT: subl $16, %esp
+; X32-NEXT: movl 8(%ebp), %eax
+; X32-NEXT: movl 12(%ebp), %ecx
; X32-NEXT: shrdl $30, %ecx, %eax
; X32-NEXT: sarl $30, %ecx
; X32-NEXT: vmovd %eax, %xmm0
; X32-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0
-; X32-NEXT: vpinsrd $2, {{[0-9]+}}(%esp), %xmm0, %xmm0
-; X32-NEXT: vpinsrd $3, {{[0-9]+}}(%esp), %xmm0, %xmm0
+; X32-NEXT: vpinsrd $2, 16(%ebp), %xmm0, %xmm0
+; X32-NEXT: vpinsrd $3, 20(%ebp), %xmm0, %xmm0
+; X32-NEXT: vpsrad $3, %xmm0, %xmm1
; X32-NEXT: vpsrlq $3, %xmm0, %xmm0
-; X32-NEXT: vmovd %xmm0, %eax
-; X32-NEXT: vcvtsi2ssl %eax, %xmm1, %xmm0
-; X32-NEXT: vmovss %xmm0, (%esp)
-; X32-NEXT: flds (%esp)
-; X32-NEXT: popl %eax
+; X32-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
+; X32-NEXT: vmovq %xmm0, {{[0-9]+}}(%esp)
+; X32-NEXT: fildll {{[0-9]+}}(%esp)
+; X32-NEXT: fstps {{[0-9]+}}(%esp)
+; X32-NEXT: flds {{[0-9]+}}(%esp)
+; X32-NEXT: movl %ebp, %esp
+; X32-NEXT: popl %ebp
; X32-NEXT: retl
;
; X64-LABEL: signbits_ashr_insert_ashr_extract_sitofp:
@@ -127,7 +133,7 @@ define float @signbits_ashr_insert_ashr_extract_sitofp(i64 %a0, i64 %a1) nounwin
; X64-NEXT: vpsrlq $3, %xmm0, %xmm0
; X64-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
; X64-NEXT: vmovq %xmm0, %rax
-; X64-NEXT: vcvtsi2ssl %eax, %xmm2, %xmm0
+; X64-NEXT: vcvtsi2ssq %rax, %xmm2, %xmm0
; X64-NEXT: retq
%1 = ashr i64 %a0, 30
%2 = insertelement <2 x i64> undef, i64 %1, i32 0
diff --git a/test/CodeGen/X86/madd.ll b/test/CodeGen/X86/madd.ll
index fdc5ace8d9bc..d332b2f3169f 100644
--- a/test/CodeGen/X86/madd.ll
+++ b/test/CodeGen/X86/madd.ll
@@ -1,27 +1,86 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE2
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX2
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX512
-;SSE2-label: @_Z10test_shortPsS_i
-;SSE2: movdqu
-;SSE2-NEXT: movdqu
-;SSE2-NEXT: pmaddwd
-;SSE2-NEXT: paddd
-
-;AVX2-label: @_Z10test_shortPsS_i
-;AVX2: vmovdqu
-;AVX2-NEXT: vpmaddwd
-;AVX2-NEXT: vinserti128
-;AVX2-NEXT: vpaddd
-
-;AVX512-label: @_Z10test_shortPsS_i
-;AVX512: vmovdqu
-;AVX512-NEXT: vpmaddwd
-;AVX512-NEXT: vinserti128
-;AVX512-NEXT: vpaddd
-
define i32 @_Z10test_shortPsS_i(i16* nocapture readonly, i16* nocapture readonly, i32) local_unnamed_addr #0 {
+; SSE2-LABEL: _Z10test_shortPsS_i:
+; SSE2: # BB#0: # %entry
+; SSE2-NEXT: movl %edx, %eax
+; SSE2-NEXT: pxor %xmm0, %xmm0
+; SSE2-NEXT: pxor %xmm1, %xmm1
+; SSE2-NEXT: .p2align 4, 0x90
+; SSE2-NEXT: .LBB0_1: # %vector.body
+; SSE2-NEXT: # =>This Inner Loop Header: Depth=1
+; SSE2-NEXT: movdqu (%rdi), %xmm2
+; SSE2-NEXT: movdqu (%rsi), %xmm3
+; SSE2-NEXT: pmaddwd %xmm2, %xmm3
+; SSE2-NEXT: paddd %xmm3, %xmm1
+; SSE2-NEXT: addq $16, %rsi
+; SSE2-NEXT: addq $16, %rdi
+; SSE2-NEXT: addq $-8, %rax
+; SSE2-NEXT: jne .LBB0_1
+; SSE2-NEXT: # BB#2: # %middle.block
+; SSE2-NEXT: paddd %xmm0, %xmm1
+; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
+; SSE2-NEXT: paddd %xmm1, %xmm0
+; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
+; SSE2-NEXT: paddd %xmm0, %xmm1
+; SSE2-NEXT: movd %xmm1, %eax
+; SSE2-NEXT: retq
+;
+; AVX2-LABEL: _Z10test_shortPsS_i:
+; AVX2: # BB#0: # %entry
+; AVX2-NEXT: movl %edx, %eax
+; AVX2-NEXT: vpxor %ymm0, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX2-NEXT: .p2align 4, 0x90
+; AVX2-NEXT: .LBB0_1: # %vector.body
+; AVX2-NEXT: # =>This Inner Loop Header: Depth=1
+; AVX2-NEXT: vmovdqu (%rsi), %xmm2
+; AVX2-NEXT: vpmaddwd (%rdi), %xmm2, %xmm2
+; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm2, %ymm2
+; AVX2-NEXT: vpaddd %ymm0, %ymm2, %ymm0
+; AVX2-NEXT: addq $16, %rsi
+; AVX2-NEXT: addq $16, %rdi
+; AVX2-NEXT: addq $-8, %rax
+; AVX2-NEXT: jne .LBB0_1
+; AVX2-NEXT: # BB#2: # %middle.block
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
+; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vphaddd %ymm0, %ymm0, %ymm0
+; AVX2-NEXT: vmovd %xmm0, %eax
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: _Z10test_shortPsS_i:
+; AVX512: # BB#0: # %entry
+; AVX512-NEXT: movl %edx, %eax
+; AVX512-NEXT: vpxor %ymm0, %ymm0, %ymm0
+; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX512-NEXT: .p2align 4, 0x90
+; AVX512-NEXT: .LBB0_1: # %vector.body
+; AVX512-NEXT: # =>This Inner Loop Header: Depth=1
+; AVX512-NEXT: vmovdqu (%rsi), %xmm2
+; AVX512-NEXT: vpmaddwd (%rdi), %xmm2, %xmm2
+; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm2, %ymm2
+; AVX512-NEXT: vpaddd %ymm0, %ymm2, %ymm0
+; AVX512-NEXT: addq $16, %rsi
+; AVX512-NEXT: addq $16, %rdi
+; AVX512-NEXT: addq $-8, %rax
+; AVX512-NEXT: jne .LBB0_1
+; AVX512-NEXT: # BB#2: # %middle.block
+; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
+; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
+; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vphaddd %ymm0, %ymm0, %ymm0
+; AVX512-NEXT: vmovd %xmm0, %eax
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
entry:
%3 = zext i32 %2 to i64
br label %vector.body
@@ -54,20 +113,227 @@ middle.block:
ret i32 %13
}
-;AVX2-label: @_Z9test_charPcS_i
-;AVX2: vpmovsxbw
-;AVX2-NEXT: vpmovsxbw
-;AVX2-NEXT: vpmaddwd
-;AVX2-NEXT: vpaddd
+define i32 @test_unsigned_short(i16* nocapture readonly, i16* nocapture readonly, i32) local_unnamed_addr #0 {
+; SSE2-LABEL: test_unsigned_short:
+; SSE2: # BB#0: # %entry
+; SSE2-NEXT: movl %edx, %eax
+; SSE2-NEXT: pxor %xmm0, %xmm0
+; SSE2-NEXT: pxor %xmm1, %xmm1
+; SSE2-NEXT: .p2align 4, 0x90
+; SSE2-NEXT: .LBB1_1: # %vector.body
+; SSE2-NEXT: # =>This Inner Loop Header: Depth=1
+; SSE2-NEXT: movdqu (%rdi), %xmm2
+; SSE2-NEXT: movdqu (%rsi), %xmm3
+; SSE2-NEXT: movdqa %xmm3, %xmm4
+; SSE2-NEXT: pmulhuw %xmm2, %xmm4
+; SSE2-NEXT: pmullw %xmm2, %xmm3
+; SSE2-NEXT: movdqa %xmm3, %xmm2
+; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
+; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
+; SSE2-NEXT: paddd %xmm3, %xmm1
+; SSE2-NEXT: paddd %xmm2, %xmm0
+; SSE2-NEXT: addq $16, %rsi
+; SSE2-NEXT: addq $16, %rdi
+; SSE2-NEXT: addq $-8, %rax
+; SSE2-NEXT: jne .LBB1_1
+; SSE2-NEXT: # BB#2: # %middle.block
+; SSE2-NEXT: paddd %xmm1, %xmm0
+; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
+; SSE2-NEXT: paddd %xmm0, %xmm1
+; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
+; SSE2-NEXT: paddd %xmm1, %xmm0
+; SSE2-NEXT: movd %xmm0, %eax
+; SSE2-NEXT: retq
+;
+; AVX2-LABEL: test_unsigned_short:
+; AVX2: # BB#0: # %entry
+; AVX2-NEXT: movl %edx, %eax
+; AVX2-NEXT: vpxor %ymm0, %ymm0, %ymm0
+; AVX2-NEXT: .p2align 4, 0x90
+; AVX2-NEXT: .LBB1_1: # %vector.body
+; AVX2-NEXT: # =>This Inner Loop Header: Depth=1
+; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
+; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
+; AVX2-NEXT: vpmulld %ymm1, %ymm2, %ymm1
+; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm0
+; AVX2-NEXT: addq $16, %rsi
+; AVX2-NEXT: addq $16, %rdi
+; AVX2-NEXT: addq $-8, %rax
+; AVX2-NEXT: jne .LBB1_1
+; AVX2-NEXT: # BB#2: # %middle.block
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
+; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vphaddd %ymm0, %ymm0, %ymm0
+; AVX2-NEXT: vmovd %xmm0, %eax
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_unsigned_short:
+; AVX512: # BB#0: # %entry
+; AVX512-NEXT: movl %edx, %eax
+; AVX512-NEXT: vpxor %ymm0, %ymm0, %ymm0
+; AVX512-NEXT: .p2align 4, 0x90
+; AVX512-NEXT: .LBB1_1: # %vector.body
+; AVX512-NEXT: # =>This Inner Loop Header: Depth=1
+; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
+; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm2 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
+; AVX512-NEXT: vpmulld %ymm1, %ymm2, %ymm1
+; AVX512-NEXT: vpaddd %ymm0, %ymm1, %ymm0
+; AVX512-NEXT: addq $16, %rsi
+; AVX512-NEXT: addq $16, %rdi
+; AVX512-NEXT: addq $-8, %rax
+; AVX512-NEXT: jne .LBB1_1
+; AVX512-NEXT: # BB#2: # %middle.block
+; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
+; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
+; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vphaddd %ymm0, %ymm0, %ymm0
+; AVX512-NEXT: vmovd %xmm0, %eax
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
+entry:
+ %3 = zext i32 %2 to i64
+ br label %vector.body
-;AVX512-label: @_Z9test_charPcS_i
-;AVX512: vpmovsxbw
-;AVX512-NEXT: vpmovsxbw
-;AVX512-NEXT: vpmaddwd
-;AVX512-NEXT: vinserti64x4
-;AVX512-NEXT: vpaddd
+vector.body:
+ %index = phi i64 [ %index.next, %vector.body ], [ 0, %entry ]
+ %vec.phi = phi <8 x i32> [ %11, %vector.body ], [ zeroinitializer, %entry ]
+ %4 = getelementptr inbounds i16, i16* %0, i64 %index
+ %5 = bitcast i16* %4 to <8 x i16>*
+ %wide.load = load <8 x i16>, <8 x i16>* %5, align 2
+ %6 = zext <8 x i16> %wide.load to <8 x i32>
+ %7 = getelementptr inbounds i16, i16* %1, i64 %index
+ %8 = bitcast i16* %7 to <8 x i16>*
+ %wide.load14 = load <8 x i16>, <8 x i16>* %8, align 2
+ %9 = zext <8 x i16> %wide.load14 to <8 x i32>
+ %10 = mul nsw <8 x i32> %9, %6
+ %11 = add nsw <8 x i32> %10, %vec.phi
+ %index.next = add i64 %index, 8
+ %12 = icmp eq i64 %index.next, %3
+ br i1 %12, label %middle.block, label %vector.body
+
+middle.block:
+ %rdx.shuf = shufflevector <8 x i32> %11, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
+ %bin.rdx = add <8 x i32> %11, %rdx.shuf
+ %rdx.shuf15 = shufflevector <8 x i32> %bin.rdx, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
+ %bin.rdx16 = add <8 x i32> %bin.rdx, %rdx.shuf15
+ %rdx.shuf17 = shufflevector <8 x i32> %bin.rdx16, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
+ %bin.rdx18 = add <8 x i32> %bin.rdx16, %rdx.shuf17
+ %13 = extractelement <8 x i32> %bin.rdx18, i32 0
+ ret i32 %13
+}
define i32 @_Z9test_charPcS_i(i8* nocapture readonly, i8* nocapture readonly, i32) local_unnamed_addr #0 {
+; SSE2-LABEL: _Z9test_charPcS_i:
+; SSE2: # BB#0: # %entry
+; SSE2-NEXT: movl %edx, %eax
+; SSE2-NEXT: pxor %xmm0, %xmm0
+; SSE2-NEXT: pxor %xmm1, %xmm1
+; SSE2-NEXT: pxor %xmm3, %xmm3
+; SSE2-NEXT: pxor %xmm2, %xmm2
+; SSE2-NEXT: .p2align 4, 0x90
+; SSE2-NEXT: .LBB2_1: # %vector.body
+; SSE2-NEXT: # =>This Inner Loop Header: Depth=1
+; SSE2-NEXT: movq {{.*#+}} xmm4 = mem[0],zero
+; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
+; SSE2-NEXT: psraw $8, %xmm4
+; SSE2-NEXT: movq {{.*#+}} xmm5 = mem[0],zero
+; SSE2-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
+; SSE2-NEXT: psraw $8, %xmm5
+; SSE2-NEXT: pmullw %xmm4, %xmm5
+; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3]
+; SSE2-NEXT: psrad $16, %xmm4
+; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4,4,5,5,6,6,7,7]
+; SSE2-NEXT: psrad $16, %xmm5
+; SSE2-NEXT: movq {{.*#+}} xmm6 = mem[0],zero
+; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
+; SSE2-NEXT: psraw $8, %xmm6
+; SSE2-NEXT: movq {{.*#+}} xmm7 = mem[0],zero
+; SSE2-NEXT: punpcklbw {{.*#+}} xmm7 = xmm7[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
+; SSE2-NEXT: psraw $8, %xmm7
+; SSE2-NEXT: pmullw %xmm6, %xmm7
+; SSE2-NEXT: punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[1],xmm7[1],xmm6[2],xmm7[2],xmm6[3],xmm7[3]
+; SSE2-NEXT: psrad $16, %xmm6
+; SSE2-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
+; SSE2-NEXT: psrad $16, %xmm7
+; SSE2-NEXT: paddd %xmm7, %xmm2
+; SSE2-NEXT: paddd %xmm6, %xmm3
+; SSE2-NEXT: paddd %xmm5, %xmm1
+; SSE2-NEXT: paddd %xmm4, %xmm0
+; SSE2-NEXT: addq $16, %rsi
+; SSE2-NEXT: addq $16, %rdi
+; SSE2-NEXT: addq $-16, %rax
+; SSE2-NEXT: jne .LBB2_1
+; SSE2-NEXT: # BB#2: # %middle.block
+; SSE2-NEXT: paddd %xmm3, %xmm0
+; SSE2-NEXT: paddd %xmm2, %xmm1
+; SSE2-NEXT: paddd %xmm0, %xmm1
+; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
+; SSE2-NEXT: paddd %xmm1, %xmm0
+; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
+; SSE2-NEXT: paddd %xmm0, %xmm1
+; SSE2-NEXT: movd %xmm1, %eax
+; SSE2-NEXT: retq
+;
+; AVX2-LABEL: _Z9test_charPcS_i:
+; AVX2: # BB#0: # %entry
+; AVX2-NEXT: movl %edx, %eax
+; AVX2-NEXT: vpxor %ymm0, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %ymm1, %ymm1, %ymm1
+; AVX2-NEXT: .p2align 4, 0x90
+; AVX2-NEXT: .LBB2_1: # %vector.body
+; AVX2-NEXT: # =>This Inner Loop Header: Depth=1
+; AVX2-NEXT: vpmovsxbw (%rdi), %ymm2
+; AVX2-NEXT: vpmovsxbw (%rsi), %ymm3
+; AVX2-NEXT: vpmaddwd %ymm2, %ymm3, %ymm2
+; AVX2-NEXT: vpaddd %ymm1, %ymm2, %ymm1
+; AVX2-NEXT: addq $16, %rsi
+; AVX2-NEXT: addq $16, %rdi
+; AVX2-NEXT: addq $-16, %rax
+; AVX2-NEXT: jne .LBB2_1
+; AVX2-NEXT: # BB#2: # %middle.block
+; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm0
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
+; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vphaddd %ymm0, %ymm0, %ymm0
+; AVX2-NEXT: vmovd %xmm0, %eax
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: _Z9test_charPcS_i:
+; AVX512: # BB#0: # %entry
+; AVX512-NEXT: movl %edx, %eax
+; AVX512-NEXT: vpxord %zmm0, %zmm0, %zmm0
+; AVX512-NEXT: vpxor %ymm1, %ymm1, %ymm1
+; AVX512-NEXT: .p2align 4, 0x90
+; AVX512-NEXT: .LBB2_1: # %vector.body
+; AVX512-NEXT: # =>This Inner Loop Header: Depth=1
+; AVX512-NEXT: vpmovsxbw (%rdi), %ymm2
+; AVX512-NEXT: vpmovsxbw (%rsi), %ymm3
+; AVX512-NEXT: vpmaddwd %ymm2, %ymm3, %ymm2
+; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm2, %zmm2
+; AVX512-NEXT: vpaddd %zmm0, %zmm2, %zmm0
+; AVX512-NEXT: addq $16, %rsi
+; AVX512-NEXT: addq $16, %rdi
+; AVX512-NEXT: addq $-16, %rax
+; AVX512-NEXT: jne .LBB2_1
+; AVX512-NEXT: # BB#2: # %middle.block
+; AVX512-NEXT: vshufi64x2 {{.*#+}} zmm1 = zmm0[4,5,6,7,0,1,0,1]
+; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0
+; AVX512-NEXT: vshufi64x2 {{.*#+}} zmm1 = zmm0[2,3,0,1,0,1,0,1]
+; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0
+; AVX512-NEXT: vpshufd {{.*#+}} zmm1 = zmm0[2,3,2,3,6,7,6,7,10,11,10,11,14,15,14,15]
+; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0
+; AVX512-NEXT: vpshufd {{.*#+}} zmm1 = zmm0[1,1,2,3,5,5,6,7,9,9,10,11,13,13,14,15]
+; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0
+; AVX512-NEXT: vmovd %xmm0, %eax
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
entry:
%3 = zext i32 %2 to i64
br label %vector.body
diff --git a/test/CodeGen/X86/merge_store.ll b/test/CodeGen/X86/merge_store.ll
index 31c1f6582426..dcb7bd010e56 100644
--- a/test/CodeGen/X86/merge_store.ll
+++ b/test/CodeGen/X86/merge_store.ll
@@ -28,3 +28,34 @@ entry:
for.end:
ret void
}
+
+
+
+;; CHECK-LABEL: indexed-store-merge
+
+;; We should be able to merge the 4 consecutive stores.
+;; FIXMECHECK: movl $0, 2(%rsi,%rdi)
+
+;; CHECK: movb $0, 2(%rsi,%rdi)
+;; CHECK: movb $0, 3(%rsi,%rdi)
+;; CHECK: movb $0, 4(%rsi,%rdi)
+;; CHECK: movb $0, 5(%rsi,%rdi)
+;; CHECK: movb $0, (%rsi)
+define void @indexed-store-merge(i64 %p, i8* %v) {
+entry:
+ %p2 = add nsw i64 %p, 2
+ %v2 = getelementptr i8, i8* %v, i64 %p2
+ store i8 0, i8* %v2, align 2
+ %p3 = add nsw i64 %p, 3
+ %v3 = getelementptr i8, i8* %v, i64 %p3
+ store i8 0, i8* %v3, align 1
+ %p4 = add nsw i64 %p, 4
+ %v4 = getelementptr i8, i8* %v, i64 %p4
+ store i8 0, i8* %v4, align 2
+ %p5 = add nsw i64 %p, 5
+ %v5 = getelementptr i8, i8* %v, i64 %p5
+ store i8 0, i8* %v5, align 1
+ %v0 = getelementptr i8, i8* %v, i64 0
+ store i8 0, i8* %v0, align 2
+ ret void
+}
diff --git a/test/CodeGen/X86/sse-schedule.ll b/test/CodeGen/X86/sse-schedule.ll
new file mode 100644
index 000000000000..52e6b61aedfe
--- /dev/null
+++ b/test/CodeGen/X86/sse-schedule.ll
@@ -0,0 +1,2415 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule | FileCheck %s --check-prefix=CHECK --check-prefix=GENERIC
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=atom | FileCheck %s --check-prefix=CHECK --check-prefix=ATOM
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=slm | FileCheck %s --check-prefix=CHECK --check-prefix=SLM
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=sandybridge | FileCheck %s --check-prefix=CHECK --check-prefix=SANDY
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=ivybridge | FileCheck %s --check-prefix=CHECK --check-prefix=SANDY
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=haswell | FileCheck %s --check-prefix=CHECK --check-prefix=HASWELL
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skylake | FileCheck %s --check-prefix=CHECK --check-prefix=HASWELL
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=btver2 | FileCheck %s --check-prefix=CHECK --check-prefix=BTVER2
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=znver1 | FileCheck %s --check-prefix=CHECK --check-prefix=BTVER2
+
+define <4 x float> @test_addps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_addps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: addps %xmm1, %xmm0
+; GENERIC-NEXT: addps (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_addps:
+; ATOM: # BB#0:
+; ATOM-NEXT: addps %xmm1, %xmm0
+; ATOM-NEXT: addps (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_addps:
+; SLM: # BB#0:
+; SLM-NEXT: addps %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: addps (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_addps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vaddps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_addps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vaddps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_addps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vaddps (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fadd <4 x float> %a0, %a1
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = fadd <4 x float> %1, %2
+ ret <4 x float> %3
+}
+
+define float @test_addss(float %a0, float %a1, float *%a2) {
+; GENERIC-LABEL: test_addss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: addss %xmm1, %xmm0
+; GENERIC-NEXT: addss (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_addss:
+; ATOM: # BB#0:
+; ATOM-NEXT: addss %xmm1, %xmm0
+; ATOM-NEXT: addss (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_addss:
+; SLM: # BB#0:
+; SLM-NEXT: addss %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: addss (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_addss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vaddss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_addss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vaddss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_addss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vaddss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fadd float %a0, %a1
+ %2 = load float, float *%a2, align 4
+ %3 = fadd float %1, %2
+ ret float %3
+}
+
+define <4 x float> @test_andps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_andps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: andps %xmm1, %xmm0
+; GENERIC-NEXT: andps (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_andps:
+; ATOM: # BB#0:
+; ATOM-NEXT: andps %xmm1, %xmm0
+; ATOM-NEXT: andps (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_andps:
+; SLM: # BB#0:
+; SLM-NEXT: andps %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: andps (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_andps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vandps %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vandps (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_andps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vandps %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: vandps (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_andps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vandps %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vandps (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast <4 x float> %a0 to <4 x i32>
+ %2 = bitcast <4 x float> %a1 to <4 x i32>
+ %3 = and <4 x i32> %1, %2
+ %4 = load <4 x float>, <4 x float> *%a2, align 16
+ %5 = bitcast <4 x float> %4 to <4 x i32>
+ %6 = and <4 x i32> %3, %5
+ %7 = bitcast <4 x i32> %6 to <4 x float>
+ ret <4 x float> %7
+}
+
+define <4 x float> @test_andnotps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_andnotps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: andnps %xmm1, %xmm0
+; GENERIC-NEXT: andnps (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_andnotps:
+; ATOM: # BB#0:
+; ATOM-NEXT: andnps %xmm1, %xmm0
+; ATOM-NEXT: andnps (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_andnotps:
+; SLM: # BB#0:
+; SLM-NEXT: andnps %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: andnps (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_andnotps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vandnps %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vandnps (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_andnotps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vandnps %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: vandnps (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_andnotps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vandnps %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vandnps (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast <4 x float> %a0 to <4 x i32>
+ %2 = bitcast <4 x float> %a1 to <4 x i32>
+ %3 = xor <4 x i32> %1, <i32 -1, i32 -1, i32 -1, i32 -1>
+ %4 = and <4 x i32> %3, %2
+ %5 = load <4 x float>, <4 x float> *%a2, align 16
+ %6 = bitcast <4 x float> %5 to <4 x i32>
+ %7 = xor <4 x i32> %4, <i32 -1, i32 -1, i32 -1, i32 -1>
+ %8 = and <4 x i32> %6, %7
+ %9 = bitcast <4 x i32> %8 to <4 x float>
+ ret <4 x float> %9
+}
+
+define <4 x float> @test_cmpps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_cmpps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cmpeqps %xmm0, %xmm1
+; GENERIC-NEXT: cmpeqps (%rdi), %xmm0
+; GENERIC-NEXT: orps %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cmpps:
+; ATOM: # BB#0:
+; ATOM-NEXT: cmpeqps %xmm0, %xmm1
+; ATOM-NEXT: cmpeqps (%rdi), %xmm0
+; ATOM-NEXT: orps %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cmpps:
+; SLM: # BB#0:
+; SLM-NEXT: cmpeqps %xmm0, %xmm1 # sched: [3:1.00]
+; SLM-NEXT: cmpeqps (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: orps %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cmpps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcmpeqps %xmm1, %xmm0, %xmm1 # sched: [3:1.00]
+; SANDY-NEXT: vcmpeqps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: vorps %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cmpps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcmpeqps %xmm1, %xmm0, %xmm1 # sched: [3:1.00]
+; HASWELL-NEXT: vcmpeqps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: vorps %xmm0, %xmm1, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cmpps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcmpeqps %xmm1, %xmm0, %xmm1 # sched: [3:1.00]
+; BTVER2-NEXT: vcmpeqps (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: vorps %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fcmp oeq <4 x float> %a0, %a1
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = fcmp oeq <4 x float> %a0, %2
+ %4 = or <4 x i1> %1, %3
+ %5 = sext <4 x i1> %4 to <4 x i32>
+ %6 = bitcast <4 x i32> %5 to <4 x float>
+ ret <4 x float> %6
+}
+
+define float @test_cmpss(float %a0, float %a1, float *%a2) {
+; GENERIC-LABEL: test_cmpss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cmpeqss %xmm1, %xmm0
+; GENERIC-NEXT: cmpeqss (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cmpss:
+; ATOM: # BB#0:
+; ATOM-NEXT: cmpeqss %xmm1, %xmm0
+; ATOM-NEXT: cmpeqss (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cmpss:
+; SLM: # BB#0:
+; SLM-NEXT: cmpeqss %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: cmpeqss (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cmpss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vcmpeqss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cmpss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vcmpeqss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cmpss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vcmpeqss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = insertelement <4 x float> undef, float %a0, i32 0
+ %2 = insertelement <4 x float> undef, float %a1, i32 0
+ %3 = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %1, <4 x float> %2, i8 0)
+ %4 = load float, float *%a2, align 4
+ %5 = insertelement <4 x float> undef, float %4, i32 0
+ %6 = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %3, <4 x float> %5, i8 0)
+ %7 = extractelement <4 x float> %6, i32 0
+ ret float %7
+}
+declare <4 x float> @llvm.x86.sse.cmp.ss(<4 x float>, <4 x float>, i8) nounwind readnone
+
+define i32 @test_comiss(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_comiss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: comiss %xmm1, %xmm0
+; GENERIC-NEXT: setnp %al
+; GENERIC-NEXT: sete %cl
+; GENERIC-NEXT: andb %al, %cl
+; GENERIC-NEXT: comiss (%rdi), %xmm0
+; GENERIC-NEXT: setnp %al
+; GENERIC-NEXT: sete %dl
+; GENERIC-NEXT: andb %al, %dl
+; GENERIC-NEXT: orb %cl, %dl
+; GENERIC-NEXT: movzbl %dl, %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_comiss:
+; ATOM: # BB#0:
+; ATOM-NEXT: comiss %xmm1, %xmm0
+; ATOM-NEXT: setnp %al
+; ATOM-NEXT: sete %cl
+; ATOM-NEXT: andb %al, %cl
+; ATOM-NEXT: comiss (%rdi), %xmm0
+; ATOM-NEXT: setnp %al
+; ATOM-NEXT: sete %dl
+; ATOM-NEXT: andb %al, %dl
+; ATOM-NEXT: orb %cl, %dl
+; ATOM-NEXT: movzbl %dl, %eax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_comiss:
+; SLM: # BB#0:
+; SLM-NEXT: comiss %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: setnp %al # sched: [1:0.50]
+; SLM-NEXT: sete %cl # sched: [1:0.50]
+; SLM-NEXT: andb %al, %cl # sched: [1:0.50]
+; SLM-NEXT: comiss (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: setnp %al # sched: [1:0.50]
+; SLM-NEXT: sete %dl # sched: [1:0.50]
+; SLM-NEXT: andb %al, %dl # sched: [1:0.50]
+; SLM-NEXT: orb %cl, %dl # sched: [1:0.50]
+; SLM-NEXT: movzbl %dl, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_comiss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcomiss %xmm1, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: setnp %al # sched: [1:0.33]
+; SANDY-NEXT: sete %cl # sched: [1:0.33]
+; SANDY-NEXT: andb %al, %cl # sched: [1:0.33]
+; SANDY-NEXT: vcomiss (%rdi), %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: setnp %al # sched: [1:0.33]
+; SANDY-NEXT: sete %dl # sched: [1:0.33]
+; SANDY-NEXT: andb %al, %dl # sched: [1:0.33]
+; SANDY-NEXT: orb %cl, %dl # sched: [1:0.33]
+; SANDY-NEXT: movzbl %dl, %eax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_comiss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcomiss %xmm1, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: setnp %al # sched: [1:0.50]
+; HASWELL-NEXT: sete %cl # sched: [1:0.50]
+; HASWELL-NEXT: andb %al, %cl # sched: [1:0.25]
+; HASWELL-NEXT: vcomiss (%rdi), %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: setnp %al # sched: [1:0.50]
+; HASWELL-NEXT: sete %dl # sched: [1:0.50]
+; HASWELL-NEXT: andb %al, %dl # sched: [1:0.25]
+; HASWELL-NEXT: orb %cl, %dl # sched: [1:0.25]
+; HASWELL-NEXT: movzbl %dl, %eax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_comiss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcomiss %xmm1, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: setnp %al # sched: [1:0.50]
+; BTVER2-NEXT: sete %cl # sched: [1:0.50]
+; BTVER2-NEXT: andb %al, %cl # sched: [1:0.50]
+; BTVER2-NEXT: vcomiss (%rdi), %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: setnp %al # sched: [1:0.50]
+; BTVER2-NEXT: sete %dl # sched: [1:0.50]
+; BTVER2-NEXT: andb %al, %dl # sched: [1:0.50]
+; BTVER2-NEXT: orb %cl, %dl # sched: [1:0.50]
+; BTVER2-NEXT: movzbl %dl, %eax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call i32 @llvm.x86.sse.comieq.ss(<4 x float> %a0, <4 x float> %a1)
+ %2 = load <4 x float>, <4 x float> *%a2, align 4
+ %3 = call i32 @llvm.x86.sse.comieq.ss(<4 x float> %a0, <4 x float> %2)
+ %4 = or i32 %1, %3
+ ret i32 %4
+}
+declare i32 @llvm.x86.sse.comieq.ss(<4 x float>, <4 x float>) nounwind readnone
+
+define float @test_cvtsi2ss(i32 %a0, i32 *%a1) {
+; GENERIC-LABEL: test_cvtsi2ss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtsi2ssl %edi, %xmm1
+; GENERIC-NEXT: cvtsi2ssl (%rsi), %xmm0
+; GENERIC-NEXT: addss %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtsi2ss:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtsi2ssl (%rsi), %xmm0
+; ATOM-NEXT: cvtsi2ssl %edi, %xmm1
+; ATOM-NEXT: addss %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtsi2ss:
+; SLM: # BB#0:
+; SLM-NEXT: cvtsi2ssl (%rsi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: cvtsi2ssl %edi, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: addss %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtsi2ss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtsi2ssl %edi, %xmm0, %xmm0 # sched: [4:1.00]
+; SANDY-NEXT: vcvtsi2ssl (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; SANDY-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtsi2ss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtsi2ssl %edi, %xmm0, %xmm0 # sched: [4:1.00]
+; HASWELL-NEXT: vcvtsi2ssl (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; HASWELL-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtsi2ss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtsi2ssl %edi, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vcvtsi2ssl (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = sitofp i32 %a0 to float
+ %2 = load i32, i32 *%a1, align 4
+ %3 = sitofp i32 %2 to float
+ %4 = fadd float %1, %3
+ ret float %4
+}
+
+define float @test_cvtsi2ssq(i64 %a0, i64 *%a1) {
+; GENERIC-LABEL: test_cvtsi2ssq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtsi2ssq %rdi, %xmm1
+; GENERIC-NEXT: cvtsi2ssq (%rsi), %xmm0
+; GENERIC-NEXT: addss %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtsi2ssq:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtsi2ssq (%rsi), %xmm0
+; ATOM-NEXT: cvtsi2ssq %rdi, %xmm1
+; ATOM-NEXT: addss %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtsi2ssq:
+; SLM: # BB#0:
+; SLM-NEXT: cvtsi2ssq (%rsi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: cvtsi2ssq %rdi, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: addss %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtsi2ssq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtsi2ssq %rdi, %xmm0, %xmm0 # sched: [4:1.00]
+; SANDY-NEXT: vcvtsi2ssq (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; SANDY-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtsi2ssq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtsi2ssq %rdi, %xmm0, %xmm0 # sched: [4:1.00]
+; HASWELL-NEXT: vcvtsi2ssq (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; HASWELL-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtsi2ssq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtsi2ssq %rdi, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vcvtsi2ssq (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = sitofp i64 %a0 to float
+ %2 = load i64, i64 *%a1, align 8
+ %3 = sitofp i64 %2 to float
+ %4 = fadd float %1, %3
+ ret float %4
+}
+
+define i32 @test_cvtss2si(float %a0, float *%a1) {
+; GENERIC-LABEL: test_cvtss2si:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtss2si %xmm0, %ecx
+; GENERIC-NEXT: cvtss2si (%rdi), %eax
+; GENERIC-NEXT: addl %ecx, %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtss2si:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtss2si (%rdi), %eax
+; ATOM-NEXT: cvtss2si %xmm0, %ecx
+; ATOM-NEXT: addl %ecx, %eax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtss2si:
+; SLM: # BB#0:
+; SLM-NEXT: cvtss2si (%rdi), %eax # sched: [7:1.00]
+; SLM-NEXT: cvtss2si %xmm0, %ecx # sched: [4:0.50]
+; SLM-NEXT: addl %ecx, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtss2si:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtss2si %xmm0, %ecx # sched: [3:1.00]
+; SANDY-NEXT: vcvtss2si (%rdi), %eax # sched: [7:1.00]
+; SANDY-NEXT: addl %ecx, %eax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtss2si:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtss2si %xmm0, %ecx # sched: [4:1.00]
+; HASWELL-NEXT: vcvtss2si (%rdi), %eax # sched: [8:1.00]
+; HASWELL-NEXT: addl %ecx, %eax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtss2si:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtss2si (%rdi), %eax # sched: [8:1.00]
+; BTVER2-NEXT: vcvtss2si %xmm0, %ecx # sched: [3:1.00]
+; BTVER2-NEXT: addl %ecx, %eax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = insertelement <4 x float> undef, float %a0, i32 0
+ %2 = call i32 @llvm.x86.sse.cvtss2si(<4 x float> %1)
+ %3 = load float, float *%a1, align 4
+ %4 = insertelement <4 x float> undef, float %3, i32 0
+ %5 = call i32 @llvm.x86.sse.cvtss2si(<4 x float> %4)
+ %6 = add i32 %2, %5
+ ret i32 %6
+}
+declare i32 @llvm.x86.sse.cvtss2si(<4 x float>) nounwind readnone
+
+define i64 @test_cvtss2siq(float %a0, float *%a1) {
+; GENERIC-LABEL: test_cvtss2siq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtss2si %xmm0, %rcx
+; GENERIC-NEXT: cvtss2si (%rdi), %rax
+; GENERIC-NEXT: addq %rcx, %rax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtss2siq:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtss2si (%rdi), %rax
+; ATOM-NEXT: cvtss2si %xmm0, %rcx
+; ATOM-NEXT: addq %rcx, %rax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtss2siq:
+; SLM: # BB#0:
+; SLM-NEXT: cvtss2si (%rdi), %rax # sched: [7:1.00]
+; SLM-NEXT: cvtss2si %xmm0, %rcx # sched: [4:0.50]
+; SLM-NEXT: addq %rcx, %rax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtss2siq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtss2si %xmm0, %rcx # sched: [3:1.00]
+; SANDY-NEXT: vcvtss2si (%rdi), %rax # sched: [7:1.00]
+; SANDY-NEXT: addq %rcx, %rax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtss2siq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtss2si %xmm0, %rcx # sched: [4:1.00]
+; HASWELL-NEXT: vcvtss2si (%rdi), %rax # sched: [8:1.00]
+; HASWELL-NEXT: addq %rcx, %rax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtss2siq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtss2si (%rdi), %rax # sched: [8:1.00]
+; BTVER2-NEXT: vcvtss2si %xmm0, %rcx # sched: [3:1.00]
+; BTVER2-NEXT: addq %rcx, %rax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = insertelement <4 x float> undef, float %a0, i32 0
+ %2 = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %1)
+ %3 = load float, float *%a1, align 4
+ %4 = insertelement <4 x float> undef, float %3, i32 0
+ %5 = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %4)
+ %6 = add i64 %2, %5
+ ret i64 %6
+}
+declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone
+
+define i32 @test_cvttss2si(float %a0, float *%a1) {
+; GENERIC-LABEL: test_cvttss2si:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvttss2si %xmm0, %ecx
+; GENERIC-NEXT: cvttss2si (%rdi), %eax
+; GENERIC-NEXT: addl %ecx, %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvttss2si:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvttss2si (%rdi), %eax
+; ATOM-NEXT: cvttss2si %xmm0, %ecx
+; ATOM-NEXT: addl %ecx, %eax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvttss2si:
+; SLM: # BB#0:
+; SLM-NEXT: cvttss2si (%rdi), %eax # sched: [7:1.00]
+; SLM-NEXT: cvttss2si %xmm0, %ecx # sched: [4:0.50]
+; SLM-NEXT: addl %ecx, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvttss2si:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvttss2si %xmm0, %ecx # sched: [3:1.00]
+; SANDY-NEXT: vcvttss2si (%rdi), %eax # sched: [7:1.00]
+; SANDY-NEXT: addl %ecx, %eax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvttss2si:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvttss2si %xmm0, %ecx # sched: [4:1.00]
+; HASWELL-NEXT: vcvttss2si (%rdi), %eax # sched: [8:1.00]
+; HASWELL-NEXT: addl %ecx, %eax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvttss2si:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvttss2si (%rdi), %eax # sched: [8:1.00]
+; BTVER2-NEXT: vcvttss2si %xmm0, %ecx # sched: [3:1.00]
+; BTVER2-NEXT: addl %ecx, %eax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fptosi float %a0 to i32
+ %2 = load float, float *%a1, align 4
+ %3 = fptosi float %2 to i32
+ %4 = add i32 %1, %3
+ ret i32 %4
+}
+
+define i64 @test_cvttss2siq(float %a0, float *%a1) {
+; GENERIC-LABEL: test_cvttss2siq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvttss2si %xmm0, %rcx
+; GENERIC-NEXT: cvttss2si (%rdi), %rax
+; GENERIC-NEXT: addq %rcx, %rax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvttss2siq:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvttss2si (%rdi), %rax
+; ATOM-NEXT: cvttss2si %xmm0, %rcx
+; ATOM-NEXT: addq %rcx, %rax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvttss2siq:
+; SLM: # BB#0:
+; SLM-NEXT: cvttss2si (%rdi), %rax # sched: [7:1.00]
+; SLM-NEXT: cvttss2si %xmm0, %rcx # sched: [4:0.50]
+; SLM-NEXT: addq %rcx, %rax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvttss2siq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvttss2si %xmm0, %rcx # sched: [3:1.00]
+; SANDY-NEXT: vcvttss2si (%rdi), %rax # sched: [7:1.00]
+; SANDY-NEXT: addq %rcx, %rax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvttss2siq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvttss2si %xmm0, %rcx # sched: [4:1.00]
+; HASWELL-NEXT: vcvttss2si (%rdi), %rax # sched: [8:1.00]
+; HASWELL-NEXT: addq %rcx, %rax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvttss2siq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvttss2si (%rdi), %rax # sched: [8:1.00]
+; BTVER2-NEXT: vcvttss2si %xmm0, %rcx # sched: [3:1.00]
+; BTVER2-NEXT: addq %rcx, %rax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fptosi float %a0 to i64
+ %2 = load float, float *%a1, align 4
+ %3 = fptosi float %2 to i64
+ %4 = add i64 %1, %3
+ ret i64 %4
+}
+
+define <4 x float> @test_divps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_divps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: divps %xmm1, %xmm0
+; GENERIC-NEXT: divps (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_divps:
+; ATOM: # BB#0:
+; ATOM-NEXT: divps %xmm1, %xmm0
+; ATOM-NEXT: divps (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_divps:
+; SLM: # BB#0:
+; SLM-NEXT: divps %xmm1, %xmm0 # sched: [34:34.00]
+; SLM-NEXT: divps (%rdi), %xmm0 # sched: [37:34.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_divps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vdivps %xmm1, %xmm0, %xmm0 # sched: [12:1.00]
+; SANDY-NEXT: vdivps (%rdi), %xmm0, %xmm0 # sched: [16:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_divps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vdivps %xmm1, %xmm0, %xmm0 # sched: [12:1.00]
+; HASWELL-NEXT: vdivps (%rdi), %xmm0, %xmm0 # sched: [16:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_divps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vdivps %xmm1, %xmm0, %xmm0 # sched: [19:19.00]
+; BTVER2-NEXT: vdivps (%rdi), %xmm0, %xmm0 # sched: [24:19.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fdiv <4 x float> %a0, %a1
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = fdiv <4 x float> %1, %2
+ ret <4 x float> %3
+}
+
+define float @test_divss(float %a0, float %a1, float *%a2) {
+; GENERIC-LABEL: test_divss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: divss %xmm1, %xmm0
+; GENERIC-NEXT: divss (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_divss:
+; ATOM: # BB#0:
+; ATOM-NEXT: divss %xmm1, %xmm0
+; ATOM-NEXT: divss (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_divss:
+; SLM: # BB#0:
+; SLM-NEXT: divss %xmm1, %xmm0 # sched: [34:34.00]
+; SLM-NEXT: divss (%rdi), %xmm0 # sched: [37:34.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_divss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vdivss %xmm1, %xmm0, %xmm0 # sched: [12:1.00]
+; SANDY-NEXT: vdivss (%rdi), %xmm0, %xmm0 # sched: [16:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_divss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vdivss %xmm1, %xmm0, %xmm0 # sched: [12:1.00]
+; HASWELL-NEXT: vdivss (%rdi), %xmm0, %xmm0 # sched: [16:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_divss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vdivss %xmm1, %xmm0, %xmm0 # sched: [19:19.00]
+; BTVER2-NEXT: vdivss (%rdi), %xmm0, %xmm0 # sched: [24:19.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fdiv float %a0, %a1
+ %2 = load float, float *%a2, align 4
+ %3 = fdiv float %1, %2
+ ret float %3
+}
+
+define void @test_ldmxcsr(i32 %a0) {
+; GENERIC-LABEL: test_ldmxcsr:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movl %edi, -{{[0-9]+}}(%rsp)
+; GENERIC-NEXT: ldmxcsr -{{[0-9]+}}(%rsp)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_ldmxcsr:
+; ATOM: # BB#0:
+; ATOM-NEXT: movl %edi, -{{[0-9]+}}(%rsp)
+; ATOM-NEXT: ldmxcsr -{{[0-9]+}}(%rsp)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_ldmxcsr:
+; SLM: # BB#0:
+; SLM-NEXT: movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
+; SLM-NEXT: ldmxcsr -{{[0-9]+}}(%rsp) # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_ldmxcsr:
+; SANDY: # BB#0:
+; SANDY-NEXT: movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
+; SANDY-NEXT: vldmxcsr -{{[0-9]+}}(%rsp) # sched: [4:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_ldmxcsr:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
+; HASWELL-NEXT: vldmxcsr -{{[0-9]+}}(%rsp) # sched: [6:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_ldmxcsr:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
+; BTVER2-NEXT: vldmxcsr -{{[0-9]+}}(%rsp) # sched: [5:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = alloca i32, align 4
+ %2 = bitcast i32* %1 to i8*
+ store i32 %a0, i32* %1
+ call void @llvm.x86.sse.ldmxcsr(i8* %2)
+ ret void
+}
+declare void @llvm.x86.sse.ldmxcsr(i8*) nounwind readnone
+
+define <4 x float> @test_maxps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_maxps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: maxps %xmm1, %xmm0
+; GENERIC-NEXT: maxps (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_maxps:
+; ATOM: # BB#0:
+; ATOM-NEXT: maxps %xmm1, %xmm0
+; ATOM-NEXT: maxps (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_maxps:
+; SLM: # BB#0:
+; SLM-NEXT: maxps %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: maxps (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_maxps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmaxps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmaxps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_maxps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmaxps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmaxps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_maxps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmaxps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmaxps (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x float> @llvm.x86.sse.max.ps(<4 x float> %a0, <4 x float> %a1)
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = call <4 x float> @llvm.x86.sse.max.ps(<4 x float> %1, <4 x float> %2)
+ ret <4 x float> %3
+}
+declare <4 x float> @llvm.x86.sse.max.ps(<4 x float>, <4 x float>) nounwind readnone
+
+define <4 x float> @test_maxss(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_maxss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: maxss %xmm1, %xmm0
+; GENERIC-NEXT: maxss (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_maxss:
+; ATOM: # BB#0:
+; ATOM-NEXT: maxss %xmm1, %xmm0
+; ATOM-NEXT: maxss (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_maxss:
+; SLM: # BB#0:
+; SLM-NEXT: maxss %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: maxss (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_maxss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmaxss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmaxss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_maxss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmaxss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmaxss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_maxss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmaxss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmaxss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x float> @llvm.x86.sse.max.ss(<4 x float> %a0, <4 x float> %a1)
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = call <4 x float> @llvm.x86.sse.max.ss(<4 x float> %1, <4 x float> %2)
+ ret <4 x float> %3
+}
+declare <4 x float> @llvm.x86.sse.max.ss(<4 x float>, <4 x float>) nounwind readnone
+
+define <4 x float> @test_minps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_minps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: minps %xmm1, %xmm0
+; GENERIC-NEXT: minps (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_minps:
+; ATOM: # BB#0:
+; ATOM-NEXT: minps %xmm1, %xmm0
+; ATOM-NEXT: minps (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_minps:
+; SLM: # BB#0:
+; SLM-NEXT: minps %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: minps (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_minps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vminps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vminps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_minps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vminps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vminps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_minps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vminps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vminps (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x float> @llvm.x86.sse.min.ps(<4 x float> %a0, <4 x float> %a1)
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = call <4 x float> @llvm.x86.sse.min.ps(<4 x float> %1, <4 x float> %2)
+ ret <4 x float> %3
+}
+declare <4 x float> @llvm.x86.sse.min.ps(<4 x float>, <4 x float>) nounwind readnone
+
+define <4 x float> @test_minss(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_minss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: minss %xmm1, %xmm0
+; GENERIC-NEXT: minss (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_minss:
+; ATOM: # BB#0:
+; ATOM-NEXT: minss %xmm1, %xmm0
+; ATOM-NEXT: minss (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_minss:
+; SLM: # BB#0:
+; SLM-NEXT: minss %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: minss (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_minss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vminss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vminss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_minss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vminss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vminss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_minss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vminss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vminss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x float> @llvm.x86.sse.min.ss(<4 x float> %a0, <4 x float> %a1)
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = call <4 x float> @llvm.x86.sse.min.ss(<4 x float> %1, <4 x float> %2)
+ ret <4 x float> %3
+}
+declare <4 x float> @llvm.x86.sse.min.ss(<4 x float>, <4 x float>) nounwind readnone
+
+define void @test_movaps(<4 x float> *%a0, <4 x float> *%a1) {
+; GENERIC-LABEL: test_movaps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movaps (%rdi), %xmm0
+; GENERIC-NEXT: addps %xmm0, %xmm0
+; GENERIC-NEXT: movaps %xmm0, (%rsi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movaps:
+; ATOM: # BB#0:
+; ATOM-NEXT: movaps (%rdi), %xmm0
+; ATOM-NEXT: addps %xmm0, %xmm0
+; ATOM-NEXT: movaps %xmm0, (%rsi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movaps:
+; SLM: # BB#0:
+; SLM-NEXT: movaps (%rdi), %xmm0 # sched: [3:1.00]
+; SLM-NEXT: addps %xmm0, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: movaps %xmm0, (%rsi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movaps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovaps (%rdi), %xmm0 # sched: [4:0.50]
+; SANDY-NEXT: vaddps %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovaps %xmm0, (%rsi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movaps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovaps (%rdi), %xmm0 # sched: [4:0.50]
+; HASWELL-NEXT: vaddps %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmovaps %xmm0, (%rsi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movaps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovaps (%rdi), %xmm0 # sched: [5:1.00]
+; BTVER2-NEXT: vaddps %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmovaps %xmm0, (%rsi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = load <4 x float>, <4 x float> *%a0, align 16
+ %2 = fadd <4 x float> %1, %1
+ store <4 x float> %2, <4 x float> *%a1, align 16
+ ret void
+}
+
+; TODO (v)movhlps
+
+define <4 x float> @test_movhlps(<4 x float> %a0, <4 x float> %a1) {
+; GENERIC-LABEL: test_movhlps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1]
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movhlps:
+; ATOM: # BB#0:
+; ATOM-NEXT: movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1]
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movhlps:
+; SLM: # BB#0:
+; SLM-NEXT: movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movhlps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movhlps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movhlps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> <i32 6, i32 7, i32 2, i32 3>
+ ret <4 x float> %1
+}
+
+; TODO (v)movhps
+
+define void @test_movhps(<4 x float> %a0, <4 x float> %a1, x86_mmx *%a2) {
+; GENERIC-LABEL: test_movhps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
+; GENERIC-NEXT: addps %xmm0, %xmm1
+; GENERIC-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]
+; GENERIC-NEXT: movlps %xmm1, (%rdi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movhps:
+; ATOM: # BB#0:
+; ATOM-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
+; ATOM-NEXT: addps %xmm0, %xmm1
+; ATOM-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]
+; ATOM-NEXT: movlps %xmm1, (%rdi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movhps:
+; SLM: # BB#0:
+; SLM-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [4:1.00]
+; SLM-NEXT: addps %xmm0, %xmm1 # sched: [3:1.00]
+; SLM-NEXT: pextrq $1, %xmm1, (%rdi) # sched: [4:2.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movhps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [5:1.00]
+; SANDY-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vpextrq $1, %xmm0, (%rdi) # sched: [5:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movhps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [5:1.00]
+; HASWELL-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vpextrq $1, %xmm0, (%rdi) # sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movhps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
+; BTVER2-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vpextrq $1, %xmm0, (%rdi) # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast x86_mmx* %a2 to <2 x float>*
+ %2 = load <2 x float>, <2 x float> *%1, align 8
+ %3 = shufflevector <2 x float> %2, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+ %4 = shufflevector <4 x float> %a1, <4 x float> %3, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
+ %5 = fadd <4 x float> %a0, %4
+ %6 = shufflevector <4 x float> %5, <4 x float> undef, <2 x i32> <i32 2, i32 3>
+ store <2 x float> %6, <2 x float>* %1
+ ret void
+}
+
+; TODO (v)movlhps
+
+define <4 x float> @test_movlhps(<4 x float> %a0, <4 x float> %a1) {
+; GENERIC-LABEL: test_movlhps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; GENERIC-NEXT: addps %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movlhps:
+; ATOM: # BB#0:
+; ATOM-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; ATOM-NEXT: addps %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movlhps:
+; SLM: # BB#0:
+; SLM-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
+; SLM-NEXT: addps %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movlhps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
+; SANDY-NEXT: vaddps %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movlhps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
+; HASWELL-NEXT: vaddps %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movlhps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:0.50]
+; BTVER2-NEXT: vaddps %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
+ %2 = fadd <4 x float> %a1, %1
+ ret <4 x float> %2
+}
+
+define void @test_movlps(<4 x float> %a0, <4 x float> %a1, x86_mmx *%a2) {
+; GENERIC-LABEL: test_movlps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
+; GENERIC-NEXT: addps %xmm0, %xmm1
+; GENERIC-NEXT: movlps %xmm1, (%rdi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movlps:
+; ATOM: # BB#0:
+; ATOM-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
+; ATOM-NEXT: addps %xmm0, %xmm1
+; ATOM-NEXT: movlps %xmm1, (%rdi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movlps:
+; SLM: # BB#0:
+; SLM-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [4:1.00]
+; SLM-NEXT: addps %xmm0, %xmm1 # sched: [3:1.00]
+; SLM-NEXT: movlps %xmm1, (%rdi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movlps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [5:1.00]
+; SANDY-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovlps %xmm0, (%rdi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movlps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [5:1.00]
+; HASWELL-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmovlps %xmm0, (%rdi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movlps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
+; BTVER2-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmovlps %xmm0, (%rdi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast x86_mmx* %a2 to <2 x float>*
+ %2 = load <2 x float>, <2 x float> *%1, align 8
+ %3 = shufflevector <2 x float> %2, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+ %4 = shufflevector <4 x float> %a1, <4 x float> %3, <4 x i32> <i32 4, i32 5, i32 2, i32 3>
+ %5 = fadd <4 x float> %a0, %4
+ %6 = shufflevector <4 x float> %5, <4 x float> undef, <2 x i32> <i32 0, i32 1>
+ store <2 x float> %6, <2 x float>* %1
+ ret void
+}
+
+define i32 @test_movmskps(<4 x float> %a0) {
+; GENERIC-LABEL: test_movmskps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movmskps %xmm0, %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movmskps:
+; ATOM: # BB#0:
+; ATOM-NEXT: movmskps %xmm0, %eax
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movmskps:
+; SLM: # BB#0:
+; SLM-NEXT: movmskps %xmm0, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movmskps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovmskps %xmm0, %eax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movmskps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovmskps %xmm0, %eax # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movmskps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovmskps %xmm0, %eax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call i32 @llvm.x86.sse.movmsk.ps(<4 x float> %a0)
+ ret i32 %1
+}
+declare i32 @llvm.x86.sse.movmsk.ps(<4 x float>) nounwind readnone
+
+define void @test_movntps(<4 x float> %a0, <4 x float> *%a1) {
+; GENERIC-LABEL: test_movntps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movntps %xmm0, (%rdi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movntps:
+; ATOM: # BB#0:
+; ATOM-NEXT: movntps %xmm0, (%rdi)
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movntps:
+; SLM: # BB#0:
+; SLM-NEXT: movntps %xmm0, (%rdi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movntps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovntps %xmm0, (%rdi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movntps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovntps %xmm0, (%rdi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movntps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovntps %xmm0, (%rdi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ store <4 x float> %a0, <4 x float> *%a1, align 16, !nontemporal !0
+ ret void
+}
+
+define void @test_movss_mem(float* %a0, float* %a1) {
+; GENERIC-LABEL: test_movss_mem:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; GENERIC-NEXT: addss %xmm0, %xmm0
+; GENERIC-NEXT: movss %xmm0, (%rsi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movss_mem:
+; ATOM: # BB#0:
+; ATOM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; ATOM-NEXT: addss %xmm0, %xmm0
+; ATOM-NEXT: movss %xmm0, (%rsi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movss_mem:
+; SLM: # BB#0:
+; SLM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero sched: [3:1.00]
+; SLM-NEXT: addss %xmm0, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: movss %xmm0, (%rsi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movss_mem:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero sched: [4:0.50]
+; SANDY-NEXT: vaddss %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovss %xmm0, (%rsi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movss_mem:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero sched: [4:0.50]
+; HASWELL-NEXT: vaddss %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmovss %xmm0, (%rsi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movss_mem:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero sched: [5:1.00]
+; BTVER2-NEXT: vaddss %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmovss %xmm0, (%rsi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = load float, float* %a0, align 1
+ %2 = fadd float %1, %1
+ store float %2, float *%a1, align 1
+ ret void
+}
+
+define <4 x float> @test_movss_reg(<4 x float> %a0, <4 x float> %a1) {
+; GENERIC-LABEL: test_movss_reg:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movss_reg:
+; ATOM: # BB#0:
+; ATOM-NEXT: movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movss_reg:
+; SLM: # BB#0:
+; SLM-NEXT: blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movss_reg:
+; SANDY: # BB#0:
+; SANDY-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movss_reg:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] sched: [1:0.33]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movss_reg:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
+ ret <4 x float> %1
+}
+
+define void @test_movups(<4 x float> *%a0, <4 x float> *%a1) {
+; GENERIC-LABEL: test_movups:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movups (%rdi), %xmm0
+; GENERIC-NEXT: addps %xmm0, %xmm0
+; GENERIC-NEXT: movups %xmm0, (%rsi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movups:
+; ATOM: # BB#0:
+; ATOM-NEXT: movups (%rdi), %xmm0
+; ATOM-NEXT: addps %xmm0, %xmm0
+; ATOM-NEXT: movups %xmm0, (%rsi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movups:
+; SLM: # BB#0:
+; SLM-NEXT: movups (%rdi), %xmm0 # sched: [3:1.00]
+; SLM-NEXT: addps %xmm0, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: movups %xmm0, (%rsi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movups:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovups (%rdi), %xmm0 # sched: [4:0.50]
+; SANDY-NEXT: vaddps %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovups %xmm0, (%rsi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movups:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovups (%rdi), %xmm0 # sched: [4:0.50]
+; HASWELL-NEXT: vaddps %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmovups %xmm0, (%rsi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movups:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovups (%rdi), %xmm0 # sched: [5:1.00]
+; BTVER2-NEXT: vaddps %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmovups %xmm0, (%rsi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = load <4 x float>, <4 x float> *%a0, align 1
+ %2 = fadd <4 x float> %1, %1
+ store <4 x float> %2, <4 x float> *%a1, align 1
+ ret void
+}
+
+define <4 x float> @test_mulps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_mulps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: mulps %xmm1, %xmm0
+; GENERIC-NEXT: mulps (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_mulps:
+; ATOM: # BB#0:
+; ATOM-NEXT: mulps %xmm1, %xmm0
+; ATOM-NEXT: mulps (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_mulps:
+; SLM: # BB#0:
+; SLM-NEXT: mulps %xmm1, %xmm0 # sched: [5:2.00]
+; SLM-NEXT: mulps (%rdi), %xmm0 # sched: [8:2.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_mulps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmulps %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vmulps (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_mulps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmulps %xmm1, %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vmulps (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_mulps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmulps %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vmulps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fmul <4 x float> %a0, %a1
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = fmul <4 x float> %1, %2
+ ret <4 x float> %3
+}
+
+define float @test_mulss(float %a0, float %a1, float *%a2) {
+; GENERIC-LABEL: test_mulss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: mulss %xmm1, %xmm0
+; GENERIC-NEXT: mulss (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_mulss:
+; ATOM: # BB#0:
+; ATOM-NEXT: mulss %xmm1, %xmm0
+; ATOM-NEXT: mulss (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_mulss:
+; SLM: # BB#0:
+; SLM-NEXT: mulss %xmm1, %xmm0 # sched: [5:2.00]
+; SLM-NEXT: mulss (%rdi), %xmm0 # sched: [8:2.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_mulss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmulss %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vmulss (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_mulss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmulss %xmm1, %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vmulss (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_mulss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmulss %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vmulss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fmul float %a0, %a1
+ %2 = load float, float *%a2, align 4
+ %3 = fmul float %1, %2
+ ret float %3
+}
+
+define <4 x float> @test_orps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_orps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: orps %xmm1, %xmm0
+; GENERIC-NEXT: orps (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_orps:
+; ATOM: # BB#0:
+; ATOM-NEXT: orps %xmm1, %xmm0
+; ATOM-NEXT: orps (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_orps:
+; SLM: # BB#0:
+; SLM-NEXT: orps %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: orps (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_orps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vorps %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vorps (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_orps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vorps %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: vorps (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_orps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vorps %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vorps (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast <4 x float> %a0 to <4 x i32>
+ %2 = bitcast <4 x float> %a1 to <4 x i32>
+ %3 = or <4 x i32> %1, %2
+ %4 = load <4 x float>, <4 x float> *%a2, align 16
+ %5 = bitcast <4 x float> %4 to <4 x i32>
+ %6 = or <4 x i32> %3, %5
+ %7 = bitcast <4 x i32> %6 to <4 x float>
+ ret <4 x float> %7
+}
+
+define void @test_prefetchnta(i8* %a0) {
+; GENERIC-LABEL: test_prefetchnta:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: prefetchnta (%rdi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_prefetchnta:
+; ATOM: # BB#0:
+; ATOM-NEXT: prefetchnta (%rdi)
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_prefetchnta:
+; SLM: # BB#0:
+; SLM-NEXT: prefetchnta (%rdi) # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_prefetchnta:
+; SANDY: # BB#0:
+; SANDY-NEXT: prefetchnta (%rdi) # sched: [4:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_prefetchnta:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: prefetchnta (%rdi) # sched: [4:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_prefetchnta:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: prefetchnta (%rdi) # sched: [5:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ call void @llvm.prefetch(i8* %a0, i32 0, i32 0, i32 1)
+ ret void
+}
+declare void @llvm.prefetch(i8* nocapture, i32, i32, i32) nounwind readnone
+
+define <4 x float> @test_rcpps(<4 x float> %a0, <4 x float> *%a1) {
+; GENERIC-LABEL: test_rcpps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: rcpps %xmm0, %xmm1
+; GENERIC-NEXT: rcpps (%rdi), %xmm0
+; GENERIC-NEXT: addps %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_rcpps:
+; ATOM: # BB#0:
+; ATOM-NEXT: rcpps (%rdi), %xmm1
+; ATOM-NEXT: rcpps %xmm0, %xmm0
+; ATOM-NEXT: addps %xmm0, %xmm1
+; ATOM-NEXT: movaps %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_rcpps:
+; SLM: # BB#0:
+; SLM-NEXT: rcpps (%rdi), %xmm1 # sched: [8:1.00]
+; SLM-NEXT: rcpps %xmm0, %xmm0 # sched: [5:1.00]
+; SLM-NEXT: addps %xmm0, %xmm1 # sched: [3:1.00]
+; SLM-NEXT: movaps %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_rcpps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vrcpps %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vrcpps (%rdi), %xmm1 # sched: [9:1.00]
+; SANDY-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_rcpps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vrcpps %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vrcpps (%rdi), %xmm1 # sched: [9:1.00]
+; HASWELL-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_rcpps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vrcpps (%rdi), %xmm1 # sched: [7:1.00]
+; BTVER2-NEXT: vrcpps %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x float> @llvm.x86.sse.rcp.ps(<4 x float> %a0)
+ %2 = load <4 x float>, <4 x float> *%a1, align 16
+ %3 = call <4 x float> @llvm.x86.sse.rcp.ps(<4 x float> %2)
+ %4 = fadd <4 x float> %1, %3
+ ret <4 x float> %4
+}
+declare <4 x float> @llvm.x86.sse.rcp.ps(<4 x float>) nounwind readnone
+
+; TODO - rcpss_m
+
+define <4 x float> @test_rcpss(float %a0, float *%a1) {
+; GENERIC-LABEL: test_rcpss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: rcpss %xmm0, %xmm0
+; GENERIC-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
+; GENERIC-NEXT: rcpss %xmm1, %xmm1
+; GENERIC-NEXT: addps %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_rcpss:
+; ATOM: # BB#0:
+; ATOM-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
+; ATOM-NEXT: rcpss %xmm0, %xmm0
+; ATOM-NEXT: rcpss %xmm1, %xmm1
+; ATOM-NEXT: addps %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_rcpss:
+; SLM: # BB#0:
+; SLM-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero sched: [3:1.00]
+; SLM-NEXT: rcpss %xmm0, %xmm0 # sched: [8:1.00]
+; SLM-NEXT: rcpss %xmm1, %xmm1 # sched: [8:1.00]
+; SLM-NEXT: addps %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_rcpss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vrcpss %xmm0, %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero sched: [4:0.50]
+; SANDY-NEXT: vrcpss %xmm1, %xmm1, %xmm1 # sched: [9:1.00]
+; SANDY-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_rcpss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vrcpss %xmm0, %xmm0, %xmm0 # sched: [9:1.00]
+; HASWELL-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero sched: [4:0.50]
+; HASWELL-NEXT: vrcpss %xmm1, %xmm1, %xmm1 # sched: [9:1.00]
+; HASWELL-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_rcpss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero sched: [5:1.00]
+; BTVER2-NEXT: vrcpss %xmm0, %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: vrcpss %xmm1, %xmm1, %xmm1 # sched: [7:1.00]
+; BTVER2-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = insertelement <4 x float> undef, float %a0, i32 0
+ %2 = call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %1)
+ %3 = load float, float *%a1, align 4
+ %4 = insertelement <4 x float> undef, float %3, i32 0
+ %5 = call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %4)
+ %6 = fadd <4 x float> %2, %5
+ ret <4 x float> %6
+}
+declare <4 x float> @llvm.x86.sse.rcp.ss(<4 x float>) nounwind readnone
+
+define <4 x float> @test_rsqrtps(<4 x float> %a0, <4 x float> *%a1) {
+; GENERIC-LABEL: test_rsqrtps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: rsqrtps %xmm0, %xmm1
+; GENERIC-NEXT: rsqrtps (%rdi), %xmm0
+; GENERIC-NEXT: addps %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_rsqrtps:
+; ATOM: # BB#0:
+; ATOM-NEXT: rsqrtps (%rdi), %xmm1
+; ATOM-NEXT: rsqrtps %xmm0, %xmm0
+; ATOM-NEXT: addps %xmm0, %xmm1
+; ATOM-NEXT: movaps %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_rsqrtps:
+; SLM: # BB#0:
+; SLM-NEXT: rsqrtps (%rdi), %xmm1 # sched: [8:1.00]
+; SLM-NEXT: rsqrtps %xmm0, %xmm0 # sched: [5:1.00]
+; SLM-NEXT: addps %xmm0, %xmm1 # sched: [3:1.00]
+; SLM-NEXT: movaps %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_rsqrtps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vrsqrtps %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vrsqrtps (%rdi), %xmm1 # sched: [9:1.00]
+; SANDY-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_rsqrtps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vrsqrtps %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vrsqrtps (%rdi), %xmm1 # sched: [9:1.00]
+; HASWELL-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_rsqrtps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vrsqrtps (%rdi), %xmm1 # sched: [7:1.00]
+; BTVER2-NEXT: vrsqrtps %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x float> @llvm.x86.sse.rsqrt.ps(<4 x float> %a0)
+ %2 = load <4 x float>, <4 x float> *%a1, align 16
+ %3 = call <4 x float> @llvm.x86.sse.rsqrt.ps(<4 x float> %2)
+ %4 = fadd <4 x float> %1, %3
+ ret <4 x float> %4
+}
+declare <4 x float> @llvm.x86.sse.rsqrt.ps(<4 x float>) nounwind readnone
+
+; TODO - rsqrtss_m
+
+define <4 x float> @test_rsqrtss(float %a0, float *%a1) {
+; GENERIC-LABEL: test_rsqrtss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: rsqrtss %xmm0, %xmm0
+; GENERIC-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
+; GENERIC-NEXT: rsqrtss %xmm1, %xmm1
+; GENERIC-NEXT: addps %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_rsqrtss:
+; ATOM: # BB#0:
+; ATOM-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
+; ATOM-NEXT: rsqrtss %xmm0, %xmm0
+; ATOM-NEXT: rsqrtss %xmm1, %xmm1
+; ATOM-NEXT: addps %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_rsqrtss:
+; SLM: # BB#0:
+; SLM-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero sched: [3:1.00]
+; SLM-NEXT: rsqrtss %xmm0, %xmm0 # sched: [8:1.00]
+; SLM-NEXT: rsqrtss %xmm1, %xmm1 # sched: [8:1.00]
+; SLM-NEXT: addps %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_rsqrtss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vrsqrtss %xmm0, %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero sched: [4:0.50]
+; SANDY-NEXT: vrsqrtss %xmm1, %xmm1, %xmm1 # sched: [9:1.00]
+; SANDY-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_rsqrtss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vrsqrtss %xmm0, %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero sched: [4:0.50]
+; HASWELL-NEXT: vrsqrtss %xmm1, %xmm1, %xmm1 # sched: [5:1.00]
+; HASWELL-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_rsqrtss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero sched: [5:1.00]
+; BTVER2-NEXT: vrsqrtss %xmm0, %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: vrsqrtss %xmm1, %xmm1, %xmm1 # sched: [7:1.00]
+; BTVER2-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = insertelement <4 x float> undef, float %a0, i32 0
+ %2 = call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %1)
+ %3 = load float, float *%a1, align 4
+ %4 = insertelement <4 x float> undef, float %3, i32 0
+ %5 = call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %4)
+ %6 = fadd <4 x float> %2, %5
+ ret <4 x float> %6
+}
+declare <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float>) nounwind readnone
+
+define void @test_sfence() {
+; GENERIC-LABEL: test_sfence:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: sfence
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_sfence:
+; ATOM: # BB#0:
+; ATOM-NEXT: sfence
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_sfence:
+; SLM: # BB#0:
+; SLM-NEXT: sfence # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_sfence:
+; SANDY: # BB#0:
+; SANDY-NEXT: sfence # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_sfence:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: sfence # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_sfence:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: sfence # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ call void @llvm.x86.sse.sfence()
+ ret void
+}
+declare void @llvm.x86.sse.sfence() nounwind readnone
+
+define <4 x float> @test_shufps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) nounwind {
+; GENERIC-LABEL: test_shufps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
+; GENERIC-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],mem[0,0]
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_shufps:
+; ATOM: # BB#0:
+; ATOM-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
+; ATOM-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],mem[0,0]
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_shufps:
+; SLM: # BB#0:
+; SLM-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0] sched: [1:1.00]
+; SLM-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],mem[0,0] sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_shufps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0] sched: [1:1.00]
+; SANDY-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,3],mem[0,0] sched: [5:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_shufps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0] sched: [1:1.00]
+; HASWELL-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,3],mem[0,0] sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_shufps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0] sched: [1:0.50]
+; BTVER2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,3],mem[0,0] sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> <i32 0, i32 0, i32 4, i32 4>
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = shufflevector <4 x float> %1, <4 x float> %2, <4 x i32> <i32 0, i32 3, i32 4, i32 4>
+ ret <4 x float> %3
+}
+
+define <4 x float> @test_sqrtps(<4 x float> %a0, <4 x float> *%a1) {
+; GENERIC-LABEL: test_sqrtps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: sqrtps %xmm0, %xmm1
+; GENERIC-NEXT: sqrtps (%rdi), %xmm0
+; GENERIC-NEXT: addps %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_sqrtps:
+; ATOM: # BB#0:
+; ATOM-NEXT: sqrtps %xmm0, %xmm1
+; ATOM-NEXT: sqrtps (%rdi), %xmm0
+; ATOM-NEXT: addps %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_sqrtps:
+; SLM: # BB#0:
+; SLM-NEXT: sqrtps (%rdi), %xmm1 # sched: [18:1.00]
+; SLM-NEXT: sqrtps %xmm0, %xmm0 # sched: [15:1.00]
+; SLM-NEXT: addps %xmm0, %xmm1 # sched: [3:1.00]
+; SLM-NEXT: movaps %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_sqrtps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vsqrtps %xmm0, %xmm0 # sched: [15:1.00]
+; SANDY-NEXT: vsqrtps (%rdi), %xmm1 # sched: [19:1.00]
+; SANDY-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_sqrtps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vsqrtps %xmm0, %xmm0 # sched: [15:1.00]
+; HASWELL-NEXT: vsqrtps (%rdi), %xmm1 # sched: [19:1.00]
+; HASWELL-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_sqrtps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vsqrtps (%rdi), %xmm1 # sched: [26:21.00]
+; BTVER2-NEXT: vsqrtps %xmm0, %xmm0 # sched: [21:21.00]
+; BTVER2-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float> %a0)
+ %2 = load <4 x float>, <4 x float> *%a1, align 16
+ %3 = call <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float> %2)
+ %4 = fadd <4 x float> %1, %3
+ ret <4 x float> %4
+}
+declare <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float>) nounwind readnone
+
+; TODO - sqrtss_m
+
+define <4 x float> @test_sqrtss(<4 x float> %a0, <4 x float> *%a1) {
+; GENERIC-LABEL: test_sqrtss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: sqrtss %xmm0, %xmm0
+; GENERIC-NEXT: movaps (%rdi), %xmm1
+; GENERIC-NEXT: sqrtss %xmm1, %xmm1
+; GENERIC-NEXT: addps %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_sqrtss:
+; ATOM: # BB#0:
+; ATOM-NEXT: movaps (%rdi), %xmm1
+; ATOM-NEXT: sqrtss %xmm0, %xmm0
+; ATOM-NEXT: sqrtss %xmm1, %xmm1
+; ATOM-NEXT: addps %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_sqrtss:
+; SLM: # BB#0:
+; SLM-NEXT: movaps (%rdi), %xmm1 # sched: [3:1.00]
+; SLM-NEXT: sqrtss %xmm0, %xmm0 # sched: [18:1.00]
+; SLM-NEXT: sqrtss %xmm1, %xmm1 # sched: [18:1.00]
+; SLM-NEXT: addps %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_sqrtss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vsqrtss %xmm0, %xmm0, %xmm0 # sched: [19:1.00]
+; SANDY-NEXT: vmovaps (%rdi), %xmm1 # sched: [4:0.50]
+; SANDY-NEXT: vsqrtss %xmm1, %xmm1, %xmm1 # sched: [19:1.00]
+; SANDY-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_sqrtss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vsqrtss %xmm0, %xmm0, %xmm0 # sched: [19:1.00]
+; HASWELL-NEXT: vmovaps (%rdi), %xmm1 # sched: [4:0.50]
+; HASWELL-NEXT: vsqrtss %xmm1, %xmm1, %xmm1 # sched: [19:1.00]
+; HASWELL-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_sqrtss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovaps (%rdi), %xmm1 # sched: [5:1.00]
+; BTVER2-NEXT: vsqrtss %xmm0, %xmm0, %xmm0 # sched: [26:21.00]
+; BTVER2-NEXT: vsqrtss %xmm1, %xmm1, %xmm1 # sched: [26:21.00]
+; BTVER2-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %a0)
+ %2 = load <4 x float>, <4 x float> *%a1, align 16
+ %3 = call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %2)
+ %4 = fadd <4 x float> %1, %3
+ ret <4 x float> %4
+}
+declare <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float>) nounwind readnone
+
+define i32 @test_stmxcsr() {
+; GENERIC-LABEL: test_stmxcsr:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: stmxcsr -{{[0-9]+}}(%rsp)
+; GENERIC-NEXT: movl -{{[0-9]+}}(%rsp), %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_stmxcsr:
+; ATOM: # BB#0:
+; ATOM-NEXT: stmxcsr -{{[0-9]+}}(%rsp)
+; ATOM-NEXT: movl -{{[0-9]+}}(%rsp), %eax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_stmxcsr:
+; SLM: # BB#0:
+; SLM-NEXT: stmxcsr -{{[0-9]+}}(%rsp) # sched: [1:1.00]
+; SLM-NEXT: movl -{{[0-9]+}}(%rsp), %eax # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_stmxcsr:
+; SANDY: # BB#0:
+; SANDY-NEXT: vstmxcsr -{{[0-9]+}}(%rsp) # sched: [1:1.00]
+; SANDY-NEXT: movl -{{[0-9]+}}(%rsp), %eax # sched: [4:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_stmxcsr:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vstmxcsr -{{[0-9]+}}(%rsp) # sched: [7:1.00]
+; HASWELL-NEXT: movl -{{[0-9]+}}(%rsp), %eax # sched: [4:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_stmxcsr:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vstmxcsr -{{[0-9]+}}(%rsp) # sched: [1:1.00]
+; BTVER2-NEXT: movl -{{[0-9]+}}(%rsp), %eax # sched: [5:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = alloca i32, align 4
+ %2 = bitcast i32* %1 to i8*
+ call void @llvm.x86.sse.stmxcsr(i8* %2)
+ %3 = load i32, i32* %1, align 4
+ ret i32 %3
+}
+declare void @llvm.x86.sse.stmxcsr(i8*) nounwind readnone
+
+define <4 x float> @test_subps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_subps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: subps %xmm1, %xmm0
+; GENERIC-NEXT: subps (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_subps:
+; ATOM: # BB#0:
+; ATOM-NEXT: subps %xmm1, %xmm0
+; ATOM-NEXT: subps (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_subps:
+; SLM: # BB#0:
+; SLM-NEXT: subps %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: subps (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_subps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vsubps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vsubps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_subps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vsubps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vsubps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_subps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vsubps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vsubps (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fsub <4 x float> %a0, %a1
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = fsub <4 x float> %1, %2
+ ret <4 x float> %3
+}
+
+define float @test_subss(float %a0, float %a1, float *%a2) {
+; GENERIC-LABEL: test_subss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: subss %xmm1, %xmm0
+; GENERIC-NEXT: subss (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_subss:
+; ATOM: # BB#0:
+; ATOM-NEXT: subss %xmm1, %xmm0
+; ATOM-NEXT: subss (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_subss:
+; SLM: # BB#0:
+; SLM-NEXT: subss %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: subss (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_subss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vsubss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vsubss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_subss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vsubss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vsubss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_subss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vsubss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vsubss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fsub float %a0, %a1
+ %2 = load float, float *%a2, align 4
+ %3 = fsub float %1, %2
+ ret float %3
+}
+
+define i32 @test_ucomiss(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_ucomiss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: ucomiss %xmm1, %xmm0
+; GENERIC-NEXT: setnp %al
+; GENERIC-NEXT: sete %cl
+; GENERIC-NEXT: andb %al, %cl
+; GENERIC-NEXT: ucomiss (%rdi), %xmm0
+; GENERIC-NEXT: setnp %al
+; GENERIC-NEXT: sete %dl
+; GENERIC-NEXT: andb %al, %dl
+; GENERIC-NEXT: orb %cl, %dl
+; GENERIC-NEXT: movzbl %dl, %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_ucomiss:
+; ATOM: # BB#0:
+; ATOM-NEXT: ucomiss %xmm1, %xmm0
+; ATOM-NEXT: setnp %al
+; ATOM-NEXT: sete %cl
+; ATOM-NEXT: andb %al, %cl
+; ATOM-NEXT: ucomiss (%rdi), %xmm0
+; ATOM-NEXT: setnp %al
+; ATOM-NEXT: sete %dl
+; ATOM-NEXT: andb %al, %dl
+; ATOM-NEXT: orb %cl, %dl
+; ATOM-NEXT: movzbl %dl, %eax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_ucomiss:
+; SLM: # BB#0:
+; SLM-NEXT: ucomiss %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: setnp %al # sched: [1:0.50]
+; SLM-NEXT: sete %cl # sched: [1:0.50]
+; SLM-NEXT: andb %al, %cl # sched: [1:0.50]
+; SLM-NEXT: ucomiss (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: setnp %al # sched: [1:0.50]
+; SLM-NEXT: sete %dl # sched: [1:0.50]
+; SLM-NEXT: andb %al, %dl # sched: [1:0.50]
+; SLM-NEXT: orb %cl, %dl # sched: [1:0.50]
+; SLM-NEXT: movzbl %dl, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_ucomiss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vucomiss %xmm1, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: setnp %al # sched: [1:0.33]
+; SANDY-NEXT: sete %cl # sched: [1:0.33]
+; SANDY-NEXT: andb %al, %cl # sched: [1:0.33]
+; SANDY-NEXT: vucomiss (%rdi), %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: setnp %al # sched: [1:0.33]
+; SANDY-NEXT: sete %dl # sched: [1:0.33]
+; SANDY-NEXT: andb %al, %dl # sched: [1:0.33]
+; SANDY-NEXT: orb %cl, %dl # sched: [1:0.33]
+; SANDY-NEXT: movzbl %dl, %eax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_ucomiss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vucomiss %xmm1, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: setnp %al # sched: [1:0.50]
+; HASWELL-NEXT: sete %cl # sched: [1:0.50]
+; HASWELL-NEXT: andb %al, %cl # sched: [1:0.25]
+; HASWELL-NEXT: vucomiss (%rdi), %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: setnp %al # sched: [1:0.50]
+; HASWELL-NEXT: sete %dl # sched: [1:0.50]
+; HASWELL-NEXT: andb %al, %dl # sched: [1:0.25]
+; HASWELL-NEXT: orb %cl, %dl # sched: [1:0.25]
+; HASWELL-NEXT: movzbl %dl, %eax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_ucomiss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vucomiss %xmm1, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: setnp %al # sched: [1:0.50]
+; BTVER2-NEXT: sete %cl # sched: [1:0.50]
+; BTVER2-NEXT: andb %al, %cl # sched: [1:0.50]
+; BTVER2-NEXT: vucomiss (%rdi), %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: setnp %al # sched: [1:0.50]
+; BTVER2-NEXT: sete %dl # sched: [1:0.50]
+; BTVER2-NEXT: andb %al, %dl # sched: [1:0.50]
+; BTVER2-NEXT: orb %cl, %dl # sched: [1:0.50]
+; BTVER2-NEXT: movzbl %dl, %eax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call i32 @llvm.x86.sse.ucomieq.ss(<4 x float> %a0, <4 x float> %a1)
+ %2 = load <4 x float>, <4 x float> *%a2, align 4
+ %3 = call i32 @llvm.x86.sse.ucomieq.ss(<4 x float> %a0, <4 x float> %2)
+ %4 = or i32 %1, %3
+ ret i32 %4
+}
+declare i32 @llvm.x86.sse.ucomieq.ss(<4 x float>, <4 x float>) nounwind readnone
+
+define <4 x float> @test_unpckhps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_unpckhps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; GENERIC-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2],mem[2],xmm0[3],mem[3]
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_unpckhps:
+; ATOM: # BB#0:
+; ATOM-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; ATOM-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2],mem[2],xmm0[3],mem[3]
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_unpckhps:
+; SLM: # BB#0:
+; SLM-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:1.00]
+; SLM-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2],mem[2],xmm0[3],mem[3] sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_unpckhps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vunpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:1.00]
+; SANDY-NEXT: vunpckhps {{.*#+}} xmm0 = xmm0[2],mem[2],xmm0[3],mem[3] sched: [5:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_unpckhps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vunpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:1.00]
+; HASWELL-NEXT: vunpckhps {{.*#+}} xmm0 = xmm0[2],mem[2],xmm0[3],mem[3] sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_unpckhps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vunpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:0.50]
+; BTVER2-NEXT: vunpckhps {{.*#+}} xmm0 = xmm0[2],mem[2],xmm0[3],mem[3] sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = shufflevector <4 x float> %1, <4 x float> %2, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
+ ret <4 x float> %3
+}
+
+define <4 x float> @test_unpcklps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_unpcklps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; GENERIC-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_unpcklps:
+; ATOM: # BB#0:
+; ATOM-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; ATOM-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_unpcklps:
+; SLM: # BB#0:
+; SLM-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] sched: [1:1.00]
+; SLM-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_unpcklps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] sched: [1:1.00]
+; SANDY-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] sched: [5:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_unpcklps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] sched: [1:1.00]
+; HASWELL-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_unpcklps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] sched: [1:0.50]
+; BTVER2-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
+ %2 = load <4 x float>, <4 x float> *%a2, align 16
+ %3 = shufflevector <4 x float> %1, <4 x float> %2, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
+ ret <4 x float> %3
+}
+
+define <4 x float> @test_xorps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
+; GENERIC-LABEL: test_xorps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: xorps %xmm1, %xmm0
+; GENERIC-NEXT: xorps (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_xorps:
+; ATOM: # BB#0:
+; ATOM-NEXT: xorps %xmm1, %xmm0
+; ATOM-NEXT: xorps (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_xorps:
+; SLM: # BB#0:
+; SLM-NEXT: xorps %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: xorps (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_xorps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vxorps %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vxorps (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_xorps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vxorps %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: vxorps (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_xorps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vxorps %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vxorps (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast <4 x float> %a0 to <4 x i32>
+ %2 = bitcast <4 x float> %a1 to <4 x i32>
+ %3 = xor <4 x i32> %1, %2
+ %4 = load <4 x float>, <4 x float> *%a2, align 16
+ %5 = bitcast <4 x float> %4 to <4 x i32>
+ %6 = xor <4 x i32> %3, %5
+ %7 = bitcast <4 x i32> %6 to <4 x float>
+ ret <4 x float> %7
+}
+
+!0 = !{i32 1}
diff --git a/test/CodeGen/X86/sse2-schedule.ll b/test/CodeGen/X86/sse2-schedule.ll
new file mode 100644
index 000000000000..33a4f413b683
--- /dev/null
+++ b/test/CodeGen/X86/sse2-schedule.ll
@@ -0,0 +1,6039 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule | FileCheck %s --check-prefix=CHECK --check-prefix=GENERIC
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=atom | FileCheck %s --check-prefix=CHECK --check-prefix=ATOM
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=slm | FileCheck %s --check-prefix=CHECK --check-prefix=SLM
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=sandybridge | FileCheck %s --check-prefix=CHECK --check-prefix=SANDY
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=ivybridge | FileCheck %s --check-prefix=CHECK --check-prefix=SANDY
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=haswell | FileCheck %s --check-prefix=CHECK --check-prefix=HASWELL
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skylake | FileCheck %s --check-prefix=CHECK --check-prefix=HASWELL
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=btver2 | FileCheck %s --check-prefix=CHECK --check-prefix=BTVER2
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=znver1 | FileCheck %s --check-prefix=CHECK --check-prefix=BTVER2
+
+define <2 x double> @test_addpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_addpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: addpd %xmm1, %xmm0
+; GENERIC-NEXT: addpd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_addpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: addpd %xmm1, %xmm0
+; ATOM-NEXT: addpd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_addpd:
+; SLM: # BB#0:
+; SLM-NEXT: addpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: addpd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_addpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vaddpd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_addpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vaddpd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_addpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vaddpd (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fadd <2 x double> %a0, %a1
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = fadd <2 x double> %1, %2
+ ret <2 x double> %3
+}
+
+define double @test_addsd(double %a0, double %a1, double *%a2) {
+; GENERIC-LABEL: test_addsd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: addsd %xmm1, %xmm0
+; GENERIC-NEXT: addsd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_addsd:
+; ATOM: # BB#0:
+; ATOM-NEXT: addsd %xmm1, %xmm0
+; ATOM-NEXT: addsd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_addsd:
+; SLM: # BB#0:
+; SLM-NEXT: addsd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: addsd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_addsd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vaddsd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_addsd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vaddsd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_addsd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vaddsd (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fadd double %a0, %a1
+ %2 = load double, double *%a2, align 8
+ %3 = fadd double %1, %2
+ ret double %3
+}
+
+define <2 x double> @test_andpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_andpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: andpd %xmm1, %xmm0
+; GENERIC-NEXT: andpd (%rdi), %xmm0
+; GENERIC-NEXT: addpd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_andpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: andpd %xmm1, %xmm0
+; ATOM-NEXT: andpd (%rdi), %xmm0
+; ATOM-NEXT: addpd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_andpd:
+; SLM: # BB#0:
+; SLM-NEXT: andpd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: andpd (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: addpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_andpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vandpd %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vandpd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_andpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vandpd %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: vandpd (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_andpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vandpd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vandpd (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast <2 x double> %a0 to <4 x i32>
+ %2 = bitcast <2 x double> %a1 to <4 x i32>
+ %3 = and <4 x i32> %1, %2
+ %4 = load <2 x double>, <2 x double> *%a2, align 16
+ %5 = bitcast <2 x double> %4 to <4 x i32>
+ %6 = and <4 x i32> %3, %5
+ %7 = bitcast <4 x i32> %6 to <2 x double>
+ %8 = fadd <2 x double> %a1, %7
+ ret <2 x double> %8
+}
+
+define <2 x double> @test_andnotpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_andnotpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: andnpd %xmm1, %xmm0
+; GENERIC-NEXT: andnpd (%rdi), %xmm0
+; GENERIC-NEXT: addpd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_andnotpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: andnpd %xmm1, %xmm0
+; ATOM-NEXT: andnpd (%rdi), %xmm0
+; ATOM-NEXT: addpd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_andnotpd:
+; SLM: # BB#0:
+; SLM-NEXT: andnpd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: andnpd (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: addpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_andnotpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vandnpd %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vandnpd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_andnotpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vandnpd %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: vandnpd (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_andnotpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vandnpd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vandnpd (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast <2 x double> %a0 to <4 x i32>
+ %2 = bitcast <2 x double> %a1 to <4 x i32>
+ %3 = xor <4 x i32> %1, <i32 -1, i32 -1, i32 -1, i32 -1>
+ %4 = and <4 x i32> %3, %2
+ %5 = load <2 x double>, <2 x double> *%a2, align 16
+ %6 = bitcast <2 x double> %5 to <4 x i32>
+ %7 = xor <4 x i32> %4, <i32 -1, i32 -1, i32 -1, i32 -1>
+ %8 = and <4 x i32> %6, %7
+ %9 = bitcast <4 x i32> %8 to <2 x double>
+ %10 = fadd <2 x double> %a1, %9
+ ret <2 x double> %10
+}
+
+define <2 x double> @test_cmppd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_cmppd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cmpeqpd %xmm0, %xmm1
+; GENERIC-NEXT: cmpeqpd (%rdi), %xmm0
+; GENERIC-NEXT: orpd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cmppd:
+; ATOM: # BB#0:
+; ATOM-NEXT: cmpeqpd %xmm0, %xmm1
+; ATOM-NEXT: cmpeqpd (%rdi), %xmm0
+; ATOM-NEXT: orpd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cmppd:
+; SLM: # BB#0:
+; SLM-NEXT: cmpeqpd %xmm0, %xmm1 # sched: [3:1.00]
+; SLM-NEXT: cmpeqpd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: orpd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cmppd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcmpeqpd %xmm1, %xmm0, %xmm1 # sched: [3:1.00]
+; SANDY-NEXT: vcmpeqpd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: vorpd %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cmppd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcmpeqpd %xmm1, %xmm0, %xmm1 # sched: [3:1.00]
+; HASWELL-NEXT: vcmpeqpd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: vorpd %xmm0, %xmm1, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cmppd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcmpeqpd %xmm1, %xmm0, %xmm1 # sched: [3:1.00]
+; BTVER2-NEXT: vcmpeqpd (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: vorpd %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fcmp oeq <2 x double> %a0, %a1
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = fcmp oeq <2 x double> %a0, %2
+ %4 = or <2 x i1> %1, %3
+ %5 = sext <2 x i1> %4 to <2 x i64>
+ %6 = bitcast <2 x i64> %5 to <2 x double>
+ ret <2 x double> %6
+}
+
+define double @test_cmpsd(double %a0, double %a1, double *%a2) {
+; GENERIC-LABEL: test_cmpsd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cmpeqsd %xmm1, %xmm0
+; GENERIC-NEXT: cmpeqsd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cmpsd:
+; ATOM: # BB#0:
+; ATOM-NEXT: cmpeqsd %xmm1, %xmm0
+; ATOM-NEXT: cmpeqsd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cmpsd:
+; SLM: # BB#0:
+; SLM-NEXT: cmpeqsd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: cmpeqsd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cmpsd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vcmpeqsd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cmpsd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vcmpeqsd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cmpsd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vcmpeqsd (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = insertelement <2 x double> undef, double %a0, i32 0
+ %2 = insertelement <2 x double> undef, double %a1, i32 0
+ %3 = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %1, <2 x double> %2, i8 0)
+ %4 = load double, double *%a2, align 8
+ %5 = insertelement <2 x double> undef, double %4, i32 0
+ %6 = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %3, <2 x double> %5, i8 0)
+ %7 = extractelement <2 x double> %6, i32 0
+ ret double %7
+}
+declare <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double>, <2 x double>, i8) nounwind readnone
+
+define i32 @test_comisd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_comisd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: comisd %xmm1, %xmm0
+; GENERIC-NEXT: setnp %al
+; GENERIC-NEXT: sete %cl
+; GENERIC-NEXT: andb %al, %cl
+; GENERIC-NEXT: comisd (%rdi), %xmm0
+; GENERIC-NEXT: setnp %al
+; GENERIC-NEXT: sete %dl
+; GENERIC-NEXT: andb %al, %dl
+; GENERIC-NEXT: orb %cl, %dl
+; GENERIC-NEXT: movzbl %dl, %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_comisd:
+; ATOM: # BB#0:
+; ATOM-NEXT: comisd %xmm1, %xmm0
+; ATOM-NEXT: setnp %al
+; ATOM-NEXT: sete %cl
+; ATOM-NEXT: andb %al, %cl
+; ATOM-NEXT: comisd (%rdi), %xmm0
+; ATOM-NEXT: setnp %al
+; ATOM-NEXT: sete %dl
+; ATOM-NEXT: andb %al, %dl
+; ATOM-NEXT: orb %cl, %dl
+; ATOM-NEXT: movzbl %dl, %eax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_comisd:
+; SLM: # BB#0:
+; SLM-NEXT: comisd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: setnp %al # sched: [1:0.50]
+; SLM-NEXT: sete %cl # sched: [1:0.50]
+; SLM-NEXT: andb %al, %cl # sched: [1:0.50]
+; SLM-NEXT: comisd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: setnp %al # sched: [1:0.50]
+; SLM-NEXT: sete %dl # sched: [1:0.50]
+; SLM-NEXT: andb %al, %dl # sched: [1:0.50]
+; SLM-NEXT: orb %cl, %dl # sched: [1:0.50]
+; SLM-NEXT: movzbl %dl, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_comisd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcomisd %xmm1, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: setnp %al # sched: [1:0.33]
+; SANDY-NEXT: sete %cl # sched: [1:0.33]
+; SANDY-NEXT: andb %al, %cl # sched: [1:0.33]
+; SANDY-NEXT: vcomisd (%rdi), %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: setnp %al # sched: [1:0.33]
+; SANDY-NEXT: sete %dl # sched: [1:0.33]
+; SANDY-NEXT: andb %al, %dl # sched: [1:0.33]
+; SANDY-NEXT: orb %cl, %dl # sched: [1:0.33]
+; SANDY-NEXT: movzbl %dl, %eax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_comisd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcomisd %xmm1, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: setnp %al # sched: [1:0.50]
+; HASWELL-NEXT: sete %cl # sched: [1:0.50]
+; HASWELL-NEXT: andb %al, %cl # sched: [1:0.25]
+; HASWELL-NEXT: vcomisd (%rdi), %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: setnp %al # sched: [1:0.50]
+; HASWELL-NEXT: sete %dl # sched: [1:0.50]
+; HASWELL-NEXT: andb %al, %dl # sched: [1:0.25]
+; HASWELL-NEXT: orb %cl, %dl # sched: [1:0.25]
+; HASWELL-NEXT: movzbl %dl, %eax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_comisd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcomisd %xmm1, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: setnp %al # sched: [1:0.50]
+; BTVER2-NEXT: sete %cl # sched: [1:0.50]
+; BTVER2-NEXT: andb %al, %cl # sched: [1:0.50]
+; BTVER2-NEXT: vcomisd (%rdi), %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: setnp %al # sched: [1:0.50]
+; BTVER2-NEXT: sete %dl # sched: [1:0.50]
+; BTVER2-NEXT: andb %al, %dl # sched: [1:0.50]
+; BTVER2-NEXT: orb %cl, %dl # sched: [1:0.50]
+; BTVER2-NEXT: movzbl %dl, %eax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call i32 @llvm.x86.sse2.comieq.sd(<2 x double> %a0, <2 x double> %a1)
+ %2 = load <2 x double>, <2 x double> *%a2, align 8
+ %3 = call i32 @llvm.x86.sse2.comieq.sd(<2 x double> %a0, <2 x double> %2)
+ %4 = or i32 %1, %3
+ ret i32 %4
+}
+declare i32 @llvm.x86.sse2.comieq.sd(<2 x double>, <2 x double>) nounwind readnone
+
+define <2 x double> @test_cvtdq2pd(<4 x i32> %a0, <4 x i32> *%a1) {
+; GENERIC-LABEL: test_cvtdq2pd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtdq2pd %xmm0, %xmm1
+; GENERIC-NEXT: cvtdq2pd (%rdi), %xmm0
+; GENERIC-NEXT: addpd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtdq2pd:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtdq2pd %xmm0, %xmm1
+; ATOM-NEXT: cvtdq2pd (%rdi), %xmm0
+; ATOM-NEXT: addpd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtdq2pd:
+; SLM: # BB#0:
+; SLM-NEXT: cvtdq2pd %xmm0, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: cvtdq2pd (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: addpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtdq2pd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtdq2pd %xmm0, %xmm0 # sched: [4:1.00]
+; SANDY-NEXT: vcvtdq2pd (%rdi), %xmm1 # sched: [8:1.00]
+; SANDY-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtdq2pd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtdq2pd %xmm0, %xmm0 # sched: [4:1.00]
+; HASWELL-NEXT: vcvtdq2pd (%rdi), %xmm1 # sched: [8:1.00]
+; HASWELL-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtdq2pd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtdq2pd (%rdi), %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vcvtdq2pd %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x i32> %a0, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
+ %2 = sitofp <2 x i32> %1 to <2 x double>
+ %3 = load <4 x i32>, <4 x i32>*%a1, align 16
+ %4 = shufflevector <4 x i32> %3, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
+ %5 = sitofp <2 x i32> %4 to <2 x double>
+ %6 = fadd <2 x double> %2, %5
+ ret <2 x double> %6
+}
+
+define <4 x float> @test_cvtdq2ps(<4 x i32> %a0, <4 x i32> *%a1) {
+; GENERIC-LABEL: test_cvtdq2ps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtdq2ps %xmm0, %xmm1
+; GENERIC-NEXT: cvtdq2ps (%rdi), %xmm0
+; GENERIC-NEXT: addps %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtdq2ps:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtdq2ps (%rdi), %xmm1
+; ATOM-NEXT: cvtdq2ps %xmm0, %xmm0
+; ATOM-NEXT: addps %xmm0, %xmm1
+; ATOM-NEXT: movaps %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtdq2ps:
+; SLM: # BB#0:
+; SLM-NEXT: cvtdq2ps %xmm0, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: cvtdq2ps (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: addps %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtdq2ps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtdq2ps %xmm0, %xmm0 # sched: [4:1.00]
+; SANDY-NEXT: vcvtdq2ps (%rdi), %xmm1 # sched: [8:1.00]
+; SANDY-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtdq2ps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtdq2ps %xmm0, %xmm0 # sched: [4:1.00]
+; HASWELL-NEXT: vcvtdq2ps (%rdi), %xmm1 # sched: [8:1.00]
+; HASWELL-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtdq2ps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtdq2ps (%rdi), %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vcvtdq2ps %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = sitofp <4 x i32> %a0 to <4 x float>
+ %2 = load <4 x i32>, <4 x i32>*%a1, align 16
+ %3 = sitofp <4 x i32> %2 to <4 x float>
+ %4 = fadd <4 x float> %1, %3
+ ret <4 x float> %4
+}
+
+define <4 x i32> @test_cvtpd2dq(<2 x double> %a0, <2 x double> *%a1) {
+; GENERIC-LABEL: test_cvtpd2dq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtpd2dq %xmm0, %xmm1
+; GENERIC-NEXT: cvtpd2dq (%rdi), %xmm0
+; GENERIC-NEXT: paddd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtpd2dq:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtpd2dq (%rdi), %xmm1
+; ATOM-NEXT: cvtpd2dq %xmm0, %xmm0
+; ATOM-NEXT: paddd %xmm0, %xmm1
+; ATOM-NEXT: movdqa %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtpd2dq:
+; SLM: # BB#0:
+; SLM-NEXT: cvtpd2dq %xmm0, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: cvtpd2dq (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: paddd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtpd2dq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtpd2dq %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vcvtpd2dqx (%rdi), %xmm1 # sched: [7:1.00]
+; SANDY-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtpd2dq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtpd2dq %xmm0, %xmm0 # sched: [4:1.00]
+; HASWELL-NEXT: vcvtpd2dqx (%rdi), %xmm1 # sched: [8:1.00]
+; HASWELL-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtpd2dq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtpd2dqx (%rdi), %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vcvtpd2dq %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double> %a0)
+ %2 = load <2 x double>, <2 x double> *%a1, align 16
+ %3 = call <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double> %2)
+ %4 = add <4 x i32> %1, %3
+ ret <4 x i32> %4
+}
+declare <4 x i32> @llvm.x86.sse2.cvtpd2dq(<2 x double>) nounwind readnone
+
+define <4 x float> @test_cvtpd2ps(<2 x double> %a0, <2 x double> *%a1) {
+; GENERIC-LABEL: test_cvtpd2ps:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtpd2ps %xmm0, %xmm1
+; GENERIC-NEXT: cvtpd2ps (%rdi), %xmm0
+; GENERIC-NEXT: addps %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtpd2ps:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtpd2ps (%rdi), %xmm1
+; ATOM-NEXT: cvtpd2ps %xmm0, %xmm0
+; ATOM-NEXT: addps %xmm0, %xmm1
+; ATOM-NEXT: movaps %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtpd2ps:
+; SLM: # BB#0:
+; SLM-NEXT: cvtpd2ps %xmm0, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: cvtpd2ps (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: addps %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtpd2ps:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtpd2ps %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vcvtpd2psx (%rdi), %xmm1 # sched: [7:1.00]
+; SANDY-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtpd2ps:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtpd2ps %xmm0, %xmm0 # sched: [4:1.00]
+; HASWELL-NEXT: vcvtpd2psx (%rdi), %xmm1 # sched: [8:1.00]
+; HASWELL-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtpd2ps:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtpd2psx (%rdi), %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vcvtpd2ps %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x float> @llvm.x86.sse2.cvtpd2ps(<2 x double> %a0)
+ %2 = load <2 x double>, <2 x double> *%a1, align 16
+ %3 = call <4 x float> @llvm.x86.sse2.cvtpd2ps(<2 x double> %2)
+ %4 = fadd <4 x float> %1, %3
+ ret <4 x float> %4
+}
+declare <4 x float> @llvm.x86.sse2.cvtpd2ps(<2 x double>) nounwind readnone
+
+define <4 x i32> @test_cvtps2dq(<4 x float> %a0, <4 x float> *%a1) {
+; GENERIC-LABEL: test_cvtps2dq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtps2dq %xmm0, %xmm1
+; GENERIC-NEXT: cvtps2dq (%rdi), %xmm0
+; GENERIC-NEXT: paddd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtps2dq:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtps2dq (%rdi), %xmm1
+; ATOM-NEXT: cvtps2dq %xmm0, %xmm0
+; ATOM-NEXT: paddd %xmm0, %xmm1
+; ATOM-NEXT: movdqa %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtps2dq:
+; SLM: # BB#0:
+; SLM-NEXT: cvtps2dq %xmm0, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: cvtps2dq (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: paddd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtps2dq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtps2dq %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vcvtps2dq (%rdi), %xmm1 # sched: [7:1.00]
+; SANDY-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtps2dq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtps2dq %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vcvtps2dq (%rdi), %xmm1 # sched: [7:1.00]
+; HASWELL-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtps2dq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtps2dq (%rdi), %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vcvtps2dq %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float> %a0)
+ %2 = load <4 x float>, <4 x float> *%a1, align 16
+ %3 = call <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float> %2)
+ %4 = add <4 x i32> %1, %3
+ ret <4 x i32> %4
+}
+declare <4 x i32> @llvm.x86.sse2.cvtps2dq(<4 x float>) nounwind readnone
+
+define <2 x double> @test_cvtps2pd(<4 x float> %a0, <4 x float> *%a1) {
+; GENERIC-LABEL: test_cvtps2pd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtps2pd %xmm0, %xmm1
+; GENERIC-NEXT: cvtps2pd (%rdi), %xmm0
+; GENERIC-NEXT: addpd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtps2pd:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtps2pd (%rdi), %xmm1
+; ATOM-NEXT: cvtps2pd %xmm0, %xmm0
+; ATOM-NEXT: addpd %xmm0, %xmm1
+; ATOM-NEXT: movapd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtps2pd:
+; SLM: # BB#0:
+; SLM-NEXT: cvtps2pd %xmm0, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: cvtps2pd (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: addpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtps2pd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtps2pd %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vcvtps2pd (%rdi), %xmm1 # sched: [7:1.00]
+; SANDY-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtps2pd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtps2pd %xmm0, %xmm0 # sched: [2:1.00]
+; HASWELL-NEXT: vcvtps2pd (%rdi), %xmm1 # sched: [5:1.00]
+; HASWELL-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtps2pd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtps2pd (%rdi), %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vcvtps2pd %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x float> %a0, <4 x float> undef, <2 x i32> <i32 0, i32 1>
+ %2 = fpext <2 x float> %1 to <2 x double>
+ %3 = load <4 x float>, <4 x float> *%a1, align 16
+ %4 = shufflevector <4 x float> %3, <4 x float> undef, <2 x i32> <i32 0, i32 1>
+ %5 = fpext <2 x float> %4 to <2 x double>
+ %6 = fadd <2 x double> %2, %5
+ ret <2 x double> %6
+}
+
+define i32 @test_cvtsd2si(double %a0, double *%a1) {
+; GENERIC-LABEL: test_cvtsd2si:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtsd2si %xmm0, %ecx
+; GENERIC-NEXT: cvtsd2si (%rdi), %eax
+; GENERIC-NEXT: addl %ecx, %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtsd2si:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtsd2si (%rdi), %eax
+; ATOM-NEXT: cvtsd2si %xmm0, %ecx
+; ATOM-NEXT: addl %ecx, %eax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtsd2si:
+; SLM: # BB#0:
+; SLM-NEXT: cvtsd2si (%rdi), %eax # sched: [7:1.00]
+; SLM-NEXT: cvtsd2si %xmm0, %ecx # sched: [4:0.50]
+; SLM-NEXT: addl %ecx, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtsd2si:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtsd2si %xmm0, %ecx # sched: [3:1.00]
+; SANDY-NEXT: vcvtsd2si (%rdi), %eax # sched: [7:1.00]
+; SANDY-NEXT: addl %ecx, %eax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtsd2si:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtsd2si %xmm0, %ecx # sched: [4:1.00]
+; HASWELL-NEXT: vcvtsd2si (%rdi), %eax # sched: [8:1.00]
+; HASWELL-NEXT: addl %ecx, %eax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtsd2si:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtsd2si (%rdi), %eax # sched: [8:1.00]
+; BTVER2-NEXT: vcvtsd2si %xmm0, %ecx # sched: [3:1.00]
+; BTVER2-NEXT: addl %ecx, %eax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = insertelement <2 x double> undef, double %a0, i32 0
+ %2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %1)
+ %3 = load double, double *%a1, align 8
+ %4 = insertelement <2 x double> undef, double %3, i32 0
+ %5 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %4)
+ %6 = add i32 %2, %5
+ ret i32 %6
+}
+declare i32 @llvm.x86.sse2.cvtsd2si(<2 x double>) nounwind readnone
+
+define i64 @test_cvtsd2siq(double %a0, double *%a1) {
+; GENERIC-LABEL: test_cvtsd2siq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtsd2si %xmm0, %rcx
+; GENERIC-NEXT: cvtsd2si (%rdi), %rax
+; GENERIC-NEXT: addq %rcx, %rax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtsd2siq:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtsd2si (%rdi), %rax
+; ATOM-NEXT: cvtsd2si %xmm0, %rcx
+; ATOM-NEXT: addq %rcx, %rax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtsd2siq:
+; SLM: # BB#0:
+; SLM-NEXT: cvtsd2si (%rdi), %rax # sched: [7:1.00]
+; SLM-NEXT: cvtsd2si %xmm0, %rcx # sched: [4:0.50]
+; SLM-NEXT: addq %rcx, %rax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtsd2siq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtsd2si %xmm0, %rcx # sched: [3:1.00]
+; SANDY-NEXT: vcvtsd2si (%rdi), %rax # sched: [7:1.00]
+; SANDY-NEXT: addq %rcx, %rax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtsd2siq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtsd2si %xmm0, %rcx # sched: [4:1.00]
+; HASWELL-NEXT: vcvtsd2si (%rdi), %rax # sched: [8:1.00]
+; HASWELL-NEXT: addq %rcx, %rax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtsd2siq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtsd2si (%rdi), %rax # sched: [8:1.00]
+; BTVER2-NEXT: vcvtsd2si %xmm0, %rcx # sched: [3:1.00]
+; BTVER2-NEXT: addq %rcx, %rax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = insertelement <2 x double> undef, double %a0, i32 0
+ %2 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %1)
+ %3 = load double, double *%a1, align 8
+ %4 = insertelement <2 x double> undef, double %3, i32 0
+ %5 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %4)
+ %6 = add i64 %2, %5
+ ret i64 %6
+}
+declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone
+
+define float @test_cvtsd2ss(double %a0, double *%a1) {
+; GENERIC-LABEL: test_cvtsd2ss:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtsd2ss %xmm0, %xmm1
+; GENERIC-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
+; GENERIC-NEXT: cvtsd2ss %xmm0, %xmm0
+; GENERIC-NEXT: addss %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtsd2ss:
+; ATOM: # BB#0:
+; ATOM-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
+; ATOM-NEXT: cvtsd2ss %xmm0, %xmm2
+; ATOM-NEXT: xorps %xmm0, %xmm0
+; ATOM-NEXT: cvtsd2ss %xmm1, %xmm0
+; ATOM-NEXT: addss %xmm2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtsd2ss:
+; SLM: # BB#0:
+; SLM-NEXT: cvtsd2ss %xmm0, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero sched: [3:1.00]
+; SLM-NEXT: cvtsd2ss %xmm0, %xmm0 # sched: [4:0.50]
+; SLM-NEXT: addss %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtsd2ss:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtsd2ss %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero sched: [4:0.50]
+; SANDY-NEXT: vcvtsd2ss %xmm1, %xmm1, %xmm1 # sched: [3:1.00]
+; SANDY-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtsd2ss:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtsd2ss %xmm0, %xmm0, %xmm0 # sched: [4:1.00]
+; HASWELL-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero sched: [4:0.50]
+; HASWELL-NEXT: vcvtsd2ss %xmm1, %xmm1, %xmm1 # sched: [4:1.00]
+; HASWELL-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtsd2ss:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero sched: [5:1.00]
+; BTVER2-NEXT: vcvtsd2ss %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vcvtsd2ss %xmm1, %xmm1, %xmm1 # sched: [3:1.00]
+; BTVER2-NEXT: vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fptrunc double %a0 to float
+ %2 = load double, double *%a1, align 8
+ %3 = fptrunc double %2 to float
+ %4 = fadd float %1, %3
+ ret float %4
+}
+
+define double @test_cvtsi2sd(i32 %a0, i32 *%a1) {
+; GENERIC-LABEL: test_cvtsi2sd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtsi2sdl %edi, %xmm1
+; GENERIC-NEXT: cvtsi2sdl (%rsi), %xmm0
+; GENERIC-NEXT: addsd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtsi2sd:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtsi2sdl (%rsi), %xmm0
+; ATOM-NEXT: cvtsi2sdl %edi, %xmm1
+; ATOM-NEXT: addsd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtsi2sd:
+; SLM: # BB#0:
+; SLM-NEXT: cvtsi2sdl (%rsi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: cvtsi2sdl %edi, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: addsd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtsi2sd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtsi2sdl %edi, %xmm0, %xmm0 # sched: [4:1.00]
+; SANDY-NEXT: vcvtsi2sdl (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; SANDY-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtsi2sd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtsi2sdl %edi, %xmm0, %xmm0 # sched: [4:1.00]
+; HASWELL-NEXT: vcvtsi2sdl (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; HASWELL-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtsi2sd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtsi2sdl %edi, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vcvtsi2sdl (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = sitofp i32 %a0 to double
+ %2 = load i32, i32 *%a1, align 8
+ %3 = sitofp i32 %2 to double
+ %4 = fadd double %1, %3
+ ret double %4
+}
+
+define double @test_cvtsi2sdq(i64 %a0, i64 *%a1) {
+; GENERIC-LABEL: test_cvtsi2sdq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtsi2sdq %rdi, %xmm1
+; GENERIC-NEXT: cvtsi2sdq (%rsi), %xmm0
+; GENERIC-NEXT: addsd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtsi2sdq:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvtsi2sdq (%rsi), %xmm0
+; ATOM-NEXT: cvtsi2sdq %rdi, %xmm1
+; ATOM-NEXT: addsd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtsi2sdq:
+; SLM: # BB#0:
+; SLM-NEXT: cvtsi2sdq (%rsi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: cvtsi2sdq %rdi, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: addsd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtsi2sdq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtsi2sdq %rdi, %xmm0, %xmm0 # sched: [4:1.00]
+; SANDY-NEXT: vcvtsi2sdq (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; SANDY-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtsi2sdq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtsi2sdq %rdi, %xmm0, %xmm0 # sched: [4:1.00]
+; HASWELL-NEXT: vcvtsi2sdq (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; HASWELL-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtsi2sdq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvtsi2sdq %rdi, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vcvtsi2sdq (%rsi), %xmm1, %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = sitofp i64 %a0 to double
+ %2 = load i64, i64 *%a1, align 8
+ %3 = sitofp i64 %2 to double
+ %4 = fadd double %1, %3
+ ret double %4
+}
+
+; TODO - cvtss2sd_m
+
+define double @test_cvtss2sd(float %a0, float *%a1) {
+; GENERIC-LABEL: test_cvtss2sd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvtss2sd %xmm0, %xmm1
+; GENERIC-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; GENERIC-NEXT: cvtss2sd %xmm0, %xmm0
+; GENERIC-NEXT: addsd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvtss2sd:
+; ATOM: # BB#0:
+; ATOM-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
+; ATOM-NEXT: cvtss2sd %xmm0, %xmm2
+; ATOM-NEXT: xorps %xmm0, %xmm0
+; ATOM-NEXT: cvtss2sd %xmm1, %xmm0
+; ATOM-NEXT: addsd %xmm2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvtss2sd:
+; SLM: # BB#0:
+; SLM-NEXT: cvtss2sd %xmm0, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero sched: [3:1.00]
+; SLM-NEXT: cvtss2sd %xmm0, %xmm0 # sched: [4:0.50]
+; SLM-NEXT: addsd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvtss2sd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero sched: [4:0.50]
+; SANDY-NEXT: vcvtss2sd %xmm1, %xmm1, %xmm1 # sched: [3:1.00]
+; SANDY-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvtss2sd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 # sched: [2:1.00]
+; HASWELL-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero sched: [4:0.50]
+; HASWELL-NEXT: vcvtss2sd %xmm1, %xmm1, %xmm1 # sched: [2:1.00]
+; HASWELL-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvtss2sd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero sched: [5:1.00]
+; BTVER2-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vcvtss2sd %xmm1, %xmm1, %xmm1 # sched: [3:1.00]
+; BTVER2-NEXT: vaddsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fpext float %a0 to double
+ %2 = load float, float *%a1, align 4
+ %3 = fpext float %2 to double
+ %4 = fadd double %1, %3
+ ret double %4
+}
+
+define <4 x i32> @test_cvttpd2dq(<2 x double> %a0, <2 x double> *%a1) {
+; GENERIC-LABEL: test_cvttpd2dq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvttpd2dq %xmm0, %xmm1
+; GENERIC-NEXT: cvttpd2dq (%rdi), %xmm0
+; GENERIC-NEXT: paddd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvttpd2dq:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvttpd2dq (%rdi), %xmm1
+; ATOM-NEXT: cvttpd2dq %xmm0, %xmm0
+; ATOM-NEXT: paddd %xmm0, %xmm1
+; ATOM-NEXT: movdqa %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvttpd2dq:
+; SLM: # BB#0:
+; SLM-NEXT: cvttpd2dq %xmm0, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: cvttpd2dq (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: paddd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvttpd2dq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvttpd2dq %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vcvttpd2dqx (%rdi), %xmm1 # sched: [7:1.00]
+; SANDY-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvttpd2dq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvttpd2dq %xmm0, %xmm0 # sched: [4:1.00]
+; HASWELL-NEXT: vcvttpd2dqx (%rdi), %xmm1 # sched: [8:1.00]
+; HASWELL-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvttpd2dq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvttpd2dqx (%rdi), %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vcvttpd2dq %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fptosi <2 x double> %a0 to <2 x i32>
+ %2 = shufflevector <2 x i32> %1, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+ %3 = load <2 x double>, <2 x double> *%a1, align 16
+ %4 = fptosi <2 x double> %3 to <2 x i32>
+ %5 = shufflevector <2 x i32> %4, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+ %6 = add <4 x i32> %2, %5
+ ret <4 x i32> %6
+}
+
+define <4 x i32> @test_cvttps2dq(<4 x float> %a0, <4 x float> *%a1) {
+; GENERIC-LABEL: test_cvttps2dq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvttps2dq %xmm0, %xmm1
+; GENERIC-NEXT: cvttps2dq (%rdi), %xmm0
+; GENERIC-NEXT: paddd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvttps2dq:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvttps2dq (%rdi), %xmm1
+; ATOM-NEXT: cvttps2dq %xmm0, %xmm0
+; ATOM-NEXT: paddd %xmm0, %xmm1
+; ATOM-NEXT: movdqa %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvttps2dq:
+; SLM: # BB#0:
+; SLM-NEXT: cvttps2dq %xmm0, %xmm1 # sched: [4:0.50]
+; SLM-NEXT: cvttps2dq (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: paddd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvttps2dq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvttps2dq %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vcvttps2dq (%rdi), %xmm1 # sched: [7:1.00]
+; SANDY-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvttps2dq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvttps2dq %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vcvttps2dq (%rdi), %xmm1 # sched: [7:1.00]
+; HASWELL-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvttps2dq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvttps2dq (%rdi), %xmm1 # sched: [8:1.00]
+; BTVER2-NEXT: vcvttps2dq %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fptosi <4 x float> %a0 to <4 x i32>
+ %2 = load <4 x float>, <4 x float> *%a1, align 16
+ %3 = fptosi <4 x float> %2 to <4 x i32>
+ %4 = add <4 x i32> %1, %3
+ ret <4 x i32> %4
+}
+
+define i32 @test_cvttsd2si(double %a0, double *%a1) {
+; GENERIC-LABEL: test_cvttsd2si:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvttsd2si %xmm0, %ecx
+; GENERIC-NEXT: cvttsd2si (%rdi), %eax
+; GENERIC-NEXT: addl %ecx, %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvttsd2si:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvttsd2si (%rdi), %eax
+; ATOM-NEXT: cvttsd2si %xmm0, %ecx
+; ATOM-NEXT: addl %ecx, %eax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvttsd2si:
+; SLM: # BB#0:
+; SLM-NEXT: cvttsd2si (%rdi), %eax # sched: [7:1.00]
+; SLM-NEXT: cvttsd2si %xmm0, %ecx # sched: [4:0.50]
+; SLM-NEXT: addl %ecx, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvttsd2si:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvttsd2si %xmm0, %ecx # sched: [3:1.00]
+; SANDY-NEXT: vcvttsd2si (%rdi), %eax # sched: [7:1.00]
+; SANDY-NEXT: addl %ecx, %eax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvttsd2si:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvttsd2si %xmm0, %ecx # sched: [4:1.00]
+; HASWELL-NEXT: vcvttsd2si (%rdi), %eax # sched: [8:1.00]
+; HASWELL-NEXT: addl %ecx, %eax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvttsd2si:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvttsd2si (%rdi), %eax # sched: [8:1.00]
+; BTVER2-NEXT: vcvttsd2si %xmm0, %ecx # sched: [3:1.00]
+; BTVER2-NEXT: addl %ecx, %eax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fptosi double %a0 to i32
+ %2 = load double, double *%a1, align 8
+ %3 = fptosi double %2 to i32
+ %4 = add i32 %1, %3
+ ret i32 %4
+}
+
+define i64 @test_cvttsd2siq(double %a0, double *%a1) {
+; GENERIC-LABEL: test_cvttsd2siq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: cvttsd2si %xmm0, %rcx
+; GENERIC-NEXT: cvttsd2si (%rdi), %rax
+; GENERIC-NEXT: addq %rcx, %rax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_cvttsd2siq:
+; ATOM: # BB#0:
+; ATOM-NEXT: cvttsd2si (%rdi), %rax
+; ATOM-NEXT: cvttsd2si %xmm0, %rcx
+; ATOM-NEXT: addq %rcx, %rax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_cvttsd2siq:
+; SLM: # BB#0:
+; SLM-NEXT: cvttsd2si (%rdi), %rax # sched: [7:1.00]
+; SLM-NEXT: cvttsd2si %xmm0, %rcx # sched: [4:0.50]
+; SLM-NEXT: addq %rcx, %rax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_cvttsd2siq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vcvttsd2si %xmm0, %rcx # sched: [3:1.00]
+; SANDY-NEXT: vcvttsd2si (%rdi), %rax # sched: [7:1.00]
+; SANDY-NEXT: addq %rcx, %rax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_cvttsd2siq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vcvttsd2si %xmm0, %rcx # sched: [4:1.00]
+; HASWELL-NEXT: vcvttsd2si (%rdi), %rax # sched: [8:1.00]
+; HASWELL-NEXT: addq %rcx, %rax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_cvttsd2siq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vcvttsd2si (%rdi), %rax # sched: [8:1.00]
+; BTVER2-NEXT: vcvttsd2si %xmm0, %rcx # sched: [3:1.00]
+; BTVER2-NEXT: addq %rcx, %rax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fptosi double %a0 to i64
+ %2 = load double, double *%a1, align 8
+ %3 = fptosi double %2 to i64
+ %4 = add i64 %1, %3
+ ret i64 %4
+}
+
+define <2 x double> @test_divpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_divpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: divpd %xmm1, %xmm0
+; GENERIC-NEXT: divpd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_divpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: divpd %xmm1, %xmm0
+; ATOM-NEXT: divpd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_divpd:
+; SLM: # BB#0:
+; SLM-NEXT: divpd %xmm1, %xmm0 # sched: [34:34.00]
+; SLM-NEXT: divpd (%rdi), %xmm0 # sched: [37:34.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_divpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vdivpd %xmm1, %xmm0, %xmm0 # sched: [12:1.00]
+; SANDY-NEXT: vdivpd (%rdi), %xmm0, %xmm0 # sched: [16:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_divpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vdivpd %xmm1, %xmm0, %xmm0 # sched: [12:1.00]
+; HASWELL-NEXT: vdivpd (%rdi), %xmm0, %xmm0 # sched: [16:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_divpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vdivpd %xmm1, %xmm0, %xmm0 # sched: [19:19.00]
+; BTVER2-NEXT: vdivpd (%rdi), %xmm0, %xmm0 # sched: [24:19.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fdiv <2 x double> %a0, %a1
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = fdiv <2 x double> %1, %2
+ ret <2 x double> %3
+}
+
+define double @test_divsd(double %a0, double %a1, double *%a2) {
+; GENERIC-LABEL: test_divsd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: divsd %xmm1, %xmm0
+; GENERIC-NEXT: divsd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_divsd:
+; ATOM: # BB#0:
+; ATOM-NEXT: divsd %xmm1, %xmm0
+; ATOM-NEXT: divsd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_divsd:
+; SLM: # BB#0:
+; SLM-NEXT: divsd %xmm1, %xmm0 # sched: [34:34.00]
+; SLM-NEXT: divsd (%rdi), %xmm0 # sched: [37:34.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_divsd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vdivsd %xmm1, %xmm0, %xmm0 # sched: [12:1.00]
+; SANDY-NEXT: vdivsd (%rdi), %xmm0, %xmm0 # sched: [16:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_divsd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vdivsd %xmm1, %xmm0, %xmm0 # sched: [12:1.00]
+; HASWELL-NEXT: vdivsd (%rdi), %xmm0, %xmm0 # sched: [16:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_divsd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vdivsd %xmm1, %xmm0, %xmm0 # sched: [19:19.00]
+; BTVER2-NEXT: vdivsd (%rdi), %xmm0, %xmm0 # sched: [24:19.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fdiv double %a0, %a1
+ %2 = load double, double *%a2, align 8
+ %3 = fdiv double %1, %2
+ ret double %3
+}
+
+define void @test_lfence() {
+; GENERIC-LABEL: test_lfence:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: lfence
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_lfence:
+; ATOM: # BB#0:
+; ATOM-NEXT: lfence
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_lfence:
+; SLM: # BB#0:
+; SLM-NEXT: lfence # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_lfence:
+; SANDY: # BB#0:
+; SANDY-NEXT: lfence # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_lfence:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: lfence # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_lfence:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: lfence # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ call void @llvm.x86.sse2.lfence()
+ ret void
+}
+declare void @llvm.x86.sse2.lfence() nounwind readnone
+
+define void @test_mfence() {
+; GENERIC-LABEL: test_mfence:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: mfence
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_mfence:
+; ATOM: # BB#0:
+; ATOM-NEXT: mfence
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_mfence:
+; SLM: # BB#0:
+; SLM-NEXT: mfence # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_mfence:
+; SANDY: # BB#0:
+; SANDY-NEXT: mfence # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_mfence:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: mfence # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_mfence:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: mfence # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ call void @llvm.x86.sse2.mfence()
+ ret void
+}
+declare void @llvm.x86.sse2.mfence() nounwind readnone
+
+define void @test_maskmovdqu(<16 x i8> %a0, <16 x i8> %a1, i8* %a2) {
+; GENERIC-LABEL: test_maskmovdqu:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: maskmovdqu %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_maskmovdqu:
+; ATOM: # BB#0:
+; ATOM-NEXT: maskmovdqu %xmm1, %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_maskmovdqu:
+; SLM: # BB#0:
+; SLM-NEXT: maskmovdqu %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_maskmovdqu:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmaskmovdqu %xmm1, %xmm0 # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_maskmovdqu:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmaskmovdqu %xmm1, %xmm0 # sched: [14:2.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_maskmovdqu:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmaskmovdqu %xmm1, %xmm0 # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ call void @llvm.x86.sse2.maskmov.dqu(<16 x i8> %a0, <16 x i8> %a1, i8* %a2)
+ ret void
+}
+declare void @llvm.x86.sse2.maskmov.dqu(<16 x i8>, <16 x i8>, i8*) nounwind
+
+define <2 x double> @test_maxpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_maxpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: maxpd %xmm1, %xmm0
+; GENERIC-NEXT: maxpd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_maxpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: maxpd %xmm1, %xmm0
+; ATOM-NEXT: maxpd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_maxpd:
+; SLM: # BB#0:
+; SLM-NEXT: maxpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: maxpd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_maxpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmaxpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmaxpd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_maxpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmaxpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmaxpd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_maxpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmaxpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmaxpd (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <2 x double> @llvm.x86.sse2.max.pd(<2 x double> %a0, <2 x double> %a1)
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = call <2 x double> @llvm.x86.sse2.max.pd(<2 x double> %1, <2 x double> %2)
+ ret <2 x double> %3
+}
+declare <2 x double> @llvm.x86.sse2.max.pd(<2 x double>, <2 x double>) nounwind readnone
+
+define <2 x double> @test_maxsd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_maxsd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: maxsd %xmm1, %xmm0
+; GENERIC-NEXT: maxsd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_maxsd:
+; ATOM: # BB#0:
+; ATOM-NEXT: maxsd %xmm1, %xmm0
+; ATOM-NEXT: maxsd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_maxsd:
+; SLM: # BB#0:
+; SLM-NEXT: maxsd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: maxsd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_maxsd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmaxsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmaxsd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_maxsd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmaxsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmaxsd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_maxsd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmaxsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmaxsd (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %a0, <2 x double> %a1)
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %1, <2 x double> %2)
+ ret <2 x double> %3
+}
+declare <2 x double> @llvm.x86.sse2.max.sd(<2 x double>, <2 x double>) nounwind readnone
+
+define <2 x double> @test_minpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_minpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: minpd %xmm1, %xmm0
+; GENERIC-NEXT: minpd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_minpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: minpd %xmm1, %xmm0
+; ATOM-NEXT: minpd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_minpd:
+; SLM: # BB#0:
+; SLM-NEXT: minpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: minpd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_minpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vminpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vminpd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_minpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vminpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vminpd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_minpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vminpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vminpd (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <2 x double> @llvm.x86.sse2.min.pd(<2 x double> %a0, <2 x double> %a1)
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = call <2 x double> @llvm.x86.sse2.min.pd(<2 x double> %1, <2 x double> %2)
+ ret <2 x double> %3
+}
+declare <2 x double> @llvm.x86.sse2.min.pd(<2 x double>, <2 x double>) nounwind readnone
+
+define <2 x double> @test_minsd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_minsd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: minsd %xmm1, %xmm0
+; GENERIC-NEXT: minsd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_minsd:
+; ATOM: # BB#0:
+; ATOM-NEXT: minsd %xmm1, %xmm0
+; ATOM-NEXT: minsd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_minsd:
+; SLM: # BB#0:
+; SLM-NEXT: minsd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: minsd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_minsd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vminsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vminsd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_minsd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vminsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vminsd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_minsd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vminsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vminsd (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %a0, <2 x double> %a1)
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %1, <2 x double> %2)
+ ret <2 x double> %3
+}
+declare <2 x double> @llvm.x86.sse2.min.sd(<2 x double>, <2 x double>) nounwind readnone
+
+define void @test_movapd(<2 x double> *%a0, <2 x double> *%a1) {
+; GENERIC-LABEL: test_movapd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movapd (%rdi), %xmm0
+; GENERIC-NEXT: addpd %xmm0, %xmm0
+; GENERIC-NEXT: movapd %xmm0, (%rsi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movapd:
+; ATOM: # BB#0:
+; ATOM-NEXT: movapd (%rdi), %xmm0
+; ATOM-NEXT: addpd %xmm0, %xmm0
+; ATOM-NEXT: movapd %xmm0, (%rsi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movapd:
+; SLM: # BB#0:
+; SLM-NEXT: movapd (%rdi), %xmm0 # sched: [3:1.00]
+; SLM-NEXT: addpd %xmm0, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: movapd %xmm0, (%rsi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movapd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovapd (%rdi), %xmm0 # sched: [4:0.50]
+; SANDY-NEXT: vaddpd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovapd %xmm0, (%rsi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movapd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovapd (%rdi), %xmm0 # sched: [4:0.50]
+; HASWELL-NEXT: vaddpd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmovapd %xmm0, (%rsi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movapd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovapd (%rdi), %xmm0 # sched: [5:1.00]
+; BTVER2-NEXT: vaddpd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmovapd %xmm0, (%rsi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = load <2 x double>, <2 x double> *%a0, align 16
+ %2 = fadd <2 x double> %1, %1
+ store <2 x double> %2, <2 x double> *%a1, align 16
+ ret void
+}
+
+define void @test_movdqa(<2 x i64> *%a0, <2 x i64> *%a1) {
+; GENERIC-LABEL: test_movdqa:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movdqa (%rdi), %xmm0
+; GENERIC-NEXT: paddq %xmm0, %xmm0
+; GENERIC-NEXT: movdqa %xmm0, (%rsi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movdqa:
+; ATOM: # BB#0:
+; ATOM-NEXT: movdqa (%rdi), %xmm0
+; ATOM-NEXT: paddq %xmm0, %xmm0
+; ATOM-NEXT: movdqa %xmm0, (%rsi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movdqa:
+; SLM: # BB#0:
+; SLM-NEXT: movdqa (%rdi), %xmm0 # sched: [3:1.00]
+; SLM-NEXT: paddq %xmm0, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: movdqa %xmm0, (%rsi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movdqa:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovdqa (%rdi), %xmm0 # sched: [4:0.50]
+; SANDY-NEXT: vpaddq %xmm0, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vmovdqa %xmm0, (%rsi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movdqa:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovdqa (%rdi), %xmm0 # sched: [4:0.50]
+; HASWELL-NEXT: vpaddq %xmm0, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vmovdqa %xmm0, (%rsi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movdqa:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovdqa (%rdi), %xmm0 # sched: [5:1.00]
+; BTVER2-NEXT: vpaddq %xmm0, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vmovdqa %xmm0, (%rsi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = load <2 x i64>, <2 x i64> *%a0, align 16
+ %2 = add <2 x i64> %1, %1
+ store <2 x i64> %2, <2 x i64> *%a1, align 16
+ ret void
+}
+
+define void @test_movdqu(<2 x i64> *%a0, <2 x i64> *%a1) {
+; GENERIC-LABEL: test_movdqu:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movdqu (%rdi), %xmm0
+; GENERIC-NEXT: paddq %xmm0, %xmm0
+; GENERIC-NEXT: movdqu %xmm0, (%rsi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movdqu:
+; ATOM: # BB#0:
+; ATOM-NEXT: movdqu (%rdi), %xmm0
+; ATOM-NEXT: paddq %xmm0, %xmm0
+; ATOM-NEXT: movdqu %xmm0, (%rsi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movdqu:
+; SLM: # BB#0:
+; SLM-NEXT: movdqu (%rdi), %xmm0 # sched: [3:1.00]
+; SLM-NEXT: paddq %xmm0, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: movdqu %xmm0, (%rsi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movdqu:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovdqu (%rdi), %xmm0 # sched: [4:0.50]
+; SANDY-NEXT: vpaddq %xmm0, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vmovdqu %xmm0, (%rsi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movdqu:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovdqu (%rdi), %xmm0 # sched: [4:0.50]
+; HASWELL-NEXT: vpaddq %xmm0, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vmovdqu %xmm0, (%rsi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movdqu:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovdqu (%rdi), %xmm0 # sched: [5:1.00]
+; BTVER2-NEXT: vpaddq %xmm0, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vmovdqu %xmm0, (%rsi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = load <2 x i64>, <2 x i64> *%a0, align 1
+ %2 = add <2 x i64> %1, %1
+ store <2 x i64> %2, <2 x i64> *%a1, align 1
+ ret void
+}
+
+define i32 @test_movd(<4 x i32> %a0, i32 %a1, i32 *%a2) {
+; GENERIC-LABEL: test_movd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movd %edi, %xmm1
+; GENERIC-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
+; GENERIC-NEXT: paddd %xmm0, %xmm1
+; GENERIC-NEXT: paddd %xmm0, %xmm2
+; GENERIC-NEXT: movd %xmm2, %eax
+; GENERIC-NEXT: movd %xmm1, (%rsi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movd:
+; ATOM: # BB#0:
+; ATOM-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
+; ATOM-NEXT: paddd %xmm0, %xmm1
+; ATOM-NEXT: movd %xmm1, %eax
+; ATOM-NEXT: movd %edi, %xmm1
+; ATOM-NEXT: paddd %xmm0, %xmm1
+; ATOM-NEXT: movd %xmm1, (%rsi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movd:
+; SLM: # BB#0:
+; SLM-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero sched: [3:1.00]
+; SLM-NEXT: movd %edi, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: paddd %xmm0, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: movd %xmm1, (%rsi) # sched: [1:1.00]
+; SLM-NEXT: paddd %xmm0, %xmm2 # sched: [1:0.50]
+; SLM-NEXT: movd %xmm2, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovd %edi, %xmm1 # sched: [1:0.33]
+; SANDY-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero sched: [4:0.50]
+; SANDY-NEXT: vpaddd %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; SANDY-NEXT: vpaddd %xmm2, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vmovd %xmm0, %eax # sched: [1:0.33]
+; SANDY-NEXT: vmovd %xmm1, (%rsi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovd %edi, %xmm1 # sched: [1:1.00]
+; HASWELL-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero sched: [4:0.50]
+; HASWELL-NEXT: vpaddd %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; HASWELL-NEXT: vpaddd %xmm2, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vmovd %xmm0, %eax # sched: [1:1.00]
+; HASWELL-NEXT: vmovd %xmm1, (%rsi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero sched: [5:1.00]
+; BTVER2-NEXT: vmovd %edi, %xmm1 # sched: [1:0.17]
+; BTVER2-NEXT: vpaddd %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; BTVER2-NEXT: vmovd %xmm1, (%rsi) # sched: [1:1.00]
+; BTVER2-NEXT: vpaddd %xmm2, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vmovd %xmm0, %eax # sched: [1:0.17]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = insertelement <4 x i32> undef, i32 %a1, i32 0
+ %2 = load i32, i32 *%a2
+ %3 = insertelement <4 x i32> undef, i32 %2, i32 0
+ %4 = add <4 x i32> %a0, %1
+ %5 = add <4 x i32> %a0, %3
+ %6 = extractelement <4 x i32> %4, i32 0
+ %7 = extractelement <4 x i32> %5, i32 0
+ store i32 %6, i32* %a2
+ ret i32 %7
+}
+
+define i64 @test_movd_64(<2 x i64> %a0, i64 %a1, i64 *%a2) {
+; GENERIC-LABEL: test_movd_64:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movd %rdi, %xmm1
+; GENERIC-NEXT: movq {{.*#+}} xmm2 = mem[0],zero
+; GENERIC-NEXT: paddq %xmm0, %xmm1
+; GENERIC-NEXT: paddq %xmm0, %xmm2
+; GENERIC-NEXT: movd %xmm2, %rax
+; GENERIC-NEXT: movq %xmm1, (%rsi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movd_64:
+; ATOM: # BB#0:
+; ATOM-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
+; ATOM-NEXT: movd %rdi, %xmm2
+; ATOM-NEXT: paddq %xmm0, %xmm2
+; ATOM-NEXT: paddq %xmm0, %xmm1
+; ATOM-NEXT: movq %xmm2, (%rsi)
+; ATOM-NEXT: movd %xmm1, %rax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movd_64:
+; SLM: # BB#0:
+; SLM-NEXT: movq {{.*#+}} xmm2 = mem[0],zero sched: [3:1.00]
+; SLM-NEXT: movd %rdi, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: paddq %xmm0, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: movq %xmm1, (%rsi) # sched: [1:1.00]
+; SLM-NEXT: paddq %xmm0, %xmm2 # sched: [1:0.50]
+; SLM-NEXT: movd %xmm2, %rax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movd_64:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovq %rdi, %xmm1 # sched: [1:0.33]
+; SANDY-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero sched: [4:0.50]
+; SANDY-NEXT: vpaddq %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; SANDY-NEXT: vpaddq %xmm2, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vmovq %xmm0, %rax # sched: [1:0.33]
+; SANDY-NEXT: vmovq %xmm1, (%rsi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movd_64:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovq %rdi, %xmm1 # sched: [1:1.00]
+; HASWELL-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero sched: [4:0.50]
+; HASWELL-NEXT: vpaddq %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; HASWELL-NEXT: vpaddq %xmm2, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vmovq %xmm0, %rax # sched: [1:1.00]
+; HASWELL-NEXT: vmovq %xmm1, (%rsi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movd_64:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero sched: [5:1.00]
+; BTVER2-NEXT: vmovq %rdi, %xmm1 # sched: [1:0.17]
+; BTVER2-NEXT: vpaddq %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; BTVER2-NEXT: vmovq %xmm1, (%rsi) # sched: [1:1.00]
+; BTVER2-NEXT: vpaddq %xmm2, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vmovq %xmm0, %rax # sched: [1:0.17]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = insertelement <2 x i64> undef, i64 %a1, i64 0
+ %2 = load i64, i64 *%a2
+ %3 = insertelement <2 x i64> undef, i64 %2, i64 0
+ %4 = add <2 x i64> %a0, %1
+ %5 = add <2 x i64> %a0, %3
+ %6 = extractelement <2 x i64> %4, i64 0
+ %7 = extractelement <2 x i64> %5, i64 0
+ store i64 %6, i64* %a2
+ ret i64 %7
+}
+
+define void @test_movhpd(<2 x double> %a0, <2 x double> %a1, x86_mmx *%a2) {
+; GENERIC-LABEL: test_movhpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
+; GENERIC-NEXT: addpd %xmm0, %xmm1
+; GENERIC-NEXT: movhpd %xmm1, (%rdi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movhpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
+; ATOM-NEXT: addpd %xmm0, %xmm1
+; ATOM-NEXT: movhpd %xmm1, (%rdi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movhpd:
+; SLM: # BB#0:
+; SLM-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [4:1.00]
+; SLM-NEXT: addpd %xmm0, %xmm1 # sched: [3:1.00]
+; SLM-NEXT: movhpd %xmm1, (%rdi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movhpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [5:1.00]
+; SANDY-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovhpd %xmm0, (%rdi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movhpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [5:1.00]
+; HASWELL-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmovhpd %xmm0, (%rdi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movhpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
+; BTVER2-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmovhpd %xmm0, (%rdi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast x86_mmx* %a2 to double*
+ %2 = load double, double *%1, align 8
+ %3 = insertelement <2 x double> %a1, double %2, i32 1
+ %4 = fadd <2 x double> %a0, %3
+ %5 = extractelement <2 x double> %4, i32 1
+ store double %5, double* %1
+ ret void
+}
+
+define void @test_movlpd(<2 x double> %a0, <2 x double> %a1, x86_mmx *%a2) {
+; GENERIC-LABEL: test_movlpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
+; GENERIC-NEXT: addpd %xmm0, %xmm1
+; GENERIC-NEXT: movlpd %xmm1, (%rdi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movlpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
+; ATOM-NEXT: addpd %xmm0, %xmm1
+; ATOM-NEXT: movlpd %xmm1, (%rdi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movlpd:
+; SLM: # BB#0:
+; SLM-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [4:1.00]
+; SLM-NEXT: addpd %xmm0, %xmm1 # sched: [3:1.00]
+; SLM-NEXT: movlpd %xmm1, (%rdi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movlpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [5:1.00]
+; SANDY-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovlpd %xmm0, (%rdi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movlpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [5:1.00]
+; HASWELL-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmovlpd %xmm0, (%rdi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movlpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
+; BTVER2-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmovlpd %xmm0, (%rdi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast x86_mmx* %a2 to double*
+ %2 = load double, double *%1, align 8
+ %3 = insertelement <2 x double> %a1, double %2, i32 0
+ %4 = fadd <2 x double> %a0, %3
+ %5 = extractelement <2 x double> %4, i32 0
+ store double %5, double* %1
+ ret void
+}
+
+define i32 @test_movmskpd(<2 x double> %a0) {
+; GENERIC-LABEL: test_movmskpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movmskpd %xmm0, %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movmskpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: movmskpd %xmm0, %eax
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movmskpd:
+; SLM: # BB#0:
+; SLM-NEXT: movmskpd %xmm0, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movmskpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovmskpd %xmm0, %eax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movmskpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovmskpd %xmm0, %eax # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movmskpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovmskpd %xmm0, %eax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call i32 @llvm.x86.sse2.movmsk.pd(<2 x double> %a0)
+ ret i32 %1
+}
+declare i32 @llvm.x86.sse2.movmsk.pd(<2 x double>) nounwind readnone
+
+define void @test_movntdqa(<2 x i64> %a0, <2 x i64> *%a1) {
+; GENERIC-LABEL: test_movntdqa:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: paddq %xmm0, %xmm0
+; GENERIC-NEXT: movntdq %xmm0, (%rdi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movntdqa:
+; ATOM: # BB#0:
+; ATOM-NEXT: paddq %xmm0, %xmm0
+; ATOM-NEXT: movntdq %xmm0, (%rdi)
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movntdqa:
+; SLM: # BB#0:
+; SLM-NEXT: paddq %xmm0, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: movntdq %xmm0, (%rdi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movntdqa:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpaddq %xmm0, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vmovntdq %xmm0, (%rdi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movntdqa:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpaddq %xmm0, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vmovntdq %xmm0, (%rdi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movntdqa:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpaddq %xmm0, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vmovntdq %xmm0, (%rdi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = add <2 x i64> %a0, %a0
+ store <2 x i64> %1, <2 x i64> *%a1, align 16, !nontemporal !0
+ ret void
+}
+
+define void @test_movntpd(<2 x double> %a0, <2 x double> *%a1) {
+; GENERIC-LABEL: test_movntpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: addpd %xmm0, %xmm0
+; GENERIC-NEXT: movntpd %xmm0, (%rdi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movntpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: addpd %xmm0, %xmm0
+; ATOM-NEXT: movntpd %xmm0, (%rdi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movntpd:
+; SLM: # BB#0:
+; SLM-NEXT: addpd %xmm0, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: movntpd %xmm0, (%rdi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movntpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vaddpd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovntpd %xmm0, (%rdi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movntpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vaddpd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmovntpd %xmm0, (%rdi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movntpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vaddpd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmovntpd %xmm0, (%rdi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fadd <2 x double> %a0, %a0
+ store <2 x double> %1, <2 x double> *%a1, align 16, !nontemporal !0
+ ret void
+}
+
+define <2 x i64> @test_movq_mem(<2 x i64> %a0, i64 *%a1) {
+; GENERIC-LABEL: test_movq_mem:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
+; GENERIC-NEXT: paddq %xmm1, %xmm0
+; GENERIC-NEXT: movq %xmm0, (%rdi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movq_mem:
+; ATOM: # BB#0:
+; ATOM-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
+; ATOM-NEXT: paddq %xmm1, %xmm0
+; ATOM-NEXT: movq %xmm0, (%rdi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movq_mem:
+; SLM: # BB#0:
+; SLM-NEXT: movq {{.*#+}} xmm1 = mem[0],zero sched: [3:1.00]
+; SLM-NEXT: paddq %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: movq %xmm0, (%rdi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movq_mem:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero sched: [4:0.50]
+; SANDY-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vmovq %xmm0, (%rdi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movq_mem:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero sched: [4:0.50]
+; HASWELL-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vmovq %xmm0, (%rdi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movq_mem:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero sched: [5:1.00]
+; BTVER2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vmovq %xmm0, (%rdi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = load i64, i64* %a1, align 1
+ %2 = insertelement <2 x i64> zeroinitializer, i64 %1, i32 0
+ %3 = add <2 x i64> %a0, %2
+ %4 = extractelement <2 x i64> %3, i32 0
+ store i64 %4, i64 *%a1, align 1
+ ret <2 x i64> %3
+}
+
+define <2 x i64> @test_movq_reg(<2 x i64> %a0, <2 x i64> %a1) {
+; GENERIC-LABEL: test_movq_reg:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero
+; GENERIC-NEXT: paddq %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movq_reg:
+; ATOM: # BB#0:
+; ATOM-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero
+; ATOM-NEXT: paddq %xmm1, %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movq_reg:
+; SLM: # BB#0:
+; SLM-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero sched: [1:0.50]
+; SLM-NEXT: paddq %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movq_reg:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero sched: [1:0.33]
+; SANDY-NEXT: vpaddq %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movq_reg:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero sched: [1:0.33]
+; HASWELL-NEXT: vpaddq %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movq_reg:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero sched: [1:0.50]
+; BTVER2-NEXT: vpaddq %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <2 x i64> %a0, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 2>
+ %2 = add <2 x i64> %a1, %1
+ ret <2 x i64> %2
+}
+
+define void @test_movsd_mem(double* %a0, double* %a1) {
+; GENERIC-LABEL: test_movsd_mem:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
+; GENERIC-NEXT: addsd %xmm0, %xmm0
+; GENERIC-NEXT: movsd %xmm0, (%rsi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movsd_mem:
+; ATOM: # BB#0:
+; ATOM-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
+; ATOM-NEXT: addsd %xmm0, %xmm0
+; ATOM-NEXT: movsd %xmm0, (%rsi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movsd_mem:
+; SLM: # BB#0:
+; SLM-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero sched: [3:1.00]
+; SLM-NEXT: addsd %xmm0, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: movsd %xmm0, (%rsi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movsd_mem:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero sched: [4:0.50]
+; SANDY-NEXT: vaddsd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovsd %xmm0, (%rsi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movsd_mem:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero sched: [4:0.50]
+; HASWELL-NEXT: vaddsd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmovsd %xmm0, (%rsi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movsd_mem:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero sched: [5:1.00]
+; BTVER2-NEXT: vaddsd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmovsd %xmm0, (%rsi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = load double, double* %a0, align 1
+ %2 = fadd double %1, %1
+ store double %2, double *%a1, align 1
+ ret void
+}
+
+define <2 x double> @test_movsd_reg(<2 x double> %a0, <2 x double> %a1) {
+; GENERIC-LABEL: test_movsd_reg:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
+; GENERIC-NEXT: movapd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movsd_reg:
+; ATOM: # BB#0:
+; ATOM-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
+; ATOM-NEXT: movapd %xmm1, %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movsd_reg:
+; SLM: # BB#0:
+; SLM-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0] sched: [1:1.00]
+; SLM-NEXT: movapd %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movsd_reg:
+; SANDY: # BB#0:
+; SANDY-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0] sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movsd_reg:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0] sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movsd_reg:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0] sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <2 x double> %a0, <2 x double> %a1, <2 x i32> <i32 2, i32 0>
+ ret <2 x double> %1
+}
+
+define void @test_movupd(<2 x double> *%a0, <2 x double> *%a1) {
+; GENERIC-LABEL: test_movupd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movupd (%rdi), %xmm0
+; GENERIC-NEXT: addpd %xmm0, %xmm0
+; GENERIC-NEXT: movupd %xmm0, (%rsi)
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_movupd:
+; ATOM: # BB#0:
+; ATOM-NEXT: movupd (%rdi), %xmm0
+; ATOM-NEXT: addpd %xmm0, %xmm0
+; ATOM-NEXT: movupd %xmm0, (%rsi)
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_movupd:
+; SLM: # BB#0:
+; SLM-NEXT: movupd (%rdi), %xmm0 # sched: [3:1.00]
+; SLM-NEXT: addpd %xmm0, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: movupd %xmm0, (%rsi) # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_movupd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmovupd (%rdi), %xmm0 # sched: [4:0.50]
+; SANDY-NEXT: vaddpd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vmovupd %xmm0, (%rsi) # sched: [1:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_movupd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmovupd (%rdi), %xmm0 # sched: [4:0.50]
+; HASWELL-NEXT: vaddpd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vmovupd %xmm0, (%rsi) # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_movupd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovupd (%rdi), %xmm0 # sched: [5:1.00]
+; BTVER2-NEXT: vaddpd %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vmovupd %xmm0, (%rsi) # sched: [1:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = load <2 x double>, <2 x double> *%a0, align 1
+ %2 = fadd <2 x double> %1, %1
+ store <2 x double> %2, <2 x double> *%a1, align 1
+ ret void
+}
+
+define <2 x double> @test_mulpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_mulpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: mulpd %xmm1, %xmm0
+; GENERIC-NEXT: mulpd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_mulpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: mulpd %xmm1, %xmm0
+; ATOM-NEXT: mulpd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_mulpd:
+; SLM: # BB#0:
+; SLM-NEXT: mulpd %xmm1, %xmm0 # sched: [5:2.00]
+; SLM-NEXT: mulpd (%rdi), %xmm0 # sched: [8:2.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_mulpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmulpd %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vmulpd (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_mulpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmulpd %xmm1, %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vmulpd (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_mulpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmulpd %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vmulpd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fmul <2 x double> %a0, %a1
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = fmul <2 x double> %1, %2
+ ret <2 x double> %3
+}
+
+define double @test_mulsd(double %a0, double %a1, double *%a2) {
+; GENERIC-LABEL: test_mulsd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: mulsd %xmm1, %xmm0
+; GENERIC-NEXT: mulsd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_mulsd:
+; ATOM: # BB#0:
+; ATOM-NEXT: mulsd %xmm1, %xmm0
+; ATOM-NEXT: mulsd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_mulsd:
+; SLM: # BB#0:
+; SLM-NEXT: mulsd %xmm1, %xmm0 # sched: [5:2.00]
+; SLM-NEXT: mulsd (%rdi), %xmm0 # sched: [8:2.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_mulsd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vmulsd %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vmulsd (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_mulsd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vmulsd %xmm1, %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vmulsd (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_mulsd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmulsd %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vmulsd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fmul double %a0, %a1
+ %2 = load double, double *%a2, align 8
+ %3 = fmul double %1, %2
+ ret double %3
+}
+
+define <2 x double> @test_orpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_orpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: orpd %xmm1, %xmm0
+; GENERIC-NEXT: orpd (%rdi), %xmm0
+; GENERIC-NEXT: addpd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_orpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: orpd %xmm1, %xmm0
+; ATOM-NEXT: orpd (%rdi), %xmm0
+; ATOM-NEXT: addpd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_orpd:
+; SLM: # BB#0:
+; SLM-NEXT: orpd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: orpd (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: addpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_orpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vorpd %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vorpd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_orpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vorpd %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: vorpd (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_orpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vorpd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vorpd (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast <2 x double> %a0 to <4 x i32>
+ %2 = bitcast <2 x double> %a1 to <4 x i32>
+ %3 = or <4 x i32> %1, %2
+ %4 = load <2 x double>, <2 x double> *%a2, align 16
+ %5 = bitcast <2 x double> %4 to <4 x i32>
+ %6 = or <4 x i32> %3, %5
+ %7 = bitcast <4 x i32> %6 to <2 x double>
+ %8 = fadd <2 x double> %a1, %7
+ ret <2 x double> %8
+}
+
+define <8 x i16> @test_packssdw(<4 x i32> %a0, <4 x i32> %a1, <4 x i32> *%a2) {
+; GENERIC-LABEL: test_packssdw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: packssdw %xmm1, %xmm0
+; GENERIC-NEXT: packssdw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_packssdw:
+; ATOM: # BB#0:
+; ATOM-NEXT: packssdw %xmm1, %xmm0
+; ATOM-NEXT: packssdw (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_packssdw:
+; SLM: # BB#0:
+; SLM-NEXT: packssdw %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: packssdw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_packssdw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpackssdw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_packssdw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: vpackssdw (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_packssdw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpackssdw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32> %a0, <4 x i32> %a1)
+ %2 = bitcast <8 x i16> %1 to <4 x i32>
+ %3 = load <4 x i32>, <4 x i32> *%a2, align 16
+ %4 = call <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32> %2, <4 x i32> %3)
+ ret <8 x i16> %4
+}
+declare <8 x i16> @llvm.x86.sse2.packssdw.128(<4 x i32>, <4 x i32>) nounwind readnone
+
+define <16 x i8> @test_packsswb(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_packsswb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: packsswb %xmm1, %xmm0
+; GENERIC-NEXT: packsswb (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_packsswb:
+; ATOM: # BB#0:
+; ATOM-NEXT: packsswb %xmm1, %xmm0
+; ATOM-NEXT: packsswb (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_packsswb:
+; SLM: # BB#0:
+; SLM-NEXT: packsswb %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: packsswb (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_packsswb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpacksswb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_packsswb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: vpacksswb (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_packsswb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpacksswb (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = bitcast <16 x i8> %1 to <8 x i16>
+ %3 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %4 = call <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16> %2, <8 x i16> %3)
+ ret <16 x i8> %4
+}
+declare <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <16 x i8> @test_packuswb(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_packuswb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: packuswb %xmm1, %xmm0
+; GENERIC-NEXT: packuswb (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_packuswb:
+; ATOM: # BB#0:
+; ATOM-NEXT: packuswb %xmm1, %xmm0
+; ATOM-NEXT: packuswb (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_packuswb:
+; SLM: # BB#0:
+; SLM-NEXT: packuswb %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: packuswb (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_packuswb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpackuswb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_packuswb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: vpackuswb (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_packuswb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpackuswb (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = bitcast <16 x i8> %1 to <8 x i16>
+ %3 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %4 = call <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16> %2, <8 x i16> %3)
+ ret <16 x i8> %4
+}
+declare <16 x i8> @llvm.x86.sse2.packuswb.128(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <16 x i8> @test_paddb(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_paddb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: paddb %xmm1, %xmm0
+; GENERIC-NEXT: paddb (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_paddb:
+; ATOM: # BB#0:
+; ATOM-NEXT: paddb %xmm1, %xmm0
+; ATOM-NEXT: paddb (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_paddb:
+; SLM: # BB#0:
+; SLM-NEXT: paddb %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: paddb (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_paddb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpaddb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpaddb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_paddb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpaddb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpaddb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_paddb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpaddb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpaddb (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = add <16 x i8> %a0, %a1
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = add <16 x i8> %1, %2
+ ret <16 x i8> %3
+}
+
+define <4 x i32> @test_paddd(<4 x i32> %a0, <4 x i32> %a1, <4 x i32> *%a2) {
+; GENERIC-LABEL: test_paddd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: paddd %xmm1, %xmm0
+; GENERIC-NEXT: paddd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_paddd:
+; ATOM: # BB#0:
+; ATOM-NEXT: paddd %xmm1, %xmm0
+; ATOM-NEXT: paddd (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_paddd:
+; SLM: # BB#0:
+; SLM-NEXT: paddd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: paddd (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_paddd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpaddd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_paddd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpaddd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_paddd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpaddd (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = add <4 x i32> %a0, %a1
+ %2 = load <4 x i32>, <4 x i32> *%a2, align 16
+ %3 = add <4 x i32> %1, %2
+ ret <4 x i32> %3
+}
+
+define <2 x i64> @test_paddq(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
+; GENERIC-LABEL: test_paddq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: paddq %xmm1, %xmm0
+; GENERIC-NEXT: paddq (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_paddq:
+; ATOM: # BB#0:
+; ATOM-NEXT: paddq %xmm1, %xmm0
+; ATOM-NEXT: paddq (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_paddq:
+; SLM: # BB#0:
+; SLM-NEXT: paddq %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: paddq (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_paddq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpaddq (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_paddq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpaddq (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_paddq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpaddq (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = add <2 x i64> %a0, %a1
+ %2 = load <2 x i64>, <2 x i64> *%a2, align 16
+ %3 = add <2 x i64> %1, %2
+ ret <2 x i64> %3
+}
+
+define <16 x i8> @test_paddsb(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_paddsb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: paddsb %xmm1, %xmm0
+; GENERIC-NEXT: paddsb (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_paddsb:
+; ATOM: # BB#0:
+; ATOM-NEXT: paddsb %xmm1, %xmm0
+; ATOM-NEXT: paddsb (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_paddsb:
+; SLM: # BB#0:
+; SLM-NEXT: paddsb %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: paddsb (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_paddsb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpaddsb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_paddsb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpaddsb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_paddsb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpaddsb (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <16 x i8> @llvm.x86.sse2.padds.b(<16 x i8> %a0, <16 x i8> %a1)
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = call <16 x i8> @llvm.x86.sse2.padds.b(<16 x i8> %1, <16 x i8> %2)
+ ret <16 x i8> %3
+}
+declare <16 x i8> @llvm.x86.sse2.padds.b(<16 x i8>, <16 x i8>) nounwind readnone
+
+define <8 x i16> @test_paddsw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_paddsw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: paddsw %xmm1, %xmm0
+; GENERIC-NEXT: paddsw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_paddsw:
+; ATOM: # BB#0:
+; ATOM-NEXT: paddsw %xmm1, %xmm0
+; ATOM-NEXT: paddsw (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_paddsw:
+; SLM: # BB#0:
+; SLM-NEXT: paddsw %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: paddsw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_paddsw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpaddsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpaddsw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_paddsw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpaddsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpaddsw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_paddsw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpaddsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpaddsw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16> %1, <8 x i16> %2)
+ ret <8 x i16> %3
+}
+declare <8 x i16> @llvm.x86.sse2.padds.w(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <16 x i8> @test_paddusb(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_paddusb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: paddusb %xmm1, %xmm0
+; GENERIC-NEXT: paddusb (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_paddusb:
+; ATOM: # BB#0:
+; ATOM-NEXT: paddusb %xmm1, %xmm0
+; ATOM-NEXT: paddusb (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_paddusb:
+; SLM: # BB#0:
+; SLM-NEXT: paddusb %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: paddusb (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_paddusb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpaddusb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_paddusb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpaddusb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_paddusb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpaddusb (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8> %a0, <16 x i8> %a1)
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = call <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8> %1, <16 x i8> %2)
+ ret <16 x i8> %3
+}
+declare <16 x i8> @llvm.x86.sse2.paddus.b(<16 x i8>, <16 x i8>) nounwind readnone
+
+define <8 x i16> @test_paddusw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_paddusw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: paddusw %xmm1, %xmm0
+; GENERIC-NEXT: paddusw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_paddusw:
+; ATOM: # BB#0:
+; ATOM-NEXT: paddusw %xmm1, %xmm0
+; ATOM-NEXT: paddusw (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_paddusw:
+; SLM: # BB#0:
+; SLM-NEXT: paddusw %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: paddusw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_paddusw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpaddusw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_paddusw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpaddusw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_paddusw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpaddusw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16> %1, <8 x i16> %2)
+ ret <8 x i16> %3
+}
+declare <8 x i16> @llvm.x86.sse2.paddus.w(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <8 x i16> @test_paddw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_paddw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: paddw %xmm1, %xmm0
+; GENERIC-NEXT: paddw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_paddw:
+; ATOM: # BB#0:
+; ATOM-NEXT: paddw %xmm1, %xmm0
+; ATOM-NEXT: paddw (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_paddw:
+; SLM: # BB#0:
+; SLM-NEXT: paddw %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: paddw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_paddw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpaddw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpaddw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_paddw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpaddw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpaddw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_paddw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpaddw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpaddw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = add <8 x i16> %a0, %a1
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = add <8 x i16> %1, %2
+ ret <8 x i16> %3
+}
+
+define <2 x i64> @test_pand(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
+; GENERIC-LABEL: test_pand:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pand %xmm1, %xmm0
+; GENERIC-NEXT: pand (%rdi), %xmm0
+; GENERIC-NEXT: paddq %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pand:
+; ATOM: # BB#0:
+; ATOM-NEXT: pand %xmm1, %xmm0
+; ATOM-NEXT: pand (%rdi), %xmm0
+; ATOM-NEXT: paddq %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pand:
+; SLM: # BB#0:
+; SLM-NEXT: pand %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: pand (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: paddq %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pand:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpand %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vpand (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pand:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpand %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; HASWELL-NEXT: vpand (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pand:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpand %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpand (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = and <2 x i64> %a0, %a1
+ %2 = load <2 x i64>, <2 x i64> *%a2, align 16
+ %3 = and <2 x i64> %1, %2
+ %4 = add <2 x i64> %3, %a1
+ ret <2 x i64> %4
+}
+
+define <2 x i64> @test_pandn(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
+; GENERIC-LABEL: test_pandn:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pandn %xmm1, %xmm0
+; GENERIC-NEXT: movdqa %xmm0, %xmm1
+; GENERIC-NEXT: pandn (%rdi), %xmm1
+; GENERIC-NEXT: paddq %xmm0, %xmm1
+; GENERIC-NEXT: movdqa %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pandn:
+; ATOM: # BB#0:
+; ATOM-NEXT: pandn %xmm1, %xmm0
+; ATOM-NEXT: movdqa %xmm0, %xmm1
+; ATOM-NEXT: pandn (%rdi), %xmm1
+; ATOM-NEXT: paddq %xmm0, %xmm1
+; ATOM-NEXT: movdqa %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pandn:
+; SLM: # BB#0:
+; SLM-NEXT: pandn %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: movdqa %xmm0, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: pandn (%rdi), %xmm1 # sched: [4:1.00]
+; SLM-NEXT: paddq %xmm0, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: movdqa %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pandn:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpandn %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vpandn (%rdi), %xmm0, %xmm1 # sched: [5:0.50]
+; SANDY-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pandn:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpandn %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; HASWELL-NEXT: vpandn (%rdi), %xmm0, %xmm1 # sched: [5:0.50]
+; HASWELL-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pandn:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpandn %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpandn (%rdi), %xmm0, %xmm1 # sched: [6:1.00]
+; BTVER2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = xor <2 x i64> %a0, <i64 -1, i64 -1>
+ %2 = and <2 x i64> %a1, %1
+ %3 = load <2 x i64>, <2 x i64> *%a2, align 16
+ %4 = xor <2 x i64> %2, <i64 -1, i64 -1>
+ %5 = and <2 x i64> %3, %4
+ %6 = add <2 x i64> %2, %5
+ ret <2 x i64> %6
+}
+
+define <16 x i8> @test_pavgb(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_pavgb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pavgb %xmm1, %xmm0
+; GENERIC-NEXT: pavgb (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pavgb:
+; ATOM: # BB#0:
+; ATOM-NEXT: pavgb %xmm1, %xmm0
+; ATOM-NEXT: pavgb (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pavgb:
+; SLM: # BB#0:
+; SLM-NEXT: pavgb %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: pavgb (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pavgb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpavgb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpavgb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pavgb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpavgb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpavgb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pavgb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpavgb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpavgb (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8> %a0, <16 x i8> %a1)
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = call <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8> %1, <16 x i8> %2)
+ ret <16 x i8> %3
+}
+declare <16 x i8> @llvm.x86.sse2.pavg.b(<16 x i8> %arg0, <16 x i8> %arg1) nounwind readnone
+
+define <8 x i16> @test_pavgw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_pavgw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pavgw %xmm1, %xmm0
+; GENERIC-NEXT: pavgw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pavgw:
+; ATOM: # BB#0:
+; ATOM-NEXT: pavgw %xmm1, %xmm0
+; ATOM-NEXT: pavgw (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pavgw:
+; SLM: # BB#0:
+; SLM-NEXT: pavgw %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: pavgw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pavgw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpavgw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpavgw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pavgw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpavgw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpavgw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pavgw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpavgw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpavgw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16> %1, <8 x i16> %2)
+ ret <8 x i16> %3
+}
+declare <8 x i16> @llvm.x86.sse2.pavg.w(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <16 x i8> @test_pcmpeqb(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_pcmpeqb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pcmpeqb %xmm0, %xmm1
+; GENERIC-NEXT: pcmpeqb (%rdi), %xmm0
+; GENERIC-NEXT: por %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pcmpeqb:
+; ATOM: # BB#0:
+; ATOM-NEXT: pcmpeqb %xmm0, %xmm1
+; ATOM-NEXT: pcmpeqb (%rdi), %xmm0
+; ATOM-NEXT: por %xmm1, %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pcmpeqb:
+; SLM: # BB#0:
+; SLM-NEXT: pcmpeqb %xmm0, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: pcmpeqb (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: por %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pcmpeqb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; SANDY-NEXT: vpcmpeqb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pcmpeqb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; HASWELL-NEXT: vpcmpeqb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pcmpeqb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; BTVER2-NEXT: vpcmpeqb (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = icmp eq <16 x i8> %a0, %a1
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = icmp eq <16 x i8> %a0, %2
+ %4 = or <16 x i1> %1, %3
+ %5 = sext <16 x i1> %4 to <16 x i8>
+ ret <16 x i8> %5
+}
+
+define <4 x i32> @test_pcmpeqd(<4 x i32> %a0, <4 x i32> %a1, <4 x i32> *%a2) {
+; GENERIC-LABEL: test_pcmpeqd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pcmpeqd %xmm0, %xmm1
+; GENERIC-NEXT: pcmpeqd (%rdi), %xmm0
+; GENERIC-NEXT: por %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pcmpeqd:
+; ATOM: # BB#0:
+; ATOM-NEXT: pcmpeqd %xmm0, %xmm1
+; ATOM-NEXT: pcmpeqd (%rdi), %xmm0
+; ATOM-NEXT: por %xmm1, %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pcmpeqd:
+; SLM: # BB#0:
+; SLM-NEXT: pcmpeqd %xmm0, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: pcmpeqd (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: por %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pcmpeqd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; SANDY-NEXT: vpcmpeqd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pcmpeqd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; HASWELL-NEXT: vpcmpeqd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pcmpeqd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; BTVER2-NEXT: vpcmpeqd (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = icmp eq <4 x i32> %a0, %a1
+ %2 = load <4 x i32>, <4 x i32> *%a2, align 16
+ %3 = icmp eq <4 x i32> %a0, %2
+ %4 = or <4 x i1> %1, %3
+ %5 = sext <4 x i1> %4 to <4 x i32>
+ ret <4 x i32> %5
+}
+
+define <8 x i16> @test_pcmpeqw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_pcmpeqw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pcmpeqw %xmm0, %xmm1
+; GENERIC-NEXT: pcmpeqw (%rdi), %xmm0
+; GENERIC-NEXT: por %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pcmpeqw:
+; ATOM: # BB#0:
+; ATOM-NEXT: pcmpeqw %xmm0, %xmm1
+; ATOM-NEXT: pcmpeqw (%rdi), %xmm0
+; ATOM-NEXT: por %xmm1, %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pcmpeqw:
+; SLM: # BB#0:
+; SLM-NEXT: pcmpeqw %xmm0, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: pcmpeqw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: por %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pcmpeqw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; SANDY-NEXT: vpcmpeqw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pcmpeqw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; HASWELL-NEXT: vpcmpeqw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pcmpeqw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; BTVER2-NEXT: vpcmpeqw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = icmp eq <8 x i16> %a0, %a1
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = icmp eq <8 x i16> %a0, %2
+ %4 = or <8 x i1> %1, %3
+ %5 = sext <8 x i1> %4 to <8 x i16>
+ ret <8 x i16> %5
+}
+
+define <16 x i8> @test_pcmpgtb(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_pcmpgtb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movdqa %xmm0, %xmm2
+; GENERIC-NEXT: pcmpgtb %xmm1, %xmm2
+; GENERIC-NEXT: pcmpgtb (%rdi), %xmm0
+; GENERIC-NEXT: por %xmm2, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pcmpgtb:
+; ATOM: # BB#0:
+; ATOM-NEXT: movdqa %xmm0, %xmm2
+; ATOM-NEXT: pcmpgtb (%rdi), %xmm0
+; ATOM-NEXT: pcmpgtb %xmm1, %xmm2
+; ATOM-NEXT: por %xmm2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pcmpgtb:
+; SLM: # BB#0:
+; SLM-NEXT: movdqa %xmm0, %xmm2 # sched: [1:0.50]
+; SLM-NEXT: pcmpgtb (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: pcmpgtb %xmm1, %xmm2 # sched: [1:0.50]
+; SLM-NEXT: por %xmm2, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pcmpgtb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; SANDY-NEXT: vpcmpgtb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pcmpgtb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; HASWELL-NEXT: vpcmpgtb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pcmpgtb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; BTVER2-NEXT: vpcmpgtb (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = icmp sgt <16 x i8> %a0, %a1
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = icmp sgt <16 x i8> %a0, %2
+ %4 = or <16 x i1> %1, %3
+ %5 = sext <16 x i1> %4 to <16 x i8>
+ ret <16 x i8> %5
+}
+
+define <4 x i32> @test_pcmpgtd(<4 x i32> %a0, <4 x i32> %a1, <4 x i32> *%a2) {
+; GENERIC-LABEL: test_pcmpgtd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movdqa %xmm0, %xmm2
+; GENERIC-NEXT: pcmpgtd %xmm1, %xmm2
+; GENERIC-NEXT: pcmpeqd (%rdi), %xmm0
+; GENERIC-NEXT: por %xmm2, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pcmpgtd:
+; ATOM: # BB#0:
+; ATOM-NEXT: movdqa %xmm0, %xmm2
+; ATOM-NEXT: pcmpeqd (%rdi), %xmm0
+; ATOM-NEXT: pcmpgtd %xmm1, %xmm2
+; ATOM-NEXT: por %xmm2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pcmpgtd:
+; SLM: # BB#0:
+; SLM-NEXT: movdqa %xmm0, %xmm2 # sched: [1:0.50]
+; SLM-NEXT: pcmpeqd (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: pcmpgtd %xmm1, %xmm2 # sched: [1:0.50]
+; SLM-NEXT: por %xmm2, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pcmpgtd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; SANDY-NEXT: vpcmpeqd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pcmpgtd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; HASWELL-NEXT: vpcmpeqd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pcmpgtd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; BTVER2-NEXT: vpcmpeqd (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = icmp sgt <4 x i32> %a0, %a1
+ %2 = load <4 x i32>, <4 x i32> *%a2, align 16
+ %3 = icmp eq <4 x i32> %a0, %2
+ %4 = or <4 x i1> %1, %3
+ %5 = sext <4 x i1> %4 to <4 x i32>
+ ret <4 x i32> %5
+}
+
+define <8 x i16> @test_pcmpgtw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_pcmpgtw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: movdqa %xmm0, %xmm2
+; GENERIC-NEXT: pcmpgtw %xmm1, %xmm2
+; GENERIC-NEXT: pcmpgtw (%rdi), %xmm0
+; GENERIC-NEXT: por %xmm2, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pcmpgtw:
+; ATOM: # BB#0:
+; ATOM-NEXT: movdqa %xmm0, %xmm2
+; ATOM-NEXT: pcmpgtw (%rdi), %xmm0
+; ATOM-NEXT: pcmpgtw %xmm1, %xmm2
+; ATOM-NEXT: por %xmm2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pcmpgtw:
+; SLM: # BB#0:
+; SLM-NEXT: movdqa %xmm0, %xmm2 # sched: [1:0.50]
+; SLM-NEXT: pcmpgtw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: pcmpgtw %xmm1, %xmm2 # sched: [1:0.50]
+; SLM-NEXT: por %xmm2, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pcmpgtw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; SANDY-NEXT: vpcmpgtw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pcmpgtw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; HASWELL-NEXT: vpcmpgtw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pcmpgtw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm1 # sched: [1:0.50]
+; BTVER2-NEXT: vpcmpgtw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpor %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = icmp sgt <8 x i16> %a0, %a1
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = icmp sgt <8 x i16> %a0, %2
+ %4 = or <8 x i1> %1, %3
+ %5 = sext <8 x i1> %4 to <8 x i16>
+ ret <8 x i16> %5
+}
+
+define i16 @test_pextrw(<8 x i16> %a0) {
+; GENERIC-LABEL: test_pextrw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pextrw $6, %xmm0, %eax
+; GENERIC-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pextrw:
+; ATOM: # BB#0:
+; ATOM-NEXT: pextrw $6, %xmm0, %eax
+; ATOM-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pextrw:
+; SLM: # BB#0:
+; SLM-NEXT: pextrw $6, %xmm0, %eax # sched: [4:1.00]
+; SLM-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pextrw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpextrw $6, %xmm0, %eax # sched: [1:0.50]
+; SANDY-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pextrw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpextrw $6, %xmm0, %eax # sched: [1:1.00]
+; HASWELL-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pextrw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpextrw $6, %xmm0, %eax # sched: [1:0.50]
+; BTVER2-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = extractelement <8 x i16> %a0, i32 6
+ ret i16 %1
+}
+
+define <4 x i32> @test_pmaddwd(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_pmaddwd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pmaddwd %xmm1, %xmm0
+; GENERIC-NEXT: pmaddwd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pmaddwd:
+; ATOM: # BB#0:
+; ATOM-NEXT: pmaddwd %xmm1, %xmm0
+; ATOM-NEXT: pmaddwd (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pmaddwd:
+; SLM: # BB#0:
+; SLM-NEXT: pmaddwd %xmm1, %xmm0 # sched: [4:1.00]
+; SLM-NEXT: pmaddwd (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pmaddwd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpmaddwd %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vpmaddwd (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pmaddwd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpmaddwd %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpmaddwd (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pmaddwd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpmaddwd %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vpmaddwd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = bitcast <4 x i32> %1 to <8 x i16>
+ %3 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %4 = call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> %2, <8 x i16> %3)
+ ret <4 x i32> %4
+}
+declare <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <8 x i16> @test_pmaxsw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_pmaxsw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pmaxsw %xmm1, %xmm0
+; GENERIC-NEXT: pmaxsw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pmaxsw:
+; ATOM: # BB#0:
+; ATOM-NEXT: pmaxsw %xmm1, %xmm0
+; ATOM-NEXT: pmaxsw (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pmaxsw:
+; SLM: # BB#0:
+; SLM-NEXT: pmaxsw %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: pmaxsw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pmaxsw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpmaxsw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pmaxsw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpmaxsw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pmaxsw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpmaxsw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.pmaxs.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.pmaxs.w(<8 x i16> %1, <8 x i16> %2)
+ ret <8 x i16> %3
+}
+declare <8 x i16> @llvm.x86.sse2.pmaxs.w(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <16 x i8> @test_pmaxub(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_pmaxub:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pmaxub %xmm1, %xmm0
+; GENERIC-NEXT: pmaxub (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pmaxub:
+; ATOM: # BB#0:
+; ATOM-NEXT: pmaxub %xmm1, %xmm0
+; ATOM-NEXT: pmaxub (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pmaxub:
+; SLM: # BB#0:
+; SLM-NEXT: pmaxub %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: pmaxub (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pmaxub:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpmaxub %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpmaxub (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pmaxub:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpmaxub %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpmaxub (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pmaxub:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpmaxub %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpmaxub (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <16 x i8> @llvm.x86.sse2.pmaxu.b(<16 x i8> %a0, <16 x i8> %a1)
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = call <16 x i8> @llvm.x86.sse2.pmaxu.b(<16 x i8> %1, <16 x i8> %2)
+ ret <16 x i8> %3
+}
+declare <16 x i8> @llvm.x86.sse2.pmaxu.b(<16 x i8>, <16 x i8>) nounwind readnone
+
+define <8 x i16> @test_pminsw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_pminsw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pminsw %xmm1, %xmm0
+; GENERIC-NEXT: pminsw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pminsw:
+; ATOM: # BB#0:
+; ATOM-NEXT: pminsw %xmm1, %xmm0
+; ATOM-NEXT: pminsw (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pminsw:
+; SLM: # BB#0:
+; SLM-NEXT: pminsw %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: pminsw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pminsw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpminsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpminsw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pminsw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpminsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpminsw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pminsw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpminsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpminsw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.pmins.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.pmins.w(<8 x i16> %1, <8 x i16> %2)
+ ret <8 x i16> %3
+}
+declare <8 x i16> @llvm.x86.sse2.pmins.w(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <16 x i8> @test_pminub(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_pminub:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pminub %xmm1, %xmm0
+; GENERIC-NEXT: pminub (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pminub:
+; ATOM: # BB#0:
+; ATOM-NEXT: pminub %xmm1, %xmm0
+; ATOM-NEXT: pminub (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pminub:
+; SLM: # BB#0:
+; SLM-NEXT: pminub %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: pminub (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pminub:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpminub %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpminub (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pminub:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpminub %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpminub (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pminub:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpminub %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpminub (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <16 x i8> @llvm.x86.sse2.pminu.b(<16 x i8> %a0, <16 x i8> %a1)
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = call <16 x i8> @llvm.x86.sse2.pminu.b(<16 x i8> %1, <16 x i8> %2)
+ ret <16 x i8> %3
+}
+declare <16 x i8> @llvm.x86.sse2.pminu.b(<16 x i8>, <16 x i8>) nounwind readnone
+
+define i32 @test_pmovmskb(<16 x i8> %a0) {
+; GENERIC-LABEL: test_pmovmskb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pmovmskb %xmm0, %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pmovmskb:
+; ATOM: # BB#0:
+; ATOM-NEXT: pmovmskb %xmm0, %eax
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pmovmskb:
+; SLM: # BB#0:
+; SLM-NEXT: pmovmskb %xmm0, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pmovmskb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpmovmskb %xmm0, %eax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pmovmskb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpmovmskb %xmm0, %eax # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pmovmskb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpmovmskb %xmm0, %eax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8> %a0)
+ ret i32 %1
+}
+declare i32 @llvm.x86.sse2.pmovmskb.128(<16 x i8>) nounwind readnone
+
+define <8 x i16> @test_pmulhuw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_pmulhuw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pmulhuw %xmm1, %xmm0
+; GENERIC-NEXT: pmulhuw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pmulhuw:
+; ATOM: # BB#0:
+; ATOM-NEXT: pmulhuw %xmm1, %xmm0
+; ATOM-NEXT: pmulhuw (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pmulhuw:
+; SLM: # BB#0:
+; SLM-NEXT: pmulhuw %xmm1, %xmm0 # sched: [4:1.00]
+; SLM-NEXT: pmulhuw (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pmulhuw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpmulhuw %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vpmulhuw (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pmulhuw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpmulhuw %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpmulhuw (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pmulhuw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpmulhuw %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vpmulhuw (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %1, <8 x i16> %2)
+ ret <8 x i16> %3
+}
+declare <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <8 x i16> @test_pmulhw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_pmulhw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pmulhw %xmm1, %xmm0
+; GENERIC-NEXT: pmulhw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pmulhw:
+; ATOM: # BB#0:
+; ATOM-NEXT: pmulhw %xmm1, %xmm0
+; ATOM-NEXT: pmulhw (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pmulhw:
+; SLM: # BB#0:
+; SLM-NEXT: pmulhw %xmm1, %xmm0 # sched: [4:1.00]
+; SLM-NEXT: pmulhw (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pmulhw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpmulhw %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vpmulhw (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pmulhw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpmulhw %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpmulhw (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pmulhw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpmulhw %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vpmulhw (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16> %1, <8 x i16> %2)
+ ret <8 x i16> %3
+}
+declare <8 x i16> @llvm.x86.sse2.pmulh.w(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <8 x i16> @test_pmullw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_pmullw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pmullw %xmm1, %xmm0
+; GENERIC-NEXT: pmullw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pmullw:
+; ATOM: # BB#0:
+; ATOM-NEXT: pmullw %xmm1, %xmm0
+; ATOM-NEXT: pmullw (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pmullw:
+; SLM: # BB#0:
+; SLM-NEXT: pmullw %xmm1, %xmm0 # sched: [4:1.00]
+; SLM-NEXT: pmullw (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pmullw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpmullw %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vpmullw (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pmullw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpmullw %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpmullw (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pmullw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpmullw %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vpmullw (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = mul <8 x i16> %a0, %a1
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = mul <8 x i16> %1, %2
+ ret <8 x i16> %3
+}
+
+define <2 x i64> @test_pmuludq(<4 x i32> %a0, <4 x i32> %a1, <4 x i32> *%a2) {
+; GENERIC-LABEL: test_pmuludq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pmuludq %xmm1, %xmm0
+; GENERIC-NEXT: pmuludq (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pmuludq:
+; ATOM: # BB#0:
+; ATOM-NEXT: pmuludq %xmm1, %xmm0
+; ATOM-NEXT: pmuludq (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pmuludq:
+; SLM: # BB#0:
+; SLM-NEXT: pmuludq %xmm1, %xmm0 # sched: [4:1.00]
+; SLM-NEXT: pmuludq (%rdi), %xmm0 # sched: [7:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pmuludq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vpmuludq (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pmuludq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpmuludq (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pmuludq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpmuludq %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vpmuludq (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32> %a0, <4 x i32> %a1)
+ %2 = bitcast <2 x i64> %1 to <4 x i32>
+ %3 = load <4 x i32>, <4 x i32> *%a2, align 16
+ %4 = call <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32> %2, <4 x i32> %3)
+ ret <2 x i64> %4
+}
+declare <2 x i64> @llvm.x86.sse2.pmulu.dq(<4 x i32>, <4 x i32>) nounwind readnone
+
+define <2 x i64> @test_por(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
+; GENERIC-LABEL: test_por:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: por %xmm1, %xmm0
+; GENERIC-NEXT: por (%rdi), %xmm0
+; GENERIC-NEXT: paddq %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_por:
+; ATOM: # BB#0:
+; ATOM-NEXT: por %xmm1, %xmm0
+; ATOM-NEXT: por (%rdi), %xmm0
+; ATOM-NEXT: paddq %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_por:
+; SLM: # BB#0:
+; SLM-NEXT: por %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: por (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: paddq %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_por:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpor %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vpor (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_por:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpor %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; HASWELL-NEXT: vpor (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_por:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpor %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpor (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = or <2 x i64> %a0, %a1
+ %2 = load <2 x i64>, <2 x i64> *%a2, align 16
+ %3 = or <2 x i64> %1, %2
+ %4 = add <2 x i64> %3, %a1
+ ret <2 x i64> %4
+}
+
+define <2 x i64> @test_psadbw(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_psadbw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psadbw %xmm1, %xmm0
+; GENERIC-NEXT: psadbw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psadbw:
+; ATOM: # BB#0:
+; ATOM-NEXT: psadbw %xmm1, %xmm0
+; ATOM-NEXT: psadbw (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psadbw:
+; SLM: # BB#0:
+; SLM-NEXT: psadbw %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: psadbw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psadbw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsadbw %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; SANDY-NEXT: vpsadbw (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psadbw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsadbw %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpsadbw (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psadbw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsadbw %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; BTVER2-NEXT: vpsadbw (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8> %a0, <16 x i8> %a1)
+ %2 = bitcast <2 x i64> %1 to <16 x i8>
+ %3 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %4 = call <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8> %2, <16 x i8> %3)
+ ret <2 x i64> %4
+}
+declare <2 x i64> @llvm.x86.sse2.psad.bw(<16 x i8>, <16 x i8>) nounwind readnone
+
+define <4 x i32> @test_pshufd(<4 x i32> %a0, <4 x i32> *%a1) {
+; GENERIC-LABEL: test_pshufd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
+; GENERIC-NEXT: pshufd {{.*#+}} xmm0 = mem[3,2,1,0]
+; GENERIC-NEXT: paddd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pshufd:
+; ATOM: # BB#0:
+; ATOM-NEXT: pshufd {{.*#+}} xmm1 = mem[3,2,1,0]
+; ATOM-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,3,2]
+; ATOM-NEXT: paddd %xmm0, %xmm1
+; ATOM-NEXT: movdqa %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pshufd:
+; SLM: # BB#0:
+; SLM-NEXT: pshufd {{.*#+}} xmm1 = mem[3,2,1,0] sched: [4:1.00]
+; SLM-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,3,2] sched: [1:1.00]
+; SLM-NEXT: paddd %xmm0, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: movdqa %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pshufd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,3,2] sched: [1:0.50]
+; SANDY-NEXT: vpshufd {{.*#+}} xmm1 = mem[3,2,1,0] sched: [5:0.50]
+; SANDY-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pshufd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,3,2] sched: [1:1.00]
+; HASWELL-NEXT: vpshufd {{.*#+}} xmm1 = mem[3,2,1,0] sched: [5:1.00]
+; HASWELL-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pshufd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpshufd {{.*#+}} xmm1 = mem[3,2,1,0] sched: [6:1.00]
+; BTVER2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,3,2] sched: [1:0.50]
+; BTVER2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x i32> %a0, <4 x i32> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
+ %2 = load <4 x i32>, <4 x i32> *%a1, align 16
+ %3 = shufflevector <4 x i32> %2, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
+ %4 = add <4 x i32> %1, %3
+ ret <4 x i32> %4
+}
+
+define <8 x i16> @test_pshufhw(<8 x i16> %a0, <8 x i16> *%a1) {
+; GENERIC-LABEL: test_pshufhw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pshufhw {{.*#+}} xmm1 = xmm0[0,1,2,3,5,4,7,6]
+; GENERIC-NEXT: pshufhw {{.*#+}} xmm0 = mem[0,1,2,3,7,6,5,4]
+; GENERIC-NEXT: paddw %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pshufhw:
+; ATOM: # BB#0:
+; ATOM-NEXT: pshufhw {{.*#+}} xmm1 = mem[0,1,2,3,7,6,5,4]
+; ATOM-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6]
+; ATOM-NEXT: paddw %xmm0, %xmm1
+; ATOM-NEXT: movdqa %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pshufhw:
+; SLM: # BB#0:
+; SLM-NEXT: pshufhw {{.*#+}} xmm1 = mem[0,1,2,3,7,6,5,4] sched: [4:1.00]
+; SLM-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6] sched: [1:1.00]
+; SLM-NEXT: paddw %xmm0, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: movdqa %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pshufhw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6] sched: [1:0.50]
+; SANDY-NEXT: vpshufhw {{.*#+}} xmm1 = mem[0,1,2,3,7,6,5,4] sched: [5:0.50]
+; SANDY-NEXT: vpaddw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pshufhw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6] sched: [1:1.00]
+; HASWELL-NEXT: vpshufhw {{.*#+}} xmm1 = mem[0,1,2,3,7,6,5,4] sched: [5:1.00]
+; HASWELL-NEXT: vpaddw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pshufhw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpshufhw {{.*#+}} xmm1 = mem[0,1,2,3,7,6,5,4] sched: [6:1.00]
+; BTVER2-NEXT: vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6] sched: [1:0.50]
+; BTVER2-NEXT: vpaddw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 5, i32 4, i32 7, i32 6>
+ %2 = load <8 x i16>, <8 x i16> *%a1, align 16
+ %3 = shufflevector <8 x i16> %2, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 7, i32 6, i32 5, i32 4>
+ %4 = add <8 x i16> %1, %3
+ ret <8 x i16> %4
+}
+
+define <8 x i16> @test_pshuflw(<8 x i16> %a0, <8 x i16> *%a1) {
+; GENERIC-LABEL: test_pshuflw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[1,0,3,2,4,5,6,7]
+; GENERIC-NEXT: pshuflw {{.*#+}} xmm0 = mem[3,2,1,0,4,5,6,7]
+; GENERIC-NEXT: paddw %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pshuflw:
+; ATOM: # BB#0:
+; ATOM-NEXT: pshuflw {{.*#+}} xmm1 = mem[3,2,1,0,4,5,6,7]
+; ATOM-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7]
+; ATOM-NEXT: paddw %xmm0, %xmm1
+; ATOM-NEXT: movdqa %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pshuflw:
+; SLM: # BB#0:
+; SLM-NEXT: pshuflw {{.*#+}} xmm1 = mem[3,2,1,0,4,5,6,7] sched: [4:1.00]
+; SLM-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7] sched: [1:1.00]
+; SLM-NEXT: paddw %xmm0, %xmm1 # sched: [1:0.50]
+; SLM-NEXT: movdqa %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pshuflw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7] sched: [1:0.50]
+; SANDY-NEXT: vpshuflw {{.*#+}} xmm1 = mem[3,2,1,0,4,5,6,7] sched: [5:0.50]
+; SANDY-NEXT: vpaddw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pshuflw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7] sched: [1:1.00]
+; HASWELL-NEXT: vpshuflw {{.*#+}} xmm1 = mem[3,2,1,0,4,5,6,7] sched: [5:1.00]
+; HASWELL-NEXT: vpaddw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pshuflw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpshuflw {{.*#+}} xmm1 = mem[3,2,1,0,4,5,6,7] sched: [6:1.00]
+; BTVER2-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[1,0,3,2,4,5,6,7] sched: [1:0.50]
+; BTVER2-NEXT: vpaddw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 4, i32 5, i32 6, i32 7>
+ %2 = load <8 x i16>, <8 x i16> *%a1, align 16
+ %3 = shufflevector <8 x i16> %2, <8 x i16> undef, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 4, i32 5, i32 6, i32 7>
+ %4 = add <8 x i16> %1, %3
+ ret <8 x i16> %4
+}
+
+define <4 x i32> @test_pslld(<4 x i32> %a0, <4 x i32> %a1, <4 x i32> *%a2) {
+; GENERIC-LABEL: test_pslld:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pslld %xmm1, %xmm0
+; GENERIC-NEXT: pslld (%rdi), %xmm0
+; GENERIC-NEXT: pslld $2, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pslld:
+; ATOM: # BB#0:
+; ATOM-NEXT: pslld %xmm1, %xmm0
+; ATOM-NEXT: pslld (%rdi), %xmm0
+; ATOM-NEXT: pslld $2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pslld:
+; SLM: # BB#0:
+; SLM-NEXT: pslld %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: pslld (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: pslld $2, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pslld:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpslld %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpslld (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpslld $2, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pslld:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpslld %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; HASWELL-NEXT: vpslld (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpslld $2, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pslld:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpslld %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpslld (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpslld $2, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32> %a0, <4 x i32> %a1)
+ %2 = load <4 x i32>, <4 x i32> *%a2, align 16
+ %3 = call <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32> %1, <4 x i32> %2)
+ %4 = call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> %3, i32 2)
+ ret <4 x i32> %4
+}
+declare <4 x i32> @llvm.x86.sse2.psll.d(<4 x i32>, <4 x i32>) nounwind readnone
+declare <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32>, i32) nounwind readnone
+
+define <4 x i32> @test_pslldq(<4 x i32> %a0) {
+; GENERIC-LABEL: test_pslldq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pslldq:
+; ATOM: # BB#0:
+; ATOM-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pslldq:
+; SLM: # BB#0:
+; SLM-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11] sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pslldq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11] sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pslldq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11] sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pslldq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11] sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x i32> %a0, <4 x i32> zeroinitializer, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
+ ret <4 x i32> %1
+}
+
+define <2 x i64> @test_psllq(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
+; GENERIC-LABEL: test_psllq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psllq %xmm1, %xmm0
+; GENERIC-NEXT: psllq (%rdi), %xmm0
+; GENERIC-NEXT: psllq $2, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psllq:
+; ATOM: # BB#0:
+; ATOM-NEXT: psllq %xmm1, %xmm0
+; ATOM-NEXT: psllq (%rdi), %xmm0
+; ATOM-NEXT: psllq $2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psllq:
+; SLM: # BB#0:
+; SLM-NEXT: psllq %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: psllq (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: psllq $2, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psllq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsllq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsllq (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpsllq $2, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psllq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsllq %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; HASWELL-NEXT: vpsllq (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpsllq $2, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psllq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsllq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsllq (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpsllq $2, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64> %a0, <2 x i64> %a1)
+ %2 = load <2 x i64>, <2 x i64> *%a2, align 16
+ %3 = call <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64> %1, <2 x i64> %2)
+ %4 = call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> %3, i32 2)
+ ret <2 x i64> %4
+}
+declare <2 x i64> @llvm.x86.sse2.psll.q(<2 x i64>, <2 x i64>) nounwind readnone
+declare <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64>, i32) nounwind readnone
+
+define <8 x i16> @test_psllw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_psllw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psllw %xmm1, %xmm0
+; GENERIC-NEXT: psllw (%rdi), %xmm0
+; GENERIC-NEXT: psllw $2, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psllw:
+; ATOM: # BB#0:
+; ATOM-NEXT: psllw %xmm1, %xmm0
+; ATOM-NEXT: psllw (%rdi), %xmm0
+; ATOM-NEXT: psllw $2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psllw:
+; SLM: # BB#0:
+; SLM-NEXT: psllw %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: psllw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: psllw $2, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psllw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsllw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsllw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpsllw $2, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psllw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsllw %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; HASWELL-NEXT: vpsllw (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpsllw $2, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psllw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsllw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsllw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpsllw $2, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16> %1, <8 x i16> %2)
+ %4 = call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> %3, i32 2)
+ ret <8 x i16> %4
+}
+declare <8 x i16> @llvm.x86.sse2.psll.w(<8 x i16>, <8 x i16>) nounwind readnone
+declare <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16>, i32) nounwind readnone
+
+define <4 x i32> @test_psrad(<4 x i32> %a0, <4 x i32> %a1, <4 x i32> *%a2) {
+; GENERIC-LABEL: test_psrad:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psrad %xmm1, %xmm0
+; GENERIC-NEXT: psrad (%rdi), %xmm0
+; GENERIC-NEXT: psrad $2, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psrad:
+; ATOM: # BB#0:
+; ATOM-NEXT: psrad %xmm1, %xmm0
+; ATOM-NEXT: psrad (%rdi), %xmm0
+; ATOM-NEXT: psrad $2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psrad:
+; SLM: # BB#0:
+; SLM-NEXT: psrad %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: psrad (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: psrad $2, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psrad:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsrad %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsrad (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpsrad $2, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psrad:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsrad %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; HASWELL-NEXT: vpsrad (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpsrad $2, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psrad:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsrad %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsrad (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpsrad $2, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32> %a0, <4 x i32> %a1)
+ %2 = load <4 x i32>, <4 x i32> *%a2, align 16
+ %3 = call <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32> %1, <4 x i32> %2)
+ %4 = call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> %3, i32 2)
+ ret <4 x i32> %4
+}
+declare <4 x i32> @llvm.x86.sse2.psra.d(<4 x i32>, <4 x i32>) nounwind readnone
+declare <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32>, i32) nounwind readnone
+
+define <8 x i16> @test_psraw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_psraw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psraw %xmm1, %xmm0
+; GENERIC-NEXT: psraw (%rdi), %xmm0
+; GENERIC-NEXT: psraw $2, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psraw:
+; ATOM: # BB#0:
+; ATOM-NEXT: psraw %xmm1, %xmm0
+; ATOM-NEXT: psraw (%rdi), %xmm0
+; ATOM-NEXT: psraw $2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psraw:
+; SLM: # BB#0:
+; SLM-NEXT: psraw %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: psraw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: psraw $2, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psraw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsraw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsraw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpsraw $2, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psraw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsraw %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; HASWELL-NEXT: vpsraw (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpsraw $2, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psraw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsraw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsraw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpsraw $2, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16> %1, <8 x i16> %2)
+ %4 = call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> %3, i32 2)
+ ret <8 x i16> %4
+}
+declare <8 x i16> @llvm.x86.sse2.psra.w(<8 x i16>, <8 x i16>) nounwind readnone
+declare <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16>, i32) nounwind readnone
+
+define <4 x i32> @test_psrld(<4 x i32> %a0, <4 x i32> %a1, <4 x i32> *%a2) {
+; GENERIC-LABEL: test_psrld:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psrld %xmm1, %xmm0
+; GENERIC-NEXT: psrld (%rdi), %xmm0
+; GENERIC-NEXT: psrld $2, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psrld:
+; ATOM: # BB#0:
+; ATOM-NEXT: psrld %xmm1, %xmm0
+; ATOM-NEXT: psrld (%rdi), %xmm0
+; ATOM-NEXT: psrld $2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psrld:
+; SLM: # BB#0:
+; SLM-NEXT: psrld %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: psrld (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: psrld $2, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psrld:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsrld %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsrld (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpsrld $2, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psrld:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsrld %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; HASWELL-NEXT: vpsrld (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpsrld $2, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psrld:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsrld %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsrld (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpsrld $2, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %a0, <4 x i32> %a1)
+ %2 = load <4 x i32>, <4 x i32> *%a2, align 16
+ %3 = call <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32> %1, <4 x i32> %2)
+ %4 = call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> %3, i32 2)
+ ret <4 x i32> %4
+}
+declare <4 x i32> @llvm.x86.sse2.psrl.d(<4 x i32>, <4 x i32>) nounwind readnone
+declare <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32>, i32) nounwind readnone
+
+define <4 x i32> @test_psrldq(<4 x i32> %a0) {
+; GENERIC-LABEL: test_psrldq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psrldq {{.*#+}} xmm0 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psrldq:
+; ATOM: # BB#0:
+; ATOM-NEXT: psrldq {{.*#+}} xmm0 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psrldq:
+; SLM: # BB#0:
+; SLM-NEXT: psrldq {{.*#+}} xmm0 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psrldq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psrldq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psrldq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x i32> %a0, <4 x i32> zeroinitializer, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
+ ret <4 x i32> %1
+}
+
+define <2 x i64> @test_psrlq(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
+; GENERIC-LABEL: test_psrlq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psrlq %xmm1, %xmm0
+; GENERIC-NEXT: psrlq (%rdi), %xmm0
+; GENERIC-NEXT: psrlq $2, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psrlq:
+; ATOM: # BB#0:
+; ATOM-NEXT: psrlq %xmm1, %xmm0
+; ATOM-NEXT: psrlq (%rdi), %xmm0
+; ATOM-NEXT: psrlq $2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psrlq:
+; SLM: # BB#0:
+; SLM-NEXT: psrlq %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: psrlq (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: psrlq $2, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psrlq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsrlq (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpsrlq $2, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psrlq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; HASWELL-NEXT: vpsrlq (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpsrlq $2, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psrlq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsrlq (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpsrlq $2, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64> %a0, <2 x i64> %a1)
+ %2 = load <2 x i64>, <2 x i64> *%a2, align 16
+ %3 = call <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64> %1, <2 x i64> %2)
+ %4 = call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> %3, i32 2)
+ ret <2 x i64> %4
+}
+declare <2 x i64> @llvm.x86.sse2.psrl.q(<2 x i64>, <2 x i64>) nounwind readnone
+declare <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64>, i32) nounwind readnone
+
+define <8 x i16> @test_psrlw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_psrlw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psrlw %xmm1, %xmm0
+; GENERIC-NEXT: psrlw (%rdi), %xmm0
+; GENERIC-NEXT: psrlw $2, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psrlw:
+; ATOM: # BB#0:
+; ATOM-NEXT: psrlw %xmm1, %xmm0
+; ATOM-NEXT: psrlw (%rdi), %xmm0
+; ATOM-NEXT: psrlw $2, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psrlw:
+; SLM: # BB#0:
+; SLM-NEXT: psrlw %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: psrlw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: psrlw $2, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psrlw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsrlw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsrlw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpsrlw $2, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psrlw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsrlw %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
+; HASWELL-NEXT: vpsrlw (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vpsrlw $2, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psrlw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsrlw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsrlw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpsrlw $2, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16> %1, <8 x i16> %2)
+ %4 = call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> %3, i32 2)
+ ret <8 x i16> %4
+}
+declare <8 x i16> @llvm.x86.sse2.psrl.w(<8 x i16>, <8 x i16>) nounwind readnone
+declare <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16>, i32) nounwind readnone
+
+define <16 x i8> @test_psubb(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_psubb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psubb %xmm1, %xmm0
+; GENERIC-NEXT: psubb (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psubb:
+; ATOM: # BB#0:
+; ATOM-NEXT: psubb %xmm1, %xmm0
+; ATOM-NEXT: psubb (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psubb:
+; SLM: # BB#0:
+; SLM-NEXT: psubb %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: psubb (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psubb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsubb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsubb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psubb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsubb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpsubb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psubb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsubb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsubb (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = sub <16 x i8> %a0, %a1
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = sub <16 x i8> %1, %2
+ ret <16 x i8> %3
+}
+
+define <4 x i32> @test_psubd(<4 x i32> %a0, <4 x i32> %a1, <4 x i32> *%a2) {
+; GENERIC-LABEL: test_psubd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psubd %xmm1, %xmm0
+; GENERIC-NEXT: psubd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psubd:
+; ATOM: # BB#0:
+; ATOM-NEXT: psubd %xmm1, %xmm0
+; ATOM-NEXT: psubd (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psubd:
+; SLM: # BB#0:
+; SLM-NEXT: psubd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: psubd (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psubd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsubd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsubd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psubd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsubd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpsubd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psubd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsubd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsubd (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = sub <4 x i32> %a0, %a1
+ %2 = load <4 x i32>, <4 x i32> *%a2, align 16
+ %3 = sub <4 x i32> %1, %2
+ ret <4 x i32> %3
+}
+
+define <2 x i64> @test_psubq(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
+; GENERIC-LABEL: test_psubq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psubq %xmm1, %xmm0
+; GENERIC-NEXT: psubq (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psubq:
+; ATOM: # BB#0:
+; ATOM-NEXT: psubq %xmm1, %xmm0
+; ATOM-NEXT: psubq (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psubq:
+; SLM: # BB#0:
+; SLM-NEXT: psubq %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: psubq (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psubq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsubq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsubq (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psubq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsubq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpsubq (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psubq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsubq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsubq (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = sub <2 x i64> %a0, %a1
+ %2 = load <2 x i64>, <2 x i64> *%a2, align 16
+ %3 = sub <2 x i64> %1, %2
+ ret <2 x i64> %3
+}
+
+define <16 x i8> @test_psubsb(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_psubsb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psubsb %xmm1, %xmm0
+; GENERIC-NEXT: psubsb (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psubsb:
+; ATOM: # BB#0:
+; ATOM-NEXT: psubsb %xmm1, %xmm0
+; ATOM-NEXT: psubsb (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psubsb:
+; SLM: # BB#0:
+; SLM-NEXT: psubsb %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: psubsb (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psubsb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsubsb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsubsb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psubsb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsubsb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpsubsb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psubsb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsubsb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsubsb (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8> %a0, <16 x i8> %a1)
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = call <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8> %1, <16 x i8> %2)
+ ret <16 x i8> %3
+}
+declare <16 x i8> @llvm.x86.sse2.psubs.b(<16 x i8>, <16 x i8>) nounwind readnone
+
+define <8 x i16> @test_psubsw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_psubsw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psubsw %xmm1, %xmm0
+; GENERIC-NEXT: psubsw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psubsw:
+; ATOM: # BB#0:
+; ATOM-NEXT: psubsw %xmm1, %xmm0
+; ATOM-NEXT: psubsw (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psubsw:
+; SLM: # BB#0:
+; SLM-NEXT: psubsw %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: psubsw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psubsw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsubsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsubsw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psubsw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsubsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpsubsw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psubsw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsubsw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsubsw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16> %1, <8 x i16> %2)
+ ret <8 x i16> %3
+}
+declare <8 x i16> @llvm.x86.sse2.psubs.w(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <16 x i8> @test_psubusb(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_psubusb:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psubusb %xmm1, %xmm0
+; GENERIC-NEXT: psubusb (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psubusb:
+; ATOM: # BB#0:
+; ATOM-NEXT: psubusb %xmm1, %xmm0
+; ATOM-NEXT: psubusb (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psubusb:
+; SLM: # BB#0:
+; SLM-NEXT: psubusb %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: psubusb (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psubusb:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsubusb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psubusb:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpsubusb (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psubusb:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsubusb (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8> %a0, <16 x i8> %a1)
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = call <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8> %1, <16 x i8> %2)
+ ret <16 x i8> %3
+}
+declare <16 x i8> @llvm.x86.sse2.psubus.b(<16 x i8>, <16 x i8>) nounwind readnone
+
+define <8 x i16> @test_psubusw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_psubusw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psubusw %xmm1, %xmm0
+; GENERIC-NEXT: psubusw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psubusw:
+; ATOM: # BB#0:
+; ATOM-NEXT: psubusw %xmm1, %xmm0
+; ATOM-NEXT: psubusw (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psubusw:
+; SLM: # BB#0:
+; SLM-NEXT: psubusw %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: psubusw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psubusw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsubusw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psubusw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpsubusw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psubusw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsubusw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16> %a0, <8 x i16> %a1)
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = call <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16> %1, <8 x i16> %2)
+ ret <8 x i16> %3
+}
+declare <8 x i16> @llvm.x86.sse2.psubus.w(<8 x i16>, <8 x i16>) nounwind readnone
+
+define <8 x i16> @test_psubw(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_psubw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: psubw %xmm1, %xmm0
+; GENERIC-NEXT: psubw (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_psubw:
+; ATOM: # BB#0:
+; ATOM-NEXT: psubw %xmm1, %xmm0
+; ATOM-NEXT: psubw (%rdi), %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_psubw:
+; SLM: # BB#0:
+; SLM-NEXT: psubw %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: psubw (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_psubw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpsubw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: vpsubw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_psubw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpsubw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: vpsubw (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_psubw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpsubw %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpsubw (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = sub <8 x i16> %a0, %a1
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = sub <8 x i16> %1, %2
+ ret <8 x i16> %3
+}
+
+define <16 x i8> @test_punpckhbw(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_punpckhbw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
+; GENERIC-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],mem[8],xmm0[9],mem[9],xmm0[10],mem[10],xmm0[11],mem[11],xmm0[12],mem[12],xmm0[13],mem[13],xmm0[14],mem[14],xmm0[15],mem[15]
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_punpckhbw:
+; ATOM: # BB#0:
+; ATOM-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
+; ATOM-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],mem[8],xmm0[9],mem[9],xmm0[10],mem[10],xmm0[11],mem[11],xmm0[12],mem[12],xmm0[13],mem[13],xmm0[14],mem[14],xmm0[15],mem[15]
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_punpckhbw:
+; SLM: # BB#0:
+; SLM-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] sched: [1:1.00]
+; SLM-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],mem[8],xmm0[9],mem[9],xmm0[10],mem[10],xmm0[11],mem[11],xmm0[12],mem[12],xmm0[13],mem[13],xmm0[14],mem[14],xmm0[15],mem[15] sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_punpckhbw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] sched: [1:0.50]
+; SANDY-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8],mem[8],xmm0[9],mem[9],xmm0[10],mem[10],xmm0[11],mem[11],xmm0[12],mem[12],xmm0[13],mem[13],xmm0[14],mem[14],xmm0[15],mem[15] sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_punpckhbw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] sched: [1:1.00]
+; HASWELL-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8],mem[8],xmm0[9],mem[9],xmm0[10],mem[10],xmm0[11],mem[11],xmm0[12],mem[12],xmm0[13],mem[13],xmm0[14],mem[14],xmm0[15],mem[15] sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_punpckhbw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15] sched: [1:0.50]
+; BTVER2-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8],mem[8],xmm0[9],mem[9],xmm0[10],mem[10],xmm0[11],mem[11],xmm0[12],mem[12],xmm0[13],mem[13],xmm0[14],mem[14],xmm0[15],mem[15] sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <16 x i8> %a0, <16 x i8> %a1, <16 x i32> <i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = shufflevector <16 x i8> %1, <16 x i8> %2, <16 x i32> <i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>
+ ret <16 x i8> %3
+}
+
+define <4 x i32> @test_punpckhdq(<4 x i32> %a0, <4 x i32> %a1, <4 x i32> *%a2) {
+; GENERIC-LABEL: test_punpckhdq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; GENERIC-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],mem[2],xmm1[3],mem[3]
+; GENERIC-NEXT: paddd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_punpckhdq:
+; ATOM: # BB#0:
+; ATOM-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; ATOM-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],mem[2],xmm1[3],mem[3]
+; ATOM-NEXT: paddd %xmm1, %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_punpckhdq:
+; SLM: # BB#0:
+; SLM-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:1.00]
+; SLM-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],mem[2],xmm1[3],mem[3] sched: [4:1.00]
+; SLM-NEXT: paddd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_punpckhdq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpunpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:0.50]
+; SANDY-NEXT: vpunpckhdq {{.*#+}} xmm1 = xmm1[2],mem[2],xmm1[3],mem[3] sched: [5:0.50]
+; SANDY-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_punpckhdq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpunpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:1.00]
+; HASWELL-NEXT: vpunpckhdq {{.*#+}} xmm1 = xmm1[2],mem[2],xmm1[3],mem[3] sched: [5:1.00]
+; HASWELL-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_punpckhdq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpunpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:0.50]
+; BTVER2-NEXT: vpunpckhdq {{.*#+}} xmm1 = xmm1[2],mem[2],xmm1[3],mem[3] sched: [6:1.00]
+; BTVER2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x i32> %a0, <4 x i32> %a1, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
+ %2 = load <4 x i32>, <4 x i32> *%a2, align 16
+ %3 = shufflevector <4 x i32> %a1, <4 x i32> %2, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
+ %4 = add <4 x i32> %1, %3
+ ret <4 x i32> %4
+}
+
+define <2 x i64> @test_punpckhqdq(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
+; GENERIC-LABEL: test_punpckhqdq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
+; GENERIC-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],mem[1]
+; GENERIC-NEXT: paddq %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_punpckhqdq:
+; ATOM: # BB#0:
+; ATOM-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
+; ATOM-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],mem[1]
+; ATOM-NEXT: paddq %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_punpckhqdq:
+; SLM: # BB#0:
+; SLM-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] sched: [1:1.00]
+; SLM-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],mem[1] sched: [4:1.00]
+; SLM-NEXT: paddq %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_punpckhqdq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] sched: [1:0.50]
+; SANDY-NEXT: vpunpckhqdq {{.*#+}} xmm1 = xmm1[1],mem[1] sched: [5:0.50]
+; SANDY-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_punpckhqdq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] sched: [1:1.00]
+; HASWELL-NEXT: vpunpckhqdq {{.*#+}} xmm1 = xmm1[1],mem[1] sched: [5:1.00]
+; HASWELL-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_punpckhqdq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] sched: [1:0.50]
+; BTVER2-NEXT: vpunpckhqdq {{.*#+}} xmm1 = xmm1[1],mem[1] sched: [6:1.00]
+; BTVER2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <2 x i64> %a0, <2 x i64> %a1, <2 x i32> <i32 1, i32 3>
+ %2 = load <2 x i64>, <2 x i64> *%a2, align 16
+ %3 = shufflevector <2 x i64> %a1, <2 x i64> %2, <2x i32> <i32 1, i32 3>
+ %4 = add <2 x i64> %1, %3
+ ret <2 x i64> %4
+}
+
+define <8 x i16> @test_punpckhwd(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_punpckhwd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
+; GENERIC-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7]
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_punpckhwd:
+; ATOM: # BB#0:
+; ATOM-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
+; ATOM-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7]
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_punpckhwd:
+; SLM: # BB#0:
+; SLM-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] sched: [1:1.00]
+; SLM-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7] sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_punpckhwd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] sched: [1:0.50]
+; SANDY-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7] sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_punpckhwd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] sched: [1:1.00]
+; HASWELL-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7] sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_punpckhwd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] sched: [1:0.50]
+; BTVER2-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7] sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <8 x i16> %a0, <8 x i16> %a1, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
+ ret <8 x i16> %3
+}
+
+define <16 x i8> @test_punpcklbw(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
+; GENERIC-LABEL: test_punpcklbw:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
+; GENERIC-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3],xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7]
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_punpcklbw:
+; ATOM: # BB#0:
+; ATOM-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
+; ATOM-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3],xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7]
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_punpcklbw:
+; SLM: # BB#0:
+; SLM-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] sched: [1:1.00]
+; SLM-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3],xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7] sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_punpcklbw:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] sched: [1:0.50]
+; SANDY-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3],xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7] sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_punpcklbw:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] sched: [1:1.00]
+; HASWELL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3],xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7] sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_punpcklbw:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] sched: [1:0.50]
+; BTVER2-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3],xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7] sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <16 x i8> %a0, <16 x i8> %a1, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23>
+ %2 = load <16 x i8>, <16 x i8> *%a2, align 16
+ %3 = shufflevector <16 x i8> %1, <16 x i8> %2, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23>
+ ret <16 x i8> %3
+}
+
+define <4 x i32> @test_punpckldq(<4 x i32> %a0, <4 x i32> %a1, <4 x i32> *%a2) {
+; GENERIC-LABEL: test_punpckldq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; GENERIC-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]
+; GENERIC-NEXT: paddd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_punpckldq:
+; ATOM: # BB#0:
+; ATOM-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; ATOM-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]
+; ATOM-NEXT: paddd %xmm1, %xmm0
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_punpckldq:
+; SLM: # BB#0:
+; SLM-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] sched: [1:1.00]
+; SLM-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1] sched: [4:1.00]
+; SLM-NEXT: paddd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_punpckldq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] sched: [1:0.50]
+; SANDY-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1] sched: [5:0.50]
+; SANDY-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_punpckldq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] sched: [1:1.00]
+; HASWELL-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1] sched: [5:1.00]
+; HASWELL-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_punpckldq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] sched: [1:0.50]
+; BTVER2-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1] sched: [6:1.00]
+; BTVER2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <4 x i32> %a0, <4 x i32> %a1, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
+ %2 = load <4 x i32>, <4 x i32> *%a2, align 16
+ %3 = shufflevector <4 x i32> %a1, <4 x i32> %2, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
+ %4 = add <4 x i32> %1, %3
+ ret <4 x i32> %4
+}
+
+define <2 x i64> @test_punpcklqdq(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
+; GENERIC-LABEL: test_punpcklqdq:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; GENERIC-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],mem[0]
+; GENERIC-NEXT: paddq %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_punpcklqdq:
+; ATOM: # BB#0:
+; ATOM-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; ATOM-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],mem[0]
+; ATOM-NEXT: paddq %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_punpcklqdq:
+; SLM: # BB#0:
+; SLM-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
+; SLM-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [4:1.00]
+; SLM-NEXT: paddq %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_punpcklqdq:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:0.50]
+; SANDY-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [5:0.50]
+; SANDY-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_punpcklqdq:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
+; HASWELL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [5:1.00]
+; HASWELL-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_punpcklqdq:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:0.50]
+; BTVER2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
+; BTVER2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <2 x i64> %a0, <2 x i64> %a1, <2 x i32> <i32 0, i32 2>
+ %2 = load <2 x i64>, <2 x i64> *%a2, align 16
+ %3 = shufflevector <2 x i64> %a1, <2 x i64> %2, <2x i32> <i32 0, i32 2>
+ %4 = add <2 x i64> %1, %3
+ ret <2 x i64> %4
+}
+
+define <8 x i16> @test_punpcklwd(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> *%a2) {
+; GENERIC-LABEL: test_punpcklwd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; GENERIC-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_punpcklwd:
+; ATOM: # BB#0:
+; ATOM-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; ATOM-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: nop
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_punpcklwd:
+; SLM: # BB#0:
+; SLM-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:1.00]
+; SLM-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3] sched: [4:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_punpcklwd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:0.50]
+; SANDY-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3] sched: [5:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_punpcklwd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:1.00]
+; HASWELL-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3] sched: [5:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_punpcklwd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] sched: [1:0.50]
+; BTVER2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3] sched: [6:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <8 x i16> %a0, <8 x i16> %a1, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
+ %2 = load <8 x i16>, <8 x i16> *%a2, align 16
+ %3 = shufflevector <8 x i16> %1, <8 x i16> %2, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11>
+ ret <8 x i16> %3
+}
+
+define <2 x i64> @test_pxor(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
+; GENERIC-LABEL: test_pxor:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: pxor %xmm1, %xmm0
+; GENERIC-NEXT: pxor (%rdi), %xmm0
+; GENERIC-NEXT: paddq %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_pxor:
+; ATOM: # BB#0:
+; ATOM-NEXT: pxor %xmm1, %xmm0
+; ATOM-NEXT: pxor (%rdi), %xmm0
+; ATOM-NEXT: paddq %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_pxor:
+; SLM: # BB#0:
+; SLM-NEXT: pxor %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: pxor (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: paddq %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_pxor:
+; SANDY: # BB#0:
+; SANDY-NEXT: vpxor %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vpxor (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_pxor:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vpxor %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; HASWELL-NEXT: vpxor (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; HASWELL-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_pxor:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vpxor %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vpxor (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = xor <2 x i64> %a0, %a1
+ %2 = load <2 x i64>, <2 x i64> *%a2, align 16
+ %3 = xor <2 x i64> %1, %2
+ %4 = add <2 x i64> %3, %a1
+ ret <2 x i64> %4
+}
+
+define <2 x double> @test_shufpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_shufpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
+; GENERIC-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],mem[0]
+; GENERIC-NEXT: addpd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_shufpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
+; ATOM-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],mem[0]
+; ATOM-NEXT: addpd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_shufpd:
+; SLM: # BB#0:
+; SLM-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] sched: [1:1.00]
+; SLM-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],mem[0] sched: [4:1.00]
+; SLM-NEXT: addpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_shufpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] sched: [1:1.00]
+; SANDY-NEXT: vshufpd {{.*#+}} xmm1 = xmm1[1],mem[0] sched: [5:1.00]
+; SANDY-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_shufpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] sched: [1:1.00]
+; HASWELL-NEXT: vshufpd {{.*#+}} xmm1 = xmm1[1],mem[0] sched: [5:1.00]
+; HASWELL-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_shufpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] sched: [1:0.50]
+; BTVER2-NEXT: vshufpd {{.*#+}} xmm1 = xmm1[1],mem[0] sched: [6:1.00]
+; BTVER2-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <2 x double> %a0, <2 x double> %a1, <2 x i32> <i32 1, i32 2>
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = shufflevector <2 x double> %a1, <2 x double> %2, <2 x i32> <i32 1, i32 2>
+ %4 = fadd <2 x double> %1, %3
+ ret <2 x double> %4
+}
+
+define <2 x double> @test_sqrtpd(<2 x double> %a0, <2 x double> *%a1) {
+; GENERIC-LABEL: test_sqrtpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: sqrtpd %xmm0, %xmm1
+; GENERIC-NEXT: sqrtpd (%rdi), %xmm0
+; GENERIC-NEXT: addpd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_sqrtpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: sqrtpd %xmm0, %xmm1
+; ATOM-NEXT: sqrtpd (%rdi), %xmm0
+; ATOM-NEXT: addpd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_sqrtpd:
+; SLM: # BB#0:
+; SLM-NEXT: sqrtpd (%rdi), %xmm1 # sched: [18:1.00]
+; SLM-NEXT: sqrtpd %xmm0, %xmm0 # sched: [15:1.00]
+; SLM-NEXT: addpd %xmm0, %xmm1 # sched: [3:1.00]
+; SLM-NEXT: movapd %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_sqrtpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vsqrtpd %xmm0, %xmm0 # sched: [15:1.00]
+; SANDY-NEXT: vsqrtpd (%rdi), %xmm1 # sched: [19:1.00]
+; SANDY-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_sqrtpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vsqrtpd %xmm0, %xmm0 # sched: [15:1.00]
+; HASWELL-NEXT: vsqrtpd (%rdi), %xmm1 # sched: [19:1.00]
+; HASWELL-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_sqrtpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vsqrtpd (%rdi), %xmm1 # sched: [26:21.00]
+; BTVER2-NEXT: vsqrtpd %xmm0, %xmm0 # sched: [21:21.00]
+; BTVER2-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double> %a0)
+ %2 = load <2 x double>, <2 x double> *%a1, align 16
+ %3 = call <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double> %2)
+ %4 = fadd <2 x double> %1, %3
+ ret <2 x double> %4
+}
+declare <2 x double> @llvm.x86.sse2.sqrt.pd(<2 x double>) nounwind readnone
+
+; TODO - sqrtsd_m
+
+define <2 x double> @test_sqrtsd(<2 x double> %a0, <2 x double> *%a1) {
+; GENERIC-LABEL: test_sqrtsd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: sqrtsd %xmm0, %xmm0
+; GENERIC-NEXT: movapd (%rdi), %xmm1
+; GENERIC-NEXT: sqrtsd %xmm1, %xmm1
+; GENERIC-NEXT: addpd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_sqrtsd:
+; ATOM: # BB#0:
+; ATOM-NEXT: movapd (%rdi), %xmm1
+; ATOM-NEXT: sqrtsd %xmm0, %xmm0
+; ATOM-NEXT: sqrtsd %xmm1, %xmm1
+; ATOM-NEXT: addpd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_sqrtsd:
+; SLM: # BB#0:
+; SLM-NEXT: movapd (%rdi), %xmm1 # sched: [3:1.00]
+; SLM-NEXT: sqrtsd %xmm0, %xmm0 # sched: [18:1.00]
+; SLM-NEXT: sqrtsd %xmm1, %xmm1 # sched: [18:1.00]
+; SLM-NEXT: addpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_sqrtsd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0 # sched: [19:1.00]
+; SANDY-NEXT: vmovapd (%rdi), %xmm1 # sched: [4:0.50]
+; SANDY-NEXT: vsqrtsd %xmm1, %xmm1, %xmm1 # sched: [19:1.00]
+; SANDY-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_sqrtsd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0 # sched: [19:1.00]
+; HASWELL-NEXT: vmovapd (%rdi), %xmm1 # sched: [4:0.50]
+; HASWELL-NEXT: vsqrtsd %xmm1, %xmm1, %xmm1 # sched: [19:1.00]
+; HASWELL-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_sqrtsd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vmovapd (%rdi), %xmm1 # sched: [5:1.00]
+; BTVER2-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0 # sched: [26:21.00]
+; BTVER2-NEXT: vsqrtsd %xmm1, %xmm1, %xmm1 # sched: [26:21.00]
+; BTVER2-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %a0)
+ %2 = load <2 x double>, <2 x double> *%a1, align 16
+ %3 = call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %2)
+ %4 = fadd <2 x double> %1, %3
+ ret <2 x double> %4
+}
+declare <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double>) nounwind readnone
+
+define <2 x double> @test_subpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_subpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: subpd %xmm1, %xmm0
+; GENERIC-NEXT: subpd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_subpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: subpd %xmm1, %xmm0
+; ATOM-NEXT: subpd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_subpd:
+; SLM: # BB#0:
+; SLM-NEXT: subpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: subpd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_subpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vsubpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vsubpd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_subpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vsubpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vsubpd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_subpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vsubpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vsubpd (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fsub <2 x double> %a0, %a1
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = fsub <2 x double> %1, %2
+ ret <2 x double> %3
+}
+
+define double @test_subsd(double %a0, double %a1, double *%a2) {
+; GENERIC-LABEL: test_subsd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: subsd %xmm1, %xmm0
+; GENERIC-NEXT: subsd (%rdi), %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_subsd:
+; ATOM: # BB#0:
+; ATOM-NEXT: subsd %xmm1, %xmm0
+; ATOM-NEXT: subsd (%rdi), %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_subsd:
+; SLM: # BB#0:
+; SLM-NEXT: subsd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: subsd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_subsd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vsubsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: vsubsd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_subsd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vsubsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: vsubsd (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_subsd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vsubsd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: vsubsd (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = fsub double %a0, %a1
+ %2 = load double, double *%a2, align 8
+ %3 = fsub double %1, %2
+ ret double %3
+}
+
+define i32 @test_ucomisd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_ucomisd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: ucomisd %xmm1, %xmm0
+; GENERIC-NEXT: setnp %al
+; GENERIC-NEXT: sete %cl
+; GENERIC-NEXT: andb %al, %cl
+; GENERIC-NEXT: ucomisd (%rdi), %xmm0
+; GENERIC-NEXT: setnp %al
+; GENERIC-NEXT: sete %dl
+; GENERIC-NEXT: andb %al, %dl
+; GENERIC-NEXT: orb %cl, %dl
+; GENERIC-NEXT: movzbl %dl, %eax
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_ucomisd:
+; ATOM: # BB#0:
+; ATOM-NEXT: ucomisd %xmm1, %xmm0
+; ATOM-NEXT: setnp %al
+; ATOM-NEXT: sete %cl
+; ATOM-NEXT: andb %al, %cl
+; ATOM-NEXT: ucomisd (%rdi), %xmm0
+; ATOM-NEXT: setnp %al
+; ATOM-NEXT: sete %dl
+; ATOM-NEXT: andb %al, %dl
+; ATOM-NEXT: orb %cl, %dl
+; ATOM-NEXT: movzbl %dl, %eax
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_ucomisd:
+; SLM: # BB#0:
+; SLM-NEXT: ucomisd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: setnp %al # sched: [1:0.50]
+; SLM-NEXT: sete %cl # sched: [1:0.50]
+; SLM-NEXT: andb %al, %cl # sched: [1:0.50]
+; SLM-NEXT: ucomisd (%rdi), %xmm0 # sched: [6:1.00]
+; SLM-NEXT: setnp %al # sched: [1:0.50]
+; SLM-NEXT: sete %dl # sched: [1:0.50]
+; SLM-NEXT: andb %al, %dl # sched: [1:0.50]
+; SLM-NEXT: orb %cl, %dl # sched: [1:0.50]
+; SLM-NEXT: movzbl %dl, %eax # sched: [1:0.50]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_ucomisd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vucomisd %xmm1, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: setnp %al # sched: [1:0.33]
+; SANDY-NEXT: sete %cl # sched: [1:0.33]
+; SANDY-NEXT: andb %al, %cl # sched: [1:0.33]
+; SANDY-NEXT: vucomisd (%rdi), %xmm0 # sched: [7:1.00]
+; SANDY-NEXT: setnp %al # sched: [1:0.33]
+; SANDY-NEXT: sete %dl # sched: [1:0.33]
+; SANDY-NEXT: andb %al, %dl # sched: [1:0.33]
+; SANDY-NEXT: orb %cl, %dl # sched: [1:0.33]
+; SANDY-NEXT: movzbl %dl, %eax # sched: [1:0.33]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_ucomisd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vucomisd %xmm1, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: setnp %al # sched: [1:0.50]
+; HASWELL-NEXT: sete %cl # sched: [1:0.50]
+; HASWELL-NEXT: andb %al, %cl # sched: [1:0.25]
+; HASWELL-NEXT: vucomisd (%rdi), %xmm0 # sched: [7:1.00]
+; HASWELL-NEXT: setnp %al # sched: [1:0.50]
+; HASWELL-NEXT: sete %dl # sched: [1:0.50]
+; HASWELL-NEXT: andb %al, %dl # sched: [1:0.25]
+; HASWELL-NEXT: orb %cl, %dl # sched: [1:0.25]
+; HASWELL-NEXT: movzbl %dl, %eax # sched: [1:0.25]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_ucomisd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vucomisd %xmm1, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: setnp %al # sched: [1:0.50]
+; BTVER2-NEXT: sete %cl # sched: [1:0.50]
+; BTVER2-NEXT: andb %al, %cl # sched: [1:0.50]
+; BTVER2-NEXT: vucomisd (%rdi), %xmm0 # sched: [8:1.00]
+; BTVER2-NEXT: setnp %al # sched: [1:0.50]
+; BTVER2-NEXT: sete %dl # sched: [1:0.50]
+; BTVER2-NEXT: andb %al, %dl # sched: [1:0.50]
+; BTVER2-NEXT: orb %cl, %dl # sched: [1:0.50]
+; BTVER2-NEXT: movzbl %dl, %eax # sched: [1:0.50]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %a0, <2 x double> %a1)
+ %2 = load <2 x double>, <2 x double> *%a2, align 8
+ %3 = call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %a0, <2 x double> %2)
+ %4 = or i32 %1, %3
+ ret i32 %4
+}
+declare i32 @llvm.x86.sse2.ucomieq.sd(<2 x double>, <2 x double>) nounwind readnone
+
+define <2 x double> @test_unpckhpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_unpckhpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
+; GENERIC-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],mem[1]
+; GENERIC-NEXT: addpd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_unpckhpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
+; ATOM-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],mem[1]
+; ATOM-NEXT: addpd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_unpckhpd:
+; SLM: # BB#0:
+; SLM-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] sched: [1:1.00]
+; SLM-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],mem[1] sched: [4:1.00]
+; SLM-NEXT: addpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_unpckhpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] sched: [1:1.00]
+; SANDY-NEXT: vunpckhpd {{.*#+}} xmm1 = xmm1[1],mem[1] sched: [5:1.00]
+; SANDY-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_unpckhpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] sched: [1:1.00]
+; HASWELL-NEXT: vunpckhpd {{.*#+}} xmm1 = xmm1[1],mem[1] sched: [5:1.00]
+; HASWELL-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_unpckhpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] sched: [1:0.50]
+; BTVER2-NEXT: vunpckhpd {{.*#+}} xmm1 = xmm1[1],mem[1] sched: [6:1.00]
+; BTVER2-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <2 x double> %a0, <2 x double> %a1, <2 x i32> <i32 1, i32 3>
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = shufflevector <2 x double> %a1, <2 x double> %2, <2 x i32> <i32 1, i32 3>
+ %4 = fadd <2 x double> %1, %3
+ ret <2 x double> %4
+}
+
+define <2 x double> @test_unpcklpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_unpcklpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; GENERIC-NEXT: movapd %xmm0, %xmm1
+; GENERIC-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],mem[0]
+; GENERIC-NEXT: addpd %xmm0, %xmm1
+; GENERIC-NEXT: movapd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_unpcklpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; ATOM-NEXT: movapd %xmm0, %xmm1
+; ATOM-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],mem[0]
+; ATOM-NEXT: addpd %xmm0, %xmm1
+; ATOM-NEXT: movapd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_unpcklpd:
+; SLM: # BB#0:
+; SLM-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
+; SLM-NEXT: movapd %xmm0, %xmm1 # sched: [1:1.00]
+; SLM-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [4:1.00]
+; SLM-NEXT: addpd %xmm0, %xmm1 # sched: [3:1.00]
+; SLM-NEXT: movapd %xmm1, %xmm0 # sched: [1:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_unpcklpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
+; SANDY-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm0[0],mem[0] sched: [5:1.00]
+; SANDY-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_unpcklpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
+; HASWELL-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm0[0],mem[0] sched: [5:1.00]
+; HASWELL-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_unpcklpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:0.50]
+; BTVER2-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm0[0],mem[0] sched: [6:1.00]
+; BTVER2-NEXT: vaddpd %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = shufflevector <2 x double> %a0, <2 x double> %a1, <2 x i32> <i32 0, i32 2>
+ %2 = load <2 x double>, <2 x double> *%a2, align 16
+ %3 = shufflevector <2 x double> %1, <2 x double> %2, <2 x i32> <i32 0, i32 2>
+ %4 = fadd <2 x double> %1, %3
+ ret <2 x double> %4
+}
+
+define <2 x double> @test_xorpd(<2 x double> %a0, <2 x double> %a1, <2 x double> *%a2) {
+; GENERIC-LABEL: test_xorpd:
+; GENERIC: # BB#0:
+; GENERIC-NEXT: xorpd %xmm1, %xmm0
+; GENERIC-NEXT: xorpd (%rdi), %xmm0
+; GENERIC-NEXT: addpd %xmm1, %xmm0
+; GENERIC-NEXT: retq
+;
+; ATOM-LABEL: test_xorpd:
+; ATOM: # BB#0:
+; ATOM-NEXT: xorpd %xmm1, %xmm0
+; ATOM-NEXT: xorpd (%rdi), %xmm0
+; ATOM-NEXT: addpd %xmm1, %xmm0
+; ATOM-NEXT: retq
+;
+; SLM-LABEL: test_xorpd:
+; SLM: # BB#0:
+; SLM-NEXT: xorpd %xmm1, %xmm0 # sched: [1:0.50]
+; SLM-NEXT: xorpd (%rdi), %xmm0 # sched: [4:1.00]
+; SLM-NEXT: addpd %xmm1, %xmm0 # sched: [3:1.00]
+; SLM-NEXT: retq # sched: [4:1.00]
+;
+; SANDY-LABEL: test_xorpd:
+; SANDY: # BB#0:
+; SANDY-NEXT: vxorpd %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
+; SANDY-NEXT: vxorpd (%rdi), %xmm0, %xmm0 # sched: [5:0.50]
+; SANDY-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; SANDY-NEXT: retq # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_xorpd:
+; HASWELL: # BB#0:
+; HASWELL-NEXT: vxorpd %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
+; HASWELL-NEXT: vxorpd (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
+; HASWELL-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; HASWELL-NEXT: retq # sched: [1:1.00]
+;
+; BTVER2-LABEL: test_xorpd:
+; BTVER2: # BB#0:
+; BTVER2-NEXT: vxorpd %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
+; BTVER2-NEXT: vxorpd (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
+; BTVER2-NEXT: vaddpd %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
+; BTVER2-NEXT: retq # sched: [4:1.00]
+ %1 = bitcast <2 x double> %a0 to <4 x i32>
+ %2 = bitcast <2 x double> %a1 to <4 x i32>
+ %3 = xor <4 x i32> %1, %2
+ %4 = load <2 x double>, <2 x double> *%a2, align 16
+ %5 = bitcast <2 x double> %4 to <4 x i32>
+ %6 = xor <4 x i32> %3, %5
+ %7 = bitcast <4 x i32> %6 to <2 x double>
+ %8 = fadd <2 x double> %a1, %7
+ ret <2 x double> %8
+}
+
+!0 = !{i32 1}
diff --git a/test/CodeGen/X86/tail-merge-after-mbp.ll b/test/CodeGen/X86/tail-merge-after-mbp.ll
deleted file mode 100644
index dc5f3a12bd91..000000000000
--- a/test/CodeGen/X86/tail-merge-after-mbp.ll
+++ /dev/null
@@ -1,94 +0,0 @@
-; RUN: llc -mtriple=x86_64-linux -o - %s | FileCheck %s
-
-%0 = type { %1, %3* }
-%1 = type { %2* }
-%2 = type { %2*, i8* }
-%3 = type { i32, i32 (i32, i32)* }
-
-
-declare i32 @Up(...)
-declare i32 @f(i32, i32)
-
-; check loop block_14 is not merged with block_21
-; check loop block_11 is not merged with block_18, block_25
-define i32 @foo(%0* nocapture readonly, i32, i1 %c, i8* %p1, %2** %p2) {
-; CHECK-LABEL: foo:
-; CHECK: # %block_11
-; CHECK-NEXT: movq (%r14), %rax
-; CHECK-NEXT: testq %rax, %rax
-; CHECK-NEXT: je
-; CHECK-NEXT:# %block_14
-; CHECK-NEXT: cmpq $0, 8(%rax)
-; CHECK-NEXT: jne
-; CHECK-NEXT:# %block_18
-; CHECK-NEXT: movq (%r14), %rax
-; CHECK-NEXT: testq %rax, %rax
-; CHECK-NEXT: je
-; CHECK-NEXT:# %block_21
-; CHECK-NEXT:# =>This Inner Loop Header
-; CHECK-NEXT: cmpq $0, 8(%rax)
-; CHECK-NEXT: jne
-; CHECK-NEXT:# %block_25
-; CHECK-NEXT:# in Loop
-; CHECK-NEXT: movq (%r14), %rax
-; CHECK-NEXT: testq %rax, %rax
-; CHECK-NEXT: jne
- br i1 %c, label %block_34, label %block_3
-
-block_3: ; preds = %2
- br i1 %c, label %block_7, label %block_4
-
-block_4: ; preds = %block_3
- %a5 = tail call i32 @f(i32 undef, i32 undef)
- %a6 = icmp eq i32 %a5, 0
- br i1 %a6, label %block_7, label %block_34
-
-block_7: ; preds = %block_4, %block_3
- %a8 = icmp eq %2* null, null
- br i1 %a8, label %block_34, label %block_9
-
-block_9: ; preds = %block_7
- %a10 = icmp eq i8* %p1, null
- br i1 %a10, label %block_11, label %block_32
-
-block_11: ; preds = %block_9
- %a12 = load %2*, %2** %p2, align 8
- %a13 = icmp eq %2* %a12, null
- br i1 %a13, label %block_34, label %block_14
-
-block_14: ; preds = %block_11
- %a15 = getelementptr inbounds %2, %2* %a12, i64 0, i32 1
- %a16 = load i8*, i8** %a15, align 8
- %a17 = icmp eq i8* %a16, null
- br i1 %a17, label %block_18, label %block_32
-
-block_18: ; preds = %block_14
- %a19 = load %2*, %2** %p2, align 8
- %a20 = icmp eq %2* %a19, null
- br i1 %a20, label %block_34, label %block_21
-
-block_21: ; preds = %block_18
- %a22 = getelementptr inbounds %2, %2* %a19, i64 0, i32 1
- %a23 = load i8*, i8** %a22, align 8
- %a24 = icmp eq i8* %a23, null
- br i1 %a24, label %block_25, label %block_32
-
-block_25: ; preds = %block_28, %block_21
- %a26 = load %2*, %2** %p2, align 8
- %a27 = icmp eq %2* %a26, null
- br i1 %a27, label %block_34, label %block_28
-
-block_28: ; preds = %block_25
- %a29 = getelementptr inbounds %2, %2* %a26, i64 0, i32 1
- %a30 = load i8*, i8** %a29, align 8
- %a31 = icmp eq i8* %a30, null
- br i1 %a31, label %block_25, label %block_32
-
-block_32: ; preds = %block_28, %block_21, %block_14, %block_9
- %a33 = tail call i32 (...) @Up()
- br label %block_34
-
-block_34: ; preds = %block_32, %block_25, %block_18, %block_11, %block_7, %block_4, %2
- %a35 = phi i32 [ 0, %2 ], [ %a5, %block_4 ], [ 0, %block_7 ], [ 0, %block_11 ], [ 0, %block_32 ], [ 0, %block_18 ], [ 0, %block_25 ]
- ret i32 %a35
-}
diff --git a/test/CodeGen/X86/tail-merge-after-mbp.mir b/test/CodeGen/X86/tail-merge-after-mbp.mir
new file mode 100644
index 000000000000..d1dc65336948
--- /dev/null
+++ b/test/CodeGen/X86/tail-merge-after-mbp.mir
@@ -0,0 +1,105 @@
+# RUN: llc -mtriple=x86_64-linux -run-pass=block-placement -o - %s | FileCheck %s
+
+---
+# check loop bb.7 is not merged with bb.10, bb.13
+# check loop bb.9 is not merged with bb.12
+# CHECK: bb.2:
+# CHECK-NEXT: successors: %bb.9(0x30000000), %bb.3(0x50000000)
+# CHECK: %rax = MOV64rm %r14, 1, _, 0, _
+# CHECK-NEXT: TEST64rr %rax, %rax
+# CHECK-NEXT: JE_1 %bb.9
+# CHECK: bb.3:
+# CHECK-NEXT: successors: %bb.4(0x30000000), %bb.8(0x50000000)
+# CHECK: CMP64mi8 killed %rax, 1, _, 8, _, 0
+# CHECK-NEXT: JNE_1 %bb.8
+# CHECK: bb.4:
+# CHECK-NEXT: successors: %bb.9(0x30000000), %bb.5(0x50000000)
+# CHECK: %rax = MOV64rm %r14, 1, _, 0, _
+# CHECK-NEXT: TEST64rr %rax, %rax
+# CHECK-NEXT: JE_1 %bb.9
+# CHECK: bb.5
+# CHECK-NEXT: successors: %bb.6(0x71555555), %bb.8(0x0eaaaaab)
+# CHECK: CMP64mi8 killed %rax, 1, _, 8, _, 0
+# CHECK-NEXT: JNE_1 %bb.8
+# CHECK: bb.6:
+# CHECK-NEXT: successors: %bb.9(0x04000000), %bb.5(0x7c000000)
+# CHECK: %rax = MOV64rm %r14, 1, _, 0, _
+# CHECK-NEXT: TEST64rr %rax, %rax
+# CHECK-NEXT: JNE_1 %bb.5
+
+name: foo
+body: |
+ bb.0:
+ successors: %bb.1(0x40000000), %bb.7(0x40000000)
+
+ TEST8ri %dl, 1, implicit-def %eflags, implicit killed %edx
+ JE_1 %bb.7, implicit %eflags
+
+ bb.1:
+ successors: %bb.16(0x80000000)
+
+ %ebp = XOR32rr undef %ebp, undef %ebp, implicit-def dead %eflags
+ JMP_1 %bb.16
+
+ bb.7:
+ successors: %bb.8(0x30000000), %bb.9(0x50000000)
+
+ %rax = MOV64rm %r14, 1, _, 0, _ :: (load 8)
+ TEST64rr %rax, %rax, implicit-def %eflags
+ JNE_1 %bb.9, implicit killed %eflags
+
+ bb.8:
+ successors: %bb.16(0x80000000)
+
+ %ebp = XOR32rr undef %ebp, undef %ebp, implicit-def dead %eflags
+ JMP_1 %bb.16
+
+ bb.9:
+ successors: %bb.10(0x30000000), %bb.15(0x50000000)
+
+ CMP64mi8 killed %rax, 1, _, 8, _, 0, implicit-def %eflags :: (load 8)
+ JNE_1 %bb.15, implicit %eflags
+
+ bb.10:
+ successors: %bb.11(0x30000000), %bb.12(0x50000000)
+
+ %rax = MOV64rm %r14, 1, _, 0, _ :: (load 8)
+ TEST64rr %rax, %rax, implicit-def %eflags
+ JNE_1 %bb.12, implicit %eflags
+
+ bb.11:
+ successors: %bb.16(0x80000000)
+
+ %ebp = XOR32rr undef %ebp, undef %ebp, implicit-def dead %eflags
+ JMP_1 %bb.16
+
+ bb.12:
+ successors: %bb.13(0x71555555), %bb.15(0x0eaaaaab)
+
+ CMP64mi8 killed %rax, 1, _, 8, _, 0, implicit-def %eflags :: (load 8), (load 8)
+ JNE_1 %bb.15, implicit %eflags
+
+ bb.13:
+ successors: %bb.14(0x04000000), %bb.12(0x7c000000)
+
+ %rax = MOV64rm %r14, 1, _, 0, _ :: (load 8)
+ TEST64rr %rax, %rax, implicit-def %eflags
+ JNE_1 %bb.12, implicit %eflags
+
+ bb.14:
+ successors: %bb.16(0x80000000)
+
+ %ebp = XOR32rr undef %ebp, undef %ebp, implicit-def dead %eflags
+ JMP_1 %bb.16
+
+ bb.15:
+ successors: %bb.16(0x80000000)
+
+ %ebp = XOR32rr undef %ebp, undef %ebp, implicit-def dead %eflags
+ dead %eax = XOR32rr undef %eax, undef %eax, implicit-def dead %eflags, implicit-def %al
+
+ bb.16:
+
+ RETQ %eax
+
+...
diff --git a/test/CodeGen/X86/vector-rotate-128.ll b/test/CodeGen/X86/vector-rotate-128.ll
index 5eb1a55881e5..852c1f4d3d98 100644
--- a/test/CodeGen/X86/vector-rotate-128.ll
+++ b/test/CodeGen/X86/vector-rotate-128.ll
@@ -1534,31 +1534,20 @@ define <16 x i8> @splatconstant_rotate_v16i8(<16 x i8> %a) nounwind {
define <2 x i64> @splatconstant_rotate_mask_v2i64(<2 x i64> %a) nounwind {
; SSE-LABEL: splatconstant_rotate_mask_v2i64:
; SSE: # BB#0:
-; SSE-NEXT: movdqa %xmm0, %xmm1
-; SSE-NEXT: psllq $15, %xmm1
; SSE-NEXT: psrlq $49, %xmm0
; SSE-NEXT: pand {{.*}}(%rip), %xmm0
-; SSE-NEXT: pand {{.*}}(%rip), %xmm1
-; SSE-NEXT: por %xmm0, %xmm1
-; SSE-NEXT: movdqa %xmm1, %xmm0
; SSE-NEXT: retq
;
; AVX-LABEL: splatconstant_rotate_mask_v2i64:
; AVX: # BB#0:
-; AVX-NEXT: vpsllq $15, %xmm0, %xmm1
; AVX-NEXT: vpsrlq $49, %xmm0, %xmm0
; AVX-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
-; AVX-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
-; AVX-NEXT: vpor %xmm0, %xmm1, %xmm0
; AVX-NEXT: retq
;
; AVX512-LABEL: splatconstant_rotate_mask_v2i64:
; AVX512: # BB#0:
-; AVX512-NEXT: vpsllq $15, %xmm0, %xmm1
; AVX512-NEXT: vpsrlq $49, %xmm0, %xmm0
; AVX512-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
-; AVX512-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
-; AVX512-NEXT: vpor %xmm0, %xmm1, %xmm0
; AVX512-NEXT: retq
;
; XOP-LABEL: splatconstant_rotate_mask_v2i64:
diff --git a/test/CodeGen/X86/vector-rotate-256.ll b/test/CodeGen/X86/vector-rotate-256.ll
index 3306cd400c1d..14215e486bf9 100644
--- a/test/CodeGen/X86/vector-rotate-256.ll
+++ b/test/CodeGen/X86/vector-rotate-256.ll
@@ -1014,34 +1014,23 @@ define <32 x i8> @splatconstant_rotate_v32i8(<32 x i8> %a) nounwind {
define <4 x i64> @splatconstant_rotate_mask_v4i64(<4 x i64> %a) nounwind {
; AVX1-LABEL: splatconstant_rotate_mask_v4i64:
; AVX1: # BB#0:
-; AVX1-NEXT: vpsllq $15, %xmm0, %xmm1
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
-; AVX1-NEXT: vpsllq $15, %xmm2, %xmm3
-; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
+; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
; AVX1-NEXT: vpsrlq $49, %xmm0, %xmm0
-; AVX1-NEXT: vpsrlq $49, %xmm2, %xmm2
-; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
+; AVX1-NEXT: vpsrlq $49, %xmm1, %xmm1
+; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
-; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm1
-; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0
; AVX1-NEXT: retq
;
; AVX2-LABEL: splatconstant_rotate_mask_v4i64:
; AVX2: # BB#0:
-; AVX2-NEXT: vpsllq $15, %ymm0, %ymm1
; AVX2-NEXT: vpsrlq $49, %ymm0, %ymm0
; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
-; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
-; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: splatconstant_rotate_mask_v4i64:
; AVX512: # BB#0:
-; AVX512-NEXT: vpsllq $15, %ymm0, %ymm1
; AVX512-NEXT: vpsrlq $49, %ymm0, %ymm0
; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
-; AVX512-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
-; AVX512-NEXT: vpor %ymm0, %ymm1, %ymm0
; AVX512-NEXT: retq
;
; XOPAVX1-LABEL: splatconstant_rotate_mask_v4i64:
diff --git a/test/CodeGen/X86/x86-16.ll b/test/CodeGen/X86/x86-16.ll
index 775b2c447bbd..55b53a8047c5 100644
--- a/test/CodeGen/X86/x86-16.ll
+++ b/test/CodeGen/X86/x86-16.ll
@@ -12,9 +12,16 @@ define i32 @main() #0 {
; CHECK: .code16
; CHECK-LABEL: main
+define i64 @foo(i32 %index) #0 {
+ %asm = tail call i64 asm "rdmsr", "=A,{cx},~{dirflag},~{fpsr},~{flags}"(i32 %index)
+ ret i64 %asm
+}
+
+; CHECK-LABEL: foo
+; CHECK: rdmsr
attributes #0 = { nounwind }
!llvm.ident = !{!0}
-!0 = !{!"clang version 3.9.0 (trunk 265439) (llvm/trunk 265567)"} \ No newline at end of file
+!0 = !{!"clang version 3.9.0 (trunk 265439) (llvm/trunk 265567)"}