Yeah, I know about RISC and CISC. I frequently see explanations like the one you give here but in the end, if you look at all this in more detail, I don’t think there is much left of this argument. The main difference between Aarch64 and x86 is that the first is a load-store architecture with fixed instruction length and the second is a register memory architecture with variable instruction length. This means that you can occasionally encode a sequence of operations in a slightly more compact way in x86, and that’s about it… and even then it mostly applies to toy examples. When you look at real world code, especially optimized one, there is no significant difference between x86 and Aarch64 binary sizes.
As to complex vs. simple instructions… frankly, I don’t even know where do these misconceptions came from. ARM has instructions that store/load multiple registers at once, it has matrix multiplication, auto-increment addressing modes, pointer encryption, half-float operations, interleaved simd loads and stores, fully featured horizontal vector operations… in fact, I can’t think of any instruction that x86 has that ARM lacks (except maybe the weird old-school CISC instructions which are dead slow and never used in modern code).
In the end, Aarch64 is a modern instruction set that has been meticulously designed to simplify the lives of both the CPU designer and the compiler writer as well as enable high-performance out of order execution. And x86 is a very old design that has been continuously adding more modern features on top of its legacy core.