llvm/flang/test/Lower/PowerPC/ppc-pwr10-vec-intrinsics.f90

! RUN: %flang_fc1 -flang-experimental-hlfir -triple powerpc64le-unknown-unknown -target-cpu pwr10 -emit-llvm %s -o - | FileCheck --check-prefixes="LLVMIR" %s
! REQUIRES: target=powerpc{{.*}}

!----------------------
! mma_lxvp
!----------------------

      subroutine mma_lxvp_test_i2(v1, offset, vp)
      use, intrinsic :: mma
      integer(2) :: offset
      vector(integer(2)) :: v1
      __vector_pair :: vp
      vp = mma_lxvp(offset, v1)
      end subroutine mma_lxvp_test_i2

!CHECK-LABEL: @mma_lxvp_test_i2_
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i16 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine test_cvspbf16()
      implicit none
      vector(unsigned(1)) :: v1, v2
      v1 = vec_cvspbf16(v2)
      end subroutine test_cvspbf16

!CHECK-LABEL: @test_cvspbf16_
!LLVMIR:  %1 = alloca <16 x i8>, i64 1, align 16
!LLVMIR:  %2 = alloca <16 x i8>, i64 1, align 16
!LLVMIR:  %3 = load <16 x i8>, ptr %1, align 16
!LLVMIR:  %4 = call <16 x i8> @llvm.ppc.vsx.xvcvspbf16(<16 x i8> %3)
!LLVMIR:  store <16 x i8> %4, ptr %2, align 16

      subroutine test_cvbf16spn()
      implicit none
      vector(unsigned(1)) :: v1, v2
      v1 = vec_cvbf16spn(v2)
      end subroutine test_cvbf16spn

!CHECK-LABEL: @test_cvbf16spn_
!LLVMIR:  %1 = alloca <16 x i8>, i64 1, align 16
!LLVMIR:  %2 = alloca <16 x i8>, i64 1, align 16
!LLVMIR:  %3 = load <16 x i8>, ptr %1, align 16
!LLVMIR:  %4 = call <16 x i8> @llvm.ppc.vsx.xvcvbf16spn(<16 x i8> %3)
!LLVMIR:  store <16 x i8> %4, ptr %2, align 16

!----------------------
! vec_lxvp
!----------------------

      subroutine vec_lxvp_test_i2(v1, offset, vp)
      integer(2) :: offset
      vector(integer(2)) :: v1
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_i2

!CHECK-LABEL: @vec_lxvp_test_i2_
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i16 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_i4(v1, offset, vp)
      integer(2) :: offset
      vector(integer(4)) :: v1
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_i4

!CHECK-LABEL: @vec_lxvp_test_i4_
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i16 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_u2(v1, offset, vp)
      integer(2) :: offset
      vector(unsigned(2)) :: v1
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_u2

!CHECK-LABEL: @vec_lxvp_test_u2_
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i16 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_u4(v1, offset, vp)
      integer(2) :: offset
      vector(unsigned(4)) :: v1
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_u4

!CHECK-LABEL: @vec_lxvp_test_u4_
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i16 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_r4(v1, offset, vp)
      integer(2) :: offset
      vector(real(4)) :: v1
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_r4

!CHECK-LABEL: @vec_lxvp_test_r4_
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i16 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_r8(v1, offset, vp)
      integer(2) :: offset
      vector(real(8)) :: v1
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_r8

!CHECK-LABEL: @vec_lxvp_test_r8_
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i16 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_vp(v1, offset, vp)
      integer(2) :: offset
      __vector_pair :: v1
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_vp

!CHECK-LABEL: @vec_lxvp_test_vp_
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i16 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_i2_arr(v1, offset, vp)
      integer :: offset
      vector(integer(2)) :: v1(10)
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_i2_arr

!CHECK-LABEL: @vec_lxvp_test_i2_arr_
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i32 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_i4_arr(v1, offset, vp)
      integer :: offset
      vector(integer(4)) :: v1(10)
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_i4_arr

!CHECK-LABEL: @vec_lxvp_test_i4_arr_
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i32 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_u2_arr(v1, offset, vp)
      integer :: offset
      vector(unsigned(2)) :: v1(10)
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_u2_arr

!CHECK-LABEL: @vec_lxvp_test_u2_arr_
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i32 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_u4_arr(v1, offset, vp)
      integer :: offset
      vector(unsigned(4)) :: v1(10)
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_u4_arr

