--- gcc/config/i370/mvs.h 2018/04/24 18:23:28 1.1.1.2 +++ gcc/config/i370/mvs.h 2018/04/24 18:31:10 1.1.1.3 @@ -1,7 +1,7 @@ /* Definitions of target machine for GNU compiler. System/370 version. - Copyright (C) 1989, 1993 Free Software Foundation, Inc. + Copyright (C) 1989, 1993, 1995 Free Software Foundation, Inc. Contributed by Jan Stein (jan@cd.chalmers.se). - Modified for C/370 MVS by Dave Pitts (pitts@mcdata.com) + Modified for C/370 MVS by Dave Pitts (dpitts@nyx.cs.du.edu) This file is part of GNU CC. @@ -17,7 +17,8 @@ GNU General Public License for more deta You should have received a copy of the GNU General Public License along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ #ifdef sun #include @@ -45,7 +46,7 @@ extern int mvs_page_num, function_base_p /* True if a label has been emitted. */ -extern int mvs_label_emited; +extern int mvs_label_emitted; /* The name of the current function. */ @@ -59,7 +60,7 @@ extern int mvs_function_name_length; extern int current_function_outgoing_args_size; -/* Compile using char instructins (mvc, nc, oc, xc). On 4341 use this since +/* Compile using char instructions (mvc, nc, oc, xc). On 4341 use this since these are more than twice as fast as load-op-store. On 3090 don't use this since load-op-store is much faster. */ @@ -79,6 +80,13 @@ extern int current_function_outgoing_arg { "no-char-instructions", -1}, \ { "", TARGET_DEFAULT} } +/* To use IBM supplied macro function prologue and epilogue, define the + following to 1. Should only be needed if IBM changes the definition + of their prologue and epilogue. */ + +#define MACROPROLOGUE 0 +#define MACROEPILOGUE 0 + /* Target machine storage layout */ /* Define this if most significant bit is lowest numbered in instructions @@ -94,7 +102,7 @@ extern int current_function_outgoing_arg #define WORDS_BIG_ENDIAN 1 -/* Number of bits in an addressible storage unit. */ +/* Number of bits in an addressable storage unit. */ #define BITS_PER_UNIT 8 @@ -447,7 +455,7 @@ enum reg_class /* Define if returning from a function call automatically pops the arguments described by the number-of-args field in the call. */ -#define RETURN_POPS_ARGS(FUNTYPE, STACKSIZE) 0 +#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0 /* Define how to find the value returned by a function. VALTYPE is the data type of the value (as a tree). @@ -478,6 +486,21 @@ enum reg_class /* This macro generates the assembly code for function entry. All of the C/370 environment is preserved. */ +#if MACROPROLOGUE == 1 +#define FUNCTION_PROLOGUE(FILE, LSIZE) \ +{ \ + fprintf (FILE, "\tEDCPRLG USRDSAL=%d,BASEREG=%d\n", \ + STACK_POINTER_OFFSET + LSIZE + \ + current_function_outgoing_args_size, BASE_REGISTER); \ + fprintf (FILE, "PG%d\tEQU\t*\n", mvs_page_num ); \ + fprintf (FILE, "\tLR\t11,1\n"); \ + fprintf (FILE, "\tL\t%d,=A(PGT%d)\n", PAGE_REGISTER, mvs_page_num); \ + mvs_page_code = 6; \ + mvs_page_lit = 4; \ + mvs_check_page (FILE, 0, 0); \ + function_base_page = mvs_page_num; \ +} +#else /* MACROPROLOGUE != 1 */ #define FUNCTION_PROLOGUE(FILE, LSIZE) \ { \ static int function_label_index = 1; \ @@ -498,33 +521,39 @@ enum reg_class function_minute = function_time->tm_min; \ function_second = function_time->tm_sec; \ } \ + fprintf (FILE, "$DSD%03d\tDSECT\n", function_label_index); \ + fprintf (FILE, "\tDS\tD\n"); \ + fprintf (FILE, "\tDS\tCL(120+%d)\n", STACK_POINTER_OFFSET + LSIZE \ + + current_function_outgoing_args_size); \ + fprintf (FILE, "\tORG\t$DSD%03d\n", function_label_index); \ + fprintf (FILE, "\tDS\tCL(120+8)\n"); \ + fprintf (FILE, "\tORG\n"); \ + fprintf (FILE, "\tDS\t0D\n"); \ + fprintf (FILE, "$DSL%03d\tEQU\t*-$DSD%03d-8\n", function_label_index, \ + function_label_index); \ + fprintf (FILE, "\tDS\t0H\n"); \ + assemble_name (FILE, mvs_function_name); \ + fprintf (FILE, "\tCSECT\n"); \ fprintf (FILE, "\tUSING\t*,15\n"); \ fprintf (FILE, "\tB\tFPL%03d\n", function_label_index); \ fprintf (FILE, "\tDC\tAL1(FPL%03d+4-*)\n", function_label_index + 1); \ - fprintf (FILE, "\tDC\tX'CE',X'A0',X'10'\n"); \ - fprintf (FILE, "\tDC\tA($PPA2)\n"); \ - fprintf (FILE, "\tDC\tF'%d'\n", 0); \ - fprintf (FILE, "\tDC\tF'%d'\n", STACK_POINTER_OFFSET + LSIZE \ - + current_function_outgoing_args_size); \ + fprintf (FILE, "\tDC\tX'CE',X'A0',AL1(16)\n"); \ + fprintf (FILE, "\tDC\tAL4($PPA%03d)\n",function_label_index); \ + fprintf (FILE, "\tDC\tAL4(0)\n"); \ + fprintf (FILE, "\tDC\tAL4($DSL%03d)\n", function_label_index); \ fprintf (FILE, "FPL%03d\tEQU\t*\n", function_label_index + 1); \ fprintf (FILE, "\tDC\tAL2(%d),C'%s'\n", strlen (mvs_function_name), \ mvs_function_name); \ - fprintf (FILE, "\tDS\t0F\n"); \ - if (!function_first) \ - { \ - fprintf (FILE, "$PPA2\tEQU\t*\n"); \ - fprintf (FILE, "\tDC\tX'03',X'00',X'33',X'00'\n"); \ - fprintf (FILE, "\tDC\tV(CEESTART),A(0)\n"); \ - fprintf (FILE, "\tDC\tA($TIMES)\n"); \ - fprintf (FILE, "\tDS\t0F\n"); \ - fprintf (FILE, "$TIMES\tEQU\t*\n"); \ - fprintf (FILE, "\tDC\tCL4'%d',CL4'%02d%02d',CL6'%02d%02d00'\n", \ - function_year, function_month, function_day, \ - function_hour, function_minute, function_second); \ - fprintf (FILE, "\tDC\tCL2'01',CL4'0100'\n"); \ - } \ - fprintf (FILE, "\tDS\t0H\n"); \ - fprintf (FILE, "FPL%03d\tEQU\t*\n", function_label_index); \ + fprintf (FILE, "$PPA%03d\tDS\t0F\n", function_label_index); \ + fprintf (FILE, "\tDC\tX'03',X'00',X'33',X'00'\n"); \ + fprintf (FILE, "\tDC\tV(CEESTART),A(0)\n"); \ + fprintf (FILE, "\tDC\tA($TIM%03d)\n", function_label_index); \ + fprintf (FILE, "$TIM%03d\tDS\t0F\n", function_label_index); \ + fprintf (FILE, "\tDC\tCL4'%d',CL4'%02d%02d',CL6'%02d%02d00'\n", \ + function_year, function_month, function_day, \ + function_hour, function_minute, function_second); \ + fprintf (FILE, "\tDC\tCL2'01',CL4'0100'\n"); \ + fprintf (FILE, "FPL%03d\tDS\t0H\n", function_label_index); \ fprintf (FILE, "\tSTM\t14,12,12(13)\n"); \ fprintf (FILE, "\tL\t2,76(,13)\n"); \ fprintf (FILE, "\tL\t0,16(,15)\n"); \ @@ -536,13 +565,14 @@ enum reg_class fprintf (FILE, "\tL\t15,72(,13)\n"); \ fprintf (FILE, "\tSTM\t15,0,72(2)\n"); \ fprintf (FILE, "\tMVI\t0(2),X'10'\n"); \ + fprintf (FILE, "\tST\t2,8(,13)\n "); \ fprintf (FILE, "\tST\t13,4(,2)\n "); \ fprintf (FILE, "\tLR\t13,2\n"); \ - fprintf (FILE, "\tLR\t11,1\n"); \ fprintf (FILE, "\tDROP\t15\n"); \ fprintf (FILE, "\tBALR\t%d,0\n", BASE_REGISTER); \ fprintf (FILE, "PG%d\tEQU\t*\n", mvs_page_num ); \ fprintf (FILE, "\tUSING\t*,%d\n", BASE_REGISTER); \ + fprintf (FILE, "\tLR\t11,1\n"); \ fprintf (FILE, "\tL\t%d,=A(PGT%d)\n", PAGE_REGISTER, mvs_page_num); \ mvs_page_code = 4; \ mvs_page_lit = 4; \ @@ -551,6 +581,7 @@ enum reg_class function_first = 1; \ function_label_index += 2; \ } +#endif /* MACROPROLOGUE */ #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ { \ @@ -574,7 +605,7 @@ enum reg_class strcpy (mvs_function_name, "gccmain"); \ else \ strcpy (mvs_function_name, NAME); \ - fprintf (FILE, "\tDS\t0H\n"); \ + fprintf (FILE, "\tDS\t0F\n"); \ assemble_name (FILE, mvs_function_name); \ fputs ("\tCSECT\n", FILE); \ } @@ -589,6 +620,23 @@ enum reg_class of alloca; we also take advantage of it to omit stack adjustments before returning. */ +#if MACROEPILOGUE == 1 +#define FUNCTION_EPILOGUE(FILE, LSIZE) \ +{ \ + int i; \ + check_label_emit(); \ + mvs_check_page (FILE,14,0); \ + fprintf (FILE, "\tEDCEPIL\n"); \ + mvs_page_num++; \ + fprintf (FILE, "\tDS\t0F\n" ); \ + fprintf (FILE, "\tLTORG\n"); \ + fprintf (FILE, "\tDS\t0F\n"); \ + fprintf (FILE, "PGT%d\tEQU\t*\n", function_base_page); \ + mvs_free_label(); \ + for ( i = function_base_page; i < mvs_page_num; i++ ) \ + fprintf (FILE, "\tDC\tA(PG%d)\n", i); \ +} +#else /* MACROEPILOGUE != 1 */ #define FUNCTION_EPILOGUE(FILE, LSIZE) \ { \ int i; \ @@ -610,6 +658,8 @@ enum reg_class for ( i = function_base_page; i < mvs_page_num; i++ ) \ fprintf (FILE, "\tDC\tA(PG%d)\n", i); \ } +#endif /* MACROEPILOGUE */ + /* Output assembler code for a block containing the constant parts of a trampoline, leaving space for the variable parts. @@ -655,7 +705,7 @@ enum reg_class for profiling a function entry. */ #define FUNCTION_PROFILER(FILE, LABELNO) \ - fprintf (FILE, "Error: No profiling availble.\n") + fprintf (FILE, "Error: No profiling available.\n") /* Define EXIT_IGNORE_STACK if, when returning from a function, the stack pointer does not matter (provided there is a frame pointer). */ @@ -1062,7 +1112,7 @@ enum reg_class if (!strcmp (PREFIX,"L")) \ { \ mvs_add_label(NUM); \ - mvs_label_emited = 1; \ + mvs_label_emitted = 1; \ } \ fprintf (FILE, "%s%d\tEQU\t*\n", PREFIX, NUM); \ } @@ -1132,9 +1182,7 @@ enum reg_class #define ASM_OUTPUT_SHORT(FILE, EXP) \ { \ - fprintf (FILE, "\tDC\tH'"); \ - output_addr_const (FILE, EXP); \ - fprintf (FILE, "'\n"); \ + fprintf (FILE, "\tDC\tX'%04X'\n", INTVAL(EXP) & 0xFFFF); \ } /* This outputs a byte sized integer. */ @@ -1169,7 +1217,7 @@ enum reg_class else \ { \ if (j % MVS_ASCII_TEXT_LENGTH == 0) \ - fprintf (FILE, "\tDC\tC'%c", c); \ + fprintf (FILE, "\tDC\tC'"); \ if ( c == '\'' ) \ fprintf (FILE, "%c%c", c, c); \ else \ @@ -1323,8 +1371,8 @@ enum reg_class fprintf (FILE, "%d", (INTVAL (X) << 16) >> 16); \ else if (CODE == 'H') \ { \ - mvs_page_lit += 4; \ - fprintf (FILE, "=F'%d'", (INTVAL (X) << 16) >> 16); \ + mvs_page_lit += 2; \ + fprintf (FILE, "=H'%d'", (INTVAL (X) << 16) >> 16); \ } \ else \ { \