diff --git a/clang/include/clang/Basic/riscv_vector_xtheadv.td b/clang/include/clang/Basic/riscv_vector_xtheadv.td index 2e717e43f3c29c..6c1eb8906cf535 100644 --- a/clang/include/clang/Basic/riscv_vector_xtheadv.td +++ b/clang/include/clang/Basic/riscv_vector_xtheadv.td @@ -24,6 +24,11 @@ class RVVOutOp1Builtin let IntrinsicTypes = [-1, 1]; } +class RVVOutOp0Op1Builtin + : RVVBuiltin { + let IntrinsicTypes = [-1, 0, 1]; +} + multiclass RVVBuiltinSet> suffixes_prototypes, list intrinsic_types> { @@ -58,6 +63,56 @@ multiclass RVVIntBinBuiltinSet : RVVSignedBinBuiltinSet, RVVUnsignedBinBuiltinSet; +multiclass RVVWidenBuiltinSet> suffixes_prototypes> { + let Log2LMUL = [-3, -2, -1, 0, 1, 2], + IRName = intrinsic_name, MaskedIRName = intrinsic_name # "_mask" in { + foreach s_p = suffixes_prototypes in { + let Name = NAME # "_" # s_p[0], + OverloadedName = NAME # "_" # s_p[0] in { + defvar suffix = s_p[1]; + defvar prototype = s_p[2]; + def : RVVOutOp0Op1Builtin; + } + } + } +} + +multiclass RVVWidenWOp0BuiltinSet> suffixes_prototypes> { + let Log2LMUL = [-3, -2, -1, 0, 1, 2], + IRName = intrinsic_name, MaskedIRName = intrinsic_name # "_mask" in { + foreach s_p = suffixes_prototypes in { + let Name = NAME # "_" # s_p[0], + OverloadedName = NAME # "_" # s_p[0] in { + defvar suffix = s_p[1]; + defvar prototype = s_p[2]; + def : RVVOutOp1Builtin; + } + } + } +} + +multiclass RVVUnsignedWidenBinBuiltinSet + : RVVWidenBuiltinSet; + +multiclass RVVSignedWidenBinBuiltinSet + : RVVWidenBuiltinSet; + +multiclass RVVUnsignedWidenOp0BinBuiltinSet + : RVVWidenWOp0BuiltinSet; + +multiclass RVVSignedWidenOp0BinBuiltinSet + : RVVWidenWOp0BuiltinSet; + defvar NFList = [2, 3, 4, 5, 6, 7, 8]; defvar TypeList = ["c", "s", "i", "l", "x", "f", "d"]; defvar EEWList = [["8", "(Log2EEW:3)"], @@ -781,10 +836,10 @@ let UnMaskedPolicyScheme = NonePolicy, // 12. Vector Integer Arithmetic Operations //===----------------------------------------------------------------------===// -multiclass RVVPseudoUnaryBuiltin { +multiclass RVVPseudoUnaryBuiltin { let Name = NAME, - IRName = IR, - MaskedIRName = IR # "_mask", + IRName = ir, + MaskedIRName = ir # "_mask", UnMaskedPolicyScheme = HasPassthruOperand, ManualCodegen = [{ { @@ -815,6 +870,7 @@ multiclass RVVPseudoUnaryBuiltin { } } +// 12.1. Vector Single-Width Integer Add and Subtract let UnMaskedPolicyScheme = HasPassthruOperand in { defm th_vadd : RVVIntBinBuiltinSet; defm th_vsub : RVVIntBinBuiltinSet; @@ -824,4 +880,17 @@ let UnMaskedPolicyScheme = HasPassthruOperand in { } defm th_vneg_v : RVVPseudoUnaryBuiltin<"th_vrsub", "csil">; +// 12.2. Vector Widening Integer Add/Subtract Operations +let UnMaskedPolicyScheme = HasPassthruOperand in { +defm th_vwaddu : RVVUnsignedWidenBinBuiltinSet; +defm th_vwaddu : RVVUnsignedWidenOp0BinBuiltinSet; +defm th_vwsubu : RVVUnsignedWidenBinBuiltinSet; +defm th_vwsubu : RVVUnsignedWidenOp0BinBuiltinSet; +defm th_vwadd : RVVSignedWidenBinBuiltinSet; +defm th_vwadd : RVVSignedWidenOp0BinBuiltinSet; +defm th_vwsub : RVVSignedWidenBinBuiltinSet; +defm th_vwsub : RVVSignedWidenOp0BinBuiltinSet; +} + + include "riscv_vector_xtheadv_wrappers.td" diff --git a/clang/include/clang/Basic/riscv_vector_xtheadv_wrappers.td b/clang/include/clang/Basic/riscv_vector_xtheadv_wrappers.td index 41a39e9f20e821..11e229d1320b28 100644 --- a/clang/include/clang/Basic/riscv_vector_xtheadv_wrappers.td +++ b/clang/include/clang/Basic/riscv_vector_xtheadv_wrappers.td @@ -1048,3 +1048,206 @@ let HeaderCode = }] in def th_single_width_integer_add_wrapper_macros: RVVHeader; + + +let HeaderCode = +[{ +// Vector Widening Integer Add and Subtract +#define __riscv_vwadd_vv_i16m2(op1_v, op2_v, vl) __riscv_th_vwadd_vv_i16m2(op1_v, op2_v, vl) +#define __riscv_vwadd_vv_i16m4(op1_v, op2_v, vl) __riscv_th_vwadd_vv_i16m4(op1_v, op2_v, vl) +#define __riscv_vwadd_vv_i16m8(op1_v, op2_v, vl) __riscv_th_vwadd_vv_i16m8(op1_v, op2_v, vl) +#define __riscv_vwadd_vv_i32m1(op1_v, op2_v, vl) __riscv_th_vwadd_vv_i32m1(op1_v, op2_v, vl) +#define __riscv_vwadd_vv_i32m2(op1_v, op2_v, vl) __riscv_th_vwadd_vv_i32m2(op1_v, op2_v, vl) +#define __riscv_vwadd_vv_i32m4(op1_v, op2_v, vl) __riscv_th_vwadd_vv_i32m4(op1_v, op2_v, vl) +#define __riscv_vwadd_vv_i32m8(op1_v, op2_v, vl) __riscv_th_vwadd_vv_i32m8(op1_v, op2_v, vl) +#define __riscv_vwadd_vv_i64m1(op1_v, op2_v, vl) __riscv_th_vwadd_vv_i64m1(op1_v, op2_v, vl) +#define __riscv_vwadd_vv_i64m2(op1_v, op2_v, vl) __riscv_th_vwadd_vv_i64m2(op1_v, op2_v, vl) +#define __riscv_vwadd_vv_i64m4(op1_v, op2_v, vl) __riscv_th_vwadd_vv_i64m4(op1_v, op2_v, vl) +#define __riscv_vwadd_vv_i64m8(op1_v, op2_v, vl) __riscv_th_vwadd_vv_i64m8(op1_v, op2_v, vl) + +#define __riscv_vwaddu_vv_u16m2(op1_v, op2_v, vl) __riscv_th_vwaddu_vv_u16m2(op1_v, op2_v, vl) +#define __riscv_vwaddu_vv_u16m4(op1_v, op2_v, vl) __riscv_th_vwaddu_vv_u16m4(op1_v, op2_v, vl) +#define __riscv_vwaddu_vv_u16m8(op1_v, op2_v, vl) __riscv_th_vwaddu_vv_u16m8(op1_v, op2_v, vl) +#define __riscv_vwaddu_vv_u32m1(op1_v, op2_v, vl) __riscv_th_vwaddu_vv_u32m1(op1_v, op2_v, vl) +#define __riscv_vwaddu_vv_u32m2(op1_v, op2_v, vl) __riscv_th_vwaddu_vv_u32m2(op1_v, op2_v, vl) +#define __riscv_vwaddu_vv_u32m4(op1_v, op2_v, vl) __riscv_th_vwaddu_vv_u32m4(op1_v, op2_v, vl) +#define __riscv_vwaddu_vv_u32m8(op1_v, op2_v, vl) __riscv_th_vwaddu_vv_u32m8(op1_v, op2_v, vl) +#define __riscv_vwaddu_vv_u64m1(op1_v, op2_v, vl) __riscv_th_vwaddu_vv_u64m1(op1_v, op2_v, vl) +#define __riscv_vwaddu_vv_u64m2(op1_v, op2_v, vl) __riscv_th_vwaddu_vv_u64m2(op1_v, op2_v, vl) +#define __riscv_vwaddu_vv_u64m4(op1_v, op2_v, vl) __riscv_th_vwaddu_vv_u64m4(op1_v, op2_v, vl) +#define __riscv_vwaddu_vv_u64m8(op1_v, op2_v, vl) __riscv_th_vwaddu_vv_u64m8(op1_v, op2_v, vl) + +#define __riscv_vwadd_vx_i16m2(op1_v, op2_x, vl) __riscv_th_vwadd_vx_i16m2(op1_v, op2_x, vl) +#define __riscv_vwadd_vx_i16m4(op1_v, op2_x, vl) __riscv_th_vwadd_vx_i16m4(op1_v, op2_x, vl) +#define __riscv_vwadd_vx_i16m8(op1_v, op2_x, vl) __riscv_th_vwadd_vx_i16m8(op1_v, op2_x, vl) +#define __riscv_vwadd_vx_i32m1(op1_v, op2_x, vl) __riscv_th_vwadd_vx_i32m1(op1_v, op2_x, vl) +#define __riscv_vwadd_vx_i32m2(op1_v, op2_x, vl) __riscv_th_vwadd_vx_i32m2(op1_v, op2_x, vl) +#define __riscv_vwadd_vx_i32m4(op1_v, op2_x, vl) __riscv_th_vwadd_vx_i32m4(op1_v, op2_x, vl) +#define __riscv_vwadd_vx_i32m8(op1_v, op2_x, vl) __riscv_th_vwadd_vx_i32m8(op1_v, op2_x, vl) +#define __riscv_vwadd_vx_i64m1(op1_v, op2_x, vl) __riscv_th_vwadd_vx_i64m1(op1_v, op2_x, vl) +#define __riscv_vwadd_vx_i64m2(op1_v, op2_x, vl) __riscv_th_vwadd_vx_i64m2(op1_v, op2_x, vl) +#define __riscv_vwadd_vx_i64m4(op1_v, op2_x, vl) __riscv_th_vwadd_vx_i64m4(op1_v, op2_x, vl) +#define __riscv_vwadd_vx_i64m8(op1_v, op2_x, vl) __riscv_th_vwadd_vx_i64m8(op1_v, op2_x, vl) + +#define __riscv_vwaddu_vx_u16m2(op1_v, op2_x, vl) __riscv_th_vwaddu_vx_u16m2(op1_v, op2_x, vl) +#define __riscv_vwaddu_vx_u16m4(op1_v, op2_x, vl) __riscv_th_vwaddu_vx_u16m4(op1_v, op2_x, vl) +#define __riscv_vwaddu_vx_u16m8(op1_v, op2_x, vl) __riscv_th_vwaddu_vx_u16m8(op1_v, op2_x, vl) +#define __riscv_vwaddu_vx_u32m1(op1_v, op2_x, vl) __riscv_th_vwaddu_vx_u32m1(op1_v, op2_x, vl) +#define __riscv_vwaddu_vx_u32m2(op1_v, op2_x, vl) __riscv_th_vwaddu_vx_u32m2(op1_v, op2_x, vl) +#define __riscv_vwaddu_vx_u32m4(op1_v, op2_x, vl) __riscv_th_vwaddu_vx_u32m4(op1_v, op2_x, vl) +#define __riscv_vwaddu_vx_u32m8(op1_v, op2_x, vl) __riscv_th_vwaddu_vx_u32m8(op1_v, op2_x, vl) +#define __riscv_vwaddu_vx_u64m1(op1_v, op2_x, vl) __riscv_th_vwaddu_vx_u64m1(op1_v, op2_x, vl) +#define __riscv_vwaddu_vx_u64m2(op1_v, op2_x, vl) __riscv_th_vwaddu_vx_u64m2(op1_v, op2_x, vl) +#define __riscv_vwaddu_vx_u64m4(op1_v, op2_x, vl) __riscv_th_vwaddu_vx_u64m4(op1_v, op2_x, vl) +#define __riscv_vwaddu_vx_u64m8(op1_v, op2_x, vl) __riscv_th_vwaddu_vx_u64m8(op1_v, op2_x, vl) + +#define __riscv_vwadd_wv_i16m2(op1_wv, op2_v, vl) __riscv_th_vwadd_wv_i16m2(op1_wv, op2_v, vl) +#define __riscv_vwadd_wv_i16m4(op1_wv, op2_v, vl) __riscv_th_vwadd_wv_i16m4(op1_wv, op2_v, vl) +#define __riscv_vwadd_wv_i16m8(op1_wv, op2_v, vl) __riscv_th_vwadd_wv_i16m8(op1_wv, op2_v, vl) +#define __riscv_vwadd_wv_i32m1(op1_wv, op2_v, vl) __riscv_th_vwadd_wv_i32m1(op1_wv, op2_v, vl) +#define __riscv_vwadd_wv_i32m2(op1_wv, op2_v, vl) __riscv_th_vwadd_wv_i32m2(op1_wv, op2_v, vl) +#define __riscv_vwadd_wv_i32m4(op1_wv, op2_v, vl) __riscv_th_vwadd_wv_i32m4(op1_wv, op2_v, vl) +#define __riscv_vwadd_wv_i32m8(op1_wv, op2_v, vl) __riscv_th_vwadd_wv_i32m8(op1_wv, op2_v, vl) +#define __riscv_vwadd_wv_i64m1(op1_wv, op2_v, vl) __riscv_th_vwadd_wv_i64m1(op1_wv, op2_v, vl) +#define __riscv_vwadd_wv_i64m2(op1_wv, op2_v, vl) __riscv_th_vwadd_wv_i64m2(op1_wv, op2_v, vl) +#define __riscv_vwadd_wv_i64m4(op1_wv, op2_v, vl) __riscv_th_vwadd_wv_i64m4(op1_wv, op2_v, vl) +#define __riscv_vwadd_wv_i64m8(op1_wv, op2_v, vl) __riscv_th_vwadd_wv_i64m8(op1_wv, op2_v, vl) + +#define __riscv_vwaddu_wv_u16m2(op1_wv, op2_v, vl) __riscv_th_vwaddu_wv_u16m2(op1_wv, op2_v, vl) +#define __riscv_vwaddu_wv_u16m4(op1_wv, op2_v, vl) __riscv_th_vwaddu_wv_u16m4(op1_wv, op2_v, vl) +#define __riscv_vwaddu_wv_u16m8(op1_wv, op2_v, vl) __riscv_th_vwaddu_wv_u16m8(op1_wv, op2_v, vl) +#define __riscv_vwaddu_wv_u32m1(op1_wv, op2_v, vl) __riscv_th_vwaddu_wv_u32m1(op1_wv, op2_v, vl) +#define __riscv_vwaddu_wv_u32m2(op1_wv, op2_v, vl) __riscv_th_vwaddu_wv_u32m2(op1_wv, op2_v, vl) +#define __riscv_vwaddu_wv_u32m4(op1_wv, op2_v, vl) __riscv_th_vwaddu_wv_u32m4(op1_wv, op2_v, vl) +#define __riscv_vwaddu_wv_u32m8(op1_wv, op2_v, vl) __riscv_th_vwaddu_wv_u32m8(op1_wv, op2_v, vl) +#define __riscv_vwaddu_wv_u64m1(op1_wv, op2_v, vl) __riscv_th_vwaddu_wv_u64m1(op1_wv, op2_v, vl) +#define __riscv_vwaddu_wv_u64m2(op1_wv, op2_v, vl) __riscv_th_vwaddu_wv_u64m2(op1_wv, op2_v, vl) +#define __riscv_vwaddu_wv_u64m4(op1_wv, op2_v, vl) __riscv_th_vwaddu_wv_u64m4(op1_wv, op2_v, vl) +#define __riscv_vwaddu_wv_u64m8(op1_wv, op2_v, vl) __riscv_th_vwaddu_wv_u64m8(op1_wv, op2_v, vl) + +#define __riscv_vwadd_wx_i16m1(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i16m1(op1_wx, op2_x, vl) +#define __riscv_vwadd_wx_i16m2(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i16m2(op1_wx, op2_x, vl) +#define __riscv_vwadd_wx_i16m4(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i16m4(op1_wx, op2_x, vl) +#define __riscv_vwadd_wx_i16m8(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i16m8(op1_wx, op2_x, vl) +#define __riscv_vwadd_wx_i32m1(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i32m1(op1_wx, op2_x, vl) +#define __riscv_vwadd_wx_i32m2(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i32m2(op1_wx, op2_x, vl) +#define __riscv_vwadd_wx_i32m4(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i32m4(op1_wx, op2_x, vl) +#define __riscv_vwadd_wx_i32m8(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i32m8(op1_wx, op2_x, vl) +#define __riscv_vwadd_wx_i64m1(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i64m1(op1_wx, op2_x, vl) +#define __riscv_vwadd_wx_i64m2(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i64m2(op1_wx, op2_x, vl) +#define __riscv_vwadd_wx_i64m4(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i64m4(op1_wx, op2_x, vl) +#define __riscv_vwadd_wx_i64m8(op1_wx, op2_x, vl) __riscv_th_vwadd_wx_i64m8(op1_wx, op2_x, vl) + +#define __riscv_vwaddu_wx_u16m1(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u16m1(op1_wx, op2_x, vl) +#define __riscv_vwaddu_wx_u16m2(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u16m2(op1_wx, op2_x, vl) +#define __riscv_vwaddu_wx_u16m4(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u16m4(op1_wx, op2_x, vl) +#define __riscv_vwaddu_wx_u16m8(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u16m8(op1_wx, op2_x, vl) +#define __riscv_vwaddu_wx_u32m1(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u32m1(op1_wx, op2_x, vl) +#define __riscv_vwaddu_wx_u32m2(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u32m2(op1_wx, op2_x, vl) +#define __riscv_vwaddu_wx_u32m4(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u32m4(op1_wx, op2_x, vl) +#define __riscv_vwaddu_wx_u32m8(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u32m8(op1_wx, op2_x, vl) +#define __riscv_vwaddu_wx_u64m1(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u64m1(op1_wx, op2_x, vl) +#define __riscv_vwaddu_wx_u64m2(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u64m2(op1_wx, op2_x, vl) +#define __riscv_vwaddu_wx_u64m4(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u64m4(op1_wx, op2_x, vl) +#define __riscv_vwaddu_wx_u64m8(op1_wx, op2_x, vl) __riscv_th_vwaddu_wx_u64m8(op1_wx, op2_x, vl) + +#define __riscv_vwsub_vv_i16m2(op1_v, op2_v, vl) __riscv_th_vwsub_vv_i16m2(op1_v, op2_v, vl) +#define __riscv_vwsub_vv_i16m4(op1_v, op2_v, vl) __riscv_th_vwsub_vv_i16m4(op1_v, op2_v, vl) +#define __riscv_vwsub_vv_i16m8(op1_v, op2_v, vl) __riscv_th_vwsub_vv_i16m8(op1_v, op2_v, vl) +#define __riscv_vwsub_vv_i32m1(op1_v, op2_v, vl) __riscv_th_vwsub_vv_i32m1(op1_v, op2_v, vl) +#define __riscv_vwsub_vv_i32m2(op1_v, op2_v, vl) __riscv_th_vwsub_vv_i32m2(op1_v, op2_v, vl) +#define __riscv_vwsub_vv_i32m4(op1_v, op2_v, vl) __riscv_th_vwsub_vv_i32m4(op1_v, op2_v, vl) +#define __riscv_vwsub_vv_i32m8(op1_v, op2_v, vl) __riscv_th_vwsub_vv_i32m8(op1_v, op2_v, vl) +#define __riscv_vwsub_vv_i64m1(op1_v, op2_v, vl) __riscv_th_vwsub_vv_i64m1(op1_v, op2_v, vl) +#define __riscv_vwsub_vv_i64m2(op1_v, op2_v, vl) __riscv_th_vwsub_vv_i64m2(op1_v, op2_v, vl) +#define __riscv_vwsub_vv_i64m4(op1_v, op2_v, vl) __riscv_th_vwsub_vv_i64m4(op1_v, op2_v, vl) +#define __riscv_vwsub_vv_i64m8(op1_v, op2_v, vl) __riscv_th_vwsub_vv_i64m8(op1_v, op2_v, vl) + +#define __riscv_vwsubu_vv_u16m2(op1_v, op2_v, vl) __riscv_th_vwsubu_vv_u16m2(op1_v, op2_v, vl) +#define __riscv_vwsubu_vv_u16m4(op1_v, op2_v, vl) __riscv_th_vwsubu_vv_u16m4(op1_v, op2_v, vl) +#define __riscv_vwsubu_vv_u16m8(op1_v, op2_v, vl) __riscv_th_vwsubu_vv_u16m8(op1_v, op2_v, vl) +#define __riscv_vwsubu_vv_u32m1(op1_v, op2_v, vl) __riscv_th_vwsubu_vv_u32m1(op1_v, op2_v, vl) +#define __riscv_vwsubu_vv_u32m2(op1_v, op2_v, vl) __riscv_th_vwsubu_vv_u32m2(op1_v, op2_v, vl) +#define __riscv_vwsubu_vv_u32m4(op1_v, op2_v, vl) __riscv_th_vwsubu_vv_u32m4(op1_v, op2_v, vl) +#define __riscv_vwsubu_vv_u32m8(op1_v, op2_v, vl) __riscv_th_vwsubu_vv_u32m8(op1_v, op2_v, vl) +#define __riscv_vwsubu_vv_u64m1(op1_v, op2_v, vl) __riscv_th_vwsubu_vv_u64m1(op1_v, op2_v, vl) +#define __riscv_vwsubu_vv_u64m2(op1_v, op2_v, vl) __riscv_th_vwsubu_vv_u64m2(op1_v, op2_v, vl) +#define __riscv_vwsubu_vv_u64m4(op1_v, op2_v, vl) __riscv_th_vwsubu_vv_u64m4(op1_v, op2_v, vl) +#define __riscv_vwsubu_vv_u64m8(op1_v, op2_v, vl) __riscv_th_vwsubu_vv_u64m8(op1_v, op2_v, vl) + +#define __riscv_vwsub_vx_i16m2(op1_v, op2_x, vl) __riscv_th_vwsub_vx_i16m2(op1_v, op2_x, vl) +#define __riscv_vwsub_vx_i16m4(op1_v, op2_x, vl) __riscv_th_vwsub_vx_i16m4(op1_v, op2_x, vl) +#define __riscv_vwsub_vx_i16m8(op1_v, op2_x, vl) __riscv_th_vwsub_vx_i16m8(op1_v, op2_x, vl) +#define __riscv_vwsub_vx_i32m1(op1_v, op2_x, vl) __riscv_th_vwsub_vx_i32m1(op1_v, op2_x, vl) +#define __riscv_vwsub_vx_i32m2(op1_v, op2_x, vl) __riscv_th_vwsub_vx_i32m2(op1_v, op2_x, vl) +#define __riscv_vwsub_vx_i32m4(op1_v, op2_x, vl) __riscv_th_vwsub_vx_i32m4(op1_v, op2_x, vl) +#define __riscv_vwsub_vx_i32m8(op1_v, op2_x, vl) __riscv_th_vwsub_vx_i32m8(op1_v, op2_x, vl) +#define __riscv_vwsub_vx_i64m1(op1_v, op2_x, vl) __riscv_th_vwsub_vx_i64m1(op1_v, op2_x, vl) +#define __riscv_vwsub_vx_i64m2(op1_v, op2_x, vl) __riscv_th_vwsub_vx_i64m2(op1_v, op2_x, vl) +#define __riscv_vwsub_vx_i64m4(op1_v, op2_x, vl) __riscv_th_vwsub_vx_i64m4(op1_v, op2_x, vl) +#define __riscv_vwsub_vx_i64m8(op1_v, op2_x, vl) __riscv_th_vwsub_vx_i64m8(op1_v, op2_x, vl) + +#define __riscv_vwsubu_vx_u16m2(op1_v, op2_x, vl) __riscv_th_vwsubu_vx_u16m2(op1_v, op2_x, vl) +#define __riscv_vwsubu_vx_u16m4(op1_v, op2_x, vl) __riscv_th_vwsubu_vx_u16m4(op1_v, op2_x, vl) +#define __riscv_vwsubu_vx_u16m8(op1_v, op2_x, vl) __riscv_th_vwsubu_vx_u16m8(op1_v, op2_x, vl) +#define __riscv_vwsubu_vx_u32m1(op1_v, op2_x, vl) __riscv_th_vwsubu_vx_u32m1(op1_v, op2_x, vl) +#define __riscv_vwsubu_vx_u32m2(op1_v, op2_x, vl) __riscv_th_vwsubu_vx_u32m2(op1_v, op2_x, vl) +#define __riscv_vwsubu_vx_u32m4(op1_v, op2_x, vl) __riscv_th_vwsubu_vx_u32m4(op1_v, op2_x, vl) +#define __riscv_vwsubu_vx_u32m8(op1_v, op2_x, vl) __riscv_th_vwsubu_vx_u32m8(op1_v, op2_x, vl) +#define __riscv_vwsubu_vx_u64m1(op1_v, op2_x, vl) __riscv_th_vwsubu_vx_u64m1(op1_v, op2_x, vl) +#define __riscv_vwsubu_vx_u64m2(op1_v, op2_x, vl) __riscv_th_vwsubu_vx_u64m2(op1_v, op2_x, vl) +#define __riscv_vwsubu_vx_u64m4(op1_v, op2_x, vl) __riscv_th_vwsubu_vx_u64m4(op1_v, op2_x, vl) +#define __riscv_vwsubu_vx_u64m8(op1_v, op2_x, vl) __riscv_th_vwsubu_vx_u64m8(op1_v, op2_x, vl) + +#define __riscv_vwsub_wv_i16m2(op1_wv, op2_v, vl) __riscv_th_vwsub_wv_i16m2(op1_wv, op2_v, vl) +#define __riscv_vwsub_wv_i16m4(op1_wv, op2_v, vl) __riscv_th_vwsub_wv_i16m4(op1_wv, op2_v, vl) +#define __riscv_vwsub_wv_i16m8(op1_wv, op2_v, vl) __riscv_th_vwsub_wv_i16m8(op1_wv, op2_v, vl) +#define __riscv_vwsub_wv_i32m1(op1_wv, op2_v, vl) __riscv_th_vwsub_wv_i32m1(op1_wv, op2_v, vl) +#define __riscv_vwsub_wv_i32m2(op1_wv, op2_v, vl) __riscv_th_vwsub_wv_i32m2(op1_wv, op2_v, vl) +#define __riscv_vwsub_wv_i32m4(op1_wv, op2_v, vl) __riscv_th_vwsub_wv_i32m4(op1_wv, op2_v, vl) +#define __riscv_vwsub_wv_i32m8(op1_wv, op2_v, vl) __riscv_th_vwsub_wv_i32m8(op1_wv, op2_v, vl) +#define __riscv_vwsub_wv_i64m1(op1_wv, op2_v, vl) __riscv_th_vwsub_wv_i64m1(op1_wv, op2_v, vl) +#define __riscv_vwsub_wv_i64m2(op1_wv, op2_v, vl) __riscv_th_vwsub_wv_i64m2(op1_wv, op2_v, vl) +#define __riscv_vwsub_wv_i64m4(op1_wv, op2_v, vl) __riscv_th_vwsub_wv_i64m4(op1_wv, op2_v, vl) +#define __riscv_vwsub_wv_i64m8(op1_wv, op2_v, vl) __riscv_th_vwsub_wv_i64m8(op1_wv, op2_v, vl) + +#define __riscv_vwsubu_wv_u16m2(op1_wv, op2_v, vl) __riscv_th_vwsubu_wv_u16m2(op1_wv, op2_v, vl) +#define __riscv_vwsubu_wv_u16m4(op1_wv, op2_v, vl) __riscv_th_vwsubu_wv_u16m4(op1_wv, op2_v, vl) +#define __riscv_vwsubu_wv_u16m8(op1_wv, op2_v, vl) __riscv_th_vwsubu_wv_u16m8(op1_wv, op2_v, vl) +#define __riscv_vwsubu_wv_u32m1(op1_wv, op2_v, vl) __riscv_th_vwsubu_wv_u32m1(op1_wv, op2_v, vl) +#define __riscv_vwsubu_wv_u32m2(op1_wv, op2_v, vl) __riscv_th_vwsubu_wv_u32m2(op1_wv, op2_v, vl) +#define __riscv_vwsubu_wv_u32m4(op1_wv, op2_v, vl) __riscv_th_vwsubu_wv_u32m4(op1_wv, op2_v, vl) +#define __riscv_vwsubu_wv_u32m8(op1_wv, op2_v, vl) __riscv_th_vwsubu_wv_u32m8(op1_wv, op2_v, vl) +#define __riscv_vwsubu_wv_u64m1(op1_wv, op2_v, vl) __riscv_th_vwsubu_wv_u64m1(op1_wv, op2_v, vl) +#define __riscv_vwsubu_wv_u64m2(op1_wv, op2_v, vl) __riscv_th_vwsubu_wv_u64m2(op1_wv, op2_v, vl) +#define __riscv_vwsubu_wv_u64m4(op1_wv, op2_v, vl) __riscv_th_vwsubu_wv_u64m4(op1_wv, op2_v, vl) +#define __riscv_vwsubu_wv_u64m8(op1_wv, op2_v, vl) __riscv_th_vwsubu_wv_u64m8(op1_wv, op2_v, vl) + +#define __riscv_vwsub_wx_i16m1(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i16m1(op1_wx, op2_x, vl) +#define __riscv_vwsub_wx_i16m2(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i16m2(op1_wx, op2_x, vl) +#define __riscv_vwsub_wx_i16m4(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i16m4(op1_wx, op2_x, vl) +#define __riscv_vwsub_wx_i16m8(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i16m8(op1_wx, op2_x, vl) +#define __riscv_vwsub_wx_i32m1(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i32m1(op1_wx, op2_x, vl) +#define __riscv_vwsub_wx_i32m2(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i32m2(op1_wx, op2_x, vl) +#define __riscv_vwsub_wx_i32m4(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i32m4(op1_wx, op2_x, vl) +#define __riscv_vwsub_wx_i32m8(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i32m8(op1_wx, op2_x, vl) +#define __riscv_vwsub_wx_i64m1(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i64m1(op1_wx, op2_x, vl) +#define __riscv_vwsub_wx_i64m2(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i64m2(op1_wx, op2_x, vl) +#define __riscv_vwsub_wx_i64m4(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i64m4(op1_wx, op2_x, vl) +#define __riscv_vwsub_wx_i64m8(op1_wx, op2_x, vl) __riscv_th_vwsub_wx_i64m8(op1_wx, op2_x, vl) + +#define __riscv_vwsubu_wx_u16m1(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u16m1(op1_wx, op2_x, vl) +#define __riscv_vwsubu_wx_u16m2(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u16m2(op1_wx, op2_x, vl) +#define __riscv_vwsubu_wx_u16m4(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u16m4(op1_wx, op2_x, vl) +#define __riscv_vwsubu_wx_u16m8(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u16m8(op1_wx, op2_x, vl) +#define __riscv_vwsubu_wx_u32m1(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u32m1(op1_wx, op2_x, vl) +#define __riscv_vwsubu_wx_u32m2(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u32m2(op1_wx, op2_x, vl) +#define __riscv_vwsubu_wx_u32m4(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u32m4(op1_wx, op2_x, vl) +#define __riscv_vwsubu_wx_u32m8(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u32m8(op1_wx, op2_x, vl) +#define __riscv_vwsubu_wx_u64m1(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u64m1(op1_wx, op2_x, vl) +#define __riscv_vwsubu_wx_u64m2(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u64m2(op1_wx, op2_x, vl) +#define __riscv_vwsubu_wx_u64m4(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u64m4(op1_wx, op2_x, vl) +#define __riscv_vwsubu_wx_u64m8(op1_wx, op2_x, vl) __riscv_th_vwsubu_wx_u64m8(op1_wx, op2_x, vl) + +}] in +def th_widening_integer_add_wrapper_macros: RVVHeader; diff --git a/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwadd.c b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwadd.c new file mode 100644 index 00000000000000..10c4f08caabba6 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwadd.c @@ -0,0 +1,396 @@ +// RUN: %clang_cc1 -triple riscv64 -target-feature +xtheadvector \ +// RUN: -disable-O0-optnone -emit-llvm %s -o - | \ +// RUN: opt -S -passes=mem2reg | \ +// RUN: FileCheck --check-prefix=CHECK-RV64 %s + +#include + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i16m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv4i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m1_t test_vwadd_wx_i16m1(vint16m1_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i16m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i16.nxv8i8.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwadd_vv_i16m2(vint8m1_t op1, vint8m1_t op2, size_t vl) { + return __riscv_th_vwadd_vv_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i16.nxv8i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwadd_vx_i16m2(vint8m1_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwadd_vx_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i16.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwadd_wv_i16m2(vint16m2_t op1, vint8m1_t op2, size_t vl) { + return __riscv_th_vwadd_wv_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwadd_wx_i16m2(vint16m2_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv16i16.nxv16i8.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwadd_vv_i16m4(vint8m2_t op1, vint8m2_t op2, size_t vl) { + return __riscv_th_vwadd_vv_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv16i16.nxv16i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwadd_vx_i16m4(vint8m2_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwadd_vx_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv16i16.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwadd_wv_i16m4(vint16m4_t op1, vint8m2_t op2, size_t vl) { + return __riscv_th_vwadd_wv_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv16i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwadd_wx_i16m4(vint16m4_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv32i16.nxv32i8.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwadd_vv_i16m8(vint8m4_t op1, vint8m4_t op2, size_t vl) { + return __riscv_th_vwadd_vv_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv32i16.nxv32i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwadd_vx_i16m8(vint8m4_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwadd_vx_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv32i16.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwadd_wv_i16m8(vint16m8_t op1, vint8m4_t op2, size_t vl) { + return __riscv_th_vwadd_wv_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv32i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwadd_wx_i16m8(vint16m8_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i32m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv2i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m1_t test_vwadd_wx_i32m1(vint32m1_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i32m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv4i32.nxv4i16.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwadd_vv_i32m2(vint16m1_t op1, vint16m1_t op2, size_t vl) { + return __riscv_th_vwadd_vv_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv4i32.nxv4i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwadd_vx_i32m2(vint16m1_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwadd_vx_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv4i32.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwadd_wv_i32m2(vint32m2_t op1, vint16m1_t op2, size_t vl) { + return __riscv_th_vwadd_wv_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv4i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwadd_wx_i32m2(vint32m2_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i32.nxv8i16.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwadd_vv_i32m4(vint16m2_t op1, vint16m2_t op2, size_t vl) { + return __riscv_th_vwadd_vv_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i32.nxv8i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwadd_vx_i32m4(vint16m2_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwadd_vx_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i32.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwadd_wv_i32m4(vint32m4_t op1, vint16m2_t op2, size_t vl) { + return __riscv_th_vwadd_wv_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwadd_wx_i32m4(vint32m4_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv16i32.nxv16i16.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwadd_vv_i32m8(vint16m4_t op1, vint16m4_t op2, size_t vl) { + return __riscv_th_vwadd_vv_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv16i32.nxv16i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwadd_vx_i32m8(vint16m4_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwadd_vx_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv16i32.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwadd_wv_i32m8(vint32m8_t op1, vint16m4_t op2, size_t vl) { + return __riscv_th_vwadd_wv_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv16i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwadd_wx_i32m8(vint32m8_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i64m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv1i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m1_t test_vwadd_wx_i64m1(vint64m1_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i64m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv2i64.nxv2i32.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwadd_vv_i64m2(vint32m1_t op1, vint32m1_t op2, size_t vl) { + return __riscv_th_vwadd_vv_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv2i64.nxv2i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwadd_vx_i64m2(vint32m1_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwadd_vx_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv2i64.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwadd_wv_i64m2(vint64m2_t op1, vint32m1_t op2, size_t vl) { + return __riscv_th_vwadd_wv_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv2i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwadd_wx_i64m2(vint64m2_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv4i64.nxv4i32.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwadd_vv_i64m4(vint32m2_t op1, vint32m2_t op2, size_t vl) { + return __riscv_th_vwadd_vv_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv4i64.nxv4i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwadd_vx_i64m4(vint32m2_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwadd_vx_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv4i64.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwadd_wv_i64m4(vint64m4_t op1, vint32m2_t op2, size_t vl) { + return __riscv_th_vwadd_wv_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv4i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwadd_wx_i64m4(vint64m4_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i64.nxv8i32.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwadd_vv_i64m8(vint32m4_t op1, vint32m4_t op2, size_t vl) { + return __riscv_th_vwadd_vv_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i64.nxv8i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwadd_vx_i64m8(vint32m4_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwadd_vx_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i64.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwadd_wv_i64m8(vint64m8_t op1, vint32m4_t op2, size_t vl) { + return __riscv_th_vwadd_wv_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwadd_wx_i64m8(vint64m8_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwadd_wx_i64m8(op1, op2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwaddu.c b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwaddu.c new file mode 100644 index 00000000000000..81963c90346365 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwaddu.c @@ -0,0 +1,396 @@ +// RUN: %clang_cc1 -triple riscv64 -target-feature +xtheadvector \ +// RUN: -disable-O0-optnone -emit-llvm %s -o - | \ +// RUN: opt -S -passes=mem2reg | \ +// RUN: FileCheck --check-prefix=CHECK-RV64 %s + +#include + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u16m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv4i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m1_t test_vwaddu_wx_u16m1(vuint16m1_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u16m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i16.nxv8i8.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwaddu_vv_u16m2(vuint8m1_t op1, vuint8m1_t op2, size_t vl) { + return __riscv_th_vwaddu_vv_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i16.nxv8i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwaddu_vx_u16m2(vuint8m1_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwaddu_vx_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i16.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwaddu_wv_u16m2(vuint16m2_t op1, vuint8m1_t op2, size_t vl) { + return __riscv_th_vwaddu_wv_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwaddu_wx_u16m2(vuint16m2_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv16i16.nxv16i8.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwaddu_vv_u16m4(vuint8m2_t op1, vuint8m2_t op2, size_t vl) { + return __riscv_th_vwaddu_vv_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv16i16.nxv16i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwaddu_vx_u16m4(vuint8m2_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwaddu_vx_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv16i16.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwaddu_wv_u16m4(vuint16m4_t op1, vuint8m2_t op2, size_t vl) { + return __riscv_th_vwaddu_wv_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv16i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwaddu_wx_u16m4(vuint16m4_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv32i16.nxv32i8.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwaddu_vv_u16m8(vuint8m4_t op1, vuint8m4_t op2, size_t vl) { + return __riscv_th_vwaddu_vv_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv32i16.nxv32i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwaddu_vx_u16m8(vuint8m4_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwaddu_vx_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv32i16.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwaddu_wv_u16m8(vuint16m8_t op1, vuint8m4_t op2, size_t vl) { + return __riscv_th_vwaddu_wv_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv32i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwaddu_wx_u16m8(vuint16m8_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u32m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv2i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m1_t test_vwaddu_wx_u32m1(vuint32m1_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u32m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv4i32.nxv4i16.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwaddu_vv_u32m2(vuint16m1_t op1, vuint16m1_t op2, size_t vl) { + return __riscv_th_vwaddu_vv_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv4i32.nxv4i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwaddu_vx_u32m2(vuint16m1_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwaddu_vx_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv4i32.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwaddu_wv_u32m2(vuint32m2_t op1, vuint16m1_t op2, size_t vl) { + return __riscv_th_vwaddu_wv_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv4i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwaddu_wx_u32m2(vuint32m2_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i32.nxv8i16.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwaddu_vv_u32m4(vuint16m2_t op1, vuint16m2_t op2, size_t vl) { + return __riscv_th_vwaddu_vv_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i32.nxv8i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwaddu_vx_u32m4(vuint16m2_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwaddu_vx_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i32.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwaddu_wv_u32m4(vuint32m4_t op1, vuint16m2_t op2, size_t vl) { + return __riscv_th_vwaddu_wv_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwaddu_wx_u32m4(vuint32m4_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv16i32.nxv16i16.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwaddu_vv_u32m8(vuint16m4_t op1, vuint16m4_t op2, size_t vl) { + return __riscv_th_vwaddu_vv_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv16i32.nxv16i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwaddu_vx_u32m8(vuint16m4_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwaddu_vx_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv16i32.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwaddu_wv_u32m8(vuint32m8_t op1, vuint16m4_t op2, size_t vl) { + return __riscv_th_vwaddu_wv_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv16i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwaddu_wx_u32m8(vuint32m8_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u64m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv1i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m1_t test_vwaddu_wx_u64m1(vuint64m1_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u64m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv2i64.nxv2i32.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwaddu_vv_u64m2(vuint32m1_t op1, vuint32m1_t op2, size_t vl) { + return __riscv_th_vwaddu_vv_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv2i64.nxv2i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwaddu_vx_u64m2(vuint32m1_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwaddu_vx_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv2i64.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwaddu_wv_u64m2(vuint64m2_t op1, vuint32m1_t op2, size_t vl) { + return __riscv_th_vwaddu_wv_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv2i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwaddu_wx_u64m2(vuint64m2_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv4i64.nxv4i32.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwaddu_vv_u64m4(vuint32m2_t op1, vuint32m2_t op2, size_t vl) { + return __riscv_th_vwaddu_vv_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv4i64.nxv4i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwaddu_vx_u64m4(vuint32m2_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwaddu_vx_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv4i64.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwaddu_wv_u64m4(vuint64m4_t op1, vuint32m2_t op2, size_t vl) { + return __riscv_th_vwaddu_wv_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv4i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwaddu_wx_u64m4(vuint64m4_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i64.nxv8i32.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwaddu_vv_u64m8(vuint32m4_t op1, vuint32m4_t op2, size_t vl) { + return __riscv_th_vwaddu_vv_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i64.nxv8i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwaddu_vx_u64m8(vuint32m4_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwaddu_vx_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i64.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwaddu_wv_u64m8(vuint64m8_t op1, vuint32m4_t op2, size_t vl) { + return __riscv_th_vwaddu_wv_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwaddu_wx_u64m8(vuint64m8_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwaddu_wx_u64m8(op1, op2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwsub.c b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwsub.c new file mode 100644 index 00000000000000..d1c5c2ab6ce820 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwsub.c @@ -0,0 +1,396 @@ +// RUN: %clang_cc1 -triple riscv64 -target-feature +xtheadvector \ +// RUN: -disable-O0-optnone -emit-llvm %s -o - | \ +// RUN: opt -S -passes=mem2reg | \ +// RUN: FileCheck --check-prefix=CHECK-RV64 %s + +#include + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i16m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv4i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m1_t test_vwsub_wx_i16m1(vint16m1_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i16m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i16.nxv8i8.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwsub_vv_i16m2(vint8m1_t op1, vint8m1_t op2, size_t vl) { + return __riscv_th_vwsub_vv_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i16.nxv8i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwsub_vx_i16m2(vint8m1_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwsub_vx_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i16.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwsub_wv_i16m2(vint16m2_t op1, vint8m1_t op2, size_t vl) { + return __riscv_th_vwsub_wv_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwsub_wx_i16m2(vint16m2_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv16i16.nxv16i8.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwsub_vv_i16m4(vint8m2_t op1, vint8m2_t op2, size_t vl) { + return __riscv_th_vwsub_vv_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv16i16.nxv16i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwsub_vx_i16m4(vint8m2_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwsub_vx_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv16i16.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwsub_wv_i16m4(vint16m4_t op1, vint8m2_t op2, size_t vl) { + return __riscv_th_vwsub_wv_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv16i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwsub_wx_i16m4(vint16m4_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv32i16.nxv32i8.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwsub_vv_i16m8(vint8m4_t op1, vint8m4_t op2, size_t vl) { + return __riscv_th_vwsub_vv_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv32i16.nxv32i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwsub_vx_i16m8(vint8m4_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwsub_vx_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv32i16.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwsub_wv_i16m8(vint16m8_t op1, vint8m4_t op2, size_t vl) { + return __riscv_th_vwsub_wv_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv32i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwsub_wx_i16m8(vint16m8_t op1, int8_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i32m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv2i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m1_t test_vwsub_wx_i32m1(vint32m1_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i32m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv4i32.nxv4i16.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwsub_vv_i32m2(vint16m1_t op1, vint16m1_t op2, size_t vl) { + return __riscv_th_vwsub_vv_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv4i32.nxv4i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwsub_vx_i32m2(vint16m1_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwsub_vx_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv4i32.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwsub_wv_i32m2(vint32m2_t op1, vint16m1_t op2, size_t vl) { + return __riscv_th_vwsub_wv_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv4i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwsub_wx_i32m2(vint32m2_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i32.nxv8i16.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwsub_vv_i32m4(vint16m2_t op1, vint16m2_t op2, size_t vl) { + return __riscv_th_vwsub_vv_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i32.nxv8i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwsub_vx_i32m4(vint16m2_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwsub_vx_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i32.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwsub_wv_i32m4(vint32m4_t op1, vint16m2_t op2, size_t vl) { + return __riscv_th_vwsub_wv_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwsub_wx_i32m4(vint32m4_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv16i32.nxv16i16.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwsub_vv_i32m8(vint16m4_t op1, vint16m4_t op2, size_t vl) { + return __riscv_th_vwsub_vv_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv16i32.nxv16i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwsub_vx_i32m8(vint16m4_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwsub_vx_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv16i32.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwsub_wv_i32m8(vint32m8_t op1, vint16m4_t op2, size_t vl) { + return __riscv_th_vwsub_wv_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv16i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwsub_wx_i32m8(vint32m8_t op1, int16_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i64m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv1i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m1_t test_vwsub_wx_i64m1(vint64m1_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i64m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv2i64.nxv2i32.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwsub_vv_i64m2(vint32m1_t op1, vint32m1_t op2, size_t vl) { + return __riscv_th_vwsub_vv_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv2i64.nxv2i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwsub_vx_i64m2(vint32m1_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwsub_vx_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv2i64.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwsub_wv_i64m2(vint64m2_t op1, vint32m1_t op2, size_t vl) { + return __riscv_th_vwsub_wv_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv2i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwsub_wx_i64m2(vint64m2_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv4i64.nxv4i32.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwsub_vv_i64m4(vint32m2_t op1, vint32m2_t op2, size_t vl) { + return __riscv_th_vwsub_vv_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv4i64.nxv4i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwsub_vx_i64m4(vint32m2_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwsub_vx_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv4i64.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwsub_wv_i64m4(vint64m4_t op1, vint32m2_t op2, size_t vl) { + return __riscv_th_vwsub_wv_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv4i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwsub_wx_i64m4(vint64m4_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i64.nxv8i32.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwsub_vv_i64m8(vint32m4_t op1, vint32m4_t op2, size_t vl) { + return __riscv_th_vwsub_vv_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i64.nxv8i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwsub_vx_i64m8(vint32m4_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwsub_vx_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i64.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwsub_wv_i64m8(vint64m8_t op1, vint32m4_t op2, size_t vl) { + return __riscv_th_vwsub_wv_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwsub_wx_i64m8(vint64m8_t op1, int32_t op2, size_t vl) { + return __riscv_th_vwsub_wx_i64m8(op1, op2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwsubu.c b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwsubu.c new file mode 100644 index 00000000000000..37b6bd6687aab7 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/thead/vwsubu.c @@ -0,0 +1,396 @@ +// RUN: %clang_cc1 -triple riscv64 -target-feature +xtheadvector \ +// RUN: -disable-O0-optnone -emit-llvm %s -o - | \ +// RUN: opt -S -passes=mem2reg | \ +// RUN: FileCheck --check-prefix=CHECK-RV64 %s + +#include + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u16m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv4i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m1_t test_vwsubu_wx_u16m1(vuint16m1_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u16m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i16.nxv8i8.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwsubu_vv_u16m2(vuint8m1_t op1, vuint8m1_t op2, size_t vl) { + return __riscv_th_vwsubu_vv_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i16.nxv8i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwsubu_vx_u16m2(vuint8m1_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwsubu_vx_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i16.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwsubu_wv_u16m2(vuint16m2_t op1, vuint8m1_t op2, size_t vl) { + return __riscv_th_vwsubu_wv_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwsubu_wx_u16m2(vuint16m2_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv16i16.nxv16i8.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwsubu_vv_u16m4(vuint8m2_t op1, vuint8m2_t op2, size_t vl) { + return __riscv_th_vwsubu_vv_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv16i16.nxv16i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwsubu_vx_u16m4(vuint8m2_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwsubu_vx_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv16i16.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwsubu_wv_u16m4(vuint16m4_t op1, vuint8m2_t op2, size_t vl) { + return __riscv_th_vwsubu_wv_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv16i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwsubu_wx_u16m4(vuint16m4_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv32i16.nxv32i8.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwsubu_vv_u16m8(vuint8m4_t op1, vuint8m4_t op2, size_t vl) { + return __riscv_th_vwsubu_vv_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv32i16.nxv32i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwsubu_vx_u16m8(vuint8m4_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwsubu_vx_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv32i16.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwsubu_wv_u16m8(vuint16m8_t op1, vuint8m4_t op2, size_t vl) { + return __riscv_th_vwsubu_wv_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv32i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwsubu_wx_u16m8(vuint16m8_t op1, uint8_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u32m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv2i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m1_t test_vwsubu_wx_u32m1(vuint32m1_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u32m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv4i32.nxv4i16.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwsubu_vv_u32m2(vuint16m1_t op1, vuint16m1_t op2, size_t vl) { + return __riscv_th_vwsubu_vv_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv4i32.nxv4i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwsubu_vx_u32m2(vuint16m1_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwsubu_vx_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv4i32.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwsubu_wv_u32m2(vuint32m2_t op1, vuint16m1_t op2, size_t vl) { + return __riscv_th_vwsubu_wv_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv4i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwsubu_wx_u32m2(vuint32m2_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i32.nxv8i16.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwsubu_vv_u32m4(vuint16m2_t op1, vuint16m2_t op2, size_t vl) { + return __riscv_th_vwsubu_vv_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i32.nxv8i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwsubu_vx_u32m4(vuint16m2_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwsubu_vx_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i32.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwsubu_wv_u32m4(vuint32m4_t op1, vuint16m2_t op2, size_t vl) { + return __riscv_th_vwsubu_wv_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwsubu_wx_u32m4(vuint32m4_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv16i32.nxv16i16.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwsubu_vv_u32m8(vuint16m4_t op1, vuint16m4_t op2, size_t vl) { + return __riscv_th_vwsubu_vv_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv16i32.nxv16i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwsubu_vx_u32m8(vuint16m4_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwsubu_vx_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv16i32.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwsubu_wv_u32m8(vuint32m8_t op1, vuint16m4_t op2, size_t vl) { + return __riscv_th_vwsubu_wv_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv16i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwsubu_wx_u32m8(vuint32m8_t op1, uint16_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u64m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv1i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m1_t test_vwsubu_wx_u64m1(vuint64m1_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u64m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv2i64.nxv2i32.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwsubu_vv_u64m2(vuint32m1_t op1, vuint32m1_t op2, size_t vl) { + return __riscv_th_vwsubu_vv_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv2i64.nxv2i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwsubu_vx_u64m2(vuint32m1_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwsubu_vx_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv2i64.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwsubu_wv_u64m2(vuint64m2_t op1, vuint32m1_t op2, size_t vl) { + return __riscv_th_vwsubu_wv_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv2i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwsubu_wx_u64m2(vuint64m2_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv4i64.nxv4i32.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwsubu_vv_u64m4(vuint32m2_t op1, vuint32m2_t op2, size_t vl) { + return __riscv_th_vwsubu_vv_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv4i64.nxv4i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwsubu_vx_u64m4(vuint32m2_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwsubu_vx_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv4i64.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwsubu_wv_u64m4(vuint64m4_t op1, vuint32m2_t op2, size_t vl) { + return __riscv_th_vwsubu_wv_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv4i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwsubu_wx_u64m4(vuint64m4_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i64.nxv8i32.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwsubu_vv_u64m8(vuint32m4_t op1, vuint32m4_t op2, size_t vl) { + return __riscv_th_vwsubu_vv_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i64.nxv8i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwsubu_vx_u64m8(vuint32m4_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwsubu_vx_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i64.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwsubu_wv_u64m8(vuint64m8_t op1, vuint32m4_t op2, size_t vl) { + return __riscv_th_vwsubu_wv_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwsubu_wx_u64m8(vuint64m8_t op1, uint32_t op2, size_t vl) { + return __riscv_th_vwsubu_wx_u64m8(op1, op2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwadd.c b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwadd.c new file mode 100644 index 00000000000000..e77a1b06470d2c --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwadd.c @@ -0,0 +1,396 @@ +// RUN: %clang_cc1 -triple riscv64 -target-feature +xtheadvector \ +// RUN: -disable-O0-optnone -emit-llvm %s -o - | \ +// RUN: opt -S -passes=mem2reg | \ +// RUN: FileCheck --check-prefix=CHECK-RV64 %s + +#include + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i16m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv4i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m1_t test_vwadd_wx_i16m1(vint16m1_t op1, int8_t op2, size_t vl) { + return __riscv_vwadd_wx_i16m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i16.nxv8i8.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwadd_vv_i16m2(vint8m1_t op1, vint8m1_t op2, size_t vl) { + return __riscv_vwadd_vv_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i16.nxv8i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwadd_vx_i16m2(vint8m1_t op1, int8_t op2, size_t vl) { + return __riscv_vwadd_vx_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i16.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwadd_wv_i16m2(vint16m2_t op1, vint8m1_t op2, size_t vl) { + return __riscv_vwadd_wv_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwadd_wx_i16m2(vint16m2_t op1, int8_t op2, size_t vl) { + return __riscv_vwadd_wx_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv16i16.nxv16i8.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwadd_vv_i16m4(vint8m2_t op1, vint8m2_t op2, size_t vl) { + return __riscv_vwadd_vv_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv16i16.nxv16i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwadd_vx_i16m4(vint8m2_t op1, int8_t op2, size_t vl) { + return __riscv_vwadd_vx_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv16i16.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwadd_wv_i16m4(vint16m4_t op1, vint8m2_t op2, size_t vl) { + return __riscv_vwadd_wv_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv16i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwadd_wx_i16m4(vint16m4_t op1, int8_t op2, size_t vl) { + return __riscv_vwadd_wx_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv32i16.nxv32i8.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwadd_vv_i16m8(vint8m4_t op1, vint8m4_t op2, size_t vl) { + return __riscv_vwadd_vv_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv32i16.nxv32i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwadd_vx_i16m8(vint8m4_t op1, int8_t op2, size_t vl) { + return __riscv_vwadd_vx_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv32i16.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwadd_wv_i16m8(vint16m8_t op1, vint8m4_t op2, size_t vl) { + return __riscv_vwadd_wv_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv32i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwadd_wx_i16m8(vint16m8_t op1, int8_t op2, size_t vl) { + return __riscv_vwadd_wx_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i32m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv2i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m1_t test_vwadd_wx_i32m1(vint32m1_t op1, int16_t op2, size_t vl) { + return __riscv_vwadd_wx_i32m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv4i32.nxv4i16.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwadd_vv_i32m2(vint16m1_t op1, vint16m1_t op2, size_t vl) { + return __riscv_vwadd_vv_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv4i32.nxv4i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwadd_vx_i32m2(vint16m1_t op1, int16_t op2, size_t vl) { + return __riscv_vwadd_vx_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv4i32.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwadd_wv_i32m2(vint32m2_t op1, vint16m1_t op2, size_t vl) { + return __riscv_vwadd_wv_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv4i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwadd_wx_i32m2(vint32m2_t op1, int16_t op2, size_t vl) { + return __riscv_vwadd_wx_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i32.nxv8i16.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwadd_vv_i32m4(vint16m2_t op1, vint16m2_t op2, size_t vl) { + return __riscv_vwadd_vv_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i32.nxv8i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwadd_vx_i32m4(vint16m2_t op1, int16_t op2, size_t vl) { + return __riscv_vwadd_vx_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i32.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwadd_wv_i32m4(vint32m4_t op1, vint16m2_t op2, size_t vl) { + return __riscv_vwadd_wv_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwadd_wx_i32m4(vint32m4_t op1, int16_t op2, size_t vl) { + return __riscv_vwadd_wx_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv16i32.nxv16i16.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwadd_vv_i32m8(vint16m4_t op1, vint16m4_t op2, size_t vl) { + return __riscv_vwadd_vv_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv16i32.nxv16i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwadd_vx_i32m8(vint16m4_t op1, int16_t op2, size_t vl) { + return __riscv_vwadd_vx_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv16i32.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwadd_wv_i32m8(vint32m8_t op1, vint16m4_t op2, size_t vl) { + return __riscv_vwadd_wv_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv16i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwadd_wx_i32m8(vint32m8_t op1, int16_t op2, size_t vl) { + return __riscv_vwadd_wx_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i64m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv1i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m1_t test_vwadd_wx_i64m1(vint64m1_t op1, int32_t op2, size_t vl) { + return __riscv_vwadd_wx_i64m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv2i64.nxv2i32.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwadd_vv_i64m2(vint32m1_t op1, vint32m1_t op2, size_t vl) { + return __riscv_vwadd_vv_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv2i64.nxv2i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwadd_vx_i64m2(vint32m1_t op1, int32_t op2, size_t vl) { + return __riscv_vwadd_vx_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv2i64.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwadd_wv_i64m2(vint64m2_t op1, vint32m1_t op2, size_t vl) { + return __riscv_vwadd_wv_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv2i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwadd_wx_i64m2(vint64m2_t op1, int32_t op2, size_t vl) { + return __riscv_vwadd_wx_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv4i64.nxv4i32.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwadd_vv_i64m4(vint32m2_t op1, vint32m2_t op2, size_t vl) { + return __riscv_vwadd_vv_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv4i64.nxv4i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwadd_vx_i64m4(vint32m2_t op1, int32_t op2, size_t vl) { + return __riscv_vwadd_vx_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv4i64.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwadd_wv_i64m4(vint64m4_t op1, vint32m2_t op2, size_t vl) { + return __riscv_vwadd_wv_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv4i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwadd_wx_i64m4(vint64m4_t op1, int32_t op2, size_t vl) { + return __riscv_vwadd_wx_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vv_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i64.nxv8i32.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwadd_vv_i64m8(vint32m4_t op1, vint32m4_t op2, size_t vl) { + return __riscv_vwadd_vv_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_vx_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.nxv8i64.nxv8i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwadd_vx_i64m8(vint32m4_t op1, int32_t op2, size_t vl) { + return __riscv_vwadd_vx_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wv_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i64.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwadd_wv_i64m8(vint64m8_t op1, vint32m4_t op2, size_t vl) { + return __riscv_vwadd_wv_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwadd_wx_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwadd.w.nxv8i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwadd_wx_i64m8(vint64m8_t op1, int32_t op2, size_t vl) { + return __riscv_vwadd_wx_i64m8(op1, op2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwaddu.c b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwaddu.c new file mode 100644 index 00000000000000..1553704f9b6bb8 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwaddu.c @@ -0,0 +1,396 @@ +// RUN: %clang_cc1 -triple riscv64 -target-feature +xtheadvector \ +// RUN: -disable-O0-optnone -emit-llvm %s -o - | \ +// RUN: opt -S -passes=mem2reg | \ +// RUN: FileCheck --check-prefix=CHECK-RV64 %s + +#include + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u16m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv4i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m1_t test_vwaddu_wx_u16m1(vuint16m1_t op1, uint8_t op2, size_t vl) { + return __riscv_vwaddu_wx_u16m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i16.nxv8i8.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwaddu_vv_u16m2(vuint8m1_t op1, vuint8m1_t op2, size_t vl) { + return __riscv_vwaddu_vv_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i16.nxv8i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwaddu_vx_u16m2(vuint8m1_t op1, uint8_t op2, size_t vl) { + return __riscv_vwaddu_vx_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i16.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwaddu_wv_u16m2(vuint16m2_t op1, vuint8m1_t op2, size_t vl) { + return __riscv_vwaddu_wv_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwaddu_wx_u16m2(vuint16m2_t op1, uint8_t op2, size_t vl) { + return __riscv_vwaddu_wx_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv16i16.nxv16i8.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwaddu_vv_u16m4(vuint8m2_t op1, vuint8m2_t op2, size_t vl) { + return __riscv_vwaddu_vv_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv16i16.nxv16i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwaddu_vx_u16m4(vuint8m2_t op1, uint8_t op2, size_t vl) { + return __riscv_vwaddu_vx_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv16i16.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwaddu_wv_u16m4(vuint16m4_t op1, vuint8m2_t op2, size_t vl) { + return __riscv_vwaddu_wv_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv16i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwaddu_wx_u16m4(vuint16m4_t op1, uint8_t op2, size_t vl) { + return __riscv_vwaddu_wx_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv32i16.nxv32i8.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwaddu_vv_u16m8(vuint8m4_t op1, vuint8m4_t op2, size_t vl) { + return __riscv_vwaddu_vv_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv32i16.nxv32i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwaddu_vx_u16m8(vuint8m4_t op1, uint8_t op2, size_t vl) { + return __riscv_vwaddu_vx_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv32i16.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwaddu_wv_u16m8(vuint16m8_t op1, vuint8m4_t op2, size_t vl) { + return __riscv_vwaddu_wv_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv32i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwaddu_wx_u16m8(vuint16m8_t op1, uint8_t op2, size_t vl) { + return __riscv_vwaddu_wx_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u32m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv2i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m1_t test_vwaddu_wx_u32m1(vuint32m1_t op1, uint16_t op2, size_t vl) { + return __riscv_vwaddu_wx_u32m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv4i32.nxv4i16.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwaddu_vv_u32m2(vuint16m1_t op1, vuint16m1_t op2, size_t vl) { + return __riscv_vwaddu_vv_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv4i32.nxv4i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwaddu_vx_u32m2(vuint16m1_t op1, uint16_t op2, size_t vl) { + return __riscv_vwaddu_vx_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv4i32.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwaddu_wv_u32m2(vuint32m2_t op1, vuint16m1_t op2, size_t vl) { + return __riscv_vwaddu_wv_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv4i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwaddu_wx_u32m2(vuint32m2_t op1, uint16_t op2, size_t vl) { + return __riscv_vwaddu_wx_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i32.nxv8i16.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwaddu_vv_u32m4(vuint16m2_t op1, vuint16m2_t op2, size_t vl) { + return __riscv_vwaddu_vv_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i32.nxv8i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwaddu_vx_u32m4(vuint16m2_t op1, uint16_t op2, size_t vl) { + return __riscv_vwaddu_vx_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i32.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwaddu_wv_u32m4(vuint32m4_t op1, vuint16m2_t op2, size_t vl) { + return __riscv_vwaddu_wv_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwaddu_wx_u32m4(vuint32m4_t op1, uint16_t op2, size_t vl) { + return __riscv_vwaddu_wx_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv16i32.nxv16i16.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwaddu_vv_u32m8(vuint16m4_t op1, vuint16m4_t op2, size_t vl) { + return __riscv_vwaddu_vv_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv16i32.nxv16i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwaddu_vx_u32m8(vuint16m4_t op1, uint16_t op2, size_t vl) { + return __riscv_vwaddu_vx_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv16i32.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwaddu_wv_u32m8(vuint32m8_t op1, vuint16m4_t op2, size_t vl) { + return __riscv_vwaddu_wv_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv16i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwaddu_wx_u32m8(vuint32m8_t op1, uint16_t op2, size_t vl) { + return __riscv_vwaddu_wx_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u64m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv1i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m1_t test_vwaddu_wx_u64m1(vuint64m1_t op1, uint32_t op2, size_t vl) { + return __riscv_vwaddu_wx_u64m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv2i64.nxv2i32.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwaddu_vv_u64m2(vuint32m1_t op1, vuint32m1_t op2, size_t vl) { + return __riscv_vwaddu_vv_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv2i64.nxv2i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwaddu_vx_u64m2(vuint32m1_t op1, uint32_t op2, size_t vl) { + return __riscv_vwaddu_vx_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv2i64.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwaddu_wv_u64m2(vuint64m2_t op1, vuint32m1_t op2, size_t vl) { + return __riscv_vwaddu_wv_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv2i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwaddu_wx_u64m2(vuint64m2_t op1, uint32_t op2, size_t vl) { + return __riscv_vwaddu_wx_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv4i64.nxv4i32.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwaddu_vv_u64m4(vuint32m2_t op1, vuint32m2_t op2, size_t vl) { + return __riscv_vwaddu_vv_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv4i64.nxv4i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwaddu_vx_u64m4(vuint32m2_t op1, uint32_t op2, size_t vl) { + return __riscv_vwaddu_vx_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv4i64.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwaddu_wv_u64m4(vuint64m4_t op1, vuint32m2_t op2, size_t vl) { + return __riscv_vwaddu_wv_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv4i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwaddu_wx_u64m4(vuint64m4_t op1, uint32_t op2, size_t vl) { + return __riscv_vwaddu_wx_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vv_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i64.nxv8i32.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwaddu_vv_u64m8(vuint32m4_t op1, vuint32m4_t op2, size_t vl) { + return __riscv_vwaddu_vv_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_vx_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.nxv8i64.nxv8i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwaddu_vx_u64m8(vuint32m4_t op1, uint32_t op2, size_t vl) { + return __riscv_vwaddu_vx_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wv_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i64.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwaddu_wv_u64m8(vuint64m8_t op1, vuint32m4_t op2, size_t vl) { + return __riscv_vwaddu_wv_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwaddu_wx_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwaddu.w.nxv8i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwaddu_wx_u64m8(vuint64m8_t op1, uint32_t op2, size_t vl) { + return __riscv_vwaddu_wx_u64m8(op1, op2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwsub.c b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwsub.c new file mode 100644 index 00000000000000..c42e7ef37a1a3b --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwsub.c @@ -0,0 +1,396 @@ +// RUN: %clang_cc1 -triple riscv64 -target-feature +xtheadvector \ +// RUN: -disable-O0-optnone -emit-llvm %s -o - | \ +// RUN: opt -S -passes=mem2reg | \ +// RUN: FileCheck --check-prefix=CHECK-RV64 %s + +#include + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i16m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv4i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m1_t test_vwsub_wx_i16m1(vint16m1_t op1, int8_t op2, size_t vl) { + return __riscv_vwsub_wx_i16m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i16.nxv8i8.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwsub_vv_i16m2(vint8m1_t op1, vint8m1_t op2, size_t vl) { + return __riscv_vwsub_vv_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i16.nxv8i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwsub_vx_i16m2(vint8m1_t op1, int8_t op2, size_t vl) { + return __riscv_vwsub_vx_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i16.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwsub_wv_i16m2(vint16m2_t op1, vint8m1_t op2, size_t vl) { + return __riscv_vwsub_wv_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m2_t test_vwsub_wx_i16m2(vint16m2_t op1, int8_t op2, size_t vl) { + return __riscv_vwsub_wx_i16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv16i16.nxv16i8.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwsub_vv_i16m4(vint8m2_t op1, vint8m2_t op2, size_t vl) { + return __riscv_vwsub_vv_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv16i16.nxv16i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwsub_vx_i16m4(vint8m2_t op1, int8_t op2, size_t vl) { + return __riscv_vwsub_vx_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv16i16.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwsub_wv_i16m4(vint16m4_t op1, vint8m2_t op2, size_t vl) { + return __riscv_vwsub_wv_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv16i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m4_t test_vwsub_wx_i16m4(vint16m4_t op1, int8_t op2, size_t vl) { + return __riscv_vwsub_wx_i16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv32i16.nxv32i8.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwsub_vv_i16m8(vint8m4_t op1, vint8m4_t op2, size_t vl) { + return __riscv_vwsub_vv_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv32i16.nxv32i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwsub_vx_i16m8(vint8m4_t op1, int8_t op2, size_t vl) { + return __riscv_vwsub_vx_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv32i16.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwsub_wv_i16m8(vint16m8_t op1, vint8m4_t op2, size_t vl) { + return __riscv_vwsub_wv_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv32i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint16m8_t test_vwsub_wx_i16m8(vint16m8_t op1, int8_t op2, size_t vl) { + return __riscv_vwsub_wx_i16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i32m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv2i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m1_t test_vwsub_wx_i32m1(vint32m1_t op1, int16_t op2, size_t vl) { + return __riscv_vwsub_wx_i32m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv4i32.nxv4i16.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwsub_vv_i32m2(vint16m1_t op1, vint16m1_t op2, size_t vl) { + return __riscv_vwsub_vv_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv4i32.nxv4i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwsub_vx_i32m2(vint16m1_t op1, int16_t op2, size_t vl) { + return __riscv_vwsub_vx_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv4i32.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwsub_wv_i32m2(vint32m2_t op1, vint16m1_t op2, size_t vl) { + return __riscv_vwsub_wv_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv4i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m2_t test_vwsub_wx_i32m2(vint32m2_t op1, int16_t op2, size_t vl) { + return __riscv_vwsub_wx_i32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i32.nxv8i16.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwsub_vv_i32m4(vint16m2_t op1, vint16m2_t op2, size_t vl) { + return __riscv_vwsub_vv_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i32.nxv8i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwsub_vx_i32m4(vint16m2_t op1, int16_t op2, size_t vl) { + return __riscv_vwsub_vx_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i32.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwsub_wv_i32m4(vint32m4_t op1, vint16m2_t op2, size_t vl) { + return __riscv_vwsub_wv_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m4_t test_vwsub_wx_i32m4(vint32m4_t op1, int16_t op2, size_t vl) { + return __riscv_vwsub_wx_i32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv16i32.nxv16i16.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwsub_vv_i32m8(vint16m4_t op1, vint16m4_t op2, size_t vl) { + return __riscv_vwsub_vv_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv16i32.nxv16i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwsub_vx_i32m8(vint16m4_t op1, int16_t op2, size_t vl) { + return __riscv_vwsub_vx_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv16i32.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwsub_wv_i32m8(vint32m8_t op1, vint16m4_t op2, size_t vl) { + return __riscv_vwsub_wv_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv16i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint32m8_t test_vwsub_wx_i32m8(vint32m8_t op1, int16_t op2, size_t vl) { + return __riscv_vwsub_wx_i32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i64m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv1i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m1_t test_vwsub_wx_i64m1(vint64m1_t op1, int32_t op2, size_t vl) { + return __riscv_vwsub_wx_i64m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv2i64.nxv2i32.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwsub_vv_i64m2(vint32m1_t op1, vint32m1_t op2, size_t vl) { + return __riscv_vwsub_vv_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv2i64.nxv2i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwsub_vx_i64m2(vint32m1_t op1, int32_t op2, size_t vl) { + return __riscv_vwsub_vx_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv2i64.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwsub_wv_i64m2(vint64m2_t op1, vint32m1_t op2, size_t vl) { + return __riscv_vwsub_wv_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv2i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m2_t test_vwsub_wx_i64m2(vint64m2_t op1, int32_t op2, size_t vl) { + return __riscv_vwsub_wx_i64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv4i64.nxv4i32.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwsub_vv_i64m4(vint32m2_t op1, vint32m2_t op2, size_t vl) { + return __riscv_vwsub_vv_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv4i64.nxv4i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwsub_vx_i64m4(vint32m2_t op1, int32_t op2, size_t vl) { + return __riscv_vwsub_vx_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv4i64.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwsub_wv_i64m4(vint64m4_t op1, vint32m2_t op2, size_t vl) { + return __riscv_vwsub_wv_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv4i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m4_t test_vwsub_wx_i64m4(vint64m4_t op1, int32_t op2, size_t vl) { + return __riscv_vwsub_wx_i64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vv_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i64.nxv8i32.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwsub_vv_i64m8(vint32m4_t op1, vint32m4_t op2, size_t vl) { + return __riscv_vwsub_vv_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_vx_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.nxv8i64.nxv8i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwsub_vx_i64m8(vint32m4_t op1, int32_t op2, size_t vl) { + return __riscv_vwsub_vx_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wv_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i64.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwsub_wv_i64m8(vint64m8_t op1, vint32m4_t op2, size_t vl) { + return __riscv_vwsub_wv_i64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsub_wx_i64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsub.w.nxv8i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vint64m8_t test_vwsub_wx_i64m8(vint64m8_t op1, int32_t op2, size_t vl) { + return __riscv_vwsub_wx_i64m8(op1, op2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwsubu.c b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwsubu.c new file mode 100644 index 00000000000000..b2f7874fed35d9 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv0p71-intrinsics-handcrafted/vector-widening-add/wrappers/vwsubu.c @@ -0,0 +1,396 @@ +// RUN: %clang_cc1 -triple riscv64 -target-feature +xtheadvector \ +// RUN: -disable-O0-optnone -emit-llvm %s -o - | \ +// RUN: opt -S -passes=mem2reg | \ +// RUN: FileCheck --check-prefix=CHECK-RV64 %s + +#include + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u16m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv4i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m1_t test_vwsubu_wx_u16m1(vuint16m1_t op1, uint8_t op2, size_t vl) { + return __riscv_vwsubu_wx_u16m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i16.nxv8i8.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwsubu_vv_u16m2(vuint8m1_t op1, vuint8m1_t op2, size_t vl) { + return __riscv_vwsubu_vv_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i16.nxv8i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwsubu_vx_u16m2(vuint8m1_t op1, uint8_t op2, size_t vl) { + return __riscv_vwsubu_vx_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i16.nxv8i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwsubu_wv_u16m2(vuint16m2_t op1, vuint8m1_t op2, size_t vl) { + return __riscv_vwsubu_wv_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u16m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m2_t test_vwsubu_wx_u16m2(vuint16m2_t op1, uint8_t op2, size_t vl) { + return __riscv_vwsubu_wx_u16m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv16i16.nxv16i8.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwsubu_vv_u16m4(vuint8m2_t op1, vuint8m2_t op2, size_t vl) { + return __riscv_vwsubu_vv_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv16i16.nxv16i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwsubu_vx_u16m4(vuint8m2_t op1, uint8_t op2, size_t vl) { + return __riscv_vwsubu_vx_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv16i16.nxv16i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwsubu_wv_u16m4(vuint16m4_t op1, vuint8m2_t op2, size_t vl) { + return __riscv_vwsubu_wv_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u16m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv16i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m4_t test_vwsubu_wx_u16m4(vuint16m4_t op1, uint8_t op2, size_t vl) { + return __riscv_vwsubu_wx_u16m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv32i16.nxv32i8.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwsubu_vv_u16m8(vuint8m4_t op1, vuint8m4_t op2, size_t vl) { + return __riscv_vwsubu_vv_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv32i16.nxv32i8.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwsubu_vx_u16m8(vuint8m4_t op1, uint8_t op2, size_t vl) { + return __riscv_vwsubu_vx_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv32i16.nxv32i8.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwsubu_wv_u16m8(vuint16m8_t op1, vuint8m4_t op2, size_t vl) { + return __riscv_vwsubu_wv_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u16m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i8 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv32i16.i8.i64( poison, [[OP1]], i8 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint16m8_t test_vwsubu_wx_u16m8(vuint16m8_t op1, uint8_t op2, size_t vl) { + return __riscv_vwsubu_wx_u16m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u32m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv2i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m1_t test_vwsubu_wx_u32m1(vuint32m1_t op1, uint16_t op2, size_t vl) { + return __riscv_vwsubu_wx_u32m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv4i32.nxv4i16.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwsubu_vv_u32m2(vuint16m1_t op1, vuint16m1_t op2, size_t vl) { + return __riscv_vwsubu_vv_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv4i32.nxv4i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwsubu_vx_u32m2(vuint16m1_t op1, uint16_t op2, size_t vl) { + return __riscv_vwsubu_vx_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv4i32.nxv4i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwsubu_wv_u32m2(vuint32m2_t op1, vuint16m1_t op2, size_t vl) { + return __riscv_vwsubu_wv_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u32m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv4i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m2_t test_vwsubu_wx_u32m2(vuint32m2_t op1, uint16_t op2, size_t vl) { + return __riscv_vwsubu_wx_u32m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i32.nxv8i16.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwsubu_vv_u32m4(vuint16m2_t op1, vuint16m2_t op2, size_t vl) { + return __riscv_vwsubu_vv_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i32.nxv8i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwsubu_vx_u32m4(vuint16m2_t op1, uint16_t op2, size_t vl) { + return __riscv_vwsubu_vx_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i32.nxv8i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwsubu_wv_u32m4(vuint32m4_t op1, vuint16m2_t op2, size_t vl) { + return __riscv_vwsubu_wv_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u32m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m4_t test_vwsubu_wx_u32m4(vuint32m4_t op1, uint16_t op2, size_t vl) { + return __riscv_vwsubu_wx_u32m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv16i32.nxv16i16.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwsubu_vv_u32m8(vuint16m4_t op1, vuint16m4_t op2, size_t vl) { + return __riscv_vwsubu_vv_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv16i32.nxv16i16.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwsubu_vx_u32m8(vuint16m4_t op1, uint16_t op2, size_t vl) { + return __riscv_vwsubu_vx_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv16i32.nxv16i16.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwsubu_wv_u32m8(vuint32m8_t op1, vuint16m4_t op2, size_t vl) { + return __riscv_vwsubu_wv_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u32m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i16 noundef zeroext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv16i32.i16.i64( poison, [[OP1]], i16 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint32m8_t test_vwsubu_wx_u32m8(vuint32m8_t op1, uint16_t op2, size_t vl) { + return __riscv_vwsubu_wx_u32m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u64m1 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv1i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m1_t test_vwsubu_wx_u64m1(vuint64m1_t op1, uint32_t op2, size_t vl) { + return __riscv_vwsubu_wx_u64m1(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv2i64.nxv2i32.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwsubu_vv_u64m2(vuint32m1_t op1, vuint32m1_t op2, size_t vl) { + return __riscv_vwsubu_vv_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv2i64.nxv2i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwsubu_vx_u64m2(vuint32m1_t op1, uint32_t op2, size_t vl) { + return __riscv_vwsubu_vx_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv2i64.nxv2i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwsubu_wv_u64m2(vuint64m2_t op1, vuint32m1_t op2, size_t vl) { + return __riscv_vwsubu_wv_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u64m2 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv2i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m2_t test_vwsubu_wx_u64m2(vuint64m2_t op1, uint32_t op2, size_t vl) { + return __riscv_vwsubu_wx_u64m2(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv4i64.nxv4i32.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwsubu_vv_u64m4(vuint32m2_t op1, vuint32m2_t op2, size_t vl) { + return __riscv_vwsubu_vv_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv4i64.nxv4i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwsubu_vx_u64m4(vuint32m2_t op1, uint32_t op2, size_t vl) { + return __riscv_vwsubu_vx_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv4i64.nxv4i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwsubu_wv_u64m4(vuint64m4_t op1, vuint32m2_t op2, size_t vl) { + return __riscv_vwsubu_wv_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u64m4 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv4i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m4_t test_vwsubu_wx_u64m4(vuint64m4_t op1, uint32_t op2, size_t vl) { + return __riscv_vwsubu_wx_u64m4(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vv_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i64.nxv8i32.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwsubu_vv_u64m8(vuint32m4_t op1, vuint32m4_t op2, size_t vl) { + return __riscv_vwsubu_vv_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_vx_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.nxv8i64.nxv8i32.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwsubu_vx_u64m8(vuint32m4_t op1, uint32_t op2, size_t vl) { + return __riscv_vwsubu_vx_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wv_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i64.nxv8i32.i64( poison, [[OP1]], [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwsubu_wv_u64m8(vuint64m8_t op1, vuint32m4_t op2, size_t vl) { + return __riscv_vwsubu_wv_u64m8(op1, op2, vl); +} + +// CHECK-RV64-LABEL: define dso_local @test_vwsubu_wx_u64m8 +// CHECK-RV64-SAME: ( [[OP1:%.*]], i32 noundef signext [[OP2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT: entry: +// CHECK-RV64-NEXT: [[TMP0:%.*]] = call @llvm.riscv.th.vwsubu.w.nxv8i64.i32.i64( poison, [[OP1]], i32 [[OP2]], i64 [[VL]]) +// CHECK-RV64-NEXT: ret [[TMP0]] +// +vuint64m8_t test_vwsubu_wx_u64m8(vuint64m8_t op1, uint32_t op2, size_t vl) { + return __riscv_vwsubu_wx_u64m8(op1, op2, vl); +}