Index: m3back/src/M3x86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/M3x86.m3,v retrieving revision 1.181 diff -u -r1.181 M3x86.m3 --- m3back/src/M3x86.m3 1 Jun 2010 18:23:03 -0000 1.181 +++ m3back/src/M3x86.m3 5 Jul 2010 13:08:23 -0000 @@ -211,6 +211,7 @@ load_procedure := load_procedure; load_static_link := load_static_link; comment := comment; + make_volatile := make_volatile; store_ordered := store_ordered; load_ordered := load_ordered; exchange := exchange; @@ -4312,6 +4313,9 @@ END; END Cmt; +PROCEDURE make_volatile (<*NOWARN*> u: U) = + BEGIN + END make_volatile; (*--------------------------------------------------------------- atomics ---*) Index: m3cc/gcc/gcc/m3cg/m3cg.h =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3cc/gcc/gcc/m3cg/m3cg.h,v retrieving revision 1.5 diff -u -r1.5 m3cg.h --- m3cc/gcc/gcc/m3cg/m3cg.h 9 Jan 2010 22:05:05 -0000 1.5 +++ m3cc/gcc/gcc/m3cg/m3cg.h 5 Jul 2010 13:08:23 -0000 @@ -165,6 +165,7 @@ M3CG_FETCH_AND_OR, /* 158 */ M3CG_FETCH_AND_AND, /* 159 */ M3CG_FETCH_AND_XOR, /* 160 */ + M3CG_MAKE_VOLATILE, /* 161 */ LAST_OPCODE } M3CG_opcode; static const char *M3CG_opnames[] = { @@ -329,6 +330,7 @@ "fetch_and_or", /* 158 */ "fetch_and_and", /* 159 */ "fetch_and_xor", /* 160 */ + "make_volatile", /* 161 */ 0 }; Index: m3cc/gcc/gcc/m3cg/parse.c =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3cc/gcc/gcc/m3cg/parse.c,v retrieving revision 1.215 diff -u -r1.215 parse.c --- m3cc/gcc/gcc/m3cg/parse.c 5 Jul 2010 12:12:11 -0000 1.215 +++ m3cc/gcc/gcc/m3cg/parse.c 5 Jul 2010 13:08:24 -0000 @@ -2118,11 +2118,33 @@ } static void +m3cg_make_volatile (void) +{ + tree block, decl; + + m3_set_volatize (); /* for later temporaries, locals */ + + /* make current locals volatile */ + for (block = current_block; + block != current_function_decl; + block = BLOCK_SUPERCONTEXT(block)) { + for (decl = BLOCK_VARS(block); decl; decl = TREE_CHAIN(decl)) { + m3_volatilize_decl(decl); + } + } + + /* and arguments */ + for (decl = DECL_ARGUMENTS(current_function_decl); + decl; decl = TREE_CHAIN(decl)) { + m3_volatilize_decl(decl); + } +} + +static void m3_call_direct (tree p, tree t) { tree call; tree *slot = (tree *)htab_find_slot (builtins, p, NO_INSERT); - int flags; if (slot) p = *slot; if (TREE_USED (p) == 0) { @@ -2138,23 +2160,8 @@ EXPR_PUSH (call); } CALL_POP (); - flags = call_expr_flags (call); - if (flags & ECF_RETURNS_TWICE) { - tree block, decl; - /* call to setjmp: make locals volatile */ - m3_set_volatize (); /* for later temporaries, locals */ - for (block = current_block; - block != current_function_decl; - block = BLOCK_SUPERCONTEXT(block)) { - for (decl = BLOCK_VARS(block); decl; decl = TREE_CHAIN(decl)) { - m3_volatilize_decl(decl); - } - } - /* and arguments */ - for (decl = DECL_ARGUMENTS(current_function_decl); - decl; decl = TREE_CHAIN(decl)) { - m3_volatilize_decl(decl); - } + if (call_expr_flags (call) & ECF_RETURNS_TWICE) { + m3cg_make_volatile (); /* call setjmp: make locals volatile */ } } @@ -5540,6 +5547,7 @@ { M3CG_FETCH_AND_OR, m3cg_fetch_and_or }, { M3CG_FETCH_AND_AND, m3cg_fetch_and_and }, { M3CG_FETCH_AND_XOR, m3cg_fetch_and_xor }, + { M3CG_MAKE_VOLATILE, m3cg_make_volatile }, { LAST_OPCODE, 0 } }; @@ -5692,7 +5700,7 @@ #endif /*flag_strict_aliasing = 0;*/ /* consider? */ /*flag_strict_overflow = 0;*/ /* consider? */ - flag_tree_ter = 0; /* fails to compile m3core CopySign */ + /*flag_tree_ter = 0;*/ /* fails to compile m3core CopySign */ /*flag_delete_null_pointer_checks = 0;*/ /* consider? */ /*flag_reorder_functions = 0;*/ /* consider? */ } Index: m3cggen/src/Main.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3cggen/src/Main.m3,v retrieving revision 1.4 diff -u -r1.4 Main.m3 --- m3cggen/src/Main.m3 11 Jan 2010 19:23:48 -0000 1.4 +++ m3cggen/src/Main.m3 5 Jul 2010 13:08:24 -0000 @@ -199,7 +199,8 @@ Desc { "fetch_and_sub", Op.fetch_and_sub }, Desc { "fetch_and_or", Op.fetch_and_or }, Desc { "fetch_and_and", Op.fetch_and_and }, - Desc { "fetch_and_xor", Op.fetch_and_xor } + Desc { "fetch_and_xor", Op.fetch_and_xor }, + Desc { "make_volatile", Op.make_volatile } }; PROCEDURE Out (a, b, c, d, e, f, g : TEXT := NIL) = Index: m3front/src/exprs/CastExpr.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3front/src/exprs/CastExpr.m3,v retrieving revision 1.9 diff -u -r1.9 CastExpr.m3 --- m3front/src/exprs/CastExpr.m3 5 Jul 2010 11:28:32 -0000 1.9 +++ m3front/src/exprs/CastExpr.m3 5 Jul 2010 13:08:24 -0000 @@ -10,6 +10,7 @@ IMPORT M3Buf, CG, Expr, ExprRep, Type, Error, OpenArrayType; IMPORT M3, M3ID, M3RT, Target, TInt; +FROM Target IMPORT FloatType; TYPE Kind = { @@ -394,7 +395,7 @@ u := Expr.TypeOf (e); t := p.tipe; sz, t_align, u_align, z_align: INTEGER; - u_cg: CG.Type; + u_cg, t_cg: CG.Type; u_info, t_info: Type.Info; BEGIN u := Type.CheckInfo (u, u_info); @@ -403,9 +404,20 @@ u_align := u_info.alignment; z_align := MAX (t_align, u_align); u_cg := u_info.stk_type; + t_cg := t_info.stk_type; sz := u_info.size; Type.Compile (t); Type.Compile (u); + +(* Inhibit some optimization that causes compilation to fail. e.g. m3core: +../src/float/IEEE/RealFloat.m3: In function 'RealFloat__CopySign': +../src/float/IEEE/RealFloat.m3:96: internal compiler error: in convert_move, at expr.c:371 +../src/float/IEEE/LongFloat.m3: In function 'LongFloat__CopySign': +../src/float/IEEE/LongFloat.m3:116: internal compiler error: in convert_move, at expr.c:371 +*) + IF p.kind = Kind.D_to_S AND FloatType[u_cg] # FloatType[t_cg] THEN + CG.Make_volatile (); + END; CASE p.kind OF | Kind.Noop, Index: m3front/src/misc/CG.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3front/src/misc/CG.i3,v retrieving revision 1.11 diff -u -r1.11 CG.i3 --- m3front/src/misc/CG.i3 4 Feb 2010 02:11:30 -0000 1.11 +++ m3front/src/misc/CG.i3 5 Jul 2010 13:08:24 -0000 @@ -681,6 +681,10 @@ PROCEDURE Comment (offset: INTEGER; is_const: BOOLEAN; a, b, c, d: TEXT := NIL); (* annotate the output with a&b&c&d as a comment *) +PROCEDURE Make_volatile (); +(* make locals, parameters, temporaries in current function volatile; + * inhibits optimization; use sparingly *) + (*--------------------------------------------------------------- atomics ---*) PROCEDURE Store_ordered (t: MType; order: MemoryOrder); Index: m3front/src/misc/CG.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3front/src/misc/CG.m3,v retrieving revision 1.37 diff -u -r1.37 CG.m3 --- m3front/src/misc/CG.m3 28 Jun 2010 01:30:29 -0000 1.37 +++ m3front/src/misc/CG.m3 5 Jul 2010 13:08:24 -0000 @@ -2713,6 +2713,17 @@ SPush (StackType[t]); END Fetch_and_op; +(*---------------------------------------------------------------------------*) + +PROCEDURE Make_volatile () = +(* Mark all locals in current function as volatile. + * This is a workaround to selectively inhibit optimization. + * Use sparingly. + *) + BEGIN + cg.make_volatile (); + END Make_volatile; + (*-------------------------------------------------------------- internal ---*) PROCEDURE FixAlign (a: Alignment): Alignment = Index: m3middle/src/M3CG.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG.m3,v retrieving revision 1.6 diff -u -r1.6 M3CG.m3 --- m3middle/src/M3CG.m3 11 Mar 2010 05:42:03 -0000 1.6 +++ m3middle/src/M3CG.m3 5 Jul 2010 13:08:24 -0000 @@ -147,6 +147,7 @@ load_procedure := load_procedure; load_static_link := load_static_link; comment := comment; + make_volatile := make_volatile; store_ordered := store_ordered; load_ordered := load_ordered; exchange := exchange; @@ -913,6 +914,11 @@ xx.child.comment (a, b, c, d); END comment; +PROCEDURE make_volatile (xx: T) = + BEGIN + xx.child.make_volatile (); + END make_volatile; + (*--------------------------------------------------------------- atomics ---*) PROCEDURE store_ordered (xx: T; t: ZType; u: MType; order: MemoryOrder) = Index: m3middle/src/M3CG_BinRd.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinRd.m3,v retrieving revision 1.11 diff -u -r1.11 M3CG_BinRd.m3 --- m3middle/src/M3CG_BinRd.m3 12 Mar 2010 11:07:36 -0000 1.11 +++ m3middle/src/M3CG_BinRd.m3 5 Jul 2010 13:08:24 -0000 @@ -198,7 +198,8 @@ Cmd {Bop.fetch_and_sub, fetch_and_sub}, Cmd {Bop.fetch_and_or, fetch_and_or}, Cmd {Bop.fetch_and_and, fetch_and_and}, - Cmd {Bop.fetch_and_xor, fetch_and_xor} + Cmd {Bop.fetch_and_xor, fetch_and_xor}, + Cmd {Bop.make_volatile, make_volatile} }; PROCEDURE Inhale (rd: Rd.T; cg: M3CG.T) = @@ -1631,6 +1632,11 @@ s.cg.comment (x); END comment; +PROCEDURE make_volatile (VAR s: State) = + BEGIN + s.cg.make_volatile (); + END make_volatile; + (*--------------------------------------------------------------- atomics ---*) PROCEDURE store_ordered (VAR s: State) = Index: m3middle/src/M3CG_BinWr.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinWr.m3,v retrieving revision 1.14 diff -u -r1.14 M3CG_BinWr.m3 --- m3middle/src/M3CG_BinWr.m3 11 Mar 2010 05:42:04 -0000 1.14 +++ m3middle/src/M3CG_BinWr.m3 5 Jul 2010 13:08:24 -0000 @@ -173,6 +173,7 @@ load_procedure := load_procedure; load_static_link := load_static_link; comment := comment; + make_volatile := make_volatile; store_ordered := store_ordered; load_ordered := load_ordered; exchange := exchange; @@ -1607,6 +1608,11 @@ Txt (u, msg); END comment; +PROCEDURE make_volatile (u: U) = + BEGIN + Cmd (u, Bop.make_volatile); + END make_volatile; + (*--------------------------------------------------------------- atomics ---*) PROCEDURE store_ordered (u: U; t: ZType; z: MType; order: MemoryOrder) = Index: m3middle/src/M3CG_Binary.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Binary.i3,v retrieving revision 1.4 diff -u -r1.4 M3CG_Binary.i3 --- m3middle/src/M3CG_Binary.i3 11 Jan 2010 22:04:48 -0000 1.4 +++ m3middle/src/M3CG_Binary.i3 5 Jul 2010 13:08:25 -0000 @@ -38,7 +38,8 @@ call_indirect, pop_param, pop_struct, pop_static_link, load_procedure, load_static_link, comment, store_ordered, load_ordered, exchange, compare_exchange, fence, - fetch_and_add, fetch_and_sub, fetch_and_or, fetch_and_and, fetch_and_xor + fetch_and_add, fetch_and_sub, fetch_and_or, fetch_and_and, fetch_and_xor, + make_volatile }; (* Integers are encoded as sequences of unsigned bytes, [0..255]. Index: m3middle/src/M3CG_Ops.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Ops.i3,v retrieving revision 1.8 diff -u -r1.8 M3CG_Ops.i3 --- m3middle/src/M3CG_Ops.i3 11 Mar 2010 05:42:04 -0000 1.8 +++ m3middle/src/M3CG_Ops.i3 5 Jul 2010 13:08:25 -0000 @@ -611,6 +611,11 @@ (* annotate the output with a&b&c&d as a comment. Note that any of a,b,c or d may be NIL. *) +make_volatile (); +(* Mark locals, parameters, temporaries in current function volatile, + * to inhibit optimization; use sparingly. + *) + (*--------------------------------------------------------------- atomics ---*) (* These all operate atomically and affect memory as per "o". *) @@ -641,6 +646,8 @@ Mem [s1.A].t := tmp op s0.u; s1.u := tmp; pop *) +(*---------------------------------------------------------------------------*) + END; (* TYPE Public *) END M3CG_Ops. Index: m3middle/src/M3CG_Rd.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Rd.m3,v retrieving revision 1.9 diff -u -r1.9 M3CG_Rd.m3 --- m3middle/src/M3CG_Rd.m3 12 Mar 2010 11:14:58 -0000 1.9 +++ m3middle/src/M3CG_Rd.m3 5 Jul 2010 13:08:25 -0000 @@ -39,7 +39,7 @@ END; CONST - CmdMap = ARRAY [0..161] OF Cmd { + CmdMap = ARRAY [0..162] OF Cmd { Cmd {"begin_unit", begin_unit}, Cmd {"end_unit", end_unit}, Cmd {"import_unit", import_unit}, @@ -201,7 +201,8 @@ Cmd {"fetch_and_sub", fetch_and_sub}, Cmd {"fetch_and_or", fetch_and_or}, Cmd {"fetch_and_and", fetch_and_and}, - Cmd {"fetch_and_xor", fetch_and_xor} + Cmd {"fetch_and_xor", fetch_and_xor}, + Cmd {"make_volatile", make_volatile} }; VAR @@ -1758,6 +1759,11 @@ s.cg.comment (x); END comment; +PROCEDURE make_volatile (VAR s: State) = + BEGIN + s.cg.make_volatile (); + END make_volatile; + (*--------------------------------------------------------------- atomics ---*) PROCEDURE store_ordered (VAR s: State) = Index: m3middle/src/M3CG_Wr.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Wr.m3,v retrieving revision 1.12 diff -u -r1.12 M3CG_Wr.m3 --- m3middle/src/M3CG_Wr.m3 12 Mar 2010 11:07:36 -0000 1.12 +++ m3middle/src/M3CG_Wr.m3 5 Jul 2010 13:08:25 -0000 @@ -175,6 +175,7 @@ load_procedure := load_procedure; load_static_link := load_static_link; comment := comment; + make_volatile := make_volatile; store_ordered := store_ordered; load_ordered := load_ordered; exchange := exchange; @@ -1753,6 +1754,11 @@ END; END Cmt; +PROCEDURE make_volatile (u: U) = + BEGIN + Cmd (u, "make_volatile"); + END make_volatile; + (*--------------------------------------------------------------- atomics ---*) PROCEDURE store_ordered (u: U; t: ZType; z: MType; order: MemoryOrder) =