Bug in as for aarch64?

Jacob Navia <[email protected]> Wed, 28 Jul 2021 19:33:11 +0200
Newsgroups gmane.comp.gnu.utils.bugs
Message-ID <[email protected]>
Dear Friends:

The instruction:

	ldr d15,=3D0x401acccccccc

will be assembled without any warnings. The pool will be correctly =
constructed and linked, and the correct value is stored in the pool =
after the current function. The value 0x401acccccccc corresponds to 6.7

At run-time it will not work, the register d15 is loaded with some value =
that doesn=E2=80=99t correspond at all to the given one.

If I write however

	ldr x15,=3D0x401acccccccc

The 64 bit value value will be correctly loaded into x15.Both pools are =
exactly the same.

The clang compiler does NOT assemble that instruction and emits an =
error:

 error: Immediate too large for register

If I change it to x15, both gas and clang agree, and the result is =
correct.

Note that the address of the pool appears correct under gdb =
disassembler: it is just at the position of the .ltorg pseudo =
instruction. I verified this by displaying the contents of the pool.

as -v

GNU assembler version 2.28 (aarch64-linux-gnu) using BFD version (GNU =
Binutils for Debian) 2.28

uname -a
Linux rock64 4.4.152-rockchip64 #1 SMP Sun Aug 26 14:40:54 CEST 2018 =
aarch64 GNU/Linux

Thanks in advance for your help.

jacob navia