; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | \ ; RUN: FileCheck %s -check-prefix=CHECK-LE ; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | \ ; RUN: FileCheck %s -check-prefix=CHECK-BE ; Check for a vector merge instruction using two inputs ; The shufflevector specifies the even elements, using big endian element ; ordering. If run on a big endian machine, this should produce the vmrgew ; instruction. If run on a little endian machine, this should produce the ; vmrgow instruction. Note also that on little endian the input registers ; are swapped also. define void @check_merge_even_xy(<16 x i8>* %A, <16 x i8>* %B) { entry: ; CHECK-LE-LABEL: @check_merge_even_xy ; CHECK-BE-LABEL: @check_merge_even_xy %tmp = load <16 x i8>, <16 x i8>* %A %tmp2 = load <16 x i8>, <16 x i8>* %B %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, <16 x i32> ; CHECK-LE: vmrgow 2, 3, 2 ; CHECK-BE: vmrgew 2, 2, 3 store <16 x i8> %tmp3, <16 x i8>* %A ret void ; CHECK-LE: blr ; CHECK-BE: blr } ; Check for a vector merge instruction using a single input. ; The shufflevector specifies the even elements, using big endian element ; ordering. If run on a big endian machine, this should produce the vmrgew ; instruction. If run on a little endian machine, this should produce the ; vmrgow instruction. define void @check_merge_even_xx(<16 x i8>* %A) { entry: ; CHECK-LE-LABEL: @check_merge_even_xx ; CHECK-BE-LABEL: @check_merge_even_xx %tmp = load <16 x i8>, <16 x i8>* %A %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, <16 x i32> ; CHECK-LE: vmrgow 2, 2, 2 ; CHECK-BE: vmrgew 2, 2, 2 store <16 x i8> %tmp2, <16 x i8>* %A ret void ; CHECK-LE: blr ; CHECK-BE: blr } ; Check for a vector merge instruction using two inputs. ; The shufflevector specifies the odd elements, using big endian element ; ordering. If run on a big endian machine, this should produce the vmrgow ; instruction. If run on a little endian machine, this should produce the ; vmrgew instruction. Note also that on little endian the input registers ; are swapped also. define void @check_merge_odd_xy(<16 x i8>* %A, <16 x i8>* %B) { entry: ; CHECK-LE-LABEL: @check_merge_odd_xy ; CHECK-BE-LABEL: @check_merge_odd_xy %tmp = load <16 x i8>, <16 x i8>* %A %tmp2 = load <16 x i8>, <16 x i8>* %B %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, <16 x i32> ; CHECK-LE: vmrgew 2, 3, 2 ; CHECK-BE: vmrgow 2, 2, 3 store <16 x i8> %tmp3, <16 x i8>* %A ret void ; CHECK-LE: blr ; CHECK-BE: blr } ; Check for a vector merge instruction using a single input. ; The shufflevector specifies the odd elements, using big endian element ; ordering. If run on a big endian machine, this should produce the vmrgow ; instruction. If run on a little endian machine, this should produce the ; vmrgew instruction. define void @check_merge_odd_xx(<16 x i8>* %A) { entry: ; CHECK-LE-LABEL: @check_merge_odd_xx ; CHECK-BE-LABEL: @check_merge_odd_xx %tmp = load <16 x i8>, <16 x i8>* %A %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, <16 x i32> ; CHECK-LE: vmrgew 2, 2, 2 ; CHECK-BE: vmrgow 2, 2, 2 store <16 x i8> %tmp2, <16 x i8>* %A ret void ; CHECK-LE: blr ; CHECK-BE: blr }