| ; RUN: llc < %s -march=x86-64 -mcpu=corei7 -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK -check-prefix=SSE41 |
| ; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK -check-prefix=AVX |
| |
| |
| define double @test1_add(double %A, double %B) { |
| %1 = bitcast double %A to <2 x i32> |
| %2 = bitcast double %B to <2 x i32> |
| %add = add <2 x i32> %1, %2 |
| %3 = bitcast <2 x i32> %add to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test1_add |
| ; SSE41: paddd |
| ; AVX: vpaddd |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test2_add(double %A, double %B) { |
| %1 = bitcast double %A to <4 x i16> |
| %2 = bitcast double %B to <4 x i16> |
| %add = add <4 x i16> %1, %2 |
| %3 = bitcast <4 x i16> %add to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test2_add |
| ; SSE41: paddw |
| ; AVX: vpaddw |
| ; CHECK-NEXT: ret |
| |
| define double @test3_add(double %A, double %B) { |
| %1 = bitcast double %A to <8 x i8> |
| %2 = bitcast double %B to <8 x i8> |
| %add = add <8 x i8> %1, %2 |
| %3 = bitcast <8 x i8> %add to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test3_add |
| ; SSE41: paddb |
| ; AVX: vpaddb |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test1_sub(double %A, double %B) { |
| %1 = bitcast double %A to <2 x i32> |
| %2 = bitcast double %B to <2 x i32> |
| %sub = sub <2 x i32> %1, %2 |
| %3 = bitcast <2 x i32> %sub to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test1_sub |
| ; SSE41: psubd |
| ; AVX: vpsubd |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test2_sub(double %A, double %B) { |
| %1 = bitcast double %A to <4 x i16> |
| %2 = bitcast double %B to <4 x i16> |
| %sub = sub <4 x i16> %1, %2 |
| %3 = bitcast <4 x i16> %sub to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test2_sub |
| ; SSE41: psubw |
| ; AVX: vpsubw |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test3_sub(double %A, double %B) { |
| %1 = bitcast double %A to <8 x i8> |
| %2 = bitcast double %B to <8 x i8> |
| %sub = sub <8 x i8> %1, %2 |
| %3 = bitcast <8 x i8> %sub to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test3_sub |
| ; SSE41: psubb |
| ; AVX: vpsubb |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test1_mul(double %A, double %B) { |
| %1 = bitcast double %A to <2 x i32> |
| %2 = bitcast double %B to <2 x i32> |
| %mul = mul <2 x i32> %1, %2 |
| %3 = bitcast <2 x i32> %mul to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test1_mul |
| ; SSE41: pmulld |
| ; AVX: vpmulld |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test2_mul(double %A, double %B) { |
| %1 = bitcast double %A to <4 x i16> |
| %2 = bitcast double %B to <4 x i16> |
| %mul = mul <4 x i16> %1, %2 |
| %3 = bitcast <4 x i16> %mul to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test2_mul |
| ; SSE41: pmullw |
| ; AVX: vpmullw |
| ; CHECK-NEXT: ret |
| |
| ; There is no legal ISD::MUL with type MVT::v8i16. |
| define double @test3_mul(double %A, double %B) { |
| %1 = bitcast double %A to <8 x i8> |
| %2 = bitcast double %B to <8 x i8> |
| %mul = mul <8 x i8> %1, %2 |
| %3 = bitcast <8 x i8> %mul to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test3_mul |
| ; CHECK: pmullw |
| ; CHECK-NEXT: pshufb |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test1_and(double %A, double %B) { |
| %1 = bitcast double %A to <2 x i32> |
| %2 = bitcast double %B to <2 x i32> |
| %and = and <2 x i32> %1, %2 |
| %3 = bitcast <2 x i32> %and to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test1_and |
| ; SSE41: andps |
| ; AVX: vandps |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test2_and(double %A, double %B) { |
| %1 = bitcast double %A to <4 x i16> |
| %2 = bitcast double %B to <4 x i16> |
| %and = and <4 x i16> %1, %2 |
| %3 = bitcast <4 x i16> %and to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test2_and |
| ; SSE41: andps |
| ; AVX: vandps |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test3_and(double %A, double %B) { |
| %1 = bitcast double %A to <8 x i8> |
| %2 = bitcast double %B to <8 x i8> |
| %and = and <8 x i8> %1, %2 |
| %3 = bitcast <8 x i8> %and to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test3_and |
| ; SSE41: andps |
| ; AVX: vandps |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test1_or(double %A, double %B) { |
| %1 = bitcast double %A to <2 x i32> |
| %2 = bitcast double %B to <2 x i32> |
| %or = or <2 x i32> %1, %2 |
| %3 = bitcast <2 x i32> %or to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test1_or |
| ; SSE41: orps |
| ; AVX: vorps |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test2_or(double %A, double %B) { |
| %1 = bitcast double %A to <4 x i16> |
| %2 = bitcast double %B to <4 x i16> |
| %or = or <4 x i16> %1, %2 |
| %3 = bitcast <4 x i16> %or to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test2_or |
| ; SSE41: orps |
| ; AVX: vorps |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test3_or(double %A, double %B) { |
| %1 = bitcast double %A to <8 x i8> |
| %2 = bitcast double %B to <8 x i8> |
| %or = or <8 x i8> %1, %2 |
| %3 = bitcast <8 x i8> %or to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test3_or |
| ; SSE41: orps |
| ; AVX: vorps |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test1_xor(double %A, double %B) { |
| %1 = bitcast double %A to <2 x i32> |
| %2 = bitcast double %B to <2 x i32> |
| %xor = xor <2 x i32> %1, %2 |
| %3 = bitcast <2 x i32> %xor to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test1_xor |
| ; SSE41: xorps |
| ; AVX: vxorps |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test2_xor(double %A, double %B) { |
| %1 = bitcast double %A to <4 x i16> |
| %2 = bitcast double %B to <4 x i16> |
| %xor = xor <4 x i16> %1, %2 |
| %3 = bitcast <4 x i16> %xor to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test2_xor |
| ; SSE41: xorps |
| ; AVX: vxorps |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test3_xor(double %A, double %B) { |
| %1 = bitcast double %A to <8 x i8> |
| %2 = bitcast double %B to <8 x i8> |
| %xor = xor <8 x i8> %1, %2 |
| %3 = bitcast <8 x i8> %xor to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test3_xor |
| ; SSE41: xorps |
| ; AVX: vxorps |
| ; CHECK-NEXT: ret |
| |
| |
| define double @test_fadd(double %A, double %B) { |
| %1 = bitcast double %A to <2 x float> |
| %2 = bitcast double %B to <2 x float> |
| %add = fadd <2 x float> %1, %2 |
| %3 = bitcast <2 x float> %add to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test_fadd |
| ; SSE41: addps |
| ; AVX: vaddps |
| ; CHECK-NEXT: ret |
| |
| define double @test_fsub(double %A, double %B) { |
| %1 = bitcast double %A to <2 x float> |
| %2 = bitcast double %B to <2 x float> |
| %sub = fsub <2 x float> %1, %2 |
| %3 = bitcast <2 x float> %sub to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test_fsub |
| ; SSE41: subps |
| ; AVX: vsubps |
| ; CHECK-NEXT: ret |
| |
| define double @test_fmul(double %A, double %B) { |
| %1 = bitcast double %A to <2 x float> |
| %2 = bitcast double %B to <2 x float> |
| %mul = fmul <2 x float> %1, %2 |
| %3 = bitcast <2 x float> %mul to double |
| ret double %3 |
| } |
| ; CHECK-LABEL: test_fmul |
| ; SSE41: mulps |
| ; AVX: vmulps |
| ; CHECK-NEXT: ret |
| |