From 70120fa813539dfa9c97facf05db5fc52282b807 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Sat, 21 Feb 2015 21:29:00 +0000 Subject: [PATCH] R600/SI: Fix mad*k definitions llvm-svn: 230146 --- .../Target/R600/InstPrinter/AMDGPUInstPrinter.cpp | 2 ++ llvm/lib/Target/R600/SIInstrFormats.td | 15 +++++++++++++++ llvm/lib/Target/R600/SIInstrInfo.td | 21 +++++++++++++++++++++ llvm/lib/Target/R600/SIInstructions.td | 4 ++-- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp b/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp index 8271c6f4..b66ed10 100644 --- a/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp +++ b/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp @@ -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. diff --git a/llvm/lib/Target/R600/SIInstrFormats.td b/llvm/lib/Target/R600/SIInstrFormats.td index d376b85..c90c741 100644 --- a/llvm/lib/Target/R600/SIInstrFormats.td +++ b/llvm/lib/Target/R600/SIInstrFormats.td @@ -298,6 +298,21 @@ class VOP2e op> : Enc32 { let Inst{31} = 0x0; //encoding } +class VOP2_MADKe 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 op> : Enc64 { bits<8> vdst; bits<2> src0_modifiers; diff --git a/llvm/lib/Target/R600/SIInstrInfo.td b/llvm/lib/Target/R600/SIInstrInfo.td index b7bee29..9f5d3e8 100644 --- a/llvm/lib/Target/R600/SIInstrInfo.td +++ b/llvm/lib/Target/R600/SIInstrInfo.td @@ -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 ; +multiclass VOP2MADK pattern = []> { + + def "" : VOP2_Pseudo ; + +let isCodeGenOnly = 0 in { + def _si : VOP2Common , + SIMCInstr , + VOP2_MADKe ; + + def _vi : VOP2Common , + SIMCInstr , + VOP2_MADKe ; +} // End isCodeGenOnly = 0 +} + class VOPC_Pseudo pattern, string opName> : VOPCCommon , VOP , diff --git a/llvm/lib/Target/R600/SIInstructions.td b/llvm/lib/Target/R600/SIInstructions.td index 4c51b6f..4f72e99 100644 --- a/llvm/lib/Target/R600/SIInstructions.td +++ b/llvm/lib/Target/R600/SIInstructions.td @@ -1494,10 +1494,10 @@ defm V_XOR_B32 : VOP2Inst , "v_xor_b32", VOP_I32_I32_I32>; defm V_MAC_F32 : VOP2Inst , "v_mac_f32", VOP_F32_F32_F32>; } // End isCommutable = 1 -defm V_MADMK_F32 : VOP2Inst , "v_madmk_f32", VOP_F32_F32_F32>; +defm V_MADMK_F32 : VOP2MADK , "v_madmk_f32">; let isCommutable = 1 in { -defm V_MADAK_F32 : VOP2Inst , "v_madak_f32", VOP_F32_F32_F32>; +defm V_MADAK_F32 : VOP2MADK , "v_madak_f32">; } // End isCommutable = 1 let isCommutable = 1, Defs = [VCC] in { // Carry-out goes to VCC -- 2.7.4