given that x16 is not at index 16 but 26 and x26 is at index 23, is this a hardware scheme (I can’t find anything on it in the ARM reference) or a reflection of something else, perhaps priority?
This is just an implementation detail. The number of each register is used to represent registers by integers in the register allocator and also to propagate the information of which registers are live at each program point to the garbage collector (the “frame table”). All native backends are treated similarly.
I don’t know exactly for arm64, but in general allocatable registers (those used by the register allocator) should be in sequential order so that can be interpreted as array indices. And the role for each register is also a function of whether it is caller- or callee- save in the standard C calling convention in order to work well in OCaml/C function calls. These factors often lead to numberings which may not be the most natural ones.