1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=corei7 -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK -check-prefix=SSE41 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK -check-prefix=AVX 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine double @test1_add(double %A, double %B) { 6*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x i32> 7*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <2 x i32> 8*9880d681SAndroid Build Coastguard Worker %add = add <2 x i32> %1, %2 9*9880d681SAndroid Build Coastguard Worker %3 = bitcast <2 x i32> %add to double 10*9880d681SAndroid Build Coastguard Worker ret double %3 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_add 13*9880d681SAndroid Build Coastguard Worker; SSE41: paddd 14*9880d681SAndroid Build Coastguard Worker; AVX: vpaddd 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine double @test2_add(double %A, double %B) { 19*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <4 x i16> 20*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <4 x i16> 21*9880d681SAndroid Build Coastguard Worker %add = add <4 x i16> %1, %2 22*9880d681SAndroid Build Coastguard Worker %3 = bitcast <4 x i16> %add to double 23*9880d681SAndroid Build Coastguard Worker ret double %3 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_add 26*9880d681SAndroid Build Coastguard Worker; SSE41: paddw 27*9880d681SAndroid Build Coastguard Worker; AVX: vpaddw 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine double @test3_add(double %A, double %B) { 31*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <8 x i8> 32*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <8 x i8> 33*9880d681SAndroid Build Coastguard Worker %add = add <8 x i8> %1, %2 34*9880d681SAndroid Build Coastguard Worker %3 = bitcast <8 x i8> %add to double 35*9880d681SAndroid Build Coastguard Worker ret double %3 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_add 38*9880d681SAndroid Build Coastguard Worker; SSE41: paddb 39*9880d681SAndroid Build Coastguard Worker; AVX: vpaddb 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdefine double @test1_sub(double %A, double %B) { 44*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x i32> 45*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <2 x i32> 46*9880d681SAndroid Build Coastguard Worker %sub = sub <2 x i32> %1, %2 47*9880d681SAndroid Build Coastguard Worker %3 = bitcast <2 x i32> %sub to double 48*9880d681SAndroid Build Coastguard Worker ret double %3 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_sub 51*9880d681SAndroid Build Coastguard Worker; SSE41: psubd 52*9880d681SAndroid Build Coastguard Worker; AVX: vpsubd 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine double @test2_sub(double %A, double %B) { 57*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <4 x i16> 58*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <4 x i16> 59*9880d681SAndroid Build Coastguard Worker %sub = sub <4 x i16> %1, %2 60*9880d681SAndroid Build Coastguard Worker %3 = bitcast <4 x i16> %sub to double 61*9880d681SAndroid Build Coastguard Worker ret double %3 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_sub 64*9880d681SAndroid Build Coastguard Worker; SSE41: psubw 65*9880d681SAndroid Build Coastguard Worker; AVX: vpsubw 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdefine double @test3_sub(double %A, double %B) { 70*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <8 x i8> 71*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <8 x i8> 72*9880d681SAndroid Build Coastguard Worker %sub = sub <8 x i8> %1, %2 73*9880d681SAndroid Build Coastguard Worker %3 = bitcast <8 x i8> %sub to double 74*9880d681SAndroid Build Coastguard Worker ret double %3 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_sub 77*9880d681SAndroid Build Coastguard Worker; SSE41: psubb 78*9880d681SAndroid Build Coastguard Worker; AVX: vpsubb 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerdefine double @test1_mul(double %A, double %B) { 83*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x i32> 84*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <2 x i32> 85*9880d681SAndroid Build Coastguard Worker %mul = mul <2 x i32> %1, %2 86*9880d681SAndroid Build Coastguard Worker %3 = bitcast <2 x i32> %mul to double 87*9880d681SAndroid Build Coastguard Worker ret double %3 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_mul 90*9880d681SAndroid Build Coastguard Worker; SSE41: pmulld 91*9880d681SAndroid Build Coastguard Worker; AVX: vpmulld 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine double @test2_mul(double %A, double %B) { 96*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <4 x i16> 97*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <4 x i16> 98*9880d681SAndroid Build Coastguard Worker %mul = mul <4 x i16> %1, %2 99*9880d681SAndroid Build Coastguard Worker %3 = bitcast <4 x i16> %mul to double 100*9880d681SAndroid Build Coastguard Worker ret double %3 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_mul 103*9880d681SAndroid Build Coastguard Worker; SSE41: pmullw 104*9880d681SAndroid Build Coastguard Worker; AVX: vpmullw 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker; There is no legal ISD::MUL with type MVT::v8i16. 108*9880d681SAndroid Build Coastguard Workerdefine double @test3_mul(double %A, double %B) { 109*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <8 x i8> 110*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <8 x i8> 111*9880d681SAndroid Build Coastguard Worker %mul = mul <8 x i8> %1, %2 112*9880d681SAndroid Build Coastguard Worker %3 = bitcast <8 x i8> %mul to double 113*9880d681SAndroid Build Coastguard Worker ret double %3 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_mul 116*9880d681SAndroid Build Coastguard Worker; CHECK: pmullw 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufb 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerdefine double @test1_and(double %A, double %B) { 122*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x i32> 123*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <2 x i32> 124*9880d681SAndroid Build Coastguard Worker %and = and <2 x i32> %1, %2 125*9880d681SAndroid Build Coastguard Worker %3 = bitcast <2 x i32> %and to double 126*9880d681SAndroid Build Coastguard Worker ret double %3 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_and 129*9880d681SAndroid Build Coastguard Worker; SSE41: andps 130*9880d681SAndroid Build Coastguard Worker; AVX: vandps 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine double @test2_and(double %A, double %B) { 135*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <4 x i16> 136*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <4 x i16> 137*9880d681SAndroid Build Coastguard Worker %and = and <4 x i16> %1, %2 138*9880d681SAndroid Build Coastguard Worker %3 = bitcast <4 x i16> %and to double 139*9880d681SAndroid Build Coastguard Worker ret double %3 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_and 142*9880d681SAndroid Build Coastguard Worker; SSE41: andps 143*9880d681SAndroid Build Coastguard Worker; AVX: vandps 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Workerdefine double @test3_and(double %A, double %B) { 148*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <8 x i8> 149*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <8 x i8> 150*9880d681SAndroid Build Coastguard Worker %and = and <8 x i8> %1, %2 151*9880d681SAndroid Build Coastguard Worker %3 = bitcast <8 x i8> %and to double 152*9880d681SAndroid Build Coastguard Worker ret double %3 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_and 155*9880d681SAndroid Build Coastguard Worker; SSE41: andps 156*9880d681SAndroid Build Coastguard Worker; AVX: vandps 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerdefine double @test1_or(double %A, double %B) { 161*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x i32> 162*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <2 x i32> 163*9880d681SAndroid Build Coastguard Worker %or = or <2 x i32> %1, %2 164*9880d681SAndroid Build Coastguard Worker %3 = bitcast <2 x i32> %or to double 165*9880d681SAndroid Build Coastguard Worker ret double %3 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_or 168*9880d681SAndroid Build Coastguard Worker; SSE41: orps 169*9880d681SAndroid Build Coastguard Worker; AVX: vorps 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdefine double @test2_or(double %A, double %B) { 174*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <4 x i16> 175*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <4 x i16> 176*9880d681SAndroid Build Coastguard Worker %or = or <4 x i16> %1, %2 177*9880d681SAndroid Build Coastguard Worker %3 = bitcast <4 x i16> %or to double 178*9880d681SAndroid Build Coastguard Worker ret double %3 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_or 181*9880d681SAndroid Build Coastguard Worker; SSE41: orps 182*9880d681SAndroid Build Coastguard Worker; AVX: vorps 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerdefine double @test3_or(double %A, double %B) { 187*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <8 x i8> 188*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <8 x i8> 189*9880d681SAndroid Build Coastguard Worker %or = or <8 x i8> %1, %2 190*9880d681SAndroid Build Coastguard Worker %3 = bitcast <8 x i8> %or to double 191*9880d681SAndroid Build Coastguard Worker ret double %3 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_or 194*9880d681SAndroid Build Coastguard Worker; SSE41: orps 195*9880d681SAndroid Build Coastguard Worker; AVX: vorps 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workerdefine double @test1_xor(double %A, double %B) { 200*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x i32> 201*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <2 x i32> 202*9880d681SAndroid Build Coastguard Worker %xor = xor <2 x i32> %1, %2 203*9880d681SAndroid Build Coastguard Worker %3 = bitcast <2 x i32> %xor to double 204*9880d681SAndroid Build Coastguard Worker ret double %3 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1_xor 207*9880d681SAndroid Build Coastguard Worker; SSE41: xorps 208*9880d681SAndroid Build Coastguard Worker; AVX: vxorps 209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workerdefine double @test2_xor(double %A, double %B) { 213*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <4 x i16> 214*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <4 x i16> 215*9880d681SAndroid Build Coastguard Worker %xor = xor <4 x i16> %1, %2 216*9880d681SAndroid Build Coastguard Worker %3 = bitcast <4 x i16> %xor to double 217*9880d681SAndroid Build Coastguard Worker ret double %3 218*9880d681SAndroid Build Coastguard Worker} 219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2_xor 220*9880d681SAndroid Build Coastguard Worker; SSE41: xorps 221*9880d681SAndroid Build Coastguard Worker; AVX: vxorps 222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Workerdefine double @test3_xor(double %A, double %B) { 226*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <8 x i8> 227*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <8 x i8> 228*9880d681SAndroid Build Coastguard Worker %xor = xor <8 x i8> %1, %2 229*9880d681SAndroid Build Coastguard Worker %3 = bitcast <8 x i8> %xor to double 230*9880d681SAndroid Build Coastguard Worker ret double %3 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3_xor 233*9880d681SAndroid Build Coastguard Worker; SSE41: xorps 234*9880d681SAndroid Build Coastguard Worker; AVX: vxorps 235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Workerdefine double @test_fadd(double %A, double %B) { 239*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x float> 240*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <2 x float> 241*9880d681SAndroid Build Coastguard Worker %add = fadd <2 x float> %1, %2 242*9880d681SAndroid Build Coastguard Worker %3 = bitcast <2 x float> %add to double 243*9880d681SAndroid Build Coastguard Worker ret double %3 244*9880d681SAndroid Build Coastguard Worker} 245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fadd 246*9880d681SAndroid Build Coastguard Worker; SSE41: addps 247*9880d681SAndroid Build Coastguard Worker; AVX: vaddps 248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Workerdefine double @test_fsub(double %A, double %B) { 251*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x float> 252*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <2 x float> 253*9880d681SAndroid Build Coastguard Worker %sub = fsub <2 x float> %1, %2 254*9880d681SAndroid Build Coastguard Worker %3 = bitcast <2 x float> %sub to double 255*9880d681SAndroid Build Coastguard Worker ret double %3 256*9880d681SAndroid Build Coastguard Worker} 257*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fsub 258*9880d681SAndroid Build Coastguard Worker; SSE41: subps 259*9880d681SAndroid Build Coastguard Worker; AVX: vsubps 260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Workerdefine double @test_fmul(double %A, double %B) { 263*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x float> 264*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <2 x float> 265*9880d681SAndroid Build Coastguard Worker %mul = fmul <2 x float> %1, %2 266*9880d681SAndroid Build Coastguard Worker %3 = bitcast <2 x float> %mul to double 267*9880d681SAndroid Build Coastguard Worker ret double %3 268*9880d681SAndroid Build Coastguard Worker} 269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmul 270*9880d681SAndroid Build Coastguard Worker; SSE41: mulps 271*9880d681SAndroid Build Coastguard Worker; AVX: vmulps 272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 273*9880d681SAndroid Build Coastguard Worker 274