aboutsummaryrefslogtreecommitdiff
path: root/gcc/m2/gm2-gcc
diff options
context:
space:
mode:
authorGaius Mulley <gaiusmod2@gmail.com>2025-03-25 02:08:05 +0000
committerGaius Mulley <gaiusmod2@gmail.com>2025-03-25 02:08:05 +0000
commit127a24ede2f82eafecb5eb142e21dbda38d06c18 (patch)
treeb0ac917ddd328c515c66aedcde0f6f0b863a4d3b /gcc/m2/gm2-gcc
parent90ab42f92b876b74056db297557e8c3d51cdd773 (diff)
downloadgcc-127a24ede2f82eafecb5eb142e21dbda38d06c18.zip
gcc-127a24ede2f82eafecb5eb142e21dbda38d06c18.tar.gz
gcc-127a24ede2f82eafecb5eb142e21dbda38d06c18.tar.bz2
PR modula2/119449 MAX of SYSTEM.REAL64 cause an ICE
This bugfix implements MAX(REAL64) and MIN(REAL64) etc for REAL64, REAL96 and REAL128. gcc/m2/ChangeLog: PR modula2/119449 * gm2-compiler/M2GCCDeclare.def (TryDeclareType): Remove tokenno parameter. * gm2-compiler/M2GCCDeclare.mod (TryDeclareType): Ditto. * gm2-compiler/M2GenGCC.mod (FoldTBitsize): Remove op2 and rename op1 as res and op3 as type. (FoldStandardFunction): Call FoldTBitsize omitting op2. * gm2-compiler/M2Quads.mod (GetTypeMin): Rewrite. (GetTypeMinLower): New procedure function. (GetTypeMax): Rewrite. (GetTypeMaxLower): New procedure function. * gm2-compiler/M2Range.mod (CheckCancelled): Comment out. * gm2-compiler/M2System.mod (CreateMinMaxFor): Add realtype parameter. (MapType): Rewrite to use realtype. (CreateType): Ditto. (AttemptToCreateType): Ditto. (MakeFixedSizedTypes): Add realtype boolean. (InitPIMTypes): Ditto. (InitISOTypes): Ditto. (MakeExtraSystemTypes): Ditto. * gm2-gcc/m2pp.cc (m2pp_nop_expr): Remove code. * gm2-gcc/m2type.cc (IsGccRealType): New function. (m2type_GetMinFrom): Rewrite. (m2type_GetMaxFrom): Ditto. (do_min_real): Declare static. (do_max_real): Declare static. gcc/testsuite/ChangeLog: PR modula2/119449 * gm2/pim/pass/minmaxreal.mod: New test. * gm2/pim/pass/minmaxreal2.mod: New test. * gm2/pim/pass/minmaxreal3.mod: New test. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
Diffstat (limited to 'gcc/m2/gm2-gcc')
-rw-r--r--gcc/m2/gm2-gcc/m2pp.cc1
-rw-r--r--gcc/m2/gm2-gcc/m2type.cc29
2 files changed, 19 insertions, 11 deletions
diff --git a/gcc/m2/gm2-gcc/m2pp.cc b/gcc/m2/gm2-gcc/m2pp.cc
index 6ec8aaa..7d4adb8 100644
--- a/gcc/m2/gm2-gcc/m2pp.cc
+++ b/gcc/m2/gm2-gcc/m2pp.cc
@@ -2367,7 +2367,6 @@ m2pp_asm_expr (pretty *state, tree node)
static void
m2pp_nop_expr (pretty *state, tree t)
{
- enum tree_code code = TREE_CODE (t);
m2pp_begin (state);
m2pp_print (state, "(* NOP for debug location *)");
m2pp_needspace (state);
diff --git a/gcc/m2/gm2-gcc/m2type.cc b/gcc/m2/gm2-gcc/m2type.cc
index e82857d..e486f12 100644
--- a/gcc/m2/gm2-gcc/m2type.cc
+++ b/gcc/m2/gm2-gcc/m2type.cc
@@ -1891,6 +1891,22 @@ m2type_GetDefaultType (location_t location, char *name, tree type)
return id;
}
+/* IsGccRealType return true if type is a GCC realtype. */
+
+static
+bool
+IsGccRealType (tree type)
+{
+ return (type == m2_real_type_node || type == m2type_GetRealType () ||
+ type == m2_long_real_type_node || type == m2type_GetLongRealType () ||
+ type == m2_short_real_type_node || type == m2type_GetShortRealType () ||
+ type == m2type_GetM2Real32 () ||
+ type == m2type_GetM2Real64 () ||
+ type == m2type_GetM2Real96 () ||
+ type == m2type_GetM2Real128 ());
+}
+
+static
tree
do_min_real (tree type)
{
@@ -1911,11 +1927,7 @@ m2type_GetMinFrom (location_t location, tree type)
{
m2assert_AssertLocation (location);
- if (type == m2_real_type_node || type == m2type_GetRealType ())
- return do_min_real (type);
- if (type == m2_long_real_type_node || type == m2type_GetLongRealType ())
- return do_min_real (type);
- if (type == m2_short_real_type_node || type == m2type_GetShortRealType ())
+ if (IsGccRealType (type))
return do_min_real (type);
if (type == ptr_type_node)
return m2expr_GetPointerZero (location);
@@ -1923,6 +1935,7 @@ m2type_GetMinFrom (location_t location, tree type)
return TYPE_MIN_VALUE (m2tree_skip_type_decl (type));
}
+static
tree
do_max_real (tree type)
{
@@ -1943,11 +1956,7 @@ m2type_GetMaxFrom (location_t location, tree type)
{
m2assert_AssertLocation (location);
- if (type == m2_real_type_node || type == m2type_GetRealType ())
- return do_max_real (type);
- if (type == m2_long_real_type_node || type == m2type_GetLongRealType ())
- return do_max_real (type);
- if (type == m2_short_real_type_node || type == m2type_GetShortRealType ())
+ if (IsGccRealType (type))
return do_max_real (type);
if (type == ptr_type_node)
return fold (m2expr_BuildSub (location, m2expr_GetPointerZero (location),