mips: genmongoosev/start/start.S
Bill Gatliff
bgat at billgatliff.com
Wed Sep 10 16:58:06 UTC 2003
Joel:
> This should be inside the assembler because gcc is directly generating
> lw and st instructions. The PowerPC also has instructions like this
> and I vaguely recall the PA-RISC assembler doing the same thing.
Yep. Greg corrected me shortly after my post, I was getting confused by
some Linux kernel headers.
Oh, and add ARM to the list:
ldr sp, =(__stack_end__ - 0x1000)
The ARM LDR instruction can't take a 32-bit address, so gas synthesizes
this by doing something like the following:
ldr r0, 1f
...
1f: .long (__stack_end__ - 0x1000)
You don't see this going on in your .S file, but if you look at an
objdump output, it becomes readily apparent:
$ arm-elf-objdump --source crt0.o | less
...
ldr sp, =(__stack_end__ - 0x1000)
6c: e59fd060 ldr sp, [pc, #96] ; d4 <halt+0x8>
...
[Apologies for the formatting, here's where HTML emails can be handy!]
I'm pretty sure SH is in this camp too, but I bet the syntax is yet
again different.
> NOTE: When all instructions are 32-bits, there are not enough bits
> to have an opcode and the full 32-bit value. I recall various
> RISC architectures limits around 14 bit constants.
Yep.
Still doesn't offer an explanation to Ralf's original problem, where the
newest gas appears to be choking on what used to be a perfectly valid
instruction (albeit one that takes some work to turn into a valid opcode)...
b.g.
--
Bill Gatliff
Linux, NetBSD, RTEMS, eCos: yea, I do free software!
bgat at billgatliff.com
More information about the users
mailing list