Skip to content

Commit

Permalink
[Clang][XTHeadVector] Implement 13.5 vnclip/vnclipu (ruyisdk#90)
Browse files Browse the repository at this point in the history
* [Clang][XTHeadVector] Implement 13.5 `vnclip/vnclipu`

* [Clang][XTHeadVector] Implement 13.5 `vnclip/vnclipu` wrapper macros
  • Loading branch information
imkiva committed Feb 26, 2025
1 parent 18f8400 commit 8f6ffa4
Show file tree
Hide file tree
Showing 4 changed files with 866 additions and 0 deletions.
48 changes: 48 additions & 0 deletions clang/include/clang/Basic/riscv_vector_xtheadv.td
Original file line number Diff line number Diff line change
Expand Up @@ -1041,5 +1041,53 @@ let UnMaskedPolicyScheme = HasPassthruOperand,
defm th_vsmul : RVVSignedBinBuiltinSetRoundingMode;
}

// 13.5 Vector Narrowing Fixed-Point Clip Operations
let UnMaskedPolicyScheme = HasPassthruOperand,
MaskedPolicyScheme = HasPassthruOperand,
ManualCodegen = [{
{
// LLVM intrinsic
// Unmasked: (passthru, op0, op1, vxrm, vl)
// Masked: (passthru, vector_in, vector_in/scalar_in, mask, vxrm, vl)

// Clang builtin
// Unmask: (op1, op2, vxrm, vl)
// Mask: (mask, op1, op2, vxrm, vl)

SmallVector<llvm::Value*, 7> Operands;
bool HasMaskedOff = !(
(IsMasked && (PolicyAttrs & RVV_VTA) && (PolicyAttrs & RVV_VMA)) ||
(!IsMasked && PolicyAttrs & RVV_VTA));
unsigned Offset = IsMasked ?
(HasMaskedOff ? 2 : 1) : (HasMaskedOff ? 1 : 0);

if (!HasMaskedOff)
Operands.push_back(llvm::PoisonValue::get(ResultType));
else
Operands.push_back(Ops[IsMasked ? 1 : 0]);

Operands.push_back(Ops[Offset]); // op0
Operands.push_back(Ops[Offset + 1]); // op1

if (IsMasked)
Operands.push_back(Ops[0]); // mask

Operands.push_back(Ops[Offset + 2]); // vxrm
Operands.push_back(Ops[Offset + 3]); // vl

// TODO: no policy in LLVM side for masked intrinsics.
// if (IsMasked)
// Operands.push_back(ConstantInt::get(Ops.back()->getType(), PolicyAttrs));

IntrinsicTypes = {ResultType, Ops[Offset]->getType(), Ops[Offset + 1]->getType(),
Ops.back()->getType()};
llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
return Builder.CreateCall(F, Operands, "");
}
}] in {
// 13.5. Vector Narrowing Fixed-Point Clip Instructions
defm th_vnclipu : RVVUnsignedNShiftBuiltinSetRoundingMode;
defm th_vnclip : RVVSignedNShiftBuiltinSetRoundingMode;
}

include "riscv_vector_xtheadv_wrappers.td"
84 changes: 84 additions & 0 deletions clang/include/clang/Basic/riscv_vector_xtheadv_wrappers.td
Original file line number Diff line number Diff line change
Expand Up @@ -2189,3 +2189,87 @@ let HeaderCode =

}] in
def th_single_width_fractional_multiply_with_rounding_and_saturation_wrapper_macros: RVVHeader;

// 13.5. Vector Narrowing Fixed-Point Clip Operations

