| // Copyright 2017 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package arm64asm |
| |
| import ( |
| "encoding/binary" |
| "fmt" |
| ) |
| |
| type instArgs [5]instArg |
| |
| // An instFormat describes the format of an instruction encoding. |
| // An instruction with 32-bit value x matches the format if x&mask == value |
| // and the predicator: canDecode(x) return true. |
| type instFormat struct { |
| mask uint32 |
| value uint32 |
| op Op |
| // args describe how to decode the instruction arguments. |
| // args is stored as a fixed-size array. |
| // if there are fewer than len(args) arguments, args[i] == 0 marks |
| // the end of the argument list. |
| args instArgs |
| canDecode func(instr uint32) bool |
| } |
| |
| var ( |
| errShort = fmt.Errorf("truncated instruction") |
| errUnknown = fmt.Errorf("unknown instruction") |
| ) |
| |
| var decoderCover []bool |
| |
| func init() { |
| decoderCover = make([]bool, len(instFormats)) |
| } |
| |
| // Decode decodes the 4 bytes in src as a single instruction. |
| func Decode(src []byte) (inst Inst, err error) { |
| if len(src) < 4 { |
| return Inst{}, errShort |
| } |
| |
| x := binary.LittleEndian.Uint32(src) |
| |
| Search: |
| for i := range instFormats { |
| f := &instFormats[i] |
| if x&f.mask != f.value { |
| continue |
| } |
| if f.canDecode != nil && !f.canDecode(x) { |
| continue |
| } |
| // Decode args. |
| var args Args |
| for j, aop := range f.args { |
| if aop == 0 { |
| break |
| } |
| arg := decodeArg(aop, x) |
| if arg == nil { // Cannot decode argument |
| continue Search |
| } |
| args[j] = arg |
| } |
| decoderCover[i] = true |
| inst = Inst{ |
| Op: f.op, |
| Args: args, |
| Enc: x, |
| } |
| return inst, nil |
| } |
| return Inst{}, errUnknown |
| } |
| |
| // decodeArg decodes the arg described by aop from the instruction bits x. |
| // It returns nil if x cannot be decoded according to aop. |
| func decodeArg(aop instArg, x uint32) Arg { |
| switch aop { |
| default: |
| return nil |
| |
| case arg_Da: |
| return D0 + Reg((x>>10)&(1<<5-1)) |
| |
| case arg_Dd: |
| return D0 + Reg(x&(1<<5-1)) |
| |
| case arg_Dm: |
| return D0 + Reg((x>>16)&(1<<5-1)) |
| |
| case arg_Dn: |
| return D0 + Reg((x>>5)&(1<<5-1)) |
| |
| case arg_Hd: |
| return H0 + Reg(x&(1<<5-1)) |
| |
| case arg_Hn: |
| return H0 + Reg((x>>5)&(1<<5-1)) |
| |
| case arg_IAddSub: |
| imm12 := (x >> 10) & (1<<12 - 1) |
| shift := (x >> 22) & (1<<2 - 1) |
| if shift > 1 { |
| return nil |
| } |
| shift = shift * 12 |
| return ImmShift{uint16(imm12), uint8(shift)} |
| |
| case arg_Sa: |
| return S0 + Reg((x>>10)&(1<<5-1)) |
| |
| case arg_Sd: |
| return S0 + Reg(x&(1<<5-1)) |
| |
| case arg_Sm: |
| return S0 + Reg((x>>16)&(1<<5-1)) |
| |
| case arg_Sn: |
| return S0 + Reg((x>>5)&(1<<5-1)) |
| |
| case arg_Wa: |
| return W0 + Reg((x>>10)&(1<<5-1)) |
| |
| case arg_Wd: |
| return W0 + Reg(x&(1<<5-1)) |
| |
| case arg_Wds: |
| return RegSP(W0) + RegSP(x&(1<<5-1)) |
| |
| case arg_Wm: |
| return W0 + Reg((x>>16)&(1<<5-1)) |
| |
| case arg_Rm_extend__UXTB_0__UXTH_1__UXTW_2__LSL_UXTX_3__SXTB_4__SXTH_5__SXTW_6__SXTX_7__0_4: |
| return handle_ExtendedRegister(x, true) |
| |
| case arg_Wm_extend__UXTB_0__UXTH_1__LSL_UXTW_2__UXTX_3__SXTB_4__SXTH_5__SXTW_6__SXTX_7__0_4: |
| return handle_ExtendedRegister(x, false) |
| |
| case arg_Wn: |
| return W0 + Reg((x>>5)&(1<<5-1)) |
| |
| case arg_Wns: |
| return RegSP(W0) + RegSP((x>>5)&(1<<5-1)) |
| |
| case arg_Xa: |
| return X0 + Reg((x>>10)&(1<<5-1)) |
| |
| case arg_Xd: |
| return X0 + Reg(x&(1<<5-1)) |
| |
| case arg_Xds: |
| return RegSP(X0) + RegSP(x&(1<<5-1)) |
| |
| case arg_Xm: |
| return X0 + Reg((x>>16)&(1<<5-1)) |
| |
| case arg_Wm_shift__LSL_0__LSR_1__ASR_2__0_31: |
| return handle_ImmediateShiftedRegister(x, 31, true, false) |
| |
| case arg_Wm_shift__LSL_0__LSR_1__ASR_2__ROR_3__0_31: |
| return handle_ImmediateShiftedRegister(x, 31, true, true) |
| |
| case arg_Xm_shift__LSL_0__LSR_1__ASR_2__0_63: |
| return handle_ImmediateShiftedRegister(x, 63, false, false) |
| |
| case arg_Xm_shift__LSL_0__LSR_1__ASR_2__ROR_3__0_63: |
| return handle_ImmediateShiftedRegister(x, 63, false, true) |
| |
| case arg_Xn: |
| return X0 + Reg((x>>5)&(1<<5-1)) |
| |
| case arg_Xns: |
| return RegSP(X0) + RegSP((x>>5)&(1<<5-1)) |
| |
| case arg_slabel_imm14_2: |
| imm14 := ((x >> 5) & (1<<14 - 1)) |
| return PCRel(((int64(imm14) << 2) << 48) >> 48) |
| |
| case arg_slabel_imm19_2: |
| imm19 := ((x >> 5) & (1<<19 - 1)) |
| return PCRel(((int64(imm19) << 2) << 43) >> 43) |
| |
| case arg_slabel_imm26_2: |
| imm26 := (x & (1<<26 - 1)) |
| return PCRel(((int64(imm26) << 2) << 36) >> 36) |
| |
| case arg_slabel_immhi_immlo_0: |
| immhi := ((x >> 5) & (1<<19 - 1)) |
| immlo := ((x >> 29) & (1<<2 - 1)) |
| immhilo := (immhi)<<2 | immlo |
| return PCRel((int64(immhilo) << 43) >> 43) |
| |
| case arg_slabel_immhi_immlo_12: |
| immhi := ((x >> 5) & (1<<19 - 1)) |
| immlo := ((x >> 29) & (1<<2 - 1)) |
| immhilo := (immhi)<<2 | immlo |
| return PCRel(((int64(immhilo) << 12) << 31) >> 31) |
| |
| case arg_Xns_mem: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrOffset, 0} |
| |
| case arg_Xns_mem_extend_m__UXTW_2__LSL_3__SXTW_6__SXTX_7__0_0__1_1: |
| return handle_MemExtend(x, 1, false) |
| |
| case arg_Xns_mem_extend_m__UXTW_2__LSL_3__SXTW_6__SXTX_7__0_0__2_1: |
| return handle_MemExtend(x, 2, false) |
| |
| case arg_Xns_mem_extend_m__UXTW_2__LSL_3__SXTW_6__SXTX_7__0_0__3_1: |
| return handle_MemExtend(x, 3, false) |
| |
| case arg_Xns_mem_extend_m__UXTW_2__LSL_3__SXTW_6__SXTX_7__absent_0__0_1: |
| return handle_MemExtend(x, 1, true) |
| |
| case arg_Xns_mem_optional_imm12_1_unsigned: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm12 := (x >> 10) & (1<<12 - 1) |
| return MemImmediate{Rn, AddrOffset, int32(imm12)} |
| |
| case arg_Xns_mem_optional_imm12_2_unsigned: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm12 := (x >> 10) & (1<<12 - 1) |
| return MemImmediate{Rn, AddrOffset, int32(imm12 << 1)} |
| |
| case arg_Xns_mem_optional_imm12_4_unsigned: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm12 := (x >> 10) & (1<<12 - 1) |
| return MemImmediate{Rn, AddrOffset, int32(imm12 << 2)} |
| |
| case arg_Xns_mem_optional_imm12_8_unsigned: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm12 := (x >> 10) & (1<<12 - 1) |
| return MemImmediate{Rn, AddrOffset, int32(imm12 << 3)} |
| |
| case arg_Xns_mem_optional_imm7_4_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm7 := (x >> 15) & (1<<7 - 1) |
| return MemImmediate{Rn, AddrOffset, ((int32(imm7 << 2)) << 23) >> 23} |
| |
| case arg_Xns_mem_optional_imm7_8_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm7 := (x >> 15) & (1<<7 - 1) |
| return MemImmediate{Rn, AddrOffset, ((int32(imm7 << 3)) << 22) >> 22} |
| |
| case arg_Xns_mem_optional_imm9_1_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm9 := (x >> 12) & (1<<9 - 1) |
| return MemImmediate{Rn, AddrOffset, (int32(imm9) << 23) >> 23} |
| |
| case arg_Xns_mem_post_imm7_4_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm7 := (x >> 15) & (1<<7 - 1) |
| return MemImmediate{Rn, AddrPostIndex, ((int32(imm7 << 2)) << 23) >> 23} |
| |
| case arg_Xns_mem_post_imm7_8_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm7 := (x >> 15) & (1<<7 - 1) |
| return MemImmediate{Rn, AddrPostIndex, ((int32(imm7 << 3)) << 22) >> 22} |
| |
| case arg_Xns_mem_post_imm9_1_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm9 := (x >> 12) & (1<<9 - 1) |
| return MemImmediate{Rn, AddrPostIndex, ((int32(imm9)) << 23) >> 23} |
| |
| case arg_Xns_mem_wb_imm7_4_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm7 := (x >> 15) & (1<<7 - 1) |
| return MemImmediate{Rn, AddrPreIndex, ((int32(imm7 << 2)) << 23) >> 23} |
| |
| case arg_Xns_mem_wb_imm7_8_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm7 := (x >> 15) & (1<<7 - 1) |
| return MemImmediate{Rn, AddrPreIndex, ((int32(imm7 << 3)) << 22) >> 22} |
| |
| case arg_Xns_mem_wb_imm9_1_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm9 := (x >> 12) & (1<<9 - 1) |
| return MemImmediate{Rn, AddrPreIndex, ((int32(imm9)) << 23) >> 23} |
| |
| case arg_Ws: |
| return W0 + Reg((x>>16)&(1<<5-1)) |
| |
| case arg_Wt: |
| return W0 + Reg(x&(1<<5-1)) |
| |
| case arg_Wt2: |
| return W0 + Reg((x>>10)&(1<<5-1)) |
| |
| case arg_Xs: |
| return X0 + Reg((x>>16)&(1<<5-1)) |
| |
| case arg_Xt: |
| return X0 + Reg(x&(1<<5-1)) |
| |
| case arg_Xt2: |
| return X0 + Reg((x>>10)&(1<<5-1)) |
| |
| case arg_immediate_0_127_CRm_op2: |
| crm_op2 := (x >> 5) & (1<<7 - 1) |
| return Imm_hint(crm_op2) |
| |
| case arg_immediate_0_15_CRm: |
| crm := (x >> 8) & (1<<4 - 1) |
| return Imm{crm, false} |
| |
| case arg_immediate_0_15_nzcv: |
| nzcv := x & (1<<4 - 1) |
| return Imm{nzcv, false} |
| |
| case arg_immediate_0_31_imm5: |
| imm5 := (x >> 16) & (1<<5 - 1) |
| return Imm{imm5, false} |
| |
| case arg_immediate_0_31_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| if immr > 31 { |
| return nil |
| } |
| return Imm{immr, false} |
| |
| case arg_immediate_0_31_imms: |
| imms := (x >> 10) & (1<<6 - 1) |
| if imms > 31 { |
| return nil |
| } |
| return Imm{imms, true} |
| |
| case arg_immediate_0_63_b5_b40: |
| b5 := (x >> 31) & 1 |
| b40 := (x >> 19) & (1<<5 - 1) |
| return Imm{(b5 << 5) | b40, true} |
| |
| case arg_immediate_0_63_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| return Imm{immr, false} |
| |
| case arg_immediate_0_63_imms: |
| imms := (x >> 10) & (1<<6 - 1) |
| return Imm{imms, true} |
| |
| case arg_immediate_0_65535_imm16: |
| imm16 := (x >> 5) & (1<<16 - 1) |
| return Imm{imm16, false} |
| |
| case arg_immediate_0_7_op1: |
| op1 := (x >> 16) & (1<<3 - 1) |
| return Imm{op1, true} |
| |
| case arg_immediate_0_7_op2: |
| op2 := (x >> 5) & (1<<3 - 1) |
| return Imm{op2, true} |
| |
| case arg_immediate_ASR_SBFM_32M_bitfield_0_31_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| if immr > 31 { |
| return nil |
| } |
| return Imm{immr, true} |
| |
| case arg_immediate_ASR_SBFM_64M_bitfield_0_63_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| return Imm{immr, true} |
| |
| case arg_immediate_BFI_BFM_32M_bitfield_lsb_32_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| if immr > 31 { |
| return nil |
| } |
| return Imm{32 - immr, true} |
| |
| case arg_immediate_BFI_BFM_32M_bitfield_width_32_imms: |
| imms := (x >> 10) & (1<<6 - 1) |
| if imms > 31 { |
| return nil |
| } |
| return Imm{imms + 1, true} |
| |
| case arg_immediate_BFI_BFM_64M_bitfield_lsb_64_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| return Imm{64 - immr, true} |
| |
| case arg_immediate_BFI_BFM_64M_bitfield_width_64_imms: |
| imms := (x >> 10) & (1<<6 - 1) |
| return Imm{imms + 1, true} |
| |
| case arg_immediate_BFXIL_BFM_32M_bitfield_lsb_32_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| if immr > 31 { |
| return nil |
| } |
| return Imm{immr, true} |
| |
| case arg_immediate_BFXIL_BFM_32M_bitfield_width_32_imms: |
| immr := (x >> 16) & (1<<6 - 1) |
| imms := (x >> 10) & (1<<6 - 1) |
| width := imms - immr + 1 |
| if width < 1 || width > 32-immr { |
| return nil |
| } |
| return Imm{width, true} |
| |
| case arg_immediate_BFXIL_BFM_64M_bitfield_lsb_64_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| return Imm{immr, true} |
| |
| case arg_immediate_BFXIL_BFM_64M_bitfield_width_64_imms: |
| immr := (x >> 16) & (1<<6 - 1) |
| imms := (x >> 10) & (1<<6 - 1) |
| width := imms - immr + 1 |
| if width < 1 || width > 64-immr { |
| return nil |
| } |
| return Imm{width, true} |
| |
| case arg_immediate_bitmask_32_imms_immr: |
| return handle_bitmasks(x, 32) |
| |
| case arg_immediate_bitmask_64_N_imms_immr: |
| return handle_bitmasks(x, 64) |
| |
| case arg_immediate_LSL_UBFM_32M_bitfield_0_31_immr: |
| imms := (x >> 10) & (1<<6 - 1) |
| shift := 31 - imms |
| if shift > 31 { |
| return nil |
| } |
| return Imm{shift, true} |
| |
| case arg_immediate_LSL_UBFM_64M_bitfield_0_63_immr: |
| imms := (x >> 10) & (1<<6 - 1) |
| shift := 63 - imms |
| if shift > 63 { |
| return nil |
| } |
| return Imm{shift, true} |
| |
| case arg_immediate_LSR_UBFM_32M_bitfield_0_31_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| if immr > 31 { |
| return nil |
| } |
| return Imm{immr, true} |
| |
| case arg_immediate_LSR_UBFM_64M_bitfield_0_63_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| return Imm{immr, true} |
| |
| case arg_immediate_optional_0_15_CRm: |
| crm := (x >> 8) & (1<<4 - 1) |
| return Imm_clrex(crm) |
| |
| case arg_immediate_optional_0_65535_imm16: |
| imm16 := (x >> 5) & (1<<16 - 1) |
| return Imm_dcps(imm16) |
| |
| case arg_immediate_OptLSL_amount_16_0_16: |
| imm16 := (x >> 5) & (1<<16 - 1) |
| hw := (x >> 21) & (1<<2 - 1) |
| shift := hw * 16 |
| if shift > 16 { |
| return nil |
| } |
| return ImmShift{uint16(imm16), uint8(shift)} |
| |
| case arg_immediate_OptLSL_amount_16_0_48: |
| imm16 := (x >> 5) & (1<<16 - 1) |
| hw := (x >> 21) & (1<<2 - 1) |
| shift := hw * 16 |
| return ImmShift{uint16(imm16), uint8(shift)} |
| |
| case arg_immediate_SBFIZ_SBFM_32M_bitfield_lsb_32_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| if immr > 31 { |
| return nil |
| } |
| return Imm{32 - immr, true} |
| |
| case arg_immediate_SBFIZ_SBFM_32M_bitfield_width_32_imms: |
| imms := (x >> 10) & (1<<6 - 1) |
| if imms > 31 { |
| return nil |
| } |
| return Imm{imms + 1, true} |
| |
| case arg_immediate_SBFIZ_SBFM_64M_bitfield_lsb_64_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| return Imm{64 - immr, true} |
| |
| case arg_immediate_SBFIZ_SBFM_64M_bitfield_width_64_imms: |
| imms := (x >> 10) & (1<<6 - 1) |
| return Imm{imms + 1, true} |
| |
| case arg_immediate_SBFX_SBFM_32M_bitfield_lsb_32_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| if immr > 31 { |
| return nil |
| } |
| return Imm{immr, true} |
| |
| case arg_immediate_SBFX_SBFM_32M_bitfield_width_32_imms: |
| immr := (x >> 16) & (1<<6 - 1) |
| imms := (x >> 10) & (1<<6 - 1) |
| width := imms - immr + 1 |
| if width < 1 || width > 32-immr { |
| return nil |
| } |
| return Imm{width, true} |
| |
| case arg_immediate_SBFX_SBFM_64M_bitfield_lsb_64_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| return Imm{immr, true} |
| |
| case arg_immediate_SBFX_SBFM_64M_bitfield_width_64_imms: |
| immr := (x >> 16) & (1<<6 - 1) |
| imms := (x >> 10) & (1<<6 - 1) |
| width := imms - immr + 1 |
| if width < 1 || width > 64-immr { |
| return nil |
| } |
| return Imm{width, true} |
| |
| case arg_immediate_shift_32_implicit_imm16_hw: |
| imm16 := (x >> 5) & (1<<16 - 1) |
| hw := (x >> 21) & (1<<2 - 1) |
| shift := hw * 16 |
| if shift > 16 { |
| return nil |
| } |
| result := uint32(imm16) << shift |
| return Imm{result, false} |
| |
| case arg_immediate_shift_32_implicit_inverse_imm16_hw: |
| imm16 := (x >> 5) & (1<<16 - 1) |
| hw := (x >> 21) & (1<<2 - 1) |
| shift := hw * 16 |
| if shift > 16 { |
| return nil |
| } |
| result := uint32(imm16) << shift |
| return Imm{^result, false} |
| |
| case arg_immediate_shift_64_implicit_imm16_hw: |
| imm16 := (x >> 5) & (1<<16 - 1) |
| hw := (x >> 21) & (1<<2 - 1) |
| shift := hw * 16 |
| result := uint64(imm16) << shift |
| return Imm64{result, false} |
| |
| case arg_immediate_shift_64_implicit_inverse_imm16_hw: |
| imm16 := (x >> 5) & (1<<16 - 1) |
| hw := (x >> 21) & (1<<2 - 1) |
| shift := hw * 16 |
| result := uint64(imm16) << shift |
| return Imm64{^result, false} |
| |
| case arg_immediate_UBFIZ_UBFM_32M_bitfield_lsb_32_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| if immr > 31 { |
| return nil |
| } |
| return Imm{32 - immr, true} |
| |
| case arg_immediate_UBFIZ_UBFM_32M_bitfield_width_32_imms: |
| imms := (x >> 10) & (1<<6 - 1) |
| if imms > 31 { |
| return nil |
| } |
| return Imm{imms + 1, true} |
| |
| case arg_immediate_UBFIZ_UBFM_64M_bitfield_lsb_64_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| return Imm{64 - immr, true} |
| |
| case arg_immediate_UBFIZ_UBFM_64M_bitfield_width_64_imms: |
| imms := (x >> 10) & (1<<6 - 1) |
| return Imm{imms + 1, true} |
| |
| case arg_immediate_UBFX_UBFM_32M_bitfield_lsb_32_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| if immr > 31 { |
| return nil |
| } |
| return Imm{immr, true} |
| |
| case arg_immediate_UBFX_UBFM_32M_bitfield_width_32_imms: |
| immr := (x >> 16) & (1<<6 - 1) |
| imms := (x >> 10) & (1<<6 - 1) |
| width := imms - immr + 1 |
| if width < 1 || width > 32-immr { |
| return nil |
| } |
| return Imm{width, true} |
| |
| case arg_immediate_UBFX_UBFM_64M_bitfield_lsb_64_immr: |
| immr := (x >> 16) & (1<<6 - 1) |
| return Imm{immr, true} |
| |
| case arg_immediate_UBFX_UBFM_64M_bitfield_width_64_imms: |
| immr := (x >> 16) & (1<<6 - 1) |
| imms := (x >> 10) & (1<<6 - 1) |
| width := imms - immr + 1 |
| if width < 1 || width > 64-immr { |
| return nil |
| } |
| return Imm{width, true} |
| |
| case arg_Rt_31_1__W_0__X_1: |
| b5 := (x >> 31) & 1 |
| Rt := x & (1<<5 - 1) |
| if b5 == 0 { |
| return W0 + Reg(Rt) |
| } else { |
| return X0 + Reg(Rt) |
| } |
| |
| case arg_cond_AllowALNV_Normal: |
| cond := (x >> 12) & (1<<4 - 1) |
| return Cond{uint8(cond), false} |
| |
| case arg_conditional: |
| cond := x & (1<<4 - 1) |
| return Cond{uint8(cond), false} |
| |
| case arg_cond_NotAllowALNV_Invert: |
| cond := (x >> 12) & (1<<4 - 1) |
| if (cond >> 1) == 7 { |
| return nil |
| } |
| return Cond{uint8(cond), true} |
| |
| case arg_Cm: |
| CRm := (x >> 8) & (1<<4 - 1) |
| return Imm_c(CRm) |
| |
| case arg_Cn: |
| CRn := (x >> 12) & (1<<4 - 1) |
| return Imm_c(CRn) |
| |
| case arg_option_DMB_BO_system_CRm: |
| CRm := (x >> 8) & (1<<4 - 1) |
| return Imm_option(CRm) |
| |
| case arg_option_DSB_BO_system_CRm: |
| CRm := (x >> 8) & (1<<4 - 1) |
| return Imm_option(CRm) |
| |
| case arg_option_ISB_BI_system_CRm: |
| CRm := (x >> 8) & (1<<4 - 1) |
| if CRm == 15 { |
| return Imm_option(CRm) |
| } |
| return Imm{CRm, false} |
| |
| case arg_prfop_Rt: |
| Rt := x & (1<<5 - 1) |
| return Imm_prfop(Rt) |
| |
| case arg_pstatefield_op1_op2__SPSel_05__DAIFSet_36__DAIFClr_37: |
| op1 := (x >> 16) & (1<<3 - 1) |
| op2 := (x >> 5) & (1<<3 - 1) |
| if (op1 == 0) && (op2 == 5) { |
| return SPSel |
| } else if (op1 == 3) && (op2 == 6) { |
| return DAIFSet |
| } else if (op1 == 3) && (op2 == 7) { |
| return DAIFClr |
| } |
| return nil |
| |
| case arg_sysreg_o0_op1_CRn_CRm_op2: |
| op0 := (x >> 19) & (1<<2 - 1) |
| op1 := (x >> 16) & (1<<3 - 1) |
| CRn := (x >> 12) & (1<<4 - 1) |
| CRm := (x >> 8) & (1<<4 - 1) |
| op2 := (x >> 5) & (1<<3 - 1) |
| return Systemreg{uint8(op0), uint8(op1), uint8(CRn), uint8(CRm), uint8(op2)} |
| |
| case arg_sysop_AT_SYS_CR_system: |
| //TODO: system instruction |
| return nil |
| |
| case arg_sysop_DC_SYS_CR_system: |
| //TODO: system instruction |
| return nil |
| |
| case arg_sysop_SYS_CR_system: |
| //TODO: system instruction |
| return nil |
| |
| case arg_sysop_TLBI_SYS_CR_system: |
| //TODO: system instruction |
| return nil |
| |
| case arg_Bt: |
| return B0 + Reg(x&(1<<5-1)) |
| |
| case arg_Dt: |
| return D0 + Reg(x&(1<<5-1)) |
| |
| case arg_Dt2: |
| return D0 + Reg((x>>10)&(1<<5-1)) |
| |
| case arg_Ht: |
| return H0 + Reg(x&(1<<5-1)) |
| |
| case arg_immediate_0_63_immh_immb__UIntimmhimmb64_8: |
| immh := (x >> 19) & (1<<4 - 1) |
| if (immh & 8) == 0 { |
| return nil |
| } |
| immb := (x >> 16) & (1<<3 - 1) |
| return Imm{(immh << 3) + immb - 64, true} |
| |
| case arg_immediate_0_width_immh_immb__SEEAdvancedSIMDmodifiedimmediate_0__UIntimmhimmb8_1__UIntimmhimmb16_2__UIntimmhimmb32_4: |
| immh := (x >> 19) & (1<<4 - 1) |
| immb := (x >> 16) & (1<<3 - 1) |
| if immh == 1 { |
| return Imm{(immh << 3) + immb - 8, true} |
| } else if (immh >> 1) == 1 { |
| return Imm{(immh << 3) + immb - 16, true} |
| } else if (immh >> 2) == 1 { |
| return Imm{(immh << 3) + immb - 32, true} |
| } else { |
| return nil |
| } |
| |
| case arg_immediate_0_width_immh_immb__SEEAdvancedSIMDmodifiedimmediate_0__UIntimmhimmb8_1__UIntimmhimmb16_2__UIntimmhimmb32_4__UIntimmhimmb64_8: |
| fallthrough |
| |
| case arg_immediate_0_width_m1_immh_immb__UIntimmhimmb8_1__UIntimmhimmb16_2__UIntimmhimmb32_4__UIntimmhimmb64_8: |
| immh := (x >> 19) & (1<<4 - 1) |
| immb := (x >> 16) & (1<<3 - 1) |
| if immh == 1 { |
| return Imm{(immh << 3) + immb - 8, true} |
| } else if (immh >> 1) == 1 { |
| return Imm{(immh << 3) + immb - 16, true} |
| } else if (immh >> 2) == 1 { |
| return Imm{(immh << 3) + immb - 32, true} |
| } else if (immh >> 3) == 1 { |
| return Imm{(immh << 3) + immb - 64, true} |
| } else { |
| return nil |
| } |
| |
| case arg_immediate_0_width_size__8_0__16_1__32_2: |
| size := (x >> 22) & (1<<2 - 1) |
| switch size { |
| case 0: |
| return Imm{8, true} |
| case 1: |
| return Imm{16, true} |
| case 2: |
| return Imm{32, true} |
| default: |
| return nil |
| } |
| |
| case arg_immediate_1_64_immh_immb__128UIntimmhimmb_8: |
| immh := (x >> 19) & (1<<4 - 1) |
| if (immh & 8) == 0 { |
| return nil |
| } |
| immb := (x >> 16) & (1<<3 - 1) |
| return Imm{128 - ((immh << 3) + immb), true} |
| |
| case arg_immediate_1_width_immh_immb__16UIntimmhimmb_1__32UIntimmhimmb_2__64UIntimmhimmb_4: |
| fallthrough |
| |
| case arg_immediate_1_width_immh_immb__SEEAdvancedSIMDmodifiedimmediate_0__16UIntimmhimmb_1__32UIntimmhimmb_2__64UIntimmhimmb_4: |
| immh := (x >> 19) & (1<<4 - 1) |
| immb := (x >> 16) & (1<<3 - 1) |
| if immh == 1 { |
| return Imm{16 - ((immh << 3) + immb), true} |
| } else if (immh >> 1) == 1 { |
| return Imm{32 - ((immh << 3) + immb), true} |
| } else if (immh >> 2) == 1 { |
| return Imm{64 - ((immh << 3) + immb), true} |
| } else { |
| return nil |
| } |
| |
| case arg_immediate_1_width_immh_immb__SEEAdvancedSIMDmodifiedimmediate_0__16UIntimmhimmb_1__32UIntimmhimmb_2__64UIntimmhimmb_4__128UIntimmhimmb_8: |
| immh := (x >> 19) & (1<<4 - 1) |
| immb := (x >> 16) & (1<<3 - 1) |
| if immh == 1 { |
| return Imm{16 - ((immh << 3) + immb), true} |
| } else if (immh >> 1) == 1 { |
| return Imm{32 - ((immh << 3) + immb), true} |
| } else if (immh >> 2) == 1 { |
| return Imm{64 - ((immh << 3) + immb), true} |
| } else if (immh >> 3) == 1 { |
| return Imm{128 - ((immh << 3) + immb), true} |
| } else { |
| return nil |
| } |
| |
| case arg_immediate_8x8_a_b_c_d_e_f_g_h: |
| var imm uint64 |
| if x&(1<<5) != 0 { |
| imm = (1 << 8) - 1 |
| } else { |
| imm = 0 |
| } |
| if x&(1<<6) != 0 { |
| imm += ((1 << 8) - 1) << 8 |
| } |
| if x&(1<<7) != 0 { |
| imm += ((1 << 8) - 1) << 16 |
| } |
| if x&(1<<8) != 0 { |
| imm += ((1 << 8) - 1) << 24 |
| } |
| if x&(1<<9) != 0 { |
| imm += ((1 << 8) - 1) << 32 |
| } |
| if x&(1<<16) != 0 { |
| imm += ((1 << 8) - 1) << 40 |
| } |
| if x&(1<<17) != 0 { |
| imm += ((1 << 8) - 1) << 48 |
| } |
| if x&(1<<18) != 0 { |
| imm += ((1 << 8) - 1) << 56 |
| } |
| return Imm64{imm, false} |
| |
| case arg_immediate_exp_3_pre_4_a_b_c_d_e_f_g_h: |
| pre := (x >> 5) & (1<<4 - 1) |
| exp := 1 - ((x >> 17) & 1) |
| exp = (exp << 2) + (((x >> 16) & 1) << 1) + ((x >> 9) & 1) |
| s := ((x >> 18) & 1) |
| return Imm_fp{uint8(s), int8(exp) - 3, uint8(pre)} |
| |
| case arg_immediate_exp_3_pre_4_imm8: |
| pre := (x >> 13) & (1<<4 - 1) |
| exp := 1 - ((x >> 19) & 1) |
| exp = (exp << 2) + ((x >> 17) & (1<<2 - 1)) |
| s := ((x >> 20) & 1) |
| return Imm_fp{uint8(s), int8(exp) - 3, uint8(pre)} |
| |
| case arg_immediate_fbits_min_1_max_0_sub_0_immh_immb__64UIntimmhimmb_4__128UIntimmhimmb_8: |
| fallthrough |
| |
| case arg_immediate_fbits_min_1_max_0_sub_0_immh_immb__SEEAdvancedSIMDmodifiedimmediate_0__64UIntimmhimmb_4__128UIntimmhimmb_8: |
| immh := (x >> 19) & (1<<4 - 1) |
| immb := (x >> 16) & (1<<3 - 1) |
| if (immh >> 2) == 1 { |
| return Imm{64 - ((immh << 3) + immb), true} |
| } else if (immh >> 3) == 1 { |
| return Imm{128 - ((immh << 3) + immb), true} |
| } else { |
| return nil |
| } |
| |
| case arg_immediate_fbits_min_1_max_32_sub_64_scale: |
| scale := (x >> 10) & (1<<6 - 1) |
| fbits := 64 - scale |
| if fbits > 32 { |
| return nil |
| } |
| return Imm{fbits, true} |
| |
| case arg_immediate_fbits_min_1_max_64_sub_64_scale: |
| scale := (x >> 10) & (1<<6 - 1) |
| fbits := 64 - scale |
| return Imm{fbits, true} |
| |
| case arg_immediate_floatzero: |
| return Imm{0, true} |
| |
| case arg_immediate_index_Q_imm4__imm4lt20gt_00__imm4_10: |
| Q := (x >> 30) & 1 |
| imm4 := (x >> 11) & (1<<4 - 1) |
| if Q == 1 || (imm4>>3) == 0 { |
| return Imm{imm4, true} |
| } else { |
| return nil |
| } |
| |
| case arg_immediate_MSL__a_b_c_d_e_f_g_h_cmode__8_0__16_1: |
| var shift uint8 |
| imm8 := (x >> 16) & (1<<3 - 1) |
| imm8 = (imm8 << 5) | ((x >> 5) & (1<<5 - 1)) |
| if (x>>12)&1 == 0 { |
| shift = 8 + 128 |
| } else { |
| shift = 16 + 128 |
| } |
| return ImmShift{uint16(imm8), shift} |
| |
| case arg_immediate_OptLSL__a_b_c_d_e_f_g_h_cmode__0_0__8_1: |
| imm8 := (x >> 16) & (1<<3 - 1) |
| imm8 = (imm8 << 5) | ((x >> 5) & (1<<5 - 1)) |
| cmode1 := (x >> 13) & 1 |
| shift := 8 * cmode1 |
| return ImmShift{uint16(imm8), uint8(shift)} |
| |
| case arg_immediate_OptLSL__a_b_c_d_e_f_g_h_cmode__0_0__8_1__16_2__24_3: |
| imm8 := (x >> 16) & (1<<3 - 1) |
| imm8 = (imm8 << 5) | ((x >> 5) & (1<<5 - 1)) |
| cmode1 := (x >> 13) & (1<<2 - 1) |
| shift := 8 * cmode1 |
| return ImmShift{uint16(imm8), uint8(shift)} |
| |
| case arg_immediate_OptLSLZero__a_b_c_d_e_f_g_h: |
| imm8 := (x >> 16) & (1<<3 - 1) |
| imm8 = (imm8 << 5) | ((x >> 5) & (1<<5 - 1)) |
| return ImmShift{uint16(imm8), 0} |
| |
| case arg_immediate_zero: |
| return Imm{0, true} |
| |
| case arg_Qd: |
| return Q0 + Reg(x&(1<<5-1)) |
| |
| case arg_Qn: |
| return Q0 + Reg((x>>5)&(1<<5-1)) |
| |
| case arg_Qt: |
| return Q0 + Reg(x&(1<<5-1)) |
| |
| case arg_Qt2: |
| return Q0 + Reg((x>>10)&(1<<5-1)) |
| |
| case arg_Rn_16_5__W_1__W_2__W_4__X_8: |
| imm5 := (x >> 16) & (1<<5 - 1) |
| if ((imm5 & 1) == 1) || ((imm5 & 2) == 2) || ((imm5 & 4) == 4) { |
| return W0 + Reg((x>>5)&(1<<5-1)) |
| } else if (imm5 & 8) == 8 { |
| return X0 + Reg((x>>5)&(1<<5-1)) |
| } else { |
| return nil |
| } |
| |
| case arg_St: |
| return S0 + Reg(x&(1<<5-1)) |
| |
| case arg_St2: |
| return S0 + Reg((x>>10)&(1<<5-1)) |
| |
| case arg_Vd_16_5__B_1__H_2__S_4__D_8: |
| imm5 := (x >> 16) & (1<<5 - 1) |
| Rd := x & (1<<5 - 1) |
| if imm5&1 == 1 { |
| return B0 + Reg(Rd) |
| } else if imm5&2 == 2 { |
| return H0 + Reg(Rd) |
| } else if imm5&4 == 4 { |
| return S0 + Reg(Rd) |
| } else if imm5&8 == 8 { |
| return D0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_19_4__B_1__H_2__S_4: |
| immh := (x >> 19) & (1<<4 - 1) |
| Rd := x & (1<<5 - 1) |
| if immh == 1 { |
| return B0 + Reg(Rd) |
| } else if immh>>1 == 1 { |
| return H0 + Reg(Rd) |
| } else if immh>>2 == 1 { |
| return S0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_19_4__B_1__H_2__S_4__D_8: |
| immh := (x >> 19) & (1<<4 - 1) |
| Rd := x & (1<<5 - 1) |
| if immh == 1 { |
| return B0 + Reg(Rd) |
| } else if immh>>1 == 1 { |
| return H0 + Reg(Rd) |
| } else if immh>>2 == 1 { |
| return S0 + Reg(Rd) |
| } else if immh>>3 == 1 { |
| return D0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_19_4__D_8: |
| immh := (x >> 19) & (1<<4 - 1) |
| Rd := x & (1<<5 - 1) |
| if immh>>3 == 1 { |
| return D0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_19_4__S_4__D_8: |
| immh := (x >> 19) & (1<<4 - 1) |
| Rd := x & (1<<5 - 1) |
| if immh>>2 == 1 { |
| return S0 + Reg(Rd) |
| } else if immh>>3 == 1 { |
| return D0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_22_1__S_0: |
| sz := (x >> 22) & 1 |
| Rd := x & (1<<5 - 1) |
| if sz == 0 { |
| return S0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_22_1__S_0__D_1: |
| sz := (x >> 22) & 1 |
| Rd := x & (1<<5 - 1) |
| if sz == 0 { |
| return S0 + Reg(Rd) |
| } else { |
| return D0 + Reg(Rd) |
| } |
| |
| case arg_Vd_22_1__S_1: |
| sz := (x >> 22) & 1 |
| Rd := x & (1<<5 - 1) |
| if sz == 1 { |
| return S0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_22_2__B_0__H_1__S_2: |
| size := (x >> 22) & (1<<2 - 1) |
| Rd := x & (1<<5 - 1) |
| if size == 0 { |
| return B0 + Reg(Rd) |
| } else if size == 1 { |
| return H0 + Reg(Rd) |
| } else if size == 2 { |
| return S0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_22_2__B_0__H_1__S_2__D_3: |
| size := (x >> 22) & (1<<2 - 1) |
| Rd := x & (1<<5 - 1) |
| if size == 0 { |
| return B0 + Reg(Rd) |
| } else if size == 1 { |
| return H0 + Reg(Rd) |
| } else if size == 2 { |
| return S0 + Reg(Rd) |
| } else { |
| return D0 + Reg(Rd) |
| } |
| |
| case arg_Vd_22_2__D_3: |
| size := (x >> 22) & (1<<2 - 1) |
| Rd := x & (1<<5 - 1) |
| if size == 3 { |
| return D0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_22_2__H_0__S_1__D_2: |
| size := (x >> 22) & (1<<2 - 1) |
| Rd := x & (1<<5 - 1) |
| if size == 0 { |
| return H0 + Reg(Rd) |
| } else if size == 1 { |
| return S0 + Reg(Rd) |
| } else if size == 2 { |
| return D0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_22_2__H_1__S_2: |
| size := (x >> 22) & (1<<2 - 1) |
| Rd := x & (1<<5 - 1) |
| if size == 1 { |
| return H0 + Reg(Rd) |
| } else if size == 2 { |
| return S0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_22_2__S_1__D_2: |
| size := (x >> 22) & (1<<2 - 1) |
| Rd := x & (1<<5 - 1) |
| if size == 1 { |
| return S0 + Reg(Rd) |
| } else if size == 2 { |
| return D0 + Reg(Rd) |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_arrangement_16B: |
| Rd := x & (1<<5 - 1) |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement16B, 0} |
| |
| case arg_Vd_arrangement_2D: |
| Rd := x & (1<<5 - 1) |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| |
| case arg_Vd_arrangement_4S: |
| Rd := x & (1<<5 - 1) |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| |
| case arg_Vd_arrangement_D_index__1: |
| Rd := x & (1<<5 - 1) |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rd), ArrangementD, 1, 0} |
| |
| case arg_Vd_arrangement_imm5___B_1__H_2__S_4__D_8_index__imm5__imm5lt41gt_1__imm5lt42gt_2__imm5lt43gt_4__imm5lt4gt_8_1: |
| var a Arrangement |
| var index uint32 |
| Rd := x & (1<<5 - 1) |
| imm5 := (x >> 16) & (1<<5 - 1) |
| if imm5&1 == 1 { |
| a = ArrangementB |
| index = imm5 >> 1 |
| } else if imm5&2 == 2 { |
| a = ArrangementH |
| index = imm5 >> 2 |
| } else if imm5&4 == 4 { |
| a = ArrangementS |
| index = imm5 >> 3 |
| } else if imm5&8 == 8 { |
| a = ArrangementD |
| index = imm5 >> 4 |
| } else { |
| return nil |
| } |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rd), a, uint8(index), 0} |
| |
| case arg_Vd_arrangement_imm5_Q___8B_10__16B_11__4H_20__8H_21__2S_40__4S_41__2D_81: |
| Rd := x & (1<<5 - 1) |
| imm5 := (x >> 16) & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| if imm5&1 == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8B, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement16B, 0} |
| } |
| } else if imm5&2 == 2 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4H, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } |
| } else if imm5&4 == 4 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } |
| } else if (imm5&8 == 8) && (Q == 1) { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| } else { |
| return nil |
| } |
| |
| case arg_Vd_arrangement_immh_Q___SEEAdvancedSIMDmodifiedimmediate_00__2S_40__4S_41__2D_81: |
| Rd := x & (1<<5 - 1) |
| immh := (x >> 19) & (1<<4 - 1) |
| Q := (x >> 30) & 1 |
| if immh>>2 == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } |
| } else if immh>>3 == 1 { |
| if Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| } |
| } |
| return nil |
| |
| case arg_Vd_arrangement_immh_Q___SEEAdvancedSIMDmodifiedimmediate_00__8B_10__16B_11__4H_20__8H_21__2S_40__4S_41: |
| Rd := x & (1<<5 - 1) |
| immh := (x >> 19) & (1<<4 - 1) |
| Q := (x >> 30) & 1 |
| if immh == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8B, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement16B, 0} |
| } |
| } else if immh>>1 == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4H, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } |
| } else if immh>>2 == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } |
| } |
| return nil |
| |
| case arg_Vd_arrangement_immh_Q___SEEAdvancedSIMDmodifiedimmediate_00__8B_10__16B_11__4H_20__8H_21__2S_40__4S_41__2D_81: |
| Rd := x & (1<<5 - 1) |
| immh := (x >> 19) & (1<<4 - 1) |
| Q := (x >> 30) & 1 |
| if immh == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8B, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement16B, 0} |
| } |
| } else if immh>>1 == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4H, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } |
| } else if immh>>2 == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } |
| } else if immh>>3 == 1 { |
| if Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| } |
| } |
| return nil |
| |
| case arg_Vd_arrangement_immh___SEEAdvancedSIMDmodifiedimmediate_0__8H_1__4S_2__2D_4: |
| Rd := x & (1<<5 - 1) |
| immh := (x >> 19) & (1<<4 - 1) |
| if immh == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } else if immh>>1 == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } else if immh>>2 == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_Q___2S_0__4S_1: |
| Rd := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } |
| |
| case arg_Vd_arrangement_Q___4H_0__8H_1: |
| Rd := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4H, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } |
| |
| case arg_Vd_arrangement_Q___8B_0__16B_1: |
| Rd := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8B, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement16B, 0} |
| } |
| |
| case arg_Vd_arrangement_Q_sz___2S_00__4S_10__2D_11: |
| Rd := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| sz := (x >> 22) & 1 |
| if sz == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else if sz == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } else if sz == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_size___4S_1__2D_2: |
| Rd := x & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| if size == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } else if size == 2 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_size___8H_0__1Q_3: |
| Rd := x & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| if size == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } else if size == 3 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement1Q, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_size___8H_0__4S_1__2D_2: |
| Rd := x & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| if size == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } else if size == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } else if size == 2 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_size_Q___4H_00__8H_01__2S_10__4S_11__1D_20__2D_21: |
| Rd := x & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4H, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement1D, 0} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_size_Q___4H_10__8H_11__2S_20__4S_21: |
| Rd := x & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_size_Q___8B_00__16B_01: |
| Rd := x & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement16B, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11: |
| Rd := x & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement16B, 0} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21: |
| Rd := x & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement16B, 0} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21__2D_31: |
| Rd := x & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement16B, 0} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } else if size == 3 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_sz___4S_0__2D_1: |
| Rd := x & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| if sz == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| } |
| |
| case arg_Vd_arrangement_sz_Q___2S_00__4S_01: |
| Rd := x & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| Q := (x >> 30) & 1 |
| if sz == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else if sz == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_sz_Q___2S_00__4S_01__2D_11: |
| Rd := x & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| Q := (x >> 30) & 1 |
| if sz == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else if sz == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } else if sz == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_sz_Q___2S_10__4S_11: |
| Rd := x & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| Q := (x >> 30) & 1 |
| if sz == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else if sz == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } |
| return nil |
| |
| case arg_Vd_arrangement_sz_Q___4H_00__8H_01__2S_10__4S_11: |
| Rd := x & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| Q := (x >> 30) & 1 |
| if sz == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4H, 0} |
| } else if sz == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement8H, 0} |
| } else if sz == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement2S, 0} |
| } else /* sz == 1 && Q == 1 */ { |
| return RegisterWithArrangement{V0 + Reg(Rd), Arrangement4S, 0} |
| } |
| |
| case arg_Vm_22_1__S_0__D_1: |
| sz := (x >> 22) & 1 |
| Rm := (x >> 16) & (1<<5 - 1) |
| if sz == 0 { |
| return S0 + Reg(Rm) |
| } else { |
| return D0 + Reg(Rm) |
| } |
| |
| case arg_Vm_22_2__B_0__H_1__S_2__D_3: |
| size := (x >> 22) & (1<<2 - 1) |
| Rm := (x >> 16) & (1<<5 - 1) |
| if size == 0 { |
| return B0 + Reg(Rm) |
| } else if size == 1 { |
| return H0 + Reg(Rm) |
| } else if size == 2 { |
| return S0 + Reg(Rm) |
| } else { |
| return D0 + Reg(Rm) |
| } |
| |
| case arg_Vm_22_2__D_3: |
| size := (x >> 22) & (1<<2 - 1) |
| Rm := (x >> 16) & (1<<5 - 1) |
| if size == 3 { |
| return D0 + Reg(Rm) |
| } else { |
| return nil |
| } |
| |
| case arg_Vm_22_2__H_1__S_2: |
| size := (x >> 22) & (1<<2 - 1) |
| Rm := (x >> 16) & (1<<5 - 1) |
| if size == 1 { |
| return H0 + Reg(Rm) |
| } else if size == 2 { |
| return S0 + Reg(Rm) |
| } else { |
| return nil |
| } |
| |
| case arg_Vm_arrangement_4S: |
| Rm := (x >> 16) & (1<<5 - 1) |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement4S, 0} |
| |
| case arg_Vm_arrangement_Q___8B_0__16B_1: |
| Rm := (x >> 16) & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement8B, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement16B, 0} |
| } |
| |
| case arg_Vm_arrangement_size___8H_0__4S_1__2D_2: |
| Rm := (x >> 16) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| if size == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement8H, 0} |
| } else if size == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement4S, 0} |
| } else if size == 2 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vm_arrangement_size___H_1__S_2_index__size_L_H_M__HLM_1__HL_2_1: |
| var a Arrangement |
| var index uint32 |
| var vm uint32 |
| Rm := (x >> 16) & (1<<4 - 1) |
| size := (x >> 22) & 3 |
| H := (x >> 11) & 1 |
| L := (x >> 21) & 1 |
| M := (x >> 20) & 1 |
| if size == 1 { |
| a = ArrangementH |
| index = (H << 2) | (L << 1) | M |
| vm = Rm |
| } else if size == 2 { |
| a = ArrangementS |
| index = (H << 1) | L |
| vm = (M << 4) | Rm |
| } else { |
| return nil |
| } |
| return RegisterWithArrangementAndIndex{V0 + Reg(vm), a, uint8(index), 0} |
| |
| case arg_Vm_arrangement_size_Q___4H_10__8H_11__2S_20__4S_21: |
| Rm := (x >> 16) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement8H, 0} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement2S, 0} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement4S, 0} |
| } |
| return nil |
| |
| case arg_Vm_arrangement_size_Q___8B_00__16B_01: |
| Rm := (x >> 16) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement16B, 0} |
| } |
| return nil |
| |
| case arg_Vm_arrangement_size_Q___8B_00__16B_01__1D_30__2D_31: |
| Rm := (x >> 16) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement16B, 0} |
| } else if size == 3 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement1D, 0} |
| } else if size == 3 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vm_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21: |
| Rm := (x >> 16) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement16B, 0} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement8H, 0} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement2S, 0} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement4S, 0} |
| } |
| return nil |
| |
| case arg_Vm_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21__2D_31: |
| Rm := (x >> 16) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement16B, 0} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement8H, 0} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement2S, 0} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement4S, 0} |
| } else if size == 3 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vm_arrangement_sz_Q___2S_00__4S_01__2D_11: |
| Rm := (x >> 16) & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| Q := (x >> 30) & 1 |
| if sz == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement2S, 0} |
| } else if sz == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement4S, 0} |
| } else if sz == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rm), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vm_arrangement_sz___S_0__D_1_index__sz_L_H__HL_00__H_10_1: |
| var a Arrangement |
| var index uint32 |
| Rm := (x >> 16) & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| H := (x >> 11) & 1 |
| L := (x >> 21) & 1 |
| if sz == 0 { |
| a = ArrangementS |
| index = (H << 1) | L |
| } else if sz == 1 && L == 0 { |
| a = ArrangementD |
| index = H |
| } else { |
| return nil |
| } |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rm), a, uint8(index), 0} |
| |
| case arg_Vn_19_4__B_1__H_2__S_4__D_8: |
| immh := (x >> 19) & (1<<4 - 1) |
| Rn := (x >> 5) & (1<<5 - 1) |
| if immh == 1 { |
| return B0 + Reg(Rn) |
| } else if immh>>1 == 1 { |
| return H0 + Reg(Rn) |
| } else if immh>>2 == 1 { |
| return S0 + Reg(Rn) |
| } else if immh>>3 == 1 { |
| return D0 + Reg(Rn) |
| } else { |
| return nil |
| } |
| |
| case arg_Vn_19_4__D_8: |
| immh := (x >> 19) & (1<<4 - 1) |
| Rn := (x >> 5) & (1<<5 - 1) |
| if immh>>3 == 1 { |
| return D0 + Reg(Rn) |
| } else { |
| return nil |
| } |
| |
| case arg_Vn_19_4__H_1__S_2__D_4: |
| immh := (x >> 19) & (1<<4 - 1) |
| Rn := (x >> 5) & (1<<5 - 1) |
| if immh == 1 { |
| return H0 + Reg(Rn) |
| } else if immh>>1 == 1 { |
| return S0 + Reg(Rn) |
| } else if immh>>2 == 1 { |
| return D0 + Reg(Rn) |
| } else { |
| return nil |
| } |
| |
| case arg_Vn_19_4__S_4__D_8: |
| immh := (x >> 19) & (1<<4 - 1) |
| Rn := (x >> 5) & (1<<5 - 1) |
| if immh>>2 == 1 { |
| return S0 + Reg(Rn) |
| } else if immh>>3 == 1 { |
| return D0 + Reg(Rn) |
| } else { |
| return nil |
| } |
| |
| case arg_Vn_1_arrangement_16B: |
| Rn := (x >> 5) & (1<<5 - 1) |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 1} |
| |
| case arg_Vn_22_1__D_1: |
| sz := (x >> 22) & 1 |
| Rn := (x >> 5) & (1<<5 - 1) |
| if sz == 1 { |
| return D0 + Reg(Rn) |
| } |
| return nil |
| |
| case arg_Vn_22_1__S_0__D_1: |
| sz := (x >> 22) & 1 |
| Rn := (x >> 5) & (1<<5 - 1) |
| if sz == 0 { |
| return S0 + Reg(Rn) |
| } else { |
| return D0 + Reg(Rn) |
| } |
| |
| case arg_Vn_22_2__B_0__H_1__S_2__D_3: |
| size := (x >> 22) & (1<<2 - 1) |
| Rn := (x >> 5) & (1<<5 - 1) |
| if size == 0 { |
| return B0 + Reg(Rn) |
| } else if size == 1 { |
| return H0 + Reg(Rn) |
| } else if size == 2 { |
| return S0 + Reg(Rn) |
| } else { |
| return D0 + Reg(Rn) |
| } |
| |
| case arg_Vn_22_2__D_3: |
| size := (x >> 22) & (1<<2 - 1) |
| Rn := (x >> 5) & (1<<5 - 1) |
| if size == 3 { |
| return D0 + Reg(Rn) |
| } else { |
| return nil |
| } |
| |
| case arg_Vn_22_2__H_0__S_1__D_2: |
| size := (x >> 22) & (1<<2 - 1) |
| Rn := (x >> 5) & (1<<5 - 1) |
| if size == 0 { |
| return H0 + Reg(Rn) |
| } else if size == 1 { |
| return S0 + Reg(Rn) |
| } else if size == 2 { |
| return D0 + Reg(Rn) |
| } else { |
| return nil |
| } |
| |
| case arg_Vn_22_2__H_1__S_2: |
| size := (x >> 22) & (1<<2 - 1) |
| Rn := (x >> 5) & (1<<5 - 1) |
| if size == 1 { |
| return H0 + Reg(Rn) |
| } else if size == 2 { |
| return S0 + Reg(Rn) |
| } else { |
| return nil |
| } |
| |
| case arg_Vn_2_arrangement_16B: |
| Rn := (x >> 5) & (1<<5 - 1) |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 2} |
| |
| case arg_Vn_3_arrangement_16B: |
| Rn := (x >> 5) & (1<<5 - 1) |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 3} |
| |
| case arg_Vn_4_arrangement_16B: |
| Rn := (x >> 5) & (1<<5 - 1) |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 4} |
| |
| case arg_Vn_arrangement_16B: |
| Rn := (x >> 5) & (1<<5 - 1) |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 0} |
| |
| case arg_Vn_arrangement_4S: |
| Rn := (x >> 5) & (1<<5 - 1) |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| |
| case arg_Vn_arrangement_D_index__1: |
| Rn := (x >> 5) & (1<<5 - 1) |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rn), ArrangementD, 1, 0} |
| |
| case arg_Vn_arrangement_D_index__imm5_1: |
| Rn := (x >> 5) & (1<<5 - 1) |
| index := (x >> 20) & 1 |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rn), ArrangementD, uint8(index), 0} |
| |
| case arg_Vn_arrangement_imm5___B_1__H_2_index__imm5__imm5lt41gt_1__imm5lt42gt_2_1: |
| var a Arrangement |
| var index uint32 |
| Rn := (x >> 5) & (1<<5 - 1) |
| imm5 := (x >> 16) & (1<<5 - 1) |
| if imm5&1 == 1 { |
| a = ArrangementB |
| index = imm5 >> 1 |
| } else if imm5&2 == 2 { |
| a = ArrangementH |
| index = imm5 >> 2 |
| } else { |
| return nil |
| } |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rn), a, uint8(index), 0} |
| |
| case arg_Vn_arrangement_imm5___B_1__H_2__S_4__D_8_index__imm5_imm4__imm4lt30gt_1__imm4lt31gt_2__imm4lt32gt_4__imm4lt3gt_8_1: |
| var a Arrangement |
| var index uint32 |
| Rn := (x >> 5) & (1<<5 - 1) |
| imm5 := (x >> 16) & (1<<5 - 1) |
| imm4 := (x >> 11) & (1<<4 - 1) |
| if imm5&1 == 1 { |
| a = ArrangementB |
| index = imm4 |
| } else if imm5&2 == 2 { |
| a = ArrangementH |
| index = imm4 >> 1 |
| } else if imm5&4 == 4 { |
| a = ArrangementS |
| index = imm4 >> 2 |
| } else if imm5&8 == 8 { |
| a = ArrangementD |
| index = imm4 >> 3 |
| } else { |
| return nil |
| } |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rn), a, uint8(index), 0} |
| |
| case arg_Vn_arrangement_imm5___B_1__H_2__S_4__D_8_index__imm5__imm5lt41gt_1__imm5lt42gt_2__imm5lt43gt_4__imm5lt4gt_8_1: |
| var a Arrangement |
| var index uint32 |
| Rn := (x >> 5) & (1<<5 - 1) |
| imm5 := (x >> 16) & (1<<5 - 1) |
| if imm5&1 == 1 { |
| a = ArrangementB |
| index = imm5 >> 1 |
| } else if imm5&2 == 2 { |
| a = ArrangementH |
| index = imm5 >> 2 |
| } else if imm5&4 == 4 { |
| a = ArrangementS |
| index = imm5 >> 3 |
| } else if imm5&8 == 8 { |
| a = ArrangementD |
| index = imm5 >> 4 |
| } else { |
| return nil |
| } |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rn), a, uint8(index), 0} |
| |
| case arg_Vn_arrangement_imm5___B_1__H_2__S_4_index__imm5__imm5lt41gt_1__imm5lt42gt_2__imm5lt43gt_4_1: |
| var a Arrangement |
| var index uint32 |
| Rn := (x >> 5) & (1<<5 - 1) |
| imm5 := (x >> 16) & (1<<5 - 1) |
| if imm5&1 == 1 { |
| a = ArrangementB |
| index = imm5 >> 1 |
| } else if imm5&2 == 2 { |
| a = ArrangementH |
| index = imm5 >> 2 |
| } else if imm5&4 == 4 { |
| a = ArrangementS |
| index = imm5 >> 3 |
| } else { |
| return nil |
| } |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rn), a, uint8(index), 0} |
| |
| case arg_Vn_arrangement_imm5___D_8_index__imm5_1: |
| var a Arrangement |
| var index uint32 |
| Rn := (x >> 5) & (1<<5 - 1) |
| imm5 := (x >> 16) & (1<<5 - 1) |
| if imm5&15 == 8 { |
| a = ArrangementD |
| index = imm5 >> 4 |
| } else { |
| return nil |
| } |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rn), a, uint8(index), 0} |
| |
| case arg_Vn_arrangement_immh_Q___SEEAdvancedSIMDmodifiedimmediate_00__2S_40__4S_41__2D_81: |
| Rn := (x >> 5) & (1<<5 - 1) |
| immh := (x >> 19) & (1<<4 - 1) |
| Q := (x >> 30) & 1 |
| if immh>>2 == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2S, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } |
| } else if immh>>3 == 1 { |
| if Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| } |
| return nil |
| |
| case arg_Vn_arrangement_immh_Q___SEEAdvancedSIMDmodifiedimmediate_00__8B_10__16B_11__4H_20__8H_21__2S_40__4S_41: |
| Rn := (x >> 5) & (1<<5 - 1) |
| immh := (x >> 19) & (1<<4 - 1) |
| Q := (x >> 30) & 1 |
| if immh == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8B, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 0} |
| } |
| } else if immh>>1 == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4H, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8H, 0} |
| } |
| } else if immh>>2 == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2S, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } |
| } |
| return nil |
| |
| case arg_Vn_arrangement_immh_Q___SEEAdvancedSIMDmodifiedimmediate_00__8B_10__16B_11__4H_20__8H_21__2S_40__4S_41__2D_81: |
| Rn := (x >> 5) & (1<<5 - 1) |
| immh := (x >> 19) & (1<<4 - 1) |
| Q := (x >> 30) & 1 |
| if immh == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8B, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 0} |
| } |
| } else if immh>>1 == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4H, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8H, 0} |
| } |
| } else if immh>>2 == 1 { |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2S, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } |
| } else if immh>>3 == 1 { |
| if Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| } |
| return nil |
| |
| case arg_Vn_arrangement_immh___SEEAdvancedSIMDmodifiedimmediate_0__8H_1__4S_2__2D_4: |
| Rn := (x >> 5) & (1<<5 - 1) |
| immh := (x >> 19) & (1<<4 - 1) |
| if immh == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8H, 0} |
| } else if immh>>1 == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } else if immh>>2 == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_Q___8B_0__16B_1: |
| Rn := (x >> 5) & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| if Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8B, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 0} |
| } |
| |
| case arg_Vn_arrangement_Q_sz___2S_00__4S_10__2D_11: |
| Rn := (x >> 5) & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| sz := (x >> 22) & 1 |
| if sz == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2S, 0} |
| } else if sz == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } else if sz == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_Q_sz___4S_10: |
| Rn := (x >> 5) & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| sz := (x >> 22) & 1 |
| if sz == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_S_index__imm5__imm5lt41gt_1__imm5lt42gt_2__imm5lt43gt_4_1: |
| var index uint32 |
| Rn := (x >> 5) & (1<<5 - 1) |
| imm5 := (x >> 16) & (1<<5 - 1) |
| index = imm5 >> 3 |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rn), ArrangementS, uint8(index), 0} |
| |
| case arg_Vn_arrangement_size___2D_3: |
| Rn := (x >> 5) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| if size == 3 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_size___8H_0__4S_1__2D_2: |
| Rn := (x >> 5) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| if size == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8H, 0} |
| } else if size == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } else if size == 2 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_size_Q___4H_10__8H_11__2S_20__4S_21: |
| Rn := (x >> 5) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8H, 0} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2S, 0} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_size_Q___8B_00__16B_01: |
| Rn := (x >> 5) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_size_Q___8B_00__16B_01__1D_30__2D_31: |
| Rn := (x >> 5) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 0} |
| } else if size == 3 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement1D, 0} |
| } else if size == 3 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11: |
| Rn := (x >> 5) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 0} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8H, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21: |
| Rn := (x >> 5) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 0} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8H, 0} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2S, 0} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21__2D_31: |
| Rn := (x >> 5) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 0} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8H, 0} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2S, 0} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } else if size == 3 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__4S_21: |
| Rn := (x >> 5) & (1<<5 - 1) |
| size := (x >> 22) & 3 |
| Q := (x >> 30) & 1 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8B, 0} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement16B, 0} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4H, 0} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8H, 0} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_sz___2D_1: |
| Rn := (x >> 5) & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| if sz == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_sz___2S_0__2D_1: |
| Rn := (x >> 5) & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| if sz == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2S, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| |
| case arg_Vn_arrangement_sz___4S_0__2D_1: |
| Rn := (x >> 5) & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| if sz == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } else { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| |
| case arg_Vn_arrangement_sz_Q___2S_00__4S_01: |
| Rn := (x >> 5) & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| Q := (x >> 30) & 1 |
| if sz == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2S, 0} |
| } else if sz == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_sz_Q___2S_00__4S_01__2D_11: |
| Rn := (x >> 5) & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| Q := (x >> 30) & 1 |
| if sz == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2S, 0} |
| } else if sz == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } else if sz == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2D, 0} |
| } |
| return nil |
| |
| case arg_Vn_arrangement_sz_Q___4H_00__8H_01__2S_10__4S_11: |
| Rn := (x >> 5) & (1<<5 - 1) |
| sz := (x >> 22) & 1 |
| Q := (x >> 30) & 1 |
| if sz == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4H, 0} |
| } else if sz == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement8H, 0} |
| } else if sz == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement2S, 0} |
| } else /* sz == 1 && Q == 1 */ { |
| return RegisterWithArrangement{V0 + Reg(Rn), Arrangement4S, 0} |
| } |
| |
| case arg_Vt_1_arrangement_B_index__Q_S_size_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| size := (x >> 10) & 3 |
| index := (Q << 3) | (S << 2) | (size) |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementB, uint8(index), 1} |
| |
| case arg_Vt_1_arrangement_D_index__Q_1: |
| Rt := x & (1<<5 - 1) |
| index := (x >> 30) & 1 |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementD, uint8(index), 1} |
| |
| case arg_Vt_1_arrangement_H_index__Q_S_size_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| size := (x >> 11) & 1 |
| index := (Q << 2) | (S << 1) | (size) |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementH, uint8(index), 1} |
| |
| case arg_Vt_1_arrangement_S_index__Q_S_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| index := (Q << 1) | S |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementS, uint8(index), 1} |
| |
| case arg_Vt_1_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21__1D_30__2D_31: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| size := (x >> 10) & 3 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8B, 1} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement16B, 1} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4H, 1} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8H, 1} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2S, 1} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4S, 1} |
| } else if size == 3 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement1D, 1} |
| } else /* size == 3 && Q == 1 */ { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2D, 1} |
| } |
| |
| case arg_Vt_2_arrangement_B_index__Q_S_size_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| size := (x >> 10) & 3 |
| index := (Q << 3) | (S << 2) | (size) |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementB, uint8(index), 2} |
| |
| case arg_Vt_2_arrangement_D_index__Q_1: |
| Rt := x & (1<<5 - 1) |
| index := (x >> 30) & 1 |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementD, uint8(index), 2} |
| |
| case arg_Vt_2_arrangement_H_index__Q_S_size_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| size := (x >> 11) & 1 |
| index := (Q << 2) | (S << 1) | (size) |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementH, uint8(index), 2} |
| |
| case arg_Vt_2_arrangement_S_index__Q_S_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| index := (Q << 1) | S |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementS, uint8(index), 2} |
| |
| case arg_Vt_2_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21__1D_30__2D_31: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| size := (x >> 10) & 3 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8B, 2} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement16B, 2} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4H, 2} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8H, 2} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2S, 2} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4S, 2} |
| } else if size == 3 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement1D, 2} |
| } else /* size == 3 && Q == 1 */ { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2D, 2} |
| } |
| |
| case arg_Vt_2_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21__2D_31: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| size := (x >> 10) & 3 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8B, 2} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement16B, 2} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4H, 2} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8H, 2} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2S, 2} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4S, 2} |
| } else if size == 3 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2D, 2} |
| } |
| return nil |
| |
| case arg_Vt_3_arrangement_B_index__Q_S_size_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| size := (x >> 10) & 3 |
| index := (Q << 3) | (S << 2) | (size) |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementB, uint8(index), 3} |
| |
| case arg_Vt_3_arrangement_D_index__Q_1: |
| Rt := x & (1<<5 - 1) |
| index := (x >> 30) & 1 |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementD, uint8(index), 3} |
| |
| case arg_Vt_3_arrangement_H_index__Q_S_size_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| size := (x >> 11) & 1 |
| index := (Q << 2) | (S << 1) | (size) |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementH, uint8(index), 3} |
| |
| case arg_Vt_3_arrangement_S_index__Q_S_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| index := (Q << 1) | S |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementS, uint8(index), 3} |
| |
| case arg_Vt_3_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21__1D_30__2D_31: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| size := (x >> 10) & 3 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8B, 3} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement16B, 3} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4H, 3} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8H, 3} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2S, 3} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4S, 3} |
| } else if size == 3 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement1D, 3} |
| } else /* size == 3 && Q == 1 */ { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2D, 3} |
| } |
| |
| case arg_Vt_3_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21__2D_31: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| size := (x >> 10) & 3 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8B, 3} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement16B, 3} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4H, 3} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8H, 3} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2S, 3} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4S, 3} |
| } else if size == 3 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2D, 3} |
| } |
| return nil |
| |
| case arg_Vt_4_arrangement_B_index__Q_S_size_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| size := (x >> 10) & 3 |
| index := (Q << 3) | (S << 2) | (size) |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementB, uint8(index), 4} |
| |
| case arg_Vt_4_arrangement_D_index__Q_1: |
| Rt := x & (1<<5 - 1) |
| index := (x >> 30) & 1 |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementD, uint8(index), 4} |
| |
| case arg_Vt_4_arrangement_H_index__Q_S_size_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| size := (x >> 11) & 1 |
| index := (Q << 2) | (S << 1) | (size) |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementH, uint8(index), 4} |
| |
| case arg_Vt_4_arrangement_S_index__Q_S_1: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| S := (x >> 12) & 1 |
| index := (Q << 1) | S |
| return RegisterWithArrangementAndIndex{V0 + Reg(Rt), ArrangementS, uint8(index), 4} |
| |
| case arg_Vt_4_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21__1D_30__2D_31: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| size := (x >> 10) & 3 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8B, 4} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement16B, 4} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4H, 4} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8H, 4} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2S, 4} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4S, 4} |
| } else if size == 3 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement1D, 4} |
| } else /* size == 3 && Q == 1 */ { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2D, 4} |
| } |
| |
| case arg_Vt_4_arrangement_size_Q___8B_00__16B_01__4H_10__8H_11__2S_20__4S_21__2D_31: |
| Rt := x & (1<<5 - 1) |
| Q := (x >> 30) & 1 |
| size := (x >> 10) & 3 |
| if size == 0 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8B, 4} |
| } else if size == 0 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement16B, 4} |
| } else if size == 1 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4H, 4} |
| } else if size == 1 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement8H, 4} |
| } else if size == 2 && Q == 0 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2S, 4} |
| } else if size == 2 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement4S, 4} |
| } else if size == 3 && Q == 1 { |
| return RegisterWithArrangement{V0 + Reg(Rt), Arrangement2D, 4} |
| } |
| return nil |
| |
| case arg_Xns_mem_extend_m__UXTW_2__LSL_3__SXTW_6__SXTX_7__0_0__4_1: |
| return handle_MemExtend(x, 4, false) |
| |
| case arg_Xns_mem_offset: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrOffset, 0} |
| |
| case arg_Xns_mem_optional_imm12_16_unsigned: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm12 := (x >> 10) & (1<<12 - 1) |
| return MemImmediate{Rn, AddrOffset, int32(imm12 << 4)} |
| |
| case arg_Xns_mem_optional_imm7_16_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm7 := (x >> 15) & (1<<7 - 1) |
| return MemImmediate{Rn, AddrOffset, ((int32(imm7 << 4)) << 21) >> 21} |
| |
| case arg_Xns_mem_post_fixedimm_1: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrPostIndex, 1} |
| |
| case arg_Xns_mem_post_fixedimm_12: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrPostIndex, 12} |
| |
| case arg_Xns_mem_post_fixedimm_16: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrPostIndex, 16} |
| |
| case arg_Xns_mem_post_fixedimm_2: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrPostIndex, 2} |
| |
| case arg_Xns_mem_post_fixedimm_24: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrPostIndex, 24} |
| |
| case arg_Xns_mem_post_fixedimm_3: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrPostIndex, 3} |
| |
| case arg_Xns_mem_post_fixedimm_32: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrPostIndex, 32} |
| |
| case arg_Xns_mem_post_fixedimm_4: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrPostIndex, 4} |
| |
| case arg_Xns_mem_post_fixedimm_6: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrPostIndex, 6} |
| |
| case arg_Xns_mem_post_fixedimm_8: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| return MemImmediate{Rn, AddrPostIndex, 8} |
| |
| case arg_Xns_mem_post_imm7_16_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm7 := (x >> 15) & (1<<7 - 1) |
| return MemImmediate{Rn, AddrPostIndex, ((int32(imm7 << 4)) << 21) >> 21} |
| |
| case arg_Xns_mem_post_Q__16_0__32_1: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| Q := (x >> 30) & 1 |
| return MemImmediate{Rn, AddrPostIndex, int32((Q + 1) * 16)} |
| |
| case arg_Xns_mem_post_Q__24_0__48_1: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| Q := (x >> 30) & 1 |
| return MemImmediate{Rn, AddrPostIndex, int32((Q + 1) * 24)} |
| |
| case arg_Xns_mem_post_Q__32_0__64_1: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| Q := (x >> 30) & 1 |
| return MemImmediate{Rn, AddrPostIndex, int32((Q + 1) * 32)} |
| |
| case arg_Xns_mem_post_Q__8_0__16_1: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| Q := (x >> 30) & 1 |
| return MemImmediate{Rn, AddrPostIndex, int32((Q + 1) * 8)} |
| |
| case arg_Xns_mem_post_size__1_0__2_1__4_2__8_3: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| size := (x >> 10) & 3 |
| return MemImmediate{Rn, AddrPostIndex, int32(1 << size)} |
| |
| case arg_Xns_mem_post_size__2_0__4_1__8_2__16_3: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| size := (x >> 10) & 3 |
| return MemImmediate{Rn, AddrPostIndex, int32(2 << size)} |
| |
| case arg_Xns_mem_post_size__3_0__6_1__12_2__24_3: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| size := (x >> 10) & 3 |
| return MemImmediate{Rn, AddrPostIndex, int32(3 << size)} |
| |
| case arg_Xns_mem_post_size__4_0__8_1__16_2__32_3: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| size := (x >> 10) & 3 |
| return MemImmediate{Rn, AddrPostIndex, int32(4 << size)} |
| |
| case arg_Xns_mem_post_Xm: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| Rm := (x >> 16) & (1<<5 - 1) |
| return MemImmediate{Rn, AddrPostReg, int32(Rm)} |
| |
| case arg_Xns_mem_wb_imm7_16_signed: |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| imm7 := (x >> 15) & (1<<7 - 1) |
| return MemImmediate{Rn, AddrPreIndex, ((int32(imm7 << 4)) << 21) >> 21} |
| } |
| } |
| |
| func handle_ExtendedRegister(x uint32, has_width bool) Arg { |
| s := (x >> 29) & 1 |
| rm := (x >> 16) & (1<<5 - 1) |
| option := (x >> 13) & (1<<3 - 1) |
| imm3 := (x >> 10) & (1<<3 - 1) |
| rn := (x >> 5) & (1<<5 - 1) |
| rd := x & (1<<5 - 1) |
| is_32bit := !has_width |
| var rea RegExtshiftAmount |
| if has_width { |
| if option&0x3 != 0x3 { |
| rea.reg = W0 + Reg(rm) |
| } else { |
| rea.reg = X0 + Reg(rm) |
| } |
| } else { |
| rea.reg = W0 + Reg(rm) |
| } |
| switch option { |
| case 0: |
| rea.extShift = uxtb |
| case 1: |
| rea.extShift = uxth |
| case 2: |
| if is_32bit && (rn == 31 || (s == 0 && rd == 31)) { |
| if imm3 != 0 { |
| rea.extShift = lsl |
| } else { |
| rea.extShift = ExtShift(0) |
| } |
| } else { |
| rea.extShift = uxtw |
| } |
| case 3: |
| if !is_32bit && (rn == 31 || (s == 0 && rd == 31)) { |
| if imm3 != 0 { |
| rea.extShift = lsl |
| } else { |
| rea.extShift = ExtShift(0) |
| } |
| } else { |
| rea.extShift = uxtx |
| } |
| case 4: |
| rea.extShift = sxtb |
| case 5: |
| rea.extShift = sxth |
| case 6: |
| rea.extShift = sxtw |
| case 7: |
| rea.extShift = sxtx |
| } |
| rea.show_zero = false |
| rea.amount = uint8(imm3) |
| return rea |
| } |
| |
| func handle_ImmediateShiftedRegister(x uint32, max uint8, is_w, has_ror bool) Arg { |
| var rsa RegExtshiftAmount |
| if is_w { |
| rsa.reg = W0 + Reg((x>>16)&(1<<5-1)) |
| } else { |
| rsa.reg = X0 + Reg((x>>16)&(1<<5-1)) |
| } |
| switch (x >> 22) & 0x3 { |
| case 0: |
| rsa.extShift = lsl |
| case 1: |
| rsa.extShift = lsr |
| case 2: |
| rsa.extShift = asr |
| case 3: |
| if has_ror { |
| rsa.extShift = ror |
| } else { |
| return nil |
| } |
| } |
| rsa.show_zero = true |
| rsa.amount = uint8((x >> 10) & (1<<6 - 1)) |
| if rsa.amount == 0 && rsa.extShift == lsl { |
| rsa.extShift = ExtShift(0) |
| } else if rsa.amount > max { |
| return nil |
| } |
| return rsa |
| } |
| |
| func handle_MemExtend(x uint32, mult uint8, absent bool) Arg { |
| var extend ExtShift |
| var Rm Reg |
| option := (x >> 13) & (1<<3 - 1) |
| Rn := RegSP(X0) + RegSP(x>>5&(1<<5-1)) |
| if (option & 1) != 0 { |
| Rm = Reg(X0) + Reg(x>>16&(1<<5-1)) |
| } else { |
| Rm = Reg(W0) + Reg(x>>16&(1<<5-1)) |
| } |
| switch option { |
| default: |
| return nil |
| case 2: |
| extend = uxtw |
| case 3: |
| extend = lsl |
| case 6: |
| extend = sxtw |
| case 7: |
| extend = sxtx |
| } |
| amount := (uint8((x >> 12) & 1)) * mult |
| return MemExtend{Rn, Rm, extend, amount, absent} |
| } |
| |
| func handle_bitmasks(x uint32, datasize uint8) Arg { |
| var length, levels, esize, i uint8 |
| var welem, wmask uint64 |
| n := (x >> 22) & 1 |
| imms := uint8((x >> 10) & (1<<6 - 1)) |
| immr := uint8((x >> 16) & (1<<6 - 1)) |
| if n != 0 { |
| length = 6 |
| } else if (imms & 32) == 0 { |
| length = 5 |
| } else if (imms & 16) == 0 { |
| length = 4 |
| } else if (imms & 8) == 0 { |
| length = 3 |
| } else if (imms & 4) == 0 { |
| length = 2 |
| } else if (imms & 2) == 0 { |
| length = 1 |
| } else { |
| return nil |
| } |
| levels = 1<<length - 1 |
| s := imms & levels |
| r := immr & levels |
| esize = 1 << length |
| if esize > datasize { |
| return nil |
| } |
| welem = 1<<(s+1) - 1 |
| ror := (welem >> r) | (welem << (esize - r)) |
| ror &= ((1 << esize) - 1) |
| wmask = 0 |
| for i = 0; i < datasize; i += esize { |
| wmask = (wmask << esize) | ror |
| } |
| return Imm64{wmask, false} |
| } |