This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

another ia64 (and maybe generic) vector mode issue


Since the mode for vector types not directly supported by the target is,
in 4.0.0, set to BLKmode, this results, for a given vector type, in

INTEGRAL_MODE_P(TYPE_MODE(type)) != INTEGRAL_TYPE_P(type)
FLOAT_MODE_P(TYPE_MODE(type)) != FLOAT_TYPE_P(type)

For IA64, treating floating point registers f8-f15 the same when used
for arguments vs. results, this leads to say V4SFmode or V2DFmode
getting passed in general registers (because TYPE_MODE() yields BLKmode,
and ia64_function_arg/ia64_function_arg_advance use FLOAT_MODE_P on the
mode passed to them, originating from using TYPE_MODE in
assign_parm_find_data_types), but getting returned in floating point
registers (since ia64_function_value uses FLOAT_TYPE_P) (another thing
being that it incorrectly uses the significand rather than the full
register).

Perhaps for this specific case this can be easily fixed by making
either ia64_function_arg and ia64_function_arg_advance use FLOAT_TYPE_P
or ia64_function_value use FLOAT_MODE_P (TYPE_MODE (valtype)), but I
wonder whether it isn't generally dangerous to have this kind of
contradicting functionality (and in this light whether it is really a
good thing to tag those emulated vector modes as BLKmode).

Thanks, Jan


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]