Import final gcc2 snapshot (990109)
[official-gcc.git] / gcc / config / i370 / i370.c
blobb40c159d75d8a30bb9c8218d290f30a266465522
1 /* Subroutines for insn-output.c for System/370.
2 Copyright (C) 1989, 1993, 1995, 1997, 1998 Free Software Foundation, Inc.
3 Contributed by Jan Stein (jan@cd.chalmers.se).
4 Modified for MVS C/370 by Dave Pitts (dpitts@nyx.cs.du.edu)
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
23 #include "config.h"
24 #include "system.h"
25 #include "rtl.h"
26 #include "regs.h"
27 #include "hard-reg-set.h"
28 #include "real.h"
29 #include "insn-config.h"
30 #include "conditions.h"
31 #include "insn-flags.h"
32 #include "output.h"
33 #include "insn-attr.h"
34 #include "flags.h"
35 #include "recog.h"
37 /* Label node, this structure is used to keep track of labels on the
38 current page. */
39 typedef struct label_node
41 struct label_node *label_next;
42 int label_id;
43 int label_page;
45 label_node_t;
47 /* Is 1 when a label has been generated and the base register must be
48 reloaded. */
49 int mvs_label_emitted = 0;
51 /* Current function starting base page. */
52 int function_base_page;
54 /* Length of the current page code. */
55 int mvs_page_code;
57 /* Length of the current page literals. */
58 int mvs_page_lit;
60 /* Current function name. */
61 char *mvs_function_name = 0;
63 /* Current function name length. */
64 int mvs_function_name_length = 0;
66 /* Page number for multi-page functions. */
67 int mvs_page_num = 0;
69 /* Label node list anchor. */
70 static label_node_t *label_anchor = 0;
72 /* Label node free list anchor. */
73 static label_node_t *free_anchor = 0;
75 /* Assembler source file descriptor. */
76 static FILE *assembler_source = 0;
78 /* Define the length of the internal MVS function table. */
79 #define MVS_FUNCTION_TABLE_LENGTH 32
81 /* C/370 internal function table. These functions use non-standard linkage
82 and must handled in a special manner. */
83 static char *mvs_function_table[MVS_FUNCTION_TABLE_LENGTH] =
85 "ceil", "edc_acos", "edc_asin", "edc_ata2", "edc_atan", "edc_cos",
86 "edc_cosh", "edc_erf", "edc_erfc", "edc_exp", "edc_gamm", "edc_lg10",
87 "edc_log", "edc_sin", "edc_sinh", "edc_sqrt", "edc_tan", "edc_tanh",
88 "fabs", "floor", "fmod", "frexp", "hypot", "j0",
89 "j1", "jn", "ldexp", "modf", "pow", "y0",
90 "y1", "yn"
93 /* ASCII to EBCDIC conversion table. */
94 #if defined(TARGET_EBCDIC) && !defined(HOST_EBCDIC)
95 static unsigned char ascebc[256] =
97 /*00 NL SH SX EX ET NQ AK BL */
98 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
99 /*08 BS HT LF VT FF CR SO SI */
100 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
101 /*10 DL D1 D2 D3 D4 NK SN EB */
102 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26,
103 /*18 CN EM SB EC FS GS RS US */
104 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
105 /*20 SP ! " # $ % & ' */
106 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
107 /*28 ( ) * + , - . / */
108 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
109 /*30 0 1 2 3 4 5 6 7 */
110 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
111 /*38 8 9 : ; < = > ? */
112 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
113 /*40 @ A B C D E F G */
114 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
115 /*48 H I J K L M N O */
116 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
117 /*50 P Q R S T U V W */
118 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
119 /*58 X Y Z [ \ ] ^ _ */
120 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
121 /*60 ` a b c d e f g */
122 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
123 /*68 h i j k l m n o */
124 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
125 /*70 p q r s t u v w */
126 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
127 /*78 x y z { | } ~ DL */
128 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
129 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
130 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
131 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
132 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
133 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
134 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
135 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
136 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
137 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
138 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
139 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
140 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
141 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
142 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
143 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
144 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF
146 #endif
148 /* EBCDIC to ASCII conversion table. */
149 #if defined(HOST_EBCDIC) && !defined(TARGET_EBCDIC)
150 unsigned char ebcasc[256] =
152 /*00 NU SH SX EX PF HT LC DL */
153 0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7F,
154 /*08 SM VT FF CR SO SI */
155 0x00, 0x00, 0x00, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
156 /*10 DE D1 D2 TM RS NL BS IL */
157 0x10, 0x11, 0x12, 0x13, 0x14, 0x0A, 0x08, 0x00,
158 /*18 CN EM CC C1 FS GS RS US */
159 0x18, 0x19, 0x00, 0x00, 0x1C, 0x1D, 0x1E, 0x1F,
160 /*20 DS SS FS BP LF EB EC */
161 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x17, 0x1B,
162 /*28 SM C2 EQ AK BL */
163 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, 0x00,
164 /*30 SY PN RS UC ET */
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
166 /*38 C3 D4 NK SU */
167 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1A,
168 /*40 SP */
169 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 /*48 . < ( + | */
171 0x00, 0x00, 0x00, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
172 /*50 & */
173 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 /*58 ! $ * ) ; ^ */
175 0x00, 0x00, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
176 /*60 - / */
177 0x2D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
178 /*68 , % _ > ? */
179 0x00, 0x00, 0x00, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
180 /*70 */
181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
182 /*78 ` : # @ ' = " */
183 0x00, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
184 /*80 a b c d e f g */
185 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
186 /*88 h i { */
187 0x68, 0x69, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x00,
188 /*90 j k l m n o p */
189 0x00, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
190 /*98 q r } */
191 0x71, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00,
192 /*A0 ~ s t u v w x */
193 0x00, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
194 /*A8 y z [ */
195 0x79, 0x7A, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00,
196 /*B0 */
197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198 /*B8 ] */
199 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00,
200 /*C0 { A B C D E F G */
201 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
202 /*C8 H I */
203 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204 /*D0 } J K L M N O P */
205 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
206 /*D8 Q R */
207 0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208 /*E0 \ S T U V W X */
209 0x5C, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
210 /*E8 Y Z */
211 0x59, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212 /*F0 0 1 2 3 4 5 6 7 */
213 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
214 /*F8 8 9 */
215 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF
217 #endif
219 /* Map characters from one character set to another.
220 C is the character to be translated. */
222 char
223 mvs_map_char (c)
224 char c;
226 #if defined(TARGET_EBCDIC) && !defined(HOST_EBCDIC)
227 return ascebc[c];
228 #else
229 #if defined(HOST_EBCDIC) && !defined(TARGET_EBCDIC)
230 return ebcasc[c];
231 #else
232 return c;
233 #endif
234 #endif
237 /* Emit reload of base register if indicated. This is to eliminate multiple
238 reloads when several labels are generated pointing to the same place
239 in the code. */
242 check_label_emit (void)
244 if (mvs_label_emitted)
246 mvs_label_emitted = 0;
247 mvs_page_code += 4;
248 fprintf (assembler_source, "\tL\t%d,%d(,%d)\n",
249 BASE_REGISTER, (mvs_page_num - function_base_page) * 4,
250 PAGE_REGISTER);
254 /* Add the label to the current page label list. If a free element is available
255 it will be used for the new label. Otherwise, a label element will be
256 allocated from memory.
257 ID is the label number of the label being added to the list. */
260 mvs_add_label (id)
261 int id;
263 label_node_t *lp;
265 if (free_anchor)
267 lp = free_anchor;
268 free_anchor = lp->label_next;
270 else
272 lp = (label_node_t *) malloc (sizeof (label_node_t));
273 if (lp == 0)
275 fatal ("virtual memory exhausted\n");
276 abort ();
279 lp->label_id = id;
280 lp->label_page = mvs_page_num;
281 lp->label_next = label_anchor;
282 label_anchor = lp;
285 /* Check to see if the label is in the list. If 1 is returned then a load
286 and branch on register must be generated.
287 ID is the label number of the label being checked. */
290 mvs_check_label (id)
291 int id;
293 label_node_t *lp;
295 for (lp = label_anchor; lp; lp = lp->label_next)
297 if (lp->label_id == id)
298 return 1;
300 return 0;
303 /* The label list for the current page freed by linking the list onto the free
304 label element chain. */
307 mvs_free_label (void)
309 if (label_anchor)
311 if (free_anchor)
312 label_anchor->label_next = free_anchor;
313 free_anchor = label_anchor;
315 label_anchor = 0;
318 /* If the page size limit is reached a new code page is started, and the base
319 register is set to it. This page break point is counted conservatively,
320 most literals that have the same value are collapsed by the assembler.
321 True is returned when a new page is started.
322 FILE is the assembler output file descriptor.
323 CODE is the length, in bytes, of the instruction to be emitted.
324 LIT is the length of the literal to be emitted. */
327 mvs_check_page (file, code, lit)
328 FILE *file;
329 int code, lit;
331 if (file)
332 assembler_source = file;
334 if (mvs_page_code + code + mvs_page_lit + lit > MAX_MVS_PAGE_LENGTH)
336 fprintf (assembler_source, "\tB\tPGE%d\n", mvs_page_num);
337 fprintf (assembler_source, "\tDS\t0F\n");
338 fprintf (assembler_source, "\tLTORG\n");
339 fprintf (assembler_source, "\tDS\t0F\n");
340 fprintf (assembler_source, "PGE%d\tEQU\t*\n", mvs_page_num);
341 fprintf (assembler_source, "\tDROP\t%d\n", BASE_REGISTER);
342 mvs_page_num++;
343 fprintf (assembler_source, "\tBALR\t%d,0\n", BASE_REGISTER);
344 fprintf (assembler_source, "PG%d\tEQU\t*\n", mvs_page_num);
345 fprintf (assembler_source, "\tUSING\t*,%d\n", BASE_REGISTER);
346 mvs_free_label ();
347 mvs_page_code = code;
348 mvs_page_lit = lit;
349 return 1;
351 mvs_page_code += code;
352 mvs_page_lit += lit;
353 return 0;
356 /* Check for C/370 runtime function, they don't use standard calling
357 conventions. True is returned if the function is in the table.
358 NAME is the name of the current function. */
361 mvs_function_check (name)
362 char *name;
364 int lower, middle, upper;
365 int i;
367 lower = 0;
368 upper = MVS_FUNCTION_TABLE_LENGTH - 1;
369 while (lower <= upper)
371 middle = (lower + upper) / 2;
372 i = strcmp (name, mvs_function_table[middle]);
373 if (i == 0)
374 return 1;
375 if (i < 0)
376 upper = middle - 1;
377 else
378 lower = middle + 1;
380 return 0;
384 /* Return 1 if OP is a valid S operand for an RS, SI or SS type instruction.
385 OP is the current operation.
386 MODE is the current operation mode. */
389 s_operand (op, mode)
390 register rtx op;
391 enum machine_mode mode;
393 extern int volatile_ok;
394 register enum rtx_code code = GET_CODE (op);
396 if (CONSTANT_ADDRESS_P (op))
397 return 1;
398 if (mode == VOIDmode || GET_MODE (op) != mode)
399 return 0;
400 if (code == MEM)
402 register rtx x = XEXP (op, 0);
404 if (!volatile_ok && op->volatil)
405 return 0;
406 if (REG_P (x) && REG_OK_FOR_BASE_P (x))
407 return 1;
408 if (GET_CODE (x) == PLUS
409 && REG_P (XEXP (x, 0)) && REG_OK_FOR_BASE_P (XEXP (x, 0))
410 && GET_CODE (XEXP (x, 1)) == CONST_INT
411 && (unsigned) INTVAL (XEXP (x, 1)) < 4096)
412 return 1;
414 return 0;
418 /* Return 1 if OP is a valid R or S operand for an RS, SI or SS type
419 instruction.
420 OP is the current operation.
421 MODE is the current operation mode. */
424 r_or_s_operand (op, mode)
425 register rtx op;
426 enum machine_mode mode;
428 extern int volatile_ok;
429 register enum rtx_code code = GET_CODE (op);
431 if (CONSTANT_ADDRESS_P (op))
432 return 1;
433 if (mode == VOIDmode || GET_MODE (op) != mode)
434 return 0;
435 if (code == REG)
436 return 1;
437 else if (code == MEM)
439 register rtx x = XEXP (op, 0);
441 if (!volatile_ok && op->volatil)
442 return 0;
443 if (REG_P (x) && REG_OK_FOR_BASE_P (x))
444 return 1;
445 if (GET_CODE (x) == PLUS
446 && REG_P (XEXP (x, 0)) && REG_OK_FOR_BASE_P (XEXP (x, 0))
447 && GET_CODE (XEXP (x, 1)) == CONST_INT
448 && (unsigned) INTVAL (XEXP (x, 1)) < 4096)
449 return 1;
451 return 0;
455 /* Return 1 if the next instruction is an unsigned jump instruction.
456 INSN is the current instruction. */
458 unsigned_jump_follows_p (insn)
459 register rtx insn;
461 insn = NEXT_INSN (insn);
462 if (GET_CODE (insn) != JUMP_INSN)
463 return 0;
465 insn = XEXP (insn, 3);
466 if (GET_CODE (insn) != SET)
467 return 0;
469 if (GET_CODE (XEXP (insn, 0)) != PC)
470 return 0;
472 insn = XEXP (insn, 1);
473 if (GET_CODE (insn) != IF_THEN_ELSE)
474 return 0;
476 insn = XEXP (insn, 0);
477 return GET_CODE (insn) != GE && GET_CODE (insn) != GT
478 && GET_CODE (insn) != LE && GET_CODE (insn) != LT;
481 void
482 i370_function_prolog (f, l)
483 FILE *f;
484 int l;
486 #if MACROPROLOGUE == 1
487 fprintf (f, "\tEDCPRLG USRDSAL=%d,BASEREG=%d\n",
488 STACK_POINTER_OFFSET + l - 120 +
489 current_function_outgoing_args_size, BASE_REGISTER);
490 fprintf (f, "PG%d\tEQU\t*\n", mvs_page_num );
491 fprintf (f, "\tLR\t11,1\n");
492 fprintf (f, "\tL\t%d,=A(PGT%d)\n", PAGE_REGISTER, mvs_page_num);
493 mvs_page_code = 6;
494 mvs_page_lit = 4;
495 mvs_check_page (f, 0, 0);
496 function_base_page = mvs_page_num;
497 #else /* MACROPROLOGUE != 1 */
498 static int function_label_index = 1;
499 static int function_first = 0;
500 static int function_year, function_month, function_day;
501 static int function_hour, function_minute, function_second;
502 int i;
503 if (!function_first)
505 struct tm *function_time;
506 time_t lcltime;
507 time (&lcltime);
508 function_time = localtime (&lcltime);
509 function_year = function_time->tm_year + 1900;
510 function_month = function_time->tm_mon + 1;
511 function_day = function_time->tm_mday;
512 function_hour = function_time->tm_hour;
513 function_minute = function_time->tm_min;
514 function_second = function_time->tm_sec;
515 fprintf (f, "PPA2\tDS\t0F\n");
516 fprintf (f, "\tDC\tX'03',X'00',X'33',X'00'\n");
517 fprintf (f, "\tDC\tV(CEESTART),A(0)\n");
518 fprintf (f, "\tDC\tA(CEETIMES)\n");
519 fprintf (f, "CEETIMES\tDS\t0F\n");
520 fprintf (f, "\tDC\tCL4'%d',CL4'%02d%02d',CL6'%02d%02d00'\n",
521 function_year, function_month, function_day,
522 function_hour, function_minute, function_second);
523 fprintf (f, "\tDC\tCL2'01',CL4'0100'\n");
525 fprintf (f, "$DSD%03d\tDSECT\n", function_label_index);
526 fprintf (f, "\tDS\tD\n");
527 fprintf (f, "\tDS\tCL(%d)\n", STACK_POINTER_OFFSET + l
528 + current_function_outgoing_args_size);
529 fprintf (f, "\tORG\t$DSD%03d\n", function_label_index);
530 fprintf (f, "\tDS\tCL(120+8)\n");
531 fprintf (f, "\tORG\n");
532 fprintf (f, "\tDS\t0D\n");
533 fprintf (f, "$DSL%03d\tEQU\t*-$DSD%03d-8\n", function_label_index,
534 function_label_index);
535 fprintf (f, "\tDS\t0H\n");
536 assemble_name (f, mvs_function_name);
537 fprintf (f, "\tEQU\t*\n");
538 fprintf (f, "\tUSING\t*,15\n");
539 fprintf (f, "\tB\tFPL%03d\n", function_label_index);
540 fprintf (f, "\tDC\tAL1(FPL%03d+4-*)\n", function_label_index + 1);
541 fprintf (f, "\tDC\tX'CE',X'A0',AL1(16)\n");
542 fprintf (f, "\tDC\tAL4(PPA2)\n");
543 fprintf (f, "\tDC\tAL4(0)\n");
544 fprintf (f, "\tDC\tAL4($DSL%03d)\n", function_label_index);
545 fprintf (f, "FPL%03d\tEQU\t*\n", function_label_index + 1);
546 fprintf (f, "\tDC\tAL2(%d),C'%s'\n", strlen (mvs_function_name),
547 mvs_function_name);
548 fprintf (f, "FPL%03d\tDS\t0H\n", function_label_index);
549 fprintf (f, "\tSTM\t14,12,12(13)\n");
550 fprintf (f, "\tL\t2,76(,13)\n");
551 fprintf (f, "\tL\t0,16(,15)\n");
552 fprintf (f, "\tALR\t0,2\n");
553 fprintf (f, "\tCL\t0,12(,12)\n");
554 fprintf (f, "\tBNH\t*+10\n");
555 fprintf (f, "\tL\t15,116(,12)\n");
556 fprintf (f, "\tBALR\t14,15\n");
557 fprintf (f, "\tL\t15,72(,13)\n");
558 fprintf (f, "\tSTM\t15,0,72(2)\n");
559 fprintf (f, "\tMVI\t0(2),X'10'\n");
560 fprintf (f, "\tST\t2,8(,13)\n ");
561 fprintf (f, "\tST\t13,4(,2)\n ");
562 fprintf (f, "\tLR\t13,2\n");
563 fprintf (f, "\tDROP\t15\n");
564 fprintf (f, "\tBALR\t%d,0\n", BASE_REGISTER);
565 fprintf (f, "PG%d\tEQU\t*\n", mvs_page_num );
566 fprintf (f, "\tUSING\t*,%d\n", BASE_REGISTER);
567 fprintf (f, "\tLR\t11,1\n");
568 fprintf (f, "\tL\t%d,=A(PGT%d)\n", PAGE_REGISTER, mvs_page_num);
569 mvs_page_code = 4;
570 mvs_page_lit = 4;
571 mvs_check_page (f, 0, 0);
572 function_base_page = mvs_page_num;
573 function_first = 1;
574 function_label_index += 2;
575 #endif /* MACROPROLOGUE */