qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 6/8] target-arm: A64: Add integer ops from SI


From: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH v2 6/8] target-arm: A64: Add integer ops from SIMD 3-same group
Date: Sat, 25 Jan 2014 18:35:39 +0000

On 23 January 2014 15:28, Peter Maydell <address@hidden> 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]