Assembler complains about use of $at after ".set noat" on sd instr

Juli Mallett jmallett at FreeBSD.org
Fri Oct 21 07:13:41 UTC 2011


On Thu, Oct 20, 2011 at 23:38, Rohit J <mipsjunkie at gmail.com> wrote:
> Hi FreeBSD MIPS Gurus,
>
> Am just starting on MIPS assembly in FreeBSD.
>
> The code that I have was building just fine.
> Then I added an line to a .S file @line# 513
>
>     sd  k0, mpl(sp)
>
> which on make gives an error that says :
>
>  Assembler messages:
> octeon_asm.S:440: Error: illegal operands `ld T3,8($7)'
> octeon_asm.S:513: Error: Macro used $at after ".set noat"
>
> The .S file has a noat directive
>  .set noat
>
> Silly Questions
> 1.      Why does sd instruction (store double word) end up using at ?
> I checked the particular manual (Cavium Octeon H/w reference Manual)
> and didn’t find anything about sd instr using register at.

Probably you are using a symbol/macro that is not locally defined, and
so assembler assumes it's an external data reference, and tries to
turn sd into a series of instructions using the assembler temporary to
load a linker-resolved address into a register to be used in the sd
instruction.  Try running just the C preprocessor and looking at the
resulting assembly to see what's not being resolved properly.

> 2.      Why does it complain about ld instr so far up in the file away from
> the place
> new code was inserted?

Can you send the source inline?  I suspect you're missing an include
or something.  Did you change that line?  Are you compiling it as it's
built on stock FreeBSD, or are you, say, copying the file from the
kernel and then trying to build it in userland?


More information about the freebsd-mips mailing list