Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

i#5365: Add AArch64 SVE support to the core (part 1) #5835

Merged
merged 71 commits into from
Aug 14, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
10a0907
i#5365: Add AArch64 SVE vector length support (part 1)
AssadHashmi Jan 24, 2023
462ae72
Fix source format non-compliances.
AssadHashmi Jan 24, 2023
ec3b2d0
Remove spurious TAB.
AssadHashmi Jan 24, 2023
c1d0c06
Multi-line body error in core/arch/aarchxx/mangle.c
AssadHashmi Jan 24, 2023
e30f977
Address some minor review issues, see below:
AssadHashmi Feb 23, 2023
f5d15fd
Fix reg_type enum declarations.
AssadHashmi Feb 23, 2023
cbcb088
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Mar 10, 2023
734b78e
Resolve merge conflicts due to OPSZ_SVE_VL and OPSZ_SVE_VL_BYTES
AssadHashmi Mar 10, 2023
3e80e83
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Mar 20, 2023
e65b836
Update dr_get_sve_vl() to dr_get_sve_vector_length() after latest bra…
AssadHashmi Mar 20, 2023
9d2d1df
Fix format non-conformances in instr_create_api.h
AssadHashmi Mar 20, 2023
69de817
Set VL for test builds and revert BUILD_TESTS changes in codec.c and …
AssadHashmi Mar 21, 2023
85f2110
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Mar 31, 2023
d0d7d71
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Apr 11, 2023
e08b143
Add save/restore code for SVE in emit_utils.c
AssadHashmi Apr 12, 2023
565b8f7
Fix source format non-compliances.
AssadHashmi Apr 12, 2023
c8c602c
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Apr 13, 2023
6916889
Use dr_get_sve_vector_length() to read current VL in append_save_simd…
AssadHashmi Apr 13, 2023
799e4af
Use proc_get_vector_length_bytes() NOT dr_get_sve_vector_length()!
AssadHashmi Apr 13, 2023
8dfb2aa
Add predicate register bank and first pass at predicate register hand…
AssadHashmi Apr 13, 2023
2317012
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Apr 14, 2023
02d83f0
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Apr 16, 2023
36bd7cf
Adjust machine context size and dstack offset for predicate register …
AssadHashmi Apr 16, 2023
6863799
Add FFR and supporting emitter code for SVE
AssadHashmi Apr 18, 2023
10ea2ac
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Apr 20, 2023
c131ef8
Add SVE predicates and FFR to clean-call register usage handling
AssadHashmi Apr 20, 2023
7b28840
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi May 4, 2023
779eeb8
Out-of-line clean call SVE saving/restoring
cmannett85-arm May 18, 2023
f37817e
Formatting and ARM fix
cmannett85-arm May 22, 2023
a588503
Define SVE predicate and FFR counts for ARM.
cmannett85-arm May 23, 2023
7448887
Avoid calling proc_has_features on ARM
cmannett85-arm May 23, 2023
0150ae5
Missing char...
cmannett85-arm May 23, 2023
e6d0e7d
Formatting fixes
cmannett85-arm May 23, 2023
af22417
Formatting fixes
cmannett85-arm May 23, 2023
1e1227f
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Jun 1, 2023
1a7e369
Fix X86 regression caused by thread stack size mismatch
AssadHashmi Jun 9, 2023
87d952a
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Jun 11, 2023
3319351
Add FEATURE_ overrides for SVE2 unit tests.
AssadHashmi Jun 12, 2023
40099ad
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Jun 18, 2023
6177944
Updates after predicate register size change (PR6148)
AssadHashmi Jun 20, 2023
4e81382
Fix client.signal regression due to stack size
AssadHashmi Jun 27, 2023
998a952
Fix source code format non-conformance
AssadHashmi Jun 27, 2023
7f2d7ce
Added proc_get_vector_length_bytes() to release.dox
AssadHashmi Jun 28, 2023
911fbe1
Fix source code format non-conformance
AssadHashmi Jun 28, 2023
84a8451
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Jun 29, 2023
93ab221
Addressed some review comments.
AssadHashmi Jun 29, 2023
4c603b2
Addressed second set of review comments.
AssadHashmi Jul 4, 2023
14154ea
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Jul 9, 2023
33c6e27
Skip SVE mem operands in drcachesim
cmannett85-arm Jul 20, 2023
a97cb88
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Jul 25, 2023
c7aef1c
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Jul 27, 2023
0c6c9a9
Update emitter and mangler to use byte offsets for SVE load/store.
AssadHashmi Jul 27, 2023
a337e8a
Fix source format non-compliance.
AssadHashmi Jul 27, 2023
da93d7e
Fix SVE regression caused by PR 6230
AssadHashmi Jul 27, 2023
b4c64c6
Fixes drcacheoff.burst_traceopts and v86 unit test regression
AssadHashmi Jul 28, 2023
69cec8b
More accurate name usage of SIMD slot constants.
AssadHashmi Jul 28, 2023
533b5ee
Fix simd[] array size initilisation error enc end punctuation in comm…
AssadHashmi Jul 28, 2023
f7365cf
Fix non-AArch64 build failures.
AssadHashmi Jul 28, 2023
0109e57
Fix AArch32 and Android build failure due to SIMD num slots naming er…
AssadHashmi Jul 31, 2023
4bc96bb
Remove #if defined(BUILD_TESTS) clause around proc_set_feature()
AssadHashmi Aug 3, 2023
2c0410a
Address another batch of review comments:
AssadHashmi Aug 4, 2023
1adb10d
Set test VL in AArch64 unit tests only.
AssadHashmi Aug 4, 2023
68a68f8
Added binary compatibile copier in priv_mcontext_to_dr_mcontext().
AssadHashmi Aug 8, 2023
3c03659
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Aug 9, 2023
a57fb68
Addressed final set of review comments:
AssadHashmi Aug 10, 2023
a3c794e
Remove spurious TABs in runsuite_wrapper.pl
AssadHashmi Aug 10, 2023
0532404
Multi-line body needs {} in priv_mcontext_to_dr_mcontext()
AssadHashmi Aug 10, 2023
3c72817
Re-worded and moved binary compatibility text to relevant section in …
AssadHashmi Aug 11, 2023
b48a441
Re-worded binary compatibility comment in priv_mcontext_to_dr_mcontext()
AssadHashmi Aug 11, 2023
95be63a
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Aug 11, 2023
1564258
Merge branch 'master' into i5365-aarch64-sve-veclen-part1
AssadHashmi Aug 14, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions core/arch/aarch64/aarch64.asm
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,7 @@ START_FILE
#endif

