1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=core2 -mattr=+sse2 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=core2 -mattr=+sse2 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=CHECK-WIDE 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine double @test1(double %A) { 6*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x i32> 7*9880d681SAndroid Build Coastguard Worker %add = add <2 x i32> %1, <i32 3, i32 5> 8*9880d681SAndroid Build Coastguard Worker %2 = bitcast <2 x i32> %add to double 9*9880d681SAndroid Build Coastguard Worker ret double %2 10*9880d681SAndroid Build Coastguard Worker} 11*9880d681SAndroid Build Coastguard Worker; FIXME: Ideally we should be able to fold the entire body of @test1 into a 12*9880d681SAndroid Build Coastguard Worker; single paddd instruction. At the moment we produce the sequence 13*9880d681SAndroid Build Coastguard Worker; pshufd+paddq+pshufd. This is fixed with the widening legalization. 14*9880d681SAndroid Build Coastguard Worker; 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1 16*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd 17*9880d681SAndroid Build Coastguard Worker; CHECK: pshufd 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddd 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 21*9880d681SAndroid Build Coastguard Worker; 22*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test1 23*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: movsd 24*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddd 25*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdefine double @test2(double %A, double %B) { 29*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x i32> 30*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <2 x i32> 31*9880d681SAndroid Build Coastguard Worker %add = add <2 x i32> %1, %2 32*9880d681SAndroid Build Coastguard Worker %3 = bitcast <2 x i32> %add to double 33*9880d681SAndroid Build Coastguard Worker ret double %3 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2 36*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd 37*9880d681SAndroid Build Coastguard Worker; CHECK: paddd 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 39*9880d681SAndroid Build Coastguard Worker; 40*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test2 41*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: movsd 42*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddd 43*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine i64 @test3(i64 %A) { 47*9880d681SAndroid Build Coastguard Worker %1 = bitcast i64 %A to <2 x float> 48*9880d681SAndroid Build Coastguard Worker %add = fadd <2 x float> %1, <float 3.0, float 5.0> 49*9880d681SAndroid Build Coastguard Worker %2 = bitcast <2 x float> %add to i64 50*9880d681SAndroid Build Coastguard Worker ret i64 %2 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3 53*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pshufd 54*9880d681SAndroid Build Coastguard Worker; CHECK: addps 55*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pshufd 56*9880d681SAndroid Build Coastguard Worker; CHECK: ret 57*9880d681SAndroid Build Coastguard Worker; 58*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test3 59*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: pshufd 60*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: addps 61*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: pshufd 62*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: ret 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i64 @test4(i64 %A) { 66*9880d681SAndroid Build Coastguard Worker %1 = bitcast i64 %A to <2 x i32> 67*9880d681SAndroid Build Coastguard Worker %add = add <2 x i32> %1, <i32 3, i32 5> 68*9880d681SAndroid Build Coastguard Worker %2 = bitcast <2 x i32> %add to i64 69*9880d681SAndroid Build Coastguard Worker ret i64 %2 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker; FIXME: At the moment we still produce the sequence pshufd+paddd+pshufd. 72*9880d681SAndroid Build Coastguard Worker; Ideally, we should fold that sequence into a single paddd. This is fixed with 73*9880d681SAndroid Build Coastguard Worker; the widening legalization. 74*9880d681SAndroid Build Coastguard Worker; 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4 76*9880d681SAndroid Build Coastguard Worker; CHECK: pshufd 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddd 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd 79*9880d681SAndroid Build Coastguard Worker; CHECK: ret 80*9880d681SAndroid Build Coastguard Worker; 81*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test4 82*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: movd %{{rdi|rcx}}, 83*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: paddd 84*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: movd {{.*}}, %rax 85*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: ret 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerdefine double @test5(double %A) { 89*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <2 x float> 90*9880d681SAndroid Build Coastguard Worker %add = fadd <2 x float> %1, <float 3.0, float 5.0> 91*9880d681SAndroid Build Coastguard Worker %2 = bitcast <2 x float> %add to double 92*9880d681SAndroid Build Coastguard Worker ret double %2 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5 95*9880d681SAndroid Build Coastguard Worker; CHECK: addps 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 97*9880d681SAndroid Build Coastguard Worker; 98*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test5 99*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: addps 100*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine double @test6(double %A) { 104*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <4 x i16> 105*9880d681SAndroid Build Coastguard Worker %add = add <4 x i16> %1, <i16 3, i16 4, i16 5, i16 6> 106*9880d681SAndroid Build Coastguard Worker %2 = bitcast <4 x i16> %add to double 107*9880d681SAndroid Build Coastguard Worker ret double %2 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker; FIXME: Ideally we should be able to fold the entire body of @test6 into a 110*9880d681SAndroid Build Coastguard Worker; single paddw instruction. This is fixed with the widening legalization. 111*9880d681SAndroid Build Coastguard Worker; 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6 113*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd 114*9880d681SAndroid Build Coastguard Worker; CHECK: punpcklwd 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddw 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufb 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 118*9880d681SAndroid Build Coastguard Worker; 119*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test6 120*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: mov 121*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: punpcklwd 122*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddw 123*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine double @test7(double %A, double %B) { 127*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <4 x i16> 128*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <4 x i16> 129*9880d681SAndroid Build Coastguard Worker %add = add <4 x i16> %1, %2 130*9880d681SAndroid Build Coastguard Worker %3 = bitcast <4 x i16> %add to double 131*9880d681SAndroid Build Coastguard Worker ret double %3 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7 134*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd 135*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: punpcklwd 136*9880d681SAndroid Build Coastguard Worker; CHECK: paddw 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 138*9880d681SAndroid Build Coastguard Worker; 139*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test7 140*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: movsd 141*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: punpcklwd 142*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddw 143*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine double @test8(double %A) { 147*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <8 x i8> 148*9880d681SAndroid Build Coastguard Worker %add = add <8 x i8> %1, <i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10> 149*9880d681SAndroid Build Coastguard Worker %2 = bitcast <8 x i8> %add to double 150*9880d681SAndroid Build Coastguard Worker ret double %2 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker; FIXME: Ideally we should be able to fold the entire body of @test8 into a 153*9880d681SAndroid Build Coastguard Worker; single paddb instruction. At the moment we produce the sequence 154*9880d681SAndroid Build Coastguard Worker; pshufd+paddw+pshufd. This is fixed with the widening legalization. 155*9880d681SAndroid Build Coastguard Worker; 156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8 157*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd 158*9880d681SAndroid Build Coastguard Worker; CHECK: punpcklbw 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddb 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufb 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 162*9880d681SAndroid Build Coastguard Worker; 163*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test8 164*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: movsd 165*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: punpcklbw 166*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddb 167*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerdefine double @test9(double %A, double %B) { 171*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %A to <8 x i8> 172*9880d681SAndroid Build Coastguard Worker %2 = bitcast double %B to <8 x i8> 173*9880d681SAndroid Build Coastguard Worker %add = add <8 x i8> %1, %2 174*9880d681SAndroid Build Coastguard Worker %3 = bitcast <8 x i8> %add to double 175*9880d681SAndroid Build Coastguard Worker ret double %3 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9 178*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd 179*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: punpcklbw 180*9880d681SAndroid Build Coastguard Worker; CHECK: paddb 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 182*9880d681SAndroid Build Coastguard Worker; 183*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test9 184*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: movsd 185*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: punpcklbw 186*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddb 187*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret 188*9880d681SAndroid Build Coastguard Worker 189