[patch] Make gcc work with Cray T3E type sizes
Roman Lechtchinsky
rl@cs.tu-berlin.de
Thu Jun 28 04:24:00 GMT 2001
Hi,
on the Cray T3E, short is 32 bits and int is 64 bits. This patch fixes two
functions which don't work correctly there.
In signed_or_unsigned_type, we only handle types which correspond to a
native C type. On the T3E, there is no such type for HImode. This patch
adds checks for int?I_type_node, similar to signed_type and unsigned_type.
In target_negative, the definition of the union used for representing
64-bit doubles assumes that int is 32 bits. This patch fixes this.
Additionaly, it fixes a type error in push_reload which Cray CC chokes on.
In the recursive call, NULL_RTX is passed to a parameter of type rtx *.
Bootstrapped on sparc-sun-solaris2.7 (as far as it gets - it still fails
when building libstdc++, but this isn't related to this patch) with
http://gcc.gnu.org/ml/gcc-patches/2001-06/msg01619.html .
Bye
Roman
2001-06-28 Roman Lechtchinsky <rl@cs.tu-berlin.de>
* c-common.c (signed_or_unsigned_type): Handle machine mode types
which do not correspond to a C type.
* fold-const.c (target_negative): Make it work with 64 bit ints.
* reload.c (push_reload): Fix a type error in a call to push_reload.
Index: c-common.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-common.c,v
retrieving revision 1.238
diff -c -3 -p -r1.238 c-common.c
*** c-common.c 2001/06/22 19:18:56 1.238
--- c-common.c 2001/06/28 10:30:06
*************** signed_or_unsigned_type (unsignedp, type
*** 2074,2079 ****
--- 2074,2092 ----
if (TYPE_PRECISION (type) == TYPE_PRECISION (widest_integer_literal_type_node))
return (unsignedp ? widest_unsigned_literal_type_node
: widest_integer_literal_type_node);
+ #if HOST_BITS_PER_WIDE_INT >= 64
+ if (TYPE_PRECISION (type) == TYPE_PRECISION (intTI_type_node))
+ return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
+ #endif
+ if (TYPE_PRECISION (type) == TYPE_PRECISION (intDI_type_node))
+ return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
+ if (TYPE_PRECISION (type) == TYPE_PRECISION (intSI_type_node))
+ return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
+ if (TYPE_PRECISION (type) == TYPE_PRECISION (intHI_type_node))
+ return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
+ if (TYPE_PRECISION (type) == TYPE_PRECISION (intQI_type_node))
+ return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
+
return type;
}
Index: fold-const.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/fold-const.c,v
retrieving revision 1.158
diff -c -3 -p -r1.158 fold-const.c
*** fold-const.c 2001/06/04 13:21:38 1.158
--- fold-const.c 2001/06/28 10:30:09
*************** target_negative (x)
*** 899,908 ****
unsigned sign : 1;
unsigned exponent : 11;
unsigned mantissa1 : 20;
! unsigned mantissa2;
} little_endian;
struct {
! unsigned mantissa2;
unsigned mantissa1 : 20;
unsigned exponent : 11;
unsigned sign : 1;
--- 899,908 ----
unsigned sign : 1;
unsigned exponent : 11;
unsigned mantissa1 : 20;
! unsigned mantissa2 : 32;
} little_endian;
struct {
! unsigned mantissa2 : 32;
unsigned mantissa1 : 20;
unsigned exponent : 11;
unsigned sign : 1;
Index: reload.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/reload.c,v
retrieving revision 1.147
diff -c -3 -p -r1.147 reload.c
*** reload.c 2001/06/04 01:58:24 1.147
--- reload.c 2001/06/28 10:30:12
*************** push_reload (in, out, inloc, outloc, cla
*** 1046,1052 ****
order as the reloads. Thus if the outer reload is also of type
RELOAD_OTHER, we are guaranteed that this inner reload will be
output before the outer reload. */
! push_reload (SUBREG_REG (in), NULL_RTX, &SUBREG_REG (in), NULL_RTX,
in_class, VOIDmode, VOIDmode, 0, 0, opnum, type);
dont_remove_subreg = 1;
}
--- 1046,1052 ----
order as the reloads. Thus if the outer reload is also of type
RELOAD_OTHER, we are guaranteed that this inner reload will be
output before the outer reload. */
! push_reload (SUBREG_REG (in), NULL_RTX, &SUBREG_REG (in), (rtx *)0,
in_class, VOIDmode, VOIDmode, 0, 0, opnum, type);
dont_remove_subreg = 1;
}
More information about the Gcc-patches
mailing list