/* sizeof(priv_mcontext_t) rounded up to a multiple of 16 */
#define PRIV_MCONTEXT_SIZE 800

/* offset of priv_mcontext_t in dr_mcontext_t */
#define PRIV_MCONTEXT_OFFSET 16

#if PRIV_MCONTEXT_OFFSET < 16 || PRIV_MCONTEXT_OFFSET % 16 != 0
# error PRIV_MCONTEXT_OFFSET
#endif
#define PRIV_MCONTEXT_SIZE 2336

/* offsetof(spill_state_t, r0) */
#define spill_state_r0_OFFSET 0
Expand All @@ -76,7 +69,7 @@ START_FILE
/* offsetof(priv_mcontext_t, simd) */
#define simd_OFFSET (16 * ARG_SZ*2 + 32)
/* offsetof(dcontext_t, dstack) */
#define dstack_OFFSET 0x368
#define dstack_OFFSET 0x968
/* offsetof(dcontext_t, is_exiting) */
#define is_exiting_OFFSET (dstack_OFFSET+1*ARG_SZ)
/* offsetof(struct tlsdesc_t, arg) */
Expand Down Expand Up @@ -246,6 +239,9 @@ save_priv_mcontext_helper:
st1 {v20.2d-v23.2d}, [x4], #64
st1 {v24.2d-v27.2d}, [x4], #64
st1 {v28.2d-v31.2d}, [x4], #64
/* TODO i#5365: Save Z/P regs as well? Will require runtime check of
* ID_AA64PFR0_EL1 for FEAT_SVE.
*/
ret

