* How to save and restore a symbol value in Aarch64?
@ 2017-04-20 9:16 Jeffrey Walton
2017-04-20 9:27 ` Jeffrey Walton
2017-04-20 10:03 ` Andreas Schwab
0 siblings, 2 replies; 7+ messages in thread
From: Jeffrey Walton @ 2017-04-20 9:16 UTC (permalink / raw)
To: Binutils
I'm trying to save (and restore) the original value of a symbol under
Aarch64. The code runs on a variety of machines, and it looks like I
need a solution for Binutils 2.24 and above.
I know .set allows me to set the symbol value:
asm(".set .cpu, generic+crc \n" ... );
I need the method to get the previous .cpu value and save it for the
restore. About all I have been able to do is cause assembler errors.
For example:
__inline unsigned int GCC_INLINE_ATTRIB
CRC32B(unsigned int crc, unsigned char v)
{
unsigned int r;
asm (".set old_cpu, .cpu \n"
".cpu generic+crc \n"
"crc32w %w2, %w1, %w0 \n"
".set .cpu, old_cpu \n"
: "=r"(r) : "r"(crc), "r"((unsigned int)v)
);
return r;
}
It results in:
Adding a leading dot results in:
My question is, how do I save and restore a symbol value for Binutils
2.2.4 and above on Aarch64?
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to save and restore a symbol value in Aarch64?
2017-04-20 9:16 How to save and restore a symbol value in Aarch64? Jeffrey Walton
@ 2017-04-20 9:27 ` Jeffrey Walton
2017-04-20 10:03 ` Andreas Schwab
1 sibling, 0 replies; 7+ messages in thread
From: Jeffrey Walton @ 2017-04-20 9:27 UTC (permalink / raw)
To: Binutils
On Thu, Apr 20, 2017 at 5:16 AM, Jeffrey Walton <noloader@gmail.com> wrote:
> I'm trying to save (and restore) the original value of a symbol under
> Aarch64. The code runs on a variety of machines, and it looks like I
> need a solution for Binutils 2.24 and above.
>
> I know .set allows me to set the symbol value:
>
> asm(".set .cpu, generic+crc \n" ... );
>
> I need the method to get the previous .cpu value and save it for the
> restore. About all I have been able to do is cause assembler errors.
> For example:
>
> __inline unsigned int GCC_INLINE_ATTRIB
> CRC32B(unsigned int crc, unsigned char v)
> {
> unsigned int r;
> asm (".set old_cpu, .cpu \n"
> ".cpu generic+crc \n"
> "crc32w %w2, %w1, %w0 \n"
> ".set .cpu, old_cpu \n"
> : "=r"(r) : "r"(crc), "r"((unsigned int)v)
> );
> return r;
> }
>
> It results in:
>
> Adding a leading dot results in:
>
> My question is, how do I save and restore a symbol value for Binutils
> 2.2.4 and above on Aarch64?
Sorry about the truncated message. Here are the error messages.
For ".set old_cpu, .cpu \n" (no leading dot):
/tmp/ccbAvT3u.s: Assembler messages:
/tmp/ccbAvT3u.s:32: Error: unknown mnemonic `old_cpu' -- `old_cpu .equ .cpu'
/tmp/ccbAvT3u.s:35: Error: unknown mnemonic `set' -- `set .cpu,old_cpu'
For ".set .old_cpu, .cpu \n" (leading dot):
/tmp/cc0r6bvh.s: Assembler messages:
/tmp/cc0r6bvh.s:32: Error: unknown pseudo-op: `.old_cpu'
Here's the relevant AS manual section that discusses symbols:
http://tigcc.ticalc.org/doc/gnuasm.html#SEC45
Jeff
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to save and restore a symbol value in Aarch64?
2017-04-20 9:16 How to save and restore a symbol value in Aarch64? Jeffrey Walton
2017-04-20 9:27 ` Jeffrey Walton
@ 2017-04-20 10:03 ` Andreas Schwab
2017-04-20 10:55 ` Jeffrey Walton
1 sibling, 1 reply; 7+ messages in thread
From: Andreas Schwab @ 2017-04-20 10:03 UTC (permalink / raw)
To: Jeffrey Walton; +Cc: Binutils
On Apr 20 2017, Jeffrey Walton <noloader@gmail.com> wrote:
> I need the method to get the previous .cpu value
.cpu is not a symbol, it is a directive, so you cannot get its "value".
The effect of the directive is to modify the internal state of the
assembler, which is not directly accessible to the assembler input.
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to save and restore a symbol value in Aarch64?
2017-04-20 10:03 ` Andreas Schwab
@ 2017-04-20 10:55 ` Jeffrey Walton
2017-04-20 12:35 ` Jiong Wang
0 siblings, 1 reply; 7+ messages in thread
From: Jeffrey Walton @ 2017-04-20 10:55 UTC (permalink / raw)
To: Andreas Schwab; +Cc: Binutils
On Thu, Apr 20, 2017 at 6:02 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> On Apr 20 2017, Jeffrey Walton <noloader@gmail.com> wrote:
>
>> I need the method to get the previous .cpu value
>
> .cpu is not a symbol, it is a directive, so you cannot get its "value".
> The effect of the directive is to modify the internal state of the
> assembler, which is not directly accessible to the assembler input.
Thanks Andreas.
Does '.set push, .cpu' and '.set pop, .cpu' work as {expected|desired}
for Aarch32 and Aarch64?
Sorry to have to ask. I tested code using push and pop, and its not
producing a warning or an error. I'm not sure if its wrong or a case
of the documentation being a bit stale.
Jeff
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to save and restore a symbol value in Aarch64?
2017-04-20 10:55 ` Jeffrey Walton
@ 2017-04-20 12:35 ` Jiong Wang
2017-04-20 13:57 ` Jeffrey Walton
2017-04-20 19:01 ` Jeffrey Walton
0 siblings, 2 replies; 7+ messages in thread
From: Jiong Wang @ 2017-04-20 12:35 UTC (permalink / raw)
To: noloader, Andreas Schwab; +Cc: Binutils
On 20/04/17 11:54, Jeffrey Walton wrote:
> On Thu, Apr 20, 2017 at 6:02 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
>> On Apr 20 2017, Jeffrey Walton <noloader@gmail.com> wrote:
>>
>>> I need the method to get the previous .cpu value
>> .cpu is not a symbol, it is a directive, so you cannot get its "value".
>> The effect of the directive is to modify the internal state of the
>> assembler, which is not directly accessible to the assembler input.
> Thanks Andreas.
>
> Does '.set push, .cpu' and '.set pop, .cpu' work as {expected|desired}
> for Aarch32 and Aarch64?
It will not work as you expected.
They are simply treating "push/pop" as symbols, and their value will be the string ".cpu".
Below is a purely work around for your reference that you can escape assembler's architecture requirement check.
__inline unsigned int GCC_INLINE_ATTRIB
CRC32B(unsigned int crc, unsigned char v)
{
unsigned int r;
asm (
"\t.set raw_x0, 0\n"
"\t.set raw_x1, 1\n"
"\t.set raw_x2, 2\n"
"\t.set raw_x3, 3\n"
"\t.set raw_x4, 4\n"
"\t.set raw_x5, 5\n"
"\t.set raw_x6, 6\n"
"\t.set raw_x7, 7\n"
"\t#crc32w %w2, %w1, %w0\n"
"\t.inst\t0x1ac04800 | (raw_%2) | (raw_%1 << 5) | (raw_%0 << 16)\n"
: "=r"(r) : "r"(crc), "r"((unsigned int)v)
);
return r;
}
Regards,
Jiong
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to save and restore a symbol value in Aarch64?
2017-04-20 12:35 ` Jiong Wang
@ 2017-04-20 13:57 ` Jeffrey Walton
2017-04-20 19:01 ` Jeffrey Walton
1 sibling, 0 replies; 7+ messages in thread
From: Jeffrey Walton @ 2017-04-20 13:57 UTC (permalink / raw)
To: Jiong Wang; +Cc: Andreas Schwab, Binutils
On Thu, Apr 20, 2017 at 8:35 AM, Jiong Wang <jiong.wang@foss.arm.com> wrote:
>
>
> On 20/04/17 11:54, Jeffrey Walton wrote:
>>
>> On Thu, Apr 20, 2017 at 6:02 AM, Andreas Schwab <schwab@linux-m68k.org>
>> wrote:
>>>
>>> On Apr 20 2017, Jeffrey Walton <noloader@gmail.com> wrote:
>>>
>>>> I need the method to get the previous .cpu value
>>>
>>> .cpu is not a symbol, it is a directive, so you cannot get its "value".
>>> The effect of the directive is to modify the internal state of the
>>> assembler, which is not directly accessible to the assembler input.
>>
>> Thanks Andreas.
>>
>> Does '.set push, .cpu' and '.set pop, .cpu' work as {expected|desired}
>> for Aarch32 and Aarch64?
>
> It will not work as you expected.
> They are simply treating "push/pop" as symbols, and their value will be the
> string ".cpu".
OK, thanks. My test case was bad. It needed to use a feature other
than NEON after the CRC. Trying to use AES caused the error I was
looking for.
> Below is a purely work around for your reference that you can escape
> assembler's architecture requirement check.
>
> __inline unsigned int GCC_INLINE_ATTRIB
> CRC32B(unsigned int crc, unsigned char v)
> {
> unsigned int r;
> asm (
> "\t.set raw_x0, 0\n"
> "\t.set raw_x1, 1\n"
> "\t.set raw_x2, 2\n"
> "\t.set raw_x3, 3\n"
> "\t.set raw_x4, 4\n"
> "\t.set raw_x5, 5\n"
> "\t.set raw_x6, 6\n"
> "\t.set raw_x7, 7\n"
> "\t#crc32w %w2, %w1, %w0\n"
> "\t.inst\t0x1ac04800 | (raw_%2) | (raw_%1 << 5) |
> (raw_%0 << 16)\n"
> : "=r"(r) : "r"(crc), "r"((unsigned int)v)
> );
> return r;
> }
Thanks Jiong. Wow, I'm fairly certain I would not have gotten that on my own.
If you get to the Baltimore MD or Washington DC area, then dinner and
cold beers are on me.
Jeff
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: How to save and restore a symbol value in Aarch64?
2017-04-20 12:35 ` Jiong Wang
2017-04-20 13:57 ` Jeffrey Walton
@ 2017-04-20 19:01 ` Jeffrey Walton
1 sibling, 0 replies; 7+ messages in thread
From: Jeffrey Walton @ 2017-04-20 19:01 UTC (permalink / raw)
To: Jiong Wang; +Cc: Binutils
On Thu, Apr 20, 2017 at 8:35 AM, Jiong Wang <jiong.wang@foss.arm.com> wrote:
> On 20/04/17 11:54, Jeffrey Walton wrote:
>>
>> ...
>
> It will not work as you expected.
> They are simply treating "push/pop" as symbols, and their value will be the
> string ".cpu".
>
>
> Below is a purely work around for your reference that you can escape
> assembler's architecture requirement check.
>
> __inline unsigned int GCC_INLINE_ATTRIB
> CRC32B(unsigned int crc, unsigned char v)
> {
> unsigned int r;
> asm (
> "\t.set raw_x0, 0\n"
> "\t.set raw_x1, 1\n"
> "\t.set raw_x2, 2\n"
> "\t.set raw_x3, 3\n"
> "\t.set raw_x4, 4\n"
> "\t.set raw_x5, 5\n"
> "\t.set raw_x6, 6\n"
> "\t.set raw_x7, 7\n"
> "\t#crc32w %w2, %w1, %w0\n"
> "\t.inst\t0x1ac04800 | (raw_%2) | (raw_%1 << 5) |
> (raw_%0 << 16)\n"
> : "=r"(r) : "r"(crc), "r"((unsigned int)v)
> );
> return r;
> }
Thanks again Jiong. I needed one small change to make things work. I'm
posting it back to the list in case someone copies/pastes. The
operands needed to be reversed:
__inline unsigned int GCC_INLINE_ATTRIB
CRC32B(unsigned int crc, unsigned char v)
{
volatile unsigned int res;
asm (
"\t" ".set reg_x0, 0\n"
"\t" ".set reg_x1, 1\n"
"\t" ".set reg_x2, 2\n"
"\t" ".set reg_x3, 3\n"
"\t" ".set reg_x4, 4\n"
"\t" ".set reg_x5, 5\n"
"\t" ".set reg_x6, 6\n"
"\t" ".set reg_x7, 7\n"
"\t" "#crc32w %w0, %w1, %w2\n"
"\t" ".inst 0x1ac04800 | (reg_%2 << 16) | (reg_%1 << 5) | (reg_%0)\n"
: "=r"(res) : "r"(crc), "r"(val)
);
return res;
}
Thanks again.
Jeff
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2017-04-20 19:01 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-20 9:16 How to save and restore a symbol value in Aarch64? Jeffrey Walton
2017-04-20 9:27 ` Jeffrey Walton
2017-04-20 10:03 ` Andreas Schwab
2017-04-20 10:55 ` Jeffrey Walton
2017-04-20 12:35 ` Jiong Wang
2017-04-20 13:57 ` Jeffrey Walton
2017-04-20 19:01 ` Jeffrey Walton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).