Hello,
I think there is a bug in mips_pass_by_reference when the mips abi
is EABI to pass TImode parameters.
The following code is from the mainline GCC "mips.c".
---------
mips_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
enum machine_mode mode, tree type,
bool named ATTRIBUTE_UNUSED)
{
if (mips_abi == ABI_EABI)
{
int size;
/* ??? How should SCmode be handled? */
if (type == NULL_TREE || mode == DImode || mode == DFmode)
return 0;
size = int_size_in_bytes (type);
return size == -1 || size > UNITS_PER_WORD;
}
else
{
/* If we have a variable-sized parameter, we have no choice. */
return targetm.calls.must_pass_in_stack (mode, type);
}
}
---------
When "type" is NULL_TREE, this function returns "0". But when "type" is not
NULL and
the size of TImode is bigger than UNITS_PER_WORD, so it returns "1".
This causes inconsistency in the following test.
# cat timode.c
typedef int TItype __attribute__ ((mode (TI)));
TItype test1 (TItype a)
{
return a*a;
}
# mipsisa64-elf-gcc -S timode.c -O3
### timiode.s
test1:
daddiu $sp,$sp,-8
sd $31,0($sp)
ld $3,8($4) <----- Parameter in stack
ld $2,0($4) <----- Parameter in stack
move $7,$3 <---- Parameter in register
move $4,$2 <---- Parameter in register
move $5,$3 <---- Parameter in register
jal __multi3
move $6,$2 <---- Parameter in register
ld $31,0($sp)
move $4,$2
move $2,$4
j $31
daddiu $sp,$sp,8
Does someone know how to pass TImode parameters in EABI? Thanks!
Regards,
Chao-ying