def instr_SBFX(obj, widthm1, Rd, lsb, Rn): obj.d = env.regs[Rd] obj.n = env.regs[Rn] obj.lsbit = env.cst(lsb, 5) obj.widthminus1 = env.cst(widthm1, 5) obj.operands = [obj.d, obj.n] obj.type = type_data_processing
def A_default(obj,widthm1,Rd,lsb,Rn): obj.d = env.regs[Rd] obj.n = env.regs[Rn] if 15 in (Rd,Rn): raise InstructionError(obj) obj.lsbit = env.cst(lsb,5) obj.widthminus1 = env.cst(widthm1,5) obj.operands = [obj.d,obj.n, obj.lsbit, obj.widthminus1+1] obj.type = type_data_processing
def A_label(obj,S,imm10H,J1,J2,imm10L): I1, I2 = str(~(J1^S)&0x1), str(~(J2^S)&0x1) v = int(str(S)+I1+I2+imm10H+imm10L+'00',2) obj.imm32 = env.cst(v,25).signextend(32) obj.operands = [obj.imm32] obj.type = type_control_flow obj.cond = env.CONDITION_AL
def T2_ADD_i(obj,Rdn,imm8): obj.setflags = ~InITBlock(env.internals['itstate']) obj.n = env.regs[Rdn] obj.d = obj.n obj.imm32 = env.cst(imm8,32) obj.operands = [obj.d,obj.n,obj.imm32] obj.type = type_data_processing
def T1_RSB(obj,Rn,Rd): obj.setflags = ~InITBlock(env.internals['itstate']) obj.d = env.regs[Rd] obj.n = env.regs[Rn] obj.imm32 = env.cst(0,32) obj.operands = [obj.d,obj.n,obj.imm32] obj.type = type_data_processing
def T1_LDR_literal(obj,Rt,imm8): obj.n = env.pc obj.t = env.regs[Rt] obj.imm32 = env.cst(imm8<<2,32) obj.add = True obj.operands = [obj.t, obj.n, obj.imm32] obj.type = type_data_processing
def A_default(obj, Rn, imm8): obj.n = env.regs[Rn] obj.imm32 = env.cst(imm8, 32) obj.operands = [obj.n, obj.imm32] obj.type = type_data_processing obj.stype = None obj.cond = env.CONDITION_AL
def A_sreg(obj,sat_imm,Rd,imm5,sh,Rn): obj.d = env.regs[Rd] obj.n = DecodeShift(sh<<1,env.regs[Rn],env.cst(imm5,5)) obj.saturate_to = sat_imm+1 obj.operands = [obj.d,obj.saturate_to,obj.n] if env.pc in obj.operands: raise InstructionError(obj) obj.type = type_data_processing
def A_default(obj, Rd, imm8): obj.d = env.regs[Rd] obj.n = env.sp obj.imm32 = env.cst(imm8 << 2, 32) obj.operands = [obj.d, obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj, Rd, imm8): obj.setflags = ~InITBlock(env.internals['itstate']) obj.d = env.regs[Rd] obj.imm32 = env.cst(imm8, 32) obj.operands = [obj.d, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj,Rd,imm8): obj.setflags = ~InITBlock(env.internals['itstate']) obj.d = env.regs[Rd] obj.imm32 = env.cst(imm8,32) obj.operands = [obj.d, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj, i, imm5, Rn): obj.setflags = False obj.n = env.regs[Rn] obj.imm32 = env.cst(int(i + imm5 + "0", 2), 32) obj.operands = [obj.n, obj.imm32] obj.type = type_control_flow obj.cond = env.CONDITION_AL
def instr_PLx(obj,U,Rt,imm12): obj.n = env.pc obj.add = (U==1) obj.imm32 = env.cst(imm12,32) obj.operands = [obj.n, obj.imm32] obj.type = type_cpu_state obj.cond = env.CONDITION_AL
def A_adr(obj, Rd, imm8): obj.setflags = False obj.d = env.regs[Rd] obj.imm32 = env.cst(imm8 << 2, 32) obj.operands = [obj.d, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj, imm4, Rd, imm12): obj.d = env.regs[Rd] if Rd == 15: raise InstructionError(obj) obj.imm16 = env.cst((imm4 << 12) + imm12, 16) obj.operands = [obj.d, obj.imm16] obj.type = type_data_processing
def A_default(obj, i, imm4, imm3, Rd, imm8): obj.d = env.regs[Rd] if BadReg(Rd): raise InstructionError(obj) obj.imm16 = env.cst(int(imm4 + i + imm3 + imm8, 2), 16) obj.operands = [obj.d, obj.imm16] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj,i,imm4,imm3,Rd,imm8): obj.d = env.regs[Rd] if BadReg(Rd): raise InstructionError(obj) obj.imm16 = env.cst(int(imm4+i+imm3+imm8,2),16) obj.operands = [obj.d, obj.imm16] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_label(obj, S, imm10H, J1, J2, imm10L): I1, I2 = str(~(J1 ^ S) & 0x1), str(~(J2 ^ S) & 0x1) v = int(str(S) + I1 + I2 + imm10H + imm10L + "00", 2) obj.imm32 = env.cst(v, 25).signextend(32) obj.operands = [obj.imm32] obj.type = type_control_flow obj.cond = env.CONDITION_AL
def A_default(obj,imm7): obj.d = env.sp obj.n = env.sp obj.imm32 = env.cst(imm7<<2,32) obj.operands = [obj.d,obj.n,obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def instr_PLx(obj, U, Rt, imm12): obj.n = env.pc obj.add = U == 1 obj.imm32 = env.cst(imm12, 32) obj.operands = [obj.n, obj.imm32] obj.type = type_cpu_state obj.cond = env.CONDITION_AL
def T2_LDR_literal(obj, U, Rt, imm12): obj.n = env.pc obj.t = env.regs[Rt] obj.imm32 = env.cst(imm12, 32) obj.add = (U == 1) obj.operands = [obj.t, obj.n, obj.imm32] obj.type = type_data_processing
def T1_STREX(obj, Rn, Rt, Rd, imm8): obj.d = env.regs[Rd] obj.t = env.regs[Rt] obj.n = env.regs[Rn] obj.imm32 = env.cst(imm8 << 2, 32) obj.operands = [obj.d, obj.t, obj.n, obj.imm32] obj.type = type_data_processing
def A_sreg(obj,S,Rn,Rd,imm5,stype,Rm): obj.setflags = (S==1) obj.n = env.regs[Rn] obj.d = env.regs[Rd] obj.m = DecodeShift(stype,env.regs[Rm],env.cst(imm5,5)) obj.operands = [obj.d,obj.n,obj.m] obj.type = type_data_processing if obj.d is env.pc: obj.type = type_control_flow
def A_sreg(obj, Rn, imm5, stype, Rm): obj.n = env.regs[Rn] obj.m = DecodeShift(stype, env.regs[Rm], env.cst(imm5, 5)) obj.stype = stype obj.shift = imm5 obj.m = env.regs[Rm] obj.operands = [obj.n, obj.m] obj.type = type_data_processing
def A_label(obj,S,imm10,J1,J2,imm11): I1 = '1' if J1==S else '0' I2 = '1' if J2==S else '0' v = int(S+I1+I2+imm10+imm11+'0',2) obj.imm32 = env.cst(v,25).signextend(32) obj.operands = [obj.imm32] obj.type = type_control_flow obj.cond = env.CONDITION_AL
def A_default(obj,imm5,Rm,Rd): obj.setflags = ~InITBlock(env.internals['itstate']) obj.d = env.regs[Rd] obj.m = env.regs[Rm] obj.imm5 = env.cst(imm5,5) obj.operands = [obj.d,obj.m,obj.imm5] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_label(obj, S, imm10, J1, J2, imm11): I1 = "1" if J1 == S else "0" I2 = "1" if J2 == S else "0" v = int(S + I1 + I2 + imm10 + imm11 + "0", 2) obj.imm32 = env.cst(v, 25).signextend(32) obj.operands = [obj.imm32] obj.type = type_control_flow obj.cond = env.CONDITION_AL
def A_sreg(obj, Rn, Rd, imm5, tb, Rm): obj.n = env.regs[Rn] obj.d = env.regs[Rd] if 15 in (Rd, Rn, Rm): raise InstructionError(obj) obj.m = DecodeShift(tb < 1, env.regs[Rm], env.cst(imm5, 5)) obj.operands = [obj.d, obj.n, obj.m] obj.type = type_data_processing
def A_sreg(obj,Rn,Rd,imm5,tb,Rm): obj.n = env.regs[Rn] obj.d = env.regs[Rd] if 15 in (Rd,Rn,Rm): raise InstructionError(obj) obj.mnemonic += 'BT' if tb==0 else 'TB' obj.m = DecodeShift(tb<1,env.regs[Rm],env.cst(imm5,5)) obj.operands = [obj.d,obj.n,obj.m] obj.type = type_data_processing
def A_default(obj, imm5, Rm, Rd): obj.setflags = ~InITBlock(env.internals['itstate']) obj.d = env.regs[Rd] obj.m = env.regs[Rm] obj.imm5 = env.cst(imm5, 5) obj.operands = [obj.d, obj.m, obj.imm5] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_deref(obj,Rn,Rt,imm8): obj.t = env.regs[Rt] obj.n = env.regs[Rn] if BadReg(Rt) or Rn==15: raise InstructionError(obj) obj.imm32 = env.cst(imm8<<2,32) obj.operands = [obj.t, obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj, Rn, Rd): obj.setflags = ~InITBlock(env.internals["itstate"]) obj.d = env.regs[Rd] obj.n = env.regs[Rn] obj.imm32 = env.cst(0, 32) obj.operands = [obj.d, obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj, imm7): obj.setflags = False obj.d = env.sp obj.n = env.sp obj.imm32 = env.cst(imm7 << 2, 32) obj.operands = [obj.d, obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_deref(obj, Rn, Rt, imm8): obj.t = env.regs[Rt] obj.n = env.regs[Rn] if BadReg(Rt) or Rn == 15: raise InstructionError(obj) obj.imm32 = env.cst(imm8 << 2, 32) obj.operands = [obj.t, obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj, S, imm3, Rd, imm2, Rm): obj.setflags = (S == 1) obj.d = env.regs[Rd] obj.m = env.regs[Rm] if BadReg(Rd) or BadReg(Rm): raise InstructionError(obj) obj.imm5 = env.cst((imm3 << 2) + imm2, 5) obj.operands = [obj.d, obj.n, obj.imm5] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj,S,imm3,Rd,imm2,Rm): obj.setflags = (S==1) obj.d = env.regs[Rd] obj.m = env.regs[Rm] if BadReg(Rd) or BadReg(Rm): raise InstructionError(obj) obj.imm5 = env.cst(imm3<<2+imm2,5) obj.operands = [obj.d,obj.n,obj.imm5] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def instr_PLx(obj,U,R,Rn,imm5,stype,Rm): obj.n = env.regs[Rn] obj.m = DecodeShift(stype,env.regs[Rm],env.cst(imm5,5)) if Rm==15: raise InstructionError(obj) obj.add = (U==1) obj.is_pldw = (R==0) if obj._is_pldw: obj.mnemonic += 'W' obj.operands = [obj.n,obj.m] obj.type = type_cpu_state
def T1_LDRx(obj,imm5,Rn,Rt,_s): obj.n = env.regs[Rn] obj.t = env.regs[Rt] obj.imm32 = env.cst(imm5<<_s,32) obj.index = True obj.add = True obj.wback = False obj.operands = [obj.t, obj.n, obj.imm32] obj.type = type_data_processing
def A_deref(obj,U,Rt,imm12): obj.n = env.pc obj.t = env.regs[Rt] if Rt==15: raise InstructionError(obj) # see PLDxx obj.imm32 = env.cst(imm12,32) obj.add = (U==1) obj.operands = [obj.t, obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def instr_PLx(obj, U, R, Rn, imm5, stype, Rm): obj.n = env.regs[Rn] obj.m = DecodeShift(stype, env.regs[Rm], env.cst(imm5, 5)) if Rm == 15: raise InstructionError(obj) obj.add = U == 1 obj.is_pldw = R == 0 obj.operands = [obj.n, obj.m] obj.type = type_cpu_state
def A_deref(obj, U, Rt, imm12): obj.n = env.pc obj.t = env.regs[Rt] if Rt == 15: raise InstructionError(obj) # see PLDxx obj.imm32 = env.cst(imm12, 32) obj.add = (U == 1) obj.operands = [obj.t, obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def T3_LDR(obj, Rn, Rt, imm12): obj.n = env.regs[Rn] obj.t = env.regs[Rt] obj.imm32 = env.cst(imm12, 32) obj.index = True obj.add = True obj.wback = False obj.operands = [obj.t, obj.n, obj.imm32] obj.type = type_data_processing
def A_deref(obj,Rt,imm8): obj.n = env.pc obj.t = env.regs[Rt] obj.imm32 = env.cst(imm8<<2,32) obj.index = True obj.add = True obj.wback = False obj.operands = [obj.t, obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj,Rn,Rt,imm12): obj.n = env.regs[Rn] obj.t = env.regs[Rt] if Rt==15: raise InstructionError(obj) # see PLDxx obj.imm32 = env.cst(imm12,32) obj.index = True obj.add = True obj.wback = False obj.operands = [obj.t, obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_deref(obj,P,U,W,Rn,Rt,imm4H,imm4L): obj.n = env.regs[Rn] obj.t = env.regs[Rt] obj.t2 = env.regs[Rt+1] if Rt==14 or Rt%2==1: raise InstructionError(obj) obj.imm32 = env.cst(imm4H<<4+imm4L,32) obj.index = (P==1) obj.wback = (P==0)|(W==1) obj.add = (U==1) if obj.wback and (Rn==15 or Rn==Rt or Rn==Rt+1): raise InstructionError(obj) obj.operands = [obj.t,obj.t2,obj.n,obj.imm32] obj.type = type_data_processing
def A_deref(obj,P,U,W,Rn,Rt,Rt2,imm8): obj.t = env.regs[Rt] obj.t2 = env.regs[Rt2] obj.n = env.regs[Rn] obj.imm32 = env.cst(imm8<<2,32) obj.index = (P==1) obj.wback = (W==1) obj.add = (U==1) if obj.wback and (Rn==Rt or Rn==Rt2): raise InstructionError(obj) if BadReg(Rt) or BadReg(Rt2) or Rt==Rt2: raise InstructionError(obj) obj.operands = [obj.t, obj.t2, obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj,S,Rd,imm5,Rm): obj.setflags = (S==1) obj.d = env.regs[Rd] obj.m = env.regs[Rm] obj.type = type_data_processing if imm5==0: shift_n = 32 if obj.mnemonic in ('LSR','ASR') else imm5 if obj.mnemonic=='ROR': obj.mnemonic='RRX' obj.operands = [obj.d,obj.m] return else: shift_n = imm5 obj.operands = [obj.d,obj.m,env.cst(shift_n,5)] if obj.d is env.pc: obj.type = type_control_flow
def A_deref(obj,P,U,W,Rn,Rt,imm4H,imm4L): obj.n = env.regs[Rn] obj.t = env.regs[Rt] obj.imm32 = env.cst(imm4H<<4+imm4L,32) if P==0 and W==1: obj.mnemonic += "T" obj.postindex = True obj.register_form = False if (15 in (Rt,Rn)) or (Rn==Rt): raise InstructionError(obj) else: obj.index = (P==1) obj.wback = (P==0)|(W==1) if Rt==15 or (obj.wback and Rn==Rt): raise InstructionError(obj) obj.add = (U==1) obj.operands = [obj.t,obj.n,obj.imm32] obj.type = type_data_processing
def A_deref(obj,Rn,Rt,P,U,W,imm8): obj.n = env.regs[Rn] obj.t = env.regs[Rt] if Rt==15: raise InstructionError(obj) # see PLDxx obj.imm32 = env.cst(imm8,32) if P==1 and U==1 and W==0: obj.mnemonic += 'T' obj.postindex = False obj.register_form = False else: obj.index = (P==1) obj.wback = (W==1) if BadReg(Rt) and (Rn==Rt): raise InstructionError(obj) obj.add = (U==1) obj.operands = [obj.t, obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_deref(obj,P,U,W,Rn,Rt,imm12): obj.n = env.regs[Rn] obj.t = env.regs[Rt] obj.imm32 = env.cst(imm12,32) if Rn==15: if not (P==1 and W==0): raise InstructionError(obj) if P==0 and W==1: obj.mnemonic += 'T' obj.postindex = True obj.register_form = False if (15 in (Rt,Rn)) or (Rn==Rt): raise InstructionError(obj) else: obj.index = (P==1) obj.wback = (P==0)|(W==1) if obj.wback and Rn==Rt: raise InstructionError(obj) obj.add = (U==1) obj.operands = [obj.t,obj.n,obj.imm32] obj.type = type_data_processing if obj.t is env.pc : obj.type = type_control_flow
def instr_PLx(obj,U,Rn,imm5,stype,Rm): obj.n = env.regs[Rn] obj.m = DecodeShift(stype,env.regs[Rm],env.cst(imm5,5)) obj.add = (U==1) obj.operands = [obj.n,obj.m] obj.type = type_cpu_state
def A_default(obj,imm24): obj.imm32 = env.cst(imm24,32) obj.operands = [obj.imm32] obj.type = type_cpu_state
def A_adr(obj,Rd,imm8): obj.d = env.regs[Rd] obj.imm32 = env.cst(imm8<<2,32) obj.operands = [obj.d,obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj,Rn,imm8): obj.n = env.regs[Rn] obj.imm32 = env.cst(imm8,32) obj.operands = [obj.n, obj.imm32] obj.type = type_data_processing obj.cond = env.CONDITION_AL
def A_default(obj,i,imm5,Rn): obj.n = env.regs[Rn] obj.imm32 = env.cst(int(i+imm5+'0',2),32) obj.operands = [obj.n, obj.imm32] obj.type = type_control_flow obj.cond = env.CONDITION_AL
def A_default(obj,imm8): obj.imm32 = env.cst(imm8,32) obj.operands = [obj.imm32] obj.type = type_cpu_state obj.cond = env.CONDITION_AL
def A_label(obj,imm11): obj.imm32 = env.cst(imm11<<1,12).signextend(32) obj.operands = [obj.imm32] obj.type = type_control_flow obj.cond = env.CONDITION_AL