diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index 2697b17a573..cfa203a8290 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -90,7 +90,7 @@ jobs: # We only use a non-zero build # when making multiple manual builds in one day. run: | if test -z "${{ github.event.inputs.version }}"; then - export VERSION_NUMBER=9.90.$((`git log -n 1 --format=%ct` / (60*60*24))) + export VERSION_NUMBER=9.91.$((`git log -n 1 --format=%ct` / (60*60*24))) else export VERSION_NUMBER=${{ github.event.inputs.version }} fi diff --git a/.github/workflows/ci-package.yml b/.github/workflows/ci-package.yml index 1b162c60197..8f7e19f9598 100644 --- a/.github/workflows/ci-package.yml +++ b/.github/workflows/ci-package.yml @@ -102,7 +102,7 @@ jobs: # We only use a non-zero build # when making multiple manual builds in one day. run: | if test -z "${{ github.event.inputs.version }}"; then - export VERSION_NUMBER=9.90.$((`git log -n 1 --format=%ct` / (60*60*24))) + export VERSION_NUMBER=9.91.$((`git log -n 1 --format=%ct` / (60*60*24))) else export VERSION_NUMBER=${{ github.event.inputs.version }} fi @@ -194,7 +194,7 @@ jobs: # XXX: See x86 job comments on sharing the default ver# with CMakeLists.txt. run: | if test -z "${{ github.event.inputs.version }}"; then - export VERSION_NUMBER=9.90.$((`git log -n 1 --format=%ct` / (60*60*24))) + export VERSION_NUMBER=9.91.$((`git log -n 1 --format=%ct` / (60*60*24))) else export VERSION_NUMBER=${{ github.event.inputs.version }} fi @@ -282,7 +282,7 @@ jobs: # XXX: See x86 job comments on sharing the default ver# with CMakeLists.txt. run: | if test -z "${{ github.event.inputs.version }}"; then - export VERSION_NUMBER=9.90.$((`git log -n 1 --format=%ct` / (60*60*24))) + export VERSION_NUMBER=9.91.$((`git log -n 1 --format=%ct` / (60*60*24))) else export VERSION_NUMBER=${{ github.event.inputs.version }} fi @@ -370,7 +370,7 @@ jobs: # XXX: See x86 job comments on sharing the default ver# with CMakeLists.txt. run: | if test -z "${{ github.event.inputs.version }}"; then - export VERSION_NUMBER=9.90.$((`git log -n 1 --format=%ct` / (60*60*24))) + export VERSION_NUMBER=9.91.$((`git log -n 1 --format=%ct` / (60*60*24))) else export VERSION_NUMBER=${{ github.event.inputs.version }} fi @@ -450,7 +450,7 @@ jobs: # XXX: See x86 job comments on sharing the default ver# with CMakeLists.txt. run: | if test -z "${{ github.event.inputs.version }}"; then - export VERSION_NUMBER=9.90.$((`git log -n 1 --format=%ct` / (60*60*24))) + export VERSION_NUMBER=9.91.$((`git log -n 1 --format=%ct` / (60*60*24))) else export VERSION_NUMBER=${{ github.event.inputs.version }} fi @@ -535,7 +535,7 @@ jobs: # XXX: See x86 job comments on sharing the default ver# with CMakeLists.txt. run: | if test -z "${{ github.event.inputs.version }}"; then - export VERSION_NUMBER="9.90.$((`git log -n 1 --format=%ct` / (60*60*24)))" + export VERSION_NUMBER="9.91.$((`git log -n 1 --format=%ct` / (60*60*24)))" export PREFIX="cronbuild-" else export VERSION_NUMBER=${{ github.event.inputs.version }} diff --git a/CMakeLists.txt b/CMakeLists.txt index b230a245825..ece6a4f56aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -567,7 +567,7 @@ endif (EXISTS "${PROJECT_SOURCE_DIR}/.svn") # N.B.: When updating this, update all the default versions in ci-package.yml # and ci-docs.yml. We should find a way to share (xref i#1565). -set(VERSION_NUMBER_DEFAULT "9.90.${VERSION_NUMBER_PATCHLEVEL}") +set(VERSION_NUMBER_DEFAULT "9.91.${VERSION_NUMBER_PATCHLEVEL}") # do not store the default VERSION_NUMBER in the cache to prevent a stale one # from preventing future version updates in a pre-existing build dir set(VERSION_NUMBER "" CACHE STRING "Version number: leave empty for default") diff --git a/api/docs/release.dox b/api/docs/release.dox index 81490c5527a..80f47d24040 100644 --- a/api/docs/release.dox +++ b/api/docs/release.dox @@ -142,6 +142,10 @@ changes: - Reduced the value of #DR_NOTE_FIRST_RESERVED. This is not expected to cause problems unless clients are directly choosing high note values without using drmgr_reserve_note_range(). + - Changed the values of the AArch64 DR_REG_Z* constants so that Z registers can be + used in base+disp operands in SVE scatter/gather instructions. This breaks binary + compatibility for clients built against an older version of opnd_api.h, but source + code compatibility is unchanged. Further non-compatibility-affecting changes include: - Added AArchXX support for attaching to a running process. @@ -203,6 +207,9 @@ Further non-compatibility-affecting changes include: - Added opnd_create_increment_reg() to create a register from an existing register whose register number is incremented by some amount, wrapping at the max register number for that register. + - Added opnd_create_vector_base_disp_aarch64() and reg_is_z() for creating + memory address operands that use SVE Z registers with a specified element + size. **************************************************
diff --git a/core/arch/arch.c b/core/arch/arch.c index edbb6264754..730caf19892 100644 --- a/core/arch/arch.c +++ b/core/arch/arch.c @@ -801,6 +801,10 @@ d_r_arch_init(void) } #endif } + + /* Ensure addressing registers fit into base+disp operand base and index fields. */ + IF_AARCHXX(ASSERT_BITFIELD_TRUNCATE(REG_SPECIFIER_BITS, DR_REG_MAX_ADDRESSING_REG)); + mangle_init(); } diff --git a/core/ir/aarch64/codec.c b/core/ir/aarch64/codec.c index e7e703d0c78..69785cd02bd 100644 --- a/core/ir/aarch64/codec.c +++ b/core/ir/aarch64/codec.c @@ -5252,6 +5252,35 @@ encode_opnd_hs_fsz(uint enc, int opcode, byte *pc, opnd_t opnd, OUT uint *enc_ou return false; } +/* z_sz_sd # sve vector reg, element size depending on sz. */ + +static inline bool +encode_opnd_z_sz_sd(uint enc, int opcode, byte *pc, opnd_t opnd, OUT uint *enc_out) +{ + IF_RETURN_FALSE(!opnd_is_reg(opnd)) + + const uint reg_number = (uint)(opnd_get_reg(opnd) - DR_REG_Z0); + IF_RETURN_FALSE(!(reg_number < 32)) + + uint sz = 0; + switch (opnd_get_vector_element_size(opnd)) { + case OPSZ_4: sz = 0; break; + case OPSZ_8: sz = 1; break; + default: RETURN_FALSE; + } + + *enc_out |= (sz << 22) | (reg_number << 0); + + return true; +} + +static inline bool +decode_opnd_z_sz_sd(uint enc, int opcode, byte *pc, OUT opnd_t *opnd) +{ + const aarch64_reg_offset element_size = TEST(1u << 22, enc) ? DOUBLE_REG : SINGLE_REG; + return decode_single_sized(DR_REG_Z0, DR_REG_Z31, 0, 5, element_size, 0, enc, opnd); +} + /* dq5_sz: D/Q register at bit position 5; bit 22 selects Q reg */ static inline bool @@ -5627,6 +5656,85 @@ encode_opnd_wx_size_16_zr(uint enc, int opcode, byte *pc, opnd_t opnd, OUT uint return encode_wx_size_reg(false, 16, opnd, enc_out); } +/* svemem_vec_vec_idx: SVE memory address [., .{, }] */ + +static inline bool +decode_svemem_vec_vec_opc(uint opc, OUT opnd_size_t *element_size, + OUT dr_extend_type_t *extend_type) +{ + switch (opc) { + case 0b00: + *element_size = OPSZ_8; + *extend_type = DR_EXTEND_SXTW; + return true; + case 0b01: + *element_size = OPSZ_8; + *extend_type = DR_EXTEND_UXTW; + return true; + // DR_EXTEND_UXTX is an alias for LSL. LSL preferred in disassembly. + case 0b10: + *element_size = OPSZ_4; + *extend_type = DR_EXTEND_UXTX; + return true; + case 0b11: + *element_size = OPSZ_8; + *extend_type = DR_EXTEND_UXTX; + return true; + } + return false; +} + +static inline bool +decode_opnd_svemem_vec_vec_idx(uint enc, int opcode, byte *pc, OUT opnd_t *opnd) +{ + opnd_size_t element_size; + dr_extend_type_t extend_type; + if (!decode_svemem_vec_vec_opc(BITS(enc, 23, 22), &element_size, &extend_type)) + return false; + + const uint msz = extract_uint(enc, 10, 2); + + const reg_id_t zn = DR_REG_Z0 + extract_uint(enc, 5, 5); + const reg_id_t zm = DR_REG_Z0 + extract_uint(enc, 16, 5); + + /* This operand is used for SVE ADR instructions which don't transfer any memory. + * If this operand ends up being used for other instructions in the future we will + * need to calculate the appropriate transfer amount here. + */ + ASSERT(opcode == OP_adr); + const opnd_size_t mem_transfer_size = OPSZ_0; + + *opnd = opnd_create_vector_base_disp_aarch64(zn, zm, element_size, extend_type, + /*scaled=*/msz != 0, + /*disp=*/0, + /*flags=*/0, mem_transfer_size, msz); + return true; +} + +static inline bool +encode_opnd_svemem_vec_vec_idx(uint enc, int opcode, byte *pc, opnd_t opnd, + OUT uint *enc_out) +{ + if (!opnd_is_base_disp(opnd)) + return false; + + const uint zn = (uint)(opnd_get_base(opnd) - DR_REG_Z0); + const uint zm = (uint)(opnd_get_index(opnd) - DR_REG_Z0); + + opnd_size_t element_size; + dr_extend_type_t extend_type; + uint msz; + if (!((zn < 32) && (zm < 32)) || + !decode_svemem_vec_vec_opc(BITS(enc, 23, 22), &element_size, &extend_type) || + element_size != opnd_get_vector_element_size(opnd) || + extend_type != opnd_get_index_extend(opnd, NULL, &msz)) + return false; + + *enc_out |= (zm << 16) | (msz << 10) | (zn << 5); + + return true; +} + /* fpimm13: floating-point immediate for scalar fmov */ static inline bool diff --git a/core/ir/aarch64/codec_sve.txt b/core/ir/aarch64/codec_sve.txt index f61fcafba72..d64a20cd449 100644 --- a/core/ir/aarch64/codec_sve.txt +++ b/core/ir/aarch64/codec_sve.txt @@ -46,6 +46,9 @@ 00100101xx10000011xxxxxxxxxxxxxx n 9 SVE add z_size_bhsd_0 : z_size_bhsd_0 imm8_5 lsl shift1 00000100011xxxxx01010xxxxxxxxxxx n 934 SVE addpl x0sp : x16sp simm6_5 00000100001xxxxx01010xxxxxxxxxxx n 935 SVE addvl x0sp : x16sp simm6_5 +00000100001xxxxx1010xxxxxxxxxxxx n 15 SVE adr z_d_0 : svemem_vec_vec_idx +00000100011xxxxx1010xxxxxxxxxxxx n 15 SVE adr z_d_0 : svemem_vec_vec_idx +000001001x1xxxxx1010xxxxxxxxxxxx n 15 SVE adr z_sz_sd : svemem_vec_vec_idx 00000100xx011010000xxxxxxxxxxxxx n 21 SVE and z0 : p10_lo z0 z5 bhsd_sz 00000101100000xxxxxxxxxxxxxxxxxx n 21 SVE and z_imm13_bhsd_0 : z_imm13_bhsd_0 imm13_const 001001010000xxxx01xxxx0xxxx0xxxx n 21 SVE and p_b_0 : p10_zer p_b_5 p_b_16 diff --git a/core/ir/aarch64/encode.c b/core/ir/aarch64/encode.c index 1e09f8cea25..c024aa6b44e 100644 --- a/core/ir/aarch64/encode.c +++ b/core/ir/aarch64/encode.c @@ -57,6 +57,11 @@ const char *const reg_names[] = { "w20", "w21", "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr", + "z0", "z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8", "z9", + "z10", "z11", "z12", "z13", "z14", "z15", "z16", "z17", "z18", "z19", + "z20", "z21", "z22", "z23", "z24", "z25", "z26", "z27", "z28", "z29", + "z30", "z31", + "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15", "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23", "q24", "q25", "q26", "q27", "q28", "q29", @@ -109,11 +114,6 @@ const char *const reg_names[] = { "pmevtyper28_el0", "pmevtyper29_el0", "pmevtyper30_el0", "pmccfiltr_el0", "spsr_irq", "spsr_abt", "spsr_und", "spsr_fiq", "tpidr_el0", "tpidrro_el0", - "z0", "z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8", "z9", - "z10", "z11", "z12", "z13", "z14", "z15", "z16", "z17", "z18", "z19", - "z20", "z21", "z22", "z23", "z24", "z25", "z26", "z27", "z28", "z29", - "z30", "z31", - "p0", "p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15", @@ -137,18 +137,19 @@ const reg_id_t dr_reg_fixer[] = { REG_NULL, XREGS /* W0-WSP */ #undef XREGS -#define QREGS \ - DR_REG_Q0, DR_REG_Q1, DR_REG_Q2, DR_REG_Q3, DR_REG_Q4, DR_REG_Q5, DR_REG_Q6, \ - DR_REG_Q7, DR_REG_Q8, DR_REG_Q9, DR_REG_Q10, DR_REG_Q11, DR_REG_Q12, DR_REG_Q13, \ - DR_REG_Q14, DR_REG_Q15, DR_REG_Q16, DR_REG_Q17, DR_REG_Q18, DR_REG_Q19, \ - DR_REG_Q20, DR_REG_Q21, DR_REG_Q22, DR_REG_Q23, DR_REG_Q24, DR_REG_Q25, \ - DR_REG_Q26, DR_REG_Q27, DR_REG_Q28, DR_REG_Q29, DR_REG_Q30, DR_REG_Q31, - QREGS /* Q0-Q31*/ - QREGS /* D0-D31 */ - QREGS /* S0-S31 */ - QREGS /* H0-H31 */ - QREGS /* B0-B31 */ -#undef QREGS +#define ZREGS \ + DR_REG_Z0, DR_REG_Z1, DR_REG_Z2, DR_REG_Z3, DR_REG_Z4, DR_REG_Z5, DR_REG_Z6, \ + DR_REG_Z7, DR_REG_Z8, DR_REG_Z9, DR_REG_Z10, DR_REG_Z11, DR_REG_Z12, DR_REG_Z13, \ + DR_REG_Z14, DR_REG_Z15, DR_REG_Z16, DR_REG_Z17, DR_REG_Z18, DR_REG_Z19, \ + DR_REG_Z20, DR_REG_Z21, DR_REG_Z22, DR_REG_Z23, DR_REG_Z24, DR_REG_Z25, \ + DR_REG_Z26, DR_REG_Z27, DR_REG_Z28, DR_REG_Z29, DR_REG_Z30, DR_REG_Z31, + ZREGS /* Z0-Z31 */ + ZREGS /* Q0-Q31*/ + ZREGS /* D0-D31 */ + ZREGS /* S0-S31 */ + ZREGS /* H0-H31 */ + ZREGS /* B0-B31 */ +#undef ZREGS DR_REG_NZCV, DR_REG_FPCR, DR_REG_FPSR, DR_REG_MDCCSR_EL0, DR_REG_DBGDTR_EL0, DR_REG_DBGDTRRX_EL0, DR_REG_SP_EL0, @@ -185,7 +186,13 @@ const reg_id_t dr_reg_fixer[] = { REG_NULL, DR_REG_PMEVTYPER26_EL0, DR_REG_PMEVTYPER27_EL0, DR_REG_PMEVTYPER28_EL0, DR_REG_PMEVTYPER29_EL0, DR_REG_PMEVTYPER30_EL0, DR_REG_PMCCFILTR_EL0, DR_REG_SPSR_IRQ, DR_REG_SPSR_ABT, DR_REG_SPSR_UND, DR_REG_SPSR_FIQ, - DR_REG_TPIDR_EL0, DR_REG_TPIDRRO_EL0 + DR_REG_TPIDR_EL0, DR_REG_TPIDRRO_EL0, + + DR_REG_P0, DR_REG_P1, DR_REG_P2, DR_REG_P3, DR_REG_P4, DR_REG_P5, + DR_REG_P6, DR_REG_P7, DR_REG_P8, DR_REG_P9, DR_REG_P10, DR_REG_P11, + DR_REG_P12, DR_REG_P13, DR_REG_P14, DR_REG_P15, + + DR_REG_CNTVCT_EL0, }; /* clang-format on */ diff --git a/core/ir/aarch64/instr.c b/core/ir/aarch64/instr.c index ac7385ada3a..d0353b941cf 100644 --- a/core/ir/aarch64/instr.c +++ b/core/ir/aarch64/instr.c @@ -441,6 +441,12 @@ reg_is_fp(reg_id_t reg) return false; } +bool +reg_is_z(reg_id_t reg) +{ + return DR_REG_Z0 <= reg && reg <= DR_REG_Z31; +} + bool instr_is_nop(instr_t *instr) { diff --git a/core/ir/aarch64/instr_create_api.h b/core/ir/aarch64/instr_create_api.h index a1f15722af9..7b1056d896f 100644 --- a/core/ir/aarch64/instr_create_api.h +++ b/core/ir/aarch64/instr_create_api.h @@ -11217,6 +11217,28 @@ #define INSTR_CREATE_prfw_sve_pred(dc, prfop, Pg, Rn) \ instr_create_0dst_3src(dc, OP_prfw, prfop, Pg, Rn) +/* + * Creates an ADR instruction. + * + * This macro is used to encode the forms: + * \verbatim + * ADR .D, [.D, .D, SXTW ] + * ADR .D, [.D, .D, UXTW ] + * ADR ., [., ., ] + * \endverbatim + * \param dc The void * dcontext used to allocate memory for the #instr_t. + * \param Zd The destination vector register, Z (Scalable). + * \param Zn The first source vector base register with a register offset, + * constructed with one of: + * opnd_create_vector_base_disp_aarch64(Zn, Zm, OPSZ_8, DR_EXTEND_SXTW, + * 0, 0, 0, OPSZ_0, shift_amount) + * opnd_create_vector_base_disp_aarch64(Zn, Zm, OPSZ_8, DR_EXTEND_UXTW, + * 0, 0, 0, OPSZ_0, shift_amount) + * opnd_create_vector_base_disp_aarch64(Zn, Zm, elsz, DR_EXTEND_UXTX, + * 0, 0, 0, OPSZ_0, shift_amount) + */ +#define INSTR_CREATE_adr_sve(dc, Zd, Zn) instr_create_1dst_1src(dc, OP_adr, Zd, Zn) + /* * Creates a LD2B instruction. * diff --git a/core/ir/aarch64/opnd_defs.txt b/core/ir/aarch64/opnd_defs.txt index e3e58fc3688..2ebbe043bf9 100644 --- a/core/ir/aarch64/opnd_defs.txt +++ b/core/ir/aarch64/opnd_defs.txt @@ -242,6 +242,7 @@ # elements, depending on bit 22 (sz) ---------x---------------------- sd_sz # element width of FP vector reg for single or double ---------x---------------------- hs_fsz # element width of FP vector reg for half or single +---------x-----------------xxxxx z_sz_sd # SVE vector reg, elsz depending on sz ---------x------------xxxxx----- dq5_sz # as dqx, but depending on the sz bit rather than the Q bit ---------x------------xxxxx----- wx_sz_5 # W/X register (or WZR/XZR) with size indicated in bit 22 ---------x-xx------------------- i3_index_19 # Index value from 22, 20:19 @@ -259,6 +260,7 @@ --------??-??--------------xxxxx z_tszl19_bhsd_0 # z element register mediated by the tszl and tszh fields --------??-??---------xxxxx----- z_tszl19_bhsd_5 # z element register mediated by the tszl and tszh fields --------??-xxxxx---------------- wx_size_16_zr # GPR scalar register, register size, W or X depending on size bits +--------??-xxxxx----xxxxxxx----- svemem_vec_vec_idx # SVE memory address [., .{, }] --------??-xxxxxxxx------------- fpimm8_13 # floating-point immediate for scalar fmov --------xx---------------------- b_sz # element width of a vector (8< %x26 043f53ff : addvl sp, sp, #0x1f : addvl %sp $0x1f -> %sp +# ADR .D, [.D, .D, SXTW ] (ADR-Z.AZ-D.s32.scaled) +0420a000 : adr z0.d, [z0.d, z0.d, SXTW] : adr (%z0.d,%z0.d,sxtw) -> %z0.d +0424a062 : adr z2.d, [z3.d, z4.d, SXTW] : adr (%z3.d,%z4.d,sxtw) -> %z2.d +0426a0a4 : adr z4.d, [z5.d, z6.d, SXTW] : adr (%z5.d,%z6.d,sxtw) -> %z4.d +0428a0e6 : adr z6.d, [z7.d, z8.d, SXTW] : adr (%z7.d,%z8.d,sxtw) -> %z6.d +042aa128 : adr z8.d, [z9.d, z10.d, SXTW] : adr (%z9.d,%z10.d,sxtw) -> %z8.d +042ca16a : adr z10.d, [z11.d, z12.d, SXTW] : adr (%z11.d,%z12.d,sxtw) -> %z10.d +042ea1ac : adr z12.d, [z13.d, z14.d, SXTW] : adr (%z13.d,%z14.d,sxtw) -> %z12.d +0430a1ee : adr z14.d, [z15.d, z16.d, SXTW] : adr (%z15.d,%z16.d,sxtw) -> %z14.d +0432a230 : adr z16.d, [z17.d, z18.d, SXTW] : adr (%z17.d,%z18.d,sxtw) -> %z16.d +0433a251 : adr z17.d, [z18.d, z19.d, SXTW] : adr (%z18.d,%z19.d,sxtw) -> %z17.d +0435a293 : adr z19.d, [z20.d, z21.d, SXTW] : adr (%z20.d,%z21.d,sxtw) -> %z19.d +0437a2d5 : adr z21.d, [z22.d, z23.d, SXTW] : adr (%z22.d,%z23.d,sxtw) -> %z21.d +0439a317 : adr z23.d, [z24.d, z25.d, SXTW] : adr (%z24.d,%z25.d,sxtw) -> %z23.d +043ba359 : adr z25.d, [z26.d, z27.d, SXTW] : adr (%z26.d,%z27.d,sxtw) -> %z25.d +043da39b : adr z27.d, [z28.d, z29.d, SXTW] : adr (%z28.d,%z29.d,sxtw) -> %z27.d +043fa3ff : adr z31.d, [z31.d, z31.d, SXTW] : adr (%z31.d,%z31.d,sxtw) -> %z31.d +0420a400 : adr z0.d, [z0.d, z0.d, SXTW #1] : adr (%z0.d,%z0.d,sxtw #1) -> %z0.d +0424a462 : adr z2.d, [z3.d, z4.d, SXTW #1] : adr (%z3.d,%z4.d,sxtw #1) -> %z2.d +0426a4a4 : adr z4.d, [z5.d, z6.d, SXTW #1] : adr (%z5.d,%z6.d,sxtw #1) -> %z4.d +0428a4e6 : adr z6.d, [z7.d, z8.d, SXTW #1] : adr (%z7.d,%z8.d,sxtw #1) -> %z6.d +042aa528 : adr z8.d, [z9.d, z10.d, SXTW #1] : adr (%z9.d,%z10.d,sxtw #1) -> %z8.d +042ca56a : adr z10.d, [z11.d, z12.d, SXTW #1] : adr (%z11.d,%z12.d,sxtw #1) -> %z10.d +042ea5ac : adr z12.d, [z13.d, z14.d, SXTW #1] : adr (%z13.d,%z14.d,sxtw #1) -> %z12.d +0430a5ee : adr z14.d, [z15.d, z16.d, SXTW #1] : adr (%z15.d,%z16.d,sxtw #1) -> %z14.d +0432a630 : adr z16.d, [z17.d, z18.d, SXTW #1] : adr (%z17.d,%z18.d,sxtw #1) -> %z16.d +0433a651 : adr z17.d, [z18.d, z19.d, SXTW #1] : adr (%z18.d,%z19.d,sxtw #1) -> %z17.d +0435a693 : adr z19.d, [z20.d, z21.d, SXTW #1] : adr (%z20.d,%z21.d,sxtw #1) -> %z19.d +0437a6d5 : adr z21.d, [z22.d, z23.d, SXTW #1] : adr (%z22.d,%z23.d,sxtw #1) -> %z21.d +0439a717 : adr z23.d, [z24.d, z25.d, SXTW #1] : adr (%z24.d,%z25.d,sxtw #1) -> %z23.d +043ba759 : adr z25.d, [z26.d, z27.d, SXTW #1] : adr (%z26.d,%z27.d,sxtw #1) -> %z25.d +043da79b : adr z27.d, [z28.d, z29.d, SXTW #1] : adr (%z28.d,%z29.d,sxtw #1) -> %z27.d +043fa7ff : adr z31.d, [z31.d, z31.d, SXTW #1] : adr (%z31.d,%z31.d,sxtw #1) -> %z31.d +0420a800 : adr z0.d, [z0.d, z0.d, SXTW #2] : adr (%z0.d,%z0.d,sxtw #2) -> %z0.d +0424a862 : adr z2.d, [z3.d, z4.d, SXTW #2] : adr (%z3.d,%z4.d,sxtw #2) -> %z2.d +0426a8a4 : adr z4.d, [z5.d, z6.d, SXTW #2] : adr (%z5.d,%z6.d,sxtw #2) -> %z4.d +0428a8e6 : adr z6.d, [z7.d, z8.d, SXTW #2] : adr (%z7.d,%z8.d,sxtw #2) -> %z6.d +042aa928 : adr z8.d, [z9.d, z10.d, SXTW #2] : adr (%z9.d,%z10.d,sxtw #2) -> %z8.d +042ca96a : adr z10.d, [z11.d, z12.d, SXTW #2] : adr (%z11.d,%z12.d,sxtw #2) -> %z10.d +042ea9ac : adr z12.d, [z13.d, z14.d, SXTW #2] : adr (%z13.d,%z14.d,sxtw #2) -> %z12.d +0430a9ee : adr z14.d, [z15.d, z16.d, SXTW #2] : adr (%z15.d,%z16.d,sxtw #2) -> %z14.d +0432aa30 : adr z16.d, [z17.d, z18.d, SXTW #2] : adr (%z17.d,%z18.d,sxtw #2) -> %z16.d +0433aa51 : adr z17.d, [z18.d, z19.d, SXTW #2] : adr (%z18.d,%z19.d,sxtw #2) -> %z17.d +0435aa93 : adr z19.d, [z20.d, z21.d, SXTW #2] : adr (%z20.d,%z21.d,sxtw #2) -> %z19.d +0437aad5 : adr z21.d, [z22.d, z23.d, SXTW #2] : adr (%z22.d,%z23.d,sxtw #2) -> %z21.d +0439ab17 : adr z23.d, [z24.d, z25.d, SXTW #2] : adr (%z24.d,%z25.d,sxtw #2) -> %z23.d +043bab59 : adr z25.d, [z26.d, z27.d, SXTW #2] : adr (%z26.d,%z27.d,sxtw #2) -> %z25.d +043dab9b : adr z27.d, [z28.d, z29.d, SXTW #2] : adr (%z28.d,%z29.d,sxtw #2) -> %z27.d +043fabff : adr z31.d, [z31.d, z31.d, SXTW #2] : adr (%z31.d,%z31.d,sxtw #2) -> %z31.d +0420ac00 : adr z0.d, [z0.d, z0.d, SXTW #3] : adr (%z0.d,%z0.d,sxtw #3) -> %z0.d +0424ac62 : adr z2.d, [z3.d, z4.d, SXTW #3] : adr (%z3.d,%z4.d,sxtw #3) -> %z2.d +0426aca4 : adr z4.d, [z5.d, z6.d, SXTW #3] : adr (%z5.d,%z6.d,sxtw #3) -> %z4.d +0428ace6 : adr z6.d, [z7.d, z8.d, SXTW #3] : adr (%z7.d,%z8.d,sxtw #3) -> %z6.d +042aad28 : adr z8.d, [z9.d, z10.d, SXTW #3] : adr (%z9.d,%z10.d,sxtw #3) -> %z8.d +042cad6a : adr z10.d, [z11.d, z12.d, SXTW #3] : adr (%z11.d,%z12.d,sxtw #3) -> %z10.d +042eadac : adr z12.d, [z13.d, z14.d, SXTW #3] : adr (%z13.d,%z14.d,sxtw #3) -> %z12.d +0430adee : adr z14.d, [z15.d, z16.d, SXTW #3] : adr (%z15.d,%z16.d,sxtw #3) -> %z14.d +0432ae30 : adr z16.d, [z17.d, z18.d, SXTW #3] : adr (%z17.d,%z18.d,sxtw #3) -> %z16.d +0433ae51 : adr z17.d, [z18.d, z19.d, SXTW #3] : adr (%z18.d,%z19.d,sxtw #3) -> %z17.d +0435ae93 : adr z19.d, [z20.d, z21.d, SXTW #3] : adr (%z20.d,%z21.d,sxtw #3) -> %z19.d +0437aed5 : adr z21.d, [z22.d, z23.d, SXTW #3] : adr (%z22.d,%z23.d,sxtw #3) -> %z21.d +0439af17 : adr z23.d, [z24.d, z25.d, SXTW #3] : adr (%z24.d,%z25.d,sxtw #3) -> %z23.d +043baf59 : adr z25.d, [z26.d, z27.d, SXTW #3] : adr (%z26.d,%z27.d,sxtw #3) -> %z25.d +043daf9b : adr z27.d, [z28.d, z29.d, SXTW #3] : adr (%z28.d,%z29.d,sxtw #3) -> %z27.d +043fafff : adr z31.d, [z31.d, z31.d, SXTW #3] : adr (%z31.d,%z31.d,sxtw #3) -> %z31.d + +# ADR .D, [.D, .D, UXTW ] (ADR-Z.AZ-D.u32.scaled) +0460a000 : adr z0.d, [z0.d, z0.d, UXTW] : adr (%z0.d,%z0.d,uxtw) -> %z0.d +0464a062 : adr z2.d, [z3.d, z4.d, UXTW] : adr (%z3.d,%z4.d,uxtw) -> %z2.d +0466a0a4 : adr z4.d, [z5.d, z6.d, UXTW] : adr (%z5.d,%z6.d,uxtw) -> %z4.d +0468a0e6 : adr z6.d, [z7.d, z8.d, UXTW] : adr (%z7.d,%z8.d,uxtw) -> %z6.d +046aa128 : adr z8.d, [z9.d, z10.d, UXTW] : adr (%z9.d,%z10.d,uxtw) -> %z8.d +046ca16a : adr z10.d, [z11.d, z12.d, UXTW] : adr (%z11.d,%z12.d,uxtw) -> %z10.d +046ea1ac : adr z12.d, [z13.d, z14.d, UXTW] : adr (%z13.d,%z14.d,uxtw) -> %z12.d +0470a1ee : adr z14.d, [z15.d, z16.d, UXTW] : adr (%z15.d,%z16.d,uxtw) -> %z14.d +0472a230 : adr z16.d, [z17.d, z18.d, UXTW] : adr (%z17.d,%z18.d,uxtw) -> %z16.d +0473a251 : adr z17.d, [z18.d, z19.d, UXTW] : adr (%z18.d,%z19.d,uxtw) -> %z17.d +0475a293 : adr z19.d, [z20.d, z21.d, UXTW] : adr (%z20.d,%z21.d,uxtw) -> %z19.d +0477a2d5 : adr z21.d, [z22.d, z23.d, UXTW] : adr (%z22.d,%z23.d,uxtw) -> %z21.d +0479a317 : adr z23.d, [z24.d, z25.d, UXTW] : adr (%z24.d,%z25.d,uxtw) -> %z23.d +047ba359 : adr z25.d, [z26.d, z27.d, UXTW] : adr (%z26.d,%z27.d,uxtw) -> %z25.d +047da39b : adr z27.d, [z28.d, z29.d, UXTW] : adr (%z28.d,%z29.d,uxtw) -> %z27.d +047fa3ff : adr z31.d, [z31.d, z31.d, UXTW] : adr (%z31.d,%z31.d,uxtw) -> %z31.d +0460a400 : adr z0.d, [z0.d, z0.d, UXTW #1] : adr (%z0.d,%z0.d,uxtw #1) -> %z0.d +0464a462 : adr z2.d, [z3.d, z4.d, UXTW #1] : adr (%z3.d,%z4.d,uxtw #1) -> %z2.d +0466a4a4 : adr z4.d, [z5.d, z6.d, UXTW #1] : adr (%z5.d,%z6.d,uxtw #1) -> %z4.d +0468a4e6 : adr z6.d, [z7.d, z8.d, UXTW #1] : adr (%z7.d,%z8.d,uxtw #1) -> %z6.d +046aa528 : adr z8.d, [z9.d, z10.d, UXTW #1] : adr (%z9.d,%z10.d,uxtw #1) -> %z8.d +046ca56a : adr z10.d, [z11.d, z12.d, UXTW #1] : adr (%z11.d,%z12.d,uxtw #1) -> %z10.d +046ea5ac : adr z12.d, [z13.d, z14.d, UXTW #1] : adr (%z13.d,%z14.d,uxtw #1) -> %z12.d +0470a5ee : adr z14.d, [z15.d, z16.d, UXTW #1] : adr (%z15.d,%z16.d,uxtw #1) -> %z14.d +0472a630 : adr z16.d, [z17.d, z18.d, UXTW #1] : adr (%z17.d,%z18.d,uxtw #1) -> %z16.d +0473a651 : adr z17.d, [z18.d, z19.d, UXTW #1] : adr (%z18.d,%z19.d,uxtw #1) -> %z17.d +0475a693 : adr z19.d, [z20.d, z21.d, UXTW #1] : adr (%z20.d,%z21.d,uxtw #1) -> %z19.d +0477a6d5 : adr z21.d, [z22.d, z23.d, UXTW #1] : adr (%z22.d,%z23.d,uxtw #1) -> %z21.d +0479a717 : adr z23.d, [z24.d, z25.d, UXTW #1] : adr (%z24.d,%z25.d,uxtw #1) -> %z23.d +047ba759 : adr z25.d, [z26.d, z27.d, UXTW #1] : adr (%z26.d,%z27.d,uxtw #1) -> %z25.d +047da79b : adr z27.d, [z28.d, z29.d, UXTW #1] : adr (%z28.d,%z29.d,uxtw #1) -> %z27.d +047fa7ff : adr z31.d, [z31.d, z31.d, UXTW #1] : adr (%z31.d,%z31.d,uxtw #1) -> %z31.d +0460a800 : adr z0.d, [z0.d, z0.d, UXTW #2] : adr (%z0.d,%z0.d,uxtw #2) -> %z0.d +0464a862 : adr z2.d, [z3.d, z4.d, UXTW #2] : adr (%z3.d,%z4.d,uxtw #2) -> %z2.d +0466a8a4 : adr z4.d, [z5.d, z6.d, UXTW #2] : adr (%z5.d,%z6.d,uxtw #2) -> %z4.d +0468a8e6 : adr z6.d, [z7.d, z8.d, UXTW #2] : adr (%z7.d,%z8.d,uxtw #2) -> %z6.d +046aa928 : adr z8.d, [z9.d, z10.d, UXTW #2] : adr (%z9.d,%z10.d,uxtw #2) -> %z8.d +046ca96a : adr z10.d, [z11.d, z12.d, UXTW #2] : adr (%z11.d,%z12.d,uxtw #2) -> %z10.d +046ea9ac : adr z12.d, [z13.d, z14.d, UXTW #2] : adr (%z13.d,%z14.d,uxtw #2) -> %z12.d +0470a9ee : adr z14.d, [z15.d, z16.d, UXTW #2] : adr (%z15.d,%z16.d,uxtw #2) -> %z14.d +0472aa30 : adr z16.d, [z17.d, z18.d, UXTW #2] : adr (%z17.d,%z18.d,uxtw #2) -> %z16.d +0473aa51 : adr z17.d, [z18.d, z19.d, UXTW #2] : adr (%z18.d,%z19.d,uxtw #2) -> %z17.d +0475aa93 : adr z19.d, [z20.d, z21.d, UXTW #2] : adr (%z20.d,%z21.d,uxtw #2) -> %z19.d +0477aad5 : adr z21.d, [z22.d, z23.d, UXTW #2] : adr (%z22.d,%z23.d,uxtw #2) -> %z21.d +0479ab17 : adr z23.d, [z24.d, z25.d, UXTW #2] : adr (%z24.d,%z25.d,uxtw #2) -> %z23.d +047bab59 : adr z25.d, [z26.d, z27.d, UXTW #2] : adr (%z26.d,%z27.d,uxtw #2) -> %z25.d +047dab9b : adr z27.d, [z28.d, z29.d, UXTW #2] : adr (%z28.d,%z29.d,uxtw #2) -> %z27.d +047fabff : adr z31.d, [z31.d, z31.d, UXTW #2] : adr (%z31.d,%z31.d,uxtw #2) -> %z31.d +0460ac00 : adr z0.d, [z0.d, z0.d, UXTW #3] : adr (%z0.d,%z0.d,uxtw #3) -> %z0.d +0464ac62 : adr z2.d, [z3.d, z4.d, UXTW #3] : adr (%z3.d,%z4.d,uxtw #3) -> %z2.d +0466aca4 : adr z4.d, [z5.d, z6.d, UXTW #3] : adr (%z5.d,%z6.d,uxtw #3) -> %z4.d +0468ace6 : adr z6.d, [z7.d, z8.d, UXTW #3] : adr (%z7.d,%z8.d,uxtw #3) -> %z6.d +046aad28 : adr z8.d, [z9.d, z10.d, UXTW #3] : adr (%z9.d,%z10.d,uxtw #3) -> %z8.d +046cad6a : adr z10.d, [z11.d, z12.d, UXTW #3] : adr (%z11.d,%z12.d,uxtw #3) -> %z10.d +046eadac : adr z12.d, [z13.d, z14.d, UXTW #3] : adr (%z13.d,%z14.d,uxtw #3) -> %z12.d +0470adee : adr z14.d, [z15.d, z16.d, UXTW #3] : adr (%z15.d,%z16.d,uxtw #3) -> %z14.d +0472ae30 : adr z16.d, [z17.d, z18.d, UXTW #3] : adr (%z17.d,%z18.d,uxtw #3) -> %z16.d +0473ae51 : adr z17.d, [z18.d, z19.d, UXTW #3] : adr (%z18.d,%z19.d,uxtw #3) -> %z17.d +0475ae93 : adr z19.d, [z20.d, z21.d, UXTW #3] : adr (%z20.d,%z21.d,uxtw #3) -> %z19.d +0477aed5 : adr z21.d, [z22.d, z23.d, UXTW #3] : adr (%z22.d,%z23.d,uxtw #3) -> %z21.d +0479af17 : adr z23.d, [z24.d, z25.d, UXTW #3] : adr (%z24.d,%z25.d,uxtw #3) -> %z23.d +047baf59 : adr z25.d, [z26.d, z27.d, UXTW #3] : adr (%z26.d,%z27.d,uxtw #3) -> %z25.d +047daf9b : adr z27.d, [z28.d, z29.d, UXTW #3] : adr (%z28.d,%z29.d,uxtw #3) -> %z27.d +047fafff : adr z31.d, [z31.d, z31.d, UXTW #3] : adr (%z31.d,%z31.d,uxtw #3) -> %z31.d + +# ADR ., [., ., ] (ADR-Z.AZ-SD.same.scaled) +04a0a000 : adr z0.s, [z0.s, z0.s] : adr (%z0.s,%z0.s) -> %z0.s +04a4a062 : adr z2.s, [z3.s, z4.s] : adr (%z3.s,%z4.s) -> %z2.s +04a6a0a4 : adr z4.s, [z5.s, z6.s] : adr (%z5.s,%z6.s) -> %z4.s +04a8a0e6 : adr z6.s, [z7.s, z8.s] : adr (%z7.s,%z8.s) -> %z6.s +04aaa128 : adr z8.s, [z9.s, z10.s] : adr (%z9.s,%z10.s) -> %z8.s +04aca16a : adr z10.s, [z11.s, z12.s] : adr (%z11.s,%z12.s) -> %z10.s +04aea1ac : adr z12.s, [z13.s, z14.s] : adr (%z13.s,%z14.s) -> %z12.s +04b0a1ee : adr z14.s, [z15.s, z16.s] : adr (%z15.s,%z16.s) -> %z14.s +04b2a230 : adr z16.s, [z17.s, z18.s] : adr (%z17.s,%z18.s) -> %z16.s +04b3a251 : adr z17.s, [z18.s, z19.s] : adr (%z18.s,%z19.s) -> %z17.s +04b5a293 : adr z19.s, [z20.s, z21.s] : adr (%z20.s,%z21.s) -> %z19.s +04b7a2d5 : adr z21.s, [z22.s, z23.s] : adr (%z22.s,%z23.s) -> %z21.s +04b9a317 : adr z23.s, [z24.s, z25.s] : adr (%z24.s,%z25.s) -> %z23.s +04bba359 : adr z25.s, [z26.s, z27.s] : adr (%z26.s,%z27.s) -> %z25.s +04bda39b : adr z27.s, [z28.s, z29.s] : adr (%z28.s,%z29.s) -> %z27.s +04bfa3ff : adr z31.s, [z31.s, z31.s] : adr (%z31.s,%z31.s) -> %z31.s +04a0a400 : adr z0.s, [z0.s, z0.s, LSL #1] : adr (%z0.s,%z0.s,lsl #1) -> %z0.s +04a4a462 : adr z2.s, [z3.s, z4.s, LSL #1] : adr (%z3.s,%z4.s,lsl #1) -> %z2.s +04a6a4a4 : adr z4.s, [z5.s, z6.s, LSL #1] : adr (%z5.s,%z6.s,lsl #1) -> %z4.s +04a8a4e6 : adr z6.s, [z7.s, z8.s, LSL #1] : adr (%z7.s,%z8.s,lsl #1) -> %z6.s +04aaa528 : adr z8.s, [z9.s, z10.s, LSL #1] : adr (%z9.s,%z10.s,lsl #1) -> %z8.s +04aca56a : adr z10.s, [z11.s, z12.s, LSL #1] : adr (%z11.s,%z12.s,lsl #1) -> %z10.s +04aea5ac : adr z12.s, [z13.s, z14.s, LSL #1] : adr (%z13.s,%z14.s,lsl #1) -> %z12.s +04b0a5ee : adr z14.s, [z15.s, z16.s, LSL #1] : adr (%z15.s,%z16.s,lsl #1) -> %z14.s +04b2a630 : adr z16.s, [z17.s, z18.s, LSL #1] : adr (%z17.s,%z18.s,lsl #1) -> %z16.s +04b3a651 : adr z17.s, [z18.s, z19.s, LSL #1] : adr (%z18.s,%z19.s,lsl #1) -> %z17.s +04b5a693 : adr z19.s, [z20.s, z21.s, LSL #1] : adr (%z20.s,%z21.s,lsl #1) -> %z19.s +04b7a6d5 : adr z21.s, [z22.s, z23.s, LSL #1] : adr (%z22.s,%z23.s,lsl #1) -> %z21.s +04b9a717 : adr z23.s, [z24.s, z25.s, LSL #1] : adr (%z24.s,%z25.s,lsl #1) -> %z23.s +04bba759 : adr z25.s, [z26.s, z27.s, LSL #1] : adr (%z26.s,%z27.s,lsl #1) -> %z25.s +04bda79b : adr z27.s, [z28.s, z29.s, LSL #1] : adr (%z28.s,%z29.s,lsl #1) -> %z27.s +04bfa7ff : adr z31.s, [z31.s, z31.s, LSL #1] : adr (%z31.s,%z31.s,lsl #1) -> %z31.s +04a0a800 : adr z0.s, [z0.s, z0.s, LSL #2] : adr (%z0.s,%z0.s,lsl #2) -> %z0.s +04a4a862 : adr z2.s, [z3.s, z4.s, LSL #2] : adr (%z3.s,%z4.s,lsl #2) -> %z2.s +04a6a8a4 : adr z4.s, [z5.s, z6.s, LSL #2] : adr (%z5.s,%z6.s,lsl #2) -> %z4.s +04a8a8e6 : adr z6.s, [z7.s, z8.s, LSL #2] : adr (%z7.s,%z8.s,lsl #2) -> %z6.s +04aaa928 : adr z8.s, [z9.s, z10.s, LSL #2] : adr (%z9.s,%z10.s,lsl #2) -> %z8.s +04aca96a : adr z10.s, [z11.s, z12.s, LSL #2] : adr (%z11.s,%z12.s,lsl #2) -> %z10.s +04aea9ac : adr z12.s, [z13.s, z14.s, LSL #2] : adr (%z13.s,%z14.s,lsl #2) -> %z12.s +04b0a9ee : adr z14.s, [z15.s, z16.s, LSL #2] : adr (%z15.s,%z16.s,lsl #2) -> %z14.s +04b2aa30 : adr z16.s, [z17.s, z18.s, LSL #2] : adr (%z17.s,%z18.s,lsl #2) -> %z16.s +04b3aa51 : adr z17.s, [z18.s, z19.s, LSL #2] : adr (%z18.s,%z19.s,lsl #2) -> %z17.s +04b5aa93 : adr z19.s, [z20.s, z21.s, LSL #2] : adr (%z20.s,%z21.s,lsl #2) -> %z19.s +04b7aad5 : adr z21.s, [z22.s, z23.s, LSL #2] : adr (%z22.s,%z23.s,lsl #2) -> %z21.s +04b9ab17 : adr z23.s, [z24.s, z25.s, LSL #2] : adr (%z24.s,%z25.s,lsl #2) -> %z23.s +04bbab59 : adr z25.s, [z26.s, z27.s, LSL #2] : adr (%z26.s,%z27.s,lsl #2) -> %z25.s +04bdab9b : adr z27.s, [z28.s, z29.s, LSL #2] : adr (%z28.s,%z29.s,lsl #2) -> %z27.s +04bfabff : adr z31.s, [z31.s, z31.s, LSL #2] : adr (%z31.s,%z31.s,lsl #2) -> %z31.s +04a0ac00 : adr z0.s, [z0.s, z0.s, LSL #3] : adr (%z0.s,%z0.s,lsl #3) -> %z0.s +04a4ac62 : adr z2.s, [z3.s, z4.s, LSL #3] : adr (%z3.s,%z4.s,lsl #3) -> %z2.s +04a6aca4 : adr z4.s, [z5.s, z6.s, LSL #3] : adr (%z5.s,%z6.s,lsl #3) -> %z4.s +04a8ace6 : adr z6.s, [z7.s, z8.s, LSL #3] : adr (%z7.s,%z8.s,lsl #3) -> %z6.s +04aaad28 : adr z8.s, [z9.s, z10.s, LSL #3] : adr (%z9.s,%z10.s,lsl #3) -> %z8.s +04acad6a : adr z10.s, [z11.s, z12.s, LSL #3] : adr (%z11.s,%z12.s,lsl #3) -> %z10.s +04aeadac : adr z12.s, [z13.s, z14.s, LSL #3] : adr (%z13.s,%z14.s,lsl #3) -> %z12.s +04b0adee : adr z14.s, [z15.s, z16.s, LSL #3] : adr (%z15.s,%z16.s,lsl #3) -> %z14.s +04b2ae30 : adr z16.s, [z17.s, z18.s, LSL #3] : adr (%z17.s,%z18.s,lsl #3) -> %z16.s +04b3ae51 : adr z17.s, [z18.s, z19.s, LSL #3] : adr (%z18.s,%z19.s,lsl #3) -> %z17.s +04b5ae93 : adr z19.s, [z20.s, z21.s, LSL #3] : adr (%z20.s,%z21.s,lsl #3) -> %z19.s +04b7aed5 : adr z21.s, [z22.s, z23.s, LSL #3] : adr (%z22.s,%z23.s,lsl #3) -> %z21.s +04b9af17 : adr z23.s, [z24.s, z25.s, LSL #3] : adr (%z24.s,%z25.s,lsl #3) -> %z23.s +04bbaf59 : adr z25.s, [z26.s, z27.s, LSL #3] : adr (%z26.s,%z27.s,lsl #3) -> %z25.s +04bdaf9b : adr z27.s, [z28.s, z29.s, LSL #3] : adr (%z28.s,%z29.s,lsl #3) -> %z27.s +04bfafff : adr z31.s, [z31.s, z31.s, LSL #3] : adr (%z31.s,%z31.s,lsl #3) -> %z31.s +04e0a000 : adr z0.d, [z0.d, z0.d] : adr (%z0.d,%z0.d) -> %z0.d +04e4a062 : adr z2.d, [z3.d, z4.d] : adr (%z3.d,%z4.d) -> %z2.d +04e6a0a4 : adr z4.d, [z5.d, z6.d] : adr (%z5.d,%z6.d) -> %z4.d +04e8a0e6 : adr z6.d, [z7.d, z8.d] : adr (%z7.d,%z8.d) -> %z6.d +04eaa128 : adr z8.d, [z9.d, z10.d] : adr (%z9.d,%z10.d) -> %z8.d +04eca16a : adr z10.d, [z11.d, z12.d] : adr (%z11.d,%z12.d) -> %z10.d +04eea1ac : adr z12.d, [z13.d, z14.d] : adr (%z13.d,%z14.d) -> %z12.d +04f0a1ee : adr z14.d, [z15.d, z16.d] : adr (%z15.d,%z16.d) -> %z14.d +04f2a230 : adr z16.d, [z17.d, z18.d] : adr (%z17.d,%z18.d) -> %z16.d +04f3a251 : adr z17.d, [z18.d, z19.d] : adr (%z18.d,%z19.d) -> %z17.d +04f5a293 : adr z19.d, [z20.d, z21.d] : adr (%z20.d,%z21.d) -> %z19.d +04f7a2d5 : adr z21.d, [z22.d, z23.d] : adr (%z22.d,%z23.d) -> %z21.d +04f9a317 : adr z23.d, [z24.d, z25.d] : adr (%z24.d,%z25.d) -> %z23.d +04fba359 : adr z25.d, [z26.d, z27.d] : adr (%z26.d,%z27.d) -> %z25.d +04fda39b : adr z27.d, [z28.d, z29.d] : adr (%z28.d,%z29.d) -> %z27.d +04ffa3ff : adr z31.d, [z31.d, z31.d] : adr (%z31.d,%z31.d) -> %z31.d +04e0a400 : adr z0.d, [z0.d, z0.d, LSL #1] : adr (%z0.d,%z0.d,lsl #1) -> %z0.d +04e4a462 : adr z2.d, [z3.d, z4.d, LSL #1] : adr (%z3.d,%z4.d,lsl #1) -> %z2.d +04e6a4a4 : adr z4.d, [z5.d, z6.d, LSL #1] : adr (%z5.d,%z6.d,lsl #1) -> %z4.d +04e8a4e6 : adr z6.d, [z7.d, z8.d, LSL #1] : adr (%z7.d,%z8.d,lsl #1) -> %z6.d +04eaa528 : adr z8.d, [z9.d, z10.d, LSL #1] : adr (%z9.d,%z10.d,lsl #1) -> %z8.d +04eca56a : adr z10.d, [z11.d, z12.d, LSL #1] : adr (%z11.d,%z12.d,lsl #1) -> %z10.d +04eea5ac : adr z12.d, [z13.d, z14.d, LSL #1] : adr (%z13.d,%z14.d,lsl #1) -> %z12.d +04f0a5ee : adr z14.d, [z15.d, z16.d, LSL #1] : adr (%z15.d,%z16.d,lsl #1) -> %z14.d +04f2a630 : adr z16.d, [z17.d, z18.d, LSL #1] : adr (%z17.d,%z18.d,lsl #1) -> %z16.d +04f3a651 : adr z17.d, [z18.d, z19.d, LSL #1] : adr (%z18.d,%z19.d,lsl #1) -> %z17.d +04f5a693 : adr z19.d, [z20.d, z21.d, LSL #1] : adr (%z20.d,%z21.d,lsl #1) -> %z19.d +04f7a6d5 : adr z21.d, [z22.d, z23.d, LSL #1] : adr (%z22.d,%z23.d,lsl #1) -> %z21.d +04f9a717 : adr z23.d, [z24.d, z25.d, LSL #1] : adr (%z24.d,%z25.d,lsl #1) -> %z23.d +04fba759 : adr z25.d, [z26.d, z27.d, LSL #1] : adr (%z26.d,%z27.d,lsl #1) -> %z25.d +04fda79b : adr z27.d, [z28.d, z29.d, LSL #1] : adr (%z28.d,%z29.d,lsl #1) -> %z27.d +04ffa7ff : adr z31.d, [z31.d, z31.d, LSL #1] : adr (%z31.d,%z31.d,lsl #1) -> %z31.d +04e0a800 : adr z0.d, [z0.d, z0.d, LSL #2] : adr (%z0.d,%z0.d,lsl #2) -> %z0.d +04e4a862 : adr z2.d, [z3.d, z4.d, LSL #2] : adr (%z3.d,%z4.d,lsl #2) -> %z2.d +04e6a8a4 : adr z4.d, [z5.d, z6.d, LSL #2] : adr (%z5.d,%z6.d,lsl #2) -> %z4.d +04e8a8e6 : adr z6.d, [z7.d, z8.d, LSL #2] : adr (%z7.d,%z8.d,lsl #2) -> %z6.d +04eaa928 : adr z8.d, [z9.d, z10.d, LSL #2] : adr (%z9.d,%z10.d,lsl #2) -> %z8.d +04eca96a : adr z10.d, [z11.d, z12.d, LSL #2] : adr (%z11.d,%z12.d,lsl #2) -> %z10.d +04eea9ac : adr z12.d, [z13.d, z14.d, LSL #2] : adr (%z13.d,%z14.d,lsl #2) -> %z12.d +04f0a9ee : adr z14.d, [z15.d, z16.d, LSL #2] : adr (%z15.d,%z16.d,lsl #2) -> %z14.d +04f2aa30 : adr z16.d, [z17.d, z18.d, LSL #2] : adr (%z17.d,%z18.d,lsl #2) -> %z16.d +04f3aa51 : adr z17.d, [z18.d, z19.d, LSL #2] : adr (%z18.d,%z19.d,lsl #2) -> %z17.d +04f5aa93 : adr z19.d, [z20.d, z21.d, LSL #2] : adr (%z20.d,%z21.d,lsl #2) -> %z19.d +04f7aad5 : adr z21.d, [z22.d, z23.d, LSL #2] : adr (%z22.d,%z23.d,lsl #2) -> %z21.d +04f9ab17 : adr z23.d, [z24.d, z25.d, LSL #2] : adr (%z24.d,%z25.d,lsl #2) -> %z23.d +04fbab59 : adr z25.d, [z26.d, z27.d, LSL #2] : adr (%z26.d,%z27.d,lsl #2) -> %z25.d +04fdab9b : adr z27.d, [z28.d, z29.d, LSL #2] : adr (%z28.d,%z29.d,lsl #2) -> %z27.d +04ffabff : adr z31.d, [z31.d, z31.d, LSL #2] : adr (%z31.d,%z31.d,lsl #2) -> %z31.d +04e0ac00 : adr z0.d, [z0.d, z0.d, LSL #3] : adr (%z0.d,%z0.d,lsl #3) -> %z0.d +04e4ac62 : adr z2.d, [z3.d, z4.d, LSL #3] : adr (%z3.d,%z4.d,lsl #3) -> %z2.d +04e6aca4 : adr z4.d, [z5.d, z6.d, LSL #3] : adr (%z5.d,%z6.d,lsl #3) -> %z4.d +04e8ace6 : adr z6.d, [z7.d, z8.d, LSL #3] : adr (%z7.d,%z8.d,lsl #3) -> %z6.d +04eaad28 : adr z8.d, [z9.d, z10.d, LSL #3] : adr (%z9.d,%z10.d,lsl #3) -> %z8.d +04ecad6a : adr z10.d, [z11.d, z12.d, LSL #3] : adr (%z11.d,%z12.d,lsl #3) -> %z10.d +04eeadac : adr z12.d, [z13.d, z14.d, LSL #3] : adr (%z13.d,%z14.d,lsl #3) -> %z12.d +04f0adee : adr z14.d, [z15.d, z16.d, LSL #3] : adr (%z15.d,%z16.d,lsl #3) -> %z14.d +04f2ae30 : adr z16.d, [z17.d, z18.d, LSL #3] : adr (%z17.d,%z18.d,lsl #3) -> %z16.d +04f3ae51 : adr z17.d, [z18.d, z19.d, LSL #3] : adr (%z18.d,%z19.d,lsl #3) -> %z17.d +04f5ae93 : adr z19.d, [z20.d, z21.d, LSL #3] : adr (%z20.d,%z21.d,lsl #3) -> %z19.d +04f7aed5 : adr z21.d, [z22.d, z23.d, LSL #3] : adr (%z22.d,%z23.d,lsl #3) -> %z21.d +04f9af17 : adr z23.d, [z24.d, z25.d, LSL #3] : adr (%z24.d,%z25.d,lsl #3) -> %z23.d +04fbaf59 : adr z25.d, [z26.d, z27.d, LSL #3] : adr (%z26.d,%z27.d,lsl #3) -> %z25.d +04fdaf9b : adr z27.d, [z28.d, z29.d, LSL #3] : adr (%z28.d,%z29.d,lsl #3) -> %z27.d +04ffafff : adr z31.d, [z31.d, z31.d, LSL #3] : adr (%z31.d,%z31.d,lsl #3) -> %z31.d + 041a06ff : and z31.b, p1/m, z31.b, z23.b : and %p1 %z31 %z23 $0x00 -> %z31 045a06ff : and z31.h, p1/m, z31.h, z23.h : and %p1 %z31 %z23 $0x01 -> %z31 049a06ff : and z31.s, p1/m, z31.s, z23.s : and %p1 %z31 %z23 $0x02 -> %z31 diff --git a/suite/tests/api/ir_aarch64_sve.c b/suite/tests/api/ir_aarch64_sve.c index c1973859fa8..feee8ce27f4 100644 --- a/suite/tests/api/ir_aarch64_sve.c +++ b/suite/tests/api/ir_aarch64_sve.c @@ -14666,6 +14666,224 @@ TEST_INSTR(prfw_sve_pred) OPSZ_0)); } +TEST_INSTR(adr_sve) +{ + /* Testing ADR .D, [.D, .D, SXTW ] */ + const char *const expected_0_0[6] = { + "adr (%z0.d,%z0.d,sxtw) -> %z0.d", "adr (%z6.d,%z7.d,sxtw) -> %z5.d", + "adr (%z11.d,%z12.d,sxtw) -> %z10.d", "adr (%z17.d,%z18.d,sxtw) -> %z16.d", + "adr (%z22.d,%z23.d,sxtw) -> %z21.d", "adr (%z31.d,%z31.d,sxtw) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_0_0[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_SXTW, false, 0, 0, + OPSZ_0, 0)); + + const char *const expected_0_1[6] = { + "adr (%z0.d,%z0.d,sxtw #1) -> %z0.d", + "adr (%z6.d,%z7.d,sxtw #1) -> %z5.d", + "adr (%z11.d,%z12.d,sxtw #1) -> %z10.d", + "adr (%z17.d,%z18.d,sxtw #1) -> %z16.d", + "adr (%z22.d,%z23.d,sxtw #1) -> %z21.d", + "adr (%z31.d,%z31.d,sxtw #1) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_0_1[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_SXTW, true, 0, 0, + OPSZ_0, 1)); + + const char *const expected_0_2[6] = { + "adr (%z0.d,%z0.d,sxtw #2) -> %z0.d", + "adr (%z6.d,%z7.d,sxtw #2) -> %z5.d", + "adr (%z11.d,%z12.d,sxtw #2) -> %z10.d", + "adr (%z17.d,%z18.d,sxtw #2) -> %z16.d", + "adr (%z22.d,%z23.d,sxtw #2) -> %z21.d", + "adr (%z31.d,%z31.d,sxtw #2) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_0_2[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_SXTW, true, 0, 0, + OPSZ_0, 2)); + + const char *const expected_0_3[6] = { + "adr (%z0.d,%z0.d,sxtw #3) -> %z0.d", + "adr (%z6.d,%z7.d,sxtw #3) -> %z5.d", + "adr (%z11.d,%z12.d,sxtw #3) -> %z10.d", + "adr (%z17.d,%z18.d,sxtw #3) -> %z16.d", + "adr (%z22.d,%z23.d,sxtw #3) -> %z21.d", + "adr (%z31.d,%z31.d,sxtw #3) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_0_3[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_SXTW, true, 0, 0, + OPSZ_0, 3)); + + /* Testing ADR .D, [.D, .D, UXTW ] */ + const char *const expected_1_0[6] = { + "adr (%z0.d,%z0.d,uxtw) -> %z0.d", "adr (%z6.d,%z7.d,uxtw) -> %z5.d", + "adr (%z11.d,%z12.d,uxtw) -> %z10.d", "adr (%z17.d,%z18.d,uxtw) -> %z16.d", + "adr (%z22.d,%z23.d,uxtw) -> %z21.d", "adr (%z31.d,%z31.d,uxtw) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_1_0[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_UXTW, false, 0, 0, + OPSZ_0, 0)); + + const char *const expected_1_1[6] = { + "adr (%z0.d,%z0.d,uxtw #1) -> %z0.d", + "adr (%z6.d,%z7.d,uxtw #1) -> %z5.d", + "adr (%z11.d,%z12.d,uxtw #1) -> %z10.d", + "adr (%z17.d,%z18.d,uxtw #1) -> %z16.d", + "adr (%z22.d,%z23.d,uxtw #1) -> %z21.d", + "adr (%z31.d,%z31.d,uxtw #1) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_1_1[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_UXTW, true, 0, 0, + OPSZ_0, 1)); + + const char *const expected_1_2[6] = { + "adr (%z0.d,%z0.d,uxtw #2) -> %z0.d", + "adr (%z6.d,%z7.d,uxtw #2) -> %z5.d", + "adr (%z11.d,%z12.d,uxtw #2) -> %z10.d", + "adr (%z17.d,%z18.d,uxtw #2) -> %z16.d", + "adr (%z22.d,%z23.d,uxtw #2) -> %z21.d", + "adr (%z31.d,%z31.d,uxtw #2) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_1_2[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_UXTW, true, 0, 0, + OPSZ_0, 2)); + + const char *const expected_1_3[6] = { + "adr (%z0.d,%z0.d,uxtw #3) -> %z0.d", + "adr (%z6.d,%z7.d,uxtw #3) -> %z5.d", + "adr (%z11.d,%z12.d,uxtw #3) -> %z10.d", + "adr (%z17.d,%z18.d,uxtw #3) -> %z16.d", + "adr (%z22.d,%z23.d,uxtw #3) -> %z21.d", + "adr (%z31.d,%z31.d,uxtw #3) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_1_3[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_UXTW, true, 0, 0, + OPSZ_0, 3)); + + /* Testing ADR ., [., ., ] */ + const char *const expected_2_0[6] = { + "adr (%z0.s,%z0.s) -> %z0.s", "adr (%z6.s,%z7.s) -> %z5.s", + "adr (%z11.s,%z12.s) -> %z10.s", "adr (%z17.s,%z18.s) -> %z16.s", + "adr (%z22.s,%z23.s) -> %z21.s", "adr (%z31.s,%z31.s) -> %z31.s", + }; + TEST_LOOP(adr, adr_sve, 6, expected_2_0[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_4), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_4, DR_EXTEND_UXTX, false, 0, 0, + OPSZ_0, 0)); + + const char *const expected_2_1[6] = { + "adr (%z0.s,%z0.s,lsl #1) -> %z0.s", + "adr (%z6.s,%z7.s,lsl #1) -> %z5.s", + "adr (%z11.s,%z12.s,lsl #1) -> %z10.s", + "adr (%z17.s,%z18.s,lsl #1) -> %z16.s", + "adr (%z22.s,%z23.s,lsl #1) -> %z21.s", + "adr (%z31.s,%z31.s,lsl #1) -> %z31.s", + }; + TEST_LOOP(adr, adr_sve, 6, expected_2_1[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_4), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_4, DR_EXTEND_UXTX, true, 0, 0, + OPSZ_0, 1)); + + const char *const expected_2_2[6] = { + "adr (%z0.s,%z0.s,lsl #2) -> %z0.s", + "adr (%z6.s,%z7.s,lsl #2) -> %z5.s", + "adr (%z11.s,%z12.s,lsl #2) -> %z10.s", + "adr (%z17.s,%z18.s,lsl #2) -> %z16.s", + "adr (%z22.s,%z23.s,lsl #2) -> %z21.s", + "adr (%z31.s,%z31.s,lsl #2) -> %z31.s", + }; + TEST_LOOP(adr, adr_sve, 6, expected_2_2[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_4), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_4, DR_EXTEND_UXTX, true, 0, 0, + OPSZ_0, 2)); + + const char *const expected_2_3[6] = { + "adr (%z0.s,%z0.s,lsl #3) -> %z0.s", + "adr (%z6.s,%z7.s,lsl #3) -> %z5.s", + "adr (%z11.s,%z12.s,lsl #3) -> %z10.s", + "adr (%z17.s,%z18.s,lsl #3) -> %z16.s", + "adr (%z22.s,%z23.s,lsl #3) -> %z21.s", + "adr (%z31.s,%z31.s,lsl #3) -> %z31.s", + }; + TEST_LOOP(adr, adr_sve, 6, expected_2_3[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_4), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_4, DR_EXTEND_UXTX, true, 0, 0, + OPSZ_0, 3)); + + const char *const expected_2_4[6] = { + "adr (%z0.d,%z0.d) -> %z0.d", "adr (%z6.d,%z7.d) -> %z5.d", + "adr (%z11.d,%z12.d) -> %z10.d", "adr (%z17.d,%z18.d) -> %z16.d", + "adr (%z22.d,%z23.d) -> %z21.d", "adr (%z31.d,%z31.d) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_2_4[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_UXTX, false, 0, 0, + OPSZ_0, 0)); + + const char *const expected_2_5[6] = { + "adr (%z0.d,%z0.d,lsl #1) -> %z0.d", + "adr (%z6.d,%z7.d,lsl #1) -> %z5.d", + "adr (%z11.d,%z12.d,lsl #1) -> %z10.d", + "adr (%z17.d,%z18.d,lsl #1) -> %z16.d", + "adr (%z22.d,%z23.d,lsl #1) -> %z21.d", + "adr (%z31.d,%z31.d,lsl #1) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_2_5[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_UXTX, true, 0, 0, + OPSZ_0, 1)); + + const char *const expected_2_6[6] = { + "adr (%z0.d,%z0.d,lsl #2) -> %z0.d", + "adr (%z6.d,%z7.d,lsl #2) -> %z5.d", + "adr (%z11.d,%z12.d,lsl #2) -> %z10.d", + "adr (%z17.d,%z18.d,lsl #2) -> %z16.d", + "adr (%z22.d,%z23.d,lsl #2) -> %z21.d", + "adr (%z31.d,%z31.d,lsl #2) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_2_6[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_UXTX, true, 0, 0, + OPSZ_0, 2)); + + const char *const expected_2_7[6] = { + "adr (%z0.d,%z0.d,lsl #3) -> %z0.d", + "adr (%z6.d,%z7.d,lsl #3) -> %z5.d", + "adr (%z11.d,%z12.d,lsl #3) -> %z10.d", + "adr (%z17.d,%z18.d,lsl #3) -> %z16.d", + "adr (%z22.d,%z23.d,lsl #3) -> %z21.d", + "adr (%z31.d,%z31.d,lsl #3) -> %z31.d", + }; + TEST_LOOP(adr, adr_sve, 6, expected_2_7[i], + opnd_create_reg_element_vector(Zn_six_offset_0[i], OPSZ_8), + opnd_create_vector_base_disp_aarch64(Zn_six_offset_1[i], Zn_six_offset_2[i], + OPSZ_8, DR_EXTEND_UXTX, true, 0, 0, + OPSZ_0, 3)); +} + TEST_INSTR(ld2b_sve_pred) { @@ -15142,6 +15360,7 @@ main(int argc, char *argv[]) RUN_INSTR_TEST(addpl); RUN_INSTR_TEST(addvl); + RUN_INSTR_TEST(adr_sve); RUN_INSTR_TEST(rdvl); RUN_INSTR_TEST(fabd_sve);