// 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 // 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 // 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] // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 , so just do nothing. return codeNoOp, false } // encodeXs1415 is the implementation of the following encoding logic: // Is the index extend and shift specifier, // xs // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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] // 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] // 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] // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 }