| 4049 | } |
| 4050 | |
| 4051 | static DecodeStatus DecodeT2LdStPre(MCInst *Inst, unsigned Insn, |
| 4052 | uint64_t Address, const void *Decoder) |
| 4053 | { |
| 4054 | DecodeStatus S = MCDisassembler_Success; |
| 4055 | unsigned load; |
| 4056 | unsigned Rt = fieldFromInstruction_4(Insn, 12, 4); |
| 4057 | unsigned Rn = fieldFromInstruction_4(Insn, 16, 4); |
| 4058 | unsigned addr = fieldFromInstruction_4(Insn, 0, 8); |
| 4059 | addr |= fieldFromInstruction_4(Insn, 9, 1) << 8; |
| 4060 | addr |= Rn << 9; |
| 4061 | load = fieldFromInstruction_4(Insn, 20, 1); |
| 4062 | |
| 4063 | if (Rn == 15) { |
| 4064 | switch (MCInst_getOpcode(Inst)) { |
| 4065 | case ARM_t2LDR_PRE: |
| 4066 | case ARM_t2LDR_POST: |
| 4067 | MCInst_setOpcode(Inst, ARM_t2LDRpci); |
| 4068 | break; |
| 4069 | case ARM_t2LDRB_PRE: |
| 4070 | case ARM_t2LDRB_POST: |
| 4071 | MCInst_setOpcode(Inst, ARM_t2LDRBpci); |
| 4072 | break; |
| 4073 | case ARM_t2LDRH_PRE: |
| 4074 | case ARM_t2LDRH_POST: |
| 4075 | MCInst_setOpcode(Inst, ARM_t2LDRHpci); |
| 4076 | break; |
| 4077 | case ARM_t2LDRSB_PRE: |
| 4078 | case ARM_t2LDRSB_POST: |
| 4079 | if (Rt == 15) |
| 4080 | MCInst_setOpcode(Inst, ARM_t2PLIpci); |
| 4081 | else |
| 4082 | MCInst_setOpcode(Inst, ARM_t2LDRSBpci); |
| 4083 | break; |
| 4084 | case ARM_t2LDRSH_PRE: |
| 4085 | case ARM_t2LDRSH_POST: |
| 4086 | MCInst_setOpcode(Inst, ARM_t2LDRSHpci); |
| 4087 | break; |
| 4088 | default: |
| 4089 | return MCDisassembler_Fail; |
| 4090 | } |
| 4091 | |
| 4092 | return DecodeT2LoadLabel(Inst, Insn, Address, Decoder); |
| 4093 | } |
| 4094 | |
| 4095 | if (!load) { |
| 4096 | if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) |
| 4097 | return MCDisassembler_Fail; |
| 4098 | } |
| 4099 | |
| 4100 | if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder))) |
| 4101 | return MCDisassembler_Fail; |
| 4102 | |
| 4103 | if (load) { |
| 4104 | if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) |
| 4105 | return MCDisassembler_Fail; |
| 4106 | } |
| 4107 | |
| 4108 | if (!Check(&S, DecodeT2AddrModeImm8(Inst, addr, Address, Decoder))) |
nothing calls this directly
no test coverage detected
searching dependent graphs…