blob: 0b7725bf65523afe895608b9d6d729e123122f0a [file] [edit]
// Code generated by 'instgen -o=$GOROOT # from go install golang.org/x/arch/arm64/instgen@latest'.
package arm64
import "cmd/internal/obj"
// stripRawZ first checks if v is a raw register number(0 to 31).
// If v is not a raw Z register, it will check if it's a Z register in the ARM64 range:
// - if within the range, it returns true, and set v to be the raw Z register.
// - otherwise it returns false
//
// If v is a raw register number, it returns true and leaves v unchanged.
func stripRawZ(v *uint32) bool {
if *v >= obj.RBaseARM64 {
if !(*v >= REG_Z0 && *v <= REG_Z31) && !(*v >= REG_ZARNG && *v < REG_ZARNGELEM) {
return false
}
}
*v = *v & 31
return true
}
// checkIsR checks if v is a scalar register:
// - if v is a raw register number or is within the ARM64 scalar register range,
// it returns true.
// - otherwise it returns false.
func checkIsR(v uint32) bool {
if v > REG_R31 && v != REG_RSP {
return false
}
return true
}
const (
enc_NIL component = iota
enc_i1_tsz
enc_i2h_i2l
enc_i3h_i3l
enc_i4h_i4l
enc_imm2_tsz
enc_imm8h_imm8l
enc_imm9h_imm9l
enc_tsize_imm3
enc_tszh_tszl_imm3
enc_tszh_tszl
enc_M
enc_PNd
enc_PNg
enc_PNn
enc_Pd
enc_Pdm
enc_Pdn
enc_Pg
enc_Pm
enc_Pn
enc_Pt
enc_Pv
enc_Rd
enc_Rdn
enc_Rm
enc_Rn
enc_Vd
enc_Vdn
enc_Vm
enc_Vn
enc_Za
enc_Zd
enc_Zda
enc_Zdn
enc_Zk
enc_Zm
enc_Zn
enc_Zt
enc_i1
enc_i2
enc_imm13
enc_imm2
enc_imm3
enc_imm4
enc_imm5
enc_imm5b
enc_imm6
enc_imm7
enc_imm8
enc_msz
enc_prfop
enc_rot
enc_size
enc_size0
enc_sz
enc_tsize
enc_tsz
enc_vl
enc_xs
)
// encodeNoModCheck is the implementation of the following encoding logic:
// Check that there is no modifier (UXTW, SXTW, LSL)
func encodeNoModCheck(v uint32) (uint32, bool) {
return 0, v == 0
}
// encodeNoAmtCheck is the implementation of the following encoding logic:
// Check that there is no modifier amount
func encodeNoAmtCheck(v uint32) (uint32, bool) {
return 0, v == 0
}
// encodeXCheck is the implementation of the following encoding logic:
// Check this is a 64-bit scalar register
func encodeXCheck(v uint32) (uint32, bool) {
return 0, true
}
// encodeArngBCheck is the implementation of the following encoding logic:
// Check this is a B arrangement
func encodeArngBCheck(v uint32) (uint32, bool) {
if v == ARNG_B {
return 0, true
}
return 0, false
}
// encodeArngDCheck is the implementation of the following encoding logic:
// Check this is a D arrangement
func encodeArngDCheck(v uint32) (uint32, bool) {
if v == ARNG_D {
return 0, true
}
return 0, false
}
// encodeArngHCheck is the implementation of the following encoding logic:
// Check this is a H arrangement
func encodeArngHCheck(v uint32) (uint32, bool) {
if v == ARNG_H {
return 0, true
}
return 0, false
}
// encodeArngQCheck is the implementation of the following encoding logic:
// Check this is a Q arrangement
func encodeArngQCheck(v uint32) (uint32, bool) {
if v == ARNG_Q {
return 0, true
}
return 0, false
}
// encodeArngSCheck is the implementation of the following encoding logic:
// Check this is a S arrangement
func encodeArngSCheck(v uint32) (uint32, bool) {
if v == ARNG_S {
return 0, true
}
return 0, false
}
// encodeMergePredCheck is the implementation of the following encoding logic:
// Check this is a merging predication
func encodeMergePredCheck(v uint32) (uint32, bool) {
if v == PRED_M {
return 0, true
}
return 0, false
}
// encodeZeroPredCheck is the implementation of the following encoding logic:
// Check this is a zeroing predication
func encodeZeroPredCheck(v uint32) (uint32, bool) {
if v == PRED_Z {
return 0, true
}
return 0, false
}
// encodeFimm0_0_56 is the implementation of the following encoding logic:
// Check this is immediate 0.0
func encodeFimm0_0_56(v uint32) (uint32, bool) {
if (v & 0x7FFFFFFF) != 0 {
return 0, false
}
return 0, true
}
// encodeModAmt1Check is the implementation of the following encoding logic:
// Check this is mod amount and is 1
func encodeModAmt1Check(v uint32) (uint32, bool) {
if v == 1 {
return 0, true
}
return 0, false
}
// encodeModAmt2Check is the implementation of the following encoding logic:
// Check this is mod amount and is 2
func encodeModAmt2Check(v uint32) (uint32, bool) {
if v == 2 {
return 0, true
}
return 0, false
}
// encodeModAmt3Check is the implementation of the following encoding logic:
// Check this is mod amount and is 3
func encodeModAmt3Check(v uint32) (uint32, bool) {
if v == 3 {
return 0, true
}
return 0, false
}
// encodeModAmt4Check is the implementation of the following encoding logic:
// Check this is mod amount and is 4
func encodeModAmt4Check(v uint32) (uint32, bool) {
if v == 4 {
return 0, true
}
return 0, false
}
// encodeModLSLCheck is the implementation of the following encoding logic:
// Check this is mod and is LSL
func encodeModLSLCheck(v uint32) (uint32, bool) {
if v&0b100 != 0 {
return 0, true
}
return 0, false
}
// encodeModSXTWCheck is the implementation of the following encoding logic:
// Check this is mod and is SXTW
func encodeModSXTWCheck(v uint32) (uint32, bool) {
if v&0b10 != 0 {
return 0, true
}
return 0, false
}
// encodeModUXTWCheck is the implementation of the following encoding logic:
// Check this is mod and is UXTW
func encodeModUXTWCheck(v uint32) (uint32, bool) {
if v&0b1 != 0 {
return 0, true
}
return 0, false
}
// encodeI2_1921_16To32Bit is the implementation of the following encoding logic:
// For the "16-bit to 32-bit" variant: is the immediate index of a pair of 16-bit elements within each 128-bit vector segment, in the range 0 to 3, encoded in the "i2" field.
// bit range mappings:
// i2: [19:21)
func encodeI2_1921_16To32Bit(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 19, true
}
// encodeI1_2021_16To64Bit is the implementation of the following encoding logic:
// For the "16-bit to 64-bit" variant: is the immediate index of a 64-bit group of four 16-bit values within each 128-bit vector segment, in the range 0 to 1, encoded in the "i1" field.
// bit range mappings:
// i1: [20:21)
func encodeI1_2021_16To64Bit(v uint32) (uint32, bool) {
if v > 1 {
return 0, false
}
return v << 20, true
}
// encodeZm1620_16To64Bit is the implementation of the following encoding logic:
// For the "16-bit to 64-bit" variant: is the name of the second source scalable vector register Z0-Z15, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:20)
func encodeZm1620_16To64Bit(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v > 15 {
return 0, false
}
return v << 16, true
}
// encodeZm1619_16Bit32Bit is the implementation of the following encoding logic:
// For the "16-bit" and "32-bit" variants: is the name of the second source scalable vector register Z0-Z7, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:19)
func encodeZm1619_16Bit32Bit(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v > 7 {
return 0, false
}
return v << 16, true
}
// encodeI2_1921_16bit is the implementation of the following encoding logic:
// For the "16-bit" variant: is the element index, in the range 0 to 3, encoded in the "i2" field.
// bit range mappings:
// i2: [19:21)
func encodeI2_1921_16bit(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 19, true
}
// encodeI3hI3l_1923_16Bit is the implementation of the following encoding logic:
// For the "16-bit" variant: is the element index, in the range 0 to 7, encoded in the "i3h:i3l" fields.
// bit range mappings:
// i3h: [22:23)
// i3l: [19:21)
func encodeI3hI3l_1923_16Bit(v uint32) (uint32, bool) {
if v > 7 {
return 0, false
}
return (v&3)<<19 | (v>>2)<<22, true
}
// encodeImm41620V7 is the implementation of the following encoding logic:
// For the "16-bit" variant: is the immediate shift amount, in the range 1 to 16, encoded in the "imm4" field.
// bit range mappings:
// imm4: [16:20)
func encodeImm41620V7(v uint32) (uint32, bool) {
if v < 1 || v > 16 {
return 0, false
}
// From ARM ASL: let shift : integer = esize - UInt(imm3);
// very weird design.
return (16 - v) << 16, true
}
// encodeZm_1619_Range0_7V1 is the implementation of the following encoding logic:
// For the "16-bit" variant: is the name of the second source scalable vector register Z0-Z7, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:19)
func encodeZm_1619_Range0_7V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v <= 7 {
return v << 16, true
}
return 0, false
}
// encodeI1_2021_32bit is the implementation of the following encoding logic:
// For the "32-bit" variant: is the element index, in the range 0 to 1, encoded in the "i1" field.
// bit range mappings:
// i1: [20:21)
func encodeI1_2021_32bit(v uint32) (uint32, bool) {
if v > 1 {
return 0, false
}
return v << 20, true
}
// encodeI2_1921_32Bit is the implementation of the following encoding logic:
// For the "32-bit" variant: is the element index, in the range 0 to 3, encoded in the "i2" field.
// bit range mappings:
// i2: [19:21)
func encodeI2_1921_32Bit(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 19, true
}
// encodeI3hI3l_1119_32Bit is the implementation of the following encoding logic:
// For the "32-bit" variant: is the element index, in the range 0 to 7, encoded in the "i3h:i3l" fields.
// bit range mappings:
// i3h: [19:21)
// i3l: [11:12)
func encodeI3hI3l_1119_32Bit(v uint32) (uint32, bool) {
if v > 7 {
return 0, false
}
return (v&1)<<11 | (v>>1)<<19, true
}
// encodeZm_1620_Range0_15 is the implementation of the following encoding logic:
// For the "32-bit" variant: is the name of the second source scalable vector register Z0-Z15, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:20)
func encodeZm_1620_Range0_15(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v <= 15 {
return v << 16, true
}
return 0, false
}
// encodeZm1619_32Bit is the implementation of the following encoding logic:
// For the "32-bit" variant: is the name of the second source scalable vector register Z0-Z7, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:19)
func encodeZm1619_32Bit(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v > 7 {
return 0, false
}
return v << 16, true
}
// encodeI1_2021_64Bit is the implementation of the following encoding logic:
// For the "64-bit" variant: is the element index, in the range 0 to 1, encoded in the "i1" field.
// bit range mappings:
// i1: [20:21)
func encodeI1_2021_64Bit(v uint32) (uint32, bool) {
if v > 1 {
return 0, false
}
return v << 20, true
}
// encodeI2hI2l_1120_64Bit is the implementation of the following encoding logic:
// For the "64-bit" variant: is the element index, in the range 0 to 3, encoded in the "i2h:i2l" fields.
// bit range mappings:
// i2h: [20:21)
// i2l: [11:12)
func encodeI2hI2l_1120_64Bit(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return (v&1)<<11 | (v>>1)<<20, true
}
// encodeZm1620_64Bit is the implementation of the following encoding logic:
// For the "64-bit" variant: is the name of the second source scalable vector register Z0-Z15, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:20)
func encodeZm1620_64Bit(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v > 15 {
return 0, false
}
return v << 16, true
}
// encodeI3hI3l_1923_8To16Bit is the implementation of the following encoding logic:
// For the "8-bit to 16-bit" variant: is the immediate index of a pair of 8-bit elements within each 128-bit vector segment, in the range 0 to 7, encoded in the "i3h:i3l" fields.
// bit range mappings:
// i3h: [22:23)
// i3l: [19:21)
func encodeI3hI3l_1923_8To16Bit(v uint32) (uint32, bool) {
if v > 7 {
return 0, false
}
return (v&3)<<19 | (v>>2)<<22, true
}
// encodeI2_1921_8To32Bit is the implementation of the following encoding logic:
// For the "8-bit to 32-bit" variant: is the immediate index of a 32-bit group of four 8-bit values within each 128-bit vector segment, in the range 0 to 3, encoded in the "i2" field.
// bit range mappings:
// i2: [19:21)
func encodeI2_1921_8To32Bit(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 19, true
}
// encodeZm1619_8To32Bit is the implementation of the following encoding logic:
// For the "8-bit to 32-bit" variant: is the name of the second source scalable vector register Z0-Z7, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:19)
func encodeZm1619_8To32Bit(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v > 7 {
return 0, false
}
return v << 16, true
}
// encodeImm31619 is the implementation of the following encoding logic:
// For the "8-bit" variant: is the immediate shift amount, in the range 1 to 8, encoded in the "imm3" field.
// bit range mappings:
// imm3: [16:19)
func encodeImm31619(v uint32) (uint32, bool) {
if v < 1 || v > 8 {
return 0, false
}
return v << 16, true
}
// encodeSzByteHalfword is the implementation of the following encoding logic:
// For the "Byte and halfword" variant: is the size specifier,
// sz <T>
// 0 B
// 1 H
// bit range mappings:
// sz: [22:23)
func encodeSzByteHalfword(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 0, true
case ARNG_H:
return 1 << 22, true
}
return 0, false
}
// encodeI22224 is the implementation of the following encoding logic:
// For the "Byte" variant: is the vector segment index, in the range 0 to 3, encoded in the "i2" field.
// bit range mappings:
// i2: [22:24)
func encodeI22224(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 22, true
}
// encodeSizeByteMergeZero is the implementation of the following encoding logic:
// For the "Byte, merging" and "Byte, zeroing" variants: is the size specifier,
// size <T>
// 00 RESERVED
// 01 H
// 10 S
// 11 D
// bit range mappings:
// size: [22:24)
func encodeSizeByteMergeZero(v uint32) (uint32, bool) {
switch v {
case ARNG_H:
return 1 << 22, true
case ARNG_S:
return 2 << 22, true
case ARNG_D:
return 3 << 22, true
}
return 0, false
}
// encodeI12324B is the implementation of the following encoding logic:
// For the "Byte, single register table" variant: is the vector segment index, in the range 0 to 1, encoded in the "i1" field.
// bit range mappings:
// i1: [23:24)
func encodeI12324B(v uint32) (uint32, bool) {
if v > 1 {
return 0, false
}
return v << 23, true
}
// encodeI1_2021_DoublePrecision is the implementation of the following encoding logic:
// For the "Double-precision" variant: is the immediate index, in the range 0 to 1, encoded in the "i1" field.
// bit range mappings:
// i1: [20:21)
func encodeI1_2021_DoublePrecision(v uint32) (uint32, bool) {
if v > 1 {
return 0, false
}
return v << 20, true
}
// encodeZm1620_DoublePrecision is the implementation of the following encoding logic:
// For the "Double-precision" variant: is the name of the second source scalable vector register Z0-Z15, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:20)
func encodeZm1620_DoublePrecision(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v > 15 {
return 0, false
}
return v << 16, true
}
// encodeI3hI3l_1722_Doubleword is the implementation of the following encoding logic:
// For the "Doubleword" variant: is the optional portion index, in the range 0 to 7, defaulting to 0, encoded in the "i3h:i3l" fields.
// bit range mappings:
// i3h: [22:23)
// i3l: [17:19)
func encodeI3hI3l_1722_Doubleword(v uint32) (uint32, bool) {
if v > 7 {
return 0, false
}
return (v&3)<<17 | (v>>2)<<22, true
}
// encodeImm5Signed_1621V2 is the implementation of the following encoding logic:
// For the "Equal", "Greater than or equal", "Greater than", "Less than or equal", "Less than", and "Not equal" variants: is the signed immediate operand, in the range -16 to 15, encoded in the "imm5" field.
// bit range mappings:
// imm5: [16:21)
func encodeImm5Signed_1621V2(v uint32) (uint32, bool) {
if int32(v) >= -16 && int32(v) <= 15 {
return (v & 31) << 16, true
}
return 0, false
}
// encodeZdn25V1 is the implementation of the following encoding logic:
// For the "Four registers" variant: is the name of the first scalable vector register of the destination and first source multi-vector group, encoded as "Zdn" times 4.
// bit range mappings:
// Zdn: [2:5)
func encodeZdn25V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v%4 != 0 {
return 0, false
}
return (v / 4) << 2, true
}
// encodeZt25V1 is the implementation of the following encoding logic:
// For the "Four registers" variant: is the name of the first scalable vector register to be transferred, encoded as "Zt" times 4.
// bit range mappings:
// Zt: [2:5)
func encodeZt25V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v%4 != 0 {
return 0, false
}
return (v / 4) << 2, true
}
// encodeImm41620V8 is the implementation of the following encoding logic:
// For the "Four registers" variant: is the optional signed immediate vector offset, a multiple of 4 in the range -32 to 28, defaulting to 0, encoded in the "imm4" field.
// bit range mappings:
// imm4: [16:20)
func encodeImm41620V8(v uint32) (uint32, bool) {
val := int32(v)
if val < -32 || val > 28 || val%4 != 0 {
return 0, false
}
encoded := uint32((val >> 2) & 0xf)
return encoded << 16, true
}
// encodeZm1619_HalfSinglePrecision is the implementation of the following encoding logic:
// For the "Half-precision" and "Single-precision" variants: is the name of the second source scalable vector register Z0-Z7, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:19)
func encodeZm1619_HalfSinglePrecision(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v > 7 {
return 0, false
}
return v << 16, true
}
// encodeI3hI3l_1923_HalfPrecision is the implementation of the following encoding logic:
// For the "Half-precision" variant: is the immediate index, in the range 0 to 7, encoded in the "i3h:i3l" fields.
// bit range mappings:
// i3h: [22:23)
// i3l: [19:21)
func encodeI3hI3l_1923_HalfPrecision(v uint32) (uint32, bool) {
if v > 7 {
return 0, false
}
return (v&3)<<19 | (v>>2)<<22, true
}
// encodeI2_1921_Half is the implementation of the following encoding logic:
// For the "Half-precision" variant: is the index of a Real and Imaginary pair, in the range 0 to 3, encoded in the "i2" field.
// bit range mappings:
// i2: [19:21)
func encodeI2_1921_Half(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 19, true
}
// encodeZm_1619_Half is the implementation of the following encoding logic:
// For the "Half-precision" variant: is the name of the second source scalable vector register Z0-Z7, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:19)
func encodeZm_1619_Half(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v <= 7 {
return v << 16, true
}
return 0, false
}
// encodeI1_1718_Halfword is the implementation of the following encoding logic:
// For the "Halfword" variant: is the optional portion index, in the range 0 to 1, defaulting to 0, encoded in the "i1" field.
// bit range mappings:
// i1: [17:18)
func encodeI1_1718_Halfword(v uint32) (uint32, bool) {
if v > 1 {
return 0, false
}
return v << 17, true
}
// encodeI3224I31213 is the implementation of the following encoding logic:
// For the "Halfword" variant: is the vector segment index, in the range 0 to 7, encoded in the "i3h:i3l" fields.
// bit range mappings:
// i3h: [22:24)
// i3l: [12:13)
func encodeI3224I31213(v uint32) (uint32, bool) {
if v > 7 {
return 0, false
}
return (v&1)<<12 | (v>>1)<<22, true
}
// encodeSize0HalfwordMergeZero is the implementation of the following encoding logic:
// For the "Halfword, merging" and "Halfword, zeroing" variants: is the size specifier,
// size[0] <T>
// 0 S
// 1 D
// bit range mappings:
// size: [22:23)
func encodeSize0HalfwordMergeZero(v uint32) (uint32, bool) {
switch v {
case ARNG_S:
return 0, true
case ARNG_D:
return 1 << 22, true
}
return 0, false
}
// encodeI22224HW is the implementation of the following encoding logic:
// For the "Halfword, single register table" and "Halfword, two register table" variants: is the vector segment index, in the range 0 to 3, encoded in the "i2" field.
// bit range mappings:
// i2: [22:24)
func encodeI22224HW(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 22, true
}
// encodeImm7Unsigned_1421 is the implementation of the following encoding logic:
// For the "Higher or same", "Higher", "Lower or same", and "Lower" variants: is the unsigned immediate operand, in the range 0 to 127, encoded in the "imm7" field.
// bit range mappings:
// imm7: [14:21)
func encodeImm7Unsigned_1421(v uint32) (uint32, bool) {
if v <= 127 {
return v << 14, true
}
return 0, false
}
// encodeI2_1921_SinglePrecision is the implementation of the following encoding logic:
// For the "Single-precision" variant: is the immediate index, in the range 0 to 3, encoded in the "i2" field.
// bit range mappings:
// i2: [19:21)
func encodeI2_1921_SinglePrecision(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 19, true
}
// encodeI1_2021_Single is the implementation of the following encoding logic:
// For the "Single-precision" variant: is the index of a Real and Imaginary pair, in the range 0 to 1, encoded in the "i1" field.
// bit range mappings:
// i1: [20:21)
func encodeI1_2021_Single(v uint32) (uint32, bool) {
if v > 1 {
return 0, false
}
return v << 20, true
}
// encodeZm_1620_Single is the implementation of the following encoding logic:
// For the "Single-precision" variant: is the name of the second source scalable vector register Z0-Z15, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:20)
func encodeZm_1620_Single(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v <= 15 {
return v << 16, true
}
return 0, false
}
// encodeZdn15V1 is the implementation of the following encoding logic:
// For the "Two registers" variant: is the name of the first scalable vector register of the destination and first source multi-vector group, encoded as "Zdn" times 2.
// bit range mappings:
// Zdn: [1:5)
func encodeZdn15V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v%2 != 0 {
return 0, false
}
return (v / 2) << 1, true
}
// encodeZt15V1 is the implementation of the following encoding logic:
// For the "Two registers" variant: is the name of the first scalable vector register to be transferred, encoded as "Zt" times 2.
// bit range mappings:
// Zt: [1:5)
func encodeZt15V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v%2 != 0 {
return 0, false
}
return (v / 2) << 1, true
}
// encodeImm41620V9 is the implementation of the following encoding logic:
// For the "Two registers" variant: is the optional signed immediate vector offset, a multiple of 2 in the range -16 to 14, defaulting to 0, encoded in the "imm4" field.
// bit range mappings:
// imm4: [16:20)
func encodeImm41620V9(v uint32) (uint32, bool) {
val := int32(v)
if val < -16 || val > 14 || val%2 != 0 {
return 0, false
}
encoded := uint32((val>>1)&0xf) << 16
return encoded, true
}
// encodeSzWordDoubleword is the implementation of the following encoding logic:
// For the "Word and doubleword" variant: is the size specifier,
// sz <T>
// 0 S
// 1 D
// bit range mappings:
// sz: [22:23)
func encodeSzWordDoubleword(v uint32) (uint32, bool) {
switch v {
case ARNG_S:
return 0, true
case ARNG_D:
return 1 << 22, true
}
return 0, false
}
// encodeI2_1719_Word is the implementation of the following encoding logic:
// For the "Word" variant: is the optional portion index, in the range 0 to 3, defaulting to 0, encoded in the "i2" field.
// bit range mappings:
// i2: [17:19)
func encodeI2_1719_Word(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 17, true
}
// encodeImm13_518 is the implementation of the following encoding logic:
// Is a 64, 32, 16 or 8-bit bitmask consisting of replicated 2, 4, 8, 16, 32 or 64 bit fields, each field containing a rotated run of non-zero bits, encoded in the "imm13" field.
// bit range mappings:
// imm13: [5:18)
func encodeImm13_518(v uint32) (uint32, bool) {
return codeLogicalImmArrEncoding, false
}
// encodeImm8_513_Fimm is the implementation of the following encoding logic:
// Is a floating-point immediate value expressible as ±n÷16×2^r, where n and r are integers such that 16 ≤ n ≤ 31 and -3 ≤ r ≤ 4, i.e. a normalized binary floating-point encoding with 1 sign bit, 3-bit exponent, and 4-bit fractional part, encoded in the "imm8" field.
// bit range mappings:
// imm8: [5:13)
func encodeImm8_513_Fimm(v uint32) (uint32, bool) {
if v <= 255 {
return v << 5, true
}
return 0, false
}
// encodeImm8SignedLsl8 is the implementation of the following encoding logic:
// Is a signed immediate in the range -128 to 127, encoded in the "imm8" field.
// bit range mappings:
// imm8: [5:13)
//
// Is the optional left shift to apply to the immediate, defaulting to LSL #0 and
// sh <shift>
// 0 LSL #0
// 1 LSL #8
// bit range mappings:
// sh: [13:14)
func encodeImm8SignedLsl8(v uint32) (uint32, bool) {
vi := int32(v)
if vi >= -128 && vi <= 127 {
imm8 := uint32(uint8(int8(vi)))
return (imm8 << 5), true
}
if vi&255 == 0 {
unshifted := vi >> 8
if unshifted >= -128 && unshifted <= 127 {
imm8 := uint32(uint8(int8(unshifted)))
return (imm8 << 5) | (1 << 13), true
}
}
return 0, false
}
// encodeSize16B8H4S2D is the implementation of the following encoding logic:
// Is an arrangement specifier,
// size <T>
// 00 16B
// 01 8H
// 10 4S
// 11 2D
// bit range mappings:
// size: [22:24)
func encodeSize16B8H4S2D(v uint32) (uint32, bool) {
switch v {
case ARNG_16B:
return 0, true
case ARNG_8H:
return 1 << 22, true
case ARNG_4S:
return 2 << 22, true
case ARNG_2D:
return 3 << 22, true
}
return 0, false
}
// encodeSize8H4S2D is the implementation of the following encoding logic:
// Is an arrangement specifier,
// size <T>
// 00 RESERVED
// 01 8H
// 10 4S
// 11 2D
// bit range mappings:
// size: [22:24)
func encodeSize8H4S2D(v uint32) (uint32, bool) {
switch v {
case ARNG_8H:
return 1 << 22, true
case ARNG_4S:
return 2 << 22, true
case ARNG_2D:
return 3 << 22, true
}
return 0, false
}
// encodeImm8UnsignedLsl8 is the implementation of the following encoding logic:
// Is an unsigned immediate in the range 0 to 255, encoded in the "imm8" field.
// bit range mappings:
// imm8: [5:13)
//
// Is the optional left shift to apply to the immediate, defaulting to LSL #0 and
// sh <shift>
// 0 LSL #0
// 1 LSL #8
// bit range mappings:
// sh: [13:14)
func encodeImm8UnsignedLsl8(v uint32) (uint32, bool) {
if v <= 255 {
return v << 5, true
}
if v&255 == 0 {
unshifted := v >> 8
if unshifted <= 255 {
return (unshifted << 5) | (1 << 13), true
}
}
return 0, false
}
// encodeWdn05 is the implementation of the following encoding logic:
// Is the 32-bit name of the source and destination general-purpose register, encoded in the "Rdn" field.
// bit range mappings:
// Rdn: [0:5)
func encodeWdn05(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_RSP {
return 0, false
}
return v & 31, true
}
// encodeVd0564 is the implementation of the following encoding logic:
// Is the 64-bit name of the destination SIMD&FP register, encoded in the "Vd" field.
// bit range mappings:
// Vd: [0:5)
func encodeVd0564(v uint32) (uint32, bool) {
return v & 31, true
}
// encodeRd05_SPAllowed is the implementation of the following encoding logic:
// Is the 64-bit name of the destination general-purpose register or stack pointer, encoded in the "Rd" field.
// bit range mappings:
// Rd: [0:5)
func encodeRd05_SPAllowed(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_R31 {
return 0, false
}
if v == REG_RSP {
return 31, true
}
return v & 31, true
}
// encodeRd05 is the implementation of the following encoding logic:
// Is the 64-bit name of the destination general-purpose register, encoded in the "Rd" field.
// bit range mappings:
// Rd: [0:5)
func encodeRd05(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_RSP {
return 0, false
}
return v & 31, true
}
// encodeRn510 is the implementation of the following encoding logic:
// Is the 64-bit name of the first source general-purpose register, encoded in the "Rn" field.
// bit range mappings:
// Rn: [5:10)
func encodeRn510(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_RSP {
return 0, false
}
return (v & 31) << 5, true
}
// encodeRn510SPV2 is the implementation of the following encoding logic:
// Is the 64-bit name of the general-purpose base register or stack pointer, encoded in the "Rn" field.
// bit range mappings:
// Rn: [5:10)
func encodeRn510SPV2(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_R31 {
return 0, false
}
if v == REG_RSP {
return 31 << 5, true
}
return (v & 31) << 5, true
}
// encodeRm1621V2 is the implementation of the following encoding logic:
// Is the 64-bit name of the general-purpose offset register, encoded in the "Rm" field.
// bit range mappings:
// Rm: [16:21)
func encodeRm1621V2(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_RSP {
return 0, false
}
return (v & 31) << 16, true
}
// encodeRm1621V1 is the implementation of the following encoding logic:
// Is the 64-bit name of the second source general-purpose register, encoded in the "Rm" field.
// bit range mappings:
// Rm: [16:21)
func encodeRm1621V1(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_RSP {
return 0, false
}
return (v & 31) << 16, true
}
// encodeXdn05 is the implementation of the following encoding logic:
// Is the 64-bit name of the source and destination general-purpose register, encoded in the "Rdn" field.
// bit range mappings:
// Rdn: [0:5)
func encodeXdn05(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_RSP {
return 0, false
}
return v & 31, true
}
// encodeRn1621_SPAllowed is the implementation of the following encoding logic:
// Is the 64-bit name of the source general-purpose register or stack pointer, encoded in the "Rn" field.
// bit range mappings:
// Rn: [16:21)
func encodeRn1621_SPAllowed(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_R31 {
return 0, false
}
if v == REG_RSP {
return 31 << 16, true
}
return (v & 31) << 16, true
}
// encodeRot90_270_1011 is the implementation of the following encoding logic:
// Is the const specifier,
// rot <const>
// 0 #90
// 1 #270
// bit range mappings:
// rot: [10:11)
func encodeRot90_270_1011(v uint32) (uint32, bool) {
switch v {
case 90:
return 0, true
case 270:
return 1 << 10, true
}
return 0, false
}
// encodeRot90_270_1617 is the implementation of the following encoding logic:
// Is the const specifier,
// rot <const>
// 0 #90
// 1 #270
// bit range mappings:
// rot: [16:17)
func encodeRot90_270_1617(v uint32) (uint32, bool) {
switch v {
case 90:
return 0, true
case 270:
return 1 << 16, true
}
return 0, false
}
// encodeRot0_90_180_270_1012 is the implementation of the following encoding logic:
// Is the const specifier,
// rot <const>
// 00 #0
// 01 #90
// 10 #180
// 11 #270
// bit range mappings:
// rot: [10:12)
func encodeRot0_90_180_270_1012(v uint32) (uint32, bool) {
switch v {
case 0:
return 0, true
case 90:
return 1 << 10, true
case 180:
return 2 << 10, true
case 270:
return 3 << 10, true
}
return 0, false
}
// encodeRot0_90_180_270_1315 is the implementation of the following encoding logic:
// Is the const specifier,
// rot <const>
// 00 #0
// 01 #90
// 10 #180
// 11 #270
// bit range mappings:
// rot: [13:15)
func encodeRot0_90_180_270_1315(v uint32) (uint32, bool) {
switch v {
case 0:
return 0, true
case 90:
return 1 << 13, true
case 180:
return 2 << 13, true
case 270:
return 3 << 13, true
}
return 0, false
}
// encodeImm5Signed_510 is the implementation of the following encoding logic:
// Is the first signed immediate operand, in the range -16 to 15, encoded in the "imm5" field.
// bit range mappings:
// imm5: [5:10)
func encodeImm5Signed_510(v uint32) (uint32, bool) {
if int32(v) >= -16 && int32(v) <= 15 {
return (v & 31) << 5, true
}
return 0, false
}
// encodeFimm0_0_1_0_56 is the implementation of the following encoding logic:
// Is the floating-point immediate value,
// i1 <const>
// 0 #0.0
// 1 #1.0
// bit range mappings:
// i1: [5:6)
func encodeFimm0_0_1_0_56(v uint32) (uint32, bool) {
switch v {
case 0:
return 0, true
case 0x3F800000: // 1.0
return 1 << 5, true
}
return 0, false
}
// encodeFimm0_5_1_0_56 is the implementation of the following encoding logic:
// Is the floating-point immediate value,
// i1 <const>
// 0 #0.5
// 1 #1.0
// bit range mappings:
// i1: [5:6)
func encodeFimm0_5_1_0_56(v uint32) (uint32, bool) {
switch v {
case 0x3F000000: // 0.5
return 0, true
case 0x3F800000: // 1.0
return 1 << 5, true
}
return 0, false
}
// encodeFimm0_5_2_0_56 is the implementation of the following encoding logic:
// Is the floating-point immediate value,
// i1 <const>
// 0 #0.5
// 1 #2.0
// bit range mappings:
// i1: [5:6)
func encodeFimm0_5_2_0_56(v uint32) (uint32, bool) {
switch v {
case 0x3F000000: // 0.5
return 0, true
case 0x40000000: // 2.0
return 1 << 5, true
}
return 0, false
}
// encodeI2_1921_8BitGroup is the implementation of the following encoding logic:
// Is the immediate index of a 32-bit group of four 8-bit values within each 128-bit vector segment, in the range 0 to 3, encoded in the "i2" field.
// bit range mappings:
// i2: [19:21)
func encodeI2_1921_8BitGroup(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 19, true
}
// encodeI2_1921_Pair16Bit is the implementation of the following encoding logic:
// Is the immediate index of a pair of 16-bit elements within each 128-bit vector segment, in the range 0 to 3, encoded in the "i2" field.
// bit range mappings:
// i2: [19:21)
func encodeI2_1921_Pair16Bit(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 19, true
}
// encodeI3hI3l_1119_Pair8Bit is the implementation of the following encoding logic:
// Is the immediate index of a pair of 8-bit elements within each 128-bit vector segment, in the range 0 to 7, encoded in the "i3h:i3l" fields.
// bit range mappings:
// i3h: [19:21)
// i3l: [11:12)
func encodeI3hI3l_1119_Pair8Bit(v uint32) (uint32, bool) {
if v > 7 {
return 0, false
}
return (v&1)<<11 | (v>>1)<<19, true
}
// encodeI4hI4l_1019 is the implementation of the following encoding logic:
// Is the immediate index, in the range 0 to 15, encoded in the "i4h:i4l" fields.
// bit range mappings:
// i4h: [19:21)
// i4l: [10:12)
func encodeI4hI4l_1019(v uint32) (uint32, bool) {
if v > 15 {
return 0, false
}
return (v&3)<<10 | (v>>2)<<19, true
}
// encodeI3hI3l_1119 is the implementation of the following encoding logic:
// Is the immediate index, in the range 0 to 7, encoded in the "i3h:i3l" fields.
// bit range mappings:
// i3h: [19:21)
// i3l: [11:12)
func encodeI3hI3l_1119(v uint32) (uint32, bool) {
if v > 7 {
return 0, false
}
return (v&1)<<11 | (v>>1)<<19, true
}
// encodeI3hI3l_1922 is the implementation of the following encoding logic:
// Is the immediate index, in the range 0 to 7, encoded in the "i3h:i3l" fields.
// bit range mappings:
// i3h: [22:23)
// i3l: [19:21)
func encodeI3hI3l_1922(v uint32) (uint32, bool) {
if v > 7 {
return 0, false
}
return (v&3)<<19 | (v>>2)<<22, true
}
// encodeI1Tsz_Delegate is the implementation of the following encoding logic:
// Is the immediate index, in the range 0 to one less than the number of elements in 128 bits, encoded in "i1:tsz".
// bit range mappings:
// i1: [20:21)
// tsz: [16:20)
func encodeI1Tsz_Delegate(v uint32) (uint32, bool) {
// The statement "range 0 to one less than the number of elements in 128 bits"
// is not possible to handle here, we delegate this to the caller.
return codeI1Tsz, false
}
// encodeImm2Tsz_Delegate is the implementation of the following encoding logic:
// Is the immediate index, in the range 0 to one less than the number of elements in 512 bits, encoded in "imm2:tsz".
// bit range mappings:
// imm2: [22:24)
// tsz: [16:21)
func encodeImm2Tsz_Delegate(v uint32) (uint32, bool) {
// The statement "range 0 to one less than the number of elements in 512 bits"
// is not possible to handle here, we delegate this to the caller.
return codeImm2Tsz, false
}
// encodeShiftTsz1619Range0V1 is the implementation of the following encoding logic:
// Is the immediate shift amount, in the range 0 to number of bits per element minus 1, encoded in "tszh:tszl:imm3".
// bit range mappings:
// imm3: [16:19)
// tszh: [22:23)
// tszl: [19:21)
func encodeShiftTsz1619Range0V1(v uint32) (uint32, bool) {
return codeShift161919212223, false
}
// encodeShiftTsz1619Range0V2 is the implementation of the following encoding logic:
// Is the immediate shift amount, in the range 0 to number of bits per element minus 1, encoded in "tszh:tszl:imm3".
// bit range mappings:
// imm3: [16:19)
// tszh: [22:24)
// tszl: [19:21)
func encodeShiftTsz1619Range0V2(v uint32) (uint32, bool) {
return codeShift161919212224, false
}
// encodeShiftTsz58Range0 is the implementation of the following encoding logic:
// Is the immediate shift amount, in the range 0 to number of bits per element minus 1, encoded in "tszh:tszl:imm3".
// bit range mappings:
// imm3: [5:8)
// tszh: [22:24)
// tszl: [8:10)
func encodeShiftTsz58Range0(v uint32) (uint32, bool) {
return codeShift588102224, false
}
// encodeImm3Tsize1621Stub is the implementation of the following encoding logic:
// Is the immediate shift amount, in the range 1 to number of bits per element, encoded in "tsize:imm3".
// bit range mappings:
// imm3: [16:19)
// tsize: [19:21)
func encodeImm3Tsize1621Stub(v uint32) (uint32, bool) {
return codeImm3Tsize1621, false
}
// encodeShiftTsz1619Range1V1 is the implementation of the following encoding logic:
// Is the immediate shift amount, in the range 1 to number of bits per element, encoded in "tszh:tszl:imm3".
// bit range mappings:
// imm3: [16:19)
// tszh: [22:23)
// tszl: [19:21)
func encodeShiftTsz1619Range1V1(v uint32) (uint32, bool) {
return codeShift161919212223, false
}
// encodeShiftTsz1619Range1V2 is the implementation of the following encoding logic:
// Is the immediate shift amount, in the range 1 to number of bits per element, encoded in "tszh:tszl:imm3".
// bit range mappings:
// imm3: [16:19)
// tszh: [22:24)
// tszl: [19:21)
func encodeShiftTsz1619Range1V2(v uint32) (uint32, bool) {
return codeShift161919212224, false
}
// encodeShiftTsz58Range1 is the implementation of the following encoding logic:
// Is the immediate shift amount, in the range 1 to number of bits per element, encoded in "tszh:tszl:imm3".
// bit range mappings:
// imm3: [5:8)
// tszh: [22:24)
// tszl: [8:10)
func encodeShiftTsz58Range1(v uint32) (uint32, bool) {
return codeShift588102224, false
}
// encodeMsz1012 is the implementation of the following encoding logic:
// Is the index extend and shift specifier,
// msz <mod>
// 00 [absent]
// x1 LSL
// 10 LSL
// bit range mappings:
// msz: [10:12)
func encodeMsz1012(v uint32) (uint32, bool) {
// This does not accept UXTW and SXTW, check that
if v&0b11 != 0 {
return 0, false
}
// Note: this encoding function's semantic is entailed by its peer that
// encode <amount>, so just do nothing.
return codeNoOp, false
}
// encodeXs1415 is the implementation of the following encoding logic:
// Is the index extend and shift specifier,
// xs <mod>
// 0 UXTW
// 1 SXTW
// bit range mappings:
// xs: [14:15)
func encodeXs1415(v uint32) (uint32, bool) {
if v&0b1 != 0 {
return 0, true
} else if v&0b10 != 0 {
return 1 << 14, true
}
return 0, false
}
// encodeXs2223 is the implementation of the following encoding logic:
// Is the index extend and shift specifier,
// xs <mod>
// 0 UXTW
// 1 SXTW
// bit range mappings:
// xs: [22:23)
func encodeXs2223(v uint32) (uint32, bool) {
if v&0b1 != 0 {
return 0, true
} else if v&0b10 != 0 {
return 1 << 22, true
}
return 0, false
}
// encodeMsz1012Amount is the implementation of the following encoding logic:
// Is the index shift amount,
// msz <amount>
// 00 [absent]
// 01 #1
// 10 #2
// 11 #3
// bit range mappings:
// msz: [10:12)
func encodeMsz1012Amount(v uint32) (uint32, bool) {
if v <= 3 {
return v << 10, true
}
return 0, false
}
// encodeZn510V2 is the implementation of the following encoding logic:
// Is the name of the base scalable vector register, encoded in the "Zn" field.
// bit range mappings:
// Zn: [5:10)
func encodeZn510V2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v << 5, true
}
// encodeVd is the implementation of the following encoding logic:
// Is the name of the destination SIMD&FP register, encoded in the "Vd" field.
// bit range mappings:
// Vd: [0:5)
func encodeVd(v uint32) (uint32, bool) {
return v & 31, true
}
// encodePNd is the implementation of the following encoding logic:
// Is the name of the destination scalable predicate register PN8-PN15, with predicate-as-counter encoding, encoded in the "PNd" field.
// bit range mappings:
// PNd: [0:3)
func encodePNd(v uint32) (uint32, bool) {
if v >= 24 && v <= 31 {
// PN registers starts from 16.
return v - 24, true
}
return 0, false
}
// encodePd is the implementation of the following encoding logic:
// Is the name of the destination scalable predicate register, encoded in the "Pd" field.
// bit range mappings:
// Pd: [0:4)
func encodePd(v uint32) (uint32, bool) {
return v, true
}
// encodePt04V1 is the implementation of the following encoding logic:
// Is the name of the destination scalable predicate register, encoded in the "Pt" field.
// bit range mappings:
// Pt: [0:4)
func encodePt04V1(v uint32) (uint32, bool) {
if v > 15 {
return 0, false
}
return v, true
}
// encodeZd is the implementation of the following encoding logic:
// Is the name of the destination scalable vector register, encoded in the "Zd" field.
// bit range mappings:
// Zd: [0:5)
func encodeZd(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v, true
}
// encodePd14 is the implementation of the following encoding logic:
// Is the name of the first destination scalable predicate register, encoded as "Pd" times 2.
// bit range mappings:
// Pd: [1:4)
func encodePd14(v uint32) (uint32, bool) {
if v > 14 {
return 0, false
}
if v&1 != 0 {
return 0, false
}
return v, true
}
// encodePd04 is the implementation of the following encoding logic:
// Is the name of the first destination scalable predicate register, encoded in the "Pd" field.
// bit range mappings:
// Pd: [0:4)
func encodePd04(v uint32) (uint32, bool) {
return v, true
}
// encodeZd15V1 is the implementation of the following encoding logic:
// Is the name of the first scalable vector register of the destination multi-vector group, encoded as "Zd" times 2.
// bit range mappings:
// Zd: [1:5)
func encodeZd15V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v%2 != 0 {
return 0, false
}
return (v / 2) << 1, true
}
// encodeZda15V1 is the implementation of the following encoding logic:
// Is the name of the first scalable vector register of the destination multi-vector group, encoded as "Zda" times 2.
// bit range mappings:
// Zda: [1:5)
func encodeZda15V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v%2 != 0 {
return 0, false
}
return (v / 2) << 1, true
}
// encodeGenZn510V1 is the implementation of the following encoding logic:
// Is the name of the first scalable vector register of the first source multi-vector group, encoded in the "Zn" field.
// bit range mappings:
// Zn: [5:10)
func encodeGenZn510V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v << 5, true
}
// encodeZn610V1 is the implementation of the following encoding logic:
// Is the name of the first scalable vector register of the source multi-vector group, encoded as "Zn" times 2.
// bit range mappings:
// Zn: [6:10)
func encodeZn610V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v%2 != 0 {
return 0, false
}
return (v / 2) << 6, true
}
// encodeZn510MultiSrc1 is the implementation of the following encoding logic:
// Is the name of the first scalable vector register of the source multi-vector group, encoded in the "Zn" field.
// bit range mappings:
// Zn: [5:10)
func encodeZn510MultiSrc1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v << 5, true
}
// encodeZt051 is the implementation of the following encoding logic:
// Is the name of the first scalable vector register to be transferred, encoded in the "Zt" field.
// bit range mappings:
// Zt: [0:5)
func encodeZt051(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v, true
}
// encodePdnDest is the implementation of the following encoding logic:
// Is the name of the first source and destination scalable predicate register, encoded in the "Pdn" field.
// bit range mappings:
// Pdn: [0:4)
func encodePdnDest(v uint32) (uint32, bool) {
return v, true
}
// encodeZdnDest is the implementation of the following encoding logic:
// Is the name of the first source and destination scalable vector register, encoded in the "Zdn" field.
// bit range mappings:
// Zdn: [0:5)
func encodeZdnDest(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v, true
}
// encodePnN_58 is the implementation of the following encoding logic:
// Is the name of the first source scalable predicate register PN8-PN15, with predicate-as-counter encoding, encoded in the "PNn" field.
// bit range mappings:
// PNn: [5:8)
func encodePnN_58(v uint32) (uint32, bool) {
if v >= 24 && v <= 31 {
// PN registers starts from 16.
return (v - 24) << 5, true
}
return 0, false
}
// encodePn59 is the implementation of the following encoding logic:
// Is the name of the first source scalable predicate register, encoded in the "Pn" field.
// bit range mappings:
// Pn: [5:9)
func encodePn59(v uint32) (uint32, bool) {
return v << 5, true
}
// encodeZn510V1 is the implementation of the following encoding logic:
// Is the name of the first source scalable vector register, encoded in the "Zn" field.
// bit range mappings:
// Zn: [5:10)
func encodeZn510V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v << 5, true
}
// encodeZn510Table1 is the implementation of the following encoding logic:
// Is the name of the first table vector register, encoded as "Zn".
// bit range mappings:
// Zn: [5:10)
func encodeZn510Table1(v uint32) (uint32, bool) {
return v << 5, true
}
// encodeZdn25V2 is the implementation of the following encoding logic:
// Is the name of the fourth scalable vector register of the destination and first source multi-vector group, encoded as "Zdn" times 4 plus 3.
// bit range mappings:
// Zdn: [2:5)
func encodeZdn25V2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v < 3 || (v-3)%4 != 0 {
return 0, false
}
return ((v - 3) / 4) << 2, true
}
// encodeZt054 is the implementation of the following encoding logic:
// Is the name of the fourth scalable vector register to be transferred, encoded as "Zt" plus 3 modulo 32.
// bit range mappings:
// Zt: [0:5)
func encodeZt054(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return (v - 3) % 32, true
}
// encodeZt25V2 is the implementation of the following encoding logic:
// Is the name of the fourth scalable vector register to be transferred, encoded as "Zt" times 4 plus 3.
// bit range mappings:
// Zt: [2:5)
func encodeZt25V2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v < 3 || (v-3)%4 != 0 {
return 0, false
}
return ((v - 3) / 4) << 2, true
}
// encodePg1013 is the implementation of the following encoding logic:
// Is the name of the governing scalable predicate register P0-P7, encoded in the "Pg" field.
// bit range mappings:
// Pg: [10:13)
func encodePg1013(v uint32) (uint32, bool) {
if v <= 7 {
return v << 10, true
}
return 0, false
}
// encodePNg1013 is the implementation of the following encoding logic:
// Is the name of the governing scalable predicate register PN8-PN15, with predicate-as-counter encoding, encoded in the "PNg" field.
// bit range mappings:
// PNg: [10:13)
func encodePNg1013(v uint32) (uint32, bool) {
if v < 24 {
return 0, false
}
return (v - 24) << 10, true
}
// encodePg1014 is the implementation of the following encoding logic:
// Is the name of the governing scalable predicate register, encoded in the "Pg" field.
// bit range mappings:
// Pg: [10:14)
func encodePg1014(v uint32) (uint32, bool) {
return v << 10, true
}
// encodePg1620 is the implementation of the following encoding logic:
// Is the name of the governing scalable predicate register, encoded in the "Pg" field.
// bit range mappings:
// Pg: [16:20)
func encodePg1620(v uint32) (uint32, bool) {
return v << 16, true
}
// encodePg59 is the implementation of the following encoding logic:
// Is the name of the governing scalable predicate register, encoded in the "Pg" field.
// bit range mappings:
// Pg: [5:9)
func encodePg59(v uint32) (uint32, bool) {
return v << 5, true
}
// encodeZm1621V3 is the implementation of the following encoding logic:
// Is the name of the offset scalable vector register, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:21)
func encodeZm1621V3(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v << 16, true
}
// encodePt04V2 is the implementation of the following encoding logic:
// Is the name of the scalable predicate transfer register, encoded in the "Pt" field.
// bit range mappings:
// Pt: [0:4)
func encodePt04V2(v uint32) (uint32, bool) {
if v > 15 {
return 0, false
}
return v, true
}
// encodeZt05 is the implementation of the following encoding logic:
// Is the name of the scalable vector register to be transferred, encoded in the "Zt" field.
// bit range mappings:
// Zt: [0:5)
func encodeZt05(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v, true
}
// encodePd14Plus1 is the implementation of the following encoding logic:
// Is the name of the second destination scalable predicate register, encoded as "Pd" times 2 plus 1.
// bit range mappings:
// Pd: [1:4)
func encodePd14Plus1(v uint32) (uint32, bool) {
if v&1 == 0 {
return 0, false
}
return v - 1, true
}
// encodePd04Plus1 is the implementation of the following encoding logic:
// Is the name of the second destination scalable predicate register, encoded in the "Pd" field.
// bit range mappings:
// Pd: [0:4)
func encodePd04Plus1(v uint32) (uint32, bool) {
// This "second destination" incurs Pd + 1 == v
return v - 1, true
}
// encodeZdn15V2 is the implementation of the following encoding logic:
// Is the name of the second scalable vector register of the destination and first source multi-vector group, encoded as "Zdn" times 2 plus 1.
// bit range mappings:
// Zdn: [1:5)
func encodeZdn15V2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v < 1 || (v-1)%2 != 0 {
return 0, false
}
return ((v - 1) / 2) << 1, true
}
// encodeZd15V2 is the implementation of the following encoding logic:
// Is the name of the second scalable vector register of the destination multi-vector group, encoded as "Zd" times 2 plus 1.
// bit range mappings:
// Zd: [1:5)
func encodeZd15V2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v%2 == 0 {
return 0, false
}
return ((v - 1) / 2) << 1, true
}
// encodeZda15V2 is the implementation of the following encoding logic:
// Is the name of the second scalable vector register of the destination multi-vector group, encoded as "Zda" times 2 plus 1.
// bit range mappings:
// Zda: [1:5)
func encodeZda15V2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v%2 == 0 {
return 0, false
}
return ((v - 1) / 2) << 1, true
}
// encodeGenZn510V2 is the implementation of the following encoding logic:
// Is the name of the second scalable vector register of the first source multi-vector group, encoded in the "Zn" field.
// bit range mappings:
// Zn: [5:10)
func encodeGenZn510V2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return (v - 1) << 5, true
}
// encodeZn610V2 is the implementation of the following encoding logic:
// Is the name of the second scalable vector register of the source multi-vector group, encoded as "Zn" times 2 plus 1.
// bit range mappings:
// Zn: [6:10)
func encodeZn610V2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v%2 == 0 {
return 0, false
}
return ((v - 1) / 2) << 6, true
}
// encodeZn510MultiSrc2 is the implementation of the following encoding logic:
// Is the name of the second scalable vector register of the source multi-vector group, encoded in the "Zn" field.
// bit range mappings:
// Zn: [5:10)
func encodeZn510MultiSrc2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return (v - 1) << 5, true
}
// encodeZt052 is the implementation of the following encoding logic:
// Is the name of the second scalable vector register to be transferred, encoded as "Zt" plus 1 modulo 32.
// bit range mappings:
// Zt: [0:5)
func encodeZt052(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return (v - 1) % 32, true
}
// encodeZt15V2 is the implementation of the following encoding logic:
// Is the name of the second scalable vector register to be transferred, encoded as "Zt" times 2 plus 1.
// bit range mappings:
// Zt: [1:5)
func encodeZt15V2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
if v < 1 || (v-1)%2 != 0 {
return 0, false
}
return ((v - 1) / 2) << 1, true
}
// encodePdmDest is the implementation of the following encoding logic:
// Is the name of the second source and destination scalable predicate register, encoded in the "Pdm" field.
// bit range mappings:
// Pdm: [0:4)
func encodePdmDest(v uint32) (uint32, bool) {
return v, true
}
// encodeZdaDest is the implementation of the following encoding logic:
// Is the name of the second source and destination scalable vector register, encoded in the "Zda" field.
// bit range mappings:
// Zda: [0:5)
func encodeZdaDest(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v, true
}
// encodePm1620 is the implementation of the following encoding logic:
// Is the name of the second source scalable predicate register, encoded in the "Pm" field.
// bit range mappings:
// Pm: [16:20)
func encodePm1620(v uint32) (uint32, bool) {
return v << 16, true
}
// encodeZm_1619_Range0_7V2 is the implementation of the following encoding logic:
// Is the name of the second source scalable vector register Z0-Z7, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:19)
func encodeZm_1619_Range0_7V2(v uint32) (uint32, bool) {
if v <= 7 {
return v << 16, true
}
return 0, false
}
// encodeZm1621V2 is the implementation of the following encoding logic:
// Is the name of the second source scalable vector register, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:21)
func encodeZm1621V2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v << 16, true
}
// encodeZm510V1 is the implementation of the following encoding logic:
// Is the name of the second source scalable vector register, encoded in the "Zm" field.
// bit range mappings:
// Zm: [5:10)
func encodeZm510V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return (v & 31) << 5, true
}
// encodeZn510Table2 is the implementation of the following encoding logic:
// Is the name of the second table vector register, encoded as "Zn" plus 1 modulo 32.
// bit range mappings:
// Zn: [5:10)
func encodeZn510Table2(v uint32) (uint32, bool) {
return ((v - 1) & 0x1f) << 5, true
}
// encodePdnSrcDst is the implementation of the following encoding logic:
// Is the name of the source and destination scalable predicate register, encoded in the "Pdn" field.
// bit range mappings:
// Pdn: [0:4)
func encodePdnSrcDst(v uint32) (uint32, bool) {
return v, true
}
// encodeZdnSrcDst is the implementation of the following encoding logic:
// Is the name of the source and destination scalable vector register, encoded in the "Zdn" field.
// bit range mappings:
// Zdn: [0:5)
func encodeZdnSrcDst(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v, true
}
// encodePm59V1 is the implementation of the following encoding logic:
// Is the name of the source scalable predicate register, encoded in the "Pm" field.
// bit range mappings:
// Pm: [5:9)
func encodePm59V1(v uint32) (uint32, bool) {
return v << 5, true
}
// encodePn59V2 is the implementation of the following encoding logic:
// Is the name of the source scalable predicate register, encoded in the "Pn" field.
// bit range mappings:
// Pn: [5:9)
func encodePn59V2(v uint32) (uint32, bool) {
return v << 5, true
}
// encodePNn59 is the implementation of the following encoding logic:
// Is the name of the source scalable predicate register, with predicate-as-counter encoding, encoded in the "PNn" field.
// bit range mappings:
// PNn: [5:9)
func encodePNn59(v uint32) (uint32, bool) {
if v > 15 {
return (v - 16) << 5, true
}
return 0, false
}
// encodeZm1621V1 is the implementation of the following encoding logic:
// Is the name of the source scalable vector register, encoded in the "Zm" field.
// bit range mappings:
// Zm: [16:21)
func encodeZm1621V1(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v << 16, true
}
// encodeZm510V2 is the implementation of the following encoding logic:
// Is the name of the source scalable vector register, encoded in the "Zm" field.
// bit range mappings:
// Zm: [5:10)
func encodeZm510V2(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return (v & 31) << 5, true
}
// encodeZn510Src is the implementation of the following encoding logic:
// Is the name of the source scalable vector register, encoded in the "Zn" field.
// bit range mappings:
// Zn: [5:10)
func encodeZn510Src(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return (v & 31) << 5, true
}
// encodeZn510Table3 is the implementation of the following encoding logic:
// Is the name of the table vector register, encoded in the "Zn" field.
// bit range mappings:
// Zn: [5:10)
func encodeZn510Table3(v uint32) (uint32, bool) {
return v << 5, true
}
// encodeZt053 is the implementation of the following encoding logic:
// Is the name of the third scalable vector register to be transferred, encoded as "Zt" plus 2 modulo 32.
// bit range mappings:
// Zt: [0:5)
func encodeZt053(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return (v - 2) % 32, true
}
// encodeZda3RdSrcDst is the implementation of the following encoding logic:
// Is the name of the third source and destination scalable vector register, encoded in the "Zda" field.
// bit range mappings:
// Zda: [0:5)
func encodeZda3RdSrcDst(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v, true
}
// encodeZa16213Rd is the implementation of the following encoding logic:
// Is the name of the third source scalable vector register, encoded in the "Za" field.
// bit range mappings:
// Za: [16:21)
func encodeZa16213Rd(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v << 16, true
}
// encodeZa5103Rd is the implementation of the following encoding logic:
// Is the name of the third source scalable vector register, encoded in the "Za" field.
// bit range mappings:
// Za: [5:10)
func encodeZa5103Rd(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v << 5, true
}
// encodeZk5103Rd is the implementation of the following encoding logic:
// Is the name of the third source scalable vector register, encoded in the "Zk" field.
// bit range mappings:
// Zk: [5:10)
func encodeZk5103Rd(v uint32) (uint32, bool) {
if !stripRawZ(&v) {
return 0, false
}
return v << 5, true
}
// encodePv1013 is the implementation of the following encoding logic:
// Is the name of the vector select predicate register P0-P7, encoded in the "Pv" field.
// bit range mappings:
// Pv: [10:13)
func encodePv1013(v uint32) (uint32, bool) {
return v << 10, true
}
// encodePv1014 is the implementation of the following encoding logic:
// Is the name of the vector select predicate register, encoded in the "Pv" field.
// bit range mappings:
// Pv: [10:14)
func encodePv1014(v uint32) (uint32, bool) {
return v << 10, true
}
// encodePv59 is the implementation of the following encoding logic:
// Is the name of the vector select predicate register, encoded in the "Pv" field.
// bit range mappings:
// Pv: [5:9)
func encodePv59(v uint32) (uint32, bool) {
return v << 5, true
}
// encodeRd05ZR is the implementation of the following encoding logic:
// Is the number [0-30] of the destination general-purpose register or the name ZR (31), encoded in the "Rd" field.
// bit range mappings:
// Rd: [0:5)
func encodeRd05ZR(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_RSP {
return 0, false
}
// ZR is just R31
return v & 31, true
}
// encodeRn510SPV1 is the implementation of the following encoding logic:
// Is the number [0-30] of the general-purpose source register or the name SP (31), encoded in the "Rn" field.
// bit range mappings:
// Rn: [5:10)
func encodeRn510SPV1(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_R31 {
return 0, false
}
if v == REG_RSP {
return (REG_R31 & 31) << 5, true
}
return (v & 31) << 5, true
}
// encodeRdn05ZR is the implementation of the following encoding logic:
// Is the number [0-30] of the source and destination general-purpose register or the name ZR (31), encoded in the "Rdn" field.
// bit range mappings:
// Rdn: [0:5)
func encodeRdn05ZR(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_RSP {
return 0, false
}
return v & 31, true
}
// encodeRm1621ZR is the implementation of the following encoding logic:
// Is the number [0-30] of the source general-purpose register or the name ZR (31), encoded in the "Rm" field.
// bit range mappings:
// Rm: [16:21)
func encodeRm1621ZR(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_RSP {
return 0, false
}
return (v & 31) << 16, true
}
// encodeRm510ZR is the implementation of the following encoding logic:
// Is the number [0-30] of the source general-purpose register or the name ZR (31), encoded in the "Rm" field.
// bit range mappings:
// Rm: [5:10)
func encodeRm510ZR(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_RSP {
return 0, false
}
return (v & 31) << 5, true
}
// encodeRn510ZR is the implementation of the following encoding logic:
// Is the number [0-30] of the source general-purpose register or the name ZR (31), encoded in the "Rn" field.
// bit range mappings:
// Rn: [5:10)
func encodeRn510ZR(v uint32) (uint32, bool) {
if !checkIsR(v) {
return 0, false
}
if v == REG_RSP {
return 0, false
}
return (v & 31) << 5, true
}
// encodeVd05 is the implementation of the following encoding logic:
// Is the number [0-31] of the destination SIMD&FP register, encoded in the "Vd" field.
// bit range mappings:
// Vd: [0:5)
func encodeVd05(v uint32) (uint32, bool) {
return v & 31, true
}
// encodeVm510 is the implementation of the following encoding logic:
// Is the number [0-31] of the source SIMD&FP register, encoded in the "Vm" field.
// bit range mappings:
// Vm: [5:10)
func encodeVm510(v uint32) (uint32, bool) {
return (v & 31) << 5, true
}
// encodeVn510 is the implementation of the following encoding logic:
// Is the number [0-31] of the source SIMD&FP register, encoded in the "Vn" field.
// bit range mappings:
// Vn: [5:10)
func encodeVn510(v uint32) (uint32, bool) {
return (v & 31) << 5, true
}
// encodeVdn05 is the implementation of the following encoding logic:
// Is the number [0-31] of the source and destination SIMD&FP register, encoded in the "Vdn" field.
// bit range mappings:
// Vdn: [0:5)
func encodeVdn05(v uint32) (uint32, bool) {
return v & 31, true
}
// encodeRm1621XZR is the implementation of the following encoding logic:
// Is the optional 64-bit name of the general-purpose offset register, defaulting to XZR, encoded in the "Rm" field.
// bit range mappings:
// Rm: [16:21)
func encodeRm1621XZR(v uint32) (uint32, bool) {
if v == 0 {
// absent case, according to the spec this should be ZR (R31)
return 31, true
}
if !checkIsR(v) {
return 0, false
}
return (v & 31) << 16, true
}
// encodeImm41620V1 is the implementation of the following encoding logic:
// Is the optional signed immediate byte offset, a multiple of 16 in the range -128 to 112, defaulting to 0, encoded in the "imm4" field.
// bit range mappings:
// imm4: [16:20)
func encodeImm41620V1(v uint32) (uint32, bool) {
vi := int32(v)
if vi >= -128 && vi <= 112 && vi%16 == 0 {
return uint32((vi/16)&15) << 16, true
}
return 0, false
}
// encodeImm41620V2 is the implementation of the following encoding logic:
// Is the optional signed immediate byte offset, a multiple of 32 in the range -256 to 224, defaulting to 0, encoded in the "imm4" field.
// bit range mappings:
// imm4: [16:20)
func encodeImm41620V2(v uint32) (uint32, bool) {
vi := int32(v)
if vi >= -256 && vi <= 224 && vi%32 == 0 {
return uint32((vi/32)&15) << 16, true
}
return 0, false
}
// encodeImm41620V6 is the implementation of the following encoding logic:
// Is the optional signed immediate vector offset, a multiple of 2 in the range -16 to 14, defaulting to 0, encoded in the "imm4" field.
// bit range mappings:
// imm4: [16:20)
func encodeImm41620V6(v uint32) (uint32, bool) {
if v&1 != 0 {
return 0, false
}
vi := int32(v)
if vi >= -16 && vi <= 14 {
return (uint32(vi/2) & 15) << 16, true
}
return 0, false
}
// encodeImm41620V3 is the implementation of the following encoding logic:
// Is the optional signed immediate vector offset, a multiple of 3 in the range -24 to 21, defaulting to 0, encoded in the "imm4" field.
// bit range mappings:
// imm4: [16:20)
func encodeImm41620V3(v uint32) (uint32, bool) {
vi := int32(v)
if vi >= -24 && vi <= 21 && vi%3 == 0 {
return uint32((vi/3)&15) << 16, true
}
return 0, false
}
// encodeImm41620V4 is the implementation of the following encoding logic:
// Is the optional signed immediate vector offset, a multiple of 4 in the range -32 to 28, defaulting to 0, encoded in the "imm4" field.
// bit range mappings:
// imm4: [16:20)
func encodeImm41620V4(v uint32) (uint32, bool) {
vi := int32(v)
if vi >= -32 && vi <= 28 && vi%4 == 0 {
return uint32((vi/4)&15) << 16, true
}
return 0, false
}
// encodeImm9h1622L1013 is the implementation of the following encoding logic:
// Is the optional signed immediate vector offset, in the range -256 to 255, defaulting to 0, encoded in the "imm9h:imm9l" fields.
// bit range mappings:
// imm9h: [16:22)
// imm9l: [10:13)
func encodeImm9h1622L1013(v uint32) (uint32, bool) {
vi := int32(v)
if vi >= -256 && vi <= 255 {
val := uint32(vi) & 0x1FF
return ((val & 7) << 10) | ((val >> 3) << 16), true
}
return 0, false
}
// encodeImm61622V5 is the implementation of the following encoding logic:
// Is the optional signed immediate vector offset, in the range -32 to 31, defaulting to 0, encoded in the "imm6" field.
// bit range mappings:
// imm6: [16:22)
func encodeImm61622V5(v uint32) (uint32, bool) {
vi := int32(v)
if vi >= -32 && vi <= 31 {
return (uint32(vi) & 0x3F) << 16, true
}
return 0, false
}
// encodeImm41620V5 is the implementation of the following encoding logic:
// Is the optional signed immediate vector offset, in the range -8 to 7, defaulting to 0, encoded in the "imm4" field.
// bit range mappings:
// imm4: [16:20)
func encodeImm41620V5(v uint32) (uint32, bool) {
vi := int32(v)
if vi >= -8 && vi <= 7 {
return (uint32(vi) & 0xF) << 16, true
}
return 0, false
}
// encodeImm61622V1 is the implementation of the following encoding logic:
// Is the optional unsigned immediate byte offset, a multiple of 2 in the range 0 to 126, defaulting to 0, encoded in the "imm6" field.
// bit range mappings:
// imm6: [16:22)
func encodeImm61622V1(v uint32) (uint32, bool) {
if v <= 126 && v%2 == 0 {
return (v / 2) << 16, true
}
return 0, false
}
// encodeImm51621V1 is the implementation of the following encoding logic:
// Is the optional unsigned immediate byte offset, a multiple of 2 in the range 0 to 62, defaulting to 0, encoded in the "imm5" field.
// bit range mappings:
// imm5: [16:21)
func encodeImm51621V1(v uint32) (uint32, bool) {
if v <= 62 && v%2 == 0 {
return (v / 2) << 16, true
}
return 0, false
}
// encodeImm51621V2 is the implementation of the following encoding logic:
// Is the optional unsigned immediate byte offset, a multiple of 4 in the range 0 to 124, defaulting to 0, encoded in the "imm5" field.
// bit range mappings:
// imm5: [16:21)
func encodeImm51621V2(v uint32) (uint32, bool) {
if v <= 124 && v%4 == 0 {
return (v / 4) << 16, true
}
return 0, false
}
// encodeImm61622V2 is the implementation of the following encoding logic:
// Is the optional unsigned immediate byte offset, a multiple of 4 in the range 0 to 252, defaulting to 0, encoded in the "imm6" field.
// bit range mappings:
// imm6: [16:22)
func encodeImm61622V2(v uint32) (uint32, bool) {
if v <= 252 && v%4 == 0 {
return (v / 4) << 16, true
}
return 0, false
}
// encodeImm51621V3 is the implementation of the following encoding logic:
// Is the optional unsigned immediate byte offset, a multiple of 8 in the range 0 to 248, defaulting to 0, encoded in the "imm5" field.
// bit range mappings:
// imm5: [16:21)
func encodeImm51621V3(v uint32) (uint32, bool) {
if v <= 248 && v%8 == 0 {
return (v / 8) << 16, true
}
return 0, false
}
// encodeImm61622V3 is the implementation of the following encoding logic:
// Is the optional unsigned immediate byte offset, a multiple of 8 in the range 0 to 504, defaulting to 0, encoded in the "imm6" field.
// bit range mappings:
// imm6: [16:22)
func encodeImm61622V3(v uint32) (uint32, bool) {
if v <= 504 && v%8 == 0 {
return (v / 8) << 16, true
}
return 0, false
}
// encodeImm51621V4 is the implementation of the following encoding logic:
// Is the optional unsigned immediate byte offset, in the range 0 to 31, defaulting to 0, encoded in the "imm5" field.
// bit range mappings:
// imm5: [16:21)
func encodeImm51621V4(v uint32) (uint32, bool) {
if v <= 31 {
return v << 16, true
}
return 0, false
}
// encodeImm61622V4 is the implementation of the following encoding logic:
// Is the optional unsigned immediate byte offset, in the range 0 to 63, defaulting to 0, encoded in the "imm6" field.
// bit range mappings:
// imm6: [16:22)
func encodeImm61622V4(v uint32) (uint32, bool) {
if v <= 63 {
return v << 16, true
}
return 0, false
}
// encodeI189 is the implementation of the following encoding logic:
// Is the portion index, in the range 0 to 1, encoded in the "i1" field.
// bit range mappings:
// i1: [8:9)
func encodeI189(v uint32) (uint32, bool) {
if v > 1 {
return 0, false
}
return v << 8, true
}
// encodeImm2_810 is the implementation of the following encoding logic:
// Is the portion index, in the range 0 to 3, encoded in the "imm2" field.
// bit range mappings:
// imm2: [8:10)
func encodeImm2_810(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 8, true
}
// encodePredQualM1617 is the implementation of the following encoding logic:
// Is the predication qualifier,
// M <ZM>
// 0 Z
// 1 M
// bit range mappings:
// M: [16:17)
func encodePredQualM1617(v uint32) (uint32, bool) {
switch v {
case PRED_Z:
return 0, true
case PRED_M:
return 1 << 16, true
}
return 0, false
}
// encodePredQualM45 is the implementation of the following encoding logic:
// Is the predication qualifier,
// M <ZM>
// 0 Z
// 1 M
// bit range mappings:
// M: [4:5)
func encodePredQualM45(v uint32) (uint32, bool) {
switch v {
case PRED_Z:
return 0, true
case PRED_M:
return 1 << 4, true
}
return 0, false
}
// encodePrfop04 is the implementation of the following encoding logic:
// Is the prefetch operation specifier,
// prfop <prfop>
// 0000 PLDL1KEEP
// 0001 PLDL1STRM
// 0010 PLDL2KEEP
// 0011 PLDL2STRM
// 0100 PLDL3KEEP
// 0101 PLDL3STRM
// x11x #uimm4
// 1000 PSTL1KEEP
// 1001 PSTL1STRM
// 1010 PSTL2KEEP
// 1011 PSTL2STRM
// 1100 PSTL3KEEP
// 1101 PSTL3STRM
// bit range mappings:
// prfop: [0:4)
func encodePrfop04(v uint32) (uint32, bool) {
switch SpecialOperand(v) {
case SPOP_PLDL1KEEP:
return 0, true
case SPOP_PLDL1STRM:
return 1, true
case SPOP_PLDL2KEEP:
return 2, true
case SPOP_PLDL2STRM:
return 3, true
case SPOP_PLDL3KEEP:
return 4, true
case SPOP_PLDL3STRM:
return 5, true
case SPOP_PSTL1KEEP:
return 8, true
case SPOP_PSTL1STRM:
return 9, true
case SPOP_PSTL2KEEP:
return 10, true
case SPOP_PSTL2STRM:
return 11, true
case SPOP_PSTL3KEEP:
return 12, true
case SPOP_PSTL3STRM:
return 13, true
default:
return 0, false
}
}
// encodeI21921 is the implementation of the following encoding logic:
// Is the round key index, in the range 0 to 3, encoded in the "i2" field.
// bit range mappings:
// i2: [19:21)
func encodeI21921(v uint32) (uint32, bool) {
if v > 3 {
return 0, false
}
return v << 19, true
}
// encodeImm5bSigned_1621 is the implementation of the following encoding logic:
// Is the second signed immediate operand, in the range -16 to 15, encoded in the "imm5b" field.
// bit range mappings:
// imm5b: [16:21)
func encodeImm5bSigned_1621(v uint32) (uint32, bool) {
if int32(v) >= -16 && int32(v) <= 15 {
return (v & 31) << 16, true
}
return 0, false
}
// encodeImm8Signed_513 is the implementation of the following encoding logic:
// Is the signed immediate operand, in the range -128 to 127, encoded in the "imm8" field.
// bit range mappings:
// imm8: [5:13)
func encodeImm8Signed_513(v uint32) (uint32, bool) {
if int32(v) >= -128 && int32(v) <= 127 {
return (v & 255) << 5, true
}
return 0, false
}
// encodeImm5Signed_1621V1 is the implementation of the following encoding logic:
// Is the signed immediate operand, in the range -16 to 15, encoded in the "imm5" field.
// bit range mappings:
// imm5: [16:21)
func encodeImm5Signed_1621V1(v uint32) (uint32, bool) {
if int32(v) >= -16 && int32(v) <= 15 {
return (v & 31) << 16, true
}
return 0, false
}
// encodeImm5Signed510Unique is the implementation of the following encoding logic:
// Is the signed immediate operand, in the range -16 to 15, encoded in the "imm5" field.
// bit range mappings:
// imm5: [5:10)
func encodeImm5Signed510Unique(v uint32) (uint32, bool) {
if int32(v) >= -16 && int32(v) <= 15 {
return (v & 31) << 5, true
}
return 0, false
}
// encodeImm6Signed_511 is the implementation of the following encoding logic:
// Is the signed immediate operand, in the range -32 to 31, encoded in the "imm6" field.
// bit range mappings:
// imm6: [5:11)
func encodeImm6Signed_511(v uint32) (uint32, bool) {
if int32(v) >= -32 && int32(v) <= 31 {
return (v & 63) << 5, true
}
return 0, false
}
// encodeSizeImm13NoOp is the implementation of the following encoding logic:
// Is the size specifier,
// imm13 <T>
// 0xxxxxx0xxxxx S
// 0xxxxxx10xxxx H
// 0xxxxxx110xxx B
// 0xxxxxx1110xx B
// 0xxxxxx11110x B
// 0xxxxxx11111x RESERVED
// 1xxxxxxxxxxxx D
// bit range mappings:
// imm13: [5:18)
func encodeSizeImm13NoOp(v uint32) (uint32, bool) {
return codeNoOp, false
}
// encodeSize2123V1 is the implementation of the following encoding logic:
// Is the size specifier,
// size <T>
// 00 B
// 01 H
// 10 S
// 11 D
// bit range mappings:
// size: [21:23)
func encodeSize2123V1(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 0, true
case ARNG_H:
return 1 << 21, true
case ARNG_S:
return 2 << 21, true
case ARNG_D:
return 3 << 21, true
default:
return 0, false
}
}
// encodeSizeBHSD2224 is the implementation of the following encoding logic:
// Is the size specifier,
// size <T>
// 00 B
// 01 H
// 10 S
// 11 D
// bit range mappings:
// size: [22:24)
func encodeSizeBHSD2224(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 0 << 22, true
case ARNG_H:
return 1 << 22, true
case ARNG_S:
return 2 << 22, true
case ARNG_D:
return 3 << 22, true
}
return 0, false
}
// encodeSizeBHS2224 is the implementation of the following encoding logic:
// Is the size specifier,
// size <T>
// 00 B
// 01 H
// 10 S
// 11 RESERVED
// bit range mappings:
// size: [22:24)
func encodeSizeBHS2224(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 0 << 22, true
case ARNG_H:
return 1 << 22, true
case ARNG_S:
return 2 << 22, true
}
return 0, false
}
// encodeSizeBHS2224Offset1 is the implementation of the following encoding logic:
// Is the size specifier,
// size <T>
// 00 RESERVED
// 01 B
// 10 H
// 11 S
// bit range mappings:
// size: [22:24)
func encodeSizeBHS2224Offset1(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 1 << 22, true
case ARNG_H:
return 2 << 22, true
case ARNG_S:
return 3 << 22, true
}
return 0, false
}
// encodeSizeHSD1315 is the implementation of the following encoding logic:
// Is the size specifier,
// size <T>
// 00 RESERVED
// 01 H
// 10 S
// 11 D
// bit range mappings:
// size: [13:15)
func encodeSizeHSD1315(v uint32) (uint32, bool) {
switch v {
case ARNG_H:
return 1 << 13, true
case ARNG_S:
return 2 << 13, true
case ARNG_D:
return 3 << 13, true
}
return 0, false
}
// encodeSizeHSD1719 is the implementation of the following encoding logic:
// Is the size specifier,
// size <T>
// 00 RESERVED
// 01 H
// 10 S
// 11 D
// bit range mappings:
// size: [17:19)
func encodeSizeHSD1719(v uint32) (uint32, bool) {
switch v {
case ARNG_H:
return 1 << 17, true
case ARNG_S:
return 2 << 17, true
case ARNG_D:
return 3 << 17, true
}
return 0, false
}
// encodeSize2123V2 is the implementation of the following encoding logic:
// Is the size specifier,
// size <T>
// 00 RESERVED
// 01 H
// 10 S
// 11 D
// bit range mappings:
// size: [21:23)
func encodeSize2123V2(v uint32) (uint32, bool) {
switch v {
case ARNG_H:
return 1 << 21, true
case ARNG_S:
return 2 << 21, true
case ARNG_D:
return 3 << 21, true
}
return 0, false
}
// encodeSizeHSD2224 is the implementation of the following encoding logic:
// Is the size specifier,
// size <T>
// 00 RESERVED
// 01 H
// 10 S
// 11 D
// bit range mappings:
// size: [22:24)
func encodeSizeHSD2224(v uint32) (uint32, bool) {
switch v {
case ARNG_H:
return 1 << 22, true
case ARNG_S:
return 2 << 22, true
case ARNG_D:
return 3 << 22, true
}
return 0, false
}
// encodeSizeHSD2224No00 is the implementation of the following encoding logic:
// Is the size specifier,
// size <T>
// 01 H
// 10 S
// 11 D
// bit range mappings:
// size: [22:24)
func encodeSizeHSD2224No00(v uint32) (uint32, bool) {
switch v {
case ARNG_H:
return 1 << 22, true
case ARNG_S:
return 2 << 22, true
case ARNG_D:
return 3 << 22, true
}
return 0, false
}
// encodeSizeHD2224 is the implementation of the following encoding logic:
// Is the size specifier,
// size <T>
// 01 H
// 1x D
// bit range mappings:
// size: [22:24)
func encodeSizeHD2224(v uint32) (uint32, bool) {
switch v {
case ARNG_H:
return 1 << 22, true
case ARNG_D:
return 3 << 22, true
}
return 0, false
}
// encodeSizeTbBHSD2224 is the implementation of the following encoding logic:
// Is the size specifier,
// size <Tb>
// 00 B
// 01 H
// 10 S
// 11 D
// bit range mappings:
// size: [22:24)
func encodeSizeTbBHSD2224(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 0 << 22, true
case ARNG_H:
return 1 << 22, true
case ARNG_S:
return 2 << 22, true
case ARNG_D:
return 3 << 22, true
}
return 0, false
}
// encodeSizeTbBHS2224 is the implementation of the following encoding logic:
// Is the size specifier,
// size <Tb>
// 00 RESERVED
// 01 B
// 10 H
// 11 S
// bit range mappings:
// size: [22:24)
func encodeSizeTbBHS2224(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 1 << 22, true
case ARNG_H:
return 2 << 22, true
case ARNG_S:
return 3 << 22, true
}
return 0, false
}
// encodeSizeTbHSD2224Offset1 is the implementation of the following encoding logic:
// Is the size specifier,
// size <Tb>
// 00 RESERVED
// 01 H
// 10 S
// 11 D
// bit range mappings:
// size: [22:24)
func encodeSizeTbHSD2224Offset1(v uint32) (uint32, bool) {
switch v {
case ARNG_H:
return 1 << 22, true
case ARNG_S:
return 2 << 22, true
case ARNG_D:
return 3 << 22, true
}
return 0, false
}
// encodeSizeTbBS2224 is the implementation of the following encoding logic:
// Is the size specifier,
// size <Tb>
// 01 B
// 1x S
// bit range mappings:
// size: [22:24)
func encodeSizeTbBS2224(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 1 << 22, true
case ARNG_S:
return 3 << 22, true
}
return 0, false
}
// encodeSize0BH2223 is the implementation of the following encoding logic:
// Is the size specifier,
// size[0] <T>
// 0 B
// 1 H
// bit range mappings:
// size: [22:23)
func encodeSize0BH2223(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 0 << 22, true
case ARNG_H:
return 1 << 22, true
}
return 0, false
}
// encodeSize0SD2223 is the implementation of the following encoding logic:
// Is the size specifier,
// size[0] <T>
// 0 S
// 1 D
// bit range mappings:
// size: [22:23)
func encodeSize0SD2223(v uint32) (uint32, bool) {
switch v {
case ARNG_S:
return 0 << 22, true
case ARNG_D:
return 1 << 22, true
}
return 0, false
}
// encodeSize0TbBH2223 is the implementation of the following encoding logic:
// Is the size specifier,
// size[0] <Tb>
// 0 B
// 1 H
// bit range mappings:
// size: [22:23)
func encodeSize0TbBH2223(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 0 << 22, true
case ARNG_H:
return 1 << 22, true
}
return 0, false
}
// encodeSzSD1415 is the implementation of the following encoding logic:
// Is the size specifier,
// sz <T>
// 0 S
// 1 D
// bit range mappings:
// sz: [14:15)
func encodeSzSD1415(v uint32) (uint32, bool) {
switch v {
case ARNG_S:
return 0 << 14, true
case ARNG_D:
return 1 << 14, true
}
return 0, false
}
// encodeSzSD1718 is the implementation of the following encoding logic:
// Is the size specifier,
// sz <T>
// 0 S
// 1 D
// bit range mappings:
// sz: [17:18)
func encodeSzSD1718(v uint32) (uint32, bool) {
switch v {
case ARNG_S:
return 0 << 17, true
case ARNG_D:
return 1 << 17, true
}
return 0, false
}
// encodeSz2122 is the implementation of the following encoding logic:
// Is the size specifier,
// sz <T>
// 0 S
// 1 D
// bit range mappings:
// sz: [21:22)
func encodeSz2122(v uint32) (uint32, bool) {
switch v {
case ARNG_S:
return 0, true
case ARNG_D:
return 1 << 21, true
}
return 0, false
}
// encodeSzSD2223 is the implementation of the following encoding logic:
// Is the size specifier,
// sz <T>
// 0 S
// 1 D
// bit range mappings:
// sz: [22:23)
func encodeSzSD2223(v uint32) (uint32, bool) {
switch v {
case ARNG_S:
return 0 << 22, true
case ARNG_D:
return 1 << 22, true
}
return 0, false
}
// encodeTsize1921V1 is the implementation of the following encoding logic:
// Is the size specifier,
// tsize <T>
// 00 RESERVED
// 01 B
// 1x H
// bit range mappings:
// tsize: [19:21)
func encodeTsize1921V1(v uint32) (uint32, bool) {
if v == uint32(ARNG_B) {
return 1 << 19, true
}
if v == uint32(ARNG_H) {
return 2 << 19, true // 2 is bit pattern 10 (1x)
}
return 0, false
}
// encodeTsize1921V2 is the implementation of the following encoding logic:
// Is the size specifier,
// tsize <Tb>
// 00 RESERVED
// 01 H
// 1x S
// bit range mappings:
// tsize: [19:21)
func encodeTsize1921V2(v uint32) (uint32, bool) {
if v == uint32(ARNG_H) {
return 1 << 19, true
}
if v == uint32(ARNG_S) {
return 2 << 19, true // 2 is bit pattern 10 (1x)
}
return 0, false
}
// encodeTsz_1620_SizeSpecifier4 is the implementation of the following encoding logic:
// Is the size specifier,
// tsz <T>
// 0000 RESERVED
// xxx1 B
// xx10 H
// x100 S
// 1000 D
// bit range mappings:
// tsz: [16:20)
func encodeTsz_1620_SizeSpecifier4(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 1 << 16, true
case ARNG_H:
return 2 << 16, true
case ARNG_S:
return 4 << 16, true
case ARNG_D:
return 8 << 16, true
}
return 0, false
}
// encodeTsz_1621_SizeSpecifier5 is the implementation of the following encoding logic:
// Is the size specifier,
// tsz <T>
// 00000 RESERVED
// xxxx1 B
// xxx10 H
// xx100 S
// x1000 D
// 10000 Q
// bit range mappings:
// tsz: [16:21)
func encodeTsz_1621_SizeSpecifier5(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 1 << 16, true
case ARNG_H:
return 2 << 16, true
case ARNG_S:
return 4 << 16, true
case ARNG_D:
return 8 << 16, true
case ARNG_Q:
return 16 << 16, true
}
return 0, false
}
// encodeTszhTszlBHS is the implementation of the following encoding logic:
// Is the size specifier,
// tszh tszl <T>
// 0 00 RESERVED
// 0 01 B
// 0 10 H
// 0 11 RESERVED
// 1 00 S
// 1 01 RESERVED
// 1 1x RESERVED
// bit range mappings:
// tszh: [22:23)
// tszl: [19:21)
func encodeTszhTszlBHS(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 0<<22 | 1<<19, true
case ARNG_H:
return 0<<22 | 2<<19, true
case ARNG_S:
return 1 << 22, true
}
return 0, false
}
// encodeSizeBhsTsz1921 is the implementation of the following encoding logic:
// Is the size specifier,
// tszh tszl <T>
// 0 00 RESERVED
// 0 01 B
// 0 1x H
// 1 xx S
// bit range mappings:
// tszh: [22:23)
// tszl: [19:21)
func encodeSizeBhsTsz1921(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 1 << 19, true
case ARNG_H:
return 2 << 19, true
case ARNG_S:
return 1 << 22, true
}
return 0, false
}
// encodeSizeHsdTsz1921 is the implementation of the following encoding logic:
// Is the size specifier,
// tszh tszl <T>
// 0 00 RESERVED
// 0 01 H
// 0 1x S
// 1 xx D
// bit range mappings:
// tszh: [22:23)
// tszl: [19:21)
func encodeSizeHsdTsz1921(v uint32) (uint32, bool) {
switch v {
case ARNG_H:
return 1 << 19, true
case ARNG_S:
return 2 << 19, true
case ARNG_D:
return 1 << 22, true
}
return 0, false
}
// encodeSizeBhsdTsz1921 is the implementation of the following encoding logic:
// Is the size specifier,
// tszh tszl <T>
// 00 00 RESERVED
// 00 01 B
// 00 1x H
// 01 xx S
// 1x xx D
// bit range mappings:
// tszh: [22:24)
// tszl: [19:21)
func encodeSizeBhsdTsz1921(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 1 << 19, true
case ARNG_H:
return 2 << 19, true
case ARNG_S:
return 1 << 22, true
case ARNG_D:
return 1 << 23, true
}
return 0, false
}
// encodeSizeBhsdTsz810 is the implementation of the following encoding logic:
// Is the size specifier,
// tszh tszl <T>
// 00 00 RESERVED
// 00 01 B
// 00 1x H
// 01 xx S
// 1x xx D
// bit range mappings:
// tszh: [22:24)
// tszl: [8:10)
func encodeSizeBhsdTsz810(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 1 << 8, true
case ARNG_H:
return 2 << 8, true
case ARNG_S:
return 1 << 22, true
case ARNG_D:
return 1 << 23, true
}
return 0, false
}
// encodeSizeBhsTsz1921Unique is the implementation of the following encoding logic:
// Is the size specifier,
// tszh tszl <Tb>
// 0 00 RESERVED
// 0 01 B
// 0 1x H
// 1 xx S
// bit range mappings:
// tszh: [22:23)
// tszl: [19:21)
func encodeSizeBhsTsz1921Unique(v uint32) (uint32, bool) {
switch v {
case ARNG_B:
return 1 << 19, true
case ARNG_H:
return 2 << 19, true
case ARNG_S:
return 1 << 22, true
}
return 0, false
}
// encodeTszhTszlTbHSD is the implementation of the following encoding logic:
// Is the size specifier,
// tszh tszl <Tb>
// 0 00 RESERVED
// 0 01 H
// 0 10 S
// 0 11 RESERVED
// 1 00 D
// 1 01 RESERVED
// 1 1x RESERVED
// bit range mappings:
// tszh: [22:23)
// tszl: [19:21)
func encodeTszhTszlTbHSD(v uint32) (uint32, bool) {
switch v {
case ARNG_H:
return 0<<22 | 1<<19, true
case ARNG_S:
return 0<<22 | 2<<19, true
case ARNG_D:
return 1 << 22, true
}
return 0, false
}
// encodeSizeHsdTsz1921Unique is the implementation of the following encoding logic:
// Is the size specifier,
// tszh tszl <Tb>
// 0 00 RESERVED
// 0 01 H
// 0 1x S
// 1 xx D
// bit range mappings:
// tszh: [22:23)
// tszl: [19:21)
func encodeSizeHsdTsz1921Unique(v uint32) (uint32, bool) {
switch v {
case ARNG_H:
return 1 << 19, true
case ARNG_S:
return 2 << 19, true
case ARNG_D:
return 1 << 22, true
}
return 0, false
}
// encodeImm4Unsigned_1620 is the implementation of the following encoding logic:
// Is the unsigned immediate operand, in the range 0 to 15, encoded in the "imm4" field.
// bit range mappings:
// imm4: [16:20)
func encodeImm4Unsigned_1620(v uint32) (uint32, bool) {
if v <= 15 {
return v << 16, true
}
return 0, false
}
// encodeImm8Unsigned_513 is the implementation of the following encoding logic:
// Is the unsigned immediate operand, in the range 0 to 255, encoded in the "imm8" field.
// bit range mappings:
// imm8: [5:13)
func encodeImm8Unsigned_513(v uint32) (uint32, bool) {
if v <= 255 {
return v << 5, true
}
return 0, false
}
// encodeImm8hImm8l_Unsigned is the implementation of the following encoding logic:
// Is the unsigned immediate operand, in the range 0 to 255, encoded in the "imm8h:imm8l" fields.
// bit range mappings:
// imm8h: [16:21)
// imm8l: [10:13)
func encodeImm8hImm8l_Unsigned(v uint32) (uint32, bool) {
if v <= 255 {
l := v & 7
h := v >> 3
return (l << 10) | (h << 16), true
}
return 0, false
}
// encodeImm3Unsigned_1619 is the implementation of the following encoding logic:
// Is the unsigned immediate operand, in the range 0 to 7, encoded in the "imm3" field.
// bit range mappings:
// imm3: [16:19)
func encodeImm3Unsigned_1619(v uint32) (uint32, bool) {
if v <= 7 {
return v << 16, true
}
return 0, false
}
// encodeI12324 is the implementation of the following encoding logic:
// Is the vector segment index, in the range 0 to 1, encoded in the "i1" field.
// bit range mappings:
// i1: [23:24)
func encodeI12324(v uint32) (uint32, bool) {
if v > 1 {
return 0, false
}
return v << 23, true
}
// encodeVl1011 is the implementation of the following encoding logic:
// Is the vl specifier,
// vl <vl>
// 0 VLx2
// 1 VLx4
// bit range mappings:
// vl: [10:11)
func encodeVl1011(v uint32) (uint32, bool) {
switch SpecialOperand(v) {
case SPOP_VLx2:
return 0, true
case SPOP_VLx4:
return 1 << 10, true
default:
return 0, false
}
}
// encodeVl1314 is the implementation of the following encoding logic:
// Is the vl specifier,
// vl <vl>
// 0 VLx2
// 1 VLx4
// bit range mappings:
// vl: [13:14)
func encodeVl1314(v uint32) (uint32, bool) {
switch SpecialOperand(v) {
case SPOP_VLx2:
return 0, true
case SPOP_VLx4:
return 1 << 13, true
default:
return 0, false
}
}
// encodeNoop is the implementation of the following encoding logic:
// No-op check, returns true
func encodeNoop(v uint32) (uint32, bool) {
return 0, true
}