mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	[mips][microMIPSr6] Implement ALUIPC and AUIPC instructions
This patch implements ALUIPC and AUIPC instructions using mapping. Differential Revision: http://reviews.llvm.org/D8441 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236858 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -82,3 +82,15 @@ class PCREL19_FM_MMR6<bits<2> funct> : MipsR6Inst {
 | 
			
		||||
  let Inst{20-19} = funct;
 | 
			
		||||
  let Inst{18-0}  = imm;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class PCREL16_FM_MMR6<bits<5> funct> : MipsR6Inst {
 | 
			
		||||
  bits<5> rt;
 | 
			
		||||
  bits<16> imm;
 | 
			
		||||
 | 
			
		||||
  bits<32> Inst;
 | 
			
		||||
 | 
			
		||||
  let Inst{31-26} = 0b011110;
 | 
			
		||||
  let Inst{25-21} = rt;
 | 
			
		||||
  let Inst{20-16} = funct;
 | 
			
		||||
  let Inst{15-0}  = imm;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,8 @@ class ADD_MMR6_ENC : ARITH_FM_MMR6<"add", 0x110>;
 | 
			
		||||
class ADDIU_MMR6_ENC : ADDI_FM_MMR6<"addiu", 0xc>;
 | 
			
		||||
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 BALC_MMR6_ENC  : BRANCH_OFF26_FM<0b101101>;
 | 
			
		||||
class BC_MMR6_ENC : BRANCH_OFF26_FM<0b100101>;
 | 
			
		||||
class BITSWAP_MMR6_ENC : POOL32A_BITSWAP_FM_MMR6<0b101100>;
 | 
			
		||||
@@ -109,6 +111,17 @@ class JIC_MMR6_DESC : JMP_MMR6_IDX_COMPACT_DESC_BASE<"jic", jmpoffset16,
 | 
			
		||||
  list<Register> Defs = [AT];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ALUIPC_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
 | 
			
		||||
    : MMR6Arch<instr_asm> {
 | 
			
		||||
  dag OutOperandList = (outs GPROpnd:$rt);
 | 
			
		||||
  dag InOperandList = (ins simm16:$imm);
 | 
			
		||||
  string AsmString = !strconcat(instr_asm, "\t$rt, $imm");
 | 
			
		||||
  list<dag> Pattern = [];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ALUIPC_MMR6_DESC : ALUIPC_MMR6_DESC_BASE<"aluipc", GPR32Opnd>;
 | 
			
		||||
class AUIPC_MMR6_DESC : ALUIPC_MMR6_DESC_BASE<"auipc", GPR32Opnd>;
 | 
			
		||||
 | 
			
		||||
class PCREL_MMR6_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
 | 
			
		||||
                           Operand ImmOpnd> : MMR6Arch<instr_asm> {
 | 
			
		||||
  dag OutOperandList = (outs GPROpnd:$rt);
 | 
			
		||||
@@ -132,6 +145,9 @@ def ADDIU_MMR6 : StdMMR6Rel, ADDIU_MMR6_DESC, ADDIU_MMR6_ENC, ISA_MICROMIPS32R6;
 | 
			
		||||
def ADDU_MMR6 : StdMMR6Rel, ADDU_MMR6_DESC, ADDU_MMR6_ENC, ISA_MICROMIPS32R6;
 | 
			
		||||
def ADDIUPC_MMR6 : R6MMR6Rel, ADDIUPC_MMR6_ENC, ADDIUPC_MMR6_DESC,
 | 
			
		||||
                   ISA_MICROMIPS32R6;
 | 
			
		||||
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 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,
 | 
			
		||||
 
 | 
			
		||||
@@ -264,7 +264,8 @@ class ALIGN_DESC_BASE<string instr_asm, RegisterOperand GPROpnd,
 | 
			
		||||
 | 
			
		||||
class ALIGN_DESC : ALIGN_DESC_BASE<"align", GPR32Opnd, uimm2>;
 | 
			
		||||
 | 
			
		||||
class ALUIPC_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> {
 | 
			
		||||
class ALUIPC_DESC_BASE<string instr_asm, RegisterOperand GPROpnd>
 | 
			
		||||
    : MipsR6Arch<instr_asm> {
 | 
			
		||||
  dag OutOperandList = (outs GPROpnd:$rs);
 | 
			
		||||
  dag InOperandList = (ins simm16:$imm);
 | 
			
		||||
  string AsmString = !strconcat(instr_asm, "\t$rs, $imm");
 | 
			
		||||
@@ -647,9 +648,9 @@ class SDBBP_R6_DESC {
 | 
			
		||||
 | 
			
		||||
def ADDIUPC : R6MMR6Rel, ADDIUPC_ENC, ADDIUPC_DESC, ISA_MIPS32R6;
 | 
			
		||||
def ALIGN : ALIGN_ENC, ALIGN_DESC, ISA_MIPS32R6;
 | 
			
		||||
def ALUIPC : ALUIPC_ENC, ALUIPC_DESC, ISA_MIPS32R6;
 | 
			
		||||
def ALUIPC : R6MMR6Rel, ALUIPC_ENC, ALUIPC_DESC, ISA_MIPS32R6;
 | 
			
		||||
def AUI : AUI_ENC, AUI_DESC, ISA_MIPS32R6;
 | 
			
		||||
def AUIPC : AUIPC_ENC, AUIPC_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;
 | 
			
		||||
def BC1EQZ : BC1EQZ_ENC, BC1EQZ_DESC, ISA_MIPS32R6, HARDFLOAT;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,10 @@
 | 
			
		||||
 | 
			
		||||
0x78 0x80 0x00 0x19 # CHECK: addiupc $4, 100
 | 
			
		||||
 | 
			
		||||
0x78 0x7f 0x00 0x38 # CHECK: aluipc $3, 56
 | 
			
		||||
 | 
			
		||||
0x78 0x7e 0xff 0xff # CHECK: auipc $3, -1
 | 
			
		||||
 | 
			
		||||
# CHECK: balc 14572256
 | 
			
		||||
0xb4 0x37 0x96 0xb8
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,8 @@
 | 
			
		||||
  addiu $3, $4, 1234       # CHECK: addiu $3, $4, 1234  # encoding: [0x30,0x64,0x04,0xd2]
 | 
			
		||||
  addu $3, $4, $5          # CHECK: addu $3, $4, $5     # encoding: [0x00,0xa4,0x19,0x50]
 | 
			
		||||
  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]
 | 
			
		||||
  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]
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user