diff --git a/llvm/include/llvm/IR/IntrinsicsRISCV.td b/llvm/include/llvm/IR/IntrinsicsRISCV.td --- a/llvm/include/llvm/IR/IntrinsicsRISCV.td +++ b/llvm/include/llvm/IR/IntrinsicsRISCV.td @@ -389,10 +389,24 @@ : Intrinsic<[llvm_anyint_ty], [llvm_anyvector_ty, LLVMMatchType<1>, LLVMMatchType<0>], [IntrNoMem]>, RISCVVIntrinsic; - // For mask unary operations with mask type in/out without mask - // Output: (mask type output) - // Input: (mask type vector_in, vl) - class RISCVMaskUnaryMOutNoMask + // For destination vector type is NOT the same as source vector. + // Input: (vector_in, vl) + class RISCVUnaryABNoMask + : Intrinsic<[llvm_anyvector_ty], + [llvm_anyvector_ty, llvm_anyint_ty], + [IntrNoMem]>, RISCVVIntrinsic; + // For destination vector type is NOT the same as source vector (with mask). + // Input: (maskedoff, vector_in, mask, vl) + class RISCVUnaryABMask + : Intrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, llvm_anyvector_ty, + LLVMScalarOrSameVectorWidth<1, llvm_i1_ty>, + llvm_anyint_ty], + [IntrNoMem]>, RISCVVIntrinsic; + // For unary operations with the same vector type in/out without mask + // Output: (vector) + // Input: (vector_in, vl) + class RISCVUnaryNoMask : Intrinsic<[llvm_anyvector_ty], [LLVMMatchType<0>, llvm_anyint_ty], [IntrNoMem]>, RISCVVIntrinsic; @@ -490,8 +504,12 @@ def "int_riscv_" # NAME : RISCVMaskUnarySOutNoMask; def "int_riscv_" # NAME # "_mask" : RISCVMaskUnarySOutMask; } + multiclass RISCVUnaryAB { + def "int_riscv_" # NAME : RISCVUnaryABNoMask; + def "int_riscv_" # NAME # "_mask" : RISCVUnaryABMask; + } multiclass RISCVMaskUnaryMOut { - def "int_riscv_" # NAME : RISCVMaskUnaryMOutNoMask; + def "int_riscv_" # NAME : RISCVUnaryNoMask; def "int_riscv_" # NAME # "_mask" : RISCVMaskUnaryMOutMask; } @@ -517,6 +535,9 @@ defm vwsubu_w : RISCVBinaryAAX; defm vwsub_w : RISCVBinaryAAX; + defm vzext : RISCVUnaryAB; + defm vsext : RISCVUnaryAB; + defm vadc : RISCVBinaryWithV0; defm vmadc_carry_in : RISCVBinaryMaskOutWithV0; defm vmadc : RISCVBinaryMaskOut; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -40,22 +40,26 @@ //===----------------------------------------------------------------------===// // This class describes information associated to the LMUL. -class LMULInfo { +class LMULInfo { bits<3> value = lmul; // This is encoded as the vlmul field of vtype. VReg vrclass = regclass; VReg wvrclass = wregclass; + VReg f8vrclass = f8regclass; + VReg f4vrclass = f4regclass; + VReg f2vrclass = f2regclass; string MX = mx; } // Associate LMUL with tablegen records of register classes. -def V_M1 : LMULInfo<0b000, VR, VRM2, "M1">; -def V_M2 : LMULInfo<0b001, VRM2, VRM4, "M2">; -def V_M4 : LMULInfo<0b010, VRM4, VRM8, "M4">; -def V_M8 : LMULInfo<0b011, VRM8, VR, "M8">; +def V_M1 : LMULInfo<0b000, VR, VRM2, VR, VR, VR, "M1">; +def V_M2 : LMULInfo<0b001, VRM2, VRM4, VR, VR, VR, "M2">; +def V_M4 : LMULInfo<0b010, VRM4, VRM8, VRM2, VR, VR, "M4">; +def V_M8 : LMULInfo<0b011, VRM8,/*NoVReg*/VR, VRM4, VRM2, VR, "M8">; -def V_MF8 : LMULInfo<0b101, VR, VR, "MF8">; -def V_MF4 : LMULInfo<0b110, VR, VR, "MF4">; -def V_MF2 : LMULInfo<0b111, VR, VR, "MF2">; +def V_MF8 : LMULInfo<0b101, VR, VR,/*NoVReg*/VR,/*NoVReg*/VR,/*NoVReg*/VR, "MF8">; +def V_MF4 : LMULInfo<0b110, VR, VR, VR,/*NoVReg*/VR,/*NoVReg*/VR, "MF4">; +def V_MF2 : LMULInfo<0b111, VR, VR, VR, VR,/*NoVReg*/VR, "MF2">; // Used to iterate over all possible LMULs. def MxList { @@ -214,6 +218,12 @@ VTypeInfo Wti = wti; } +class VTypeInfoToFraction +{ + VTypeInfo Vti = vti; + VTypeInfo Fti = fti; +} + defset list AllWidenableIntVectors = { def : VTypeInfoToWide; def : VTypeInfoToWide; @@ -247,6 +257,43 @@ def : VTypeInfoToWide; } +defset list AllFractionableVF2IntVectors = { + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; +} + +defset list AllFractionableVF4IntVectors = { + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; +} + +defset list AllFractionableVF8IntVectors = { + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; + def : VTypeInfoToFraction; +} + // This class holds the record of the RISCVVPseudoTable below. // This represents the information we need in codegen for each pseudo. // The definition should be consistent with `struct PseudoInfo` in @@ -997,6 +1044,42 @@ } } +multiclass PseudoUnaryV_VF2 { + defvar constraints = "@earlyclobber $rd"; + foreach m = MxList.m[1-6] in + { + let VLMul = m.value in { + def "_" # m.MX : VPseudoUnaryNoMask; + def "_" # m.MX # "_MASK" : VPseudoUnaryMask; + } + } +} + +multiclass PseudoUnaryV_VF4 { + defvar constraints = "@earlyclobber $rd"; + foreach m = MxList.m[2-6] in + { + let VLMul = m.value in { + def "_" # m.MX : VPseudoUnaryNoMask; + def "_" # m.MX # "_MASK" : VPseudoUnaryMask; + } + } +} + +multiclass PseudoUnaryV_VF8 { + defvar constraints = "@earlyclobber $rd"; + foreach m = MxList.m[3-6] in + { + let VLMul = m.value in { + def "_" # m.MX : VPseudoUnaryNoMask; + def "_" # m.MX # "_MASK" : VPseudoUnaryMask; + } + } +} + // The destination EEW is 1. // The source EEW is 8, 16, 32, or 64. // When the destination EEW is different from source EEW, we need to use @@ -1477,6 +1560,22 @@ } } +multiclass VPatUnaryV_VF fractionList> +{ + foreach vtiTofti = fractionList in + { + defvar vti = vtiTofti.Vti; + defvar fti = vtiTofti.Fti; + def : VPatUnaryNoMask; + def : VPatUnaryMask; + } +} + multiclass VPatNullaryV { foreach vti = AllIntegerVectors in { @@ -2140,6 +2239,16 @@ defm PseudoVWADD : VPseudoBinaryW_WV_WX; defm PseudoVWSUB : VPseudoBinaryW_WV_WX; +//===----------------------------------------------------------------------===// +// 12.3. Vector Integer Extension +//===----------------------------------------------------------------------===// +defm PseudoVZEXT_VF2 : PseudoUnaryV_VF2; +defm PseudoVZEXT_VF4 : PseudoUnaryV_VF4; +defm PseudoVZEXT_VF8 : PseudoUnaryV_VF8; +defm PseudoVSEXT_VF2 : PseudoUnaryV_VF2; +defm PseudoVSEXT_VF4 : PseudoUnaryV_VF4; +defm PseudoVSEXT_VF8 : PseudoUnaryV_VF8; + //===----------------------------------------------------------------------===// // 12.4. Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions //===----------------------------------------------------------------------===// @@ -2648,6 +2757,22 @@ defm "" : VPatBinaryW_WV_WX<"int_riscv_vwadd_w", "PseudoVWADD", AllWidenableIntVectors>; defm "" : VPatBinaryW_WV_WX<"int_riscv_vwsub_w", "PseudoVWSUB", AllWidenableIntVectors>; +//===----------------------------------------------------------------------===// +// 12.3. Vector Integer Extension +//===----------------------------------------------------------------------===// +defm "" : VPatUnaryV_VF<"int_riscv_vzext", "PseudoVZEXT", "VF2", + AllFractionableVF2IntVectors>; +defm "" : VPatUnaryV_VF<"int_riscv_vzext", "PseudoVZEXT", "VF4", + AllFractionableVF4IntVectors>; +defm "" : VPatUnaryV_VF<"int_riscv_vzext", "PseudoVZEXT", "VF8", + AllFractionableVF8IntVectors>; +defm "" : VPatUnaryV_VF<"int_riscv_vsext", "PseudoVSEXT", "VF2", + AllFractionableVF2IntVectors>; +defm "" : VPatUnaryV_VF<"int_riscv_vsext", "PseudoVSEXT", "VF4", + AllFractionableVF4IntVectors>; +defm "" : VPatUnaryV_VF<"int_riscv_vsext", "PseudoVSEXT", "VF8", + AllFractionableVF8IntVectors>; + //===----------------------------------------------------------------------===// // 12.4. Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions //===----------------------------------------------------------------------===// diff --git a/llvm/test/CodeGen/RISCV/rvv/vsext-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vsext-rv32.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rvv/vsext-rv32.ll @@ -0,0 +1,664 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=riscv32 -mattr=+experimental-v,+f -verify-machineinstrs \ +; RUN: --riscv-no-aliases < %s | FileCheck %s +declare @llvm.riscv.vsext.nxv1i32.nxv1i8( + , + i32); + +define @intrinsic_vsext_vf4_nxv1i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,ta,mu +; CHECK-NEXT: vsext.vf4 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv1i32.nxv1i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv1i32.nxv1i8( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf4_nxv1i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv1i32.nxv1i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv2i32.nxv2i8( + , + i32); + +define @intrinsic_vsext_vf4_nxv2i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,ta,mu +; CHECK-NEXT: vsext.vf4 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv2i32.nxv2i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv2i32.nxv2i8( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf4_nxv2i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv2i32.nxv2i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv4i32.nxv4i8( + , + i32); + +define @intrinsic_vsext_vf4_nxv4i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,ta,mu +; CHECK-NEXT: vsext.vf4 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv4i32.nxv4i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv4i32.nxv4i8( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf4_nxv4i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv4i32.nxv4i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv8i32.nxv8i8( + , + i32); + +define @intrinsic_vsext_vf4_nxv8i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,ta,mu +; CHECK-NEXT: vsext.vf4 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv8i32.nxv8i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv8i32.nxv8i8( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf4_nxv8i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv8i32.nxv8i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv16i32.nxv16i8( + , + i32); + +define @intrinsic_vsext_vf4_nxv16i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m8,ta,mu +; CHECK-NEXT: vsext.vf4 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv16i32.nxv16i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv16i32.nxv16i8( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf4_nxv16i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e8,m2,ta,mu +; CHECK-NEXT: vle8.v v26, (a0) +; CHECK-NEXT: vsetvli a0, a1, e32,m8,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v26, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv16i32.nxv16i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv1i32.nxv1i16( + , + i32); + +define @intrinsic_vsext_vf2_nxv1i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,ta,mu +; CHECK-NEXT: vsext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv1i32.nxv1i16( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv1i32.nxv1i16( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf2_nxv1i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv1i32.nxv1i16( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv2i32.nxv2i16( + , + i32); + +define @intrinsic_vsext_vf2_nxv2i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,ta,mu +; CHECK-NEXT: vsext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv2i32.nxv2i16( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv2i32.nxv2i16( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf2_nxv2i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv2i32.nxv2i16( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv4i32.nxv4i16( + , + i32); + +define @intrinsic_vsext_vf2_nxv4i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,ta,mu +; CHECK-NEXT: vsext.vf2 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv4i32.nxv4i16( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv4i32.nxv4i16( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf2_nxv4i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv4i32.nxv4i16( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv8i32.nxv8i16( + , + i32); + +define @intrinsic_vsext_vf2_nxv8i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,ta,mu +; CHECK-NEXT: vsext.vf2 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv8i32.nxv8i16( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv8i32.nxv8i16( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf2_nxv8i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv8i32.nxv8i16( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv16i32.nxv16i16( + , + i32); + +define @intrinsic_vsext_vf2_nxv16i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m8,ta,mu +; CHECK-NEXT: vsext.vf2 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv16i32.nxv16i16( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv16i32.nxv16i16( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf2_nxv16i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e16,m4,ta,mu +; CHECK-NEXT: vle16.v v28, (a0) +; CHECK-NEXT: vsetvli a0, a1, e32,m8,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v28, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv16i32.nxv16i16( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv1i16.nxv1i8( + , + i32); + +define @intrinsic_vsext_vf2_nxv1i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf4,ta,mu +; CHECK-NEXT: vsext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv1i16.nxv1i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv1i16.nxv1i8( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf2_nxv1i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf4,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv1i16.nxv1i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv2i16.nxv2i8( + , + i32); + +define @intrinsic_vsext_vf2_nxv2i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf2,ta,mu +; CHECK-NEXT: vsext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv2i16.nxv2i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv2i16.nxv2i8( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf2_nxv2i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf2,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv2i16.nxv2i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv4i16.nxv4i8( + , + i32); + +define @intrinsic_vsext_vf2_nxv4i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m1,ta,mu +; CHECK-NEXT: vsext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv4i16.nxv4i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv4i16.nxv4i8( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf2_nxv4i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m1,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv4i16.nxv4i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv8i16.nxv8i8( + , + i32); + +define @intrinsic_vsext_vf2_nxv8i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m2,ta,mu +; CHECK-NEXT: vsext.vf2 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv8i16.nxv8i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv8i16.nxv8i8( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf2_nxv8i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m2,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv8i16.nxv8i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv16i16.nxv16i8( + , + i32); + +define @intrinsic_vsext_vf2_nxv16i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m4,ta,mu +; CHECK-NEXT: vsext.vf2 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv16i16.nxv16i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv16i16.nxv16i8( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf2_nxv16i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m4,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv16i16.nxv16i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv32i16.nxv32i8( + , + i32); + +define @intrinsic_vsext_vf2_nxv32i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv32i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m8,ta,mu +; CHECK-NEXT: vsext.vf2 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv32i16.nxv32i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv32i16.nxv32i8( + , + , + , + i32); + +define @intrinsic_vsext_mask_vf2_nxv32i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv32i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e8,m4,ta,mu +; CHECK-NEXT: vle8.v v28, (a0) +; CHECK-NEXT: vsetvli a0, a1, e16,m8,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v28, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv32i16.nxv32i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vsext-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vsext-rv64.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rvv/vsext-rv64.ll @@ -0,0 +1,1162 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=riscv64 -mattr=+experimental-v -verify-machineinstrs \ +; RUN: --riscv-no-aliases < %s | FileCheck %s +declare @llvm.riscv.vsext.nxv1i64.nxv1i8( + , + i64); + +define @intrinsic_vsext_vf8_nxv1i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf8_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,ta,mu +; CHECK-NEXT: vsext.vf8 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv1i64.nxv1i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv1i64.nxv1i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf8_nxv1i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf8_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,tu,mu +; CHECK-NEXT: vsext.vf8 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv1i64.nxv1i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv2i64.nxv2i8( + , + i64); + +define @intrinsic_vsext_vf8_nxv2i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf8_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,ta,mu +; CHECK-NEXT: vsext.vf8 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv2i64.nxv2i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv2i64.nxv2i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf8_nxv2i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf8_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,tu,mu +; CHECK-NEXT: vsext.vf8 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv2i64.nxv2i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv4i64.nxv4i8( + , + i64); + +define @intrinsic_vsext_vf8_nxv4i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf8_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,ta,mu +; CHECK-NEXT: vsext.vf8 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv4i64.nxv4i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv4i64.nxv4i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf8_nxv4i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf8_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,tu,mu +; CHECK-NEXT: vsext.vf8 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv4i64.nxv4i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv8i64.nxv8i8( + , + i64); + +define @intrinsic_vsext_vf8_nxv8i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf8_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m8,ta,mu +; CHECK-NEXT: vsext.vf8 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv8i64.nxv8i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv8i64.nxv8i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf8_nxv8i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf8_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e8,m1,ta,mu +; CHECK-NEXT: vle8.v v25, (a0) +; CHECK-NEXT: vsetvli a0, a1, e64,m8,tu,mu +; CHECK-NEXT: vsext.vf8 v16, v25, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv8i64.nxv8i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv1i64.nxv1i16( + , + i64); + +define @intrinsic_vsext_vf4_nxv1i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,ta,mu +; CHECK-NEXT: vsext.vf4 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv1i64.nxv1i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv1i64.nxv1i16( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf4_nxv1i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv1i64.nxv1i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv2i64.nxv2i16( + , + i64); + +define @intrinsic_vsext_vf4_nxv2i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,ta,mu +; CHECK-NEXT: vsext.vf4 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv2i64.nxv2i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv2i64.nxv2i16( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf4_nxv2i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv2i64.nxv2i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv4i64.nxv4i16( + , + i64); + +define @intrinsic_vsext_vf4_nxv4i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,ta,mu +; CHECK-NEXT: vsext.vf4 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv4i64.nxv4i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv4i64.nxv4i16( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf4_nxv4i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv4i64.nxv4i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv8i64.nxv8i16( + , + i64); + +define @intrinsic_vsext_vf4_nxv8i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m8,ta,mu +; CHECK-NEXT: vsext.vf4 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv8i64.nxv8i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv8i64.nxv8i16( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf4_nxv8i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e16,m2,ta,mu +; CHECK-NEXT: vle16.v v26, (a0) +; CHECK-NEXT: vsetvli a0, a1, e64,m8,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v26, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv8i64.nxv8i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv1i32.nxv1i8( + , + i64); + +define @intrinsic_vsext_vf4_nxv1i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,ta,mu +; CHECK-NEXT: vsext.vf4 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv1i32.nxv1i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv1i32.nxv1i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf4_nxv1i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv1i32.nxv1i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv2i32.nxv2i8( + , + i64); + +define @intrinsic_vsext_vf4_nxv2i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,ta,mu +; CHECK-NEXT: vsext.vf4 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv2i32.nxv2i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv2i32.nxv2i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf4_nxv2i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv2i32.nxv2i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv4i32.nxv4i8( + , + i64); + +define @intrinsic_vsext_vf4_nxv4i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,ta,mu +; CHECK-NEXT: vsext.vf4 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv4i32.nxv4i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv4i32.nxv4i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf4_nxv4i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv4i32.nxv4i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv8i32.nxv8i8( + , + i64); + +define @intrinsic_vsext_vf4_nxv8i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,ta,mu +; CHECK-NEXT: vsext.vf4 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv8i32.nxv8i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv8i32.nxv8i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf4_nxv8i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv8i32.nxv8i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv16i32.nxv16i8( + , + i64); + +define @intrinsic_vsext_vf4_nxv16i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf4_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m8,ta,mu +; CHECK-NEXT: vsext.vf4 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv16i32.nxv16i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv16i32.nxv16i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf4_nxv16i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf4_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e8,m2,ta,mu +; CHECK-NEXT: vle8.v v26, (a0) +; CHECK-NEXT: vsetvli a0, a1, e32,m8,tu,mu +; CHECK-NEXT: vsext.vf4 v16, v26, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv16i32.nxv16i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv1i64.nxv1i32( + , + i64); + +define @intrinsic_vsext_vf2_nxv1i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,ta,mu +; CHECK-NEXT: vsext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv1i64.nxv1i32( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv1i64.nxv1i32( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv1i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv1i64.nxv1i32( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv2i64.nxv2i32( + , + i64); + +define @intrinsic_vsext_vf2_nxv2i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,ta,mu +; CHECK-NEXT: vsext.vf2 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv2i64.nxv2i32( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv2i64.nxv2i32( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv2i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv2i64.nxv2i32( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv4i64.nxv4i32( + , + i64); + +define @intrinsic_vsext_vf2_nxv4i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,ta,mu +; CHECK-NEXT: vsext.vf2 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv4i64.nxv4i32( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv4i64.nxv4i32( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv4i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv4i64.nxv4i32( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv8i64.nxv8i32( + , + i64); + +define @intrinsic_vsext_vf2_nxv8i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m8,ta,mu +; CHECK-NEXT: vsext.vf2 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv8i64.nxv8i32( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv8i64.nxv8i32( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv8i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e32,m4,ta,mu +; CHECK-NEXT: vle32.v v28, (a0) +; CHECK-NEXT: vsetvli a0, a1, e64,m8,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v28, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv8i64.nxv8i32( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv1i32.nxv1i16( + , + i64); + +define @intrinsic_vsext_vf2_nxv1i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,ta,mu +; CHECK-NEXT: vsext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv1i32.nxv1i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv1i32.nxv1i16( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv1i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv1i32.nxv1i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv2i32.nxv2i16( + , + i64); + +define @intrinsic_vsext_vf2_nxv2i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,ta,mu +; CHECK-NEXT: vsext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv2i32.nxv2i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv2i32.nxv2i16( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv2i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv2i32.nxv2i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv4i32.nxv4i16( + , + i64); + +define @intrinsic_vsext_vf2_nxv4i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,ta,mu +; CHECK-NEXT: vsext.vf2 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv4i32.nxv4i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv4i32.nxv4i16( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv4i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv4i32.nxv4i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv8i32.nxv8i16( + , + i64); + +define @intrinsic_vsext_vf2_nxv8i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,ta,mu +; CHECK-NEXT: vsext.vf2 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv8i32.nxv8i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv8i32.nxv8i16( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv8i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv8i32.nxv8i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv16i32.nxv16i16( + , + i64); + +define @intrinsic_vsext_vf2_nxv16i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m8,ta,mu +; CHECK-NEXT: vsext.vf2 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv16i32.nxv16i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv16i32.nxv16i16( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv16i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e16,m4,ta,mu +; CHECK-NEXT: vle16.v v28, (a0) +; CHECK-NEXT: vsetvli a0, a1, e32,m8,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v28, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv16i32.nxv16i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv1i16.nxv1i8( + , + i64); + +define @intrinsic_vsext_vf2_nxv1i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf4,ta,mu +; CHECK-NEXT: vsext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv1i16.nxv1i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv1i16.nxv1i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv1i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf4,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv1i16.nxv1i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv2i16.nxv2i8( + , + i64); + +define @intrinsic_vsext_vf2_nxv2i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf2,ta,mu +; CHECK-NEXT: vsext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv2i16.nxv2i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv2i16.nxv2i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv2i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf2,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv2i16.nxv2i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv4i16.nxv4i8( + , + i64); + +define @intrinsic_vsext_vf2_nxv4i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m1,ta,mu +; CHECK-NEXT: vsext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv4i16.nxv4i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv4i16.nxv4i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv4i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m1,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv4i16.nxv4i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv8i16.nxv8i8( + , + i64); + +define @intrinsic_vsext_vf2_nxv8i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m2,ta,mu +; CHECK-NEXT: vsext.vf2 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv8i16.nxv8i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv8i16.nxv8i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv8i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m2,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv8i16.nxv8i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv16i16.nxv16i8( + , + i64); + +define @intrinsic_vsext_vf2_nxv16i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m4,ta,mu +; CHECK-NEXT: vsext.vf2 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv16i16.nxv16i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv16i16.nxv16i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv16i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m4,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv16i16.nxv16i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vsext.nxv32i16.nxv32i8( + , + i64); + +define @intrinsic_vsext_vf2_nxv32i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vsext_vf2_nxv32i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m8,ta,mu +; CHECK-NEXT: vsext.vf2 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.nxv32i16.nxv32i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vsext.mask.nxv32i16.nxv32i8( + , + , + , + i64); + +define @intrinsic_vsext_mask_vf2_nxv32i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vsext_mask_vf2_nxv32i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e8,m4,ta,mu +; CHECK-NEXT: vle8.v v28, (a0) +; CHECK-NEXT: vsetvli a0, a1, e16,m8,tu,mu +; CHECK-NEXT: vsext.vf2 v16, v28, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vsext.mask.nxv32i16.nxv32i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vzext-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vzext-rv32.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rvv/vzext-rv32.ll @@ -0,0 +1,664 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=riscv32 -mattr=+experimental-v -verify-machineinstrs \ +; RUN: --riscv-no-aliases < %s | FileCheck %s +declare @llvm.riscv.vzext.nxv1i32.nxv1i8( + , + i32); + +define @intrinsic_vzext_vf4_nxv1i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,ta,mu +; CHECK-NEXT: vzext.vf4 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv1i32.nxv1i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv1i32.nxv1i8( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf4_nxv1i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv1i32.nxv1i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv2i32.nxv2i8( + , + i32); + +define @intrinsic_vzext_vf4_nxv2i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,ta,mu +; CHECK-NEXT: vzext.vf4 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv2i32.nxv2i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv2i32.nxv2i8( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf4_nxv2i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv2i32.nxv2i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv4i32.nxv4i8( + , + i32); + +define @intrinsic_vzext_vf4_nxv4i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,ta,mu +; CHECK-NEXT: vzext.vf4 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv4i32.nxv4i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv4i32.nxv4i8( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf4_nxv4i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv4i32.nxv4i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv8i32.nxv8i8( + , + i32); + +define @intrinsic_vzext_vf4_nxv8i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,ta,mu +; CHECK-NEXT: vzext.vf4 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv8i32.nxv8i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv8i32.nxv8i8( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf4_nxv8i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv8i32.nxv8i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv16i32.nxv16i8( + , + i32); + +define @intrinsic_vzext_vf4_nxv16i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m8,ta,mu +; CHECK-NEXT: vzext.vf4 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv16i32.nxv16i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv16i32.nxv16i8( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf4_nxv16i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e8,m2,ta,mu +; CHECK-NEXT: vle8.v v26, (a0) +; CHECK-NEXT: vsetvli a0, a1, e32,m8,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v26, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv16i32.nxv16i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv1i32.nxv1i16( + , + i32); + +define @intrinsic_vzext_vf2_nxv1i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,ta,mu +; CHECK-NEXT: vzext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv1i32.nxv1i16( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv1i32.nxv1i16( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf2_nxv1i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv1i32.nxv1i16( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv2i32.nxv2i16( + , + i32); + +define @intrinsic_vzext_vf2_nxv2i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,ta,mu +; CHECK-NEXT: vzext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv2i32.nxv2i16( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv2i32.nxv2i16( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf2_nxv2i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv2i32.nxv2i16( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv4i32.nxv4i16( + , + i32); + +define @intrinsic_vzext_vf2_nxv4i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,ta,mu +; CHECK-NEXT: vzext.vf2 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv4i32.nxv4i16( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv4i32.nxv4i16( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf2_nxv4i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv4i32.nxv4i16( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv8i32.nxv8i16( + , + i32); + +define @intrinsic_vzext_vf2_nxv8i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,ta,mu +; CHECK-NEXT: vzext.vf2 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv8i32.nxv8i16( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv8i32.nxv8i16( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf2_nxv8i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv8i32.nxv8i16( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv16i32.nxv16i16( + , + i32); + +define @intrinsic_vzext_vf2_nxv16i32( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m8,ta,mu +; CHECK-NEXT: vzext.vf2 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv16i32.nxv16i16( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv16i32.nxv16i16( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf2_nxv16i32( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e16,m4,ta,mu +; CHECK-NEXT: vle16.v v28, (a0) +; CHECK-NEXT: vsetvli a0, a1, e32,m8,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v28, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv16i32.nxv16i16( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv1i16.nxv1i8( + , + i32); + +define @intrinsic_vzext_vf2_nxv1i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf4,ta,mu +; CHECK-NEXT: vzext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv1i16.nxv1i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv1i16.nxv1i8( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf2_nxv1i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf4,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv1i16.nxv1i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv2i16.nxv2i8( + , + i32); + +define @intrinsic_vzext_vf2_nxv2i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf2,ta,mu +; CHECK-NEXT: vzext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv2i16.nxv2i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv2i16.nxv2i8( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf2_nxv2i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf2,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv2i16.nxv2i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv4i16.nxv4i8( + , + i32); + +define @intrinsic_vzext_vf2_nxv4i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m1,ta,mu +; CHECK-NEXT: vzext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv4i16.nxv4i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv4i16.nxv4i8( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf2_nxv4i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m1,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv4i16.nxv4i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv8i16.nxv8i8( + , + i32); + +define @intrinsic_vzext_vf2_nxv8i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m2,ta,mu +; CHECK-NEXT: vzext.vf2 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv8i16.nxv8i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv8i16.nxv8i8( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf2_nxv8i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m2,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv8i16.nxv8i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv16i16.nxv16i8( + , + i32); + +define @intrinsic_vzext_vf2_nxv16i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m4,ta,mu +; CHECK-NEXT: vzext.vf2 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv16i16.nxv16i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv16i16.nxv16i8( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf2_nxv16i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m4,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv16i16.nxv16i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv32i16.nxv32i8( + , + i32); + +define @intrinsic_vzext_vf2_nxv32i16( %0, i32 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv32i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m8,ta,mu +; CHECK-NEXT: vzext.vf2 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv32i16.nxv32i8( + %0, + i32 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv32i16.nxv32i8( + , + , + , + i32); + +define @intrinsic_vzext_mask_vf2_nxv32i16( %0, %1, %2, i32 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv32i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e8,m4,ta,mu +; CHECK-NEXT: vle8.v v28, (a0) +; CHECK-NEXT: vsetvli a0, a1, e16,m8,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v28, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv32i16.nxv32i8( + %1, + %2, + %0, + i32 %3) + + ret %a +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vzext-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vzext-rv64.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rvv/vzext-rv64.ll @@ -0,0 +1,1162 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=riscv64 -mattr=+experimental-v -verify-machineinstrs \ +; RUN: --riscv-no-aliases < %s | FileCheck %s +declare @llvm.riscv.vzext.nxv1i64.nxv1i8( + , + i64); + +define @intrinsic_vzext_vf8_nxv1i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf8_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,ta,mu +; CHECK-NEXT: vzext.vf8 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv1i64.nxv1i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv1i64.nxv1i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf8_nxv1i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf8_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,tu,mu +; CHECK-NEXT: vzext.vf8 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv1i64.nxv1i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv2i64.nxv2i8( + , + i64); + +define @intrinsic_vzext_vf8_nxv2i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf8_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,ta,mu +; CHECK-NEXT: vzext.vf8 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv2i64.nxv2i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv2i64.nxv2i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf8_nxv2i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf8_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,tu,mu +; CHECK-NEXT: vzext.vf8 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv2i64.nxv2i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv4i64.nxv4i8( + , + i64); + +define @intrinsic_vzext_vf8_nxv4i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf8_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,ta,mu +; CHECK-NEXT: vzext.vf8 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv4i64.nxv4i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv4i64.nxv4i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf8_nxv4i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf8_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,tu,mu +; CHECK-NEXT: vzext.vf8 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv4i64.nxv4i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv8i64.nxv8i8( + , + i64); + +define @intrinsic_vzext_vf8_nxv8i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf8_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m8,ta,mu +; CHECK-NEXT: vzext.vf8 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv8i64.nxv8i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv8i64.nxv8i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf8_nxv8i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf8_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e8,m1,ta,mu +; CHECK-NEXT: vle8.v v25, (a0) +; CHECK-NEXT: vsetvli a0, a1, e64,m8,tu,mu +; CHECK-NEXT: vzext.vf8 v16, v25, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv8i64.nxv8i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv1i64.nxv1i16( + , + i64); + +define @intrinsic_vzext_vf4_nxv1i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,ta,mu +; CHECK-NEXT: vzext.vf4 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv1i64.nxv1i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv1i64.nxv1i16( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf4_nxv1i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv1i64.nxv1i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv2i64.nxv2i16( + , + i64); + +define @intrinsic_vzext_vf4_nxv2i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,ta,mu +; CHECK-NEXT: vzext.vf4 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv2i64.nxv2i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv2i64.nxv2i16( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf4_nxv2i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv2i64.nxv2i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv4i64.nxv4i16( + , + i64); + +define @intrinsic_vzext_vf4_nxv4i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,ta,mu +; CHECK-NEXT: vzext.vf4 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv4i64.nxv4i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv4i64.nxv4i16( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf4_nxv4i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv4i64.nxv4i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv8i64.nxv8i16( + , + i64); + +define @intrinsic_vzext_vf4_nxv8i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m8,ta,mu +; CHECK-NEXT: vzext.vf4 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv8i64.nxv8i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv8i64.nxv8i16( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf4_nxv8i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e16,m2,ta,mu +; CHECK-NEXT: vle16.v v26, (a0) +; CHECK-NEXT: vsetvli a0, a1, e64,m8,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v26, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv8i64.nxv8i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv1i32.nxv1i8( + , + i64); + +define @intrinsic_vzext_vf4_nxv1i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,ta,mu +; CHECK-NEXT: vzext.vf4 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv1i32.nxv1i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv1i32.nxv1i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf4_nxv1i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv1i32.nxv1i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv2i32.nxv2i8( + , + i64); + +define @intrinsic_vzext_vf4_nxv2i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,ta,mu +; CHECK-NEXT: vzext.vf4 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv2i32.nxv2i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv2i32.nxv2i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf4_nxv2i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv2i32.nxv2i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv4i32.nxv4i8( + , + i64); + +define @intrinsic_vzext_vf4_nxv4i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,ta,mu +; CHECK-NEXT: vzext.vf4 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv4i32.nxv4i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv4i32.nxv4i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf4_nxv4i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv4i32.nxv4i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv8i32.nxv8i8( + , + i64); + +define @intrinsic_vzext_vf4_nxv8i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,ta,mu +; CHECK-NEXT: vzext.vf4 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv8i32.nxv8i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv8i32.nxv8i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf4_nxv8i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv8i32.nxv8i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv16i32.nxv16i8( + , + i64); + +define @intrinsic_vzext_vf4_nxv16i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf4_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m8,ta,mu +; CHECK-NEXT: vzext.vf4 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv16i32.nxv16i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv16i32.nxv16i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf4_nxv16i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf4_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e8,m2,ta,mu +; CHECK-NEXT: vle8.v v26, (a0) +; CHECK-NEXT: vsetvli a0, a1, e32,m8,tu,mu +; CHECK-NEXT: vzext.vf4 v16, v26, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv16i32.nxv16i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv1i64.nxv1i32( + , + i64); + +define @intrinsic_vzext_vf2_nxv1i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,ta,mu +; CHECK-NEXT: vzext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv1i64.nxv1i32( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv1i64.nxv1i32( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv1i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv1i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m1,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv1i64.nxv1i32( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv2i64.nxv2i32( + , + i64); + +define @intrinsic_vzext_vf2_nxv2i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,ta,mu +; CHECK-NEXT: vzext.vf2 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv2i64.nxv2i32( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv2i64.nxv2i32( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv2i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv2i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m2,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv2i64.nxv2i32( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv4i64.nxv4i32( + , + i64); + +define @intrinsic_vzext_vf2_nxv4i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,ta,mu +; CHECK-NEXT: vzext.vf2 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv4i64.nxv4i32( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv4i64.nxv4i32( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv4i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv4i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m4,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv4i64.nxv4i32( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv8i64.nxv8i32( + , + i64); + +define @intrinsic_vzext_vf2_nxv8i64( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e64,m8,ta,mu +; CHECK-NEXT: vzext.vf2 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv8i64.nxv8i32( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv8i64.nxv8i32( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv8i64( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv8i64: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e32,m4,ta,mu +; CHECK-NEXT: vle32.v v28, (a0) +; CHECK-NEXT: vsetvli a0, a1, e64,m8,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v28, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv8i64.nxv8i32( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv1i32.nxv1i16( + , + i64); + +define @intrinsic_vzext_vf2_nxv1i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,ta,mu +; CHECK-NEXT: vzext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv1i32.nxv1i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv1i32.nxv1i16( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv1i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv1i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,mf2,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv1i32.nxv1i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv2i32.nxv2i16( + , + i64); + +define @intrinsic_vzext_vf2_nxv2i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,ta,mu +; CHECK-NEXT: vzext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv2i32.nxv2i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv2i32.nxv2i16( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv2i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv2i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m1,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv2i32.nxv2i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv4i32.nxv4i16( + , + i64); + +define @intrinsic_vzext_vf2_nxv4i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,ta,mu +; CHECK-NEXT: vzext.vf2 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv4i32.nxv4i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv4i32.nxv4i16( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv4i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv4i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m2,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv4i32.nxv4i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv8i32.nxv8i16( + , + i64); + +define @intrinsic_vzext_vf2_nxv8i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,ta,mu +; CHECK-NEXT: vzext.vf2 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv8i32.nxv8i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv8i32.nxv8i16( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv8i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv8i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m4,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv8i32.nxv8i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv16i32.nxv16i16( + , + i64); + +define @intrinsic_vzext_vf2_nxv16i32( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e32,m8,ta,mu +; CHECK-NEXT: vzext.vf2 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv16i32.nxv16i16( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv16i32.nxv16i16( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv16i32( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv16i32: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e16,m4,ta,mu +; CHECK-NEXT: vle16.v v28, (a0) +; CHECK-NEXT: vsetvli a0, a1, e32,m8,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v28, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv16i32.nxv16i16( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv1i16.nxv1i8( + , + i64); + +define @intrinsic_vzext_vf2_nxv1i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf4,ta,mu +; CHECK-NEXT: vzext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv1i16.nxv1i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv1i16.nxv1i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv1i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv1i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf4,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv1i16.nxv1i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv2i16.nxv2i8( + , + i64); + +define @intrinsic_vzext_vf2_nxv2i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf2,ta,mu +; CHECK-NEXT: vzext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv2i16.nxv2i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv2i16.nxv2i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv2i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv2i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,mf2,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv2i16.nxv2i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv4i16.nxv4i8( + , + i64); + +define @intrinsic_vzext_vf2_nxv4i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m1,ta,mu +; CHECK-NEXT: vzext.vf2 v25, v16 +; CHECK-NEXT: vmv1r.v v16, v25 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv4i16.nxv4i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv4i16.nxv4i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv4i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv4i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m1,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v17, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv4i16.nxv4i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv8i16.nxv8i8( + , + i64); + +define @intrinsic_vzext_vf2_nxv8i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m2,ta,mu +; CHECK-NEXT: vzext.vf2 v26, v16 +; CHECK-NEXT: vmv2r.v v16, v26 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv8i16.nxv8i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv8i16.nxv8i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv8i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv8i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m2,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v18, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv8i16.nxv8i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv16i16.nxv16i8( + , + i64); + +define @intrinsic_vzext_vf2_nxv16i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m4,ta,mu +; CHECK-NEXT: vzext.vf2 v28, v16 +; CHECK-NEXT: vmv4r.v v16, v28 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv16i16.nxv16i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv16i16.nxv16i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv16i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv16i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m4,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v20, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv16i16.nxv16i8( + %1, + %2, + %0, + i64 %3) + + ret %a +} + +declare @llvm.riscv.vzext.nxv32i16.nxv32i8( + , + i64); + +define @intrinsic_vzext_vf2_nxv32i16( %0, i64 %1) nounwind { +; CHECK-LABEL: intrinsic_vzext_vf2_nxv32i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a0, a0, e16,m8,ta,mu +; CHECK-NEXT: vzext.vf2 v8, v16 +; CHECK-NEXT: vmv8r.v v16, v8 +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.nxv32i16.nxv32i8( + %0, + i64 %1) + + ret %a +} + +declare @llvm.riscv.vzext.mask.nxv32i16.nxv32i8( + , + , + , + i64); + +define @intrinsic_vzext_mask_vf2_nxv32i16( %0, %1, %2, i64 %3) nounwind { +; CHECK-LABEL: intrinsic_vzext_mask_vf2_nxv32i16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vsetvli a2, zero, e8,m4,ta,mu +; CHECK-NEXT: vle8.v v28, (a0) +; CHECK-NEXT: vsetvli a0, a1, e16,m8,tu,mu +; CHECK-NEXT: vzext.vf2 v16, v28, v0.t +; CHECK-NEXT: jalr zero, 0(ra) +entry: + %a = call @llvm.riscv.vzext.mask.nxv32i16.nxv32i8( + %1, + %2, + %0, + i64 %3) + + ret %a +}