On 8/12/2026 1:04 PM, Peter Bergner wrote:
This adds support for the global version of Ascalon X (tt-ascalon-xg)
to the list of known cores.  The difference between Ascalon X & XG is XG
does not have the zvkng extension and it has reduced vector FP64 throughput.

Notes on my implementation: I decided against renaming tt_ascalon_d8 to
tt_ascalon_x as I thought that was too much churn for little benefit.  Given the
huge similarity between the X and XG, I used the same tt_ascalon_d8 automaton
for both cores, just redirecting XG's FP64 vector ops into a new non-pipelined
unit to reduce their throughput.

Regtested on rv64gcv-linux with no regressions.
Ok for trunk?

I'd eventually like to backport this too.  Ok for backports once it has
baked on trunk for a while?

Peter



2026-08-12  Peter Bergner  <[email protected]>

gcc/
        * config/riscv/riscv-cores.def (RISCV_TUNE): Add tt-ascalon-xg.
        (RISCV_CORE): Likewise.
        * config/riscv/riscv-opts.h (enum riscv_microarchitecture_type):
        Add tt_ascalon_xg.
        * config/riscv/riscv.md (tune): Likewise.
        * config/riscv/tt-ascalon-d8.md (asc-xg-fp64-vec0, asc-xg-fp64-vec1):
        New define_cpu_unit.
        (tt_ascalon_xg_fp64_vec): New define_reservation.
        (tt_ascalon_d8_int_load, tt_ascalon_d8_alu, tt_ascalon_d8_sfb,
        tt_ascalon_d8_branch, tt_ascalon_d8_float_move, tt_ascalon_d8_fcvt,
        tt_ascalon_d8_fcmp, tt_ascalon_d8_imul, tt_ascalon_d8_idiv,
        tt_ascalon_d8_fadd, tt_ascalon_d8_mul, tt_ascalon_d8_float_fma,
        tt_ascalon_d8_float_div_half, tt_ascalon_d8_float_div_single,
        tt_ascalon_d8_float_div_double, tt_ascalon_d8_popcount,
        tt_ascalon_d8_vec_load, tt_ascalon_d8_vec_store,
        tt_ascalon_d8_vec_load_strided, tt_ascalon_d8_vec_store_strided,
        tt_ascalon_d8_vec_load_indexed, tt_ascalon_d8_vec_store_indexed,
        tt_ascalon_d8_vec_loadstore_seg, tt_ascalon_d8_vec_alu_1,
        tt_ascalon_d8_vec_alu_2, tt_ascalon_d8_vec_alu_3,
        tt_ascalon_d8_vec_alu_4, tt_ascalon_d8_vec_imul, tt_ascalon_d8_vec_pop,
        tt_ascalon_d8_vec_crypto_aes, tt_ascalon_d8_vec_crypto_sha,
        tt_ascalon_d8_vec_perm_1, tt_ascalon_d8_vec_perm_3,
        tt_ascalon_d8_vec_perm_4, tt_ascalon_d8_vec_reduction,
        tt_ascalon_d8_vec_ordered_reduction, tt_ascalon_d8_vec_idiv_byte,
        tt_ascalon_d8_vec_idiv_half, tt_ascalon_d8_vec_idiv_single,
        tt_ascalon_d8_vec_idiv_double, tt_ascalon_d8_vec_float_divsqrt_half,
        tt_ascalon_d8_vec_float_divsqrt_single,
        tt_ascalon_d8_vec_float_divsqrt_double, tt_ascalon_d8_vec_mask,
        tt_ascalon_d8_vec_vesetvl, tt_ascalon_d8_vec_setrm,
        tt_ascalon_d8_vec_readlen, tt_ascalon_d8_vec_unknown):
        Use tt_ascalon_xg.
        (tt_ascalon_d8_vec_fcmp, tt_ascalon_d8_vec_fadd,
        tt_ascalon_d8_vec_fmul): Disable vector instructions that produce FP64
        output values when tuning for tt_ascalon_xg.
        (tt_ascalon_xg_fp64_vec_insns): New define_insn_reservation.
        * doc/riscv-mcpu.texi: Regenerate.
        * doc/riscv-mtune.texi: Likewise.
GIven this all specific to the ascalon cores, I'd say you (or your team) ought to be able to adjust these at-will and push them.  I'm not going to second guess this stuff as you know the uarch while I know nothing about the uarch ;-)

As for backporting.  I'm guessing the real benefit is just having the tt-ascalon-xg name recognized across releases.  But again, given it's all tuning stuff for the ascalon cores, if you want to backport, go for it.  Just give a little soak time on the trunk first (not that I'd expect anything weird from a change like this, but stranger things have happened).

jeff


Reply via email to