Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Feb 2010 22:35:40 -0700 (MST)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        c.jayachandran@gmail.com
Cc:        freebsd-mips@FreeBSD.org
Subject:   Re: Writing MIPS assembler instructions in C
Message-ID:  <20100224.223540.319083499807541849.imp@bsdimp.com>
In-Reply-To: <98a59be81002242126k5bbf5167p7cba4917c13d1256@mail.gmail.com>
References:  <eaa228be1002241807q2613ccecy9773155e68ccda62@mail.gmail.com> <201002250236.o1P2a2oX024250@ns.mahan.org> <98a59be81002242126k5bbf5167p7cba4917c13d1256@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <98a59be81002242126k5bbf5167p7cba4917c13d1256@mail.gmail.co=
m>
            "C. Jayachandran" <c.jayachandran@gmail.com> writes:
: On Thu, Feb 25, 2010 at 8:01 AM, Patrick Mahan <mahan@mahan.org> wrot=
e:
: >
: > > %[foo] can be used to refer to named parameters (input or output,=

: > > maybe even clobbered) of inline assembly instructions rather than=

: > > using %0, %1, etc., which can be hard to read. =A0Consider:
: > >
: > > The brackets with the input and output parameters specify what na=
mes
: > > to use to refer to them in the assembly listing (here they happen=
 to
: > > be mostly the same as the variable names, but that's not necessar=
y.)
: > >
: >
: > Ah Sooo <*whack!*>......
: >
: > I did not even twig on that... I had gotten it in my head that %[rt=
]
: > was something special to the compiler that caused a certain behavio=
r
: > to occur.
: >
: > Now my problem is I still need to force the value pointed to "addr"=
 into
: > a specific register because there is a jalr to a function else wher=
e
: > that I only have binary access too and it expects it's a value in
: > that register. =A0Can I coerce this?
: =

: I may be missing something here,  but have you tried :
: =

: __asm__ __volatile__(
:            "ld     $8, 0(%0)\n\t"
:            "jalr   $8\n"
:            : : "r"(addr) : "$8");
: }
: =

: Or is there a reason this will not work?

Which register do you need to force it into?  Maybe it is something as
simple as:

	register_t r =3D *(register_t *)addr;

	foo(r);

if that register is a0...

Warner



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100224.223540.319083499807541849.imp>