! RUN: %flang_fc1 -flang-experimental-hlfir -emit-llvm %s -fno-ppc-native-vector-element-order -triple ppc64le-unknown-linux -o - | FileCheck --check-prefixes="LLVMIR" %s ! REQUIRES: target=powerpc{{.*}} !------------------- ! vec_ld !------------------- ! CHECK-LABEL: @vec_ld_testi8 subroutine vec_ld_testi8(arg1, arg2, res) integer(1) :: arg1 vector(integer(1)) :: arg2, res res = vec_ld(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i8, ptr %0, align 1 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i8 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.altivec.lvx(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <4 x i32> %[[ld]] to <16 x i8> ! LLVMIR: %[[shflv:.*]] = shufflevector <16 x i8> %[[bc]], <16 x i8> undef, <16 x i32> ! LLVMIR: store <16 x i8> %[[shflv]], ptr %2, align 16 end subroutine vec_ld_testi8 ! CHECK-LABEL: @vec_ld_testi16 subroutine vec_ld_testi16(arg1, arg2, res) integer(2) :: arg1 vector(integer(2)) :: arg2, res res = vec_ld(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i16 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.altivec.lvx(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <4 x i32> %[[ld]] to <8 x i16> ! LLVMIR: %[[shflv:.*]] = shufflevector <8 x i16> %[[bc]], <8 x i16> undef, <8 x i32> ! LLVMIR: store <8 x i16> %[[shflv]], ptr %2, align 16 end subroutine vec_ld_testi16 ! CHECK-LABEL: @vec_ld_testi32 subroutine vec_ld_testi32(arg1, arg2, res) integer(4) :: arg1 vector(integer(4)) :: arg2, res res = vec_ld(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i32, ptr %0, align 4 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i32 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.altivec.lvx(ptr %[[addr]]) ! LLVMIR: %[[shflv:.*]] = shufflevector <4 x i32> %[[ld]], <4 x i32> undef, <4 x i32> ! LLVMIR: store <4 x i32> %[[shflv]], ptr %2, align 16 end subroutine vec_ld_testi32 ! CHECK-LABEL: @vec_ld_testf32 subroutine vec_ld_testf32(arg1, arg2, res) integer(8) :: arg1 vector(real(4)) :: arg2, res res = vec_ld(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[i4:.*]] = trunc i64 %[[arg1]] to i32 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i32 %[[i4]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.altivec.lvx(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <4 x i32> %[[ld]] to <4 x float> ! LLVMIR: %[[shflv:.*]] = shufflevector <4 x float> %[[bc]], <4 x float> undef, <4 x i32> ! LLVMIR: store <4 x float> %[[shflv]], ptr %2, align 16 end subroutine vec_ld_testf32 ! CHECK-LABEL: @vec_ld_testu32 subroutine vec_ld_testu32(arg1, arg2, res) integer(1) :: arg1 vector(unsigned(4)) :: arg2, res res = vec_ld(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i8, ptr %0, align 1 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i8 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.altivec.lvx(ptr %[[addr]]) ! LLVMIR: %[[shflv:.*]] = shufflevector <4 x i32> %[[ld]], <4 x i32> undef, <4 x i32> ! LLVMIR: store <4 x i32> %[[shflv]], ptr %2, align 16 end subroutine vec_ld_testu32 ! CHECK-LABEL: @vec_ld_testi32a subroutine vec_ld_testi32a(arg1, arg2, res) integer(4) :: arg1 integer(4) :: arg2(10) vector(integer(4)) :: res res = vec_ld(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i32, ptr %0, align 4 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i32 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.altivec.lvx(ptr %[[addr]]) ! LLVMIR: %[[shflv:.*]] = shufflevector <4 x i32> %[[ld]], <4 x i32> undef, <4 x i32> ! LLVMIR: store <4 x i32> %[[shflv]], ptr %2, align 16 end subroutine vec_ld_testi32a ! CHECK-LABEL: @vec_ld_testf32av subroutine vec_ld_testf32av(arg1, arg2, res) integer(8) :: arg1 vector(real(4)) :: arg2(2, 4, 8) vector(real(4)) :: res res = vec_ld(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[i4:.*]] = trunc i64 %[[arg1]] to i32 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i32 %[[i4]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.altivec.lvx(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <4 x i32> %[[ld]] to <4 x float> ! LLVMIR: %[[shflv:.*]] = shufflevector <4 x float> %[[bc]], <4 x float> undef, <4 x i32> ! LLVMIR: store <4 x float> %[[shflv]], ptr %2, align 16 end subroutine vec_ld_testf32av ! CHECK-LABEL: @vec_ld_testi32s subroutine vec_ld_testi32s(arg1, arg2, res) integer(4) :: arg1 real(4) :: arg2 vector(real(4)) :: res res = vec_ld(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i32, ptr %0, align 4 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i32 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.altivec.lvx(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <4 x i32> %[[ld]] to <4 x float> ! LLVMIR: %[[shflv:.*]] = shufflevector <4 x float> %[[bc]], <4 x float> undef, <4 x i32> ! LLVMIR: store <4 x float> %[[shflv]], ptr %2, align 16 end subroutine vec_ld_testi32s !------------------- ! vec_lde !------------------- ! CHECK-LABEL: @vec_lde_testi8s subroutine vec_lde_testi8s(arg1, arg2, res) integer(1) :: arg1 integer(1) :: arg2 vector(integer(1)) :: res res = vec_lde(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i8, ptr %0, align 1 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i8 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <16 x i8> @llvm.ppc.altivec.lvebx(ptr %[[addr]]) ! LLVMIR: %[[shflv:.*]] = shufflevector <16 x i8> %[[ld]], <16 x i8> undef, <16 x i32> ! LLVMIR: store <16 x i8> %[[shflv]], ptr %2, align 16 end subroutine vec_lde_testi8s ! CHECK-LABEL: @vec_lde_testi16a subroutine vec_lde_testi16a(arg1, arg2, res) integer(2) :: arg1 integer(2) :: arg2(2, 11, 7) vector(integer(2)) :: res res = vec_lde(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i16 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <8 x i16> @llvm.ppc.altivec.lvehx(ptr %[[addr]]) ! LLVMIR: %[[shflv:.*]] = shufflevector <8 x i16> %[[ld]], <8 x i16> undef, <8 x i32> ! LLVMIR: store <8 x i16> %[[shflv]], ptr %2, align 16 end subroutine vec_lde_testi16a ! CHECK-LABEL: @vec_lde_testi32a subroutine vec_lde_testi32a(arg1, arg2, res) integer(4) :: arg1 integer(4) :: arg2(5) vector(integer(4)) :: res res = vec_lde(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i32, ptr %0, align 4 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i32 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.altivec.lvewx(ptr %[[addr]]) ! LLVMIR: %[[shflv:.*]] = shufflevector <4 x i32> %[[ld]], <4 x i32> undef, <4 x i32> ! LLVMIR: store <4 x i32> %[[shflv]], ptr %2, align 16 end subroutine vec_lde_testi32a ! CHECK-LABEL: @vec_lde_testf32a subroutine vec_lde_testf32a(arg1, arg2, res) integer(8) :: arg1 real(4) :: arg2(11) vector(real(4)) :: res res = vec_lde(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.altivec.lvewx(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <4 x i32> %[[ld]] to <4 x float> ! LLVMIR: %[[shflv:.*]] = shufflevector <4 x float> %[[bc]], <4 x float> undef, <4 x i32> ! LLVMIR: store <4 x float> %[[shflv]], ptr %2, align 16 end subroutine vec_lde_testf32a !------------------- ! vec_lvsl !------------------- ! CHECK-LABEL: @vec_lvsl_testi8s subroutine vec_lvsl_testi8s(arg1, arg2, res) integer(1) :: arg1 integer(1) :: arg2 vector(unsigned(1)) :: res res = vec_lvsl(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i8, ptr %0, align 1 ! LLVMIR: %[[iext:.*]] = sext i8 %[[arg1]] to i64 ! LLVMIR: %[[lshft:.*]] = shl i64 %[[iext]], 56 ! LLVMIR: %[[rshft:.*]] = ashr i64 %[[lshft]], 56 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[rshft]] ! LLVMIR: %[[ld:.*]] = call <16 x i8> @llvm.ppc.altivec.lvsl(ptr %[[addr]]) ! LLVMIR: store <16 x i8> %[[ld]], ptr %2, align 16 end subroutine vec_lvsl_testi8s ! CHECK-LABEL: @vec_lvsl_testi16a subroutine vec_lvsl_testi16a(arg1, arg2, res) integer(2) :: arg1 integer(2) :: arg2(4) vector(unsigned(1)) :: res res = vec_lvsl(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[iext:.*]] = sext i16 %[[arg1]] to i64 ! LLVMIR: %[[lshft:.*]] = shl i64 %[[iext]], 56 ! LLVMIR: %[[rshft:.*]] = ashr i64 %[[lshft]], 56 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[rshft]] ! LLVMIR: %[[ld:.*]] = call <16 x i8> @llvm.ppc.altivec.lvsl(ptr %[[addr]]) ! LLVMIR: store <16 x i8> %[[ld]], ptr %2, align 16 end subroutine vec_lvsl_testi16a ! CHECK-LABEL: @vec_lvsl_testi32a subroutine vec_lvsl_testi32a(arg1, arg2, res) integer(4) :: arg1 integer(4) :: arg2(11, 3, 4) vector(unsigned(1)) :: res res = vec_lvsl(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i32, ptr %0, align 4 ! LLVMIR: %[[iext:.*]] = sext i32 %[[arg1]] to i64 ! LLVMIR: %[[lshft:.*]] = shl i64 %[[iext]], 56 ! LLVMIR: %[[rshft:.*]] = ashr i64 %[[lshft]], 56 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[rshft]] ! LLVMIR: %[[ld:.*]] = call <16 x i8> @llvm.ppc.altivec.lvsl(ptr %[[addr]]) ! LLVMIR: store <16 x i8> %[[ld]], ptr %2, align 16 end subroutine vec_lvsl_testi32a ! CHECK-LABEL: @vec_lvsl_testf32a subroutine vec_lvsl_testf32a(arg1, arg2, res) integer(8) :: arg1 real(4) :: arg2(51) vector(unsigned(1)) :: res res = vec_lvsl(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[lshft:.*]] = shl i64 %[[arg1]], 56 ! LLVMIR: %[[rshft:.*]] = ashr i64 %[[lshft]], 56 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[rshft]] ! LLVMIR: %[[ld:.*]] = call <16 x i8> @llvm.ppc.altivec.lvsl(ptr %[[addr]]) ! LLVMIR: store <16 x i8> %[[ld]], ptr %2, align 16 end subroutine vec_lvsl_testf32a !------------------- ! vec_lvsr !------------------- ! CHECK-LABEL: @vec_lvsr_testi8s subroutine vec_lvsr_testi8s(arg1, arg2, res) integer(1) :: arg1 integer(1) :: arg2 vector(unsigned(1)) :: res res = vec_lvsr(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i8, ptr %0, align 1 ! LLVMIR: %[[iext:.*]] = sext i8 %[[arg1]] to i64 ! LLVMIR: %[[lshft:.*]] = shl i64 %[[iext]], 56 ! LLVMIR: %[[rshft:.*]] = ashr i64 %[[lshft]], 56 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[rshft]] ! LLVMIR: %[[ld:.*]] = call <16 x i8> @llvm.ppc.altivec.lvsr(ptr %[[addr]]) ! LLVMIR: store <16 x i8> %[[ld]], ptr %2, align 16 end subroutine vec_lvsr_testi8s ! CHECK-LABEL: @vec_lvsr_testi16a subroutine vec_lvsr_testi16a(arg1, arg2, res) integer(2) :: arg1 integer(2) :: arg2(41) vector(unsigned(1)) :: res res = vec_lvsr(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[iext:.*]] = sext i16 %[[arg1]] to i64 ! LLVMIR: %[[lshft:.*]] = shl i64 %[[iext]], 56 ! LLVMIR: %[[rshft:.*]] = ashr i64 %[[lshft]], 56 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[rshft]] ! LLVMIR: %[[ld:.*]] = call <16 x i8> @llvm.ppc.altivec.lvsr(ptr %[[addr]]) ! LLVMIR: store <16 x i8> %[[ld]], ptr %2, align 16 end subroutine vec_lvsr_testi16a ! CHECK-LABEL: @vec_lvsr_testi32a subroutine vec_lvsr_testi32a(arg1, arg2, res) integer(4) :: arg1 integer(4) :: arg2(23, 31, 47) vector(unsigned(1)) :: res res = vec_lvsr(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i32, ptr %0, align 4 ! LLVMIR: %[[iext:.*]] = sext i32 %[[arg1]] to i64 ! LLVMIR: %[[lshft:.*]] = shl i64 %[[iext]], 56 ! LLVMIR: %[[rshft:.*]] = ashr i64 %[[lshft]], 56 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[rshft]] ! LLVMIR: %[[ld:.*]] = call <16 x i8> @llvm.ppc.altivec.lvsr(ptr %[[addr]]) ! LLVMIR: store <16 x i8> %[[ld]], ptr %2, align 16 end subroutine vec_lvsr_testi32a ! CHECK-LABEL: @vec_lvsr_testf32a subroutine vec_lvsr_testf32a(arg1, arg2, res) integer(8) :: arg1 real(4) :: arg2 vector(unsigned(1)) :: res res = vec_lvsr(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[lshft:.*]] = shl i64 %[[arg1]], 56 ! LLVMIR: %[[rshft:.*]] = ashr i64 %[[lshft]], 56 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[rshft]] ! LLVMIR: %[[ld:.*]] = call <16 x i8> @llvm.ppc.altivec.lvsr(ptr %[[addr]]) ! LLVMIR: store <16 x i8> %[[ld]], ptr %2, align 16 end subroutine vec_lvsr_testf32a !------------------- ! vec_lxv !------------------- ! CHECK-LABEL: @vec_lxv_testi8a subroutine vec_lxv_testi8a(arg1, arg2, res) integer(1) :: arg1 integer(1) :: arg2(4) vector(integer(1)) :: res res = vec_lxv(arg1, arg2) ! LLVMIR: %[[offset:.*]] = load i8, ptr %0, align 1 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i8 %[[offset]] ! LLVMIR: %[[res:.*]] = load <16 x i8>, ptr %[[addr]], align 1 ! LLVMIR: store <16 x i8> %[[res]], ptr %2, align 16 end subroutine vec_lxv_testi8a ! CHECK-LABEL: @vec_lxv_testi16a subroutine vec_lxv_testi16a(arg1, arg2, res) integer(2) :: arg1 integer(2) :: arg2(2, 4, 8) vector(integer(2)) :: res res = vec_lxv(arg1, arg2) ! LLVMIR: %[[offset:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i16 %[[offset]] ! LLVMIR: %[[res:.*]] = load <8 x i16>, ptr %[[addr]], align 1 ! LLVMIR: store <8 x i16> %[[res]], ptr %2, align 16 end subroutine vec_lxv_testi16a ! CHECK-LABEL: @vec_lxv_testi32a subroutine vec_lxv_testi32a(arg1, arg2, res) integer(4) :: arg1 integer(4) :: arg2(2, 4, 8) vector(integer(4)) :: res res = vec_lxv(arg1, arg2) ! LLVMIR: %[[offset:.*]] = load i32, ptr %0, align 4 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i32 %[[offset]] ! LLVMIR: %[[res:.*]] = load <4 x i32>, ptr %[[addr]], align 1 ! LLVMIR: store <4 x i32> %[[res]], ptr %2, align 16 end subroutine vec_lxv_testi32a ! CHECK-LABEL: @vec_lxv_testf32a subroutine vec_lxv_testf32a(arg1, arg2, res) integer(2) :: arg1 real(4) :: arg2(4) vector(real(4)) :: res res = vec_lxv(arg1, arg2) ! LLVMIR: %[[offset:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i16 %[[offset]] ! LLVMIR: %[[res:.*]] = load <4 x float>, ptr %[[addr]], align 1 ! LLVMIR: store <4 x float> %[[res]], ptr %2, align 16 end subroutine vec_lxv_testf32a ! CHECK-LABEL: @vec_lxv_testf64a subroutine vec_lxv_testf64a(arg1, arg2, res) integer(8) :: arg1 real(8) :: arg2(4) vector(real(8)) :: res res = vec_lxv(arg1, arg2) ! LLVMIR: %[[offset:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[offset]] ! LLVMIR: %[[res:.*]] = load <2 x double>, ptr %[[addr]], align 1 ! LLVMIR: store <2 x double> %[[res]], ptr %2, align 16 end subroutine vec_lxv_testf64a !------------------- ! vec_xl !------------------- ! CHECK-LABEL: @vec_xl_testi8a subroutine vec_xl_testi8a(arg1, arg2, res) integer(1) :: arg1 integer(1) :: arg2 vector(integer(1)) :: res res = vec_xl(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i8, ptr %0, align 1 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i8 %[[arg1]] ! LLVMIR: %[[ld:.*]] = load <16 x i8>, ptr %[[addr]], align 1 ! LLVMIR: %[[shflv:.*]] = shufflevector <16 x i8> %[[ld]], <16 x i8> undef, <16 x i32> ! LLVMIR: store <16 x i8> %[[shflv]], ptr %2, align 16 end subroutine vec_xl_testi8a ! CHECK-LABEL: @vec_xl_testi16a subroutine vec_xl_testi16a(arg1, arg2, res) integer(2) :: arg1 integer(2) :: arg2(2, 8) vector(integer(2)) :: res res = vec_xl(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i16 %[[arg1]] ! LLVMIR: %[[ld:.*]] = load <8 x i16>, ptr %[[addr]], align 1 ! LLVMIR: %[[shflv:.*]] = shufflevector <8 x i16> %[[ld]], <8 x i16> undef, <8 x i32> ! LLVMIR: store <8 x i16> %[[shflv]], ptr %2, align 16 end subroutine vec_xl_testi16a ! CHECK-LABEL: @vec_xl_testi32a subroutine vec_xl_testi32a(arg1, arg2, res) integer(4) :: arg1 integer(4) :: arg2(2, 4, 8) vector(integer(4)) :: res res = vec_xl(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i32, ptr %0, align 4 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i32 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.vsx.lxvw4x.be(ptr %[[addr]]) ! LLVMIR: store <4 x i32> %[[ld]], ptr %2, align 16 end subroutine vec_xl_testi32a ! CHECK-LABEL: @vec_xl_testi64a subroutine vec_xl_testi64a(arg1, arg2, res) integer(8) :: arg1 integer(8) :: arg2(2, 4, 1) vector(integer(8)) :: res res = vec_xl(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call contract <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <2 x double> %[[ld]] to <2 x i64> ! LLVMIR: store <2 x i64> %[[bc]], ptr %2, align 16 end subroutine vec_xl_testi64a ! CHECK-LABEL: @vec_xl_testf32a subroutine vec_xl_testf32a(arg1, arg2, res) integer(2) :: arg1 real(4) :: arg2(4) vector(real(4)) :: res res = vec_xl(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i16 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.vsx.lxvw4x.be(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <4 x i32> %[[ld]] to <4 x float> ! LLVMIR: store <4 x float> %[[bc]], ptr %2, align 16 end subroutine vec_xl_testf32a ! CHECK-LABEL: @vec_xl_testf64a subroutine vec_xl_testf64a(arg1, arg2, res) integer(8) :: arg1 real(8) :: arg2(2) vector(real(8)) :: res res = vec_xl(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call contract <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %[[addr]]) ! LLVMIR: store <2 x double> %[[ld]], ptr %2, align 16 end subroutine vec_xl_testf64a !------------------- ! vec_xl_be !------------------- ! CHECK-LABEL: @vec_xl_be_testi8a subroutine vec_xl_be_testi8a(arg1, arg2, res) integer(1) :: arg1 integer(1) :: arg2(2, 4, 8) vector(integer(1)) :: res res = vec_xl_be(arg1, arg2) ! LLVMIR: %4 = load i8, ptr %0, align 1 ! LLVMIR: %5 = getelementptr i8, ptr %1, i8 %4 ! LLVMIR: %6 = load <16 x i8>, ptr %5, align 1 ! LLVMIR: %7 = shufflevector <16 x i8> %6, <16 x i8> undef, <16 x i32> ! LLVMIR: store <16 x i8> %7, ptr %2, align 16 end subroutine vec_xl_be_testi8a ! CHECK-LABEL: @vec_xl_be_testi16a subroutine vec_xl_be_testi16a(arg1, arg2, res) integer(2) :: arg1 integer(2) :: arg2(8,2) vector(integer(2)) :: res res = vec_xl_be(arg1, arg2) ! LLVMIR: %4 = load i16, ptr %0, align 2 ! LLVMIR: %5 = getelementptr i8, ptr %1, i16 %4 ! LLVMIR: %6 = load <8 x i16>, ptr %5, align 1 ! LLVMIR: %7 = shufflevector <8 x i16> %6, <8 x i16> undef, <8 x i32> ! LLVMIR: store <8 x i16> %7, ptr %2, align 16 end subroutine vec_xl_be_testi16a ! CHECK-LABEL: @vec_xl_be_testi32a subroutine vec_xl_be_testi32a(arg1, arg2, res) integer(4) :: arg1 integer(4) :: arg2(2, 4) vector(integer(4)) :: res res = vec_xl_be(arg1, arg2) ! LLVMIR: %4 = load i32, ptr %0, align 4 ! LLVMIR: %5 = getelementptr i8, ptr %1, i32 %4 ! LLVMIR: %6 = load <4 x i32>, ptr %5, align 1 ! LLVMIR: %7 = shufflevector <4 x i32> %6, <4 x i32> undef, <4 x i32> ! LLVMIR: store <4 x i32> %7, ptr %2, align 16 end subroutine vec_xl_be_testi32a ! CHECK-LABEL: @vec_xl_be_testi64a subroutine vec_xl_be_testi64a(arg1, arg2, res) integer(8) :: arg1 integer(8) :: arg2(2, 4, 8) vector(integer(8)) :: res res = vec_xl_be(arg1, arg2) ! LLVMIR: %4 = load i64, ptr %0, align 8 ! LLVMIR: %5 = getelementptr i8, ptr %1, i64 %4 ! LLVMIR: %6 = load <2 x i64>, ptr %5, align 1 ! LLVMIR: %7 = shufflevector <2 x i64> %6, <2 x i64> undef, <2 x i32> ! LLVMIR: store <2 x i64> %7, ptr %2, align 16 end subroutine vec_xl_be_testi64a ! CHECK-LABEL: @vec_xl_be_testf32a subroutine vec_xl_be_testf32a(arg1, arg2, res) integer(2) :: arg1 real(4) :: arg2(4) vector(real(4)) :: res res = vec_xl_be(arg1, arg2) ! LLVMIR: %4 = load i16, ptr %0, align 2 ! LLVMIR: %5 = getelementptr i8, ptr %1, i16 %4 ! LLVMIR: %6 = load <4 x float>, ptr %5, align 1 ! LLVMIR: %7 = shufflevector <4 x float> %6, <4 x float> undef, <4 x i32> ! LLVMIR: store <4 x float> %7, ptr %2, align 16 end subroutine vec_xl_be_testf32a ! CHECK-LABEL: @vec_xl_be_testf64a subroutine vec_xl_be_testf64a(arg1, arg2, res) integer(8) :: arg1 real(8) :: arg2(4) vector(real(8)) :: res res = vec_xl_be(arg1, arg2) ! LLVMIR: %4 = load i64, ptr %0, align 8 ! LLVMIR: %5 = getelementptr i8, ptr %1, i64 %4 ! LLVMIR: %6 = load <2 x double>, ptr %5, align 1 ! LLVMIR: %7 = shufflevector <2 x double> %6, <2 x double> undef, <2 x i32> ! LLVMIR: store <2 x double> %7, ptr %2, align 16 end subroutine vec_xl_be_testf64a !------------------- ! vec_xld2 !------------------- ! CHECK-LABEL: @vec_xld2_testi8a subroutine vec_xld2_testi8a(arg1, arg2, res) integer(1) :: arg1 vector(integer(1)) :: arg2(4) vector(integer(1)) :: res res = vec_xld2(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i8, ptr %0, align 1 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i8 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call contract <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <2 x double> %[[ld]] to <16 x i8> ! LLVMIR: store <16 x i8> %[[bc]], ptr %2, align 16 end subroutine vec_xld2_testi8a ! CHECK-LABEL: @vec_xld2_testi16a subroutine vec_xld2_testi16a(arg1, arg2, res) integer(2) :: arg1 vector(integer(2)) :: arg2(4) vector(integer(2)) :: res res = vec_xld2(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i16 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call contract <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <2 x double> %[[ld]] to <8 x i16> ! LLVMIR: store <8 x i16> %[[bc]], ptr %2, align 16 end subroutine vec_xld2_testi16a ! CHECK-LABEL: @vec_xld2_testi32a subroutine vec_xld2_testi32a(arg1, arg2, res) integer(4) :: arg1 vector(integer(4)) :: arg2(11) vector(integer(4)) :: res res = vec_xld2(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i32, ptr %0, align 4 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i32 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call contract <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <2 x double> %[[ld]] to <4 x i32> ! LLVMIR: store <4 x i32> %[[bc]], ptr %2, align 16 end subroutine vec_xld2_testi32a ! CHECK-LABEL: @vec_xld2_testi64a subroutine vec_xld2_testi64a(arg1, arg2, res) integer(8) :: arg1 vector(integer(8)) :: arg2(31,7) vector(integer(8)) :: res res = vec_xld2(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call contract <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <2 x double> %[[ld]] to <2 x i64> ! LLVMIR: store <2 x i64> %[[bc]], ptr %2, align 16 end subroutine vec_xld2_testi64a ! CHECK-LABEL: @vec_xld2_testf32a subroutine vec_xld2_testf32a(arg1, arg2, res) integer(2) :: arg1 vector(real(4)) :: arg2(5) vector(real(4)) :: res res = vec_xld2(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i16 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call contract <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <2 x double> %[[ld]] to <4 x float> ! LLVMIR: store <4 x float> %[[bc]], ptr %2, align 16 end subroutine vec_xld2_testf32a ! CHECK-LABEL: @vec_xld2_testf64a subroutine vec_xld2_testf64a(arg1, arg2, res) integer(8) :: arg1 vector(real(8)) :: arg2(4) vector(real(8)) :: res res = vec_xld2(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call contract <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %[[addr]]) ! LLVMIR: store <2 x double> %[[ld]], ptr %2, align 16 end subroutine vec_xld2_testf64a !------------------- ! vec_xlw4 !------------------- ! CHECK-LABEL: @vec_xlw4_testi8a subroutine vec_xlw4_testi8a(arg1, arg2, res) integer(1) :: arg1 vector(integer(1)) :: arg2(2, 11, 37) vector(integer(1)) :: res res = vec_xlw4(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i8, ptr %0, align 1 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i8 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.vsx.lxvw4x.be(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <4 x i32> %[[ld]] to <16 x i8> ! LLVMIR: store <16 x i8> %[[bc]], ptr %2, align 16 end subroutine vec_xlw4_testi8a ! CHECK-LABEL: @vec_xlw4_testi16a subroutine vec_xlw4_testi16a(arg1, arg2, res) integer(2) :: arg1 vector(integer(2)) :: arg2(2, 8) vector(integer(2)) :: res res = vec_xlw4(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i16 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.vsx.lxvw4x.be(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <4 x i32> %[[ld]] to <8 x i16> ! LLVMIR: store <8 x i16> %[[bc]], ptr %2, align 16 end subroutine vec_xlw4_testi16a ! CHECK-LABEL: @vec_xlw4_testu32a subroutine vec_xlw4_testu32a(arg1, arg2, res) integer(4) :: arg1 vector(unsigned(4)) :: arg2(8, 4) vector(unsigned(4)) :: res res = vec_xlw4(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i32, ptr %0, align 4 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i32 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.vsx.lxvw4x.be(ptr %[[addr]]) ! LLVMIR: store <4 x i32> %[[ld]], ptr %2, align 16 end subroutine vec_xlw4_testu32a ! CHECK-LABEL: @vec_xlw4_testf32a subroutine vec_xlw4_testf32a(arg1, arg2, res) integer(2) :: arg1 vector(real(4)) :: arg2 vector(real(4)) :: res res = vec_xlw4(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i16, ptr %0, align 2 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i16 %[[arg1]] ! LLVMIR: %[[ld:.*]] = call <4 x i32> @llvm.ppc.vsx.lxvw4x.be(ptr %[[addr]]) ! LLVMIR: %[[bc:.*]] = bitcast <4 x i32> %[[ld]] to <4 x float> ! LLVMIR: store <4 x float> %[[bc]], ptr %2, align 16 end subroutine vec_xlw4_testf32a !------------------- ! vec_xlds !------------------- ! CHECK-LABEL: @vec_xlds_testi64a subroutine vec_xlds_testi64a(arg1, arg2, res) integer(8) :: arg1 vector(integer(8)) :: arg2(4) vector(integer(8)) :: res res = vec_xlds(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[arg1]] ! LLVMIR: %[[ld:.*]] = load i64, ptr %[[addr]], align 8 ! LLVMIR: %[[insrt:.*]] = insertelement <2 x i64> undef, i64 %[[ld]], i32 0 ! LLVMIR: %[[shflv:.*]] = shufflevector <2 x i64> %[[insrt]], <2 x i64> undef, <2 x i32> zeroinitializer ! LLVMIR: store <2 x i64> %[[shflv]], ptr %2, align 16 end subroutine vec_xlds_testi64a ! CHECK-LABEL: @vec_xlds_testf64a subroutine vec_xlds_testf64a(arg1, arg2, res) integer(8) :: arg1 vector(real(8)) :: arg2(4) vector(real(8)) :: res res = vec_xlds(arg1, arg2) ! LLVMIR: %[[arg1:.*]] = load i64, ptr %0, align 8 ! LLVMIR: %[[addr:.*]] = getelementptr i8, ptr %1, i64 %[[arg1]] ! LLVMIR: %[[ld:.*]] = load i64, ptr %[[addr]], align 8 ! LLVMIR: %[[insrt:.*]] = insertelement <2 x i64> undef, i64 %[[ld]], i32 0 ! LLVMIR: %[[shflv:.*]] = shufflevector <2 x i64> %[[insrt]], <2 x i64> undef, <2 x i32> zeroinitializer ! LLVMIR: %[[bc:.*]] = bitcast <2 x i64> %[[shflv]] to <2 x double> ! LLVMIR: store <2 x double> %[[bc]], ptr %2, align 16 end subroutine vec_xlds_testf64a