The only thing AS does for compatibility is the TSO mode (and a couple miniscule internal features like a half-carry).
re: the other minor features, if folks are curious...
I don't remember the details but some of the reverse engineering guys found features which help Rosetta emulate 4K pages for x86. There's also a FPU mode which makes it do rounding and denormal handling exactly the same way x86 CPUs do (or is that what you mean by half-carry?). Finally, there's three different flags extensions (two standardized by Arm as optional features, one Apple custom) to help Rosetta emulate x86 flag behaviors.
For those wondering, flags extensions are often very important to emulators. They're minor things in that they cost almost no gates, but have a disproportionately huge impact on emulator performance. Say the x86 program runs an integer add instruction. Arm has arithmetically equivalent add instructions, so great! Just substitute an Arm add. But the job isn't only about the arithmetic; all integer ALU instructions also generate flag outputs, and x86 flags are slightly different from Arm flags. Emulating these differences might cost two or three more Arm instructions. On Apple Silicon, thanks to the flags extensions, Rosetta doesn't need those extra instructions. This means it can get much closer to the ideal world where every x86 instruction translates 1:1 to an Arm instruction.
Rosetta 2 simply translates x86 code into ARM code, the same way Rosetta translated PPC to x86 (almost a mirror image process, except for the BE/LE thing).
There is a major difference between Rosetta 2 and Rosetta 1, though. Rosetta 1 was a pure JIT (just-in-time) emulator; translation is done at runtime, incrementally, as the program executes. Rosetta 2 primarily operates in ahead-of-time (AOT) mode. The first time you launch an Intel binary on an Arm Mac, Rosetta 2 attempts to recompile the entire binary to Arm, writes the resulting to disk so future launches can be faster, and finally launches it. This is why first launches of a x86 binary have a long delay.
Rosetta 2 does have a JIT mode, because it's not possible to run all x86 software with AOT recompilation. The most common example is x86 software which embeds a JIT engine of its own, such as a browser engine with its Javascript JIT. Because the JIT generates x86 code at runtime, there is no way to do a static AOT translation of all the x86 code that will ever exist, and Rosetta 2 must fall back to JIT mode to handle it. JIT-in-JIT performs much worse than AOT, but at least it works.