Re: Delay slots
"Maciej W. Rozycki" <[email protected]> Mon, 27 Jun 2016 21:44:09 +0100 (BST)
| Newsgroups | gmane.os.netbsd.ports.mips.devel,gmane.os.netbsd.ports.pmax |
|---|---|
| Message-ID | <[email protected]> |
On Tue, 21 Jun 2016, Warner Losh wrote: > A big reason is that many bits that are in assembler are somewhat constrained > in how big they can be or what they can do. You’ll see lots of .set noat as well > since there are places you simply can’t trash the ‘at’ register when executing > in trap handler, but addresses need to be loaded so gas has special case code > to ensure that they are loaded properly (eg by only touching k0 and k1). FYI, GAS has supported redefining its temporary register for a while now, to aid software writers with exception handler code among others, although the use is not necessarily limited to that situation. For this purpose the `.set at' pseudo-op has been extended to accept an optional assignment from the register intended to be the new temporary. For example write `.set at=$k0' to use the $k0 rather than the usual $at register. Revert with `.set at=$1' or classic `.set at'; other relevant `.set' ops yield the expected results. This lets you write e.g. `sw $k1, foo' in an exception handler and forget what exact relocations (percent-ops) and instructions are needed with a given ABI to get at `foo' while the assembler sorts out the details using $k0 as the temporary; also avoiding _MIPS_SIM conditionals if applicable. Other use cases are possible too, sometimes just to shorten code produced from CPP or assembly macro expansions without the need to use conditional assembly. You can use the pseudo-op to choose any register as the temporary of course, with the exception of $0 -- `.set at=$0' is equivalent to `.set noat', perhaps somewhat predictably. FWIW, Maciej