123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- //===-- RISCVInstrInfoXTHead.td ----------------------------*- tablegen -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file describes the vendor extensions defined by T-Head of Alibaba.
- //
- //===----------------------------------------------------------------------===//
- //===----------------------------------------------------------------------===//
- // Instruction class templates
- //===----------------------------------------------------------------------===//
- class THInstVdotVV<bits<6> funct6, RISCVVFormat opv, dag outs, dag ins,
- string opcodestr, string argstr>
- : RVInstVV<funct6, opv, outs, ins, opcodestr, argstr> {
- let Inst{26} = 0;
- let Opcode = OPC_CUSTOM_0.Value;
- let DecoderNamespace = "THeadV";
- }
- class THInstVdotVX<bits<6> funct6, RISCVVFormat opv, dag outs, dag ins,
- string opcodestr, string argstr>
- : RVInstVX<funct6, opv, outs, ins, opcodestr, argstr> {
- let Inst{26} = 1;
- let Opcode = OPC_CUSTOM_0.Value;
- let DecoderNamespace = "THeadV";
- }
- let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
- // op vd, vs1, vs2, vm (reverse the order of vs1 and vs2)
- class THVdotALUrVV<bits<6> funct6, RISCVVFormat opv, string opcodestr>
- : THInstVdotVV<funct6, opv, (outs VR:$vd),
- (ins VR:$vs1, VR:$vs2, VMaskOp:$vm),
- opcodestr, "$vd, $vs1, $vs2$vm">;
- // op vd, rs1, vs2, vm (reverse the order of rs1 and vs2)
- class THVdotALUrVX<bits<6> funct6, RISCVVFormat opv, string opcodestr>
- : THInstVdotVX<funct6, opv, (outs VR:$vd),
- (ins GPR:$rs1, VR:$vs2, VMaskOp:$vm),
- opcodestr, "$vd, $rs1, $vs2$vm">;
- } // hasSideEffects = 0, mayLoad = 0, mayStore = 0
- //===----------------------------------------------------------------------===//
- // Combination of instruction classes.
- // Use these multiclasses to define instructions more easily.
- //===----------------------------------------------------------------------===//
- multiclass THVdotVMAQA_VX<string opcodestr, bits<6> funct6> {
- def _VX : THVdotALUrVX<funct6, OPMVX, opcodestr # ".vx">;
- }
- multiclass THVdotVMAQA<string opcodestr, bits<6> funct6> {
- def _VV : THVdotALUrVV<funct6, OPMVX, opcodestr # ".vv">;
- defm "" : THVdotVMAQA_VX<opcodestr, funct6>;
- }
- //===----------------------------------------------------------------------===//
- // Instructions
- //===----------------------------------------------------------------------===//
- let Predicates = [HasVendorXTHeadVdot],
- Constraints = "@earlyclobber $vd",
- RVVConstraint = WidenV in {
- defm THVdotVMAQA : THVdotVMAQA<"th.vmaqa", 0b100000>;
- defm THVdotVMAQAU : THVdotVMAQA<"th.vmaqau", 0b100010>;
- defm THVdotVMAQASU : THVdotVMAQA<"th.vmaqasu", 0b100100>;
- defm THVdotVMAQAUS : THVdotVMAQA_VX<"th.vmaqaus",0b100110>;
- }
- // Associate LMUL with tablegen records of register classes.
- def THVdotV_M1 : LMULInfo<0b000, 8, VR, VR, VR, VR, VR, "M1">;
- def THVdotV_M2 : LMULInfo<0b001, 16, VRM2, VRM2, VR, VR, VR, "M2">;
- def THVdotV_M4 : LMULInfo<0b010, 32, VRM4, VRM4, VRM2, VR, VR, "M4">;
- def THVdotV_M8 : LMULInfo<0b011, 64, VRM8, VRM8, VRM4, VRM2, VR, "M8">;
- defvar MxListTHVdot = [V_MF2, THVdotV_M1, THVdotV_M2, THVdotV_M4, THVdotV_M8];
- defset list<VTypeInfoToWide> AllQuadWidenableInt8NoVLMulVectors = {
- def : VTypeInfoToWide<VI8MF2, VI32MF2>;
- def : VTypeInfoToWide<VI8M1, VI32M1>;
- def : VTypeInfoToWide<VI8M2, VI32M2>;
- def : VTypeInfoToWide<VI8M4, VI32M4>;
- def : VTypeInfoToWide<VI8M8, VI32M8>;
- }
- //===----------------------------------------------------------------------===//
- // Combination of instruction classes.
- // Use these multiclasses to define instructions more easily.
- //===----------------------------------------------------------------------===//
- multiclass VPseudoVMAQA_VV_VX {
- foreach m = MxListTHVdot in {
- defm "" : VPseudoTernaryW_VV<m>;
- defm "" : VPseudoTernaryW_VX<m>;
- }
- }
- multiclass VPseudoVMAQA_VX {
- foreach m = MxListTHVdot in {
- defm "" : VPseudoTernaryW_VX<m>;
- }
- }
- multiclass VPatTernaryVMAQA_VV<string intrinsic, string instruction,
- list<VTypeInfoToWide> vtilist> {
- foreach vtiToWti = vtilist in {
- defvar vti = vtiToWti.Vti;
- defvar wti = vtiToWti.Wti;
- defm : VPatTernaryWithPolicy<intrinsic, instruction, "VV",
- wti.Vector, vti.Vector, vti.Vector,
- vti.Mask, wti.Log2SEW, vti.LMul,
- wti.RegClass, vti.RegClass, vti.RegClass>;
- }
- }
- multiclass VPatTernaryVMAQA_VX<string intrinsic, string instruction,
- list<VTypeInfoToWide> vtilist> {
- foreach vtiToWti = vtilist in {
- defvar vti = vtiToWti.Vti;
- defvar wti = vtiToWti.Wti;
- defm : VPatTernaryWithPolicy<intrinsic, instruction,
- "V"#vti.ScalarSuffix,
- wti.Vector, vti.Scalar, vti.Vector,
- vti.Mask, wti.Log2SEW, vti.LMul,
- wti.RegClass, vti.ScalarRegClass, vti.RegClass>;
- }
- }
- multiclass VPatTernaryVMAQA_VV_VX<string intrinsic, string instruction,
- list<VTypeInfoToWide> vtilist>
- : VPatTernaryVMAQA_VV<intrinsic, instruction, vtilist>,
- VPatTernaryVMAQA_VX<intrinsic, instruction, vtilist>;
- //===----------------------------------------------------------------------===//
- // Pseudo-instructions and codegen patterns
- //===----------------------------------------------------------------------===//
- defm PseudoTHVdotVMAQA : VPseudoVMAQA_VV_VX;
- defm PseudoTHVdotVMAQAU : VPseudoVMAQA_VV_VX;
- defm PseudoTHVdotVMAQASU : VPseudoVMAQA_VV_VX;
- defm PseudoTHVdotVMAQAUS : VPseudoVMAQA_VX;
- let Predicates = [HasVendorXTHeadVdot] in {
- defm : VPatTernaryVMAQA_VV_VX<"int_riscv_th_vmaqa", "PseudoTHVdotVMAQA", AllQuadWidenableInt8NoVLMulVectors>;
- defm : VPatTernaryVMAQA_VV_VX<"int_riscv_th_vmaqau", "PseudoTHVdotVMAQAU", AllQuadWidenableInt8NoVLMulVectors>;
- defm : VPatTernaryVMAQA_VV_VX<"int_riscv_th_vmaqasu","PseudoTHVdotVMAQASU",AllQuadWidenableInt8NoVLMulVectors>;
- defm : VPatTernaryVMAQA_VX<"int_riscv_th_vmaqaus", "PseudoTHVdotVMAQAUS",AllQuadWidenableInt8NoVLMulVectors>;
- }
|