Alistair, Do you (and the other RISC-V custodians of target/riscv) have any opinion on this? We can go either way — and it boils down to a style and process question.
Thanks, Philipp. On Mon, 10 Jan 2022 at 12:30, Philippe Mathieu-Daudé <f4...@amsat.org> wrote: > On 1/10/22 12:11, Philipp Tomsich wrote: > > On Mon, 10 Jan 2022 at 11:03, Philippe Mathieu-Daudé <f4...@amsat.org > > <mailto:f4...@amsat.org>> wrote: > > > > On 1/10/22 10:52, Philipp Tomsich wrote: > > > For RISC-V the opcode decode will change between different vendor > > > implementations of RISC-V (emulated by the same qemu binary). > > > Any two vendors may reuse the same opcode space, e.g., we may end > > up with: > > > > > > # *** RV64 Custom-3 Extension *** > > > { > > > vt_maskc 0000000 ..... ..... 110 ..... 1111011 @r > > |has_xventanacondops_p > > > vt_maskcn 0000000 ..... ..... 111 ..... 1111011 @r > > |has_xventanacondops_p > > > someone_something ............ ..... 000 ..... 1100111 @i > > > |has_xsomeonesomething_p > > > } > > > > > > With extensions being enabled either from the commandline > > > -cpu any,xventanacondops=true > > > or possibly even having a AMP in one emulation setup (e.g. > application > > > cores having one extension and power-mangement cores having a > > > different one — or even a conflicting one). > > > > I understand, I think this is what MIPS does, see commit 9d005392390: > > ("target/mips: Introduce decodetree structure for NEC Vr54xx > extension") > > > > > > The MIPS implementation is functionally equivalent, and I could see us > > doing something similar for RISC-V (although I would strongly prefer to > > make everything explicit via the .decode-file instead of relying on > > people being aware of the logic in decode_op). > > > > With the growing number of optional extensions (as of today, at least > > the Zb[abcs] and vector comes to mind), we would end up with a large > > number of decode-files that will then need to be sequentially called > > from decode_op(). The predicates can then move up into decode_op, > > predicting the auto-generated decoders from being invoked. > > > > As of today, we have predicates for at least the following: > > > > * Zb[abcs] > > * Vectors > > > > As long as we are in greenfield territory (i.e. not dealing with > > HINT-instructions that overlap existing opcode space), this will be fine > > and provide proper isolation between the .decode-tables. > > However, as soon as we need to implement something along the lines (I > > know this is a bad example, as prefetching will be a no-op on qemu) of: > > > > { > > { > > # *** RV32 Zicbop Sandard Extension (hints in the ori-space) *** > > prefetch_i ....... 00000 ..... 110 00000 0010011 @cbo_pref > > prefetch_r ....... 00001 ..... 110 00000 0010011 @cbo_pref > > prefetch_w ....... 00011 ..... 110 00000 0010011 @cbo_pref > > } > > ori ............ ..... 110 ..... 0010011 @i > > } > > > > we'd need to make sure that the generated decoders are called in the > > appropriate order (i.e. the decoder for the specialized instructions > > will need to be called first), which would not be apparent from looking > > at the individual .decode files. > > > > Let me know what direction we want to take (of course, I have a bias > > towards the one in the patch). > > I can't say for RISCV performance, I am myself biased toward maintenance > where having one compilation unit per (vendor) extension. > ARM and MIPS seems to go in this direction, while PPC and RISCV in the > other one. >