On 23 January 2014 15:28, Peter Maydell <peter.mayd...@linaro.org> wrote: > Add some of the integer operations in the SIMD 3-same group: > specifically, the comparisons, addition and subtraction. >
> @@ -6040,7 +6062,141 @@ static void disas_simd_3same_float(DisasContext *s, > uint32_t insn) > /* Integer op subgroup of C3.6.16. */ > static void disas_simd_3same_int(DisasContext *s, uint32_t insn) > { > - unsupported_encoding(s, insn); > + int is_q = extract32(insn, 30, 1); > + int u = extract32(insn, 29, 1); > + int size = extract32(insn, 22, 2); > + int opcode = extract32(insn, 11, 5); > + int rm = extract32(insn, 16, 5); > + int rn = extract32(insn, 5, 5); > + int rd = extract32(insn, 0, 5); > + int pass; > + > + switch (opcode) { > + case 0x13: /* MUL, PMUL */ > + if (u && size != 0) { > + unallocated_encoding(s); > + return; > + } > + /* fall through */ > + case 0x0: /* SHADD, UHADD */ > + case 0x2: /* SRHADD, URHADD */ > + case 0x4: /* SHSUB, UHSUB */ > + case 0xc: /* SMAX, UMAX */ > + case 0xd: /* SMIN, UMIN */ > + case 0xe: /* SABD, UABD */ > + case 0xf: /* SABA, UABA */ > + case 0x12: /* MLA, MLS */ > + if (size == 3) { > + unallocated_encoding(s); > + return; > + } > + unsupported_encoding(s, insn); > + return; > + case 0x1: /* SQADD */ > + case 0x5: /* SQSUB */ > + case 0x8: /* SSHL, USHL */ > + case 0x9: /* SQSHL, UQSHL */ > + case 0xa: /* SRSHL, URSHL */ > + case 0xb: /* SQRSHL, UQRSHL */ > + if (size == 3 && !is_q) { > + unallocated_encoding(s); > + return; > + } > + unsupported_encoding(s, insn); > + return; > + default: > + if (size == 3 && !is_q) { > + unallocated_encoding(s); > + return; > + } > + break; > + } Just noticed this switch is missing a case: case 0x16: /* SQDMULH, SQRDMULH */ if (size == 0 || size == 3) { unallocated_encoding(s); return; } break; thanks -- PMM