mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-16 17:38:14 +00:00
R600/SI: Fix mad*k definitions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230146 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b430a06e94
commit
dc9d5dcdd7
@ -291,6 +291,8 @@ void AMDGPUInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
|
||||
printImmediate64(Op.getImm(), O);
|
||||
else
|
||||
llvm_unreachable("Invalid register class size");
|
||||
} else if (Desc.OpInfo[OpNo].OperandType == MCOI::OPERAND_IMMEDIATE) {
|
||||
printImmediate32(Op.getImm(), O);
|
||||
} else {
|
||||
// We hit this for the immediate instruction bits that don't yet have a
|
||||
// custom printer.
|
||||
|
@ -298,6 +298,21 @@ class VOP2e <bits<6> op> : Enc32 {
|
||||
let Inst{31} = 0x0; //encoding
|
||||
}
|
||||
|
||||
class VOP2_MADKe <bits<6> op> : Enc64 {
|
||||
|
||||
bits<8> vdst;
|
||||
bits<9> src0;
|
||||
bits<8> vsrc1;
|
||||
bits<32> src2;
|
||||
|
||||
let Inst{8-0} = src0;
|
||||
let Inst{16-9} = vsrc1;
|
||||
let Inst{24-17} = vdst;
|
||||
let Inst{30-25} = op;
|
||||
let Inst{31} = 0x0; // encoding
|
||||
let Inst{63-32} = src2;
|
||||
}
|
||||
|
||||
class VOP3e <bits<9> op> : Enc64 {
|
||||
bits<8> vdst;
|
||||
bits<2> src0_modifiers;
|
||||
|
@ -801,6 +801,10 @@ def VOP_I64_I32_I64 : VOPProfile <[i64, i32, i64, untyped]>;
|
||||
def VOP_I64_I64_I64 : VOPProfile <[i64, i64, i64, untyped]>;
|
||||
|
||||
def VOP_F32_F32_F32_F32 : VOPProfile <[f32, f32, f32, f32]>;
|
||||
def VOP_MADK : VOPProfile <[f32, f32, f32, f32]> {
|
||||
field dag Ins = (ins VCSrc_32:$src0, VGPR_32:$vsrc1, u32imm:$src2);
|
||||
field string Asm = " $dst, $src0, $vsrc1, $src2";
|
||||
}
|
||||
def VOP_F64_F64_F64_F64 : VOPProfile <[f64, f64, f64, f64]>;
|
||||
def VOP_I32_I32_I32_I32 : VOPProfile <[i32, i32, i32, i32]>;
|
||||
def VOP_I64_I32_I32_I64 : VOPProfile <[i64, i32, i32, i64]>;
|
||||
@ -1205,6 +1209,23 @@ multiclass VOP2_VI3_Inst <vop23 op, string opName, VOPProfile P,
|
||||
revOp, P.HasModifiers
|
||||
>;
|
||||
|
||||
multiclass VOP2MADK <vop2 op, string opName, list<dag> pattern = []> {
|
||||
|
||||
def "" : VOP2_Pseudo <VOP_MADK.Outs, VOP_MADK.Ins, pattern, opName>;
|
||||
|
||||
let isCodeGenOnly = 0 in {
|
||||
def _si : VOP2Common <VOP_MADK.Outs, VOP_MADK.Ins,
|
||||
!strconcat(opName, VOP_MADK.Asm), []>,
|
||||
SIMCInstr <opName#"_e32", SISubtarget.SI>,
|
||||
VOP2_MADKe <op.SI>;
|
||||
|
||||
def _vi : VOP2Common <VOP_MADK.Outs, VOP_MADK.Ins,
|
||||
!strconcat(opName, VOP_MADK.Asm), []>,
|
||||
SIMCInstr <opName#"_e32", SISubtarget.VI>,
|
||||
VOP2_MADKe <op.VI>;
|
||||
} // End isCodeGenOnly = 0
|
||||
}
|
||||
|
||||
class VOPC_Pseudo <dag outs, dag ins, list<dag> pattern, string opName> :
|
||||
VOPCCommon <ins, "", pattern>,
|
||||
VOP <opName>,
|
||||
|
@ -1494,10 +1494,10 @@ defm V_XOR_B32 : VOP2Inst <vop2<0x1d, 0x15>, "v_xor_b32", VOP_I32_I32_I32>;
|
||||
defm V_MAC_F32 : VOP2Inst <vop2<0x1f, 0x16>, "v_mac_f32", VOP_F32_F32_F32>;
|
||||
} // End isCommutable = 1
|
||||
|
||||
defm V_MADMK_F32 : VOP2Inst <vop2<0x20, 0x17>, "v_madmk_f32", VOP_F32_F32_F32>;
|
||||
defm V_MADMK_F32 : VOP2MADK <vop2<0x20, 0x17>, "v_madmk_f32">;
|
||||
|
||||
let isCommutable = 1 in {
|
||||
defm V_MADAK_F32 : VOP2Inst <vop2<0x21, 0x18>, "v_madak_f32", VOP_F32_F32_F32>;
|
||||
defm V_MADAK_F32 : VOP2MADK <vop2<0x21, 0x18>, "v_madak_f32">;
|
||||
} // End isCommutable = 1
|
||||
|
||||
let isCommutable = 1, Defs = [VCC] in { // Carry-out goes to VCC
|
||||
|
Loading…
x
Reference in New Issue
Block a user