| 3187 | } |
| 3188 | |
| 3189 | static DecodeStatus DecodeVLD2DupInstruction(MCInst *Inst, unsigned Insn, |
| 3190 | uint64_t Address, const void *Decoder) |
| 3191 | { |
| 3192 | DecodeStatus S = MCDisassembler_Success; |
| 3193 | unsigned Rn, Rm, align, size; |
| 3194 | unsigned Rd = fieldFromInstruction_4(Insn, 12, 4); |
| 3195 | Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4; |
| 3196 | Rn = fieldFromInstruction_4(Insn, 16, 4); |
| 3197 | Rm = fieldFromInstruction_4(Insn, 0, 4); |
| 3198 | align = fieldFromInstruction_4(Insn, 4, 1); |
| 3199 | size = 1 << fieldFromInstruction_4(Insn, 6, 2); |
| 3200 | align *= 2 * size; |
| 3201 | |
| 3202 | switch (MCInst_getOpcode(Inst)) { |
| 3203 | case ARM_VLD2DUPd16: case ARM_VLD2DUPd32: case ARM_VLD2DUPd8: |
| 3204 | case ARM_VLD2DUPd16wb_fixed: case ARM_VLD2DUPd16wb_register: |
| 3205 | case ARM_VLD2DUPd32wb_fixed: case ARM_VLD2DUPd32wb_register: |
| 3206 | case ARM_VLD2DUPd8wb_fixed: case ARM_VLD2DUPd8wb_register: |
| 3207 | if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder))) |
| 3208 | return MCDisassembler_Fail; |
| 3209 | break; |
| 3210 | |
| 3211 | case ARM_VLD2DUPd16x2: case ARM_VLD2DUPd32x2: case ARM_VLD2DUPd8x2: |
| 3212 | case ARM_VLD2DUPd16x2wb_fixed: case ARM_VLD2DUPd16x2wb_register: |
| 3213 | case ARM_VLD2DUPd32x2wb_fixed: case ARM_VLD2DUPd32x2wb_register: |
| 3214 | case ARM_VLD2DUPd8x2wb_fixed: case ARM_VLD2DUPd8x2wb_register: |
| 3215 | if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder))) |
| 3216 | return MCDisassembler_Fail; |
| 3217 | break; |
| 3218 | |
| 3219 | default: |
| 3220 | if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder))) |
| 3221 | return MCDisassembler_Fail; |
| 3222 | break; |
| 3223 | } |
| 3224 | |
| 3225 | if (Rm != 0xF) |
| 3226 | MCOperand_CreateImm0(Inst, 0); |
| 3227 | |
| 3228 | if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder))) |
| 3229 | return MCDisassembler_Fail; |
| 3230 | |
| 3231 | MCOperand_CreateImm0(Inst, align); |
| 3232 | |
| 3233 | if (Rm != 0xD && Rm != 0xF) { |
| 3234 | if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder))) |
| 3235 | return MCDisassembler_Fail; |
| 3236 | } |
| 3237 | |
| 3238 | return S; |
| 3239 | } |
| 3240 | |
| 3241 | static DecodeStatus DecodeVLD3DupInstruction(MCInst *Inst, unsigned Insn, |
| 3242 | uint64_t Address, const void *Decoder) |
nothing calls this directly
no test coverage detected
searching dependent graphs…