1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | \ 2*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefix=CHECK-LE 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | \ 4*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefix=CHECK-BE 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; Check for a vector merge instruction using two inputs 7*9880d681SAndroid Build Coastguard Worker; The shufflevector specifies the even elements, using big endian element 8*9880d681SAndroid Build Coastguard Worker; ordering. If run on a big endian machine, this should produce the vmrgew 9*9880d681SAndroid Build Coastguard Worker; instruction. If run on a little endian machine, this should produce the 10*9880d681SAndroid Build Coastguard Worker; vmrgow instruction. Note also that on little endian the input registers 11*9880d681SAndroid Build Coastguard Worker; are swapped also. 12*9880d681SAndroid Build Coastguard Workerdefine void @check_merge_even_xy(<16 x i8>* %A, <16 x i8>* %B) { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker; CHECK-LE-LABEL: @check_merge_even_xy 15*9880d681SAndroid Build Coastguard Worker; CHECK-BE-LABEL: @check_merge_even_xy 16*9880d681SAndroid Build Coastguard Worker %tmp = load <16 x i8>, <16 x i8>* %A 17*9880d681SAndroid Build Coastguard Worker %tmp2 = load <16 x i8>, <16 x i8>* %B 18*9880d681SAndroid Build Coastguard Worker %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, 19*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 0, i32 1, i32 2, i32 3, 20*9880d681SAndroid Build Coastguard Worker i32 16, i32 17, i32 18, i32 19, 21*9880d681SAndroid Build Coastguard Worker i32 8, i32 9, i32 10, i32 11, 22*9880d681SAndroid Build Coastguard Worker i32 24, i32 25, i32 26, i32 27> 23*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmrgow 2, 3, 2 24*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmrgew 2, 2, 3 25*9880d681SAndroid Build Coastguard Worker store <16 x i8> %tmp3, <16 x i8>* %A 26*9880d681SAndroid Build Coastguard Worker ret void 27*9880d681SAndroid Build Coastguard Worker; CHECK-LE: blr 28*9880d681SAndroid Build Coastguard Worker; CHECK-BE: blr 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; Check for a vector merge instruction using a single input. 32*9880d681SAndroid Build Coastguard Worker; The shufflevector specifies the even elements, using big endian element 33*9880d681SAndroid Build Coastguard Worker; ordering. If run on a big endian machine, this should produce the vmrgew 34*9880d681SAndroid Build Coastguard Worker; instruction. If run on a little endian machine, this should produce the 35*9880d681SAndroid Build Coastguard Worker; vmrgow instruction. 36*9880d681SAndroid Build Coastguard Workerdefine void @check_merge_even_xx(<16 x i8>* %A) { 37*9880d681SAndroid Build Coastguard Workerentry: 38*9880d681SAndroid Build Coastguard Worker; CHECK-LE-LABEL: @check_merge_even_xx 39*9880d681SAndroid Build Coastguard Worker; CHECK-BE-LABEL: @check_merge_even_xx 40*9880d681SAndroid Build Coastguard Worker %tmp = load <16 x i8>, <16 x i8>* %A 41*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, 42*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 0, i32 1, i32 2, i32 3, 43*9880d681SAndroid Build Coastguard Worker i32 0, i32 1, i32 2, i32 3, 44*9880d681SAndroid Build Coastguard Worker i32 8, i32 9, i32 10, i32 11, 45*9880d681SAndroid Build Coastguard Worker i32 8, i32 9, i32 10, i32 11> 46*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmrgow 2, 2, 2 47*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmrgew 2, 2, 2 48*9880d681SAndroid Build Coastguard Worker store <16 x i8> %tmp2, <16 x i8>* %A 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker; CHECK-LE: blr 51*9880d681SAndroid Build Coastguard Worker; CHECK-BE: blr 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker; Check for a vector merge instruction using two inputs. 55*9880d681SAndroid Build Coastguard Worker; The shufflevector specifies the odd elements, using big endian element 56*9880d681SAndroid Build Coastguard Worker; ordering. If run on a big endian machine, this should produce the vmrgow 57*9880d681SAndroid Build Coastguard Worker; instruction. If run on a little endian machine, this should produce the 58*9880d681SAndroid Build Coastguard Worker; vmrgew instruction. Note also that on little endian the input registers 59*9880d681SAndroid Build Coastguard Worker; are swapped also. 60*9880d681SAndroid Build Coastguard Workerdefine void @check_merge_odd_xy(<16 x i8>* %A, <16 x i8>* %B) { 61*9880d681SAndroid Build Coastguard Workerentry: 62*9880d681SAndroid Build Coastguard Worker; CHECK-LE-LABEL: @check_merge_odd_xy 63*9880d681SAndroid Build Coastguard Worker; CHECK-BE-LABEL: @check_merge_odd_xy 64*9880d681SAndroid Build Coastguard Worker %tmp = load <16 x i8>, <16 x i8>* %A 65*9880d681SAndroid Build Coastguard Worker %tmp2 = load <16 x i8>, <16 x i8>* %B 66*9880d681SAndroid Build Coastguard Worker %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, 67*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 4, i32 5, i32 6, i32 7, 68*9880d681SAndroid Build Coastguard Worker i32 20, i32 21, i32 22, i32 23, 69*9880d681SAndroid Build Coastguard Worker i32 12, i32 13, i32 14, i32 15, 70*9880d681SAndroid Build Coastguard Worker i32 28, i32 29, i32 30, i32 31> 71*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmrgew 2, 3, 2 72*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmrgow 2, 2, 3 73*9880d681SAndroid Build Coastguard Worker store <16 x i8> %tmp3, <16 x i8>* %A 74*9880d681SAndroid Build Coastguard Worker ret void 75*9880d681SAndroid Build Coastguard Worker; CHECK-LE: blr 76*9880d681SAndroid Build Coastguard Worker; CHECK-BE: blr 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker; Check for a vector merge instruction using a single input. 80*9880d681SAndroid Build Coastguard Worker; The shufflevector specifies the odd elements, using big endian element 81*9880d681SAndroid Build Coastguard Worker; ordering. If run on a big endian machine, this should produce the vmrgow 82*9880d681SAndroid Build Coastguard Worker; instruction. If run on a little endian machine, this should produce the 83*9880d681SAndroid Build Coastguard Worker; vmrgew instruction. 84*9880d681SAndroid Build Coastguard Workerdefine void @check_merge_odd_xx(<16 x i8>* %A) { 85*9880d681SAndroid Build Coastguard Workerentry: 86*9880d681SAndroid Build Coastguard Worker; CHECK-LE-LABEL: @check_merge_odd_xx 87*9880d681SAndroid Build Coastguard Worker; CHECK-BE-LABEL: @check_merge_odd_xx 88*9880d681SAndroid Build Coastguard Worker %tmp = load <16 x i8>, <16 x i8>* %A 89*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, 90*9880d681SAndroid Build Coastguard Worker <16 x i32> <i32 4, i32 5, i32 6, i32 7, 91*9880d681SAndroid Build Coastguard Worker i32 4, i32 5, i32 6, i32 7, 92*9880d681SAndroid Build Coastguard Worker i32 12, i32 13, i32 14, i32 15, 93*9880d681SAndroid Build Coastguard Worker i32 12, i32 13, i32 14, i32 15> 94*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmrgew 2, 2, 2 95*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmrgow 2, 2, 2 96*9880d681SAndroid Build Coastguard Worker store <16 x i8> %tmp2, <16 x i8>* %A 97*9880d681SAndroid Build Coastguard Worker ret void 98*9880d681SAndroid Build Coastguard Worker; CHECK-LE: blr 99*9880d681SAndroid Build Coastguard Worker; CHECK-BE: blr 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102