mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
R600/SI: Fix VOP3b encoding on VI
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229228 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e7ff4c1321
commit
124991cc67
@ -556,9 +556,6 @@ class VOP1 <bits<8> op, dag outs, dag ins, string asm, list<dag> pattern> :
|
||||
class VOP2 <bits<6> op, dag outs, dag ins, string asm, list<dag> pattern> :
|
||||
VOP2Common <outs, ins, asm, pattern>, VOP2e<op>;
|
||||
|
||||
class VOP3b <bits<9> op, dag outs, dag ins, string asm, list<dag> pattern> :
|
||||
VOP3Common <outs, ins, asm, pattern>, VOP3be<op>;
|
||||
|
||||
class VOPC <bits<8> op, dag ins, string asm, list<dag> pattern> :
|
||||
VOPCCommon <ins, asm, pattern>, VOPCe <op>;
|
||||
|
||||
|
@ -880,6 +880,16 @@ class VOP3_Real_vi <bits<10> op, dag outs, dag ins, string asm, string opName> :
|
||||
VOP3e_vi <op>,
|
||||
SIMCInstr <opName#"_e64", SISubtarget.VI>;
|
||||
|
||||
class VOP3b_Real_si <bits<9> op, dag outs, dag ins, string asm, string opName> :
|
||||
VOP3Common <outs, ins, asm, []>,
|
||||
VOP3be <op>,
|
||||
SIMCInstr<opName#"_e64", SISubtarget.SI>;
|
||||
|
||||
class VOP3b_Real_vi <bits<10> op, dag outs, dag ins, string asm, string opName> :
|
||||
VOP3Common <outs, ins, asm, []>,
|
||||
VOP3be_vi <op>,
|
||||
SIMCInstr <opName#"_e64", SISubtarget.VI>;
|
||||
|
||||
multiclass VOP3_m <vop op, dag outs, dag ins, string asm, list<dag> pattern,
|
||||
string opName, int NumSrcArgs, bit HasMods = 1> {
|
||||
|
||||
@ -958,6 +968,8 @@ multiclass VOP3SI_2_m <vop op, dag outs, dag ins, string asm,
|
||||
// No VI instruction. This class is for SI only.
|
||||
}
|
||||
|
||||
// XXX - Is v_div_scale_{f32|f64} only available in vop3b without
|
||||
// option of implicit vcc use?
|
||||
multiclass VOP3b_2_m <vop op, dag outs, dag ins, string asm,
|
||||
list<dag> pattern, string opName, string revOp,
|
||||
bit HasMods = 1, bit UseFullOp = 0> {
|
||||
@ -968,14 +980,11 @@ multiclass VOP3b_2_m <vop op, dag outs, dag ins, string asm,
|
||||
// can write it into any SGPR. We currently don't use the carry out,
|
||||
// so for now hardcode it to VCC as well.
|
||||
let sdst = SIOperand.VCC, Defs = [VCC] in {
|
||||
def _si : VOP3b <op.SI3, outs, ins, asm, []>,
|
||||
VOP3DisableFields<1, 0, HasMods>,
|
||||
SIMCInstr<opName#"_e64", SISubtarget.SI>;
|
||||
def _si : VOP3b_Real_si <op.SI3, outs, ins, asm, opName>,
|
||||
VOP3DisableFields<1, 0, HasMods>;
|
||||
|
||||
// TODO: Do we need this VI variant here?
|
||||
/*def _vi : VOP3b_vi <op.VI3, outs, ins, asm, []>,
|
||||
VOP3DisableFields<1, 0, HasMods>,
|
||||
SIMCInstr<opName#"_e64", SISubtarget.VI>;*/
|
||||
def _vi : VOP3b_Real_vi <op.VI3, outs, ins, asm, opName>,
|
||||
VOP3DisableFields<1, 0, HasMods>;
|
||||
} // End sdst = SIOperand.VCC, Defs = [VCC]
|
||||
}
|
||||
|
||||
|
@ -136,6 +136,32 @@ class VOP3e_vi <bits<10> op> : Enc64 {
|
||||
let Inst{63} = src2_modifiers{0};
|
||||
}
|
||||
|
||||
class VOP3be_vi <bits<10> op> : Enc64 {
|
||||
bits<8> vdst;
|
||||
bits<2> src0_modifiers;
|
||||
bits<9> src0;
|
||||
bits<2> src1_modifiers;
|
||||
bits<9> src1;
|
||||
bits<2> src2_modifiers;
|
||||
bits<9> src2;
|
||||
bits<7> sdst;
|
||||
bits<2> omod;
|
||||
bits<1> clamp;
|
||||
|
||||
let Inst{7-0} = vdst;
|
||||
let Inst{14-8} = sdst;
|
||||
let Inst{15} = clamp;
|
||||
let Inst{25-16} = op;
|
||||
let Inst{31-26} = 0x34; //encoding
|
||||
let Inst{40-32} = src0;
|
||||
let Inst{49-41} = src1;
|
||||
let Inst{58-50} = src2;
|
||||
let Inst{60-59} = omod;
|
||||
let Inst{61} = src0_modifiers{0};
|
||||
let Inst{62} = src1_modifiers{0};
|
||||
let Inst{63} = src2_modifiers{0};
|
||||
}
|
||||
|
||||
class EXPe_vi : EXPe {
|
||||
let Inst{31-26} = 0x31; //encoding
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user