summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2010-06-25 21:05:35 +0000
committerDan Gohman <gohman@apple.com>2010-06-25 21:05:35 +0000
commit8de1fe3ccf17130904d9a4fd52a2f20287a257fd (patch)
treec2745d084f48461da696f02c6e1bd3ca3fa86665
parenta1c1db380891817afca62bd7de74c18919b04823 (diff)
downloadbcm5719-llvm-8de1fe3ccf17130904d9a4fd52a2f20287a257fd.tar.gz
bcm5719-llvm-8de1fe3ccf17130904d9a4fd52a2f20287a257fd.zip
pcmpeqd and friends are Commutable.
llvm-svn: 106886
-rw-r--r--llvm/lib/Target/X86/X86InstrSSE.td6
-rw-r--r--llvm/test/CodeGen/X86/sse-commute.ll20
2 files changed, 23 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86InstrSSE.td b/llvm/lib/Target/X86/X86InstrSSE.td
index 3a381cfed3a..821b817f03d 100644
--- a/llvm/lib/Target/X86/X86InstrSSE.td
+++ b/llvm/lib/Target/X86/X86InstrSSE.td
@@ -2060,9 +2060,9 @@ let Constraints = "$src1 = $dst", ExeDomain = SSEPackedInt in {
}
// SSE2 Integer comparison
-defm PCMPEQB : PDI_binop_rm_int<0x74, "pcmpeqb", int_x86_sse2_pcmpeq_b>;
-defm PCMPEQW : PDI_binop_rm_int<0x75, "pcmpeqw", int_x86_sse2_pcmpeq_w>;
-defm PCMPEQD : PDI_binop_rm_int<0x76, "pcmpeqd", int_x86_sse2_pcmpeq_d>;
+defm PCMPEQB : PDI_binop_rm_int<0x74, "pcmpeqb", int_x86_sse2_pcmpeq_b, 1>;
+defm PCMPEQW : PDI_binop_rm_int<0x75, "pcmpeqw", int_x86_sse2_pcmpeq_w, 1>;
+defm PCMPEQD : PDI_binop_rm_int<0x76, "pcmpeqd", int_x86_sse2_pcmpeq_d, 1>;
defm PCMPGTB : PDI_binop_rm_int<0x64, "pcmpgtb", int_x86_sse2_pcmpgt_b>;
defm PCMPGTW : PDI_binop_rm_int<0x65, "pcmpgtw", int_x86_sse2_pcmpgt_w>;
defm PCMPGTD : PDI_binop_rm_int<0x66, "pcmpgtd", int_x86_sse2_pcmpgt_d>;
diff --git a/llvm/test/CodeGen/X86/sse-commute.ll b/llvm/test/CodeGen/X86/sse-commute.ll
new file mode 100644
index 00000000000..38ed644e952
--- /dev/null
+++ b/llvm/test/CodeGen/X86/sse-commute.ll
@@ -0,0 +1,20 @@
+; RUN: llc -march=x86-64 < %s | FileCheck %s
+
+; Commute the comparison to avoid a move.
+; PR7500.
+
+; CHECK: a:
+; CHECK-NOT: mov
+; CHECK: pcmpeqd
+define <2 x double> @a(<2 x double>, <2 x double>) nounwind readnone {
+entry:
+ %tmp6 = bitcast <2 x double> %0 to <4 x i32> ; <<4 x i32>> [#uses=2]
+ %tmp4 = bitcast <2 x double> %1 to <4 x i32> ; <<4 x i32>> [#uses=1]
+ %cmp = icmp eq <4 x i32> %tmp6, %tmp4 ; <<4 x i1>> [#uses=1]
+ %sext = sext <4 x i1> %cmp to <4 x i32> ; <<4 x i32>> [#uses=1]
+ %and = and <4 x i32> %tmp6, %sext ; <<4 x i32>> [#uses=1]
+ %tmp8 = bitcast <4 x i32> %and to <2 x double> ; <<2 x double>> [#uses=1]
+ ret <2 x double> %tmp8
+}
+
+
OpenPOWER on IntegriCloud