Patch for complex -> component mode simplification
Steve Ellcey
sje@cup.hp.com
Tue Nov 19 15:29:00 GMT 2002
I found 5 places in GCC where we get the component (unit) mode of a
complex type using GET_MODE_UNIT_SIZE and mode_for_size. It is much
simpler (and faster) to use the GET_MODE_INNER macro. I suspect that
this macro did not exist when the code in question was first written.
Tested on HP-UX (IA64 and PA).
Steve Ellcey
sje@cup.hp.com
2002-11-19 Steve Ellcey <sje@cup.hp.com>
* emit-rtl.c (gen_reg_rtx): Simplify mapping of Complex type
to component type using GET_MODE_INNER.
* expr.c (emit_move_insn_1): Ditto.
* optabs.c (expand_binop): Ditto.
(expand_unop): Ditto.
(expand_complex_abs): Ditto.
*** gcc.orig/gcc/emit-rtl.c Tue Nov 19 15:08:59 2002
--- gcc/gcc/emit-rtl.c Tue Nov 19 15:10:16 2002
*************** gen_reg_rtx (mode)
*** 802,813 ****
which makes much better code. Besides, allocating DCmode
pseudos overstrains reload on some machines like the 386. */
rtx realpart, imagpart;
! int size = GET_MODE_UNIT_SIZE (mode);
! enum machine_mode partmode
! = mode_for_size (size * BITS_PER_UNIT,
! (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
! ? MODE_FLOAT : MODE_INT),
! 0);
realpart = gen_reg_rtx (partmode);
imagpart = gen_reg_rtx (partmode);
--- 802,808 ----
which makes much better code. Besides, allocating DCmode
pseudos overstrains reload on some machines like the 386. */
rtx realpart, imagpart;
! enum machine_mode partmode = GET_MODE_INNER (mode);
realpart = gen_reg_rtx (partmode);
imagpart = gen_reg_rtx (partmode);
*** gcc.orig/gcc/expr.c Tue Nov 19 15:11:01 2002
--- gcc/gcc/expr.c Tue Nov 19 15:11:55 2002
*************** emit_move_insn_1 (x, y)
*** 3152,3162 ****
/* Expand complex moves by moving real part and imag part, if possible. */
else if ((class == MODE_COMPLEX_FLOAT || class == MODE_COMPLEX_INT)
! && BLKmode != (submode = mode_for_size ((GET_MODE_UNIT_SIZE (mode)
! * BITS_PER_UNIT),
! (class == MODE_COMPLEX_INT
! ? MODE_INT : MODE_FLOAT),
! 0))
&& (mov_optab->handlers[(int) submode].insn_code
!= CODE_FOR_nothing))
{
--- 3152,3158 ----
/* Expand complex moves by moving real part and imag part, if possible. */
else if ((class == MODE_COMPLEX_FLOAT || class == MODE_COMPLEX_INT)
! && BLKmode != (submode = GET_MODE_INNER (mode))
&& (mov_optab->handlers[(int) submode].insn_code
!= CODE_FOR_nothing))
{
*** gcc.orig/gcc/optabs.c Tue Nov 19 15:12:21 2002
--- gcc/gcc/optabs.c Tue Nov 19 15:14:25 2002
*************** expand_binop (mode, binoptab, op0, op1,
*** 1531,1540 ****
int ok = 0;
/* Find the correct mode for the real and imaginary parts */
! enum machine_mode submode
! = mode_for_size (GET_MODE_UNIT_SIZE (mode) * BITS_PER_UNIT,
! class == MODE_COMPLEX_INT ? MODE_INT : MODE_FLOAT,
! 0);
if (submode == BLKmode)
abort ();
--- 1531,1537 ----
int ok = 0;
/* Find the correct mode for the real and imaginary parts */
! enum machine_mode submode = GET_MODE_INNER(mode);
if (submode == BLKmode)
abort ();
*************** expand_unop (mode, unoptab, op0, target,
*** 2484,2493 ****
rtx seq;
/* Find the correct mode for the real and imaginary parts */
! enum machine_mode submode
! = mode_for_size (GET_MODE_UNIT_SIZE (mode) * BITS_PER_UNIT,
! class == MODE_COMPLEX_INT ? MODE_INT : MODE_FLOAT,
! 0);
if (submode == BLKmode)
abort ();
--- 2481,2487 ----
rtx seq;
/* Find the correct mode for the real and imaginary parts */
! enum machine_mode submode = GET_MODE_INNER (mode);
if (submode == BLKmode)
abort ();
*************** expand_complex_abs (mode, op0, target, u
*** 2731,2740 ****
optab this_abs_optab;
/* Find the correct mode for the real and imaginary parts. */
! enum machine_mode submode
! = mode_for_size (GET_MODE_UNIT_SIZE (mode) * BITS_PER_UNIT,
! class == MODE_COMPLEX_INT ? MODE_INT : MODE_FLOAT,
! 0);
if (submode == BLKmode)
abort ();
--- 2725,2731 ----
optab this_abs_optab;
/* Find the correct mode for the real and imaginary parts. */
! enum machine_mode submode = GET_MODE_INNER (mode);
if (submode == BLKmode)
abort ();
More information about the Gcc-patches
mailing list