mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	ARM MCR/MCR2 assembly parsing operand constraints.
The immediate operands are restricted to 0-7. Enforce that when parsing assembly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135189 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -3649,8 +3649,8 @@ class MovRCopro<string opc, bit direction, dag oops, dag iops,
 | 
			
		||||
 | 
			
		||||
def MCR : MovRCopro<"mcr", 0 /* from ARM core register to coprocessor */,
 | 
			
		||||
                    (outs),
 | 
			
		||||
                    (ins p_imm:$cop, i32imm:$opc1, GPR:$Rt, c_imm:$CRn,
 | 
			
		||||
                         c_imm:$CRm, i32imm:$opc2),
 | 
			
		||||
                    (ins p_imm:$cop, imm0_7:$opc1, GPR:$Rt, c_imm:$CRn,
 | 
			
		||||
                         c_imm:$CRm, imm0_7:$opc2),
 | 
			
		||||
                    [(int_arm_mcr imm:$cop, imm:$opc1, GPR:$Rt, imm:$CRn,
 | 
			
		||||
                                  imm:$CRm, imm:$opc2)]>;
 | 
			
		||||
def MRC : MovRCopro<"mrc", 1 /* from coprocessor to ARM core register */,
 | 
			
		||||
@@ -3686,8 +3686,8 @@ class MovRCopro2<string opc, bit direction, dag oops, dag iops,
 | 
			
		||||
 | 
			
		||||
def MCR2 : MovRCopro2<"mcr2", 0 /* from ARM core register to coprocessor */,
 | 
			
		||||
                      (outs),
 | 
			
		||||
                      (ins p_imm:$cop, i32imm:$opc1, GPR:$Rt, c_imm:$CRn,
 | 
			
		||||
                           c_imm:$CRm, i32imm:$opc2),
 | 
			
		||||
                      (ins p_imm:$cop, imm0_7:$opc1, GPR:$Rt, c_imm:$CRn,
 | 
			
		||||
                           c_imm:$CRm, imm0_7:$opc2),
 | 
			
		||||
                      [(int_arm_mcr2 imm:$cop, imm:$opc1, GPR:$Rt, imm:$CRn,
 | 
			
		||||
                                     imm:$CRm, imm:$opc2)]>;
 | 
			
		||||
def MRC2 : MovRCopro2<"mrc2", 1 /* from coprocessor to ARM core register */,
 | 
			
		||||
 
 | 
			
		||||
@@ -3377,13 +3377,13 @@ class t2MovRRCopro<bits<4> Op, string opc, bit direction,
 | 
			
		||||
/* from ARM core register to coprocessor */
 | 
			
		||||
def t2MCR : t2MovRCopro<0b1110, "mcr", 0,
 | 
			
		||||
           (outs),
 | 
			
		||||
           (ins p_imm:$cop, i32imm:$opc1, GPR:$Rt, c_imm:$CRn,
 | 
			
		||||
                c_imm:$CRm, i32imm:$opc2),
 | 
			
		||||
           (ins p_imm:$cop, imm0_7:$opc1, GPR:$Rt, c_imm:$CRn,
 | 
			
		||||
                c_imm:$CRm, imm0_7:$opc2),
 | 
			
		||||
           [(int_arm_mcr imm:$cop, imm:$opc1, GPR:$Rt, imm:$CRn,
 | 
			
		||||
                         imm:$CRm, imm:$opc2)]>;
 | 
			
		||||
def t2MCR2 : t2MovRCopro<0b1111, "mcr2", 0,
 | 
			
		||||
             (outs), (ins p_imm:$cop, i32imm:$opc1, GPR:$Rt, c_imm:$CRn,
 | 
			
		||||
                          c_imm:$CRm, i32imm:$opc2),
 | 
			
		||||
             (outs), (ins p_imm:$cop, imm0_7:$opc1, GPR:$Rt, c_imm:$CRn,
 | 
			
		||||
                          c_imm:$CRm, imm0_7:$opc2),
 | 
			
		||||
             [(int_arm_mcr2 imm:$cop, imm:$opc1, GPR:$Rt, imm:$CRn,
 | 
			
		||||
                            imm:$CRm, imm:$opc2)]>;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -89,8 +89,6 @@
 | 
			
		||||
@ CHECK: mrs  r8, cpsr @ encoding: [0x00,0x80,0x0f,0xe1]
 | 
			
		||||
        mrs  r8, cpsr
 | 
			
		||||
 | 
			
		||||
