For x86 there is sandpile.org, the probably densest human representation of the ISA, especially when it comes to the opcode tables.
Is there something comparable for ARM64? Basically, a landing page from which everything is just one click away, plus scrolling or a quick Ctrl-F search.
"The specification describes bits as combinations of 0, 1, and x, but also sometimes includes (0) and (1). I’m not sure what the parenthesized versions mean"
the answer is that the (0) and (1) are should-be-zero and should-be-one bits: if you set them wrongly then you get CONSTRAINED UNPREDICTABLE behaviour where the CPU might UNDEF, NOP, ignore that you set the bit wrongly, or set the destination register to garbage. In contrast, plain 0 and 1 are bits that have to be that way to decode to this instruction, and if you set them to something else then the decode will take you to some other instruction (or to UNDEF) instead.
One interesting observation is that successful RISC CPUs dont have a super simple ISA anymore. At least not in the frontend.
MIPS was notorious for having a simple ISA and RISCV is trying to mimick that to some extent.
But look at thumb2 for example and you will see complex encodings and even variable instruction width.
ARM64 looked like an exercise in "what can we squeeze into a 32-bit instruction" the first time I examined it in detail; the various "load/store register pair" instructions are a great example of this. I would consider it even more difficult to decode than x86, and yet it's still nowhere near as dense as Thumb2 nor x86.
10 comments
[ 0.26 ms ] story [ 25.4 ms ] thread> It would be cool to make a similar visualization for RISC-V and compare it with ARM64.
Or even compare a subset of the instruction set to see what's missing on different archs.
Is there something comparable for ARM64? Basically, a landing page from which everything is just one click away, plus scrolling or a quick Ctrl-F search.
"The specification describes bits as combinations of 0, 1, and x, but also sometimes includes (0) and (1). I’m not sure what the parenthesized versions mean"
the answer is that the (0) and (1) are should-be-zero and should-be-one bits: if you set them wrongly then you get CONSTRAINED UNPREDICTABLE behaviour where the CPU might UNDEF, NOP, ignore that you set the bit wrongly, or set the destination register to garbage. In contrast, plain 0 and 1 are bits that have to be that way to decode to this instruction, and if you set them to something else then the decode will take you to some other instruction (or to UNDEF) instead.
MIPS was notorious for having a simple ISA and RISCV is trying to mimick that to some extent. But look at thumb2 for example and you will see complex encodings and even variable instruction width.