DECLARE_EXPORTED_FUNC(dr_app_start)
Expand Down
4 changes: 2 additions & 2 deletions core/arch/aarch64/clean_call_opt.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ insert_inline_reg_save(dcontext_t *dcontext, clean_call_info_t *cci, instrlist_t
insert_get_mcontext_base(dcontext, ilist, where, ci->spill_reg);

insert_save_inline_registers(dcontext, ilist, where, cci->reg_skip, DR_REG_START_GPR,
true, (void *)ci);
GPR_REG_TYPE, (void *)ci);

/* Save nzcv */
if (!cci->skip_save_flags && ci->write_flags) {
Expand Down Expand Up @@ -512,7 +512,7 @@ insert_inline_reg_restore(dcontext_t *dcontext, clean_call_info_t *cci,
}

insert_restore_inline_registers(dcontext, ilist, where, cci->reg_skip, DR_REG_X0,
true, (void *)ci);
GPR_REG_TYPE, (void *)ci);

/* Restore reg used for unprotected_context_t pointer. */
PRE(ilist, where,
Expand Down
46 changes: 30 additions & 16 deletions core/arch/aarch64/proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,35 @@ get_processor_specific_info(void)
cpu_info.features.flags_aa64mmfr1 = isa_features[AA64MMFR1];
cpu_info.features.flags_aa64dfr0 = isa_features[AA64DFR0];

# if !defined(DR_HOST_NOT_TARGET) && defined(SVE)
/* TODO i#3044: Vector length will be set by reading value from h/w. */
CLIENT_ASSERT(false, "TODO i#3044: SVE requires initialisation of vector length!");
# elif !defined(STANDALONE_DECODER) || defined(DR_HOST_NOT_TARGET)
/* Set SVE vector length for unit tests. */
/* The SVE vector length is set to:
* - A value read from the host hardware.
* or:
* - 32 bytes, 256 bits.
* Which of the above depends on:
* - SVE or non-SVE AArch64 or x86 host h/w.
* and:
* - Release or development test build.
*/
# if !defined(DR_HOST_NOT_TARGET)
if (proc_has_feature(FEATURE_SVE)) {
# if !defined(BUILD_TESTS)
AssadHashmi marked this conversation as resolved.
Show resolved Hide resolved
uint64 vl;
/* TODO i#5365: Ideally this should be generated by INSTR_CREATE_rdvl()
* and executed at startup time with other initialisation code.
*/
asm(".inst 0x04bf5020\n" /* rdvl x0, #1 */
AssadHashmi marked this conversation as resolved.
Show resolved Hide resolved
"mov %0, x0"
: "=r"(vl)
:
: "x0");
cpu_info.sve_vector_length_bytes = vl;
# else
cpu_info.sve_vector_length_bytes = 32;
AssadHashmi marked this conversation as resolved.
Show resolved Hide resolved
# endif
} else
cpu_info.sve_vector_length_bytes = 32;
# else
/* Set SVE vector length for unit testing the off-line decoder. */
dr_set_sve_vl(256);
# endif
}
Expand All @@ -109,6 +133,7 @@ proc_init_arch(void)
{
num_simd_saved = MCXT_NUM_SIMD_SLOTS;
num_simd_registers = MCXT_NUM_SIMD_SLOTS;
// TODO i#5365: Machine context slots for 16 predicate registers.
num_opmask_registers = MCXT_NUM_OPMASK_SLOTS;

/* When DR_HOST_NOT_TARGET, get_cache_line_size returns false and does
Expand Down Expand Up @@ -177,17 +202,6 @@ bool
proc_has_feature(feature_bit_t f)
{
#ifndef DR_HOST_NOT_TARGET
/* Pretend features are supported for codec tests run on h/w which does not
* support all features.
*/
# if defined(BUILD_TESTS)
if (f == FEATURE_LSE || f == FEATURE_RDM || f == FEATURE_FP16 ||
f == FEATURE_DotProd || f == FEATURE_SVE || f == FEATURE_LOR ||
f == FEATURE_FHM || f == FEATURE_SM3 || f == FEATURE_SM4 || f == FEATURE_SHA512 ||
f == FEATURE_SHA3 || f == FEATURE_RAS || f == FEATURE_SPE || f == FEATURE_PAUTH ||
f == FEATURE_LRCPC)
return true;
# endif
ushort feat_nibble, feat_val, freg_nibble, feat_nsflag;
uint64 freg_val = 0;

Expand Down
Loading