From 3111d0ae12bdcd402b90fe6d5043db26ef3a1960 Mon Sep 17 00:00:00 2001 From: Marek Olsak Date: Tue, 27 Jan 2015 17:24:54 +0000 Subject: [PATCH] R600/SI: Add pseudos for MUBUF loads and stores This defines the SI versions only, so it shouldn't change anything. There are no changes other than using the new multiclasses, adding missing mayLoad/mayStore, and formatting fixes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227208 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/R600/SIInstrInfo.td | 228 ++++++++++++++++++--------------- 1 file changed, 125 insertions(+), 103 deletions(-) diff --git a/lib/Target/R600/SIInstrInfo.td b/lib/Target/R600/SIInstrInfo.td index 175e11d709c..a5294093e25 100644 --- a/lib/Target/R600/SIInstrInfo.td +++ b/lib/Target/R600/SIInstrInfo.td @@ -1596,9 +1596,70 @@ multiclass MTBUF_Load_Helper op, string opName, // MUBUF classes //===----------------------------------------------------------------------===// +class MUBUFAddr64Table { + bit IsAddr64 = is_addr64; + string OpName = NAME # suffix; +} + +class MUBUF_Pseudo pattern> : + MUBUF , + SIMCInstr { + let isPseudo = 1; + + // dummy fields, so that we can use let statements around multiclasses + bits<1> offen; + bits<1> idxen; + bits<8> vaddr; + bits<1> glc; + bits<1> slc; + bits<1> tfe; + bits<8> soffset; +} + +class MUBUF_Real_si op, string opName, dag outs, dag ins, + string asm> : + MUBUF , + MUBUFe , + SIMCInstr { + let lds = 0; +} + +class MUBUF_Real_vi op, string opName, dag outs, dag ins, + string asm> : + MUBUF , + MUBUFe_vi , + SIMCInstr { + let lds = 0; +} + +multiclass MUBUF_m op, string opName, dag outs, dag ins, string asm, + list pattern> { + + def "" : MUBUF_Pseudo , + MUBUFAddr64Table <0>; + + let addr64 = 0 in { + def _si : MUBUF_Real_si ; + } +} + +multiclass MUBUFAddr64_m op, string opName, dag outs, + dag ins, string asm, list pattern> { + + def "" : MUBUF_Pseudo , + MUBUFAddr64Table <1>; + + let addr64 = 1 in { + def _si : MUBUF_Real_si ; + } + + // There is no VI version. If the pseudo is selected, it should be lowered + // for VI appropriately. +} + class MUBUF_si op, dag outs, dag ins, string asm, list pattern> : MUBUF , MUBUFe { - let lds = 0; + let lds = 0; } class MUBUF_vi op, dag outs, dag ins, string asm, list pattern> : @@ -1606,12 +1667,6 @@ class MUBUF_vi op, dag outs, dag ins, string asm, list pattern> : let lds = 0; } -class MUBUFAddr64Table { - - bit IsAddr64 = is_addr64; - string OpName = NAME # suffix; -} - class MUBUFAtomicAddr64 op, dag outs, dag ins, string asm, list pattern> : MUBUF_si { @@ -1619,7 +1674,6 @@ class MUBUFAtomicAddr64 op, dag outs, dag ins, string asm, list pa let idxen = 0; let addr64 = 1; let tfe = 0; - let lds = 0; let soffset = 128; } @@ -1630,7 +1684,6 @@ class MUBUFAtomicOffset op, dag outs, dag ins, string asm, list pa let idxen = 0; let addr64 = 0; let tfe = 0; - let lds = 0; let vaddr = 0; } @@ -1686,56 +1739,51 @@ multiclass MUBUF_Atomic op, string name, RegisterClass rc, } // mayStore = 1, mayLoad = 1, hasPostISelHook = 1 } -multiclass MUBUF_Load_Helper op, string asm, RegisterClass regClass, +multiclass MUBUF_Load_Helper op, string name, RegisterClass regClass, ValueType load_vt = i32, SDPatternOperator ld = null_frag> { let mayLoad = 1, mayStore = 0 in { + let offen = 0, idxen = 0, vaddr = 0 in { + defm _OFFSET : MUBUF_m ; + } + + let offen = 1, idxen = 0 in { + defm _OFFEN : MUBUF_m ; + } - let addr64 = 0 in { - - let offen = 0, idxen = 0, vaddr = 0 in { - def _OFFSET : MUBUF_si , - MUBUFAddr64Table<0>; - } - - let offen = 1, idxen = 0 in { - def _OFFEN : MUBUF_si ; - } - - let offen = 0, idxen = 1 in { - def _IDXEN : MUBUF_si ; - } - - let offen = 1, idxen = 1 in { - def _BOTHEN : MUBUF_si ; - } + let offen = 0, idxen = 1 in { + defm _IDXEN : MUBUF_m ; + } + + let offen = 1, idxen = 1 in { + defm _BOTHEN : MUBUF_m ; } - let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in { - def _ADDR64 : MUBUF_si , MUBUFAddr64Table<1>; + i64:$vaddr, i16:$offset)))]>; } } } @@ -1744,7 +1792,7 @@ multiclass MUBUF_Load_Helper_vi op, string asm, RegisterClass regClass, ValueType load_vt = i32, SDPatternOperator ld = null_frag> { - let lds = 0, mayLoad = 1 in { + let mayLoad = 1, mayStore = 0 in { let offen = 0, idxen = 0, vaddr = 0 in { def _OFFSET : MUBUF_vi op, string asm, RegisterClass regClass, multiclass MUBUF_Store_Helper op, string name, RegisterClass vdataClass, ValueType store_vt, SDPatternOperator st> { - let mayLoad = 0, mayStore = 1 in { - let addr64 = 0 in { - - def "" : MUBUF_si < - op, (outs), - (ins vdataClass:$vdata, SReg_128:$srsrc, VGPR_32:$vaddr, SCSrc_32:$soffset, - mbuf_offset:$offset, offen:$offen, idxen:$idxen, glc:$glc, slc:$slc, - tfe:$tfe), - name#" $vdata, $vaddr, $srsrc, $soffset"#"$offen"#"$idxen"#"$offset"# - "$glc"#"$slc"#"$tfe", - [] - >; + defm : MUBUF_m ; let offen = 0, idxen = 0, vaddr = 0 in { - def _OFFSET : MUBUF_si < - op, (outs), - (ins vdataClass:$vdata, SReg_128:$srsrc, mbuf_offset:$offset, - SCSrc_32:$soffset, glc:$glc, slc:$slc, tfe:$tfe), - name#" $vdata, $srsrc, $soffset"#"$offset"#"$glc"#"$slc"#"$tfe", - [(st store_vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset, - i16:$offset, i1:$glc, i1:$slc, - i1:$tfe))] - >, MUBUFAddr64Table<0>; + defm _OFFSET : MUBUF_m ; } // offen = 0, idxen = 0, vaddr = 0 let offen = 1, idxen = 0 in { - def _OFFEN : MUBUF_si < - op, (outs), - (ins vdataClass:$vdata, SReg_128:$srsrc, VGPR_32:$vaddr, SCSrc_32:$soffset, - mbuf_offset:$offset, glc:$glc, slc:$slc, tfe:$tfe), - name#" $vdata, $vaddr, $srsrc, $soffset offen"#"$offset"# - "$glc"#"$slc"#"$tfe", - [] - >; + defm _OFFEN : MUBUF_m ; } // end offen = 1, idxen = 0 - } // End addr64 = 0 - - def _ADDR64 : MUBUF_si < - op, (outs), - (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr, mbuf_offset:$offset), - name#" $vdata, $vaddr, $srsrc, 0 addr64"#"$offset", - [(st store_vt:$vdata, - (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i16:$offset))]>, MUBUFAddr64Table<1> - { - - let mayLoad = 0; - let mayStore = 1; - - // Encoding - let offen = 0; - let idxen = 0; - let glc = 0; - let addr64 = 1; - let slc = 0; - let tfe = 0; - let soffset = 128; // ZERO - } - } // End mayLoad = 0, mayStore = 1 + let offen = 0, idxen = 0, glc = 0, slc = 0, tfe = 0, + soffset = 128 /* ZERO */ in { + defm _ADDR64 : MUBUFAddr64_m ; + } + } // End mayLoad = 0, mayStore = 1 } class FLAT_Load_Helper op, string asm, RegisterClass regClass> : -- 2.34.1