With GCC: (GNU) 4.4.0 20090116 (experimental) [trunk revision 143437]
Consider this program (bug1900.c):
-----------------------8<-------------------
unsigned long long bar()
{
unsigned long long rv;
asm volatile ("rdhwr %0, $30" : "=d" (rv));
return rv;
}
-----------------------8<-------------------
$ mips64-linux-gcc -march=mips32r2 -mabi=32 -O2 -c bug1900.c
$ cat bug1900.s
.file 1 "bug1900.c"
.section .mdebug.abi32
.previous
.gnu_attribute 4, 1
.abicalls
.text
.align 2
.globl bar
.set nomips16
.ent bar
.type bar, @function
bar:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
#APP
# 7 "bug1900.c" 1
rdhwr $4, $30
# 0 "" 2
#NO_APP
move $2,$4
.set noreorder
.set nomacro
j $31
move $3,$5
.set macro
.set reorder
.end bar
.size bar, .-bar
.ident "GCC: (GNU) 4.4.0 20090116 (experimental) [trunk revision
143437]"
Register $3 (v1) returns with uninitialized garbage. This is the high part of
the 64 bit return value.
I am not sure what should happen here. Really the "d" asm constraint should
not match a 64 bit variable for the o32 ABI.
--
Summary: MIPS: wrong-code with 64-bit values and register asm
constraints with o32 ABI.
Product: gcc
Version: 4.4.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: target
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: daney at gcc dot gnu dot org
GCC build triplet: mips64-unknown-linux-gnu
GCC host triplet: mips64-unknown-linux-gnu
GCC target triplet: mips64-unknown-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39090