<< Back to previous view

[PCC-82] invalid assembly on amd64 Created: 19/Aug/09  Updated: 03/Jun/10

Status: Closed
Project: pcc
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Major
Reporter: Daniel Dickman Assignee: Anders Magnusson
Resolution: Fixed Votes: 1
Environment: [/usr/src/bin/cp] uname -msrvp
OpenBSD 4.6 GENERIC.MP#130 amd64 Intel(R) Core(TM)2 Duo CPU T7100 @ 1.80GHz

Compiling with -O2 on OpenBSD/amd64 produces the following error for some code

[/usr/src/bin/cp] pcc -O2 -c cp.c
/tmp/ctm.sE01ll: Assembler messages:
/tmp/ctm.sE01ll:488: Error: `(%eax,%r14d)' is not a valid 64 bit base/index expression

Leaving out the -O2 seems to work
[/usr/src/bin/cp] pcc -c cp.c

Comment by Jonathan Gray [ 14/Sep/09 05:25 PM ]

        leal (%eax,%ebx),%eax
        leal (%eax,%ecx),%ebx


        leal (%rax,%rbx),%eax
        leal (%rax,%rcx),%ebx

perhaps this wasn't noticed during development as NetBSD supports -m32 on amd64?
Comment by Jonathan Gray [ 14/Sep/09 06:25 PM ]
It is worth pointing out that OpenBSD currently uses binutils 2.15, there have been several noteable amd64 changes since
such as:

Changes from binutils
2. Support x86-64 medium model.
Changes from binutils
4. Add x86-64 new relocations for medium model.

When specifying -mcmodel=medium to gcc it will generate code with leal instructions that looks like that of pcc.
Comment by Jonathan Gray [ 14/Sep/09 06:33 PM ]
I mistakenly used pcc in the last test not gcc, all leal instructions still use %r* registers with the different mcmodel it would seem.
Comment by Anders Magnusson [ 03/Jun/10 09:57 PM ]
This is a bug in the old gas used in OpenBSD, it do not accept constructs like "leal (%eax,%ebx),%ecx" which does not have anything to do with addresses but in fact is a 3-operand addition. pcc may emit it to avoid an extra movl instruction.

It must be fixed in OpenBSD, it's not a compiler problem. Newer gas supports this.
Generated at Wed Oct 07 02:17:49 CEST 2015 using JIRA Enterprise Edition, Version: 3.13.1-#333.