[X86] Add ISel patterns to select SSE3/AVX ADDSUB instructions.
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Sat, 21 Jun 2014 01:31:15 +0000 (01:31 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Sat, 21 Jun 2014 01:31:15 +0000 (01:31 +0000)
commit5d0ff9c9289fc4f9e99c7b27b7c8b42597cd8765
tree50c46c9d176b6b63beb19e17323c1cd157684df0
parent9222a2375f1f2cb9528c6d9b32238f6bac434d94
[X86] Add ISel patterns to select SSE3/AVX ADDSUB instructions.

This patch adds ISel patterns to select SSE3/AVX ADDSUB instructions
from a sequence of "vadd + vsub + blend".

Example:

///
typedef float float4 __attribute__((ext_vector_type(4)));

float4 foo(float4 A, float4 B) {
  float4 X = A - B;
  float4 Y = A + B;
  return (float4){X[0], Y[1], X[2], Y[3]};
}
///

Before this patch, (with flag -mcpu=corei7) llc produced the following
assembly sequence:
  movaps  %xmm0, %xmm2
  addps   %xmm1, %xmm2
  subps   %xmm1, %xmm0
  blendps $10, %xmm2, %xmm0

With this patch, we now get a single
  addsubps  %xmm1, %xmm0

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211427 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/X86InstrSSE.td
test/CodeGen/X86/sse3-avx-addsub.ll [new file with mode: 0644]