From: Tom Stellard Date: Mon, 5 Oct 2015 17:57:39 +0000 (+0000) Subject: AMDGPU/SI: Add a helper for creating aliases for the _e32 instructions X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d0c6de8696fabd89aa0ec4f2a8e6e8d69fdb1dba;p=oota-llvm.git AMDGPU/SI: Add a helper for creating aliases for the _e32 instructions Summary: We are currently only using these aliases for VOPC instructions, but this helper will make it easier to use them everywhere. These aliases allow for the automatic matching of instructions with forced 32-bit encoding. Eventually, we should be able to remove the custom C++ logic we have for this in the assembler. Reviewers: arsenm Subscribers: arsenm, llvm-commits Differential Revision: http://reviews.llvm.org/D13396 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249330 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/AMDGPU/SIInstrInfo.td b/lib/Target/AMDGPU/SIInstrInfo.td index a90ed1db1b9..d309109420f 100644 --- a/lib/Target/AMDGPU/SIInstrInfo.td +++ b/lib/Target/AMDGPU/SIInstrInfo.td @@ -1122,6 +1122,7 @@ class VOPProfile _ArgVT> { field RegisterOperand Src1RC64 = getVOP3SrcForVT.ret; field RegisterOperand Src2RC64 = getVOP3SrcForVT.ret; + field bit HasDst32 = !if(!eq(DstVT, untyped), 0, 1); field int NumSrcArgs = getNumSrcArgs.ret; field bit HasModifiers = hasModifiers.ret; @@ -1210,6 +1211,8 @@ def VOP3b_F64_I1_F64_F64_F64 : VOP3b_Profile { // an explicit $dst. class VOPC_Profile : VOPProfile <[i1, vt0, vt1, untyped]> { let Asm32 = "vcc, $src0, $src1"; + // The destination for 32-bit encoding is implicit. + let HasDst32 = 0; } class VOPC_Class_Profile : VOPC_Profile { @@ -1250,10 +1253,52 @@ 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]>; -class SIInstAlias : InstAlias , - PredicateControl { +class SIInstAlias : + InstAlias , PredicateControl { + field bit isCompare; field bit isCommutable; + + let ResultInst = + !if (p.HasDst32, + !if (!eq(p.NumSrcArgs, 0), + // 1 dst, 0 src + (inst p.DstRC:$dst), + !if (!eq(p.NumSrcArgs, 1), + // 1 dst, 1 src + (inst p.DstRC:$dst, p.Src0RC32:$src0), + !if (!eq(p.NumSrcArgs, 2), + // 1 dst, 2 src + (inst p.DstRC:$dst, p.Src0RC32:$src0, p.Src1RC32:$src1), + // else - unreachable + (inst)))), + // else + !if (!eq(p.NumSrcArgs, 2), + // 0 dst, 2 src + (inst p.Src0RC32:$src0, p.Src1RC32:$src1), + !if (!eq(p.NumSrcArgs, 1), + // 0 dst, 1 src + (inst p.Src0RC32:$src1), + // else + // 0 dst, 0 src + (inst)))); +} + +class SIInstAliasSI : + SIInstAlias (op_name#"_e32_si"), p> { + let AssemblerPredicate = SIAssemblerPredicate; +} + +class SIInstAliasVI : + SIInstAlias (op_name#"_e32_vi"), p> { + let AssemblerPredicates = [isVI]; +} + +multiclass SIInstAliasBuilder { + + def : SIInstAliasSI ; + + def : SIInstAliasVI ; } class VOP { @@ -1712,11 +1757,6 @@ multiclass VOPC_m pattern, let SchedRW = sched; } - def : SIInstAlias < - alias_asm, - (!cast(NAME#"_e32_si") p.Src0RC32:$src0, p.Src1RC32:$src1) - >; - } // End AssemblerPredicates = [isSICI] let AssemblerPredicates = [isVI] in { @@ -1727,11 +1767,9 @@ multiclass VOPC_m pattern, let SchedRW = sched; } - def : SIInstAlias < - alias_asm, - (!cast(NAME#"_e32_vi") p.Src0RC32:$src0, p.Src1RC32:$src1) - >; } // End AssemblerPredicates = [isVI] + + defm : SIInstAliasBuilder; } multiclass VOPC_Helper