forked from OSchip/llvm-project
[mips][microMIPSr6] Implement ALIGN and AUI instructions
This patch implements ALIGN and AUI instructions using mapping. Differential Revision: http://reviews.llvm.org/D8782 llvm-svn: 237563
This commit is contained in:
parent
f090f031bc
commit
cbb227b48d
|
@ -136,3 +136,33 @@ class SPECIAL_2R_FM_MMR6<bits<6> funct> : MipsR6Inst {
|
|||
let Inst{10-6} = 0b00001;
|
||||
let Inst{5-0} = funct;
|
||||
}
|
||||
|
||||
class POOL32A_ALIGN_FM_MMR6<bits<6> funct> : MipsR6Inst {
|
||||
bits<5> rd;
|
||||
bits<5> rs;
|
||||
bits<5> rt;
|
||||
bits<2> bp;
|
||||
|
||||
bits<32> Inst;
|
||||
|
||||
let Inst{31-26} = 0b000000;
|
||||
let Inst{25-21} = rs;
|
||||
let Inst{20-16} = rt;
|
||||
let Inst{15-11} = rd;
|
||||
let Inst{10-9} = bp;
|
||||
let Inst{8-6} = 0b000;
|
||||
let Inst{5-0} = funct;
|
||||
}
|
||||
|
||||
class AUI_FM_MMR6 : MipsR6Inst {
|
||||
bits<5> rs;
|
||||
bits<5> rt;
|
||||
bits<16> imm;
|
||||
|
||||
bits<32> Inst;
|
||||
|
||||
let Inst{31-26} = 0b000100;
|
||||
let Inst{25-21} = rt;
|
||||
let Inst{20-16} = rs;
|
||||
let Inst{15-0} = imm;
|
||||
}
|
||||
|
|
|
@ -22,6 +22,8 @@ class ADDU_MMR6_ENC : ARITH_FM_MMR6<"addu", 0x150>;
|
|||
class ADDIUPC_MMR6_ENC : PCREL19_FM_MMR6<0b00>;
|
||||
class ALUIPC_MMR6_ENC : PCREL16_FM_MMR6<0b11111>;
|
||||
class AUIPC_MMR6_ENC : PCREL16_FM_MMR6<0b11110>;
|
||||
class ALIGN_MMR6_ENC : POOL32A_ALIGN_FM_MMR6<0b011111>;
|
||||
class AUI_MMR6_ENC : AUI_FM_MMR6;
|
||||
class BALC_MMR6_ENC : BRANCH_OFF26_FM<0b101101>;
|
||||
class BC_MMR6_ENC : BRANCH_OFF26_FM<0b100101>;
|
||||
class BITSWAP_MMR6_ENC : POOL32A_BITSWAP_FM_MMR6<0b101100>;
|
||||
|
@ -125,6 +127,26 @@ class JIC_MMR6_DESC : JMP_MMR6_IDX_COMPACT_DESC_BASE<"jic", jmpoffset16,
|
|||
list<Register> Defs = [AT];
|
||||
}
|
||||
|
||||
class ALIGN_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
|
||||
Operand ImmOpnd> : MMR6Arch<instr_asm> {
|
||||
dag OutOperandList = (outs GPROpnd:$rd);
|
||||
dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, ImmOpnd:$bp);
|
||||
string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt, $bp");
|
||||
list<dag> Pattern = [];
|
||||
}
|
||||
|
||||
class ALIGN_MMR6_DESC : ALIGN_MMR6_DESC_BASE<"align", GPR32Opnd, uimm2>;
|
||||
|
||||
class AUI_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
|
||||
: MMR6Arch<instr_asm> {
|
||||
dag OutOperandList = (outs GPROpnd:$rt);
|
||||
dag InOperandList = (ins GPROpnd:$rs, simm16:$imm);
|
||||
string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $imm");
|
||||
list<dag> Pattern = [];
|
||||
}
|
||||
|
||||
class AUI_MMR6_DESC : AUI_MMR6_DESC_BASE<"aui", GPR32Opnd>;
|
||||
|
||||
class ALUIPC_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
|
||||
: MMR6Arch<instr_asm> {
|
||||
dag OutOperandList = (outs GPROpnd:$rt);
|
||||
|
@ -173,6 +195,8 @@ def ADDIUPC_MMR6 : R6MMR6Rel, ADDIUPC_MMR6_ENC, ADDIUPC_MMR6_DESC,
|
|||
def ALUIPC_MMR6 : R6MMR6Rel, ALUIPC_MMR6_ENC, ALUIPC_MMR6_DESC,
|
||||
ISA_MICROMIPS32R6;
|
||||
def AUIPC_MMR6 : R6MMR6Rel, AUIPC_MMR6_ENC, AUIPC_MMR6_DESC, ISA_MICROMIPS32R6;
|
||||
def ALIGN_MMR6 : R6MMR6Rel, ALIGN_MMR6_ENC, ALIGN_MMR6_DESC, ISA_MICROMIPS32R6;
|
||||
def AUI_MMR6 : R6MMR6Rel, AUI_MMR6_ENC, AUI_MMR6_DESC, ISA_MICROMIPS32R6;
|
||||
def BALC_MMR6 : R6MMR6Rel, BALC_MMR6_ENC, BALC_MMR6_DESC, ISA_MICROMIPS32R6;
|
||||
def BC_MMR6 : R6MMR6Rel, BC_MMR6_ENC, BC_MMR6_DESC, ISA_MICROMIPS32R6;
|
||||
def BITSWAP_MMR6 : R6MMR6Rel, BITSWAP_MMR6_ENC, BITSWAP_MMR6_DESC,
|
||||
|
|
|
@ -255,7 +255,7 @@ class LWPC_DESC: PCREL_DESC_BASE<"lwpc", GPR32Opnd, simm19_lsl2>;
|
|||
class LWUPC_DESC: PCREL_DESC_BASE<"lwupc", GPR32Opnd, simm19_lsl2>;
|
||||
|
||||
class ALIGN_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
|
||||
Operand ImmOpnd> {
|
||||
Operand ImmOpnd> : MipsR6Arch<instr_asm> {
|
||||
dag OutOperandList = (outs GPROpnd:$rd);
|
||||
dag InOperandList = (ins GPROpnd:$rs, GPROpnd:$rt, ImmOpnd:$bp);
|
||||
string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt, $bp");
|
||||
|
@ -275,7 +275,8 @@ class ALUIPC_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
|
|||
class ALUIPC_DESC : ALUIPC_DESC_BASE<"aluipc", GPR32Opnd>;
|
||||
class AUIPC_DESC : ALUIPC_DESC_BASE<"auipc", GPR32Opnd>;
|
||||
|
||||
class AUI_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> {
|
||||
class AUI_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
|
||||
: MipsR6Arch<instr_asm> {
|
||||
dag OutOperandList = (outs GPROpnd:$rs);
|
||||
dag InOperandList = (ins GPROpnd:$rt, simm16:$imm);
|
||||
string AsmString = !strconcat(instr_asm, "\t$rs, $rt, $imm");
|
||||
|
@ -649,9 +650,9 @@ class SDBBP_R6_DESC {
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
def ADDIUPC : R6MMR6Rel, ADDIUPC_ENC, ADDIUPC_DESC, ISA_MIPS32R6;
|
||||
def ALIGN : ALIGN_ENC, ALIGN_DESC, ISA_MIPS32R6;
|
||||
def ALIGN : R6MMR6Rel, ALIGN_ENC, ALIGN_DESC, ISA_MIPS32R6;
|
||||
def ALUIPC : R6MMR6Rel, ALUIPC_ENC, ALUIPC_DESC, ISA_MIPS32R6;
|
||||
def AUI : AUI_ENC, AUI_DESC, ISA_MIPS32R6;
|
||||
def AUI : R6MMR6Rel, AUI_ENC, AUI_DESC, ISA_MIPS32R6;
|
||||
def AUIPC : R6MMR6Rel, AUIPC_ENC, AUIPC_DESC, ISA_MIPS32R6;
|
||||
def BAL : BAL_ENC, BAL_DESC, ISA_MIPS32R6;
|
||||
def BALC : R6MMR6Rel, BALC_ENC, BALC_DESC, ISA_MIPS32R6;
|
||||
|
|
|
@ -12,6 +12,10 @@
|
|||
|
||||
0x78 0x7e 0xff 0xff # CHECK: auipc $3, -1
|
||||
|
||||
0x00 0x43 0x24 0x1f # CHECK: align $4, $2, $3, 2
|
||||
|
||||
0x10 0x62 0xff 0xe9 # CHECK: aui $3, $2, -23
|
||||
|
||||
# CHECK: balc 14572256
|
||||
0xb4 0x37 0x96 0xb8
|
||||
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
addiupc $4, 100 # CHECK: addiupc $4, 100 # encoding: [0x78,0x80,0x00,0x19]
|
||||
aluipc $3, 56 # CHECK: aluipc $3, 56 # encoding: [0x78,0x7f,0x00,0x38]
|
||||
auipc $3, -1 # CHECK: auipc $3, -1 # encoding: [0x78,0x7e,0xff,0xff]
|
||||
align $4, $2, $3, 2 # CHECK: align $4, $2, $3, 2 # encoding: [0x00,0x43,0x24,0x1f]
|
||||
aui $3,$2,-23 # CHECK: aui $3, $2, -23 # encoding: [0x10,0x62,0xff,0xe9]
|
||||
balc 14572256 # CHECK: balc 14572256 # encoding: [0xb4,0x37,0x96,0xb8]
|
||||
bc 14572256 # CHECK: bc 14572256 # encoding: [0x94,0x37,0x96,0xb8]
|
||||
bitswap $4, $2 # CHECK: bitswap $4, $2 # encoding: [0x00,0x44,0x0b,0x3c]
|
||||
|
|
Loading…
Reference in New Issue