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