let HeaderCode =
[{
// Vector Narrowing Fixed-Point Clip Operations
#define __riscv_vnclip_wv_i8m1(op1, op2, rm, vl) __riscv_th_vnclip_wv_i8m1(op1, op2, rm, vl)
#define __riscv_vnclip_wx_i8m1(op1, op2, rm, vl) __riscv_th_vnclip_wx_i8m1(op1, op2, rm, vl)
#define __riscv_vnclip_wv_i8m2(op1, op2, rm, vl) __riscv_th_vnclip_wv_i8m2(op1, op2, rm, vl)
#define __riscv_vnclip_wx_i8m2(op1, op2, rm, vl) __riscv_th_vnclip_wx_i8m2(op1, op2, rm, vl)
#define __riscv_vnclip_wv_i8m4(op1, op2, rm, vl) __riscv_th_vnclip_wv_i8m4(op1, op2, rm, vl)
#define __riscv_vnclip_wx_i8m4(op1, op2, rm, vl) __riscv_th_vnclip_wx_i8m4(op1, op2, rm, vl)
#define __riscv_vnclip_wv_i16m1(op1, op2, rm, vl) __riscv_th_vnclip_wv_i16m1(op1, op2, rm, vl)
#define __riscv_vnclip_wx_i16m1(op1, op2, rm, vl) __riscv_th_vnclip_wx_i16m1(op1, op2, rm, vl)
#define __riscv_vnclip_wv_i16m2(op1, op2, rm, vl) __riscv_th_vnclip_wv_i16m2(op1, op2, rm, vl)
#define __riscv_vnclip_wx_i16m2(op1, op2, rm, vl) __riscv_th_vnclip_wx_i16m2(op1, op2, rm, vl)
#define __riscv_vnclip_wv_i16m4(op1, op2, rm, vl) __riscv_th_vnclip_wv_i16m4(op1, op2, rm, vl)
#define __riscv_vnclip_wx_i16m4(op1, op2, rm, vl) __riscv_th_vnclip_wx_i16m4(op1, op2, rm, vl)
#define __riscv_vnclip_wv_i32m1(op1, op2, rm, vl) __riscv_th_vnclip_wv_i32m1(op1, op2, rm, vl)
#define __riscv_vnclip_wx_i32m1(op1, op2, rm, vl) __riscv_th_vnclip_wx_i32m1(op1, op2, rm, vl)
#define __riscv_vnclip_wv_i32m2(op1, op2, rm, vl) __riscv_th_vnclip_wv_i32m2(op1, op2, rm, vl)
#define __riscv_vnclip_wx_i32m2(op1, op2, rm, vl) __riscv_th_vnclip_wx_i32m2(op1, op2, rm, vl)
#define __riscv_vnclip_wv_i32m4(op1, op2, rm, vl) __riscv_th_vnclip_wv_i32m4(op1, op2, rm, vl)
#define __riscv_vnclip_wx_i32m4(op1, op2, rm, vl) __riscv_th_vnclip_wx_i32m4(op1, op2, rm, vl)

#define __riscv_vnclip_wv_i8m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wv_i8m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wx_i8m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wx_i8m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wv_i8m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wv_i8m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wx_i8m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wx_i8m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wv_i8m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wv_i8m4_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wx_i8m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wx_i8m4_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wv_i16m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wv_i16m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wx_i16m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wx_i16m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wv_i16m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wv_i16m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wx_i16m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wx_i16m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wv_i16m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wv_i16m4_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wx_i16m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wx_i16m4_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wv_i32m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wv_i32m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wx_i32m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wx_i32m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wv_i32m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wv_i32m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wx_i32m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wx_i32m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wv_i32m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wv_i32m4_m(mask, op1, op2, rm, vl)
#define __riscv_vnclip_wx_i32m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclip_wx_i32m4_m(mask, op1, op2, rm, vl)

#define __riscv_vnclipu_wv_u8m1(op1, op2, rm, vl) __riscv_th_vnclipu_wv_u8m1(op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u8m1(op1, op2, rm, vl) __riscv_th_vnclipu_wx_u8m1(op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u8m2(op1, op2, rm, vl) __riscv_th_vnclipu_wv_u8m2(op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u8m2(op1, op2, rm, vl) __riscv_th_vnclipu_wx_u8m2(op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u8m4(op1, op2, rm, vl) __riscv_th_vnclipu_wv_u8m4(op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u8m4(op1, op2, rm, vl) __riscv_th_vnclipu_wx_u8m4(op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u16m1(op1, op2, rm, vl) __riscv_th_vnclipu_wv_u16m1(op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u16m1(op1, op2, rm, vl) __riscv_th_vnclipu_wx_u16m1(op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u16m2(op1, op2, rm, vl) __riscv_th_vnclipu_wv_u16m2(op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u16m2(op1, op2, rm, vl) __riscv_th_vnclipu_wx_u16m2(op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u16m4(op1, op2, rm, vl) __riscv_th_vnclipu_wv_u16m4(op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u16m4(op1, op2, rm, vl) __riscv_th_vnclipu_wx_u16m4(op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u32m1(op1, op2, rm, vl) __riscv_th_vnclipu_wv_u32m1(op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u32m1(op1, op2, rm, vl) __riscv_th_vnclipu_wx_u32m1(op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u32m2(op1, op2, rm, vl) __riscv_th_vnclipu_wv_u32m2(op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u32m2(op1, op2, rm, vl) __riscv_th_vnclipu_wx_u32m2(op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u32m4(op1, op2, rm, vl) __riscv_th_vnclipu_wv_u32m4(op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u32m4(op1, op2, rm, vl) __riscv_th_vnclipu_wx_u32m4(op1, op2, rm, vl)

#define __riscv_vnclipu_wv_u8m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wv_u8m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u8m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wx_u8m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u8m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wv_u8m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u8m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wx_u8m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u8m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wv_u8m4_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u8m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wx_u8m4_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u16m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wv_u16m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u16m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wx_u16m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u16m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wv_u16m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u16m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wx_u16m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u16m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wv_u16m4_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u16m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wx_u16m4_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u32m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wv_u32m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u32m1_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wx_u32m1_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u32m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wv_u32m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u32m2_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wx_u32m2_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wv_u32m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wv_u32m4_m(mask, op1, op2, rm, vl)
#define __riscv_vnclipu_wx_u32m4_m(mask, op1, op2, rm, vl) __riscv_th_vnclipu_wx_u32m4_m(mask, op1, op2, rm, vl)

}] in
def th_narrowing_width_fixed_point_clip_wrapper_macros: RVVHeader;
Loading

0 comments on commit 8f6ffa4

Please sign in to comment.