mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	ps][microMIPS] Implement LI16 instruction
Differential Revision: http://reviews.llvm.org/D5149 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220475 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -1170,6 +1170,14 @@ bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc,
 | 
				
			|||||||
        if (Imm < 1 || Imm > 8)
 | 
					        if (Imm < 1 || Imm > 8)
 | 
				
			||||||
          return Error(IDLoc, "immediate operand value out of range");
 | 
					          return Error(IDLoc, "immediate operand value out of range");
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					      case Mips::LI16_MM:
 | 
				
			||||||
 | 
					        Opnd = Inst.getOperand(1);
 | 
				
			||||||
 | 
					        if (!Opnd.isImm())
 | 
				
			||||||
 | 
					          return Error(IDLoc, "expected immediate operand kind");
 | 
				
			||||||
 | 
					        Imm = Opnd.getImm();
 | 
				
			||||||
 | 
					        if (Imm < -1 || Imm > 126)
 | 
				
			||||||
 | 
					          return Error(IDLoc, "immediate operand value out of range");
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -114,6 +114,17 @@ class MOVE_FM_MM16<bits<6> funct> {
 | 
				
			|||||||
  let Inst{4-0}   = rs;
 | 
					  let Inst{4-0}   = rs;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class LI_FM_MM16 {
 | 
				
			||||||
 | 
					  bits<3> rd;
 | 
				
			||||||
 | 
					  bits<7> imm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bits<16> Inst;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let Inst{15-10} = 0x3b;
 | 
				
			||||||
 | 
					  let Inst{9-7}   = rd;
 | 
				
			||||||
 | 
					  let Inst{6-0}   = imm;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class JALR_FM_MM16<bits<5> op> {
 | 
					class JALR_FM_MM16<bits<5> op> {
 | 
				
			||||||
  bits<5> rs;
 | 
					  bits<5> rs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
def addrimm12 : ComplexPattern<iPTR, 2, "selectIntAddrMM", [frameindex]>;
 | 
					def addrimm12 : ComplexPattern<iPTR, 2, "selectIntAddrMM", [frameindex]>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def simm4 : Operand<i32>;
 | 
					def simm4 : Operand<i32>;
 | 
				
			||||||
 | 
					def simm7 : Operand<i32>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def simm12 : Operand<i32> {
 | 
					def simm12 : Operand<i32> {
 | 
				
			||||||
  let DecoderMethod = "DecodeSimm12";
 | 
					  let DecoderMethod = "DecodeSimm12";
 | 
				
			||||||
@@ -20,6 +21,8 @@ def uimm3_shift : Operand<i32> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def immZExt2Shift : ImmLeaf<i32, [{return Imm >= 1 && Imm <= 8;}]>;
 | 
					def immZExt2Shift : ImmLeaf<i32, [{return Imm >= 1 && Imm <= 8;}]>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def immLi16 : ImmLeaf<i32, [{return Imm >= -1 && Imm <= 126;}]>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def mem_mm_12 : Operand<i32> {
 | 
					def mem_mm_12 : Operand<i32> {
 | 
				
			||||||
  let PrintMethod = "printMemOperand";
 | 
					  let PrintMethod = "printMemOperand";
 | 
				
			||||||
  let MIOperandInfo = (ops GPR32, simm12);
 | 
					  let MIOperandInfo = (ops GPR32, simm12);
 | 
				
			||||||
@@ -154,6 +157,13 @@ class MoveMM16<string opstr, RegisterOperand RO, bit isComm = 0,
 | 
				
			|||||||
  let isReMaterializable = 1;
 | 
					  let isReMaterializable = 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class LoadImmMM16<string opstr, Operand Od, RegisterOperand RO,
 | 
				
			||||||
 | 
					                  SDPatternOperator imm_type = null_frag> :
 | 
				
			||||||
 | 
					  MicroMipsInst16<(outs RO:$rd), (ins Od:$imm),
 | 
				
			||||||
 | 
					                  !strconcat(opstr, "\t$rd, $imm"), [], NoItinerary, FrmI> {
 | 
				
			||||||
 | 
					  let isReMaterializable = 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 16-bit Jump and Link (Call)
 | 
					// 16-bit Jump and Link (Call)
 | 
				
			||||||
class JumpLinkRegMM16<string opstr, RegisterOperand RO> :
 | 
					class JumpLinkRegMM16<string opstr, RegisterOperand RO> :
 | 
				
			||||||
  MicroMipsInst16<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"),
 | 
					  MicroMipsInst16<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"),
 | 
				
			||||||
@@ -240,6 +250,8 @@ def ADDIUSP_MM : AddImmUSP<"addiusp">, ADDIUSP_FM_MM16;
 | 
				
			|||||||
def MFHI16_MM : MoveFromHILOMM<"mfhi", GPR32Opnd, AC0>, MFHILO_FM_MM16<0x10>;
 | 
					def MFHI16_MM : MoveFromHILOMM<"mfhi", GPR32Opnd, AC0>, MFHILO_FM_MM16<0x10>;
 | 
				
			||||||
def MFLO16_MM : MoveFromHILOMM<"mflo", GPR32Opnd, AC0>, MFHILO_FM_MM16<0x12>;
 | 
					def MFLO16_MM : MoveFromHILOMM<"mflo", GPR32Opnd, AC0>, MFHILO_FM_MM16<0x12>;
 | 
				
			||||||
def MOVE16_MM : MoveMM16<"move", GPR32Opnd>, MOVE_FM_MM16<0x03>;
 | 
					def MOVE16_MM : MoveMM16<"move", GPR32Opnd>, MOVE_FM_MM16<0x03>;
 | 
				
			||||||
 | 
					def LI16_MM : LoadImmMM16<"li16", simm7, GPRMM16Opnd, immLi16>,
 | 
				
			||||||
 | 
					              LI_FM_MM16, IsAsCheapAsAMove;
 | 
				
			||||||
def JALR16_MM : JumpLinkRegMM16<"jalr", GPR32Opnd>, JALR_FM_MM16<0x0e>;
 | 
					def JALR16_MM : JumpLinkRegMM16<"jalr", GPR32Opnd>, JALR_FM_MM16<0x0e>;
 | 
				
			||||||
def JALRS16_MM : JumpLinkRegSMM16<"jalrs16", GPR32Opnd>, JALR_FM_MM16<0x0f>;
 | 
					def JALRS16_MM : JumpLinkRegSMM16<"jalrs16", GPR32Opnd>, JALR_FM_MM16<0x0f>;
 | 
				
			||||||
def JRC16_MM : JumpRegCMM16<"jrc", GPR32Opnd>, JALR_FM_MM16<0x0d>;
 | 
					def JRC16_MM : JumpRegCMM16<"jrc", GPR32Opnd>, JALR_FM_MM16<0x0d>;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,8 @@
 | 
				
			|||||||
# CHECK-EL: xor16   $17, $5         # encoding: [0x4d,0x44]
 | 
					# CHECK-EL: xor16   $17, $5         # encoding: [0x4d,0x44]
 | 
				
			||||||
# CHECK-EL: sll16   $3, $16, 5      # encoding: [0x8a,0x25]
 | 
					# CHECK-EL: sll16   $3, $16, 5      # encoding: [0x8a,0x25]
 | 
				
			||||||
# CHECK-EL: srl16   $4, $17, 6      # encoding: [0x1d,0x26]
 | 
					# CHECK-EL: srl16   $4, $17, 6      # encoding: [0x1d,0x26]
 | 
				
			||||||
 | 
					# CHECK-EL: li16    $3, -1          # encoding: [0xff,0xed]
 | 
				
			||||||
 | 
					# CHECK-EL: li16    $3, 126         # encoding: [0xfe,0xed]
 | 
				
			||||||
# CHECK-EL: addius5 $7, -2          # encoding: [0xfc,0x4c]
 | 
					# CHECK-EL: addius5 $7, -2          # encoding: [0xfc,0x4c]
 | 
				
			||||||
# CHECK-EL: addiusp -16             # encoding: [0xf9,0x4f]
 | 
					# CHECK-EL: addiusp -16             # encoding: [0xf9,0x4f]
 | 
				
			||||||
# CHECK-EL: mfhi    $9              # encoding: [0x09,0x46]
 | 
					# CHECK-EL: mfhi    $9              # encoding: [0x09,0x46]
 | 
				
			||||||
@@ -41,6 +43,8 @@
 | 
				
			|||||||
# CHECK-EB: xor16   $17, $5         # encoding: [0x44,0x4d]
 | 
					# CHECK-EB: xor16   $17, $5         # encoding: [0x44,0x4d]
 | 
				
			||||||
# CHECK-EB: sll16   $3, $16, 5      # encoding: [0x25,0x8a]
 | 
					# CHECK-EB: sll16   $3, $16, 5      # encoding: [0x25,0x8a]
 | 
				
			||||||
# CHECK-EB: srl16   $4, $17, 6      # encoding: [0x26,0x1d]
 | 
					# CHECK-EB: srl16   $4, $17, 6      # encoding: [0x26,0x1d]
 | 
				
			||||||
 | 
					# CHECK-EB: li16    $3, -1          # encoding: [0xed,0xff]
 | 
				
			||||||
 | 
					# CHECK-EB: li16    $3, 126         # encoding: [0xed,0xfe]
 | 
				
			||||||
# CHECK-EB: addius5 $7, -2          # encoding: [0x4c,0xfc]
 | 
					# CHECK-EB: addius5 $7, -2          # encoding: [0x4c,0xfc]
 | 
				
			||||||
# CHECK-EB: addiusp -16             # encoding: [0x4f,0xf9]
 | 
					# CHECK-EB: addiusp -16             # encoding: [0x4f,0xf9]
 | 
				
			||||||
# CHECK-EB: mfhi    $9              # encoding: [0x46,0x09]
 | 
					# CHECK-EB: mfhi    $9              # encoding: [0x46,0x09]
 | 
				
			||||||
@@ -63,6 +67,8 @@
 | 
				
			|||||||
    xor16   $17, $5
 | 
					    xor16   $17, $5
 | 
				
			||||||
    sll16   $3, $16, 5
 | 
					    sll16   $3, $16, 5
 | 
				
			||||||
    srl16   $4, $17, 6
 | 
					    srl16   $4, $17, 6
 | 
				
			||||||
 | 
					    li16    $3, -1
 | 
				
			||||||
 | 
					    li16    $3, 126
 | 
				
			||||||
    addius5 $7, -2
 | 
					    addius5 $7, -2
 | 
				
			||||||
    addiusp -16
 | 
					    addiusp -16
 | 
				
			||||||
    mfhi    $9
 | 
					    mfhi    $9
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,3 +13,5 @@
 | 
				
			|||||||
  srl16   $4, $9, 6  # CHECK: :[[@LINE]]:{{[0-9]+}}: error: invalid operand for instruction
 | 
					  srl16   $4, $9, 6  # CHECK: :[[@LINE]]:{{[0-9]+}}: error: invalid operand for instruction
 | 
				
			||||||
  sll16   $3, $16, 9 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: immediate operand value out of range
 | 
					  sll16   $3, $16, 9 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: immediate operand value out of range
 | 
				
			||||||
  srl16   $4, $5, 15 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: immediate operand value out of range
 | 
					  srl16   $4, $5, 15 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: immediate operand value out of range
 | 
				
			||||||
 | 
					  li16  $8, -1 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: invalid operand for instruction
 | 
				
			||||||
 | 
					  li16  $4, -2 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: immediate operand value out of range
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user