!CHECK-LABEL: @vec_lxvp_test_u4_arr_
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i32 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_r4_arr(v1, offset, vp)
      integer :: offset
      vector(real(4)) :: v1(10)
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_r4_arr

!CHECK-LABEL: @vec_lxvp_test_r4_arr_
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i32 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_r8_arr(v1, offset, vp)
      integer :: offset
      vector(real(8)) :: v1(10)
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_r8_arr

!CHECK-LABEL: @vec_lxvp_test_r8_arr_
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i32 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vec_lxvp_test_vp_arr(v1, offset, vp)
      integer(8) :: offset
      __vector_pair :: v1(10)
      __vector_pair :: vp
      vp = vec_lxvp(offset, v1)
      end subroutine vec_lxvp_test_vp_arr

!CHECK-LABEL: @vec_lxvp_test_vp_arr_
!LLVMIR:  %[[offset:.*]] = load i64, ptr %1, align 8
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i64 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

!----------------------
! vsx_lxvp
!----------------------

      subroutine vsx_lxvp_test_i4(v1, offset, vp)
      integer(2) :: offset
      vector(integer(4)) :: v1
      __vector_pair :: vp
      vp = vsx_lxvp(offset, v1)
      end subroutine vsx_lxvp_test_i4

!CHECK-LABEL: @vsx_lxvp_test_i4_
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i16 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vsx_lxvp_test_r8(v1, offset, vp)
      integer(2) :: offset
      vector(real(8)) :: v1
      __vector_pair :: vp
      vp = vsx_lxvp(offset, v1)
      end subroutine vsx_lxvp_test_r8

!CHECK-LABEL: @vsx_lxvp_test_r8_
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i16 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vsx_lxvp_test_i2_arr(v1, offset, vp)
      integer :: offset
      vector(integer(2)) :: v1(10)
      __vector_pair :: vp
      vp = vsx_lxvp(offset, v1)
      end subroutine vsx_lxvp_test_i2_arr

!CHECK-LABEL: @vsx_lxvp_test_i2_arr_
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i32 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

      subroutine vsx_lxvp_test_vp_arr(v1, offset, vp)
      integer(8) :: offset
      __vector_pair :: v1(10)
      __vector_pair :: vp
      vp = vsx_lxvp(offset, v1)
      end subroutine vsx_lxvp_test_vp_arr

!CHECK-LABEL: @vsx_lxvp_test_vp_arr_
!LLVMIR:  %[[offset:.*]] = load i64, ptr %1, align 8
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %0, i64 %[[offset]]
!LLVMIR:  %[[call:.*]] = call <256 x i1> @llvm.ppc.vsx.lxvp(ptr %[[addr]])
!LLVMIR:  store <256 x i1> %[[call]], ptr %2, align 32

!----------------------
! mma_stxvp
!----------------------

      subroutine test_mma_stxvp_i1(vp, offset, v1)
      use, intrinsic :: mma
      integer(1) :: offset
      vector(integer(2)) :: v1
      __vector_pair :: vp
      call mma_stxvp(vp, offset, v1)
      end subroutine test_mma_stxvp_i1

!CHECK-LABEL: @test_mma_stxvp_i1_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i8, ptr %1, align 1
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i8 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

!----------------------
! vec_stxvp
!----------------------

      subroutine test_vec_stxvp_i1(vp, offset, v1)
      integer(1) :: offset
      vector(integer(2)) :: v1
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_i1

!CHECK-LABEL: @test_vec_stxvp_i1_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i8, ptr %1, align 1
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i8 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_i8(vp, offset, v1)
      integer(8) :: offset
      vector(integer(8)) :: v1
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_i8

!CHECK-LABEL: @test_vec_stxvp_i8_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i64, ptr %1, align 8
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i64 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vi2(vp, offset, v1)
      integer(2) :: offset
      vector(integer(2)) :: v1
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vi2

!CHECK-LABEL: @test_vec_stxvp_vi2_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i16 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vi4(vp, offset, v1)
      integer(2) :: offset
      vector(integer(4)) :: v1
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vi4

!CHECK-LABEL: @test_vec_stxvp_vi4_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i16 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vu2(vp, offset, v1)
      integer(2) :: offset
      vector(unsigned(2)) :: v1
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vu2

