diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fc9e90242d9..f75f9b1521d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-06-08 Jakub Jelinek + + * config/ia64/ia64.c (ia64_function_arg): Use [SDT]Fmode as gr_mode + for complex floats passed to unprototyped functions. + 2001-06-08 Mark Mitchell * except.c (expand_eh_region_end_allowed): Call diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index e9af4fff4be..b8d0803d8ad 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -2865,13 +2865,17 @@ ia64_function_arg (cum, mode, type, named, incoming) adjusted/little endian. */ else if (byte_size - offset == 4) gr_mode = SImode; + /* Complex floats need to have float mode. */ + if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT) + gr_mode = hfa_mode; loc[i] = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (gr_mode, (basereg + int_regs)), GEN_INT (offset)); offset += GET_MODE_SIZE (gr_mode); - int_regs++; + int_regs += GET_MODE_SIZE (gr_mode) <= UNITS_PER_WORD + ? 1 : GET_MODE_SIZE (gr_mode) / UNITS_PER_WORD; } /* If we ended up using just one location, just return that one loc. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 134d10f6a7e..1bc218d387f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-06-08 Jakub Jelinek + + * gcc.c-torture/execute/20010605-2.c: New test. + 2001-06-08 Nathan Sidwell * g++.old-deja/g++.abi/vbase2.C: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/20010605-2.c b/gcc/testsuite/gcc.c-torture/execute/20010605-2.c new file mode 100644 index 00000000000..09c7f76ac82 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20010605-2.c @@ -0,0 +1,36 @@ +void foo (), bar (), baz (); +int main () +{ + __complex__ double x; + __complex__ float y; + __complex__ long double z; + __real__ x = 1.0; + __imag__ x = 2.0; + foo (x); + __real__ y = 3.0f; + __imag__ y = 4.0f; + bar (y); + __real__ z = 5.0L; + __imag__ z = 6.0L; + baz (z); + exit (0); +} + +void foo (__complex__ double x) +{ + if (__real__ x != 1.0 || __imag__ x != 2.0) + abort (); +} + +void bar (__complex__ float x) +{ + if (__real__ x != 3.0f || __imag__ x != 4.0f) + abort (); +} + +void baz (__complex__ long double x) +{ + if (__real__ x != 5.0L || __imag__ x != 6.0L) + abort (); +} +