@ CHECK: mcr  p7, #1, r5, c1, c1, #4 @ encoding: [0x91,0x57,0x21,0xee]
 | 
			
		||||
        mcr  p7, #1, r5, c1, c1, #4
 | 
			
		||||
@ CHECK: mrc  p14, #0, r1, c1, c2, #4 @ encoding: [0x92,0x1e,0x11,0xee]
 | 
			
		||||
        mrc  p14, #0, r1, c1, c2, #4
 | 
			
		||||
@ CHECK: mcrr  p7, #1, r5, r4, c1 @ encoding: [0x11,0x57,0x44,0xec]
 | 
			
		||||
@@ -98,8 +96,6 @@
 | 
			
		||||
@ CHECK: mrrc  p7, #1, r5, r4, c1 @ encoding: [0x11,0x57,0x54,0xec]
 | 
			
		||||
        mrrc  p7, #1, r5, r4, c1
 | 
			
		||||
 | 
			
		||||
@ CHECK: mcr2  p7, #1, r5, c1, c1, #4 @ encoding: [0x91,0x57,0x21,0xfe]
 | 
			
		||||
        mcr2  p7, #1, r5, c1, c1, #4
 | 
			
		||||
@ CHECK: mrc2  p14, #0, r1, c1, c2, #4 @ encoding: [0x92,0x1e,0x11,0xfe]
 | 
			
		||||
        mrc2  p14, #0, r1, c1, c2, #4
 | 
			
		||||
@ CHECK: mcrr2  p7, #1, r5, r4, c1 @ encoding: [0x11,0x57,0x44,0xfc]
 | 
			
		||||
 
 | 
			
		||||
@@ -619,6 +619,24 @@ _func:
 | 
			
		||||
@ CHECK: ldmda r2!, {r1, r3, r4, r5, r6, sp} @ encoding: [0x7a,0x20,0x32,0xe8]
 | 
			
		||||
@ CHECK: ldmdb r2!, {r1, r3, r4, r5, r6, sp} @ encoding: [0x7a,0x20,0x32,0xe9]
 | 
			
		||||
 | 
			
		||||
@------------------------------------------------------------------------------
 | 
			
		||||
@ FIXME: LDR*
 | 
			
		||||
@------------------------------------------------------------------------------
 | 
			
		||||
@------------------------------------------------------------------------------
 | 
			
		||||
@ FIXME: LSL
 | 
			
		||||
@------------------------------------------------------------------------------
 | 
			
		||||
@------------------------------------------------------------------------------
 | 
			
		||||
@ FIXME: LSR
 | 
			
		||||
@------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@------------------------------------------------------------------------------
 | 
			
		||||
@ MCR/MCR2
 | 
			
		||||
@------------------------------------------------------------------------------
 | 
			
		||||
        mcr  p7, #1, r5, c1, c1, #4
 | 
			
		||||
        mcr2  p7, #1, r5, c1, c1, #4
 | 
			
		||||
 | 
			
		||||
@ CHECK: mcr  p7, #1, r5, c1, c1, #4 @ encoding: [0x91,0x57,0x21,0xee]
 | 
			
		||||
@ CHECK: mcr2  p7, #1, r5, c1, c1, #4 @ encoding: [0x91,0x57,0x21,0xfe]
 | 
			
		||||
 | 
			
		||||
@------------------------------------------------------------------------------
 | 
			
		||||
@ STM*
 | 
			
		||||
 
 | 
			
		||||
@@ -68,3 +68,13 @@
 | 
			
		||||
@ CHECK-ERRORS: error: invalid operand for instruction
 | 
			
		||||
@  Double-check that we're synced up with the right diagnostics.
 | 
			
		||||
@ CHECK-ERRORS: dbg #16
 | 
			
		||||
 | 
			
		||||
        @ Out of range immediate for MCR/MCR2
 | 
			
		||||
        mcr  p7, #8, r5, c1, c1, #4
 | 
			
		||||
        mcr  p7, #2, r5, c1, c1, #8
 | 
			
		||||
        mcr2  p7, #8, r5, c1, c1, #4
 | 
			
		||||
        mcr2  p7, #1, r5, c1, c1, #8
 | 
			
		||||
@ CHECK-ERRORS: error: invalid operand for instruction
 | 
			
		||||
@ CHECK-ERRORS: error: invalid operand for instruction
 | 
			
		||||
@ CHECK-ERRORS: error: invalid operand for instruction
 | 
			
		||||
@ CHECK-ERRORS: error: invalid operand for instruction
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user