!CHECK-LABEL: @test_vec_stxvp_vu2_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i16 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vu4(vp, offset, v1)
      integer(2) :: offset
      vector(unsigned(4)) :: v1
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vu4

!CHECK-LABEL: @test_vec_stxvp_vu4_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i16 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vr4(vp, offset, v1)
      integer(2) :: offset
      vector(real(4)) :: v1
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vr4

!CHECK-LABEL: @test_vec_stxvp_vr4_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i16 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vr8(vp, offset, v1)
      integer(2) :: offset
      vector(real(8)) :: v1
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vr8

!CHECK-LABEL: @test_vec_stxvp_vr8_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i16 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vvp(vp, offset, v1)
      integer(2) :: offset
      __vector_pair :: v1
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vvp

!CHECK-LABEL: @test_vec_stxvp_vvp_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i16 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vi2_arr(vp, offset, v1)
      integer :: offset
      vector(integer(2)) :: v1(10)
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vi2_arr

!CHECK-LABEL: @test_vec_stxvp_vi2_arr_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i32 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vi4_arr(vp, offset, v1)
      integer :: offset
      vector(integer(4)) :: v1(10)
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vi4_arr

!CHECK-LABEL: @test_vec_stxvp_vi4_arr_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i32 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vu2_arr(vp, offset, v1)
      integer :: offset
      vector(unsigned(2)) :: v1(11)
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vu2_arr

!CHECK-LABEL: @test_vec_stxvp_vu2_arr_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i32 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vu4_arr(vp, offset, v1)
      integer(8) :: offset
      vector(unsigned(4)) :: v1(11,3)
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vu4_arr

!CHECK-LABEL: @test_vec_stxvp_vu4_arr_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i64, ptr %1, align 8
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i64 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vr4_arr(vp, offset, v1)
      integer :: offset
      vector(real(4)) :: v1(10)
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vr4_arr

!CHECK-LABEL: @test_vec_stxvp_vr4_arr_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i32 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vr8_arr(vp, offset, v1)
      integer :: offset
      vector(real(8)) :: v1(10)
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vr8_arr

!CHECK-LABEL: @test_vec_stxvp_vr8_arr_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i32 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vec_stxvp_vp_arr(vp, offset, v1)
      integer :: offset
      __vector_pair :: v1(10)
      __vector_pair :: vp
      call vec_stxvp(vp, offset, v1)
      end subroutine test_vec_stxvp_vp_arr

!CHECK-LABEL: @test_vec_stxvp_vp_arr_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i32 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

!----------------------
! vsx_stxvp
!----------------------

      subroutine test_vsx_stxvp_i1(vp, offset, v1)
      integer(1) :: offset
      vector(integer(2)) :: v1
      __vector_pair :: vp
      call vsx_stxvp(vp, offset, v1)
      end subroutine test_vsx_stxvp_i1

!CHECK-LABEL: @test_vsx_stxvp_i1_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i8, ptr %1, align 1
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i8 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vsx_stxvp_vi2(vp, offset, v1)
      integer(2) :: offset
      vector(integer(2)) :: v1
      __vector_pair :: vp
      call vsx_stxvp(vp, offset, v1)
      end subroutine test_vsx_stxvp_vi2

!CHECK-LABEL: @test_vsx_stxvp_vi2_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i16, ptr %1, align 2
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i16 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vsx_stxvp_vr8_arr(vp, offset, v1)
      integer :: offset
      vector(real(8)) :: v1(10)
      __vector_pair :: vp
      call vsx_stxvp(vp, offset, v1)
      end subroutine test_vsx_stxvp_vr8_arr

!CHECK-LABEL: @test_vsx_stxvp_vr8_arr_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i32 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])

      subroutine test_vsx_stxvp_vp_arr(vp, offset, v1)
      integer :: offset
      __vector_pair :: v1(10)
      __vector_pair :: vp
      call vsx_stxvp(vp, offset, v1)
      end subroutine test_vsx_stxvp_vp_arr

!CHECK-LABEL: @test_vsx_stxvp_vp_arr_
!LLVMIR:  %[[vp:.*]] = load <256 x i1>, ptr %0, align 32
!LLVMIR:  %[[offset:.*]] = load i32, ptr %1, align 4
!LLVMIR:  %[[addr:.*]] = getelementptr i8, ptr %2, i32 %[[offset]]
!LLVMIR:  call void @llvm.ppc.vsx.stxvp(<256 x i1> %[[vp]], ptr %[[addr]])