[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)
commite5015d8abad0e4980c3a11cd4d68f65907504ffd
treeb1f459cd59339dd48e76d6379430835b68c4d5a5
parent252cbe25cb7e02df422cc9f4ac0fdf235c6b2cd8
[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

llvm-svn: 211427
llvm/lib/Target/X86/X86InstrSSE.td
llvm/test/CodeGen/X86/sse3-avx-addsub.ll [new file with mode: 0644]