1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu -O3 < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; These tests verify that VSX swap optimization works for various 4*9880d681SAndroid Build Coastguard Worker; manipulations of <2 x double> vectors. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker@x = global <2 x double> <double 9.970000e+01, double -1.032220e+02>, align 16 7*9880d681SAndroid Build Coastguard Worker@z = global <2 x double> <double 2.332000e+01, double 3.111111e+01>, align 16 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine void @bar0(double %y) { 10*9880d681SAndroid Build Coastguard Workerentry: 11*9880d681SAndroid Build Coastguard Worker %0 = load <2 x double>, <2 x double>* @x, align 16 12*9880d681SAndroid Build Coastguard Worker %vecins = insertelement <2 x double> %0, double %y, i32 0 13*9880d681SAndroid Build Coastguard Worker store <2 x double> %vecins, <2 x double>* @z, align 16 14*9880d681SAndroid Build Coastguard Worker ret void 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar0 18*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lxvd2x [[REG1:[0-9]+]] 19*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xxspltd [[REG2:[0-9]+]] 20*9880d681SAndroid Build Coastguard Worker; CHECK: xxpermdi [[REG3:[0-9]+]], [[REG2]], [[REG1]], 1 21*9880d681SAndroid Build Coastguard Worker; CHECK: stxvd2x [[REG3]] 22*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xxswapd 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine void @bar1(double %y) { 25*9880d681SAndroid Build Coastguard Workerentry: 26*9880d681SAndroid Build Coastguard Worker %0 = load <2 x double>, <2 x double>* @x, align 16 27*9880d681SAndroid Build Coastguard Worker %vecins = insertelement <2 x double> %0, double %y, i32 1 28*9880d681SAndroid Build Coastguard Worker store <2 x double> %vecins, <2 x double>* @z, align 16 29*9880d681SAndroid Build Coastguard Worker ret void 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar1 33*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lxvd2x [[REG1:[0-9]+]] 34*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xxspltd [[REG2:[0-9]+]] 35*9880d681SAndroid Build Coastguard Worker; CHECK: xxmrghd [[REG3:[0-9]+]], [[REG1]], [[REG2]] 36*9880d681SAndroid Build Coastguard Worker; CHECK: stxvd2x [[REG3]] 37*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xxswapd 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine void @baz0() { 40*9880d681SAndroid Build Coastguard Workerentry: 41*9880d681SAndroid Build Coastguard Worker %0 = load <2 x double>, <2 x double>* @z, align 16 42*9880d681SAndroid Build Coastguard Worker %1 = load <2 x double>, <2 x double>* @x, align 16 43*9880d681SAndroid Build Coastguard Worker %vecins = shufflevector <2 x double> %0, <2 x double> %1, <2 x i32> <i32 0, i32 2> 44*9880d681SAndroid Build Coastguard Worker store <2 x double> %vecins, <2 x double>* @z, align 16 45*9880d681SAndroid Build Coastguard Worker ret void 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @baz0 49*9880d681SAndroid Build Coastguard Worker; CHECK: lxvd2x 50*9880d681SAndroid Build Coastguard Worker; CHECK: lxvd2x 51*9880d681SAndroid Build Coastguard Worker; CHECK: xxmrghd 52*9880d681SAndroid Build Coastguard Worker; CHECK: stxvd2x 53*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xxswapd 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine void @baz1() { 56*9880d681SAndroid Build Coastguard Workerentry: 57*9880d681SAndroid Build Coastguard Worker %0 = load <2 x double>, <2 x double>* @z, align 16 58*9880d681SAndroid Build Coastguard Worker %1 = load <2 x double>, <2 x double>* @x, align 16 59*9880d681SAndroid Build Coastguard Worker %vecins = shufflevector <2 x double> %0, <2 x double> %1, <2 x i32> <i32 3, i32 1> 60*9880d681SAndroid Build Coastguard Worker store <2 x double> %vecins, <2 x double>* @z, align 16 61*9880d681SAndroid Build Coastguard Worker ret void 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @baz1 65*9880d681SAndroid Build Coastguard Worker; CHECK: lxvd2x 66*9880d681SAndroid Build Coastguard Worker; CHECK: lxvd2x 67*9880d681SAndroid Build Coastguard Worker; CHECK: xxmrgld 68*9880d681SAndroid Build Coastguard Worker; CHECK: stxvd2x 69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xxswapd 70*9880d681SAndroid Build Coastguard Worker 71