00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #define __STDC_LIMIT_MACROS
00045 #include <stdint.h>
00046 #ifdef USE_PCH
00047 #include "be_com_pch.h"
00048 #endif
00049 #pragma hdrstop
00050 #if defined(BUILD_OS_DARWIN)
00051 #include <limits.h>
00052 #else
00053 #include <values.h>
00054 #endif
00055 #include <isam.h>
00056 #include "defs.h"
00057 #include "strtab.h"
00058 #include "stab.h"
00059 #include "wn.h"
00060 #include "wn_util.h"
00061 #include "wio.h"
00062 #include "config.h"
00063 #include "targ_sim.h"
00064 #include "targ_const.h"
00065 #include "targ_const_private.h"
00066 #include "const.h"
00067 #include "flags.h"
00068 #include "wn_lower.h"
00069 #include "srcpos.h"
00070 #include "stblock.h"
00071 #include "be_symtab.h"
00072 #include <isam.h>
00073 #include <wn_fio.h>
00074 #include "opt_points_to.h"
00075 #include "fb_whirl.h"
00076
00077 #define STACK_LENGTH 25
00078 #define DIM_OFFSET 56
00079 #define DIM_SZ 24
00080
00081 #define GLOBAL_LEVEL 1
00082 #define HOST_LEVEL GLOBAL_LEVEL + 1
00083 #define INTERNAL_LEVEL HOST_LEVEL + 1
00084
00085
00086
00087 #define NO_NESTING 0
00088 #define NESTED_DOPE 1
00089
00090
00091 #define NESTED_ITEM 2
00092
00093
00094 #define FIRST_CALL(x) (x & 2)
00095 #define LAST_CALL(x) (x & 1)
00096 static OPCODE opc_lda;
00097 static OPCODE opc_const;
00098 static INT32 fcd_size;
00099 static ST *stack_st = NULL;
00100 static TY_IDX stack_ty = (TY_IDX) 0;
00101 static ST *cilist_st = NULL;
00102 static WN *cr_iostat1 = NULL;
00103 static WN *cr_iostat2 = NULL;
00104 static WN *copyout_block = NULL;
00105 #define MAX_NESTED_IMPL 50
00106 static ST *impl_idx[MAX_NESTED_IMPL];
00107 static INT32 num_impl;
00108 static INT32 first_last;
00109
00110
00111 typedef struct impdo_info IMPDO_INFO;
00112 struct impdo_info {
00113 ST *index;
00114 struct impdo_info *next;
00115 };
00116 struct marked_set {
00117 ST *st;
00118 struct marked_set *next;
00119 };
00120 typedef struct marked_set MARKED_SET;
00121 static MARKED_SET *marked_set;
00122
00123 #define Impdo_index(x) ((x)->index)
00124 #define Impdo_next(x) ((x)->next)
00125 #define Marked_st(x) ((x)->st)
00126 #define Marked_next(x) ((x)->next)
00127 #define WNOPR(w) (WN_operator(w))
00128 static BOOL cwh_io_analyse_io_item(WN *tree, IMPDO_INFO *impdo_set, INT32 mode);
00129 static BOOL cwh_io_analyse_expr(WN *tree, IMPDO_INFO *impdo_set, INT32 mode);
00130 static BOOL cwh_io_analyse_arr(WN *tree, IMPDO_INFO *impdo_set, INT32 mode);
00131 static INT32 cwh_io_analyse_index_expr(WN *tree, IMPDO_INFO *impdo_set, INT32 mode);
00132 static void cwh_stab_free_auxst(void);
00133 static INT32 member(ST *st, IMPDO_INFO *impdo_set);
00134 static INT32 cwh_io_search_implied_do_index(WN *tree, IMPDO_INFO *impdo_set);
00135 static WN * Substitute_1_For_Impdo_Index_Val(WN *tree, IMPDO_INFO *impdo);
00136 static void cwh_io_unmark(void);
00137 static void cwh_io_add_st_to_marked_set(ST *st);
00138 static BOOL OPCODE_has_aux(const OPCODE opc);
00139 static INT32 local_sequence;
00140 static char seq_buff[10];
00141 static IOLIB current_io_library;
00142
00143
00144 #define MAX_DIM 7
00145 static TY_IDX dope_vector_ty[ MAX_DIM+1 ];
00146
00147 typedef enum {
00148
00149 FIOOPER_NONE = 0,
00150 FIOOPER_FIRST = 1,
00151
00152
00153
00154 FIO_EXT_READ_FORMAT_start = 1,
00155 FIO_EXT_READ_UNFORMAT_start = 2,
00156 FIO_EXT_READ_LIST_start = 3,
00157 FIO_EXT_READ_NAMELIST_start = 4,
00158
00159 FIO_EXT_WRITE_FORMAT_start = 5,
00160 FIO_EXT_WRITE_UNFORMAT_start = 6,
00161 FIO_EXT_WRITE_LIST_start = 7,
00162 FIO_EXT_WRITE_NAMELIST_start = 8,
00163
00164 FIO_EXT_REWRITE_FORMAT_start = 9,
00165 FIO_EXT_REWRITE_UNFORMAT_start = 10,
00166 FIO_EXT_REWRITE_LIST_start = 11,
00167
00168 FIO_EXT_READ_FORMAT_end = 12,
00169 FIO_EXT_READ_UNFORMAT_end = 13,
00170 FIO_EXT_READ_LIST_end = 14,
00171
00172 FIO_EXT_WRITE_FORMAT_end = 15,
00173 FIO_EXT_WRITE_UNFORMAT_end = 16,
00174 FIO_EXT_WRITE_LIST_end = 17,
00175
00176 FIO_EXT_REWRITE_FORMAT_end = 18,
00177 FIO_EXT_REWRITE_UNFORMAT_end = 19,
00178 FIO_EXT_REWRITE_LIST_end = 20,
00179
00180
00181
00182 FIO_INT_READ_FORMAT_start = 21,
00183 FIO_INT_READ_LIST_start = 22,
00184
00185 FIO_INT_WRITE_FORMAT_start = 23,
00186 FIO_INT_WRITE_LIST_start = 24,
00187
00188 FIO_INT_READ_FORMAT_end = 25,
00189 FIO_INT_READ_LIST_end = 26,
00190
00191 FIO_INT_WRITE_FORMAT_end = 27,
00192 FIO_INT_WRITE_LIST_end = 28,
00193
00194
00195
00196 FIO_DIR_READ_FORMAT_start = 29,
00197 FIO_DIR_READ_UNFORMAT_start = 30,
00198
00199 FIO_DIR_WRITE_FORMAT_start = 31,
00200 FIO_DIR_WRITE_UNFORMAT_start = 32,
00201
00202 FIO_DIR_READ_FORMAT_end = 33,
00203 FIO_DIR_READ_UNFORMAT_end = 34,
00204
00205 FIO_DIR_WRITE_FORMAT_end = 35,
00206 FIO_DIR_WRITE_UNFORMAT_end = 36,
00207
00208
00209
00210 FIO_FORMAT_ADDR4_item = 37,
00211 FIO_FORMAT_ADDR8_item = 38,
00212 FIO_FORMAT_CHAR_item = 39,
00213 FIO_FORMAT_I1_item = 40,
00214 FIO_FORMAT_I2_item = 41,
00215 FIO_FORMAT_I4_item = 42,
00216 FIO_FORMAT_I8_item = 43,
00217 FIO_FORMAT_L1_item = 44,
00218 FIO_FORMAT_L2_item = 45,
00219 FIO_FORMAT_L4_item = 46,
00220 FIO_FORMAT_L8_item = 47,
00221 FIO_FORMAT_R4_item = 48,
00222 FIO_FORMAT_R8_item = 49,
00223 FIO_FORMAT_R16_item = 50,
00224 FIO_FORMAT_C4_item = 51,
00225 FIO_FORMAT_C8_item = 52,
00226 FIO_FORMAT_C16_item = 53,
00227
00228 FIO_FORMAT_ADDR4_value = 54,
00229 FIO_FORMAT_ADDR8_value = 55,
00230 FIO_FORMAT_CHAR_value = 56,
00231 FIO_FORMAT_I1_value = 57,
00232 FIO_FORMAT_I2_value = 58,
00233 FIO_FORMAT_I4_value = 59,
00234 FIO_FORMAT_I8_value = 60,
00235 FIO_FORMAT_L1_value = 61,
00236 FIO_FORMAT_L2_value = 62,
00237 FIO_FORMAT_L4_value = 63,
00238 FIO_FORMAT_L8_value = 64,
00239 FIO_FORMAT_R4_value = 65,
00240 FIO_FORMAT_R8_value = 66,
00241 FIO_FORMAT_R16_value = 67,
00242 FIO_FORMAT_C4_value = 68,
00243 FIO_FORMAT_C8_value = 69,
00244 FIO_FORMAT_C16_value = 70,
00245
00246 FIO_UNFORMAT_ADDR4_item = 71,
00247 FIO_UNFORMAT_ADDR8_item = 72,
00248 FIO_UNFORMAT_CHAR_item = 73,
00249 FIO_UNFORMAT_I1_item = 74,
00250 FIO_UNFORMAT_I2_item = 75,
00251 FIO_UNFORMAT_I4_item = 76,
00252 FIO_UNFORMAT_I8_item = 77,
00253 FIO_UNFORMAT_L1_item = 78,
00254 FIO_UNFORMAT_L2_item = 79,
00255 FIO_UNFORMAT_L4_item = 80,
00256 FIO_UNFORMAT_L8_item = 81,
00257 FIO_UNFORMAT_R4_item = 82,
00258 FIO_UNFORMAT_R8_item = 83,
00259 FIO_UNFORMAT_R16_item = 84,
00260 FIO_UNFORMAT_C4_item = 85,
00261 FIO_UNFORMAT_C8_item = 86,
00262 FIO_UNFORMAT_C16_item = 87,
00263
00264 FIO_UNFORMAT_ADDR4_value = 88,
00265 FIO_UNFORMAT_ADDR8_value = 89,
00266 FIO_UNFORMAT_CHAR_value = 90,
00267 FIO_UNFORMAT_I1_value = 91,
00268 FIO_UNFORMAT_I2_value = 92,
00269 FIO_UNFORMAT_I4_value = 93,
00270 FIO_UNFORMAT_I8_value = 94,
00271 FIO_UNFORMAT_L1_value = 95,
00272 FIO_UNFORMAT_L2_value = 96,
00273 FIO_UNFORMAT_L4_value = 97,
00274 FIO_UNFORMAT_L8_value = 98,
00275 FIO_UNFORMAT_R4_value = 99,
00276 FIO_UNFORMAT_R8_value = 100,
00277 FIO_UNFORMAT_R16_value = 101,
00278 FIO_UNFORMAT_C4_value = 102,
00279 FIO_UNFORMAT_C8_value = 103,
00280 FIO_UNFORMAT_C16_value = 104,
00281
00282 FIO_LIST_ADDR4_item = 105,
00283 FIO_LIST_ADDR8_item = 106,
00284 FIO_LIST_CHAR_item = 107,
00285 FIO_LIST_I1_item = 108,
00286 FIO_LIST_I2_item = 109,
00287 FIO_LIST_I4_item = 110,
00288 FIO_LIST_I8_item = 111,
00289 FIO_LIST_L1_item = 112,
00290 FIO_LIST_L2_item = 113,
00291 FIO_LIST_L4_item = 114,
00292 FIO_LIST_L8_item = 115,
00293 FIO_LIST_R4_item = 116,
00294 FIO_LIST_R8_item = 117,
00295 FIO_LIST_R16_item = 118,
00296 FIO_LIST_C4_item = 119,
00297 FIO_LIST_C8_item = 120,
00298 FIO_LIST_C16_item = 121,
00299
00300 FIO_LIST_ADDR4_value = 122,
00301 FIO_LIST_ADDR8_value = 123,
00302 FIO_LIST_CHAR_value = 124,
00303 FIO_LIST_I1_value = 125,
00304 FIO_LIST_I2_value = 126,
00305 FIO_LIST_I4_value = 127,
00306 FIO_LIST_I8_value = 128,
00307 FIO_LIST_L1_value = 129,
00308 FIO_LIST_L2_value = 130,
00309 FIO_LIST_L4_value = 131,
00310 FIO_LIST_L8_value = 132,
00311 FIO_LIST_R4_value = 133,
00312 FIO_LIST_R8_value = 134,
00313 FIO_LIST_R16_value = 135,
00314 FIO_LIST_C4_value = 136,
00315 FIO_LIST_C8_value = 137,
00316 FIO_LIST_C16_value = 138,
00317
00318
00319
00320 FIO_BACKSPACE = 139,
00321 FIO_CLOSE = 140,
00322 FIO_DELETE = 141,
00323 FIO_ENDFILE = 142,
00324 FIO_FIND = 143,
00325 FIO_INQUIRE = 144,
00326 FIO_OPEN = 145,
00327 FIO_REWIND = 146,
00328 FIO_UNLOCK = 147,
00329 FIO_DEFINEFILE = 148,
00330
00331
00332 FIO_CR_READ_UNFORMATTED = 149,
00333 FIO_CR_WRITE_UNFORMATTED = 150,
00334 FIO_CR_READ_FORMATTED = 151,
00335 FIO_CR_WRITE_FORMATTED = 152,
00336 FIO_CR_READ_NAMELIST = 153,
00337 FIO_CR_WRITE_NAMELIST = 154,
00338 FIO_INQLENGTH = 155,
00339 FIO_CR_OPEN = 156,
00340 FIO_CR_CLOSE = 157,
00341 FIO_CR_ENDFILE = 158,
00342 FIO_CR_REWIND = 159,
00343 FIO_CR_INQUIRE = 160,
00344 FIO_CR_BACKSPACE = 161,
00345 FIO_CR_BUFFERIN = 162,
00346 FIO_CR_BUFFEROUT = 163,
00347
00348 FIOOPER_LAST = 164
00349
00350 } FIOOPER;
00351
00352 typedef enum {
00353
00354 FIOITEMTYPE_NONE = 0,
00355 FIOITEMTYPE_FIRST = 1,
00356
00357 FIT_ADDRESS4 = 1,
00358 FIT_ADDRESS8 = 2,
00359 FIT_CHARACTER = 3,
00360 FIT_INTEGER1 = 4,
00361 FIT_INTEGER2 = 5,
00362 FIT_INTEGER4 = 6,
00363 FIT_INTEGER8 = 7,
00364 FIT_LOGICAL1 = 8,
00365 FIT_LOGICAL2 = 9,
00366 FIT_LOGICAL4 = 10,
00367 FIT_LOGICAL8 = 11,
00368 FIT_REAL4 = 12,
00369 FIT_REAL8 = 13,
00370 FIT_REAL16 = 14,
00371 FIT_COMPLEX4 = 15,
00372 FIT_COMPLEX8 = 16,
00373 FIT_COMPLEX16 = 17,
00374 FIT_RECORD = 18,
00375
00376 FIOITEMTYPE_LAST = 18
00377
00378 } FIOITEMTYPE;
00379
00380 typedef enum {
00381
00382 FIOFORMATTYPE_NONE = 0,
00383 FIOFORMATTYPE_FIRST = 1,
00384
00385 FFT_FORMAT = 1,
00386 FFT_UNFORMAT = 2,
00387 FFT_LIST = 3,
00388
00389 FIOFORMATTYPE_LAST = 3
00390
00391 } FIOFORMATTYPE;
00392
00393 typedef enum {
00394
00395 FIOSTRUCTID_NONE = 0,
00396 FIOSTRUCTID_FIRST = 1,
00397
00398 FID_CILIST = 1,
00399 FID_ICILIST = 2,
00400 FID_OLIST = 3,
00401 FID_FLIST = 4,
00402 FID_INLIST = 5,
00403 FID_ALIST = 6,
00404 FID_CLLIST = 7,
00405 FID_KEYSPEC = 8,
00406
00407 FID_CRAY_CLIST = 9,
00408 FID_CRAY_FCD = 10,
00409 FID_CRAY_IOLIST = 11,
00410 FID_CRAY_OPENLIST = 12,
00411 FID_CRAY_CLOSELIST = 13,
00412 FID_CRAY_INQLIST = 14,
00413 FID_CRAY_DOPEVEC = 15,
00414 FID_IOSCALAR_ENTRY = 16,
00415 FID_IOARRAY_ENTRY = 17,
00416 FID_IOIMPLIEDDO_ENTRY = 18,
00417
00418 FIOSTRUCTID_LAST = 18
00419
00420 } FIOSTRUCTID;
00421
00422 #define FIM_EXIST 0
00423 #define FIM_OPENED 2
00424 #define FIM_NUMBER 4
00425 #define FIM_NAMED 6
00426 #define FIM_RECL 8
00427 #define FIM_NEXTREC 10
00428 #define FIM_ASSOCIATEVARIABLE 12
00429
00430 typedef enum {
00431
00432 FIOSTRUCT_NONE = 0,
00433 FIOSTRUCT_FIRST = 1,
00434
00435
00436
00437 FSC_CIERR = 1,
00438 FSC_CIUNIT = 2,
00439 FSC_CIEND = 3,
00440 FSC_CIFMT = 4,
00441 FSC_CIREC = 5,
00442 FSC_CIMATCH = 6,
00443 FSC_CIKEYTYPE = 7,
00444 FSC_CIKEYVAL = 8,
00445 FSC_CIKEYID = 9,
00446 FSC_CINML = 10,
00447 FSC_CIKEYVALLEN = 11,
00448 FSC_CIADVANCE = 12,
00449 FSC_CIADVANCELEN = 13,
00450 FSC_CIEOR = 14,
00451 FSC_CISIZE = 15,
00452 FSC_CIVFMT = 16,
00453 FSC_CIVFMTFP = 17,
00454
00455
00456
00457 FSI_ICIERR = 18,
00458 FSI_ICIUNIT = 19,
00459 FSI_ICIEND = 20,
00460 FSI_ICIFMT = 21,
00461 FSI_ICIRLEN = 22,
00462 FSI_ICIRNUM = 23,
00463 FSI_ICIVFMT = 24,
00464 FSI_ICIVFMTFP = 25,
00465
00466
00467
00468 FSO_OERR = 26,
00469 FSO_OUNIT = 27,
00470 FSO_OFNM = 28,
00471 FSO_OFNMLEN = 29,
00472 FSO_OSTA = 30,
00473 FSO_OACC = 31,
00474 FSO_OFM = 32,
00475 FSO_ORL = 33,
00476 FSO_OBLNK = 34,
00477 FSO_OCC = 35,
00478 FSO_OORG = 36,
00479 FSO_OSHARED = 37,
00480 FSO_OREADONLY = 38,
00481 FSO_ONKEYS = 39,
00482 FSO_OKEYS = 40,
00483 FSO_OASSOCV = 41,
00484 FSO_OMAXREC = 42,
00485 FSO_ODFNM = 43,
00486 FSO_ODFNMLEN = 44,
00487 FSO_ODISP = 45,
00488 FSO_ORECTYPE = 46,
00489 FSO_OCONV = 47,
00490 FSO_OCONVLEN = 48,
00491 FSO_OBUFFSIZE = 49,
00492 FSO_ODIRECT = 50,
00493 FSO_OACTION = 51,
00494 FSO_OACTIONLEN = 52,
00495 FSO_ODELIM = 53,
00496 FSO_ODELIMLEN = 54,
00497 FSO_OPAD = 55,
00498 FSO_OPADLEN = 56,
00499 FSO_OPOSITION = 57,
00500 FSO_OPOSITIONLEN = 58,
00501
00502
00503
00504 FSF_FERR = 59,
00505 FSF_FUNIT = 60,
00506 FSF_FREC = 61,
00507
00508
00509
00510 FSN_INERR = 62,
00511 FSN_INUNIT = 63,
00512 FSN_INFILE = 64,
00513 FSN_INFILEN = 65,
00514 FSN_INEX = 66,
00515 FSN_INOPEN = 67,
00516 FSN_INNUM = 68,
00517 FSN_INNAMED = 69,
00518 FSN_INNAME = 70,
00519 FSN_INNAMLEN = 71,
00520 FSN_INACC = 72,
00521 FSN_INACCLEN = 73,
00522 FSN_INSEQ = 74,
00523 FSN_INSEQLEN = 75,
00524 FSN_INDIR = 76,
00525 FSN_INDIRLEN = 77,
00526 FSN_INFMT = 78,
00527 FSN_INFMTLEN = 79,
00528 FSN_INFORM = 80,
00529 FSN_INFORMLEN = 81,
00530 FSN_INUNF = 82,
00531 FSN_INUNFLEN = 83,
00532 FSN_INRECL = 84,
00533 FSN_INNREC = 85,
00534 FSN_INBLANK = 86,
00535 FSN_INBLANKLEN = 87,
00536 FSN_INDEFAULTFILE = 88,
00537 FSN_INDEFAULTFILELEN = 89,
00538 FSN_INCC = 90,
00539 FSN_INCCLEN = 91,
00540 FSN_INKEYED = 92,
00541 FSN_INKEYEDLEN = 93,
00542 FSN_INORG = 94,
00543 FSN_INORGLEN = 95,
00544 FSN_INRECORDTYPE = 96,
00545 FSN_INRECORDTYPELEN = 97,
00546 FSN_INCONV = 98,
00547 FSN_INCONVLEN = 99,
00548 FSN_INBUFFSIZE = 100,
00549 FSN_INACTION = 101,
00550 FSN_INACTIONLEN = 102,
00551 FSN_INDELIM = 103,
00552 FSN_INDELIMLEN = 104,
00553 FSN_INPAD = 105,
00554 FSN_INPADLEN = 106,
00555 FSN_INPOSITION = 107,
00556 FSN_INPOSITIONLEN = 108,
00557 FSN_INREAD = 109,
00558 FSN_INREADLEN = 110,
00559 FSN_INREADWRITE = 111,
00560 FSN_INREADWRITELEN = 112,
00561 FSN_INWRITE = 113,
00562 FSN_INWRITELEN = 114,
00563
00564
00565
00566 FSA_AERR = 115,
00567 FSA_AUNIT = 116,
00568
00569
00570
00571 FSL_CLERR = 117,
00572 FSL_CLUNIT = 118,
00573 FSL_CLSTA = 119,
00574
00575
00576
00577 FSK_START = 120,
00578 FSK_END = 121,
00579 FSK_KEYTYPE = 122,
00580
00581
00582
00583 FCR_CI_WORD1 = 123,
00584 FCR_CI_UNIT = 124,
00585 FCR_CI_IOSTAT = 125,
00586 FCR_CI_REC = 126,
00587 FCR_CI_PARSFMT = 127,
00588 FCR_CI_FMTSRC = 128,
00589 FCR_CI_ADVANCE = 129,
00590 FCR_CI_SIZE = 130,
00591
00592
00593 FCR_FCD_ADDR = 131,
00594 FCR_FCD_LEN = 132,
00595
00596
00597 FCR_IOL_HEAD = 133,
00598
00599
00600 FCR_OPEN_VERSION = 134,
00601 FCR_OPEN_UNIT = 135,
00602 FCR_OPEN_IOSTAT = 136,
00603 FCR_OPEN_ERR = 137,
00604 FCR_OPEN_FILE = 138,
00605 FCR_OPEN_STATUS = 139,
00606 FCR_OPEN_ACCESS = 140,
00607 FCR_OPEN_FORM = 141,
00608 FCR_OPEN_RECL = 142,
00609 FCR_OPEN_BLANK = 143,
00610 FCR_OPEN_POSITION = 144,
00611 FCR_OPEN_ACTION = 145,
00612 FCR_OPEN_DELIM = 146,
00613 FCR_OPEN_PAD = 147,
00614
00615
00616 FCR_CLOSE_VERSION = 148,
00617 FCR_CLOSE_UNIT = 149,
00618 FCR_CLOSE_IOSTAT = 150,
00619 FCR_CLOSE_ERR = 151,
00620 FCR_CLOSE_STATUS = 152,
00621
00622
00623 FCR_INQ_VERSION = 153,
00624 FCR_INQ_UNIT = 154,
00625 FCR_INQ_FILE = 155,
00626 FCR_INQ_IOSTAT = 156,
00627 FCR_INQ_ERR = 157,
00628 FCR_INQ_EXIST = 158,
00629 FCR_INQ_OPENED = 159,
00630 FCR_INQ_NUMBER = 160,
00631 FCR_INQ_NAMED = 161,
00632 FCR_INQ_NAME = 162,
00633 FCR_INQ_ACCESS = 163,
00634 FCR_INQ_SEQUENTIAL = 164,
00635 FCR_INQ_DIRECT = 165,
00636 FCR_INQ_FORM = 166,
00637 FCR_INQ_FORMATTED = 167,
00638 FCR_INQ_UNFORMATTED = 168,
00639 FCR_INQ_RECL = 169,
00640 FCR_INQ_NEXTREC = 170,
00641 FCR_INQ_BLANK = 171,
00642 FCR_INQ_POSITION = 172,
00643 FCR_INQ_ACTION = 173,
00644 FCR_INQ_READ = 174,
00645 FCR_INQ_WRITE = 175,
00646 FCR_INQ_READWRITE = 176,
00647 FCR_INQ_DELIM = 177,
00648 FCR_INQ_PAD = 178,
00649
00650
00651 FCR_DV_BASE_PTR = 179,
00652 FCR_DV_BASE_LEN = 180,
00653 FCR_DV_FLAG_INFO = 181,
00654 FCR_DV_TYPE_LEN = 182,
00655 FCR_DV_ORIG_BASE = 183,
00656 FCR_DV_ORIG_SIZE = 184,
00657 FCR_DV_DIM1_LB = 185,
00658 FCR_DV_DIM1_EXTENT = 186,
00659 FCR_DV_DIM1_STRIDE = 187,
00660 FCR_DV_DIM2_LB = 188,
00661 FCR_DV_DIM2_EXTENT = 189,
00662 FCR_DV_DIM2_STRIDE = 190,
00663 FCR_DV_DIM3_LB = 191,
00664 FCR_DV_DIM3_EXTENT = 192,
00665 FCR_DV_DIM3_STRIDE = 193,
00666 FCR_DV_DIM4_LB = 194,
00667 FCR_DV_DIM4_EXTENT = 195,
00668 FCR_DV_DIM4_STRIDE = 196,
00669 FCR_DV_DIM5_LB = 197,
00670 FCR_DV_DIM5_EXTENT = 298,
00671 FCR_DV_DIM5_STRIDE = 299,
00672 FCR_DV_DIM6_LB = 200,
00673 FCR_DV_DIM6_EXTENT = 201,
00674 FCR_DV_DIM6_STRIDE = 202,
00675 FCR_DV_DIM7_LB = 203,
00676 FCR_DV_DIM7_EXTENT = 204,
00677 FCR_DV_DIM7_STRIDE = 205,
00678
00679
00680 FCR_IOSCALAR_ENTRY = 206,
00681 FCR_IOSCALAR_TYPE_T = 207,
00682 FCR_IOSCALAR_ADDR = 208,
00683 FCR_IOSCALAR_CHAR_LEN = 209,
00684
00685
00686 FCR_IOARRAY_ENTRY = 210,
00687 FCR_IOARRAY_DV_ADDR = 211,
00688 FCR_IOARRAY_FLAG = 212,
00689 FCR_IOARRAY_IDX1 = 213,
00690 FCR_IOARRAY_IDX2 = 214,
00691 FCR_IOARRAY_IDX3 = 215,
00692 FCR_IOARRAY_IDX4 = 216,
00693 FCR_IOARRAY_IDX5 = 217,
00694 FCR_IOARRAY_IDX6= 218,
00695 FCR_IOARRAY_IDX7 = 219,
00696
00697
00698 FCR_IOIMPLIEDDO_ENTRY = 220,
00699 FCR_IOIMPLIEDDO_VAR_ADDR = 221,
00700 FCR_IOIMPLIEDDO_BEGIN_CNT = 222,
00701 FCR_IOIMPLIEDDO_END_CNT = 223,
00702 FCR_IOIMPLIEDDO_INC_CNT = 224,
00703
00704 FIOSTRUCT_LAST = 224
00705
00706 } FIOSTRUCT;
00707
00708 typedef enum {
00709
00710 FIOCLASS_NONE = 0,
00711 FIOCLASS_FIRST = 1,
00712
00713 FCL_EXT_FORMATTED = 1,
00714 FCL_EXT_UNFORMATTED = 2,
00715 FCL_EXT_LIST = 3,
00716 FCL_EXT_NAMELIST = 4,
00717
00718 FCL_INT_FORMATTED = 5,
00719 FCL_INT_LIST = 6,
00720
00721 FCL_DIR_FORMATTED = 7,
00722 FCL_DIR_UNFORMATTED = 8,
00723
00724 FIOCLASS_LAST = 8
00725
00726 } FIOCLASS;
00727
00728 typedef struct {
00729 FIOSTRUCT first;
00730 FIOSTRUCT last;
00731 INT16 size32;
00732 INT16 size64;
00733 const char *name;
00734 const char *name_ptr;
00735 const char *name_local;
00736 } FIOSTRUCTID_INFO;
00737
00738 typedef struct {
00739 INT16 offset32;
00740 INT16 type32;
00741 INT16 offset64;
00742 INT16 type64;
00743 FIOSTRUCTID iostruct;
00744 const char *name;
00745 } FIOSTRUCT_INFO;
00746
00747 static ST * Make_IoRuntime_ST ( FIOOPER );
00748 #define GET_RUNTIME_ST(x) (fio_sts[x] == NULL ? Make_IoRuntime_ST (x) : \
00749 fio_sts[x])
00750
00751 static void Gen_Io_Calls ( WN *, FIOOPER, WN *, WN *, INT32, WN *, WN *, WN *,
00752 WN * );
00753 #define GEN_IO_CALL_0(bl, op, ios1, ios2) \
00754 Gen_Io_Calls (bl, op, ios1, ios2, 0, NULL, NULL, NULL, NULL);
00755 #define GEN_IO_CALL_1(bl, op, ios1, ios2, k1) \
00756 Gen_Io_Calls (bl, op, ios1, ios2, 1, k1, NULL, NULL, NULL);
00757 #define GEN_IO_CALL_2(bl, op, ios1, ios2, k1, k2) \
00758 Gen_Io_Calls (bl, op, ios1, ios2, 2, k1, k2, NULL, NULL);
00759 #define GEN_IO_CALL_3(bl, op, ios1, ios2, k1, k2, k3) \
00760 Gen_Io_Calls (bl, op, ios1, ios2, 3, k1, k2, k3, NULL);
00761 #define GEN_IO_CALL_4(bl, op, ios1, ios2, k1, k2, k3, k4) \
00762 Gen_Io_Calls (bl, op, ios1, ios2, 4, k1, k2, k3, k4);
00763
00764 #define Action(x) (actions & (x))
00765
00766 #define WN_type_pointed(x) TY_pointed(WN_type(x))
00767
00768 inline WN *
00769 WN_CreateNewLabel (void)
00770 {
00771 LABEL_IDX label;
00772 (void) New_LABEL (CURRENT_SYMTAB, label);
00773 return WN_CreateLabel (label, 0, NULL);
00774 }
00775
00776
00777 INT32 mp_io;
00778
00779
00780
00781 static const char * fio_names [FIOOPER_LAST + 1] = {
00782 "",
00783 "s_rsfe64",
00784 "s_rsue64",
00785 "s_rsle64",
00786 "s_rsNe64",
00787 "s_wsfe64",
00788 "s_wsue64",
00789 "s_wsle64",
00790 "s_wsNe64",
00791 "s_xsfe64",
00792 "s_xsue64",
00793 "s_xsle64",
00794 "e_rsfe64",
00795 "e_rsue64",
00796 "e_rsle64",
00797 "e_wsfe64",
00798 "e_wsue64",
00799 "e_wsle64",
00800 "e_xsfe64",
00801 "e_xsue64",
00802 "e_xsle64",
00803 "s_rsfi64",
00804 "s_rsli64",
00805 "s_wsfi64",
00806 "s_wsli64",
00807 "e_rsfi64",
00808 "e_rsli64",
00809 "e_wsfi64",
00810 "e_wsli64",
00811 "s_rdfe64",
00812 "s_rdue64",
00813 "s_wdfe64",
00814 "s_wdue64",
00815 "e_rdfe64",
00816 "e_rdue64",
00817 "e_wdfe64",
00818 "e_wdue64",
00819 "do_fioxa4",
00820 "do_fioxa8",
00821 "do_fioxh1",
00822 "do_fioxi1",
00823 "do_fioxi2",
00824 "do_fioxi4",
00825 "do_fioxi8",
00826 "do_fioxl1",
00827 "do_fioxl2",
00828 "do_fioxl4",
00829 "do_fioxl8",
00830 "do_fioxr4",
00831 "do_fioxr8",
00832 "do_fioxr16",
00833 "do_fioxc4",
00834 "do_fioxc8",
00835 "do_fioxc16",
00836 "do_fioxa4v",
00837 "do_fioxa8v",
00838 "do_fioxh1v",
00839 "do_fioxi1v",
00840 "do_fioxi2v",
00841 "do_fioxi4v",
00842 "do_fioxi8v",
00843 "do_fioxl1v",
00844 "do_fioxl2v",
00845 "do_fioxl4v",
00846 "do_fioxl8v",
00847 "do_fioxr4v",
00848 "do_fioxr8v",
00849 "do_fioxr16v",
00850 "do_fioxc4v",
00851 "do_fioxc8v",
00852 "do_fioxc16v",
00853 "do_uioxa4",
00854 "do_uioxa8",
00855 "do_uioxh1",
00856 "do_uioxi1",
00857 "do_uioxi2",
00858 "do_uioxi4",
00859 "do_uioxi8",
00860 "do_uioxl1",
00861 "do_uioxl2",
00862 "do_uioxl4",
00863 "do_uioxl8",
00864 "do_uioxr4",
00865 "do_uioxr8",
00866 "do_uioxr16",
00867 "do_uioxc4",
00868 "do_uioxc8",
00869 "do_uioxc16",
00870 "do_uioxa4v",
00871 "do_uioxa8v",
00872 "do_uioxh1v",
00873 "do_uioxi1v",
00874 "do_uioxi2v",
00875 "do_uioxi4v",
00876 "do_uioxi8v",
00877 "do_uioxl1v",
00878 "do_uioxl2v",
00879 "do_uioxl4v",
00880 "do_uioxl8v",
00881 "do_uioxr4v",
00882 "do_uioxr8v",
00883 "do_uioxr16v",
00884 "do_uioxc4v",
00885 "do_uioxc8v",
00886 "do_uioxc16v",
00887 "do_lioxa4",
00888 "do_lioxa8",
00889 "do_lioxh1",
00890 "do_lioxi1",
00891 "do_lioxi2",
00892 "do_lioxi4",
00893 "do_lioxi8",
00894 "do_lioxl1",
00895 "do_lioxl2",
00896 "do_lioxl4",
00897 "do_lioxl8",
00898 "do_lioxr4",
00899 "do_lioxr8",
00900 "do_lioxr16",
00901 "do_lioxc4",
00902 "do_lioxc8",
00903 "do_lioxc16",
00904 "do_lioxa4v",
00905 "do_lioxa8v",
00906 "do_lioxh1v",
00907 "do_lioxi1v",
00908 "do_lioxi2v",
00909 "do_lioxi4v",
00910 "do_lioxi8v",
00911 "do_lioxl1v",
00912 "do_lioxl2v",
00913 "do_lioxl4v",
00914 "do_lioxl8v",
00915 "do_lioxr4v",
00916 "do_lioxr8v",
00917 "do_lioxr16v",
00918 "do_lioxc4v",
00919 "do_lioxc8v",
00920 "do_lioxc16v",
00921 "f_back64",
00922 "f_clos64",
00923 "f_del64",
00924 "f_end64",
00925 "f_find64",
00926 "f_inqu064x",
00927 "f_open064x",
00928 "f_rew64",
00929 "f_unl64",
00930 "f_df64x",
00931 "_FRU",
00932 "_FWU",
00933 "_FRF",
00934 "_FWF",
00935 "_FRN",
00936 "_FWN",
00937 "_INQIL",
00938 "_OPEN",
00939 "_CLOSE",
00940 "_EOFW",
00941 "_REWF",
00942 "_INQUIRE",
00943 "_BACK",
00944 "_BUFFERIN",
00945 "_BUFFEROUT"
00946
00947 };
00948
00949
00950
00951
00952
00953 static ST * fio_sts [FIOOPER_LAST + 1] = {
00954 NULL,
00955 NULL,
00956 NULL,
00957 NULL,
00958 NULL,
00959 NULL,
00960 NULL,
00961 NULL,
00962 NULL,
00963 NULL,
00964 NULL,
00965 NULL,
00966 NULL,
00967 NULL,
00968 NULL,
00969 NULL,
00970 NULL,
00971 NULL,
00972 NULL,
00973 NULL,
00974 NULL,
00975 NULL,
00976 NULL,
00977 NULL,
00978 NULL,
00979 NULL,
00980 NULL,
00981 NULL,
00982 NULL,
00983 NULL,
00984 NULL,
00985 NULL,
00986 NULL,
00987 NULL,
00988 NULL,
00989 NULL,
00990 NULL,
00991 NULL,
00992 NULL,
00993 NULL,
00994 NULL,
00995 NULL,
00996 NULL,
00997 NULL,
00998 NULL,
00999 NULL,
01000 NULL,
01001 NULL,
01002 NULL,
01003 NULL,
01004 NULL,
01005 NULL,
01006 NULL,
01007 NULL,
01008 NULL,
01009 NULL,
01010 NULL,
01011 NULL,
01012 NULL,
01013 NULL,
01014 NULL,
01015 NULL,
01016 NULL,
01017 NULL,
01018 NULL,
01019 NULL,
01020 NULL,
01021 NULL,
01022 NULL,
01023 NULL,
01024 NULL,
01025 NULL,
01026 NULL,
01027 NULL,
01028 NULL,
01029 NULL,
01030 NULL,
01031 NULL,
01032 NULL,
01033 NULL,
01034 NULL,
01035 NULL,
01036 NULL,
01037 NULL,
01038 NULL,
01039 NULL,
01040 NULL,
01041 NULL,
01042 NULL,
01043 NULL,
01044 NULL,
01045 NULL,
01046 NULL,
01047 NULL,
01048 NULL,
01049 NULL,
01050 NULL,
01051 NULL,
01052 NULL,
01053 NULL,
01054 NULL,
01055 NULL,
01056 NULL,
01057 NULL,
01058 NULL,
01059 NULL,
01060 NULL,
01061 NULL,
01062 NULL,
01063 NULL,
01064 NULL,
01065 NULL,
01066 NULL,
01067 NULL,
01068 NULL,
01069 NULL,
01070 NULL,
01071 NULL,
01072 NULL,
01073 NULL,
01074 NULL,
01075 NULL,
01076 NULL,
01077 NULL,
01078 NULL,
01079 NULL,
01080 NULL,
01081 NULL,
01082 NULL,
01083 NULL,
01084 NULL,
01085 NULL,
01086 NULL,
01087 NULL,
01088 NULL,
01089 NULL,
01090 NULL,
01091 NULL,
01092 NULL,
01093 NULL,
01094 NULL,
01095 NULL,
01096 NULL,
01097 NULL,
01098 NULL,
01099 NULL,
01100 NULL,
01101 NULL,
01102 NULL,
01103 NULL,
01104 NULL,
01105 NULL,
01106 NULL,
01107 NULL,
01108 NULL,
01109 NULL,
01110 NULL,
01111 NULL,
01112 NULL,
01113 NULL,
01114 NULL,
01115 NULL,
01116 NULL,
01117 NULL
01118 };
01119
01120
01121
01122
01123
01124
01125 static FIOOPER fio_item_ops [FIOFORMATTYPE_LAST +1] [FIOITEMTYPE_LAST + 1] = {
01126 FIOOPER_NONE,
01127 FIOOPER_NONE,
01128 FIOOPER_NONE,
01129 FIOOPER_NONE,
01130 FIOOPER_NONE,
01131 FIOOPER_NONE,
01132 FIOOPER_NONE,
01133 FIOOPER_NONE,
01134 FIOOPER_NONE,
01135 FIOOPER_NONE,
01136 FIOOPER_NONE,
01137 FIOOPER_NONE,
01138 FIOOPER_NONE,
01139 FIOOPER_NONE,
01140 FIOOPER_NONE,
01141 FIOOPER_NONE,
01142 FIOOPER_NONE,
01143 FIOOPER_NONE,
01144 FIOOPER_NONE,
01145 FIOOPER_NONE,
01146 FIO_FORMAT_ADDR4_item,
01147 FIO_FORMAT_ADDR8_item,
01148 FIO_FORMAT_CHAR_item,
01149 FIO_FORMAT_I1_item,
01150 FIO_FORMAT_I2_item,
01151 FIO_FORMAT_I4_item,
01152 FIO_FORMAT_I8_item,
01153 FIO_FORMAT_L1_item,
01154 FIO_FORMAT_L2_item,
01155 FIO_FORMAT_L4_item,
01156 FIO_FORMAT_L8_item,
01157 FIO_FORMAT_R4_item,
01158 FIO_FORMAT_R8_item,
01159 FIO_FORMAT_R16_item,
01160 FIO_FORMAT_C4_item,
01161 FIO_FORMAT_C8_item,
01162 FIO_FORMAT_C16_item,
01163 FIOOPER_NONE,
01164 FIOOPER_NONE,
01165 FIO_UNFORMAT_ADDR4_item,
01166 FIO_UNFORMAT_ADDR8_item,
01167 FIO_UNFORMAT_CHAR_item,
01168 FIO_UNFORMAT_I1_item,
01169 FIO_UNFORMAT_I2_item,
01170 FIO_UNFORMAT_I4_item,
01171 FIO_UNFORMAT_I8_item,
01172 FIO_UNFORMAT_L1_item,
01173 FIO_UNFORMAT_L2_item,
01174 FIO_UNFORMAT_L4_item,
01175 FIO_UNFORMAT_L8_item,
01176 FIO_UNFORMAT_R4_item,
01177 FIO_UNFORMAT_R8_item,
01178 FIO_UNFORMAT_R16_item,
01179 FIO_UNFORMAT_C4_item,
01180 FIO_UNFORMAT_C8_item,
01181 FIO_UNFORMAT_C16_item,
01182 FIOOPER_NONE,
01183 FIOOPER_NONE,
01184 FIO_LIST_ADDR4_item,
01185 FIO_LIST_ADDR8_item,
01186 FIO_LIST_CHAR_item,
01187 FIO_LIST_I1_item,
01188 FIO_LIST_I2_item,
01189 FIO_LIST_I4_item,
01190 FIO_LIST_I8_item,
01191 FIO_LIST_L1_item,
01192 FIO_LIST_L2_item,
01193 FIO_LIST_L4_item,
01194 FIO_LIST_L8_item,
01195 FIO_LIST_R4_item,
01196 FIO_LIST_R8_item,
01197 FIO_LIST_R16_item,
01198 FIO_LIST_C4_item,
01199 FIO_LIST_C8_item,
01200 FIO_LIST_C16_item,
01201 FIOOPER_NONE
01202 };
01203
01204 static FIOOPER fio_value_ops [FIOFORMATTYPE_LAST +1] [FIOITEMTYPE_LAST + 1] = {
01205 FIOOPER_NONE,
01206 FIOOPER_NONE,
01207 FIOOPER_NONE,
01208 FIOOPER_NONE,
01209 FIOOPER_NONE,
01210 FIOOPER_NONE,
01211 FIOOPER_NONE,
01212 FIOOPER_NONE,
01213 FIOOPER_NONE,
01214 FIOOPER_NONE,
01215 FIOOPER_NONE,
01216 FIOOPER_NONE,
01217 FIOOPER_NONE,
01218 FIOOPER_NONE,
01219 FIOOPER_NONE,
01220 FIOOPER_NONE,
01221 FIOOPER_NONE,
01222 FIOOPER_NONE,
01223 FIOOPER_NONE,
01224 FIOOPER_NONE,
01225 FIO_FORMAT_ADDR4_value,
01226 FIO_FORMAT_ADDR8_value,
01227 FIO_FORMAT_CHAR_value,
01228 FIO_FORMAT_I1_value,
01229 FIO_FORMAT_I2_value,
01230 FIO_FORMAT_I4_value,
01231 FIO_FORMAT_I8_value,
01232 FIO_FORMAT_L1_value,
01233 FIO_FORMAT_L2_value,
01234 FIO_FORMAT_L4_value,
01235 FIO_FORMAT_L8_value,
01236 FIO_FORMAT_R4_value,
01237 FIO_FORMAT_R8_value,
01238 FIO_FORMAT_R16_value,
01239 FIO_FORMAT_C4_value,
01240 FIO_FORMAT_C8_value,
01241 FIO_FORMAT_C16_value,
01242 FIOOPER_NONE,
01243 FIOOPER_NONE,
01244 FIO_UNFORMAT_ADDR4_value,
01245 FIO_UNFORMAT_ADDR8_value,
01246 FIO_UNFORMAT_CHAR_value,
01247 FIO_UNFORMAT_I1_value,
01248 FIO_UNFORMAT_I2_value,
01249 FIO_UNFORMAT_I4_value,
01250 FIO_UNFORMAT_I8_value,
01251 FIO_UNFORMAT_L1_value,
01252 FIO_UNFORMAT_L2_value,
01253 FIO_UNFORMAT_L4_value,
01254 FIO_UNFORMAT_L8_value,
01255 FIO_UNFORMAT_R4_value,
01256 FIO_UNFORMAT_R8_value,
01257 FIO_UNFORMAT_R16_value,
01258 FIO_UNFORMAT_C4_value,
01259 FIO_UNFORMAT_C8_value,
01260 FIO_UNFORMAT_C16_value,
01261 FIOOPER_NONE,
01262 FIOOPER_NONE,
01263 FIO_LIST_ADDR4_value,
01264 FIO_LIST_ADDR8_value,
01265 FIO_LIST_CHAR_value,
01266 FIO_LIST_I1_value,
01267 FIO_LIST_I2_value,
01268 FIO_LIST_I4_value,
01269 FIO_LIST_I8_value,
01270 FIO_LIST_L1_value,
01271 FIO_LIST_L2_value,
01272 FIO_LIST_L4_value,
01273 FIO_LIST_L8_value,
01274 FIO_LIST_R4_value,
01275 FIO_LIST_R8_value,
01276 FIO_LIST_R16_value,
01277 FIO_LIST_C4_value,
01278 FIO_LIST_C8_value,
01279 FIO_LIST_C16_value,
01280 FIOOPER_NONE
01281 };
01282
01283
01284
01285
01286
01287
01288
01289
01290
01291
01292
01293
01294 static INT32 fio_dummy_max = 0;
01295 static INT32 fio_dummy_count;
01296 static BOOL *fio_dummy_ref;
01297 static ST ** fio_dummy_st;
01298 static TY_IDX *fio_dummy_tyidx;
01299 static WN_OFFSET *fio_dummy_ofst;
01300
01301
01302
01303
01304
01305
01306 static TY_IDX fioruntime_ty = (TY_IDX) 0;
01307
01308 static TY_IDX fiostruct_ty [FIOSTRUCTID_LAST + 1] = {
01309 (TY_IDX) 0,
01310 (TY_IDX) 0,
01311 (TY_IDX) 0,
01312 (TY_IDX) 0,
01313 (TY_IDX) 0,
01314 (TY_IDX) 0,
01315 (TY_IDX) 0,
01316 (TY_IDX) 0,
01317 (TY_IDX) 0,
01318 (TY_IDX) 0,
01319 (TY_IDX) 0,
01320 (TY_IDX) 0,
01321 (TY_IDX) 0,
01322 (TY_IDX) 0,
01323 (TY_IDX) 0,
01324 (TY_IDX) 0,
01325 (TY_IDX) 0,
01326 (TY_IDX) 0,
01327 (TY_IDX) 0
01328 };
01329
01330 static ST * fiostruct_st [FIOSTRUCTID_LAST + 1] = {
01331 NULL,
01332 NULL,
01333 NULL,
01334 NULL,
01335 NULL,
01336 NULL,
01337 NULL,
01338 NULL,
01339 NULL,
01340 NULL,
01341 NULL,
01342 NULL,
01343 NULL,
01344 NULL,
01345 NULL,
01346 NULL,
01347 NULL,
01348 NULL,
01349 NULL
01350 };
01351
01352 static PU * fio_current_pu = NULL;
01353 static PU * mp_fio_current_pu = NULL;
01354
01355 static PU * namelist_current_pu = NULL;
01356 static PU * cray_iolist_current_pu = NULL;
01357 static WN * namelist_node_list = NULL;
01358 static WN * namelist_node = NULL;
01359 static ST * container_block_for_iolists = NULL;
01360 static INT32 num_iolists = 0;
01361
01362
01363
01364
01365
01366
01367
01368
01369 static FIOSTRUCTID_INFO fiostructid_info [FIOSTRUCTID_LAST + 1] = {
01370 FIOSTRUCT_NONE, FIOSTRUCT_NONE, 0, 0, "", "",
01371 "",
01372 FSC_CIERR, FSC_CISIZE, 72, 112, ".cilist", ".cilist_ptr",
01373 "_cilist",
01374 FSI_ICIERR, FSI_ICIRNUM, 32, 64, ".icilist", ".icilist_ptr",
01375 "_icilist",
01376 FSO_OERR, FSO_OPOSITIONLEN, 136, 240, ".olist", ".olist_ptr",
01377 "_olist",
01378 FSF_FERR, FSF_FREC, 16, 16, ".flist", ".flist_ptr",
01379 "_flist",
01380 FSN_INERR, FSN_INWRITELEN, 216, 416, ".inlist", ".inlist_ptr",
01381 "_inlist",
01382 FSA_AERR, FSA_AUNIT, 8, 8, ".alist", ".alist_ptr",
01383 "_alist",
01384 FSL_CLERR, FSL_CLSTA, 16, 16, ".cllist", ".cllist_ptr",
01385 "_cllist",
01386 FSK_START, FSK_KEYTYPE, 6, 6, ".keyspec", ".keyspec_ptr",
01387 "_keyspec",
01388 FCR_CI_WORD1, FCR_CI_SIZE, 48, 88, ".cray_clist", ".cray_clist_ptr",
01389 "_cray_clist",
01390 FCR_FCD_ADDR, FCR_FCD_LEN, 8, 16, ".cray_fcd", ".cray_fcd_ptr",
01391 "cray_fcd",
01392 FCR_IOL_HEAD, FCR_IOL_HEAD, 8, 8, ".cray_iolist", ".cray_iolist_ptr",
01393 "_cray_iolist",
01394 FCR_OPEN_VERSION, FCR_OPEN_PAD, 96, 184, ".cray_open_desc", ".cray_open_desc_ptr",
01395 "_cray_open_desc",
01396 FCR_CLOSE_VERSION, FCR_CLOSE_STATUS, 28, 48, ".cray_close_desc", ".cray_close_desc_ptr",
01397 "_cray_close_desc",
01398 FCR_INQ_VERSION, FCR_INQ_PAD, 172, 336, ".cray_inq_desc", ".cray_inq_desc_ptr",
01399 "_cray_inq_desc",
01400 FCR_DV_BASE_PTR, FCR_DV_DIM7_EXTENT, 116, 216, ".cray_dv_desc", ".cray_dv_desc_ptr",
01401 "_cray_dv_desc",
01402 FCR_IOSCALAR_ENTRY, FCR_IOSCALAR_CHAR_LEN, 24, 32, ".ioscalar_entry", "_ioscalar_ptr",
01403 "_ioscalar_entry",
01404 FCR_IOARRAY_ENTRY, FCR_IOARRAY_FLAG, 20, 24, ".ioarray_entry", "_ioarray_ptr",
01405 "_ioarray_entry",
01406 FCR_IOIMPLIEDDO_ENTRY, FCR_IOIMPLIEDDO_INC_CNT, 24, 40, ".ioimplieddo_entry", "_ioimplieddo_ptr",
01407 "_ioimplieddo_entry"
01408 };
01409
01410 static FIOSTRUCT_INFO fiostruct_info [FIOSTRUCT_LAST + 1] = {
01411 0, 0, 0, 0, FIOSTRUCTID_NONE, "",
01412
01413
01414 0, MTYPE_I4, 0, MTYPE_I4, FID_CILIST, "cierr",
01415
01416 4, MTYPE_I4, 4, MTYPE_I4, FID_CILIST, "ciunit",
01417
01418 8, MTYPE_I4, 8, MTYPE_I4, FID_CILIST, "ciend",
01419
01420 12, MTYPE_U4, 16, MTYPE_U8, FID_CILIST, "cifmt",
01421
01422 16, MTYPE_I8, 24, MTYPE_I8, FID_CILIST, "cirec",
01423
01424 24, MTYPE_I4, 32, MTYPE_I4, FID_CILIST, "cimatch",
01425
01426 28, MTYPE_I4, 36, MTYPE_I4, FID_CILIST, "cikeytype",
01427
01428 32, MTYPE_I4, 40, MTYPE_I8, FID_CILIST, "cikeyval",
01429
01430 36, MTYPE_I4, 48, MTYPE_I4, FID_CILIST, "cikeyid",
01431
01432 40, MTYPE_U4, 56, MTYPE_U8, FID_CILIST, "cinml",
01433
01434 44, MTYPE_I4, 64, MTYPE_I4, FID_CILIST, "cikeyvallen",
01435
01436 48, MTYPE_U4, 72, MTYPE_U8, FID_CILIST, "ciadvance",
01437
01438 52, MTYPE_I4, 80, MTYPE_I4, FID_CILIST, "ciadvancelen",
01439
01440 56, MTYPE_I4, 84, MTYPE_I4, FID_CILIST, "cieor",
01441
01442 60, MTYPE_U4, 88, MTYPE_U8, FID_CILIST, "cisize",
01443
01444 64, MTYPE_U4, 96, MTYPE_U8, FID_CILIST, "civfmt",
01445
01446 68, MTYPE_U4, 104, MTYPE_U8, FID_CILIST, "civfmtfp",
01447
01448
01449 0, MTYPE_I4, 0, MTYPE_I4, FID_ICILIST, "icierr",
01450
01451 4, MTYPE_U4, 8, MTYPE_U8, FID_ICILIST, "iciunit",
01452
01453 8, MTYPE_I4, 16, MTYPE_I4, FID_ICILIST, "iciend",
01454
01455 12, MTYPE_U4, 24, MTYPE_U8, FID_ICILIST, "icifmt",
01456
01457 16, MTYPE_I4, 32, MTYPE_I8, FID_ICILIST, "icirlen",
01458
01459 20, MTYPE_I4, 40, MTYPE_I8, FID_ICILIST, "icirnum",
01460
01461 24, MTYPE_U4, 48, MTYPE_U8, FID_ICILIST, "icivfmt",
01462
01463 28, MTYPE_U4, 56, MTYPE_U8, FID_ICILIST, "icivfmtfp",
01464
01465
01466 0, MTYPE_I4, 0, MTYPE_I4, FID_OLIST, "oerr",
01467
01468 4, MTYPE_I4, 4, MTYPE_I4, FID_OLIST, "ounit",
01469
01470 8, MTYPE_U4, 8, MTYPE_U8, FID_OLIST, "ofnm",
01471
01472 12, MTYPE_I4, 16, MTYPE_I4, FID_OLIST, "ofnmlen",
01473
01474 16, MTYPE_U4, 24, MTYPE_U8, FID_OLIST, "osta",
01475
01476 20, MTYPE_U4, 32, MTYPE_U8, FID_OLIST, "oacc",
01477
01478 24, MTYPE_U4, 40, MTYPE_U8, FID_OLIST, "ofm",
01479
01480 28, MTYPE_I4, 48, MTYPE_I8, FID_OLIST, "orl",
01481
01482 32, MTYPE_U4, 56, MTYPE_U8, FID_OLIST, "oblnk",
01483
01484 36, MTYPE_U4, 64, MTYPE_U8, FID_OLIST, "occ",
01485
01486 40, MTYPE_U4, 72, MTYPE_U8, FID_OLIST, "oorg",
01487
01488 44, MTYPE_I4, 80, MTYPE_I4, FID_OLIST, "oshared",
01489
01490 48, MTYPE_I4, 84, MTYPE_I4, FID_OLIST, "oreadonly",
01491
01492 52, MTYPE_I4, 88, MTYPE_I4, FID_OLIST, "onkeys",
01493
01494 56, MTYPE_U4, 96, MTYPE_U8, FID_OLIST, "okeys",
01495
01496 60, MTYPE_U4, 104, MTYPE_U8, FID_OLIST, "oassocv",
01497
01498 64, MTYPE_I8, 112, MTYPE_I8, FID_OLIST, "omaxrec",
01499
01500 72, MTYPE_U4, 120, MTYPE_U8, FID_OLIST, "odfnm",
01501
01502 76, MTYPE_I4, 128, MTYPE_I4, FID_OLIST, "odfnmlen",
01503
01504 80, MTYPE_U4, 136, MTYPE_U8, FID_OLIST, "odisp",
01505
01506 84, MTYPE_U4, 144, MTYPE_U8, FID_OLIST, "orectype",
01507
01508 88, MTYPE_U4, 152, MTYPE_U8, FID_OLIST, "oconv",
01509
01510 92, MTYPE_I4, 160, MTYPE_I4, FID_OLIST, "oconvlen",
01511
01512 96, MTYPE_I4, 164, MTYPE_I4, FID_OLIST, "obuffsize",
01513
01514 100, MTYPE_I4, 168, MTYPE_I4, FID_OLIST, "odirect",
01515
01516 104, MTYPE_U4, 176, MTYPE_U8, FID_OLIST, "oaction",
01517
01518 108, MTYPE_I4, 184, MTYPE_I4, FID_OLIST, "oactionlen",
01519
01520 112, MTYPE_U4, 192, MTYPE_U8, FID_OLIST, "odelim",
01521
01522 116, MTYPE_I4, 200, MTYPE_I4, FID_OLIST, "odelimlen",
01523
01524 120, MTYPE_U4, 208, MTYPE_U8, FID_OLIST, "opad",
01525
01526 124, MTYPE_I4, 216, MTYPE_I4, FID_OLIST, "opadlen",
01527
01528 128, MTYPE_U4, 224, MTYPE_U8, FID_OLIST, "oposition",
01529
01530 132, MTYPE_I4, 232, MTYPE_I4, FID_OLIST, "opositionlen",
01531
01532
01533 0, MTYPE_I4, 0, MTYPE_I4, FID_FLIST, "ferr",
01534
01535 4, MTYPE_I4, 4, MTYPE_I4, FID_FLIST, "funit",
01536
01537 8, MTYPE_I8, 8, MTYPE_I8, FID_FLIST, "frec",
01538
01539
01540 0, MTYPE_I4, 0, MTYPE_I4, FID_INLIST, "inerr",
01541
01542 4, MTYPE_I4, 4, MTYPE_I4, FID_INLIST, "inunit",
01543
01544 8, MTYPE_U4, 8, MTYPE_U8, FID_INLIST, "infile",
01545
01546 12, MTYPE_I4, 16, MTYPE_I4, FID_INLIST, "infilen",
01547
01548 16, MTYPE_U4, 24, MTYPE_U8, FID_INLIST, "inex",
01549
01550 20, MTYPE_U4, 32, MTYPE_U8, FID_INLIST, "inopen",
01551
01552 24, MTYPE_U4, 40, MTYPE_U8, FID_INLIST, "innum",
01553
01554 28, MTYPE_U4, 48, MTYPE_U8, FID_INLIST, "innamed",
01555
01556 32, MTYPE_U4, 56, MTYPE_U8, FID_INLIST, "inname",
01557
01558 36, MTYPE_I4, 64, MTYPE_I4, FID_INLIST, "innamlen",
01559
01560 40, MTYPE_U4, 72, MTYPE_U8, FID_INLIST, "inacc",
01561
01562 44, MTYPE_I4, 80, MTYPE_I4, FID_INLIST, "inacclen",
01563
01564 48, MTYPE_U4, 88, MTYPE_U8, FID_INLIST, "inseq",
01565
01566 52, MTYPE_I4, 96, MTYPE_I4, FID_INLIST, "inseqlen",
01567
01568 56, MTYPE_U4, 104, MTYPE_U8, FID_INLIST, "indir",
01569
01570 60, MTYPE_I4, 112, MTYPE_I4, FID_INLIST, "indirlen",
01571
01572 64, MTYPE_U4, 120, MTYPE_U8, FID_INLIST, "infmt",
01573
01574 68, MTYPE_I4, 128, MTYPE_I4, FID_INLIST, "infmtlen",
01575
01576 72, MTYPE_U4, 136, MTYPE_U8, FID_INLIST, "inform",
01577
01578 76, MTYPE_I4, 144, MTYPE_I4, FID_INLIST, "informlen",
01579
01580 80, MTYPE_U4, 152, MTYPE_U8, FID_INLIST, "inunf",
01581
01582 84, MTYPE_I4, 160, MTYPE_I4, FID_INLIST, "inunflen",
01583
01584 88, MTYPE_U4, 168, MTYPE_U8, FID_INLIST, "inrecl",
01585
01586 92, MTYPE_U4, 176, MTYPE_U8, FID_INLIST, "innrec",
01587
01588 96, MTYPE_U4, 184, MTYPE_U8, FID_INLIST, "inblank",
01589
01590 100, MTYPE_I4, 192, MTYPE_I4, FID_INLIST, "inblanklen",
01591
01592 104, MTYPE_U4, 200, MTYPE_U8, FID_INLIST, "indefaultfile",
01593
01594 108, MTYPE_I4, 208, MTYPE_I4, FID_INLIST, "indefaultfilelen",
01595
01596 112, MTYPE_U4, 216, MTYPE_U8, FID_INLIST, "incc",
01597
01598 116, MTYPE_I4, 224, MTYPE_I4, FID_INLIST, "incclen",
01599
01600 120, MTYPE_U4, 232, MTYPE_U8, FID_INLIST, "inkeyed",
01601
01602 124, MTYPE_I4, 240, MTYPE_I4, FID_INLIST, "inkeyedlen",
01603
01604 128, MTYPE_U4, 248, MTYPE_U8, FID_INLIST, "inorg",
01605
01606 132, MTYPE_I4, 256, MTYPE_I4, FID_INLIST, "inorglen",
01607
01608 136, MTYPE_U4, 264, MTYPE_U8, FID_INLIST, "inrecordtype",
01609
01610 140, MTYPE_I4, 272, MTYPE_I4, FID_INLIST, "inrecordtypelen",
01611
01612 144, MTYPE_U4, 280, MTYPE_U8, FID_INLIST, "inconv",
01613
01614 148, MTYPE_I4, 288, MTYPE_I4, FID_INLIST, "inconvlen",
01615
01616 152, MTYPE_U4, 296, MTYPE_U8, FID_INLIST, "inbuffsize",
01617
01618 156, MTYPE_U4, 304, MTYPE_U8, FID_INLIST, "inaction",
01619
01620 160, MTYPE_I4, 312, MTYPE_I4, FID_INLIST, "inactionlen",
01621
01622 164, MTYPE_U4, 320, MTYPE_U8, FID_INLIST, "indelim",
01623
01624 168, MTYPE_I4, 328, MTYPE_I4, FID_INLIST, "indelimlen",
01625
01626 172, MTYPE_U4, 336, MTYPE_U8, FID_INLIST, "inpad",
01627
01628 176, MTYPE_I4, 344, MTYPE_I4, FID_INLIST, "inpadlen",
01629
01630 180, MTYPE_U4, 352, MTYPE_U8, FID_INLIST, "inposition",
01631
01632 184, MTYPE_I4, 360, MTYPE_I4, FID_INLIST, "inpositionlen",
01633
01634 188, MTYPE_U4, 368, MTYPE_U8, FID_INLIST, "inread",
01635
01636 192, MTYPE_I4, 376, MTYPE_I4, FID_INLIST, "inreadlen",
01637
01638 196, MTYPE_U4, 384, MTYPE_U8, FID_INLIST, "inreadwrite",
01639
01640 200, MTYPE_I4, 392, MTYPE_I4, FID_INLIST, "inreadwritelen",
01641
01642 204, MTYPE_U4, 400, MTYPE_U8, FID_INLIST, "inwrite",
01643
01644 208, MTYPE_I4, 408, MTYPE_I4, FID_INLIST, "inwritelen",
01645
01646
01647 0, MTYPE_I4, 0, MTYPE_I4, FID_ALIST, "aerr",
01648
01649 4, MTYPE_I4, 4, MTYPE_I4, FID_ALIST, "aunit",
01650
01651
01652 0, MTYPE_I4, 0, MTYPE_I4, FID_CLLIST, "clerr",
01653
01654 4, MTYPE_I4, 4, MTYPE_I4, FID_CLLIST, "clunit",
01655
01656 8, MTYPE_U4, 8, MTYPE_U8, FID_CLLIST, "clsta",
01657
01658
01659 0, MTYPE_I2, 0, MTYPE_I2, FID_KEYSPEC, "keystart",
01660
01661 2, MTYPE_I2, 2, MTYPE_I2, FID_KEYSPEC, "keyend",
01662
01663 4, MTYPE_I2, 4, MTYPE_I2, FID_KEYSPEC, "keytype",
01664
01665
01666 0, MTYPE_U8, 0, MTYPE_U8, FID_CRAY_CLIST, "cray_ci_word1",
01667
01668 8, MTYPE_M, 8, MTYPE_M, FID_CRAY_CLIST, "cray_ci_unit",
01669
01670 16, MTYPE_U4, 24, MTYPE_U8, FID_CRAY_CLIST, "cray_ci_iostat",
01671
01672 20, MTYPE_U4, 32, MTYPE_U8, FID_CRAY_CLIST, "cray_ci_rec",
01673
01674 24, MTYPE_U4, 40, MTYPE_U8, FID_CRAY_CLIST, "cray_ci_parsfmt",
01675
01676 28, MTYPE_M, 48, MTYPE_M, FID_CRAY_CLIST, "cray_ci_fmtsrc",
01677
01678 36, MTYPE_M, 64, MTYPE_M, FID_CRAY_CLIST, "cray_ci_advance",
01679
01680 44, MTYPE_U4, 80, MTYPE_U8, FID_CRAY_CLIST, "cray_ci_size",
01681
01682
01683 0, MTYPE_U4, 0, MTYPE_U8, FID_CRAY_FCD, "cray_fcd_addr",
01684
01685 4, MTYPE_U4, 8, MTYPE_U8, FID_CRAY_FCD, "cray_fcd_len",
01686
01687
01688 0, MTYPE_U8, 0, MTYPE_U8, FID_CRAY_IOLIST, "cray_iol_head",
01689
01690
01691 0, MTYPE_U8, 0, MTYPE_U8, FID_CRAY_OPENLIST, "cray_open_version",
01692
01693 8, MTYPE_U4, 8, MTYPE_U8, FID_CRAY_OPENLIST, "cray_open_unit",
01694
01695 12, MTYPE_U4, 16, MTYPE_U8, FID_CRAY_OPENLIST, "cray_open_iostat",
01696
01697 16, MTYPE_U4, 24, MTYPE_U8, FID_CRAY_OPENLIST, "cray_open_err",
01698
01699 20, MTYPE_M, 32, MTYPE_M, FID_CRAY_OPENLIST, "cray_open_file",
01700
01701 28, MTYPE_M, 48, MTYPE_M, FID_CRAY_OPENLIST, "cray_open_status",
01702
01703 36, MTYPE_M, 64, MTYPE_M, FID_CRAY_OPENLIST, "cray_open_access",
01704
01705 44, MTYPE_M, 80, MTYPE_M, FID_CRAY_OPENLIST, "cray_open_form",
01706
01707 52, MTYPE_U4, 96, MTYPE_U8, FID_CRAY_OPENLIST, "cray_open_recl",
01708
01709 56, MTYPE_M, 104, MTYPE_M, FID_CRAY_OPENLIST, "cray_open_blank",
01710
01711 64, MTYPE_M, 120, MTYPE_M, FID_CRAY_OPENLIST, "cray_open_position",
01712
01713 72, MTYPE_M, 136, MTYPE_M, FID_CRAY_OPENLIST, "cray_open_action",
01714
01715 80, MTYPE_M, 152, MTYPE_M, FID_CRAY_OPENLIST, "cray_open_delim",
01716
01717 88, MTYPE_M, 168, MTYPE_M, FID_CRAY_OPENLIST, "cray_open_pad",
01718
01719
01720 0, MTYPE_U8, 0, MTYPE_U8, FID_CRAY_CLOSELIST, "cray_close_version",
01721
01722 8, MTYPE_U4, 8, MTYPE_U8, FID_CRAY_CLOSELIST, "cray_close_unit",
01723
01724 12, MTYPE_U4, 16, MTYPE_U8, FID_CRAY_CLOSELIST, "cray_close_iostat",
01725
01726 16, MTYPE_U4, 24, MTYPE_U8, FID_CRAY_CLOSELIST, "cray_close_err",
01727
01728 20, MTYPE_M, 32, MTYPE_M, FID_CRAY_CLOSELIST, "cray_close_status",
01729
01730
01731 0, MTYPE_U8, 0, MTYPE_U8, FID_CRAY_INQLIST, "cray_inq_version",
01732
01733 8, MTYPE_U4, 8, MTYPE_U8, FID_CRAY_INQLIST, "cray_inq_unit",
01734
01735 12, MTYPE_M, 16, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_file",
01736
01737 20, MTYPE_U4, 32, MTYPE_U8, FID_CRAY_INQLIST, "cray_inq_iostat",
01738
01739 24, MTYPE_U4, 40, MTYPE_U8, FID_CRAY_INQLIST, "cray_inq_err",
01740
01741 28, MTYPE_U4, 48, MTYPE_U8, FID_CRAY_INQLIST, "cray_inq_exist",
01742
01743 32, MTYPE_U4, 56, MTYPE_U8, FID_CRAY_INQLIST, "cray_inq_opened",
01744
01745 36, MTYPE_U4, 64, MTYPE_U8, FID_CRAY_INQLIST, "cray_inq_number",
01746
01747 40, MTYPE_U4, 72, MTYPE_U8, FID_CRAY_INQLIST, "cray_inq_named",
01748
01749 44, MTYPE_M, 80, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_name",
01750
01751 52, MTYPE_M, 96, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_access",
01752
01753 60, MTYPE_M, 112, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_sequential",
01754
01755 68, MTYPE_M, 128, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_direct",
01756
01757 76, MTYPE_M, 144, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_form",
01758
01759 84, MTYPE_M, 160, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_formatted",
01760
01761 92, MTYPE_M, 176, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_unformatted",
01762
01763 100, MTYPE_U4, 192, MTYPE_U8, FID_CRAY_INQLIST, "cray_inq_recl",
01764
01765 104, MTYPE_U4, 200, MTYPE_U8, FID_CRAY_INQLIST, "cray_inq_nextrec",
01766
01767 108, MTYPE_M, 208, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_blank",
01768
01769 116, MTYPE_M, 224, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_position",
01770
01771 124, MTYPE_M, 240, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_action",
01772
01773 132, MTYPE_M, 256, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_read",
01774
01775 140, MTYPE_M, 272, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_write",
01776
01777 148, MTYPE_M, 288, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_readwrite",
01778
01779 156, MTYPE_M, 304, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_delim",
01780
01781 164, MTYPE_M, 320, MTYPE_M, FID_CRAY_INQLIST, "cray_inq_pad",
01782
01783
01784 0, MTYPE_U4, 0, MTYPE_U8, FID_CRAY_DOPEVEC, "cray_dv_base_addr",
01785
01786 4, MTYPE_I4, 8, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_base_len",
01787
01788 8, MTYPE_U8, 16, MTYPE_U8, FID_CRAY_DOPEVEC, "cray_dv_flag_info",
01789
01790 16, MTYPE_U8, 24, MTYPE_U8, FID_CRAY_DOPEVEC, "cray_dv_type_len",
01791
01792 24, MTYPE_U4, 32, MTYPE_U8, FID_CRAY_DOPEVEC, "cray_dv_orig_base",
01793
01794 28, MTYPE_I4, 40, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_orig_size",
01795
01796 32, MTYPE_I4, 48, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim1_lb",
01797
01798 36, MTYPE_I4, 56, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim1_extent",
01799
01800 40, MTYPE_I4, 64, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim1_stride",
01801
01802 44, MTYPE_I4, 72, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim2_lb",
01803
01804 48, MTYPE_I4, 80, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim2_extent",
01805
01806 52, MTYPE_I4, 88, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim2_stride",
01807
01808 56, MTYPE_I4, 96, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim3_lb",
01809
01810 60, MTYPE_I4, 104, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim3_extent",
01811
01812 64, MTYPE_I4, 112, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim3_stride",
01813
01814 68, MTYPE_I4, 120, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim4_lb",
01815
01816 72, MTYPE_I4, 128, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim4_extent",
01817
01818 76, MTYPE_I4, 136, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim4_stride",
01819
01820 80, MTYPE_I4, 144, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim5_lb",
01821
01822 84, MTYPE_I4, 152, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim5_extent",
01823
01824 88, MTYPE_I4, 160, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim5_stride",
01825
01826 92, MTYPE_I4, 168, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim6_lb",
01827
01828 96, MTYPE_I4, 176, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim6_extent",
01829
01830 100, MTYPE_I4, 184, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim6_stride",
01831
01832 104, MTYPE_I4, 192, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim7_lb",
01833
01834 108, MTYPE_I4, 200, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim7_extent",
01835
01836 112, MTYPE_I4, 208, MTYPE_I8, FID_CRAY_DOPEVEC, "cray_dv_dim7_stride",
01837
01838
01839 0, MTYPE_I8, 0, MTYPE_I8, FID_IOSCALAR_ENTRY, "scalar_header",
01840 8, MTYPE_I8, 8, MTYPE_I8, FID_IOSCALAR_ENTRY, "scalar_type_t",
01841 16, MTYPE_U4, 16, MTYPE_U8, FID_IOSCALAR_ENTRY, "iovar_address",
01842 20, MTYPE_I4, 24, MTYPE_I8, FID_IOSCALAR_ENTRY, "scalar_char_len",
01843
01844
01845 0, MTYPE_I8, 0, MTYPE_I8, FID_IOARRAY_ENTRY, "array_header",
01846 8, MTYPE_U4, 8, MTYPE_U8, FID_IOARRAY_ENTRY, "dope_vector_addr",
01847 12, MTYPE_I8, 16, MTYPE_I8, FID_IOARRAY_ENTRY, "array_flag",
01848 20, MTYPE_U4, 24, MTYPE_U8, FID_IOARRAY_ENTRY, "array_indx_1",
01849 24, MTYPE_U4, 32, MTYPE_U8, FID_IOARRAY_ENTRY, "array_indx_2",
01850 28, MTYPE_U4, 40, MTYPE_U8, FID_IOARRAY_ENTRY, "array_indx_3",
01851 32, MTYPE_U4, 48, MTYPE_U8, FID_IOARRAY_ENTRY, "array_indx_4",
01852 36, MTYPE_U4, 56, MTYPE_U8, FID_IOARRAY_ENTRY, "array_indx_5",
01853 40, MTYPE_U4, 64, MTYPE_U8, FID_IOARRAY_ENTRY, "array_indx_6",
01854 44, MTYPE_U4, 72, MTYPE_U8, FID_IOARRAY_ENTRY, "array_indx_7",
01855
01856
01857 0, MTYPE_I8, 0, MTYPE_I8, FID_IOIMPLIEDDO_ENTRY, "implieddo_header",
01858 8, MTYPE_U4, 8, MTYPE_U8, FID_IOIMPLIEDDO_ENTRY, "loop_var_addr",
01859 12, MTYPE_U4, 16, MTYPE_U8, FID_IOIMPLIEDDO_ENTRY, "begin_cnt_addr",
01860 16, MTYPE_U4, 24, MTYPE_U8, FID_IOIMPLIEDDO_ENTRY, "end_cnt__addr",
01861 20, MTYPE_U4, 32, MTYPE_U8, FID_IOIMPLIEDDO_ENTRY, "inc_cnt_addr",
01862 };
01863
01864
01865 #define FIO_OFFSET(i) ((Pointer_Size == 4) ? fiostruct_info[i].offset32 \
01866 : fiostruct_info[i].offset64)
01867 #define FIO_TYPE(i) ((Pointer_Size == 4) ? fiostruct_info[i].type32 \
01868 : fiostruct_info[i].type64)
01869 #define FIO_SIZE(i) ((Pointer_Size == 4) ? fiostructid_info[i].size32 \
01870 : fiostructid_info[i].size64)
01871 #define Int_Type ((Pointer_Size == 4) ? MTYPE_I4 : MTYPE_I8)
01872 #define OPC_IntWord ((Pointer_Size == 4) ? OPC_I4INTCONST : OPC_I8INTCONST)
01873
01874
01875 static WN *extract_calls ( WN *, WN * );
01876 static INT32
01877 lower_f77_io_items ( WN *, WN *, WN *, WN*, WN*, FIOOPER, BOOL, INT32 *,
01878 INT32, INT32 );
01879 static void
01880 lower_f77_record_items (WN *, WN *, WN *, WN *, WN *, WN *,
01881 FIOOPER, ST **, TY_IDX*, INT32 *, FLD_HANDLE&,
01882 INT32 *, INT32 *, INT32, TY_IDX , INT64);
01883
01884
01885
01886 static INT32 fio_maskcode [MTYPE_LAST + 1] = {
01887 0,
01888 0,
01889 1,
01890 2,
01891 0,
01892 3,
01893 1,
01894 2,
01895 0,
01896 3,
01897 0,
01898 0,
01899 0,
01900 0,
01901 0,
01902 0,
01903 0,
01904 0,
01905 0,
01906 0,
01907 0
01908 };
01909
01910
01911
01912 typedef enum {
01913 ARB_UBOUND,
01914 ARB_LBOUND,
01915 ARB_STRIDE
01916 } arb_enum;
01917
01918 static WN *
01919 Get_ST_Ldid(ST_IDX st)
01920 {
01921 WN *r;
01922 TY_IDX ty;
01923 ty = ST_type(st);
01924 r = WN_Ldid(TY_mtype(ty),0,st,ty);
01925 return (r);
01926 }
01927
01928 static void io_set_addr_passed_flag(ST *st) {
01929 if ( WHIRL_Addr_Passed_On )
01930 Set_ST_addr_passed(st);
01931 if (WHIRL_Addr_Saved_For_Passed_On)
01932 Set_ST_addr_saved(st);
01933 }
01934
01935 static void io_set_addr_saved_flag(ST *st) {
01936 if (WHIRL_Addr_Saved_On)
01937 Set_ST_addr_saved(st);
01938 }
01939
01940
01941 static WN *
01942 Get_ARB_WN(const ARB_HANDLE arb, arb_enum whattoget)
01943 {
01944 switch (whattoget) {
01945 case ARB_UBOUND:
01946 if (ARB_const_ubnd(arb)) {
01947 return (WN_Intconst(MTYPE_I8,ARB_ubnd_val(arb)));
01948 } else {
01949 return (Get_ST_Ldid(ARB_ubnd_var(arb)));
01950 }
01951 case ARB_LBOUND:
01952 if (ARB_const_lbnd(arb)) {
01953 return (WN_Intconst(MTYPE_I8,ARB_lbnd_val(arb)));
01954 } else {
01955 return (Get_ST_Ldid(ARB_lbnd_var(arb)));
01956 }
01957 case ARB_STRIDE:
01958 if (ARB_const_stride(arb)) {
01959 return (WN_Intconst(MTYPE_I8,ARB_stride_val(arb)));
01960 } else {
01961 return (Get_ST_Ldid(ARB_stride_var(arb)));
01962 }
01963 }
01964 Fail_FmtAssertion("bad arguments to Get_ARB_WN");
01965 return NULL;
01966 }
01967
01968
01969 static TY_IDX
01970 Make_Simple_Array_Type (const char *name, INT32 n_elems, TY_IDX elem_ty)
01971 {
01972 TY_IDX ty_idx;
01973 TY& ty = New_TY (ty_idx);
01974
01975 UINT32 elem_size = TY_size (elem_ty);
01976
01977 TY_Init (ty, elem_size * n_elems, KIND_ARRAY, MTYPE_UNKNOWN,
01978 Save_Str (name));
01979 Set_TY_etype (ty, elem_ty);
01980
01981 ARB_HANDLE arb = New_ARB ();
01982 ARB_Init (arb, 0, n_elems - 1, elem_size);
01983 Set_ARB_first_dimen (arb);
01984 Set_ARB_last_dimen (arb);
01985
01986 Set_TY_arb (ty, arb);
01987 Set_TY_align_exp (ty_idx, TY_align_exp (elem_ty));
01988 return ty_idx;
01989 }
01990
01991
01992 static void
01993 Alloc_More_For_Dummy_Array(void)
01994 {
01995 if (fio_dummy_max == 0) {
01996 fio_dummy_max = 32;
01997 fio_dummy_ref = (BOOL *) malloc (sizeof(BOOL) * fio_dummy_max);
01998 fio_dummy_st = (ST **) malloc (sizeof(ST *) * fio_dummy_max);
01999 fio_dummy_tyidx = (TY_IDX *) malloc (sizeof(TY_IDX *) * fio_dummy_max);
02000 fio_dummy_ofst = (WN_OFFSET *) malloc (sizeof(WN_OFFSET) *
02001 fio_dummy_max);
02002 } else {
02003 fio_dummy_max = fio_dummy_max + (fio_dummy_max >> 1);
02004 fio_dummy_ref = (BOOL *) realloc (fio_dummy_ref,
02005 sizeof(BOOL) * fio_dummy_max);
02006 fio_dummy_st = (ST **) realloc (fio_dummy_st,
02007 sizeof(ST *) * fio_dummy_max);
02008 fio_dummy_tyidx = (TY_IDX *) realloc (fio_dummy_tyidx,
02009 sizeof(TY_IDX *) * fio_dummy_max);
02010 fio_dummy_ofst = (WN_OFFSET *) realloc (fio_dummy_ofst,
02011 sizeof(WN_OFFSET) * fio_dummy_max);
02012 }
02013 }
02014
02015 static void
02016 Add_To_Dummy_List(WN *dummy)
02017 {
02018 while ((WN_operator(dummy) != OPR_LDA) &&
02019 (WN_operator(dummy) != OPR_LDID))
02020 if ((WN_operator(dummy) == OPR_ADD) &&
02021 (WN_operator(WN_kid0(dummy)) == OPR_MPY))
02022 dummy = WN_kid1(dummy);
02023 else
02024 dummy = WN_kid0(dummy);
02025
02026 if (fio_dummy_count == fio_dummy_max)
02027 Alloc_More_For_Dummy_Array();
02028
02029 ST* st = WN_st (dummy);
02030 fio_dummy_ref[fio_dummy_count] = WN_operator(dummy) == OPR_LDA;
02031 fio_dummy_st[fio_dummy_count] = st;
02032 fio_dummy_tyidx[fio_dummy_count] = WN_ty(dummy);
02033 fio_dummy_ofst[fio_dummy_count++] = WN_offset(dummy);
02034 if (ST_class(st) == CLASS_VAR)
02035 io_set_addr_saved_flag(st);
02036 }
02037
02038 static char *
02039 Remove_Trailing_Blanks(char *s)
02040 {
02041 char *c;
02042 c = s + strlen(s) - 1;
02043 while (*c == ' ')
02044 c--;
02045 c++;
02046 *c = '\0';
02047 return s;
02048 }
02049
02050
02051
02052
02053
02054
02055
02056
02057
02058
02059 extern TY_IDX
02060 Find_array_TY(TY_IDX ty)
02061 {
02062 TY_IDX rty ;
02063
02064 switch(TY_kind(ty)) {
02065 case KIND_ARRAY:
02066 case KIND_SCALAR:
02067 case KIND_STRUCT:
02068 case KIND_FUNCTION:
02069 case KIND_VOID:
02070 rty = ty;
02071 break;
02072
02073 case KIND_POINTER:
02074 rty = Find_array_TY(TY_pointed(Ty_Table[ty])) ;
02075 break;
02076
02077 default:
02078 DevAssert((0),("Odd array ty"));
02079 break;
02080 }
02081
02082 return(rty);
02083 }
02084
02085
02086
02087
02088
02089
02090
02091
02092
02093
02094 extern TY_IDX
02095 Find_scalar_TY(TY_IDX ty)
02096 {
02097 TY_IDX rty ;
02098
02099 switch(TY_kind(ty)) {
02100
02101 case KIND_VOID:
02102 case KIND_SCALAR:
02103 case KIND_STRUCT:
02104 case KIND_POINTER:
02105 case KIND_FUNCTION:
02106 rty = ty;
02107 break;
02108
02109 case KIND_ARRAY:
02110 rty = Find_scalar_TY(TY_AR_etype(ty)) ;
02111 break;
02112
02113 default:
02114 DevAssert((0),("Odd ty"));
02115 break;
02116 }
02117
02118 return(rty);
02119 }
02120
02121
02122
02123
02124
02125
02126
02127 static WN *create_lda_of_temp(WN *block, WN *tree, TY_IDX ty)
02128 {
02129 TYPE_ID type;
02130 ST *st;
02131 WN *stid;
02132
02133 Is_True((WN_operator_is(tree, OPR_PARM)==FALSE),("bad parm"));
02134
02135
02136
02137 if (ty)
02138 type = TY_mtype(ty);
02139 else
02140 type = WN_rtype(tree);
02141
02142 st = Gen_Temp_Symbol( MTYPE_To_TY(type), "complex-temp-expr");
02143 stid = WN_Stid (type, 0, st, ST_type(st), WN_COPY_Tree(tree));
02144 WN_INSERT_BlockLast(block, stid);
02145
02146 return WN_Lda(Pointer_type, WN_store_offset(stid), st);
02147 }
02148
02149
02150
02151
02152
02153
02154
02155
02156
02157
02158
02159
02160
02161
02162
02163
02164
02165
02166
02167
02168
02169 static WN *create_pointer_to_node(WN *block, WN *tree, TY_IDX ty, BOOL deref)
02170 {
02171
02172 TYPE_ID rtype;
02173 TYPE_ID desc;
02174 WN *add;
02175
02176
02177 tree = extract_calls( block, tree );
02178 switch (WN_operator(tree))
02179 {
02180 case OPR_ILOAD:
02181 if (ty)
02182 rtype = TY_mtype( ty );
02183 else
02184 rtype = WN_rtype(tree);
02185
02186 desc = WN_desc(tree);
02187
02188 if (rtype == desc) {
02189 add = WN_Add(Pointer_Mtype,WN_kid0(tree),
02190 WN_Intconst(Pointer_Mtype,WN_load_offset(tree)));
02191 return (add);
02192 } else {
02193 return create_lda_of_temp(block, tree, ty);
02194 }
02195
02196 case OPR_ISTORE:
02197 return WN_kid1(tree);
02198
02199 case OPR_LDID:
02200 if ((Language == LANG_F77) && TY_is_character(Ty_Table [ty])) {
02201
02202
02203
02204
02205 return tree;
02206 }
02207 if (ty)
02208 rtype = TY_mtype( ty );
02209 else
02210 rtype = WN_rtype(tree);
02211
02212 desc = WN_desc(tree);
02213 if ((ST_class(WN_st(tree)) != CLASS_PREG) &&
02214 (rtype == desc)) {
02215 return WN_Lda(Pointer_type, WN_load_offset(tree), WN_st(tree));
02216 } else {
02217 return create_lda_of_temp(block, tree, ty);
02218 }
02219
02220 case OPR_STID:
02221 return WN_Lda(Pointer_type, WN_store_offset(tree), WN_st(tree));
02222
02223 case OPR_ARRAY:
02224 case OPR_LDA:
02225 if (deref) {
02226 return tree;
02227 } else {
02228 return create_lda_of_temp(block, tree, ty);
02229 }
02230
02231 case OPR_ADD:
02232
02233 #ifdef KEY
02234
02235
02236 if (!PU_f90_lang(Get_Current_PU())) {
02237 #else
02238 if (Language != LANG_F90) {
02239 #endif // KEY
02240
02241
02242 if (WN_opcode(tree) == OPC_U4ADD || WN_opcode(tree) == OPC_U8ADD)
02243 return(tree);
02244 else
02245 return create_lda_of_temp(block, tree, ty);
02246 } else {
02247 return create_lda_of_temp(block, tree, ty);
02248 }
02249
02250 case OPR_INTRINSIC_OP:
02251 {
02252
02253
02254
02255 }
02256 default:
02257 return create_lda_of_temp(block, tree, ty);
02258 }
02259 }
02260
02261
02262
02263
02264
02265
02266
02267
02268
02269
02270 extern BOOL
02271 Type_is_logical(TY_IDX ty)
02272 {
02273 TY_IDX ts ;
02274
02275 #ifdef KEY
02276
02277
02278 if (!PU_f90_lang(Get_Current_PU())) {
02279 #else
02280 if (Language != LANG_F90) {
02281 #endif // KEY
02282 ts = Find_array_TY(ty);
02283 ts = Find_scalar_TY(ts);
02284 return (TY_is_logical(Ty_Table[ts]));
02285 } else {
02286 return (TY_is_logical(Ty_Table[ty]));
02287 }
02288 }
02289
02290
02291
02292
02293
02294
02295
02296
02297
02298
02299 static void Make_IoStruct_TY ( FIOSTRUCTID id )
02300 {
02301 INT32 i;
02302 FIOSTRUCT first = fiostructid_info[id].first;
02303 FIOSTRUCT last = fiostructid_info[id].last;
02304
02305
02306
02307
02308
02309
02310
02311
02312 TY_IDX ty_idx;
02313 TY& ty = New_TY (ty_idx);
02314
02315 if (id == FID_CRAY_IOLIST) {
02316 sprintf( seq_buff, "_%d", local_sequence );
02317 TY_Init (ty, (Pointer_Size == 4 ? fiostructid_info[id].size32 :
02318 fiostructid_info[id].size64),
02319 KIND_STRUCT, MTYPE_M,
02320 Save_Str2 (fiostructid_info[id].name, seq_buff));
02321 } else {
02322 TY_Init (ty, (Pointer_Size == 4 ? fiostructid_info[id].size32 :
02323 fiostructid_info[id].size64),
02324 KIND_STRUCT, MTYPE_M,
02325 Save_Str (fiostructid_info[id].name));
02326 }
02327
02328 if (current_io_library == IOLIB_MIPS) {
02329 if (id != FID_KEYSPEC)
02330 Set_TY_align (ty_idx, MTYPE_align_req(MTYPE_I8));
02331 else
02332 Set_TY_align (ty_idx, MTYPE_align_req(MTYPE_I2));
02333 } else {
02334 Set_TY_align (ty_idx, MTYPE_align_req(MTYPE_I8));
02335 }
02336
02337
02338 FLD_HANDLE fld;
02339
02340 for (i = first; i <= last; ++i) {
02341 fld = New_FLD ();
02342 if (Pointer_Size == 4) {
02343 FLD_Init (fld, Save_Str (fiostruct_info[i].name),
02344 Be_Type_Tbl (fiostruct_info[i].type32),
02345 fiostruct_info[i].offset32);
02346 } else
02347 FLD_Init (fld, Save_Str (fiostruct_info[i].name),
02348 Be_Type_Tbl (fiostruct_info[i].type64),
02349 fiostruct_info[i].offset64);
02350 }
02351 Set_FLD_last_field (fld);
02352 Set_TY_fld (ty, FLD_HANDLE (fld.Idx () - (last - first)));
02353
02354
02355
02356
02357
02358
02359
02360
02361 TY_IDX tyx_idx;
02362 TY& tyx = New_TY (tyx_idx);
02363 TY_Init (tyx, Pointer_Size, KIND_POINTER, Pointer_Mtype,
02364 Save_Str (fiostructid_info[id].name_ptr));
02365 Set_TY_align (tyx_idx, Pointer_Size);
02366 Set_TY_pointed (tyx, ty_idx);
02367 fiostruct_ty[id] = ty_idx;
02368 }
02369
02370
02371
02372
02373
02374
02375
02376
02377 static ST * Get_IoStruct_ST ( WN * block, FIOSTRUCTID id, BOOL clear )
02378 {
02379 INT32 i;
02380 ST * st;
02381 WN * wn;
02382
02383
02384
02385 if (Current_pu != fio_current_pu) {
02386 local_sequence = 1;
02387 fio_current_pu = Current_pu;
02388 for (i=FIOSTRUCTID_FIRST; i<=FIOSTRUCTID_LAST; i++)
02389 fiostruct_st[i] = NULL;
02390 }
02391
02392
02393
02394 if ((st = fiostruct_st[id]) == NULL) {
02395
02396
02397
02398
02399 if ((id == FID_CRAY_IOLIST) ||
02400 (fiostruct_ty[id] == (TY_IDX) 0))
02401 Make_IoStruct_TY ( id );
02402
02403
02404
02405
02406 st = New_ST ();
02407 ST_Init (st, 0, CLASS_VAR, SCLASS_AUTO, EXPORT_LOCAL, fiostruct_ty[id]);
02408 io_set_addr_passed_flag(st);
02409
02410
02411
02412
02413 if ((id != FID_CRAY_FCD) && (id != FID_CRAY_IOLIST)
02414 && (id != FID_CRAY_DOPEVEC)) {
02415 Set_ST_name_idx (st, Save_Str ( fiostructid_info[id].name_local ));
02416 fiostruct_st[id] = st;
02417 } else {
02418 sprintf( seq_buff, "_%d", local_sequence++ );
02419 Set_ST_name_idx (st, Save_Str2( fiostructid_info[id].name_local,
02420 seq_buff ));
02421 }
02422 }
02423
02424
02425
02426 if (clear) {
02427 if (Pointer_Size == 4)
02428 wn = WN_CreateMstore ( 0, TY_pointer(ST_type(st)),
02429 WN_CreateIntconst ( OPC_U8INTCONST, 0 ),
02430 WN_CreateLda ( OPC_U4LDA, 0, TY_pointer(ST_type(st)), st),
02431 WN_CreateIntconst ( OPC_U4INTCONST, TY_size(ST_type(st)) ));
02432 else
02433 wn = WN_CreateMstore ( 0, TY_pointer(ST_type(st)),
02434 WN_CreateIntconst ( OPC_U8INTCONST, 0 ),
02435 WN_CreateLda ( OPC_U8LDA, 0, TY_pointer(ST_type(st)), st),
02436 WN_CreateIntconst ( OPC_U8INTCONST, TY_size(ST_type(st)) ));
02437 WN_INSERT_BlockLast ( block, wn );
02438 }
02439
02440 return (st);
02441 }
02442
02443
02444
02445
02446
02447
02448 static ST * Get_KeyStruct_ST ( INT32 nitems )
02449 {
02450 INT32 nelem = nitems/3;
02451 char ty_name[30];
02452 char ptr_name[30];
02453 char st_name[30];
02454
02455
02456
02457 if (fiostruct_ty[FID_KEYSPEC] == (TY_IDX) 0)
02458 Make_IoStruct_TY ( FID_KEYSPEC );
02459
02460
02461
02462 TY_IDX ty_idx;
02463 TY& ty = New_TY (ty_idx);
02464 sprintf( ty_name, ".key_type.%d", nelem );
02465 TY_Init (ty, nelem * TY_size(fiostruct_ty[FID_KEYSPEC]), KIND_ARRAY,
02466 MTYPE_UNKNOWN, Save_Str ( ty_name ));
02467 Set_TY_etype (ty, fiostruct_ty[FID_KEYSPEC]);
02468 Set_TY_align (ty_idx, MTYPE_align_req(MTYPE_I8));
02469
02470 ARB_HANDLE arb = New_ARB ();
02471 ARB_Init (arb, 0, nelem - 1, TY_size(fiostruct_ty[FID_KEYSPEC]));
02472 Set_ARB_first_dimen (arb);
02473 Set_ARB_last_dimen (arb);
02474
02475 Set_TY_arb (ty, arb);
02476
02477
02478
02479
02480 TY_IDX tyx_idx;
02481 TY& tyx = New_TY (tyx_idx);
02482 sprintf( ptr_name, ".key_pointer.%d", nelem );
02483 TY_Init (tyx, Pointer_Size, KIND_POINTER, Pointer_Mtype,
02484 Save_Str (ptr_name));
02485 Set_TY_align (tyx_idx, Pointer_Size);
02486
02487
02488
02489 Set_TY_pointed (tyx, ty_idx);
02490
02491
02492
02493 ST* st = New_ST ();
02494 sprintf( st_name, ".key_array.%d", nelem );
02495 ST_Init (st, Save_Str (st_name), CLASS_VAR, SCLASS_AUTO, EXPORT_LOCAL,
02496 ty_idx);
02497
02498 io_set_addr_saved_flag(st);
02499 fiostruct_st[ FID_KEYSPEC ] = st;
02500
02501 return (st);
02502 }
02503
02504
02505
02506
02507
02508
02509
02510
02511
02512 static ST * Get_UnitPointer_ST ( void )
02513 {
02514 static ST * mpunit_ptr_var;
02515
02516 if (Current_pu != mp_fio_current_pu) {
02517 mp_fio_current_pu = Current_pu;
02518 mpunit_ptr_var = NULL;
02519 }
02520
02521 if (mpunit_ptr_var)
02522 return( mpunit_ptr_var );
02523
02524 static TY_IDX mpunit_ptr_ty_idx;
02525
02526 if (mpunit_ptr_ty_idx == 0) {
02527 TY& mpunit_ptr_ty = New_TY (mpunit_ptr_ty_idx);
02528 TY_Init (mpunit_ptr_ty, Pointer_Size, KIND_POINTER, Pointer_Mtype,
02529 Save_Str( ".mpunit_pointer" ));
02530 Set_TY_pointed (mpunit_ptr_ty, Be_Type_Tbl(MTYPE_I4));
02531 Set_TY_align (mpunit_ptr_ty_idx, Pointer_Size);
02532 }
02533
02534 mpunit_ptr_var = New_ST ();
02535 ST_Init (mpunit_ptr_var, Save_Str (".mpunit_var"), CLASS_VAR,
02536 SCLASS_AUTO, EXPORT_LOCAL, mpunit_ptr_ty_idx);
02537 io_set_addr_saved_flag(mpunit_ptr_var);
02538 return mpunit_ptr_var;
02539 }
02540
02541
02542 static void
02543 Init_fioruntime_ty ()
02544 {
02545 TY& ty = New_TY (fioruntime_ty);
02546 TY_Init (ty, 0, KIND_FUNCTION, MTYPE_UNKNOWN, Save_Str (".ioruntime"));
02547 Set_TY_align (fioruntime_ty, 1);
02548 #ifdef KEY
02549 ty.Set_pu_flag(TY_HAS_PROTOTYPE);
02550 #endif
02551
02552 TYLIST_IDX tylist_idx;
02553 TYLIST& tylist = New_TYLIST (tylist_idx);
02554 Set_TY_tylist (ty, tylist_idx);
02555 Set_TYLIST_type (tylist, Be_Type_Tbl ( MTYPE_I4 ));
02556 Set_TYLIST_type (New_TYLIST (tylist_idx), 0);
02557
02558 TY_IDX tyx_idx;
02559 TY& tyx = New_TY (tyx_idx);
02560 TY_Init (tyx, Pointer_Size, KIND_POINTER, Pointer_Mtype,
02561 Save_Str (".ioruntime_ptr"));
02562 Set_TY_pointed (tyx, fioruntime_ty);
02563 }
02564
02565
02566
02567
02568
02569
02570 static ST * Make_IoRuntime_ST ( FIOOPER op )
02571 {
02572 ST *st;
02573 char mpname[ 40 ];
02574 INT32 i;
02575
02576
02577
02578 if (op == FIOOPER_NONE)
02579 Fail_FmtAssertion("Make_IoRuntime_ST:"
02580 " null runtime operation in I/O processing");
02581
02582
02583
02584
02585 if (fioruntime_ty == (TY_IDX) 0) {
02586 Init_fioruntime_ty ();
02587 }
02588
02589
02590
02591 fio_sts[op] = st = New_ST (GLOBAL_SYMTAB);
02592 STR_IDX st_name;
02593 if (mp_io && (current_io_library == IOLIB_MIPS)) {
02594 strcpy (mpname, fio_names[op] );
02595 i = strlen( mpname );
02596 mpname[i] = '_'; mpname[i+1] = 'm'; mpname[i+2] = 'p'; mpname[i+3] = '\0';
02597 st_name = Save_Str ( mpname );
02598 } else {
02599 if (op == FIO_CR_OPEN && Language == LANG_F77 && current_io_library == IOLIB_CRAY)
02600 st_name = Save_Str ("_OPENF77");
02601 else
02602 st_name = Save_Str ( fio_names[op] );
02603 }
02604
02605 PU_IDX pu_idx;
02606 PU& pu = New_PU (pu_idx);
02607
02608 PU_Init (pu, fioruntime_ty, CURRENT_SYMTAB);
02609
02610 ST_Init (st, st_name, CLASS_FUNC, SCLASS_EXTERN, EXPORT_PREEMPTIBLE,
02611 TY_IDX (pu_idx));
02612
02613 return st;
02614
02615 }
02616
02617
02618
02619
02620
02621 static WN * Make_IoAddr_WN ( ST * st )
02622 {
02623 WN * wn;
02624 TY_IDX ty = ST_type (st);
02625 TY_IDX ty_ptr = TY_pointer (ty);
02626
02627 if (ty_ptr == (TY_IDX) 0) {
02628 ty_ptr = Make_Pointer_Type (ty);
02629 }
02630
02631 if (Pointer_Size == 4)
02632 wn = WN_CreateLda ( OPC_U4LDA, 0, ty_ptr, st);
02633 else
02634 wn = WN_CreateLda ( OPC_U8LDA, 0, ty_ptr, st);
02635
02636 io_set_addr_passed_flag(st);
02637
02638 return (wn);
02639 }
02640
02641
02642
02643 static WN * Gen_Parm_WN ( WN * wn )
02644 {
02645 OPCODE opc = WN_opcode(wn);
02646 TYPE_ID rtype = OPCODE_rtype(opc);
02647
02648 if (rtype == MTYPE_U4 || rtype == MTYPE_U8) {
02649 wn = WN_CreateParm (rtype, wn,
02650 (OPCODE_has_1ty(opc))?WN_ty(wn):Be_Type_Tbl(rtype),
02651 WN_PARM_BY_REFERENCE );
02652 }
02653 else
02654 wn = WN_CreateParm ( rtype, wn, Be_Type_Tbl(rtype), WN_PARM_BY_VALUE );
02655
02656 return (wn);
02657 }
02658
02659
02660
02661
02662
02663
02664
02665
02666
02667
02668
02669
02670
02671 static void Gen_Io_Calls ( WN * block, FIOOPER op, WN * iostat1, WN * iostat2,
02672 INT32 kids, WN * kid0, WN * kid1, WN * kid2,
02673 WN * kid3 )
02674 {
02675 WN * wn;
02676 INT32 i;
02677 INT32 fio_namelist_count = (namelist_node) ? WN_kid_count(namelist_node) - 2
02678 : 0;
02679
02680
02681
02682 if (iostat1 != NULL || iostat2 != NULL ||
02683 op == FIO_INQLENGTH)
02684 wn = WN_Create ( OPC_I4CALL, kids + fio_dummy_count + fio_namelist_count);
02685 else
02686 wn = WN_Create ( OPC_VCALL, kids + fio_dummy_count + fio_namelist_count);
02687 WN_st_idx(wn) = ST_st_idx (GET_RUNTIME_ST ( op ));
02688 WN_Set_Call_Non_Data_Mod ( wn );
02689 WN_Set_Call_Non_Data_Ref ( wn );
02690 WN_Set_Call_Parm_Mod ( wn );
02691 WN_Set_Call_Parm_Ref ( wn );
02692 if (op == FIO_CR_READ_NAMELIST || op == FIO_CR_WRITE_NAMELIST)
02693 WN_Set_Call_Non_Parm_Ref( wn );
02694
02695
02696
02697 switch (kids) {
02698 case 4:
02699 WN_kid3(wn) = Gen_Parm_WN ( kid3 );
02700 case 3:
02701 WN_kid2(wn) = Gen_Parm_WN ( kid2 );
02702 case 2:
02703 WN_kid1(wn) = Gen_Parm_WN ( kid1 );
02704 case 1:
02705 WN_kid0(wn) = Gen_Parm_WN ( kid0 );
02706 case 0:
02707 break;
02708 default:
02709 Fail_FmtAssertion("Gen_Io_Calls: unexpected number of kids (%d)"
02710 " in I/O processing", kids);
02711 }
02712
02713
02714
02715 for (i = 0; i < fio_dummy_count; i++) {
02716 if (ST_class(fio_dummy_st[i]) == CLASS_VAR) {
02717 io_set_addr_passed_flag(fio_dummy_st[i]);
02718 }
02719 if (fio_dummy_ref[i])
02720 WN_kid(wn, kids++) = WN_CreateParm ( Pointer_type,
02721 WN_Lda ( Pointer_type,
02722 fio_dummy_ofst[i],
02723 fio_dummy_st[i] ),
02724 Be_Type_Tbl(Pointer_type),
02725 WN_PARM_BY_REFERENCE |
02726 WN_PARM_DUMMY );
02727 else
02728 WN_kid(wn, kids++) = WN_CreateParm ( Pointer_type,
02729 WN_Ldid ( Pointer_type,
02730 fio_dummy_ofst[i],
02731 fio_dummy_st[i],
02732 fio_dummy_tyidx[i]),
02733 Be_Type_Tbl(Pointer_type),
02734 WN_PARM_BY_REFERENCE |
02735 WN_PARM_DUMMY );
02736 }
02737
02738 for (i = 0; i < fio_namelist_count; i++) {
02739 WN_kid(wn, kids++) = WN_CreateParm ( Pointer_type,
02740 WN_COPY_Tree (WN_kid0(WN_kid(namelist_node, i+2))),
02741 Be_Type_Tbl(Pointer_type),
02742 WN_PARM_BY_REFERENCE |
02743 WN_PARM_DUMMY );
02744 }
02745
02746
02747
02748
02749 WN_INSERT_BlockLast ( block, wn );
02750
02751
02752
02753 if (iostat1 != NULL || iostat2 != NULL)
02754 if (iostat2 == NULL)
02755 WN_INSERT_BlockLast ( block, WN_COPY_Tree ( iostat1 ) );
02756 else {
02757 WN_INSERT_BlockLast ( block, iostat2 );
02758 if (iostat1 != NULL) {
02759 WN_DELETE_Tree ( iostat1 );
02760 }
02761 }
02762 }
02763
02764
02765
02766 #define TYUNKNOWN 0
02767 #define TYADDR 1
02768 #define TYBYTE 2
02769 #define TYSHORT 3
02770 #define TYINT 4
02771 #define TYLONGLONG 5
02772 #define TYREAL 6
02773 #define TYDREAL 7
02774 #define TYCOMPLEX 8
02775 #define TYDCOMPLEX 9
02776 #define TYLOGICAL1 10
02777 #define TYLOGICAL2 11
02778 #define TYLOGICAL4 12
02779 #define TYLOGICAL8 13
02780 #define TYCHAR 14
02781 #define TYSUBR 15
02782 #define TYSTRUCTURE 16
02783 #define TYNML 17
02784 #define TYQUAD 18
02785 #define TYQUADCOMPLEX 19
02786 #define TYQUADLONG 20
02787
02788
02789 static void Gen_Impld_Io_Calls ( WN * block, FIOFORMATTYPE form,
02790 FIOITEMTYPE type, WN * iostat1, WN * impld_item,
02791 WN *arr_item, WN * mp_unit_ptr)
02792
02793
02794
02795
02796
02797
02798
02799
02800
02801
02802
02803
02804
02805
02806
02807
02808
02809
02810
02811
02812
02813
02814
02815
02816
02817
02818
02819
02820
02821
02822
02823
02824
02825
02826
02827
02828
02829
02830
02831
02832
02833
02834
02835
02836
02837
02838
02839
02840
02841
02842
02843
02844
02845
02846
02847
02848
02849
02850
02851 {
02852 WN * wn, *dovar;
02853 INT32 i, size;
02854 char impld_name[48];
02855 ST *tmp_st;
02856 static ST * impld_fio_sts [FIOFORMATTYPE_LAST + 1];
02857 static const char *impld_fio_names [ FIOFORMATTYPE_LAST + 1] =
02858 { "", "do_fio64", "do_uio64", "do_Lio64" };
02859 INT32 nkids;
02860 TY_IDX aty;
02861 ST *st;
02862 static INT32 fio_types[FIOITEMTYPE_LAST + 1];
02863
02864
02865
02866
02867
02868 if (fio_types[ FIT_COMPLEX16 ] == 0) {
02869 fio_types[FIOITEMTYPE_NONE] = TYUNKNOWN;
02870 fio_types[FIT_ADDRESS4] = TYADDR;
02871 fio_types[FIT_ADDRESS8] = TYADDR;
02872 fio_types[FIT_CHARACTER] = TYCHAR;
02873 fio_types[FIT_INTEGER1] = TYBYTE;
02874 fio_types[FIT_INTEGER2] = TYSHORT;
02875 fio_types[FIT_INTEGER4] = TYINT;
02876 fio_types[FIT_INTEGER8] = TYLONGLONG;
02877 fio_types[FIT_LOGICAL1] = TYLOGICAL1;
02878 fio_types[FIT_LOGICAL2] = TYLOGICAL2;
02879 fio_types[FIT_LOGICAL4] = TYLOGICAL4;
02880 fio_types[FIT_LOGICAL8] = TYLOGICAL8;
02881 fio_types[FIT_REAL4] = TYREAL;
02882 fio_types[FIT_REAL8] = TYDREAL;
02883 fio_types[FIT_REAL16] = TYQUAD;
02884 fio_types[FIT_COMPLEX4] = TYCOMPLEX;
02885 fio_types[FIT_COMPLEX8] = TYDCOMPLEX;
02886 fio_types[FIT_COMPLEX16] = TYQUADCOMPLEX;
02887 fio_types[FIT_RECORD] = TYSTRUCTURE;
02888 }
02889
02890
02891 wn = WN_Create ( OPC_I4CALL, 7 + (mp_unit_ptr ? 1 : 0)
02892 + (form == FFT_UNFORMAT ? 0 : 1) );
02893 if (impld_fio_sts[form] == NULL) {
02894
02895
02896
02897
02898
02899 if (fioruntime_ty == (TY_IDX) 0) {
02900
02901 Init_fioruntime_ty ();
02902
02903 }
02904
02905
02906
02907
02908 strcpy( impld_name, impld_fio_names[form] );
02909 i = strlen( impld_name );
02910 if (mp_unit_ptr) {
02911 impld_name[i] = '_'; impld_name[i+1] = 'm'; impld_name[i+2] = 'p';
02912 strcpy( &impld_name[i+3], "_1dim" );
02913 } else {
02914 strcpy( &impld_name[i], "_1dim" );
02915 }
02916 impld_fio_sts[form] = st = New_ST ( GLOBAL_SYMTAB );
02917
02918 PU_IDX pu_idx;
02919 PU& pu = New_PU (pu_idx);
02920
02921 PU_Init (pu, fioruntime_ty, CURRENT_SYMTAB);
02922
02923 ST_Init ( st, Save_Str ( impld_name ), CLASS_FUNC, SCLASS_EXTERN,
02924 EXPORT_PREEMPTIBLE, (TY_IDX) pu_idx);
02925 WN_st_idx (wn) = ST_st_idx (st);
02926 impld_fio_sts[form] = st;
02927 } else
02928 WN_st_idx (wn) = ST_st_idx (impld_fio_sts[form]);
02929
02930 WN_Set_Call_Non_Data_Mod ( wn );
02931 WN_Set_Call_Non_Data_Ref ( wn );
02932 WN_Set_Call_Parm_Mod ( wn );
02933 WN_Set_Call_Parm_Ref ( wn );
02934
02935
02936
02937 nkids = 0;
02938 switch (form) {
02939 case FFT_FORMAT :
02940 case FFT_LIST :
02941
02942 tmp_st = Gen_Temp_Symbol( Be_Type_Tbl(MTYPE_I4), "io_item_type" );
02943 WN_INSERT_BlockLast ( block, WN_CreateStid( OPC_I4STID, 0, tmp_st,
02944 Be_Type_Tbl(MTYPE_I4),
02945 WN_CreateIntconst( OPC_I4INTCONST, fio_types[type] )));
02946 WN_kid(wn, nkids++) = Gen_Parm_WN ( Make_IoAddr_WN( tmp_st ) );
02947 case FFT_UNFORMAT :
02948
02949
02950 WN_kid(wn, nkids++) = Gen_Parm_WN ( arr_item );
02951
02952
02953 dovar = WN_COPY_Tree(WN_index (impld_item));
02954 WN_kid(wn, nkids++) = Gen_Parm_WN( Make_IoAddr_WN( WN_st( dovar ) ) );
02955
02956
02957 tmp_st = Gen_Temp_Symbol( Be_Type_Tbl(
02958 (Pointer_Size == 4) ? MTYPE_I4 : MTYPE_I8), "lower_bound" );
02959 WN_INSERT_BlockLast ( block, WN_CreateStid(
02960 (Pointer_Size == 4) ? OPC_I4STID : OPC_I8STID, 0, tmp_st,
02961 Be_Type_Tbl(
02962 (Pointer_Size == 4) ? MTYPE_I4 : MTYPE_I8),
02963 WN_COPY_Tree(WN_start(impld_item))));
02964 WN_kid(wn, nkids++) = Gen_Parm_WN( Make_IoAddr_WN( tmp_st ) );
02965
02966
02967 tmp_st = Gen_Temp_Symbol( Be_Type_Tbl(
02968 (Pointer_Size == 4) ? MTYPE_I4 : MTYPE_I8), "upper_bound" );
02969 WN_INSERT_BlockLast ( block, WN_CreateStid(
02970 (Pointer_Size == 4) ? OPC_I4STID : OPC_I8STID, 0, tmp_st,
02971 Be_Type_Tbl(
02972 (Pointer_Size == 4) ? MTYPE_I4 : MTYPE_I8),
02973 WN_COPY_Tree(WN_end(impld_item))));
02974 WN_kid(wn, nkids++) = Gen_Parm_WN( Make_IoAddr_WN( tmp_st ) );
02975
02976
02977 tmp_st = Gen_Temp_Symbol( Be_Type_Tbl(
02978 (Pointer_Size == 4) ? MTYPE_I4 : MTYPE_I8), "do_step" );
02979 WN_INSERT_BlockLast ( block, WN_CreateStid(
02980 (Pointer_Size == 4) ? OPC_I4STID : OPC_I8STID, 0, tmp_st,
02981 Be_Type_Tbl(
02982 (Pointer_Size == 4) ? MTYPE_I4 : MTYPE_I8),
02983 WN_COPY_Tree(WN_step(impld_item))));
02984 WN_kid(wn, nkids++) = Gen_Parm_WN( Make_IoAddr_WN( tmp_st ) );
02985
02986
02987 if (mp_unit_ptr) {
02988 WN_kid(wn, nkids++) = Gen_Parm_WN( mp_unit_ptr );
02989 }
02990
02991
02992
02993 aty = TY_pointed( WN_ty( WN_kid0(arr_item) ) );
02994 size = TY_size( TY_AR_etype(aty) );
02995 WN_kid(wn, nkids++) = Gen_Parm_WN(
02996 WN_CreateIntconst ( OPC_I4INTCONST, size ) );
02997
02998
02999
03000 size = TY_size( Ty_Table[ ST_type( WN_st( dovar) ) ]);
03001 WN_kid(wn, nkids++) = Gen_Parm_WN(
03002 WN_CreateIntconst ( OPC_I4INTCONST, size ) );
03003 break;
03004 default:
03005 Fail_FmtAssertion("Gen_Impld_Io_Calls: illegal format type (%d)"
03006 " in I/O processing", form);
03007 }
03008
03009
03010
03011
03012 WN_INSERT_BlockLast ( block, wn );
03013
03014
03015
03016 if (iostat1 != NULL)
03017 WN_INSERT_BlockLast ( block, WN_COPY_Tree ( iostat1 ) );
03018 }
03019
03020
03021
03022
03023
03024
03025 static void Gen_Iolist_PutFieldConst ( WN * block, ST * st, INT32 foffset,
03026 INT32 ftype, INT64 value )
03027 {
03028 WN * wn = NULL;
03029
03030
03031
03032
03033 if (ftype == MTYPE_I4)
03034 wn = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03035 WN_CreateIntconst ( OPC_I4INTCONST, value ));
03036 else if (ftype == MTYPE_U4)
03037 wn = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03038 WN_CreateIntconst ( OPC_U4INTCONST, value ));
03039 else if (ftype == MTYPE_I8)
03040 wn = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03041 WN_CreateIntconst ( OPC_I8INTCONST, value ));
03042 else if (ftype == MTYPE_U8)
03043 wn = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03044 WN_CreateIntconst ( OPC_U8INTCONST, value ));
03045 else
03046 Fail_FmtAssertion("Gen_Iolist_PutFieldConst: unexpected field type (%s) "
03047 "in I/O processing", MTYPE_name(ftype));
03048
03049
03050
03051
03052 WN_INSERT_BlockLast ( block, wn );
03053
03054 }
03055
03056
03057
03058
03059 static TY_IDX Create_Maligned_TY(INT32 offset, TY_IDX ty)
03060 {
03061 INT32 align= compute_offset_alignment(offset, TY_align(ty));
03062
03063 if (align) {
03064 TY_IDX newTY;
03065 newTY = Make_Align_Type(MTYPE_To_TY(MTYPE_M), align);
03066
03067 return Make_Pointer_Type(newTY, FALSE);
03068 }
03069 ty = Make_Align_Type (MTYPE_To_TY (MTYPE_M), TY_align(ty));
03070 return TY_pointer(ty);
03071 }
03072
03073
03074
03075
03076
03077
03078 static void Gen_Iolist_PutFieldWN ( WN * block, ST * st, INT32 foffset,
03079 INT32 ftype, WN * wn )
03080 {
03081 WN * wnx = NULL;
03082 INT32 etype;
03083 INT32 vtype;
03084
03085
03086
03087
03088
03089
03090
03091
03092
03093
03094
03095 if (WN_opcode(wn) == OPC_I4INTCONST)
03096
03097 if (ftype == MTYPE_I4)
03098 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03099 wn );
03100 else if (ftype == MTYPE_U4) {
03101 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03102 WN_CreateIntconst ( OPC_U4INTCONST, WN_const_val(wn) ));
03103 WN_Delete ( wn );
03104 } else if (ftype == MTYPE_I8) {
03105 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03106 WN_CreateIntconst ( OPC_I8INTCONST, WN_const_val(wn) ));
03107 WN_Delete ( wn );
03108 } else if (ftype == MTYPE_U8) {
03109 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03110 WN_CreateIntconst ( OPC_U8INTCONST, WN_const_val(wn) ));
03111 WN_Delete ( wn );
03112 } else
03113 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, I4INTCONST: unexpected field"
03114 " type (%s) in I/O processing", MTYPE_name(ftype));
03115
03116 else if (WN_opcode(wn) == OPC_I8INTCONST)
03117
03118 if (ftype == MTYPE_I4) {
03119 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03120 WN_CreateIntconst ( OPC_I4INTCONST, WN_const_val(wn) ));
03121 WN_Delete ( wn );
03122 } else if (ftype == MTYPE_U4) {
03123 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03124 WN_CreateIntconst ( OPC_U4INTCONST, WN_const_val(wn) ));
03125 WN_Delete ( wn );
03126 } else if (ftype == MTYPE_U8) {
03127 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03128 WN_CreateIntconst ( OPC_U8INTCONST, WN_const_val(wn) ));
03129 WN_Delete ( wn );
03130 } else if (ftype == MTYPE_I8)
03131 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03132 wn );
03133 else
03134 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, I8INTCONST: unexpected field"
03135 " type (%s) in I/O processing", MTYPE_name(ftype));
03136
03137 else if (WN_opcode(wn) == OPC_U4INTCONST)
03138
03139 if (ftype == MTYPE_U4)
03140 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03141 wn );
03142 else if (ftype == MTYPE_U8) {
03143 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03144 WN_CreateIntconst ( OPC_U8INTCONST, WN_const_val(wn) ));
03145 WN_Delete ( wn );
03146 } else
03147 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, U4INTCONST: unexpected field"
03148 " type (%s) in I/O processing", MTYPE_name(ftype));
03149
03150 else if (WN_opcode(wn) == OPC_U8INTCONST)
03151
03152 if (ftype == MTYPE_U4) {
03153 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03154 WN_CreateIntconst ( OPC_U4INTCONST, WN_const_val(wn) ));
03155 WN_Delete ( wn );
03156 } else if (ftype == MTYPE_U8)
03157 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03158 wn );
03159 else
03160 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, U8INTCONST: unexpected field"
03161 " type (%s) in I/O processing", MTYPE_name(ftype));
03162
03163 else if (WN_opcode(wn) == OPC_U4LDA || WN_opcode(wn) == OPC_U8LDA) {
03164
03165 vtype = ST_btype(WN_st(wn));
03166 if (ftype == MTYPE_I4)
03167 if (vtype == MTYPE_I4)
03168 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03169 WN_CreateLdid ( OPC_I4I4LDID, WN_offset(wn), WN_st(wn),
03170 Be_Type_Tbl(MTYPE_I4) ));
03171 else if (vtype == MTYPE_I8)
03172 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03173 WN_CreateExp1 ( OPC_I4I8CVT,
03174 WN_CreateLdid ( OPC_I8I8LDID, WN_offset(wn), WN_st(wn),
03175 Be_Type_Tbl(MTYPE_I8) )));
03176 else if (vtype == MTYPE_F4)
03177 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03178 WN_CreateExp1 ( OPC_I4F4CVT,
03179 WN_CreateLdid ( OPC_F4F4LDID, WN_offset(wn), WN_st(wn),
03180 Be_Type_Tbl(MTYPE_F4) )));
03181 else if (vtype == MTYPE_F8)
03182 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03183 WN_CreateExp1 ( OPC_I4F8CVT,
03184 WN_CreateLdid ( OPC_F8F8LDID, WN_offset(wn), WN_st(wn),
03185 Be_Type_Tbl(MTYPE_F8) )));
03186 #if defined(TARG_IA64)
03187 else if (vtype == MTYPE_F10)
03188 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03189 WN_CreateExp1 ( OPC_I4F10CVT,
03190 WN_CreateLdid ( OPC_F10F10LDID, WN_offset(wn), WN_st(wn),
03191 Be_Type_Tbl(MTYPE_F10) )));
03192 #endif
03193 else if (vtype == MTYPE_FQ)
03194 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03195 WN_CreateExp1 ( OPC_I4FQCVT,
03196 WN_CreateLdid ( OPC_FQFQLDID, WN_offset(wn), WN_st(wn),
03197 Be_Type_Tbl(MTYPE_FQ) )));
03198 else
03199 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, LDA,I4: unexpected item"
03200 " type (%s) in I/O processing", MTYPE_name(vtype));
03201 else if (ftype == MTYPE_I8)
03202 if (vtype == MTYPE_I4)
03203 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03204 WN_CreateLdid ( OPC_I8I4LDID, WN_offset(wn), WN_st(wn),
03205 Be_Type_Tbl(MTYPE_I8) ));
03206 else if (vtype == MTYPE_I8)
03207 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03208 WN_CreateLdid ( OPC_I8I8LDID, WN_offset(wn), WN_st(wn),
03209 Be_Type_Tbl(MTYPE_I8) ));
03210 else if (vtype == MTYPE_F4)
03211 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03212 WN_CreateExp1 ( OPC_I8F4CVT,
03213 WN_CreateLdid ( OPC_F4F4LDID, WN_offset(wn), WN_st(wn),
03214 Be_Type_Tbl(MTYPE_F4) )));
03215 else if (vtype == MTYPE_F8)
03216 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03217 WN_CreateExp1 ( OPC_I8F8CVT,
03218 WN_CreateLdid ( OPC_F8F8LDID, WN_offset(wn), WN_st(wn),
03219 Be_Type_Tbl(MTYPE_F8) )));
03220 #if defined(TARG_IA64)
03221 else if (vtype == MTYPE_F10)
03222 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03223 WN_CreateExp1 ( OPC_I8F10CVT,
03224 WN_CreateLdid ( OPC_F10F10LDID, WN_offset(wn), WN_st(wn),
03225 Be_Type_Tbl(MTYPE_F10) )));
03226 #endif
03227 else if (vtype == MTYPE_FQ)
03228 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03229 WN_CreateExp1 ( OPC_I8FQCVT,
03230 WN_CreateLdid ( OPC_FQFQLDID, WN_offset(wn), WN_st(wn),
03231 Be_Type_Tbl(MTYPE_FQ) )));
03232 else
03233 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, LDA,I8: unexpected item"
03234 " type (%s) in I/O processing", MTYPE_name(vtype));
03235 else
03236 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, U4LDA/U8LDA: unexpected field"
03237 " type (%s) in I/O processing", MTYPE_name(ftype));
03238 WN_Delete ( wn );
03239
03240 } else if (OPCODE_is_expression(WN_opcode(wn))) {
03241
03242 etype = WN_rtype(wn);
03243 if (ftype == MTYPE_I4)
03244 if (etype == MTYPE_I4)
03245 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03246 wn );
03247 else if (etype == MTYPE_U4)
03248 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03249 wn );
03250 else if (etype == MTYPE_I8)
03251 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03252 WN_CreateExp1 ( OPC_I4I8CVT, wn ));
03253 else if (etype == MTYPE_U8)
03254 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03255 WN_CreateExp1 ( OPC_I4U8CVT, wn ));
03256 else if (etype == MTYPE_F4)
03257 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03258 WN_CreateExp1 ( OPC_I4F4CVT, wn ));
03259 else if (etype == MTYPE_F8)
03260 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03261 WN_CreateExp1 ( OPC_I4F8CVT, wn ));
03262 else if (etype == MTYPE_F10)
03263 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03264 WN_CreateExp1 ( OPC_I4F10CVT, wn ));
03265 else if (etype == MTYPE_FQ)
03266 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03267 WN_CreateExp1 ( OPC_I4FQCVT, wn ));
03268 else
03269 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, exp,I4: unexpected expression"
03270 " type (%s) in I/O processing", MTYPE_name(etype));
03271 else if (ftype == MTYPE_U4)
03272 if (etype == MTYPE_U4 || etype == MTYPE_I4)
03273 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03274 wn );
03275 else if (etype == MTYPE_U8)
03276 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03277 WN_CreateExp1 ( OPC_U4U8CVT, wn ));
03278 else if (etype == MTYPE_I8)
03279 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03280 WN_CreateExp1 ( OPC_U4I8CVT, wn ));
03281 else
03282 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, exp,U4: unexpected expression"
03283 " type (%s) in I/O processing", MTYPE_name(etype));
03284 else if (ftype == MTYPE_I8)
03285 if (etype == MTYPE_I4)
03286 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03287 WN_CreateExp1 ( OPC_I8I4CVT, wn ));
03288 else if (etype == MTYPE_U4)
03289 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03290 WN_CreateExp1 ( OPC_I8U4CVT, wn ));
03291 else if (etype == MTYPE_I8)
03292 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03293 wn );
03294 else if (etype == MTYPE_U8)
03295 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03296 wn );
03297 else if (etype == MTYPE_F4)
03298 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03299 WN_CreateExp1 ( OPC_I8F4CVT, wn ));
03300 else if (etype == MTYPE_F8)
03301 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03302 WN_CreateExp1 ( OPC_I8F8CVT, wn ));
03303 else if (etype == MTYPE_F10)
03304 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03305 WN_CreateExp1 ( OPC_I8F10CVT, wn ));
03306 else if (etype == MTYPE_FQ)
03307 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03308 WN_CreateExp1 ( OPC_I8FQCVT, wn ));
03309 else
03310 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, exp,I8: unexpected expression"
03311 " type (%s) in I/O processing", MTYPE_name(etype));
03312 else if (ftype == MTYPE_U8)
03313 if (etype == MTYPE_U8 || etype == MTYPE_I8)
03314 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03315 wn );
03316 else if (etype == MTYPE_U4)
03317 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03318 WN_CreateExp1 ( OPC_U8U4CVT, wn ));
03319 else if (etype == MTYPE_I4)
03320 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03321 WN_CreateExp1 ( OPC_U8I4CVT, wn ));
03322 else
03323 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, exp,U8: unexpected expression"
03324 " type (%s) in I/O processing", MTYPE_name(etype));
03325 else
03326 Fail_FmtAssertion("Gen_Iolist_PutFieldWN, expression: unexpected field"
03327 " type (%s) in I/O processing", MTYPE_name(ftype));
03328
03329 } else
03330
03331 Fail_FmtAssertion("Gen_Iolist_PutFieldWN: unexpected WN_opcode (%s) in"
03332 " I/O processing", OPCODE_name(WN_opcode(wn)));
03333
03334
03335
03336
03337 WN_INSERT_BlockLast ( block, wnx );
03338
03339 }
03340
03341
03342
03343
03344
03345
03346 static void Gen_Iolist_PutAddrWN ( WN * block, ST * st, INT32 foffset,
03347 INT32 ftype, WN * wn )
03348 {
03349 WN * wnx;
03350
03351
03352
03353 #ifdef KEY
03354
03355
03356 if (WN_operator(wn) == OPR_INTCONST)
03357 {
03358
03359 FmtAssert (WN_const_val(wn) == 0,
03360 ("Get_Iolist_PutAddrWN: INTCONST can only be zero"));
03361 return;
03362 }
03363 #endif
03364
03365 wnx = wn;
03366 Add_To_Dummy_List(wnx);
03367
03368
03369
03370
03371 if ((WN_opcode(wn) == OPC_U4LDA || WN_opcode(wn) == OPC_U4U4LDID ||
03372 WN_opcode(wn) == OPC_U4ARRAY || WN_opcode(wn) == OPC_U4U4ILOAD ||
03373 WN_opcode(wn) == OPC_U4ADD || WN_opcode(wn) == OPC_I4I4LDID) &&
03374 (ftype == MTYPE_U4 || ftype == MTYPE_I4 || ftype == MTYPE_M ))
03375 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4), wn );
03376
03377 else if ((WN_opcode(wn) == OPC_U4LDA || WN_opcode(wn) == OPC_U4U4LDID ||
03378 WN_opcode(wn) == OPC_U4ARRAY || WN_opcode(wn) == OPC_U4U4ILOAD ||
03379 WN_opcode(wn) == OPC_U4ADD) &&
03380 (ftype == MTYPE_U8 || ftype == MTYPE_I8 ))
03381 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03382 WN_CreateExp1 ( OPC_U8U4CVT, wn));
03383
03384 else if ((WN_opcode(wn) == OPC_U8LDA || WN_opcode(wn) == OPC_U8U8LDID ||
03385 WN_opcode(wn) == OPC_U8ARRAY || WN_opcode(wn) == OPC_U8U8ILOAD ||
03386 WN_opcode(wn) == OPC_U8ADD || WN_opcode(wn) == OPC_I8I8LDID) &&
03387 (ftype == MTYPE_U8 || ftype == MTYPE_I8 || ftype == MTYPE_M))
03388 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8), wn );
03389
03390 else if ((WN_opcode(wn) == OPC_U8LDA || WN_opcode(wn) == OPC_U8U8LDID ||
03391 WN_opcode(wn) == OPC_U8ARRAY || WN_opcode(wn) == OPC_U8U8ILOAD ||
03392 WN_opcode(wn) == OPC_U8ADD) &&
03393 (ftype == MTYPE_U4 || ftype == MTYPE_I4 ))
03394 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03395 WN_CreateExp1 ( OPC_U4U8CVT, wn ));
03396
03397 else if (WN_opcode(wn) == OPC_MLOAD)
03398 wnx = WN_CreateMstore(foffset, Create_Maligned_TY(foffset, ST_type(st)), wn,
03399 WN_CreateLda(opc_lda, 0, TY_pointer(ST_type(st)), st),
03400 WN_CreateIntconst ( OPC_U4INTCONST, fcd_size));
03401 else
03402 Fail_FmtAssertion("Gen_Iolist_PutAddrWN: unexpected WN_opcode (%s) and"
03403 " field type (%s) in I/O processing",
03404 OPCODE_name(WN_opcode(wn)), MTYPE_name(ftype));
03405
03406
03407
03408
03409 WN_INSERT_BlockLast ( block, wnx );
03410
03411 }
03412
03413
03414
03415
03416
03417
03418
03419 static void Gen_Io_GetFieldST ( WN * block, ST * var, ST * st, FIOSTRUCT field )
03420 {
03421 WN * wn;
03422 INT32 foffset;
03423 INT32 ftype;
03424 INT32 vtype = ST_btype(var);
03425
03426
03427
03428 if (Pointer_Size == 4) {
03429 foffset = fiostruct_info[field].offset32;
03430 ftype = fiostruct_info[field].type32;
03431 } else {
03432 foffset = fiostruct_info[field].offset64;
03433 ftype = fiostruct_info[field].type64;
03434 }
03435
03436
03437
03438
03439 if (vtype == MTYPE_I4)
03440
03441 if (ftype == MTYPE_I4)
03442 wn = WN_CreateStid ( OPC_I4STID, 0, var, ST_type(var),
03443 WN_CreateLdid ( OPC_I4I4LDID, foffset, st, Be_Type_Tbl(MTYPE_I4) ));
03444 else if (ftype == MTYPE_I8)
03445 wn = WN_CreateStid ( OPC_I4STID, 0, var, ST_type(var),
03446 WN_CreateExp1 ( OPC_I4I8CVT,
03447 WN_CreateLdid ( OPC_I8I8LDID, foffset, st, Be_Type_Tbl(MTYPE_I8) )));
03448 else
03449 Fail_FmtAssertion("Gen_Io_GetFieldST, I4: unexpected field type (%s)"
03450 " in I/O processing", MTYPE_name(ftype));
03451
03452 else if (vtype == MTYPE_I8)
03453
03454 if (ftype == MTYPE_I4)
03455 wn = WN_CreateStid ( OPC_I8STID, 0, var, ST_type(var),
03456 WN_CreateLdid ( OPC_I8I4LDID, foffset, st, Be_Type_Tbl(MTYPE_I8) ));
03457 else if (ftype == MTYPE_I8)
03458 wn = WN_CreateStid ( OPC_I8STID, 0, var, ST_type(var),
03459 WN_CreateLdid ( OPC_I8I8LDID, foffset, st, Be_Type_Tbl(MTYPE_I8) ));
03460 else
03461 Fail_FmtAssertion("Gen_Io_GetFieldST, I8: unexpected field type (%s)"
03462 " in I/O processing", MTYPE_name(ftype));
03463
03464 else
03465
03466 Fail_FmtAssertion("Gen_Io_GetFieldST: unexpected item type (%s) in"
03467 " I/O processing", MTYPE_name(vtype));
03468
03469
03470
03471
03472 WN_INSERT_BlockLast ( block, wn );
03473
03474 }
03475
03476
03477
03478
03479
03480
03481
03482
03483 static void Gen_Io_GetFieldWN ( WN * block, WN * wn, ST * st, FIOSTRUCT field )
03484 {
03485 WN * wnx;
03486 INT32 foffset;
03487 INT32 ftype;
03488 ST * var = WN_st(wn);
03489 INT32 vtype = ST_btype(var);
03490
03491
03492
03493 if (Pointer_Size == 4) {
03494 foffset = fiostruct_info[field].offset32;
03495 ftype = fiostruct_info[field].type32;
03496 } else {
03497 foffset = fiostruct_info[field].offset64;
03498 ftype = fiostruct_info[field].type64;
03499 }
03500
03501
03502
03503
03504 if (vtype == MTYPE_I4)
03505
03506 if (ftype == MTYPE_I4)
03507 wnx = WN_CreateStid ( OPC_I4STID, 0, var, ST_type(var),
03508 WN_CreateLdid ( OPC_I4I4LDID, foffset, st, Be_Type_Tbl(MTYPE_I4) ));
03509 else if (ftype == MTYPE_I8)
03510 wnx = WN_CreateStid ( OPC_I4STID, 0, var, ST_type(var),
03511 WN_CreateExp1 ( OPC_I4I8CVT,
03512 WN_CreateLdid ( OPC_I8I8LDID, foffset, st,
03513 Be_Type_Tbl(MTYPE_I8) )));
03514 else
03515 Fail_FmtAssertion("Gen_Io_GetFieldWN, I4: unexpected field type (%s)"
03516 " in I/O processing", MTYPE_name(ftype));
03517
03518 else if (vtype == MTYPE_I8)
03519
03520 if (ftype == MTYPE_I4)
03521 wnx = WN_CreateStid ( OPC_I8STID, 0, var, ST_type(var),
03522 WN_CreateLdid ( OPC_I8I4LDID, foffset, st, Be_Type_Tbl(MTYPE_I8) ));
03523 else if (ftype == MTYPE_I8)
03524 wnx = WN_CreateStid ( OPC_I8STID, 0, var, ST_type(var),
03525 WN_CreateLdid ( OPC_I8I8LDID, foffset, st, Be_Type_Tbl(MTYPE_I8) ));
03526 else
03527 Fail_FmtAssertion("Gen_Io_GetFieldWN, I8: unexpected field type (%s)"
03528 " in I/O processing", MTYPE_name(ftype));
03529
03530 else
03531
03532 Fail_FmtAssertion("Gen_Io_GetFieldWN: unexpected item type (%s)"
03533 " in I/O processing", MTYPE_name(vtype));
03534
03535
03536
03537
03538 WN_INSERT_BlockLast ( block, wnx );
03539
03540
03541
03542 WN_Delete ( wn );
03543
03544 }
03545
03546
03547
03548
03549
03550
03551
03552
03553 static void Gen_Io_PutFieldST ( WN * block, ST * st, FIOSTRUCT field, ST * var )
03554 {
03555 WN * wn;
03556 INT32 foffset;
03557 INT32 ftype;
03558 INT32 vtype = ST_btype(var);
03559
03560
03561
03562 if (Pointer_Size == 4) {
03563 foffset = fiostruct_info[field].offset32;
03564 ftype = fiostruct_info[field].type32;
03565 } else {
03566 foffset = fiostruct_info[field].offset64;
03567 ftype = fiostruct_info[field].type64;
03568 }
03569
03570
03571
03572
03573 if (ftype == MTYPE_I4)
03574
03575 if (vtype == MTYPE_I4)
03576 wn = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03577 WN_CreateLdid ( OPC_I4I4LDID, 0, var, Be_Type_Tbl(MTYPE_I4) ));
03578 else if (vtype == MTYPE_I8)
03579 wn = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03580 WN_CreateExp1 ( OPC_I4I8CVT,
03581 WN_CreateLdid ( OPC_I8I8LDID, 0, var, Be_Type_Tbl(MTYPE_I8) )));
03582 else if (vtype == MTYPE_F4)
03583 wn = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03584 WN_CreateExp1 ( OPC_I4F4CVT,
03585 WN_CreateLdid ( OPC_F4F4LDID, 0, var, Be_Type_Tbl(MTYPE_F4) )));
03586 else if (vtype == MTYPE_F8)
03587 wn = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03588 WN_CreateExp1 ( OPC_I4F8CVT,
03589 WN_CreateLdid ( OPC_F8F8LDID, 0, var, Be_Type_Tbl(MTYPE_F8) )));
03590 else if (vtype == MTYPE_F10)
03591 wn = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03592 WN_CreateExp1 ( OPC_I4F10CVT,
03593 WN_CreateLdid ( OPC_F10F10LDID, 0, var, Be_Type_Tbl(MTYPE_F10) )));
03594 else if (vtype == MTYPE_FQ)
03595 wn = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03596 WN_CreateExp1 ( OPC_I4FQCVT,
03597 WN_CreateLdid ( OPC_FQFQLDID, 0, var, Be_Type_Tbl(MTYPE_FQ) )));
03598 else
03599 Fail_FmtAssertion("Gen_Io_PutFieldST, I4: unexpected item type (%s)"
03600 " in I/O processing", MTYPE_name(vtype));
03601
03602 else if (ftype == MTYPE_I8)
03603
03604 if (vtype == MTYPE_I4)
03605 wn = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03606 WN_CreateLdid ( OPC_I8I4LDID, 0, var, Be_Type_Tbl(MTYPE_I8) ));
03607 else if (vtype == MTYPE_I8)
03608 wn = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03609 WN_CreateLdid ( OPC_I8I8LDID, 0, var, Be_Type_Tbl(MTYPE_I8) ));
03610 else if (vtype == MTYPE_F4)
03611 wn = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03612 WN_CreateExp1 ( OPC_I8F4CVT,
03613 WN_CreateLdid ( OPC_F4F4LDID, 0, var, Be_Type_Tbl(MTYPE_F4) )));
03614 else if (vtype == MTYPE_F8)
03615 wn = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03616 WN_CreateExp1 ( OPC_I8F8CVT,
03617 WN_CreateLdid ( OPC_F8F8LDID, 0, var, Be_Type_Tbl(MTYPE_F8) )));
03618 else if (vtype == MTYPE_F10)
03619 wn = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03620 WN_CreateExp1 ( OPC_I8F10CVT,
03621 WN_CreateLdid ( OPC_F10F10LDID, 0, var, Be_Type_Tbl(MTYPE_F10) )));
03622 else if (vtype == MTYPE_FQ)
03623 wn = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03624 WN_CreateExp1 ( OPC_I8FQCVT,
03625 WN_CreateLdid ( OPC_FQFQLDID, 0, var, Be_Type_Tbl(MTYPE_FQ) )));
03626 else
03627 Fail_FmtAssertion("Gen_Io_PutFieldST, I8: unexpected item type (%s)"
03628 " in I/O processing", MTYPE_name(vtype));
03629
03630 else
03631
03632 Fail_FmtAssertion("Gen_Io_PutFieldST: unexpected field type (%s)"
03633 " in I/O processing", MTYPE_name(ftype));
03634
03635
03636
03637
03638 WN_INSERT_BlockLast ( block, wn );
03639
03640 }
03641
03642
03643
03644
03645
03646
03647
03648
03649 static void Gen_Io_PutFieldWN ( WN * block, ST * st, FIOSTRUCT field, WN * wn )
03650 {
03651 WN * wnx = NULL;
03652 INT32 foffset;
03653 INT32 ftype;
03654 INT32 etype;
03655 INT32 vtype;
03656
03657
03658
03659 if (Pointer_Size == 4) {
03660 foffset = fiostruct_info[field].offset32;
03661 ftype = fiostruct_info[field].type32;
03662 } else {
03663 foffset = fiostruct_info[field].offset64;
03664 ftype = fiostruct_info[field].type64;
03665 }
03666
03667
03668
03669
03670
03671
03672
03673
03674
03675
03676
03677
03678
03679
03680 if (WN_opcode(wn) == OPC_I4INTCONST)
03681
03682 if (ftype == MTYPE_I4)
03683 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03684 wn );
03685 else if (ftype == MTYPE_U4) {
03686 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03687 WN_CreateIntconst ( OPC_U4INTCONST, WN_const_val(wn) ));
03688 WN_Delete ( wn );
03689 } else if (ftype == MTYPE_I8) {
03690 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03691 WN_CreateIntconst ( OPC_I8INTCONST, WN_const_val(wn) ));
03692 WN_Delete ( wn );
03693 } else if (ftype == MTYPE_U8) {
03694 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03695 WN_CreateIntconst ( OPC_U8INTCONST, WN_const_val(wn) ));
03696 WN_Delete ( wn );
03697 } else
03698 Fail_FmtAssertion("Gen_Io_PutFieldWN, I4INTCONST: unexpected field"
03699 " type (%s) in I/O processing", MTYPE_name(ftype));
03700
03701 else if (WN_opcode(wn) == OPC_I8INTCONST)
03702
03703 if (ftype == MTYPE_I4) {
03704 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03705 WN_CreateIntconst ( OPC_I4INTCONST, WN_const_val(wn) ));
03706 WN_Delete ( wn );
03707 } else if (ftype == MTYPE_U4) {
03708 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03709 WN_CreateIntconst ( OPC_U4INTCONST, WN_const_val(wn) ));
03710 WN_Delete ( wn );
03711 } else if (ftype == MTYPE_U8) {
03712 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03713 WN_CreateIntconst ( OPC_U8INTCONST, WN_const_val(wn) ));
03714 WN_Delete ( wn );
03715 } else if (ftype == MTYPE_I8)
03716 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03717 wn );
03718 else
03719 Fail_FmtAssertion("Gen_Io_PutFieldWN, I8INTCONST: unexpected field"
03720 " type (%s) in I/O processing", MTYPE_name(ftype));
03721
03722 else if (WN_opcode(wn) == OPC_U4INTCONST)
03723
03724 if (ftype == MTYPE_U4)
03725 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03726 wn );
03727 else if (ftype == MTYPE_U8) {
03728 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03729 WN_CreateIntconst ( OPC_U8INTCONST, WN_const_val(wn) ));
03730 WN_Delete ( wn );
03731 } else
03732 Fail_FmtAssertion("Gen_Io_PutFieldWN, U4INTCONST: unexpected field"
03733 " type (%s) in I/O processing", MTYPE_name(ftype));
03734
03735 else if (WN_opcode(wn) == OPC_U8INTCONST)
03736
03737 if (ftype == MTYPE_U4) {
03738 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03739 WN_CreateIntconst ( OPC_U4INTCONST, WN_const_val(wn) ));
03740 WN_Delete ( wn );
03741 } else if (ftype == MTYPE_U8)
03742 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03743 wn );
03744 else
03745 Fail_FmtAssertion("Gen_Io_PutFieldWN, U8INTCONST: unexpected field"
03746 " type (%s) in I/O processing", MTYPE_name(ftype));
03747
03748 else if (WN_opcode(wn) == OPC_U4LDA || WN_opcode(wn) == OPC_U8LDA) {
03749
03750 vtype = ST_btype(WN_st(wn));
03751 if (ftype == MTYPE_I4)
03752 if (vtype == MTYPE_I4)
03753 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03754 WN_CreateLdid ( OPC_I4I4LDID, WN_offset(wn), WN_st(wn),
03755 Be_Type_Tbl(MTYPE_I4) ));
03756 else if (vtype == MTYPE_I8)
03757 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03758 WN_CreateExp1 ( OPC_I4I8CVT,
03759 WN_CreateLdid ( OPC_I8I8LDID, WN_offset(wn), WN_st(wn),
03760 Be_Type_Tbl(MTYPE_I8) )));
03761 else if (vtype == MTYPE_F4)
03762 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03763 WN_CreateExp1 ( OPC_I4F4CVT,
03764 WN_CreateLdid ( OPC_F4F4LDID, WN_offset(wn), WN_st(wn),
03765 Be_Type_Tbl(MTYPE_F4) )));
03766 else if (vtype == MTYPE_F8)
03767 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03768 WN_CreateExp1 ( OPC_I4F8CVT,
03769 WN_CreateLdid ( OPC_F8F8LDID, WN_offset(wn), WN_st(wn),
03770 Be_Type_Tbl(MTYPE_F8) )));
03771 else if (vtype == MTYPE_F10)
03772 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03773 WN_CreateExp1 ( OPC_I4F10CVT,
03774 WN_CreateLdid ( OPC_F10F10LDID, WN_offset(wn), WN_st(wn),
03775 Be_Type_Tbl(MTYPE_F10) )));
03776 else if (vtype == MTYPE_FQ)
03777 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03778 WN_CreateExp1 ( OPC_I4FQCVT,
03779 WN_CreateLdid ( OPC_FQFQLDID, WN_offset(wn), WN_st(wn),
03780 Be_Type_Tbl(MTYPE_FQ) )));
03781 else
03782 Fail_FmtAssertion("Gen_Io_PutFieldWN, LDA,I4: unexpected item type"
03783 " (%s) in I/O processing", MTYPE_name(vtype));
03784 else if (ftype == MTYPE_I8)
03785 if (vtype == MTYPE_I4)
03786 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03787 WN_CreateLdid ( OPC_I8I4LDID, WN_offset(wn), WN_st(wn),
03788 Be_Type_Tbl(MTYPE_I8) ));
03789 else if (vtype == MTYPE_I8)
03790 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03791 WN_CreateLdid ( OPC_I8I8LDID, WN_offset(wn), WN_st(wn),
03792 Be_Type_Tbl(MTYPE_I8) ));
03793 else if (vtype == MTYPE_F4)
03794 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03795 WN_CreateExp1 ( OPC_I8F4CVT,
03796 WN_CreateLdid ( OPC_F4F4LDID, WN_offset(wn), WN_st(wn),
03797 Be_Type_Tbl(MTYPE_F4) )));
03798 else if (vtype == MTYPE_F8)
03799 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03800 WN_CreateExp1 ( OPC_I8F8CVT,
03801 WN_CreateLdid ( OPC_F8F8LDID, WN_offset(wn), WN_st(wn),
03802 Be_Type_Tbl(MTYPE_F8) )));
03803 else if (vtype == MTYPE_F10)
03804 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03805 WN_CreateExp1 ( OPC_I8F10CVT,
03806 WN_CreateLdid ( OPC_F10F10LDID, WN_offset(wn), WN_st(wn),
03807 Be_Type_Tbl(MTYPE_F10) )));
03808 else if (vtype == MTYPE_FQ)
03809 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03810 WN_CreateExp1 ( OPC_I8FQCVT,
03811 WN_CreateLdid ( OPC_FQFQLDID, WN_offset(wn), WN_st(wn),
03812 Be_Type_Tbl(MTYPE_FQ) )));
03813 else
03814 Fail_FmtAssertion("Gen_Io_PutFieldWN, LDA,I8: unexpected item type"
03815 " (%s) in I/O processing", MTYPE_name(vtype));
03816 else
03817 Fail_FmtAssertion("Gen_Io_PutFieldWN, U4LDA/U8LDA: unexpected field"
03818 " type (%s) in I/O processing", MTYPE_name(ftype));
03819 WN_Delete ( wn );
03820
03821 } else if (OPCODE_is_expression(WN_opcode(wn))) {
03822
03823 etype = WN_rtype(wn);
03824 if (ftype == MTYPE_I4)
03825 if (etype == MTYPE_I4)
03826 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03827 wn );
03828 else if (etype == MTYPE_U4)
03829 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03830 wn );
03831 else if (etype == MTYPE_I8)
03832 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03833 WN_CreateExp1 ( OPC_I4I8CVT, wn ));
03834 else if (etype == MTYPE_U8)
03835 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03836 WN_CreateExp1 ( OPC_I4U8CVT, wn ));
03837 else if (etype == MTYPE_F4)
03838 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03839 WN_CreateExp1 ( OPC_I4F4CVT, wn ));
03840 else if (etype == MTYPE_F8)
03841 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03842 WN_CreateExp1 ( OPC_I4F8CVT, wn ));
03843 else if (etype == MTYPE_F10)
03844 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03845 WN_CreateExp1 ( OPC_I4F10CVT, wn ));
03846 else if (etype == MTYPE_FQ)
03847 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
03848 WN_CreateExp1 ( OPC_I4FQCVT, wn ));
03849 else
03850 Fail_FmtAssertion("Gen_Io_PutFieldWN, exp,I4: unexpected expression"
03851 " type (%s) in I/O processing", MTYPE_name(etype));
03852 else if (ftype == MTYPE_U4)
03853 if (etype == MTYPE_U4 || etype == MTYPE_I4)
03854 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03855 wn );
03856 else if (etype == MTYPE_U8)
03857 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03858 WN_CreateExp1 ( OPC_U4U8CVT, wn ));
03859 else if (etype == MTYPE_I8)
03860 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
03861 WN_CreateExp1 ( OPC_U4I8CVT, wn ));
03862 else
03863 Fail_FmtAssertion("Gen_Io_PutFieldWN, exp,U4: unexpected expression"
03864 " type (%s) in I/O processing", MTYPE_name(etype));
03865 else if (ftype == MTYPE_I8)
03866 if (etype == MTYPE_I4)
03867 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03868 WN_CreateExp1 ( OPC_I8I4CVT, wn ));
03869 else if (etype == MTYPE_U4)
03870 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03871 WN_CreateExp1 ( OPC_I8U4CVT, wn ));
03872 else if (etype == MTYPE_I8)
03873 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03874 wn );
03875 else if (etype == MTYPE_U8)
03876 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03877 wn );
03878 else if (etype == MTYPE_F4)
03879 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03880 WN_CreateExp1 ( OPC_I8F4CVT, wn ));
03881 else if (etype == MTYPE_F8)
03882 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03883 WN_CreateExp1 ( OPC_I8F8CVT, wn ));
03884 else if (etype == MTYPE_F10)
03885 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03886 WN_CreateExp1 ( OPC_I8F10CVT, wn ));
03887 else if (etype == MTYPE_FQ)
03888 wnx = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
03889 WN_CreateExp1 ( OPC_I8FQCVT, wn ));
03890 else
03891 Fail_FmtAssertion("Gen_Io_PutFieldWN, exp,I8: unexpected expression"
03892 " type (%s) in I/O processing", MTYPE_name(etype));
03893 else if (ftype == MTYPE_U8)
03894 if (etype == MTYPE_U8 || etype == MTYPE_I8)
03895 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03896 wn );
03897 else if (etype == MTYPE_U4)
03898 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03899 WN_CreateExp1 ( OPC_U8U4CVT, wn ));
03900 else if (etype == MTYPE_I4)
03901 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
03902 WN_CreateExp1 ( OPC_U8I4CVT, wn ));
03903 else
03904 Fail_FmtAssertion("Gen_Io_PutFieldWN, exp,U8: unexpected expression"
03905 " type (%s) in I/O processing", MTYPE_name(etype));
03906 else
03907 Fail_FmtAssertion("Gen_Io_PutFieldWN, expression: unexpected field"
03908 " type (%s) in I/O processing", MTYPE_name(ftype));
03909
03910 } else
03911
03912 Fail_FmtAssertion("Gen_Io_PutFieldWN: unexpected node (%s)"
03913 " in I/O processing", OPCODE_name(WN_opcode(wn)));
03914
03915
03916
03917
03918 WN_INSERT_BlockLast ( block, wnx );
03919
03920 }
03921
03922
03923
03924
03925
03926
03927
03928 static void Gen_Io_PutKeyFieldWN ( WN * block, ST * st, WN ** wn, INT32 nkeys )
03929 {
03930 WN * wnx = NULL;
03931 INT32 foffset;
03932 INT32 etype;
03933 INT32 vtype;
03934 INT32 i;
03935
03936
03937
03938 foffset = 0;
03939
03940
03941
03942
03943 for (i = 0; i < nkeys; i++, wn++, foffset += 2) {
03944
03945
03946
03947 if (WN_opcode(*wn) == OPC_I4INTCONST) {
03948
03949 wnx = WN_CreateStid ( OPC_I2STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
03950 WN_CreateIntconst ( OPC_I4INTCONST, WN_const_val(*wn) ));
03951 WN_Delete ( *wn );
03952
03953 } else if (WN_opcode(*wn) == OPC_I8INTCONST) {
03954
03955 wnx = WN_CreateStid ( OPC_I2STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
03956 WN_CreateIntconst ( OPC_I4INTCONST, WN_const_val(*wn) ));
03957 WN_Delete ( *wn );
03958
03959 } else if (WN_opcode(*wn) == OPC_U4LDA || WN_opcode(*wn) == OPC_U8LDA) {
03960
03961 vtype = ST_btype(WN_st(*wn));
03962 if (vtype == MTYPE_I4)
03963 wnx = WN_CreateStid ( OPC_I2STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
03964 WN_CreateLdid ( OPC_I4I4LDID, WN_offset(*wn), WN_st(*wn),
03965 Be_Type_Tbl(MTYPE_I4) ));
03966 else if (vtype == MTYPE_I8)
03967 wnx = WN_CreateStid ( OPC_I2STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
03968 WN_CreateExp1 ( OPC_I4I8CVT,
03969 WN_CreateLdid ( OPC_I8I8LDID, WN_offset(*wn), WN_st(*wn),
03970 Be_Type_Tbl(MTYPE_I8) )));
03971 else if (vtype == MTYPE_F4)
03972 wnx = WN_CreateStid ( OPC_I2STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
03973 WN_CreateExp1 ( OPC_I4F4CVT,
03974 WN_CreateLdid ( OPC_F4F4LDID, WN_offset(*wn), WN_st(*wn),
03975 Be_Type_Tbl(MTYPE_F4) )));
03976 else if (vtype == MTYPE_F8)
03977 wnx = WN_CreateStid ( OPC_I2STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
03978 WN_CreateExp1 ( OPC_I4F8CVT,
03979 WN_CreateLdid ( OPC_F8F8LDID, WN_offset(*wn), WN_st(*wn),
03980 Be_Type_Tbl(MTYPE_F8) )));
03981 else if (vtype == MTYPE_F10)
03982 wnx = WN_CreateStid ( OPC_I2STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
03983 WN_CreateExp1 ( OPC_I4F10CVT,
03984 WN_CreateLdid ( OPC_F10F10LDID, WN_offset(*wn), WN_st(*wn),
03985 Be_Type_Tbl(MTYPE_F10) )));
03986 else if (vtype == MTYPE_FQ)
03987 wnx = WN_CreateStid ( OPC_I2STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
03988 WN_CreateExp1 ( OPC_I4FQCVT,
03989 WN_CreateLdid ( OPC_FQFQLDID, WN_offset(*wn), WN_st(*wn),
03990 Be_Type_Tbl(MTYPE_FQ) )));
03991 else
03992 Fail_FmtAssertion("Gen_Io_PutKeyFieldWN: unexpected item type (%s)"
03993 " in I/O processing", MTYPE_name(vtype));
03994 WN_Delete ( *wn );
03995
03996 } else if (OPCODE_is_expression(WN_opcode(*wn))) {
03997
03998 etype = WN_rtype(*wn);
03999 if (etype == MTYPE_I4)
04000 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
04001 *wn );
04002 else if (etype == MTYPE_I8)
04003 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
04004 WN_CreateExp1 ( OPC_I4I8CVT, *wn ));
04005 else if (etype == MTYPE_F4)
04006 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
04007 WN_CreateExp1 ( OPC_I4F4CVT, *wn ));
04008 else if (etype == MTYPE_F8)
04009 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
04010 WN_CreateExp1 ( OPC_I4F8CVT, *wn ));
04011 else if (etype == MTYPE_F10)
04012 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
04013 WN_CreateExp1 ( OPC_I4F10CVT, *wn ));
04014 else if (etype == MTYPE_FQ)
04015 wnx = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I2),
04016 WN_CreateExp1 ( OPC_I4FQCVT, *wn ));
04017 else
04018 Fail_FmtAssertion("Gen_Io_PutKeyFieldWN: unexpected expression type"
04019 " (%s) in I/O processing", MTYPE_name(etype));
04020 } else
04021 Fail_FmtAssertion("Gen_Io_PutKeyFieldWN: unexpected node (%s)"
04022 " in I/O processing", OPCODE_name(WN_opcode(*wn)));
04023
04024
04025
04026
04027 WN_INSERT_BlockLast ( block, wnx );
04028 }
04029 }
04030
04031
04032
04033
04034
04035
04036
04037
04038 static void Gen_Io_PutFieldConst ( WN * block, ST * st, FIOSTRUCT field,
04039 INT64 value )
04040 {
04041 WN * wn = NULL;
04042 INT32 foffset;
04043 INT32 ftype;
04044
04045
04046
04047 if (Pointer_Size == 4) {
04048 foffset = fiostruct_info[field].offset32;
04049 ftype = fiostruct_info[field].type32;
04050 } else {
04051 foffset = fiostruct_info[field].offset64;
04052 ftype = fiostruct_info[field].type64;
04053 }
04054
04055
04056
04057
04058 if (ftype == MTYPE_I4)
04059 wn = WN_CreateStid ( OPC_I4STID, foffset, st, Be_Type_Tbl(MTYPE_I4),
04060 WN_CreateIntconst ( OPC_I4INTCONST, value ));
04061 else if (ftype == MTYPE_U4)
04062 wn = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4),
04063 WN_CreateIntconst ( OPC_U4INTCONST, value ));
04064 else if (ftype == MTYPE_I8)
04065 wn = WN_CreateStid ( OPC_I8STID, foffset, st, Be_Type_Tbl(MTYPE_I8),
04066 WN_CreateIntconst ( OPC_I8INTCONST, value ));
04067 else if (ftype == MTYPE_U8)
04068 wn = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
04069 WN_CreateIntconst ( OPC_U8INTCONST, value ));
04070 else
04071 Fail_FmtAssertion("Gen_Io_PutFieldConst: unexpected field type (%s)"
04072 " in I/O processing", MTYPE_name(ftype));
04073
04074
04075
04076
04077 WN_INSERT_BlockLast ( block, wn );
04078
04079 }
04080
04081
04082
04083
04084
04085
04086
04087
04088
04089 static void Gen_Io_PutAddrWN ( WN * block, ST * st, FIOSTRUCT field, WN * wn )
04090 {
04091 INT32 foffset;
04092 INT32 ftype;
04093 WN * wnx;
04094
04095 #ifdef KEY
04096
04097
04098 if (WN_operator(wn) == OPR_INTCONST)
04099 {
04100 FmtAssert (WN_const_val(wn) == 0,
04101 ("Gen_Io_PutAddrWN: INTCONST can only be zero"));
04102 return;
04103 }
04104 #endif
04105
04106
04107
04108 wnx = wn;
04109 Add_To_Dummy_List(wnx);
04110
04111
04112
04113 if (Pointer_Size == 4) {
04114 foffset = fiostruct_info[field].offset32;
04115 ftype = fiostruct_info[field].type32;
04116 } else {
04117 foffset = fiostruct_info[field].offset64;
04118 ftype = fiostruct_info[field].type64;
04119 }
04120
04121
04122
04123
04124 if ((WN_opcode(wn) == OPC_U4LDA || WN_opcode(wn) == OPC_U4U4LDID ||
04125 WN_opcode(wn) == OPC_U4ARRAY || WN_opcode(wn) == OPC_U4U4ILOAD ||
04126 WN_opcode(wn) == OPC_U4ADD || WN_opcode(wn) == OPC_I4I4LDID) &&
04127 (ftype == MTYPE_U4 || ftype == MTYPE_I4 || ftype == MTYPE_M))
04128 wnx = WN_CreateStid ( OPC_U4STID, foffset, st, Be_Type_Tbl(MTYPE_U4), wn );
04129
04130 else if ((WN_opcode(wn) == OPC_U4LDA || WN_opcode(wn) == OPC_U4U4LDID ||
04131 WN_opcode(wn) == OPC_U4ARRAY || WN_opcode(wn) == OPC_U4U4ILOAD ||
04132 WN_opcode(wn) == OPC_U4ADD) &&
04133 (ftype == MTYPE_U8 || ftype == MTYPE_I8 ))
04134 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
04135 WN_CreateExp1 ( OPC_U8U4CVT, wn));
04136
04137 else if ((WN_opcode(wn) == OPC_U8LDA || WN_opcode(wn) == OPC_U8U8LDID ||
04138 WN_opcode(wn) == OPC_U8ARRAY || WN_opcode(wn) == OPC_U8U8ILOAD ||
04139 WN_opcode(wn) == OPC_U8ADD || WN_opcode(wn) == OPC_I8I8LDID) &&
04140 (ftype == MTYPE_U8 || ftype == MTYPE_I8 || ftype == MTYPE_M))
04141 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8), wn );
04142
04143 else if ((WN_opcode(wn) == OPC_U8LDA || WN_opcode(wn) == OPC_U8U8LDID ||
04144 WN_opcode(wn) == OPC_U8ARRAY || WN_opcode(wn) == OPC_U8U8ILOAD ||
04145 WN_opcode(wn) == OPC_U8ADD) &&
04146 (ftype == MTYPE_U4 || ftype == MTYPE_I4 ))
04147 wnx = WN_CreateStid ( OPC_U8STID, foffset, st, Be_Type_Tbl(MTYPE_U8),
04148 WN_CreateExp1 ( OPC_U4U8CVT, wn ));
04149
04150 else if (WN_opcode(wn) == OPC_MLOAD)
04151 wnx = WN_CreateMstore(foffset, Create_Maligned_TY(foffset, ST_type(st)), wn,
04152 WN_CreateLda(opc_lda, 0, TY_pointer(ST_type(st)), st),
04153 WN_CreateIntconst ( OPC_U4INTCONST, fcd_size));
04154 else
04155 Fail_FmtAssertion("Gen_Io_PutAddrWN: unexpected field type (%s)"
04156 " in I/O processing", MTYPE_name(ftype));
04157
04158
04159
04160
04161 WN_INSERT_BlockLast ( block, wnx );
04162
04163 }
04164
04165
04166 static void
04167 Set_Cilist_Fields( WN * block, ST *st,
04168 WN *unit_wn, WN **items, WN *rec_wn,
04169 WN *parsfmt_wn, WN *fmtsrc_wn,
04170 WN *advance_wn, WN *size_wn, WN *varfmt )
04171 {
04172 INT32 keytype;
04173
04174 if (unit_wn != NULL)
04175 Gen_Io_PutAddrWN ( block, st, FCR_CI_UNIT, unit_wn );
04176 if (items[IOC_IOSTAT] != NULL)
04177 Gen_Io_PutAddrWN ( block, st, FCR_CI_IOSTAT, items[IOC_IOSTAT]);
04178 if (rec_wn != NULL)
04179 Gen_Io_PutAddrWN ( block, st, FCR_CI_REC, rec_wn );
04180 if (parsfmt_wn != NULL)
04181 Gen_Io_PutAddrWN ( block, st, FCR_CI_PARSFMT, parsfmt_wn );
04182 if (fmtsrc_wn != NULL) {
04183 Gen_Io_PutAddrWN ( block, st, FCR_CI_FMTSRC, fmtsrc_wn );
04184 }
04185 if (advance_wn != NULL)
04186 Gen_Io_PutAddrWN ( block, st, FCR_CI_ADVANCE, advance_wn );
04187 if (size_wn != NULL)
04188 Gen_Io_PutAddrWN ( block, st, FCR_CI_SIZE, size_wn );
04189 if (varfmt != NULL) {
04190
04191 fprintf( stderr, "Variable format not yet implemented\n" );
04192 abort();
04193 }
04194 if (items[IOC_KEY] != NULL) {
04195 keytype = IOC_KEY;
04196 } else if (items[IOC_KEYEQ] != NULL) {
04197 keytype = IOC_KEYEQ;
04198 } else if (items[IOC_KEYGE] != NULL) {
04199 keytype = IOC_KEYGE;
04200 } else if (items[IOC_KEYGT] != NULL) {
04201 keytype = IOC_KEYGT;
04202 } else
04203 keytype = 0;
04204 if (keytype) {
04205 fprintf( stderr, "Keyed I/O is not done\n" );
04206 } else {
04207
04208 }
04209 if (items[IOC_KEYID] != NULL) {
04210 } else {
04211
04212 }
04213 }
04214
04215
04216
04217
04218
04219
04220
04221 static void Build_Io_Mask ( INT32 * iomask, INT32 ioshift, WN * wn )
04222 {
04223 TY_IDX ty;
04224 INT32 mtype = 0;
04225
04226
04227
04228 if (WN_operator(wn) == OPR_LDA ||
04229 WN_operator(wn) == OPR_LDID ||
04230 WN_operator(wn) == OPR_ILOAD) {
04231 ty = WN_ty(wn);
04232 while (TY_kind(ty) == KIND_POINTER || TY_kind(ty) == KIND_ARRAY)
04233 if (TY_kind(ty) == KIND_POINTER)
04234 ty = TY_pointed(ty);
04235 else
04236 ty = TY_etype (ty);
04237 mtype = TY_mtype(ty);
04238 }
04239
04240
04241
04242
04243 *iomask |= (fio_maskcode[mtype] << ioshift);
04244
04245 }
04246
04247
04248
04249
04250
04251
04252
04253
04254
04255
04256
04257
04258
04259
04260
04261
04262
04263
04264
04265 static WN *extract_calls ( WN * block, WN * tree )
04266 {
04267 INT32 i;
04268 INT32 dtype;
04269 BOOL loadaddr;
04270 TY_IDX ttype;
04271 ST *temp;
04272 WN *kid0;
04273 PREG_NUM reg1, reg2;
04274
04275
04276
04277
04278 for (i = 0; i < WN_kid_count(tree); i++)
04279 WN_kid(tree,i) = extract_calls ( block, WN_kid(tree,i) );
04280
04281
04282
04283
04284
04285
04286
04287 if (WN_operator(tree) == OPR_INTRINSIC_OP) {
04288
04289 kid0 = WN_kid0(tree);
04290
04291 switch (WN_intrinsic(tree)) {
04292
04293 case INTRN_U4I1ADRTMP:
04294 case INTRN_U8I1ADRTMP: dtype = MTYPE_I1;
04295 loadaddr = TRUE;
04296 break;
04297
04298 case INTRN_U4I2ADRTMP:
04299 case INTRN_U8I2ADRTMP: dtype = MTYPE_I2;
04300 loadaddr = TRUE;
04301 break;
04302
04303 case INTRN_U4I4ADRTMP:
04304 case INTRN_U8I4ADRTMP: dtype = MTYPE_I4;
04305 loadaddr = TRUE;
04306 break;
04307
04308 case INTRN_U4I8ADRTMP:
04309 case INTRN_U8I8ADRTMP: dtype = MTYPE_I8;
04310 loadaddr = TRUE;
04311 break;
04312
04313 case INTRN_U4F4ADRTMP:
04314 case INTRN_U8F4ADRTMP: dtype = MTYPE_F4;
04315 loadaddr = TRUE;
04316 break;
04317
04318 case INTRN_U4F8ADRTMP:
04319 case INTRN_U8F8ADRTMP: dtype = MTYPE_F8;
04320 loadaddr = TRUE;
04321 break;
04322
04323 case INTRN_U4FQADRTMP:
04324 case INTRN_U8FQADRTMP: dtype = MTYPE_FQ;
04325 loadaddr = TRUE;
04326 break;
04327
04328 case INTRN_U4C4ADRTMP:
04329 case INTRN_U8C4ADRTMP: dtype = MTYPE_C4;
04330 loadaddr = TRUE;
04331 break;
04332
04333 case INTRN_U4C8ADRTMP:
04334 case INTRN_U8C8ADRTMP: dtype = MTYPE_C8;
04335 loadaddr = TRUE;
04336 break;
04337
04338 case INTRN_U4CQADRTMP:
04339 case INTRN_U8CQADRTMP: dtype = MTYPE_CQ;
04340 loadaddr = TRUE;
04341 break;
04342
04343 case INTRN_U4VADRTMP:
04344 case INTRN_U8VADRTMP: WN_Delete ( tree );
04345 WN_INSERT_BlockLast ( block, kid0 );
04346 if (WN_operator(WN_kid0(kid0)) != OPR_PARM)
04347 return (WN_COPY_Tree (WN_kid0(kid0)));
04348 else
04349 return (WN_COPY_Tree (WN_kid0(WN_kid0(kid0))));
04350
04351 case INTRN_I4VALTMP: dtype = MTYPE_I4;
04352 loadaddr = FALSE;
04353 break;
04354
04355 case INTRN_I8VALTMP: dtype = MTYPE_I8;
04356 loadaddr = FALSE;
04357 break;
04358
04359 case INTRN_U4VALTMP: dtype = MTYPE_U4;
04360 loadaddr = FALSE;
04361 break;
04362
04363 case INTRN_U8VALTMP: dtype = MTYPE_U8;
04364 loadaddr = FALSE;
04365 break;
04366
04367 case INTRN_F4VALTMP: dtype = MTYPE_F4;
04368 loadaddr = FALSE;
04369 break;
04370
04371 case INTRN_F8VALTMP: dtype = MTYPE_F8;
04372 loadaddr = FALSE;
04373 break;
04374
04375 case INTRN_FQVALTMP: dtype = MTYPE_FQ;
04376 loadaddr = FALSE;
04377 break;
04378
04379 case INTRN_C4VALTMP: dtype = MTYPE_C4;
04380 loadaddr = FALSE;
04381 break;
04382
04383 case INTRN_C8VALTMP: dtype = MTYPE_C8;
04384 loadaddr = FALSE;
04385 break;
04386
04387 case INTRN_CQVALTMP: dtype = MTYPE_CQ;
04388 loadaddr = FALSE;
04389 break;
04390
04391 default: return (tree);
04392
04393 }
04394
04395 WN_Delete ( tree );
04396 ttype = MTYPE_To_TY ( dtype );
04397 temp = Gen_Temp_Symbol ( ttype, "iotemp" );
04398 io_set_addr_saved_flag(temp);
04399
04400 if (OPCODE_is_call(WN_opcode(kid0))) {
04401
04402 WN_INSERT_BlockLast ( block, kid0 );
04403
04404 if (WHIRL_Return_Info_On) {
04405
04406 RETURN_INFO return_info = Get_Return_Info (Be_Type_Tbl(dtype),
04407 Use_Simulated);
04408
04409 if (RETURN_INFO_count(return_info) <= 2) {
04410
04411 reg1 = RETURN_INFO_preg (return_info, 0);
04412 reg2 = RETURN_INFO_preg (return_info, 1);
04413 }
04414
04415 else
04416 Fail_FmtAssertion ("extract_calls: more than 2 return registers");
04417 }
04418 else
04419 Get_Return_Pregs ( dtype, MTYPE_UNKNOWN, ®1, ®2 );
04420
04421 WN_INSERT_BlockLast ( block, WN_Stid ( dtype, 0, temp, ttype,
04422 WN_LdidPreg ( dtype, reg1 )));
04423
04424 } else {
04425
04426 WN_INSERT_BlockLast ( block, WN_Stid ( dtype, 0, temp, ttype, kid0 ));
04427
04428 }
04429
04430 if (loadaddr)
04431 return (WN_Lda ( Pointer_type, 0, temp ));
04432 else
04433 return (WN_Ldid ( dtype, 0, temp, ttype ));
04434
04435 }
04436
04437
04438
04439 return (tree);
04440
04441 }
04442
04443 static WN *
04444 Create_fcd (WN *block, WN *kid1, WN *kid2)
04445 {
04446 ST *st;
04447 WN *fcd;
04448
04449 st = Get_IoStruct_ST ( block, FID_CRAY_FCD, FALSE );
04450 Gen_Io_PutAddrWN ( block, st, FCR_FCD_ADDR, WN_COPY_Tree(kid1));
04451 Gen_Io_PutFieldWN ( block, st, FCR_FCD_LEN, WN_COPY_Tree(kid2));
04452 fcd = WN_CreateMload( 0, TY_pointer(ST_type(st)),
04453 WN_CreateLda(opc_lda, 0, TY_pointer(ST_type(st)), st),
04454 WN_CreateIntconst ( OPC_U4INTCONST, fcd_size));
04455 return (fcd);
04456 }
04457
04458
04459
04460
04461
04462
04463
04464
04465
04466
04467
04468
04469
04470 static void copyout_temp_to_var ( WN * addr, ST *st, TY_IDX ty)
04471 {
04472 WN * wn;
04473
04474 if (TY_mtype(ty) == MTYPE_I1)
04475 wn = WN_CreateIstore ( OPC_I1ISTORE, 0,
04476 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I1), FALSE),
04477 WN_CreateLdid ( OPC_I4I4LDID, 0, st,
04478 Be_Type_Tbl(MTYPE_I4) ), addr );
04479 else if (TY_mtype(ty) == MTYPE_U1)
04480 wn = WN_CreateIstore ( OPC_U1ISTORE, 0,
04481 Make_Pointer_Type(Be_Type_Tbl(MTYPE_U1), FALSE),
04482 WN_CreateLdid ( OPC_U4U4LDID, 0, st,
04483 Be_Type_Tbl(MTYPE_U4) ), addr );
04484 else if (TY_mtype(ty) == MTYPE_I2)
04485 wn = WN_CreateIstore ( OPC_I2ISTORE, 0,
04486 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I2), FALSE),
04487 WN_CreateLdid ( OPC_I4I4LDID, 0, st,
04488 Be_Type_Tbl(MTYPE_I4) ), addr );
04489 else if (TY_mtype(ty) == MTYPE_U2)
04490 wn = WN_CreateIstore ( OPC_U2ISTORE, 0,
04491 Make_Pointer_Type(Be_Type_Tbl(MTYPE_U2), FALSE),
04492 WN_CreateLdid ( OPC_U4U4LDID, 0, st,
04493 Be_Type_Tbl(MTYPE_U4) ), addr );
04494 else if (TY_mtype(ty) == MTYPE_I8)
04495 wn = WN_CreateIstore ( OPC_I8ISTORE, 0,
04496 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I8), FALSE),
04497 WN_CreateLdid ( OPC_I8I4LDID, 0, st,
04498 Be_Type_Tbl(MTYPE_I4) ), addr );
04499 else if (TY_mtype(ty) == MTYPE_U8)
04500 wn = WN_CreateIstore ( OPC_U8ISTORE, 0,
04501 Make_Pointer_Type(Be_Type_Tbl(MTYPE_U8), FALSE),
04502 WN_CreateLdid ( OPC_U8U4LDID, 0, st,
04503 Be_Type_Tbl(MTYPE_U4) ), addr );
04504 else
04505 Fail_FmtAssertion("copyout_temp_to_var: unexpected type (%s)"
04506 " in I/O processing", MTYPE_name(TY_mtype(ty)));
04507
04508 if (copyout_block == NULL)
04509 copyout_block = WN_CreateBlock();
04510
04511 WN_INSERT_BlockLast ( copyout_block, wn );
04512
04513 }
04514
04515
04516
04517
04518
04519
04520
04521
04522
04523
04524
04525
04526
04527
04528
04529
04530 static WN *
04531 get_32bit_cilist_item(WN *cilist_item, TY_IDX ty)
04532 {
04533 TYPE_ID mtype = TY_mtype(ty);
04534 ST *st;
04535 WN *wn;
04536
04537 if (mtype != MTYPE_I4 && mtype != MTYPE_U4) {
04538
04539 if (MTYPE_is_signed(mtype)) {
04540 st = Gen_Temp_Symbol( MTYPE_To_TY(MTYPE_U4), "temp_cilist_item");
04541 copyout_temp_to_var(cilist_item, st, ty);
04542 wn = WN_CreateLda (opc_lda, 0,
04543 Make_Pointer_Type (MTYPE_To_TY(MTYPE_U4), FALSE),
04544 st);
04545 } else {
04546 st = Gen_Temp_Symbol( MTYPE_To_TY(MTYPE_I4), "temp_cilist_item");
04547 copyout_temp_to_var(cilist_item, st, ty);
04548 wn = WN_CreateLda (opc_lda, 0,
04549 Make_Pointer_Type (MTYPE_To_TY(MTYPE_I4), FALSE),
04550 st);
04551 }
04552 return wn;
04553 } else {
04554 return cilist_item;
04555 }
04556 }
04557
04558
04559
04560
04561
04562
04563
04564
04565
04566
04567
04568
04569
04570
04571
04572
04573
04574
04575
04576
04577
04578
04579
04580 static void process_iostat ( WN **block1, WN **block2, BOOL flag, WN *iostat,
04581 LABEL_IDX err, LABEL_IDX end, LABEL_IDX eor,
04582 BOOL zero_escape_freq )
04583 {
04584 PREG_NUM rreg1, rreg2;
04585 PREG_NUM pregnum;
04586 WN * wn;
04587 WN * iostatx;
04588 WN * test_label = NULL;
04589 ST * pregst;
04590 TY_IDX iostatty;
04591 BOOL only_copyout_needed = FALSE;
04592
04593
04594
04595 #ifdef KEY
04596
04597
04598 if (PU_f90_lang(Get_Current_PU())) {
04599 #else
04600 if (Language == LANG_F90) {
04601 #endif // KEY
04602 if (iostat == NULL &&
04603 end == (LABEL_IDX) 0 &&
04604 err == (LABEL_IDX) 0 &&
04605 eor == (LABEL_IDX) 0) {
04606 if (copyout_block) {
04607 only_copyout_needed = TRUE;
04608 } else {
04609 *block1 = NULL;
04610 *block2 = NULL;
04611 return;
04612 }
04613 }
04614 } else {
04615 if (iostat == NULL && end == (LABEL_IDX) 0 && err == (LABEL_IDX) 0) {
04616 *block1 = NULL;
04617 *block2 = NULL;
04618 return;
04619 }
04620 }
04621
04622
04623
04624 if (flag)
04625 *block1 = WN_CreateBlock();
04626 else
04627 *block1 = NULL;
04628 *block2 = WN_CreateBlock();
04629
04630
04631 #ifdef KEY
04632
04633
04634 if ((PU_f90_lang(Get_Current_PU())) && only_copyout_needed) {
04635 #else
04636 if ((Language == LANG_F90) && only_copyout_needed) {
04637 #endif // KEY
04638 if (flag)
04639 WN_INSERT_BlockLast ( *block1, WN_COPY_Tree(copyout_block) );
04640 WN_INSERT_BlockLast ( *block2, copyout_block );
04641 return;
04642 }
04643
04644
04645
04646 if (flag)
04647 test_label = WN_CreateNewLabel();
04648
04649
04650
04651 if (WHIRL_Return_Info_On) {
04652
04653 RETURN_INFO return_info = Get_Return_Info (Be_Type_Tbl(MTYPE_I4),
04654 Use_Simulated);
04655
04656 if (RETURN_INFO_count(return_info) <= 2) {
04657
04658 rreg1 = RETURN_INFO_preg (return_info, 0);
04659 rreg2 = RETURN_INFO_preg (return_info, 1);
04660 }
04661
04662 else
04663 Fail_FmtAssertion ("process_iostat: more than 2 return registers");
04664 }
04665
04666 else
04667 Get_Return_Pregs ( MTYPE_I4, MTYPE_UNKNOWN, &rreg1, &rreg2 );
04668
04669 pregst = MTYPE_To_PREG ( MTYPE_I4 );
04670 pregnum = Create_Preg ( MTYPE_I4, "io_status");
04671 wn = WN_CreateStid ( OPC_I4STID, pregnum, pregst, Be_Type_Tbl(MTYPE_I4),
04672 WN_CreateLdid ( OPC_I4I4LDID, rreg1, Int32_Preg,
04673 Be_Type_Tbl(MTYPE_I4) ));
04674 if (flag)
04675 WN_INSERT_BlockLast ( *block1, WN_COPY_Tree(wn) );
04676 WN_INSERT_BlockLast ( *block2, wn );
04677
04678 #ifdef KEY
04679
04680
04681 if ((PU_f90_lang(Get_Current_PU())) && copyout_block) {
04682 #else
04683 if ((Language == LANG_F90) && copyout_block) {
04684 #endif // KEY
04685 if (flag)
04686 WN_INSERT_BlockLast ( *block1, WN_COPY_Tree(copyout_block) );
04687 WN_INSERT_BlockLast ( *block2, copyout_block );
04688 }
04689
04690
04691
04692 if (current_io_library == IOLIB_MIPS && iostat != NULL) {
04693 if (WN_operator(iostat) == OPR_LDA) {
04694 iostatty = WN_ty(iostat);
04695 while (TY_kind(iostatty) == KIND_POINTER)
04696 iostatty = TY_pointed(iostatty);
04697 if (TY_mtype(iostatty) == MTYPE_I1)
04698 wn = WN_CreateStid ( OPC_I1STID, 0, WN_st(iostat),
04699 Be_Type_Tbl(MTYPE_I1),
04700 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04701 Be_Type_Tbl(MTYPE_I4) ));
04702 else if (TY_mtype(iostatty) == MTYPE_I2)
04703 wn = WN_CreateStid ( OPC_I2STID, 0, WN_st(iostat),
04704 Be_Type_Tbl(MTYPE_I2),
04705 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04706 Be_Type_Tbl(MTYPE_I4) ));
04707 else if (TY_mtype(iostatty) == MTYPE_I4)
04708 wn = WN_CreateStid ( OPC_I4STID, 0, WN_st(iostat),
04709 Be_Type_Tbl(MTYPE_I4),
04710 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04711 Be_Type_Tbl(MTYPE_I4) ));
04712 else if (TY_mtype(iostatty) == MTYPE_I8)
04713 wn = WN_CreateStid ( OPC_I8STID, 0, WN_st(iostat),
04714 Be_Type_Tbl(MTYPE_I8),
04715 WN_CreateLdid ( OPC_I8I4LDID, pregnum, pregst,
04716 Be_Type_Tbl(MTYPE_I8) ));
04717 else
04718 Fail_FmtAssertion("unexpected iostat type (%s) in"
04719 " I/O processing",
04720 MTYPE_name(TY_mtype(iostatty)));
04721 } else {
04722 iostatx = iostat;
04723 while (WN_operator(iostatx) == OPR_ARRAY)
04724 iostatx = WN_kid0(iostatx);
04725 iostatty = WN_ty(iostatx);
04726 while (TY_kind(iostatty) == KIND_POINTER ||
04727 TY_kind(iostatty) == KIND_ARRAY)
04728 if (TY_kind(iostatty) == KIND_POINTER)
04729 iostatty = TY_pointed(iostatty);
04730 else
04731 iostatty = TY_AR_etype(iostatty);
04732 if (TY_mtype(iostatty) == MTYPE_I1)
04733 wn = WN_CreateIstore ( OPC_I1ISTORE, 0,
04734 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I1), FALSE),
04735 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04736 Be_Type_Tbl(MTYPE_I4) ),
04737 iostat );
04738 else if (TY_mtype(iostatty) == MTYPE_I2)
04739 wn = WN_CreateIstore ( OPC_I2ISTORE, 0,
04740 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I2), FALSE),
04741 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04742 Be_Type_Tbl(MTYPE_I4) ),
04743 iostat );
04744 else if (TY_mtype(iostatty) == MTYPE_I4)
04745 wn = WN_CreateIstore ( OPC_I4ISTORE, 0,
04746 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I4), FALSE),
04747 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04748 Be_Type_Tbl(MTYPE_I4) ),
04749 iostat );
04750 else if (TY_mtype(iostatty) == MTYPE_I8)
04751 wn = WN_CreateIstore ( OPC_I8ISTORE, 0,
04752 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I8), FALSE),
04753 WN_CreateLdid ( OPC_I8I4LDID, pregnum, pregst,
04754 Be_Type_Tbl(MTYPE_I8) ),
04755 iostat );
04756 else
04757 Fail_FmtAssertion("unexpected iostat type (%s) in I/O processing",
04758 MTYPE_name(TY_mtype(iostatty)));
04759 }
04760 if (flag)
04761 WN_INSERT_BlockLast ( *block1, WN_COPY_Tree(wn) );
04762 WN_INSERT_BlockLast ( *block2, wn );
04763 }
04764
04765
04766
04767 if (flag) {
04768 wn = WN_CreateTruebr ( WN_label_number(test_label),
04769 WN_CreateExp2 ( OPC_I4I4NE,
04770 WN_CreateLdid ( OPC_I4I4LDID,
04771 pregnum, pregst,
04772 Be_Type_Tbl(MTYPE_I4) ),
04773 WN_CreateIntconst ( OPC_I4INTCONST,
04774 0 )));
04775 WN_INSERT_BlockLast ( *block1, wn );
04776 WN_INSERT_BlockLast ( *block2, test_label );
04777 }
04778
04779 if (current_io_library == IOLIB_MIPS) {
04780
04781
04782 if (end != (LABEL_IDX) 0) {
04783 LABEL_IDX end_label;
04784 end_label = end;
04785 wn = WN_CreateTruebr ( end_label,
04786 WN_CreateExp2 ( OPC_I4I4LT,
04787 WN_CreateLdid ( OPC_I4I4LDID,
04788 pregnum, pregst,
04789 Be_Type_Tbl(MTYPE_I4) ),
04790 WN_CreateIntconst ( OPC_I4INTCONST,
04791 0 )));
04792 WN_INSERT_BlockLast ( *block2, wn );
04793
04794
04795 if ( zero_escape_freq && Cur_PU_Feedback )
04796 Cur_PU_Feedback->Annot( wn, FB_EDGE_BRANCH_TAKEN, FB_FREQ_ZERO );
04797 }
04798
04799
04800
04801 if (err != (LABEL_IDX) 0) {
04802 LABEL_IDX err_label;
04803 err_label = err;
04804 if (!end && !iostat)
04805 wn = WN_CreateTruebr ( err_label,
04806 WN_CreateExp2 ( OPC_I4I4NE,
04807 WN_CreateLdid ( OPC_I4I4LDID,
04808 pregnum, pregst,
04809 Be_Type_Tbl(MTYPE_I4) ),
04810 WN_CreateIntconst ( OPC_I4INTCONST,
04811 0 )));
04812 else
04813 wn = WN_CreateTruebr ( err_label,
04814 WN_CreateExp2 ( OPC_I4I4GT,
04815 WN_CreateLdid ( OPC_I4I4LDID,
04816 pregnum, pregst,
04817 Be_Type_Tbl(MTYPE_I4) ),
04818 WN_CreateIntconst ( OPC_I4INTCONST,
04819 0 )));
04820 WN_INSERT_BlockLast ( *block2, wn );
04821
04822
04823 if ( zero_escape_freq && Cur_PU_Feedback )
04824 Cur_PU_Feedback->Annot( wn, FB_EDGE_BRANCH_TAKEN, FB_FREQ_ZERO );
04825 }
04826 } else {
04827 if (err != (LABEL_IDX) 0) {
04828 LABEL_IDX err_label;
04829 err_label = err;
04830 wn = WN_CreateTruebr ( err_label,
04831 WN_CreateExp2 ( OPC_I4I4EQ,
04832 WN_CreateLdid ( OPC_I4I4LDID,
04833 pregnum, pregst,
04834 Be_Type_Tbl(MTYPE_I4) ),
04835 WN_CreateIntconst ( OPC_I4INTCONST,
04836 1 )));
04837 WN_INSERT_BlockLast ( *block2, wn );
04838
04839
04840 if ( zero_escape_freq && Cur_PU_Feedback )
04841 Cur_PU_Feedback->Annot( wn, FB_EDGE_BRANCH_TAKEN, FB_FREQ_ZERO );
04842 }
04843
04844 if (end != (LABEL_IDX) 0) {
04845 LABEL_IDX end_label;
04846 end_label = end;
04847 wn = WN_CreateTruebr ( end_label,
04848 WN_CreateExp2 ( OPC_I4I4EQ,
04849 WN_CreateLdid ( OPC_I4I4LDID,
04850 pregnum, pregst,
04851 Be_Type_Tbl(MTYPE_I4) ),
04852 WN_CreateIntconst ( OPC_I4INTCONST,
04853 2 )));
04854 WN_INSERT_BlockLast ( *block2, wn );
04855
04856
04857 if ( zero_escape_freq && Cur_PU_Feedback )
04858 Cur_PU_Feedback->Annot( wn, FB_EDGE_BRANCH_TAKEN, FB_FREQ_ZERO );
04859 }
04860
04861 if (eor != (LABEL_IDX) 0) {
04862 LABEL_IDX eor_label;
04863 eor_label = eor;
04864 wn = WN_CreateTruebr ( eor_label,
04865 WN_CreateExp2 ( OPC_I4I4EQ,
04866 WN_CreateLdid ( OPC_I4I4LDID,
04867 pregnum, pregst,
04868 Be_Type_Tbl(MTYPE_I4) ),
04869 WN_CreateIntconst ( OPC_I4INTCONST,
04870 3 )));
04871 WN_INSERT_BlockLast ( *block2, wn );
04872
04873
04874 if ( zero_escape_freq && Cur_PU_Feedback )
04875 Cur_PU_Feedback->Annot( wn, FB_EDGE_BRANCH_TAKEN, FB_FREQ_ZERO );
04876 }
04877 }
04878 }
04879
04880
04881
04882
04883
04884
04885
04886
04887
04888
04889
04890
04891
04892
04893 static void process_inqvar ( WN ** block, WN * var)
04894 {
04895 PREG_NUM rreg1, rreg2;
04896 PREG_NUM pregnum;
04897 WN * wn;
04898 WN * varx;
04899 ST * pregst;
04900 TY_IDX varty;
04901
04902 if (var != NULL) {
04903 *block = WN_CreateBlock();
04904
04905
04906
04907 if (WHIRL_Return_Info_On) {
04908
04909 RETURN_INFO return_info = Get_Return_Info (Be_Type_Tbl(MTYPE_I4),
04910 Use_Simulated);
04911
04912 if (RETURN_INFO_count(return_info) <= 2) {
04913
04914 rreg1 = RETURN_INFO_preg (return_info, 0);
04915 rreg2 = RETURN_INFO_preg (return_info, 1);
04916 }
04917
04918 else
04919 Fail_FmtAssertion ("process_inqvar: more than 2 return registers");
04920 }
04921
04922 else
04923 Get_Return_Pregs ( MTYPE_I4, MTYPE_UNKNOWN, &rreg1, &rreg2 );
04924
04925 pregst = MTYPE_To_PREG ( MTYPE_I4 );
04926 pregnum = Create_Preg ( MTYPE_I4, "io_status");
04927 wn = WN_CreateStid ( OPC_I4STID, pregnum, pregst, Be_Type_Tbl(MTYPE_I4),
04928 WN_CreateLdid ( OPC_I4I4LDID, rreg1, Int32_Preg,
04929 Be_Type_Tbl(MTYPE_I4) ));
04930 WN_INSERT_BlockLast ( *block, wn );
04931
04932 if (WN_operator(var) == OPR_LDA) {
04933 varty = WN_ty(var);
04934 while (TY_kind(varty) == KIND_POINTER)
04935 varty = TY_pointed(varty);
04936 if (TY_mtype(varty) == MTYPE_I1)
04937 wn = WN_CreateStid ( OPC_I1STID, 0, WN_st(var),
04938 Be_Type_Tbl(MTYPE_I1),
04939 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04940 Be_Type_Tbl(MTYPE_I4) ));
04941 else if (TY_mtype(varty) == MTYPE_I2)
04942 wn = WN_CreateStid ( OPC_I2STID, 0, WN_st(var),
04943 Be_Type_Tbl(MTYPE_I2),
04944 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04945 Be_Type_Tbl(MTYPE_I4) ));
04946 else if (TY_mtype(varty) == MTYPE_I4)
04947 wn = WN_CreateStid ( OPC_I4STID, 0, WN_st(var),
04948 Be_Type_Tbl(MTYPE_I4),
04949 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04950 Be_Type_Tbl(MTYPE_I4) ));
04951 else if (TY_mtype(varty) == MTYPE_I8)
04952 wn = WN_CreateStid ( OPC_I8STID, 0, WN_st(var),
04953 Be_Type_Tbl(MTYPE_I8),
04954 WN_CreateLdid ( OPC_I8I4LDID, pregnum, pregst,
04955 Be_Type_Tbl(MTYPE_I8) ));
04956 else
04957 Fail_FmtAssertion("process_inqvar, LDA: unexpected var type (%s)"
04958 " in I/O processing", MTYPE_name(TY_mtype(varty)));
04959 } else {
04960 varx = var;
04961 while (WN_operator(varx) == OPR_ARRAY)
04962 varx = WN_kid0(varx);
04963 varty = WN_ty(varx);
04964 while (TY_kind(varty) == KIND_POINTER ||
04965 TY_kind(varty) == KIND_ARRAY)
04966 if (TY_kind(varty) == KIND_POINTER)
04967 varty = TY_pointed(varty);
04968 else
04969 varty = TY_AR_etype(varty);
04970 if (TY_mtype(varty) == MTYPE_I1)
04971 wn = WN_CreateIstore ( OPC_I1ISTORE, 0,
04972 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I1), FALSE),
04973 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04974 Be_Type_Tbl(MTYPE_I4) ),
04975 var );
04976 else if (TY_mtype(varty) == MTYPE_I2)
04977 wn = WN_CreateIstore ( OPC_I2ISTORE, 0,
04978 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I2), FALSE),
04979 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04980 Be_Type_Tbl(MTYPE_I4) ),
04981 var );
04982 else if (TY_mtype(varty) == MTYPE_I4)
04983 wn = WN_CreateIstore ( OPC_I4ISTORE, 0,
04984 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I4), FALSE),
04985 WN_CreateLdid ( OPC_I4I4LDID, pregnum, pregst,
04986 Be_Type_Tbl(MTYPE_I4) ),
04987 var );
04988 else if (TY_mtype(varty) == MTYPE_I8)
04989 wn = WN_CreateIstore ( OPC_I8ISTORE, 0,
04990 Make_Pointer_Type(Be_Type_Tbl(MTYPE_I8), FALSE),
04991 WN_CreateLdid ( OPC_I8I4LDID, pregnum, pregst,
04992 Be_Type_Tbl(MTYPE_I8) ),
04993 var );
04994 else
04995 Fail_FmtAssertion("process_inqvar: unexpected var type (%s)"
04996 " in I/O processing", MTYPE_name(TY_mtype(varty)));
04997 }
04998 WN_INSERT_BlockLast ( *block, wn );
04999 }
05000 }
05001
05002
05003 static mINT32 search_implied_do_index ( WN *array_index, ST *implied_do_index )
05004 {
05005
05006 if ((WN_operator( array_index ) == OPR_CALL) ||
05007 (WN_operator( array_index ) == OPR_ICALL) ||
05008 (WN_operator( array_index ) == OPR_PICCALL) ||
05009 (WN_operator( array_index ) == OPR_INTRINSIC_CALL)) {
05010 return( 1 );
05011 } else if (WN_kid_count( array_index ) == 0) {
05012 if (WN_operator( array_index ) == OPR_LDID
05013 && WN_st( array_index ) == implied_do_index)
05014 return( 1 );
05015 } else if (WN_kid_count( array_index ) == 1) {
05016 return( search_implied_do_index( WN_kid0( array_index ),
05017 implied_do_index));
05018 } else if (WN_kid_count( array_index ) == 2) {
05019 if (search_implied_do_index( WN_kid0( array_index ), implied_do_index))
05020 return( 1 );
05021 if (search_implied_do_index( WN_kid1( array_index ), implied_do_index))
05022 return( 1 );
05023 } else
05024
05025
05026
05027 return( 1 );
05028 return( 0 );
05029 }
05030
05031
05032 static FIOITEMTYPE get_FIT_type ( TY_IDX ty )
05033 {
05034 FIOITEMTYPE type;
05035 INT32 mtype = TY_mtype(ty);
05036 BOOL char_flag = TY_is_character(Ty_Table [ty]);
05037 BOOL logical_flag = TY_is_logical(Ty_Table [ty]);
05038
05039 switch (mtype) {
05040
05041 case MTYPE_U1:
05042 type = FIT_CHARACTER;
05043 break;
05044
05045 case MTYPE_I1:
05046 if (char_flag)
05047 type = FIT_CHARACTER;
05048 else if (logical_flag)
05049 type = FIT_LOGICAL1;
05050 else
05051 type = FIT_INTEGER1;
05052 break;
05053
05054 case MTYPE_I2:
05055 if (logical_flag)
05056 type = FIT_LOGICAL2;
05057 else
05058 type = FIT_INTEGER2;
05059 break;
05060
05061 case MTYPE_I4:
05062 if (logical_flag)
05063 type = FIT_LOGICAL4;
05064 else
05065 type = FIT_INTEGER4;
05066 break;
05067
05068 case MTYPE_I8:
05069 if (logical_flag)
05070 type = FIT_LOGICAL8;
05071 else
05072 type = FIT_INTEGER8;
05073 break;
05074
05075 case MTYPE_U4:
05076 type = FIT_ADDRESS4;
05077 break;
05078
05079 case MTYPE_U8:
05080 type = FIT_ADDRESS8;
05081 break;
05082
05083 case MTYPE_F4:
05084 type = FIT_REAL4;
05085 break;
05086
05087 case MTYPE_F8:
05088 type = FIT_REAL8;
05089 break;
05090
05091 case MTYPE_F10:
05092 case MTYPE_FQ:
05093 type = FIT_REAL16;
05094 break;
05095
05096 case MTYPE_C4:
05097 type = FIT_COMPLEX4;
05098 break;
05099
05100 case MTYPE_C8:
05101 type = FIT_COMPLEX8;
05102 break;
05103
05104 case MTYPE_CQ:
05105 type = FIT_COMPLEX16;
05106 break;
05107
05108 case MTYPE_M:
05109 type = FIT_RECORD;
05110 break;
05111
05112 case MTYPE_UNKNOWN:
05113 if (char_flag) {
05114 type = FIT_CHARACTER;
05115 break;
05116 }
05117
05118
05119 default:
05120 Fail_FmtAssertion("get_FIT_type: unexpected type (%s) in I/O processing",
05121 MTYPE_name(mtype));
05122
05123 }
05124
05125 return type;
05126
05127 }
05128
05129
05130
05131
05132
05133
05134
05135
05136
05137
05138
05139
05140 static void lower_record_items ( WN * block, FIOFORMATTYPE form, WN * iostat,
05141 BOOL mode, TY_IDX rty_idx, WN * addr, INT64 roffset)
05142 {
05143 TY_IDX ty_idx;
05144 TY_IDX ety_idx;
05145 FIOITEMTYPE type;
05146 FIOITEMTYPE etype;
05147 ST *unit_ptr;
05148 INT64 offset;
05149 WN *wn;
05150 WN *wn1;
05151 WN *wn2;
05152 WN *wn3;
05153 INT64 size;
05154 INT64 nelem;
05155 ST *ctrst;
05156 ST *adrst;
05157 PREG_NUM ctrnum;
05158 PREG_NUM adrnum;
05159 WN *raddr;
05160 WN *recblk;
05161
05162 TY& rty = Ty_Table [rty_idx];
05163
05164 Is_True (TY_kind(rty) == KIND_STRUCT,
05165 ("non record type passed to lower_record_items"));
05166
05167
05168
05169 FLD_ITER fld_iter = Make_fld_iter (TY_fld(rty));
05170
05171 do {
05172 FLD_HANDLE fld (fld_iter);
05173
05174 ty_idx = FLD_type(fld);
05175 TY& ty = Ty_Table [ty_idx];
05176 offset = roffset + FLD_ofst(fld);
05177
05178 switch (TY_kind(ty)) {
05179
05180 case KIND_SCALAR:
05181 case KIND_POINTER:
05182
05183 type = get_FIT_type ( ty_idx );
05184 if (mode) {
05185 (void) Make_Pointer_Type ( ty_idx, FALSE );
05186 if (offset <= INT32_MAX)
05187 wn1 = WN_CreateLda ( opc_lda, offset, TY_pointer(ty_idx, FALSE),
05188 WN_st(addr) );
05189 else
05190 wn1 = WN_Add ( Pointer_type,
05191 WN_CreateLda ( opc_lda, 0, TY_pointer(ty_idx, FALSE),
05192 WN_st(addr) ),
05193 WN_CreateIntconst ( opc_const, offset ) );
05194 } else
05195 wn1 = WN_Add ( Pointer_type, WN_COPY_Tree(addr),
05196 WN_CreateIntconst ( opc_const, offset ) );
05197 if (mp_io) {
05198 unit_ptr = Get_UnitPointer_ST();
05199 GEN_IO_CALL_3 ( block, fio_item_ops[form][type], iostat, NULL,
05200 wn1, WN_CreateIntconst ( OPC_I4INTCONST, 1 ),
05201 Make_IoAddr_WN(unit_ptr) );
05202 } else
05203 GEN_IO_CALL_2 ( block, fio_item_ops[form][type], iostat, NULL,
05204 wn1, WN_CreateIntconst ( OPC_I4INTCONST, 1 ));
05205 break;
05206
05207 case KIND_ARRAY:
05208
05209 {
05210
05211 ety_idx = TY_AR_etype(ty);
05212 TY& ety = Ty_Table [ety_idx];
05213 etype = get_FIT_type ( ety_idx );
05214 switch (etype) {
05215
05216 case FIT_ADDRESS4:
05217 case FIT_ADDRESS8:
05218 case FIT_INTEGER1:
05219 case FIT_INTEGER2:
05220 case FIT_INTEGER4:
05221 case FIT_INTEGER8:
05222 case FIT_LOGICAL1:
05223 case FIT_LOGICAL2:
05224 case FIT_LOGICAL4:
05225 case FIT_LOGICAL8:
05226 case FIT_REAL4:
05227 case FIT_REAL8:
05228 case FIT_REAL16:
05229 case FIT_COMPLEX4:
05230 case FIT_COMPLEX8:
05231 case FIT_COMPLEX16:
05232 if (mode) {
05233 (void) Make_Pointer_Type ( ety_idx, FALSE );
05234 if (offset <= INT32_MAX)
05235 wn1 = WN_CreateLda ( opc_lda, offset, TY_pointer(ety_idx, FALSE),
05236 WN_st(addr) );
05237 else
05238 wn1 = WN_Add ( Pointer_type,
05239 WN_CreateLda ( opc_lda, 0, TY_pointer(ety_idx, FALSE),
05240 WN_st(addr) ),
05241 WN_CreateIntconst ( opc_const, offset ) );
05242 } else
05243 wn1 = WN_Add ( Pointer_type, WN_COPY_Tree(addr),
05244 WN_CreateIntconst ( opc_const, offset ) );
05245 nelem = TY_size(ty) / TY_size(ety);
05246 if (nelem <= INT32_MAX)
05247 wn2 = WN_CreateIntconst ( OPC_I4INTCONST, nelem );
05248 else
05249 wn2 = WN_CreateIntconst ( OPC_I8INTCONST, nelem );
05250 if (mp_io) {
05251 unit_ptr = Get_UnitPointer_ST();
05252 GEN_IO_CALL_3 ( block, fio_item_ops[form][etype], iostat, NULL,
05253 wn1, wn2, Make_IoAddr_WN(unit_ptr) );
05254 } else
05255 GEN_IO_CALL_2 ( block, fio_item_ops[form][etype], iostat, NULL,
05256 wn1, wn2 );
05257 break;
05258
05259 case FIT_CHARACTER:
05260 if (mode) {
05261 (void) Make_Pointer_Type ( ety_idx, FALSE );
05262 if (offset <= INT32_MAX)
05263 wn1 = WN_CreateLda ( opc_lda, offset, TY_pointer(ety_idx, FALSE),
05264 WN_st(addr) );
05265 else
05266 wn1 = WN_Add ( Pointer_type,
05267 WN_CreateLda ( opc_lda, 0, TY_pointer(ety_idx, FALSE),
05268 WN_st(addr) ),
05269 WN_CreateIntconst ( opc_const, offset ) );
05270 } else
05271 wn1 = WN_Add ( Pointer_type, WN_COPY_Tree(addr),
05272 WN_CreateIntconst ( opc_const, offset ) );
05273 if (TY_kind(ety) == KIND_ARRAY) {
05274 size = TY_size(ety);
05275 nelem = TY_size(ty) / size;
05276 } else {
05277 size = TY_size(ty);
05278 nelem = 1;
05279 }
05280 if (size <= INT32_MAX)
05281 wn2 = WN_CreateIntconst ( OPC_I4INTCONST, size );
05282 else
05283 wn2 = WN_CreateIntconst ( OPC_I8INTCONST, size );
05284 if (nelem <= INT32_MAX)
05285 wn3 = WN_CreateIntconst ( OPC_I4INTCONST, nelem );
05286 else
05287 wn3 = WN_CreateIntconst ( OPC_I8INTCONST, nelem );
05288 if (mp_io) {
05289 unit_ptr = Get_UnitPointer_ST();
05290 GEN_IO_CALL_4 ( block, fio_item_ops[form][etype], iostat, NULL,
05291 wn1, wn2, wn3, Make_IoAddr_WN(unit_ptr) );
05292 } else
05293 GEN_IO_CALL_3 ( block, fio_item_ops[form][etype], iostat, NULL,
05294 wn1, wn2, wn3 );
05295 break;
05296
05297 case FIT_RECORD:
05298 if (mode) {
05299 (void) Make_Pointer_Type ( ety_idx, FALSE );
05300 if (offset <= INT32_MAX)
05301 wn = WN_CreateLda ( opc_lda, offset, TY_pointer(ety_idx, FALSE),
05302 WN_st(addr) );
05303 else
05304 wn = WN_Add ( Pointer_type,
05305 WN_CreateLda ( opc_lda, 0, TY_pointer(ety_idx, FALSE),
05306 WN_st(addr) ),
05307 WN_CreateIntconst ( opc_const, offset ) );
05308 } else
05309 wn = WN_Add ( Pointer_type, WN_COPY_Tree(addr),
05310 WN_CreateIntconst ( opc_const, offset ) );
05311 adrst = MTYPE_To_PREG ( Pointer_type );
05312 adrnum = Create_Preg ( Pointer_type, "record_address");
05313 WN_INSERT_BlockLast ( block,
05314 WN_StidIntoPreg ( Pointer_type, adrnum, adrst,
05315 wn ));
05316 recblk = WN_CreateBlock();
05317 ctrst = MTYPE_To_PREG ( MTYPE_I4 );
05318 ctrnum = Create_Preg ( MTYPE_I4, "record_counter");
05319 size = TY_size(ety);
05320 nelem = TY_size(ty) / size;
05321 WN_INSERT_BlockLast ( block,
05322 WN_CreateDO (
05323 WN_CreateIdname ( ctrnum, ctrst ),
05324 WN_StidIntoPreg ( MTYPE_I4, ctrnum, ctrst,
05325 WN_CreateIntconst ( OPC_I4INTCONST, 1 )),
05326 WN_LE ( MTYPE_I4,
05327 WN_LdidPreg ( MTYPE_I4, ctrnum ),
05328 WN_CreateIntconst ( OPC_I4INTCONST,
05329 nelem )),
05330 WN_StidIntoPreg ( MTYPE_I4, ctrnum, ctrst,
05331 WN_Add ( MTYPE_I4,
05332 WN_LdidPreg ( MTYPE_I4,
05333 ctrnum ),
05334 WN_CreateIntconst ( OPC_I4INTCONST,
05335 (INT64)1 ))),
05336 recblk, NULL ));
05337 raddr = WN_LdidPreg ( Pointer_type, adrnum );
05338 lower_record_items ( recblk, form, iostat, FALSE, ety_idx, raddr,
05339 (INT64)0 );
05340 WN_INSERT_BlockLast ( recblk,
05341 WN_StidIntoPreg ( Pointer_type, adrnum, adrst,
05342 WN_Add ( Pointer_type, raddr,
05343 WN_CreateIntconst ( opc_const, size ))));
05344 break;
05345
05346 default:
05347 Fail_FmtAssertion("unexpected type (%s) in record I/O processing",
05348 MTYPE_name(TY_mtype(ety)));
05349
05350 }
05351
05352 break;
05353
05354 }
05355
05356 case KIND_STRUCT:
05357 lower_record_items ( block, form, iostat, mode, ty_idx, addr, offset );
05358 break;
05359
05360 case KIND_VOID:
05361 break;
05362
05363 default:
05364 Fail_FmtAssertion("unexpected type (%s) in record I/O processing",
05365 MTYPE_name(TY_mtype(ty)));
05366
05367 }
05368
05369 } while (! FLD_last_field (fld_iter++));
05370 }
05371
05372
05373
05374
05375
05376
05377
05378
05379
05380
05381
05382 static void lower_io_items ( WN * block, WN * tree, FIOFORMATTYPE form,
05383 WN * iostat, INT32 kid_first, INT32 kid_last )
05384 {
05385 INT32 i;
05386 INT32 j;
05387 INT32 mtype;
05388 INT32 ntype;
05389 INT64 size;
05390 INT64 nelem;
05391 FIOITEMTYPE type;
05392 TY_IDX ty;
05393 TY_IDX ety;
05394 WN *item;
05395 WN *top_label;
05396 WN *cont_label;
05397 WN *start;
05398 WN *step;
05399 WN *end;
05400 WN *load_index;
05401 WN *raddr;
05402 WN *recblk;
05403 ST *pregst;
05404 ST *unit_ptr;
05405 ST *ctrst;
05406 ST *adrst;
05407 PREG_NUM pregnum;
05408 PREG_NUM ctrnum;
05409 PREG_NUM adrnum;
05410 IOITEM io_item;
05411
05412
05413
05414 for (i=kid_first; i<kid_last; i++) {
05415
05416 item = WN_kid(tree,i);
05417 io_item = (IOITEM) WN_intrinsic(item);
05418
05419
05420
05421 if (io_item != IOL_IMPLIED_DO && io_item != IOL_IMPLIED_DO_1TRIP) {
05422 item = extract_calls ( block, item );
05423 if (io_item != IOL_ARRAY)
05424 type = get_FIT_type ( WN_ty(item) );
05425 }
05426
05427
05428
05429 switch (io_item) {
05430
05431 case IOL_ARRAY:
05432 ety = TY_AR_etype(WN_ty(item));
05433 type = get_FIT_type ( ety );
05434 if (type == FIT_RECORD) {
05435 adrst = MTYPE_To_PREG ( Pointer_type );
05436 adrnum = Create_Preg ( Pointer_type, "record_address");
05437 WN_INSERT_BlockLast ( block,
05438 WN_StidIntoPreg ( Pointer_type, adrnum, adrst,
05439 WN_kid0(item) ));
05440 recblk = WN_CreateBlock();
05441 ctrst = MTYPE_To_PREG ( MTYPE_I4 );
05442 ctrnum = Create_Preg ( MTYPE_I4, "record_counter");
05443 size = TY_size(ety);
05444 nelem = TY_size(WN_ty(item)) / size;
05445 WN_INSERT_BlockLast ( block,
05446 WN_CreateDO (
05447 WN_CreateIdname ( ctrnum, ctrst ),
05448 WN_StidIntoPreg ( MTYPE_I4, ctrnum, ctrst,
05449 WN_CreateIntconst ( OPC_I4INTCONST, 1 )),
05450 WN_LE ( MTYPE_I4,
05451 WN_LdidPreg ( MTYPE_I4, ctrnum ),
05452 WN_CreateIntconst ( OPC_I4INTCONST,
05453 nelem )),
05454 WN_StidIntoPreg ( MTYPE_I4, ctrnum, ctrst,
05455 WN_Add ( MTYPE_I4,
05456 WN_LdidPreg ( MTYPE_I4,
05457 ctrnum ),
05458 WN_CreateIntconst ( OPC_I4INTCONST,
05459 (INT64)1 ))),
05460 recblk, NULL ));
05461 raddr = WN_LdidPreg ( Pointer_type, adrnum );
05462 lower_record_items ( recblk, form, iostat, FALSE, ety, raddr,
05463 (INT64)0 );
05464 WN_INSERT_BlockLast ( recblk,
05465 WN_StidIntoPreg ( Pointer_type, adrnum, adrst,
05466 WN_Add ( Pointer_type, raddr,
05467 WN_CreateIntconst ( opc_const, size ))));
05468 WN_DELETE_Tree ( WN_kid1(item) );
05469 } else {
05470 if (mp_io) {
05471 unit_ptr = Get_UnitPointer_ST();
05472 GEN_IO_CALL_3 ( block, fio_item_ops[form][type], iostat, NULL,
05473 WN_kid0(item), WN_kid1(item),
05474 Make_IoAddr_WN(unit_ptr) );
05475 }
05476 else
05477 GEN_IO_CALL_2 ( block, fio_item_ops[form][type], iostat, NULL,
05478 WN_kid0(item), WN_kid1(item) );
05479 }
05480 break;
05481
05482 case IOL_CHAR:
05483 if (mp_io) {
05484 unit_ptr = Get_UnitPointer_ST();
05485 GEN_IO_CALL_4 ( block, fio_item_ops[form][type], iostat, NULL,
05486 WN_kid0(item), WN_kid1(item),
05487 WN_CreateIntconst ( OPC_I4INTCONST, 1 ),
05488 Make_IoAddr_WN(unit_ptr) );
05489 }
05490 else
05491 GEN_IO_CALL_3 ( block, fio_item_ops[form][type], iostat, NULL,
05492 WN_kid0(item), WN_kid1(item),
05493 WN_CreateIntconst ( OPC_I4INTCONST, 1 ) );
05494 break;
05495
05496 case IOL_CHAR_ARRAY:
05497 if (mp_io) {
05498 unit_ptr = Get_UnitPointer_ST();
05499 GEN_IO_CALL_4 ( block, fio_item_ops[form][type], iostat, NULL,
05500 WN_kid0(item), WN_kid1(item),
05501 WN_kid2(item),
05502 Make_IoAddr_WN(unit_ptr) );
05503 }
05504 else
05505 GEN_IO_CALL_3 ( block, fio_item_ops[form][type], iostat, NULL,
05506 WN_kid0(item), WN_kid1(item), WN_kid2(item) );
05507 break;
05508
05509 case IOL_EXPR:
05510 switch (type) {
05511 case FIT_COMPLEX4:
05512 pregst = MTYPE_To_PREG ( MTYPE_C4 );
05513 pregnum = Create_Preg ( MTYPE_C4, "complex_io_item");
05514 WN_INSERT_BlockLast ( block,
05515 WN_StidIntoPreg ( MTYPE_C4, pregnum,
05516 pregst,
05517 WN_kid0(item) ));
05518 if (mp_io) {
05519 unit_ptr = Get_UnitPointer_ST();
05520 GEN_IO_CALL_3 ( block, fio_value_ops[form][type], iostat,
05521 NULL, WN_CreateExp1 ( OPC_F4REALPART,
05522 WN_LdidPreg ( MTYPE_C4, pregnum )),
05523 WN_CreateExp1 ( OPC_F4IMAGPART,
05524 WN_LdidPreg ( MTYPE_C4, pregnum )),
05525 Make_IoAddr_WN(unit_ptr) );
05526 }
05527 else
05528 GEN_IO_CALL_2 ( block, fio_value_ops[form][type], iostat,
05529 NULL, WN_CreateExp1 ( OPC_F4REALPART,
05530 WN_LdidPreg ( MTYPE_C4, pregnum )),
05531 WN_CreateExp1 ( OPC_F4IMAGPART,
05532 WN_LdidPreg ( MTYPE_C4, pregnum )));
05533 break;
05534 case FIT_COMPLEX8:
05535 pregst = MTYPE_To_PREG ( MTYPE_C8 );
05536 pregnum = Create_Preg ( MTYPE_C8, "complex_io_item");
05537
05538 WN_INSERT_BlockLast ( block,
05539 WN_StidIntoPreg ( MTYPE_C8, pregnum,
05540 pregst,
05541 WN_kid0(item) ));
05542 if (mp_io) {
05543 unit_ptr = Get_UnitPointer_ST();
05544 GEN_IO_CALL_3 ( block, fio_value_ops[form][type], iostat,
05545 NULL, WN_CreateExp1 ( OPC_F8REALPART,
05546 WN_LdidPreg ( MTYPE_C8, pregnum )),
05547 WN_CreateExp1 ( OPC_F8IMAGPART,
05548 WN_LdidPreg ( MTYPE_C8, pregnum )),
05549 Make_IoAddr_WN(unit_ptr) );
05550 }
05551 else
05552 GEN_IO_CALL_2 ( block, fio_value_ops[form][type], iostat,
05553 NULL, WN_CreateExp1 ( OPC_F8REALPART,
05554 WN_LdidPreg ( MTYPE_C8, pregnum )),
05555 WN_CreateExp1 ( OPC_F8IMAGPART,
05556 WN_LdidPreg ( MTYPE_C8, pregnum )));
05557 break;
05558 case FIT_COMPLEX16:
05559 pregst = MTYPE_To_PREG ( MTYPE_CQ );
05560 pregnum = Create_Preg ( MTYPE_CQ, "complex_io_item");
05561 WN_INSERT_BlockLast ( block,
05562 WN_StidIntoPreg ( MTYPE_CQ, pregnum,
05563 pregst,
05564 WN_kid0(item) ));
05565 if (mp_io) {
05566 unit_ptr = Get_UnitPointer_ST();
05567 GEN_IO_CALL_3 ( block, fio_value_ops[form][type], iostat,
05568 NULL, WN_CreateExp1 ( OPC_FQREALPART,
05569 WN_LdidPreg ( MTYPE_CQ, pregnum )),
05570 WN_CreateExp1 ( OPC_FQIMAGPART,
05571 WN_LdidPreg ( MTYPE_CQ, pregnum )),
05572 Make_IoAddr_WN(unit_ptr) );
05573 }
05574 else
05575 GEN_IO_CALL_2 ( block, fio_value_ops[form][type], iostat,
05576 NULL, WN_CreateExp1 ( OPC_FQREALPART,
05577 WN_LdidPreg ( MTYPE_CQ, pregnum )),
05578 WN_CreateExp1 ( OPC_FQIMAGPART,
05579 WN_LdidPreg ( MTYPE_CQ, pregnum )));
05580 break;
05581 case FIT_RECORD:
05582 if (WN_operator(WN_kid0(item)) == OPR_LDA) {
05583 lower_record_items ( block, form, iostat, TRUE,
05584 WN_ty(item), WN_kid0(item),
05585 (INT64)WN_offset(WN_kid0(item)) );
05586 WN_Delete ( WN_kid0(item) );
05587 } else if (WN_operator(WN_kid0(item)) == OPR_LDID) {
05588 lower_record_items ( block, form, iostat, FALSE,
05589 WN_ty(item), WN_kid0(item), (INT64)0 );
05590 WN_Delete ( WN_kid0(item) );
05591 } else {
05592 pregst = MTYPE_To_PREG ( Pointer_type );
05593 pregnum = Create_Preg ( Pointer_type, "record_address");
05594
05595 WN_INSERT_BlockLast ( block,
05596 WN_StidIntoPreg ( Pointer_type, pregnum,
05597 pregst,
05598 WN_kid0(item) ));
05599 raddr = WN_LdidPreg ( Pointer_type, pregnum );
05600 lower_record_items ( block, form, iostat, FALSE,
05601 WN_ty(item), raddr, (INT64)0 );
05602 WN_Delete ( raddr );
05603 }
05604 break;
05605 default:
05606 if (mp_io) {
05607 unit_ptr = Get_UnitPointer_ST();
05608 GEN_IO_CALL_2 ( block, fio_value_ops[form][type], iostat,
05609 NULL, WN_kid0(item), Make_IoAddr_WN(unit_ptr) );
05610 }
05611 else
05612 GEN_IO_CALL_1 ( block, fio_value_ops[form][type], iostat,
05613 NULL, WN_kid0(item) );
05614 }
05615 break;
05616
05617 case IOL_IMPLIED_DO:
05618 case IOL_IMPLIED_DO_1TRIP:
05619 top_label = WN_CreateNewLabel();
05620 cont_label = WN_CreateNewLabel();
05621 WN_start(item) = extract_calls ( block, WN_start(item) );
05622 WN_end(item) = extract_calls ( block, WN_end(item) );
05623 WN_step(item) = extract_calls ( block, WN_step(item) );
05624 ty = ST_type(WN_st(WN_index(item)));
05625 if ( TY_kind(ty) != KIND_POINTER ) {
05626 ntype = mtype = TY_mtype(ty);
05627 if (ntype == MTYPE_I1 || ntype == MTYPE_I2)
05628 ntype = MTYPE_I4;
05629 load_index = WN_Ldid ( mtype, WN_idname_offset(WN_index(item)),
05630 WN_st(WN_index(item)), ty );
05631 start = WN_Stid ( mtype, WN_idname_offset(WN_index(item)),
05632 WN_st(WN_index(item)), ty, WN_start(item) );
05633 step = WN_Stid ( mtype, WN_idname_offset(WN_index(item)),
05634 WN_st(WN_index(item)), ty,
05635 WN_CreateExp2 ( OPCODE_make_op ( OPR_ADD, ntype,
05636 MTYPE_V ),
05637 WN_COPY_Tree ( load_index ),
05638 WN_step(item) ));
05639 } else {
05640 ntype = mtype = TY_mtype(TY_pointed(ty));
05641 if (ntype == MTYPE_I1 || ntype == MTYPE_I2)
05642 ntype = MTYPE_I4;
05643 load_index = WN_Iload ( mtype, 0, TY_pointed(ty),
05644 WN_Ldid ( Pointer_type,
05645 WN_idname_offset(WN_index(item)),
05646 WN_st(WN_index(item)), ty ));
05647 start = WN_Istore ( mtype, 0, ty,
05648 WN_Ldid ( Pointer_type,
05649 WN_idname_offset(WN_index(item)),
05650 WN_st(WN_index(item)), ty ),
05651 WN_start(item) );
05652 step = WN_Istore ( mtype, 0, ty,
05653 WN_Ldid ( Pointer_type,
05654 WN_idname_offset(WN_index(item)),
05655 WN_st(WN_index(item)), ty ),
05656 WN_CreateExp2 ( OPCODE_make_op ( OPR_ADD, ntype,
05657 MTYPE_V ),
05658 WN_COPY_Tree ( load_index ),
05659 WN_step(item) ));
05660 }
05661 if ( WN_operator(WN_step(item)) == OPR_INTCONST ||
05662 WN_operator(WN_step(item)) == OPR_CONST ) {
05663 if ( ( WN_operator(WN_step(item)) == OPR_INTCONST &&
05664 WN_const_val(WN_step(item)) >= 0 ) ||
05665 ( WN_operator(WN_step(item)) == OPR_CONST &&
05666 STC_val(WN_st(WN_step(item))).vals.ival.v0 >= 0 ) )
05667 end = WN_LE ( ntype, load_index, WN_end(item) );
05668 else
05669 end = WN_GE ( ntype, load_index, WN_end(item) );
05670 } else {
05671 pregst = MTYPE_To_PREG ( Boolean_type );
05672 pregnum = Create_Preg ( Boolean_type, "stoptemp");
05673 WN_INSERT_BlockLast ( block,
05674 WN_StidIntoPreg ( Boolean_type, pregnum,
05675 pregst,
05676 WN_GE ( ntype,
05677 WN_COPY_Tree ( WN_step(item) ),
05678 WN_Zerocon ( ntype ))));
05679 end = WN_Select ( Boolean_type,
05680 WN_LdidPreg ( Boolean_type, pregnum ),
05681 WN_LE ( ntype, load_index, WN_end(item) ),
05682 WN_GE ( ntype, WN_COPY_Tree (load_index),
05683 WN_COPY_Tree (WN_end(item)) ));
05684 }
05685 WN_INSERT_BlockLast ( block, start );
05686
05687
05688
05689
05690
05691
05692
05693
05694
05695
05696
05697
05698
05699
05700
05701
05702
05703
05704
05705
05706
05707
05708
05709
05710
05711
05712
05713
05714
05715
05716
05717
05718
05719
05720
05721
05722
05723 if (io_item == IOL_IMPLIED_DO && WN_kid_count(item) == 5
05724 && Implied_Do_Io_Opt && (WN_io_item(WN_kid(item,4)) != IOL_CHAR))
05725 {
05726 WN *arr_item, *kid0;
05727 WN *index1;
05728 mINT32 base_offset;
05729 mINT32 ndim;
05730 TY_IDX arr_type;
05731 WN *top_level_wn;
05732
05733 top_level_wn = WN_kid0(WN_kid(item,4));
05734
05735 if ( WN_operator(top_level_wn) != OPR_ILOAD )
05736 arr_item = top_level_wn;
05737 else if (WN_rtype(top_level_wn) != WN_desc(top_level_wn)) {
05738
05739
05740
05741
05742 goto no_optimize;
05743 } else {
05744
05745 arr_item = WN_kid0(top_level_wn);
05746 }
05747
05748 if (WN_operator_is(arr_item, OPR_ARRAY)
05749 && (((WN_operator_is((kid0= WN_kid0(arr_item)), OPR_LDA))
05750 && (TY_kind ( WN_type (kid0)) == KIND_ARRAY)
05751 && (TY_kind ( TY_AR_etype( WN_type(kid0))) !=
05752 KIND_STRUCT))
05753 || (WN_operator_is(kid0, OPR_LDID)
05754 && (TY_kind ( WN_type_pointed(kid0)) == KIND_ARRAY)
05755 && (TY_kind ( TY_AR_etype( WN_type_pointed(kid0))) !=
05756 KIND_STRUCT)))
05757 && WN_kid_count( arr_item ) == WN_num_dim( arr_item )*2+1)
05758 {
05759 ndim = WN_num_dim( arr_item );
05760 for (j = ndim + 1; j < ndim*2; j++) {
05761 if (search_implied_do_index( WN_kid( arr_item, j ),
05762 WN_st(WN_index(item))))
05763 goto no_optimize;
05764 }
05765
05766
05767
05768 index1 = WN_kid( arr_item, ndim*2 );
05769 if (WN_kid_count( index1 ) == 0
05770 && WN_operator( index1 ) == OPR_LDID
05771 && WN_st( index1 ) == WN_st(WN_index(item))) {
05772 base_offset = 0;
05773 } else if (WN_kid_count( index1 ) == 2 &&
05774 WN_kid_count( WN_kid0( index1 ) ) == 0
05775 && WN_operator( WN_kid0(index1) ) == OPR_LDID
05776 && WN_st( WN_kid0(index1) ) == WN_st(WN_index(item))
05777 && WN_operator( WN_kid1( index1 ) ) == OPR_INTCONST
05778 && (WN_operator( index1 ) == OPR_SUB
05779 || WN_operator( index1 ) == OPR_ADD))
05780 if (WN_operator( index1 ) == OPR_SUB)
05781 base_offset = WN_const_val( WN_kid1( index1 ) );
05782 else
05783 base_offset = -WN_const_val( WN_kid1( index1 ) );
05784 else
05785 goto no_optimize;
05786
05787
05788
05789
05790
05791
05792 arr_type = TY_pointed( WN_ty( WN_kid0( arr_item ) ) );
05793 if (TY_AR_const_lbnd(Ty_Table [arr_type],0)
05794 && TY_AR_lbnd_val(Ty_Table [arr_type],0) == base_offset) {
05795
05796
05797
05798 if (WN_kid_count( WN_kid(arr_item, ndim*2) ) == 0) {
05799 WN_Delete ( WN_kid(arr_item, ndim*2) );
05800 WN_kid(arr_item, ndim*2) =
05801 WN_CreateIntconst ( OPC_I4INTCONST, 1 );
05802 } else {
05803 WN_Delete ( WN_kid0(WN_kid(arr_item, ndim*2)) );
05804 WN_kid0(WN_kid(arr_item, ndim*2)) =
05805 WN_CreateIntconst ( OPC_I4INTCONST, 1 );
05806 }
05807
05808 io_item = (IOITEM) WN_intrinsic(arr_item);
05809 type = get_FIT_type( TY_AR_etype(arr_type) );
05810
05811 if (mp_io) {
05812 unit_ptr = Get_UnitPointer_ST();
05813 Gen_Impld_Io_Calls( block, form, type,
05814 iostat, item, arr_item, Make_IoAddr_WN(unit_ptr) );
05815 }
05816 else
05817 Gen_Impld_Io_Calls( block, form, type,
05818 iostat, item, arr_item, NULL );
05819 break;
05820
05821
05822
05823 }
05824 }
05825 }
05826
05827 no_optimize:
05828 if ( io_item == IOL_IMPLIED_DO )
05829 WN_INSERT_BlockLast ( block, WN_CreateGoto ( (ST_IDX) NULL,
05830 WN_label_number(cont_label) ));
05831 WN_INSERT_BlockLast ( block, top_label );
05832 lower_io_items ( block, item, form, iostat, 4, WN_kid_count(item) );
05833 WN_INSERT_BlockLast ( block, step );
05834 WN_INSERT_BlockLast ( block, cont_label );
05835 WN_INSERT_BlockLast ( block,
05836 WN_CreateTruebr ( WN_label_number(top_label),
05837 end ));
05838 break;
05839
05840 case IOL_LOGICAL:
05841 if (mp_io) {
05842 unit_ptr = Get_UnitPointer_ST();
05843 GEN_IO_CALL_2 ( block, fio_value_ops[form][type], iostat, NULL,
05844 WN_kid0(item), Make_IoAddr_WN(unit_ptr) );
05845 }
05846 else
05847 GEN_IO_CALL_1 ( block, fio_value_ops[form][type], iostat, NULL,
05848 WN_kid0(item) );
05849 break;
05850
05851 case IOL_VAR:
05852 if (type == FIT_RECORD) {
05853 if (WN_operator(WN_kid0(item)) == OPR_LDA) {
05854 lower_record_items ( block, form, iostat, TRUE,
05855 WN_ty(item), WN_kid0(item),
05856 (INT64)WN_offset(WN_kid0(item)) );
05857 WN_Delete ( WN_kid0(item) );
05858 } else if (WN_operator(WN_kid0(item)) == OPR_LDID) {
05859 lower_record_items ( block, form, iostat, FALSE,
05860 WN_ty(item), WN_kid0(item), (INT64)0 );
05861 WN_Delete ( WN_kid0(item) );
05862 } else {
05863 pregst = MTYPE_To_PREG ( Pointer_type );
05864 pregnum = Create_Preg ( Pointer_type, "record_addr");
05865 WN_INSERT_BlockLast ( block,
05866 WN_StidIntoPreg ( Pointer_type, pregnum,
05867 pregst,
05868 WN_kid0(item) ));
05869 raddr = WN_LdidPreg ( Pointer_type, pregnum );
05870 lower_record_items ( block, form, iostat, FALSE,
05871 WN_ty(item), raddr, (INT64)0 );
05872 WN_Delete ( raddr );
05873 }
05874 } else {
05875 if (mp_io) {
05876 unit_ptr = Get_UnitPointer_ST();
05877 GEN_IO_CALL_3 ( block, fio_item_ops[form][type], iostat, NULL,
05878 WN_kid0(item),
05879 WN_CreateIntconst ( OPC_I4INTCONST, 1 ),
05880 Make_IoAddr_WN(unit_ptr) );
05881 }
05882 else
05883 GEN_IO_CALL_2 ( block, fio_item_ops[form][type], iostat, NULL,
05884 WN_kid0(item),
05885 WN_CreateIntconst ( OPC_I4INTCONST, 1 ) );
05886 }
05887 break;
05888 }
05889
05890
05891
05892
05893 WN_Delete ( item );
05894
05895 }
05896
05897 }
05898
05899
05900
05901
05902
05903
05904
05905
05906
05907 extern INT32
05908 Cray_Type_From_TY(TY_IDX typ)
05909 {
05910 TYPE_ID ty;
05911
05912 ty = TY_mtype( typ );
05913 switch (ty) {
05914 case MTYPE_U1:
05915 case MTYPE_I1:
05916 return ((Type_is_logical(typ)) ? 0x5300801 : 0x2300801);
05917
05918 case MTYPE_U2:
05919 case MTYPE_I2:
05920 return ((Type_is_logical(typ)) ? 0x5301002 : 0x2301002);
05921
05922 case MTYPE_U4:
05923 case MTYPE_I4: return ((Type_is_logical(typ)) ? 0x5302004 : 0x2302004);
05924
05925 case MTYPE_U8:
05926 case MTYPE_I8: return ((Type_is_logical(typ)) ? 0x5304008 : 0x2304008);
05927
05928 case MTYPE_F4: return (0x3302004);
05929 case MTYPE_F8: return (0x3304008);
05930 case MTYPE_FQ: return (0x3308010);
05931 case MTYPE_C4: return (0x4304004);
05932 case MTYPE_C8: return (0x4308008);
05933 case MTYPE_CQ: return (0x4310010);
05934 }
05935 DevAssert(0,("Do not know what to do with type"));
05936
05937 return(0);
05938 }
05939
05940
05941 static INT32
05942 Dv_Type_From_TY(TY_IDX typ)
05943 {
05944 TYPE_ID ty;
05945
05946 ty = TY_mtype( typ );
05947 #define DVTYPE_UNUSED 0
05948 #define DVTYPE_TYPELESS 1
05949 #define DVTYPE_INTEGER 2
05950 #define DVTYPE_REAL 3
05951 #define DVTYPE_COMPLEX 4
05952 #define DVTYPE_LOGICAL 5
05953 #define DVTYPE_ASCII 6
05954 #define DVTYPE_DERIVEDBYTE 7
05955 #define DVTYPE_DERIVEDWORD 8
05956
05957 if (MTYPE_is_integral(ty))
05958 return( (Type_is_logical(typ)) ? DVTYPE_LOGICAL : DVTYPE_INTEGER );
05959 else if (MTYPE_is_unsigned(ty))
05960 return( DVTYPE_LOGICAL );
05961 else if (MTYPE_is_complex(ty))
05962 return( DVTYPE_COMPLEX );
05963 else if (MTYPE_is_float(ty))
05964 return( DVTYPE_REAL );
05965 else if (MTYPE_is_str(ty))
05966 return( DVTYPE_ASCII );
05967 else if (MTYPE_is_pointer(ty))
05968 return( DVTYPE_DERIVEDWORD );
05969 else
05970 DevAssert(0,("Unknown type in Dv_Type_From_TY"));
05971
05972 return 0;
05973 }
05974
05975
05976 static WN *
05977 Create_Dope_From_IoItem( WN *block, WN *item )
05978 {
05979
05980
05981
05982
05983
05984
05985 INT64 info_word;
05986 ST *st;
05987
05988 st = Get_IoStruct_ST ( block, FID_CRAY_DOPEVEC, FALSE );
05989
05990
05991
05992 Gen_Iolist_PutAddrWN( block, st,
05993 FIO_OFFSET(FCR_DV_BASE_PTR),
05994 FIO_TYPE(FCR_DV_BASE_PTR),
05995 WN_kid0(item) );
05996
05997
05998 Gen_Iolist_PutFieldWN( block, st,
05999 FIO_OFFSET(FCR_DV_BASE_LEN),
06000 FIO_TYPE(FCR_DV_BASE_LEN),
06001 WN_COPY_Tree(WN_kid1(item)) );
06002
06003
06004
06005 {
06006
06007
06008
06009
06010
06011
06012
06013
06014 UINT64 assoc = 1;
06015 UINT64 a_contig = 1;
06016 dope_header_type *dh_ptr;
06017
06018 a_contig = 1;
06019
06020 info_word = 0;
06021 if (Target_Byte_Sex == LITTLE_ENDIAN) {
06022 dh_ptr = (dope_header_type *)&info_word;
06023
06024 dh_ptr->assoc = assoc;
06025 dh_ptr->a_contig = a_contig;
06026 dh_ptr->n_dim = 1;
06027 } else {
06028 info_word = assoc << 63 | a_contig << 59 | 1;
06029 }
06030 Gen_Iolist_PutFieldConst( block, st,
06031 FIO_OFFSET(FCR_DV_FLAG_INFO),
06032 FIO_TYPE(FCR_DV_FLAG_INFO), info_word);
06033 }
06034
06035
06036 {
06037
06038
06039 UINT64 type;
06040 UINT64 f90type_t_word;
06041 UINT64 int_len;
06042
06043 f90_type_t *f90_type_ptr;
06044
06045 f90type_t_word = 0;
06046
06047 type = 6;
06048 int_len = 8;
06049
06050 if (Target_Byte_Sex == LITTLE_ENDIAN) {
06051 f90_type_ptr = (f90_type_t *)&f90type_t_word;
06052 f90_type_ptr->type = type;
06053 f90_type_ptr->int_len = int_len;
06054 } else {
06055 f90type_t_word = (type << 24)
06056 | (int_len << 8);
06057 }
06058 Gen_Iolist_PutFieldConst( block, st,
06059 FIO_OFFSET(FCR_DV_TYPE_LEN),
06060 FIO_TYPE(FCR_DV_TYPE_LEN), f90type_t_word);
06061 }
06062
06063
06064 Gen_Iolist_PutFieldConst( block, st, FIO_OFFSET(FCR_DV_ORIG_BASE),
06065 FIO_TYPE(FCR_DV_ORIG_BASE), 0);
06066 Gen_Iolist_PutFieldConst( block, st, FIO_OFFSET(FCR_DV_ORIG_SIZE),
06067 FIO_TYPE(FCR_DV_ORIG_SIZE), 0);
06068
06069
06070 Gen_Iolist_PutFieldConst( block, st, FIO_OFFSET(FCR_DV_DIM1_LB),
06071 FIO_TYPE(FCR_DV_DIM1_LB), (INT64) 1 );
06072 Gen_Iolist_PutFieldWN( block, st, FIO_OFFSET(FCR_DV_DIM1_EXTENT),
06073 FIO_TYPE(FCR_DV_DIM1_EXTENT), WN_kid2(item) );
06074 Gen_Iolist_PutFieldWN( block, st, FIO_OFFSET(FCR_DV_DIM1_STRIDE),
06075 FIO_TYPE(FCR_DV_DIM1_STRIDE), WN_kid1(item));
06076
06077 return( Make_IoAddr_WN( st ) );
06078 }
06079
06080
06081 static WN *
06082 Create_DopeVector_WN( WN *block, WN *arr_item, TY_IDX ity, TY_IDX ety, BOOL impl_do )
06083
06084
06085
06086
06087
06088
06089
06090
06091
06092
06093
06094
06095 {
06096 WN *wn, *ewn = NULL, *pe_wn = NULL;
06097 WN *kid0;
06098 ST *st;
06099 INT64 info_word;
06100 INT64 pe_const;
06101 INT32 ndims, i;
06102 INT32 const_stride;
06103 INT32 char_length;
06104 UINT64 dec_len, elen;
06105
06106
06107
06108
06109
06110
06111 st = Get_IoStruct_ST ( block, FID_CRAY_DOPEVEC, FALSE );
06112
06113 if (TY_kind(ity) != KIND_ARRAY)
06114 DevAssert(0,("Expecting array kind in Create_DopeVector_WN"));
06115
06116 kid0 = WN_kid0( arr_item );
06117 dec_len = TY_size( ety );
06118
06119
06120
06121
06122
06123
06124 Gen_Iolist_PutAddrWN( block, st,
06125 FIO_OFFSET(FCR_DV_BASE_PTR),
06126 FIO_TYPE(FCR_DV_BASE_PTR),
06127 impl_do ? arr_item : kid0 );
06128
06129
06130 if (TY_is_character( Ty_Table [ity] )) {
06131 char_length = TY_size( Ty_Table [ity] );
06132 if (char_length != 0) {
06133 Gen_Iolist_PutFieldConst( block, st,
06134 FIO_OFFSET(FCR_DV_BASE_LEN),
06135 FIO_TYPE(FCR_DV_BASE_LEN),
06136 char_length );
06137 } else {
06138
06139 Is_True((WN_operator(arr_item)==OPR_IO_ITEM && WN_io_item(arr_item)==IOL_CHAR_ARRAY),
06140 ("Bad character I/O item"));
06141 Gen_Iolist_PutFieldWN( block, st,
06142 FIO_OFFSET(FCR_DV_BASE_LEN),
06143 FIO_TYPE(FCR_DV_BASE_LEN),
06144 WN_COPY_Tree(WN_kid1(arr_item)));
06145 }
06146
06147 } else {
06148 INT64 elen = WN_element_size( arr_item );
06149 Gen_Iolist_PutFieldConst( block, st,
06150 FIO_OFFSET(FCR_DV_BASE_LEN),
06151 FIO_TYPE(FCR_DV_BASE_LEN),
06152 elen * 8);
06153 }
06154
06155
06156
06157 ndims = TY_AR_ndims (ity);
06158
06159 {
06160
06161
06162
06163
06164
06165
06166
06167
06168 UINT64 assoc = 1;
06169 UINT64 a_contig;
06170
06171 dope_header_type *dh_ptr;
06172
06173 info_word = 0;
06174
06175 a_contig = (impl_do) ? 0 : 1;
06176
06177 if (Target_Byte_Sex == LITTLE_ENDIAN) {
06178 dh_ptr = (dope_header_type *)&info_word;
06179 dh_ptr->assoc = assoc;
06180 dh_ptr->a_contig = a_contig;
06181 dh_ptr->n_dim = ndims;
06182 if (TY_pointer( ity ))
06183 dh_ptr->ptr_alloc = 1;
06184 } else {
06185 info_word = assoc << 63 | a_contig << 59 | ndims;
06186
06187 if (TY_pointer( ity ))
06188 info_word |= (UINT64) 1 << 62;
06189 }
06190
06191
06192 Gen_Iolist_PutFieldConst( block, st,
06193 FIO_OFFSET(FCR_DV_FLAG_INFO),
06194 FIO_TYPE(FCR_DV_FLAG_INFO), info_word);
06195 }
06196
06197
06198 {
06199
06200
06201 UINT64 type;
06202 UINT64 dpflag = 0;
06203 UINT64 kind_of_star = 3;
06204 UINT64 int_len = TY_size( ety )*8;
06205 UINT64 f90type_t_word;
06206
06207 f90_type_t *f90_type_ptr;
06208 f90type_t_word = 0;
06209
06210 if (TY_is_character( ity )) {
06211 kind_of_star = 0;
06212 dec_len = 0;
06213 }
06214 type = (TY_is_character( ity )) ? 6 : Dv_Type_From_TY(ety);
06215 int_len = TY_size( ety )*8;
06216 if (Target_Byte_Sex == LITTLE_ENDIAN) {
06217 f90_type_ptr = (f90_type_t *)&f90type_t_word;
06218 f90_type_ptr->type = type;
06219 f90_type_ptr->dpflag = dpflag;
06220 f90_type_ptr->kind_or_star = kind_of_star;
06221 f90_type_ptr->int_len = int_len;
06222 f90_type_ptr->dec_len = dec_len;
06223 } else {
06224 f90type_t_word = (type << 24)
06225 | (dpflag << 23)
06226 | (kind_of_star << 20)
06227 | (int_len << 8)
06228 | dec_len;
06229 }
06230 Gen_Iolist_PutFieldConst( block, st,
06231 FIO_OFFSET(FCR_DV_TYPE_LEN),
06232 FIO_TYPE(FCR_DV_TYPE_LEN), f90type_t_word);
06233 }
06234
06235
06236 Gen_Iolist_PutFieldConst( block, st, FIO_OFFSET(FCR_DV_ORIG_BASE),
06237 FIO_TYPE(FCR_DV_ORIG_BASE), 0);
06238 Gen_Iolist_PutFieldConst( block, st, FIO_OFFSET(FCR_DV_ORIG_SIZE),
06239 FIO_TYPE(FCR_DV_ORIG_SIZE), 0);
06240
06241
06242 const_stride = 1;
06243 elen = TY_size( TY_AR_etype( ity ) );
06244 for (i=0; i<ndims; i++) {
06245 ARB_HANDLE bnds = TY_arb(ity)[ndims -i - 1];
06246
06247 Gen_Iolist_PutFieldConst( block, st, FIO_OFFSET(FCR_DV_DIM1_LB+i*3),
06248 FIO_TYPE(FCR_DV_DIM1_LB), (INT64) 1 );
06249
06250
06251 if (i == 0)
06252 ewn = WN_CreateIntconst( OPC_I8INTCONST, (elen > 4) ? elen / 4 : 1 );
06253 else if (const_stride)
06254 WN_const_val(ewn) *= pe_const;
06255 else
06256 ewn = WN_Mpy( MTYPE_I8, ewn, WN_COPY_Tree(pe_wn) );
06257
06258 if (TY_is_character( ity )) {
06259
06260 if (WN_operator_is(WN_kid2(arr_item),OPR_INTCONST))
06261 Gen_Iolist_PutFieldConst( block, st, FIO_OFFSET(FCR_DV_DIM1_EXTENT+i*3),
06262 FIO_TYPE(FCR_DV_DIM1_EXTENT), WN_const_val(WN_kid2(arr_item)) );
06263 else
06264 Gen_Iolist_PutFieldWN( block, st, FIO_OFFSET(FCR_DV_DIM1_EXTENT+i*3),
06265 FIO_TYPE(FCR_DV_DIM1_EXTENT), WN_COPY_Tree(WN_kid2(arr_item) ));
06266 } else if (ARB_const_ubnd( bnds ) && ARB_const_lbnd( bnds )) {
06267 pe_const = ARB_ubnd_val( bnds ) - ARB_lbnd_val( bnds ) + 1;
06268 if (!const_stride)
06269 pe_wn = WN_CreateIntconst( OPC_I8INTCONST, pe_const );
06270 Gen_Iolist_PutFieldConst( block, st, FIO_OFFSET(FCR_DV_DIM1_EXTENT+i*3),
06271 FIO_TYPE(FCR_DV_DIM1_EXTENT),
06272 impl_do ? (UINT64) 1 : pe_const );
06273 } else {
06274 const_stride = 0;
06275 pe_wn = WN_Add( MTYPE_I8,
06276 WN_Sub( MTYPE_I8, Get_ARB_WN(bnds,ARB_UBOUND),Get_ARB_WN(bnds, ARB_LBOUND)),
06277 WN_Intconst( MTYPE_I8,1));
06278 if (impl_do)
06279 Gen_Iolist_PutFieldConst( block, st, FIO_OFFSET(FCR_DV_DIM1_EXTENT+i*3),
06280 FIO_TYPE(FCR_DV_DIM1_EXTENT), (UINT64) 1 );
06281 else
06282 Gen_Iolist_PutFieldWN( block, st, FIO_OFFSET(FCR_DV_DIM1_EXTENT+i*3),
06283 FIO_TYPE(FCR_DV_DIM1_EXTENT), WN_COPY_Tree(pe_wn) );
06284 }
06285
06286
06287 if (const_stride)
06288 Gen_Iolist_PutFieldConst( block, st, FIO_OFFSET(FCR_DV_DIM1_STRIDE+i*3),
06289 FIO_TYPE(FCR_DV_DIM1_STRIDE),
06290 (TY_is_character( ity ))
06291 ? WN_const_val( ewn ) * char_length
06292 : WN_const_val( ewn ) );
06293 else {
06294 Gen_Iolist_PutFieldWN( block, st, FIO_OFFSET(FCR_DV_DIM1_STRIDE+i*3),
06295 FIO_TYPE(FCR_DV_DIM1_STRIDE), WN_COPY_Tree(ewn) );
06296 }
06297 }
06298 WN_Delete( ewn );
06299 if (pe_wn)
06300 WN_Delete( pe_wn );
06301
06302 wn = Make_IoAddr_WN( st );
06303 return( wn );
06304 }
06305
06306
06307 static WN *
06308 Replace_Impl_Idx( WN *expr )
06309
06310
06311
06312
06313
06314
06315
06316
06317
06318
06319
06320
06321 {
06322 WN * kid;
06323 INT32 i;
06324 static BOOL replaced = 0;
06325
06326
06327 if (WNOPR(expr) == OPR_TRIPLET) {
06328
06329 return( Replace_Impl_Idx( WN_kid0(expr) ) );
06330 } else if (WNOPR(expr) == OPR_LDID) {
06331 ST *idx_st = WN_st( expr );
06332 for (i = 0; i < num_impl; i++) {
06333 if (idx_st == impl_idx[i]) {
06334 replaced = 0;
06335 return( expr );
06336 }
06337 }
06338 return( NULL );
06339 } else if (WN_operator_is(expr,OPR_CONST) ||
06340 WN_operator_is(expr,OPR_INTCONST)) {
06341 return NULL;
06342 } else if ( WN_operator_is(expr,OPR_ADD) || WN_operator_is(expr,OPR_SUB)) {
06343 if (kid = Replace_Impl_Idx(WN_kid0(expr))) {
06344 if (!replaced) {
06345 WN_kid0(expr) = WN_CreateIntconst ( OPC_I4INTCONST, 1 );
06346 replaced = 1;
06347 }
06348 return( kid );
06349 }
06350 if (kid = Replace_Impl_Idx(WN_kid1(expr))) {
06351 if (!replaced) {
06352 WN_kid1(expr) = WN_CreateIntconst ( OPC_I4INTCONST, 1 );
06353 replaced = 1;
06354 }
06355 return( kid );
06356 }
06357 }
06358 else {
06359 return( NULL );
06360 }
06361 return( NULL );
06362 }
06363
06364
06365 static void
06366 Make_Cray_Io_Call( WN *block, FIOOPER form, WN *iostat1, WN *iostat2,
06367 WN *cilist_wn, WN *stack_wn,
06368 ST *iolist_st, UINT64 word)
06369 {
06370 WN *iolist_wn;
06371 Gen_Iolist_PutFieldConst (block, iolist_st, 0, MTYPE_U8, word);
06372 iolist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(iolist_st)),
06373 iolist_st);
06374 if (first_last & 1) {
06375 GEN_IO_CALL_3 ( block, form, WN_COPY_Tree(iostat1), WN_COPY_Tree(iostat2),
06376 WN_COPY_Tree(cilist_wn), iolist_wn, WN_COPY_Tree(stack_wn));
06377 } else {
06378 GEN_IO_CALL_3 ( block, form, WN_COPY_Tree(iostat1), NULL,
06379 WN_COPY_Tree(cilist_wn), iolist_wn, WN_COPY_Tree(stack_wn));
06380
06381 }
06382 first_last = 0;
06383 }
06384
06385
06386 static void
06387 Create_Null_Call( WN *block, FIOOPER form, WN *cilist_wn,
06388 WN *iostat1, WN *iostat2,
06389 WN *stack_wn )
06390
06391
06392
06393
06394
06395
06396
06397
06398 {
06399 UINT64 word;
06400 static ST *null_iolist_st;
06401 static TY_IDX null_iolist_ty_idx;
06402 static PU *null_iolist_current_pu = NULL;
06403 iolist_header_type *io_header_ptr;
06404
06405 if (null_iolist_current_pu != Current_pu) {
06406 null_iolist_current_pu = Current_pu;
06407
06408 Make_IoStruct_TY ( FID_CRAY_IOLIST );
06409 null_iolist_ty_idx = fiostruct_ty[FID_CRAY_IOLIST];
06410 TY& null_iolist_ty = Ty_Table [null_iolist_ty_idx];
06411 Set_TY_size(null_iolist_ty, 8);
06412
06413 null_iolist_st = New_ST ();
06414 ST_Init (null_iolist_st,
06415 Save_Str ( fiostructid_info[FID_CRAY_IOLIST].name_local ),
06416 CLASS_VAR, SCLASS_AUTO, EXPORT_LOCAL, null_iolist_ty_idx);
06417 io_set_addr_passed_flag(null_iolist_st);
06418 }
06419
06420 word = 0;
06421 if (Target_Byte_Sex == LITTLE_ENDIAN) {
06422 io_header_ptr = (iolist_header_type *)&word;
06423 io_header_ptr->version = 1;
06424 io_header_ptr->iolfirst = (first_last == 2 || first_last == 3) ? 1 : 0;
06425 io_header_ptr->iollast = (first_last == 1 || first_last == 3) ? 1 : 0;
06426 io_header_ptr->ioetsize = 8 / Pointer_Size;
06427 } else {
06428
06429 word = ( (UINT64) 1 << 61) |
06430 ( (UINT64) first_last << 32) |
06431 ( (UINT64) 8 / Pointer_Size );
06432
06433 }
06434 Make_Cray_Io_Call( block, form, iostat1, iostat2, cilist_wn, stack_wn,
06435 null_iolist_st, word);
06436 }
06437
06438 static void
06439 make_dope_vector_ty(int ndims_on_entry) {
06440 TY_IDX ty_idx;
06441 INT32 i;
06442 FIOSTRUCTID id = FID_IOARRAY_ENTRY;
06443 FIOSTRUCT first = fiostructid_info[id].first;
06444 FIOSTRUCT last = fiostructid_info[id].last;
06445 int ndims = ndims_on_entry;
06446
06447
06448
06449 TY& ty = New_TY(ty_idx);
06450 TY_Init (ty,FIO_SIZE(FID_IOARRAY_ENTRY) + Pointer_Size *ndims,
06451 KIND_STRUCT, MTYPE_M, Save_Str ( fiostructid_info[id].name ));
06452
06453 Set_TY_align(ty_idx, MTYPE_align_req(Pointer_type));
06454
06455 for (i=first; i<=last; i++) {
06456 FLD_HANDLE fld = New_FLD ();
06457
06458 if (i == first) Set_TY_fld(ty,fld);
06459
06460 if (Pointer_Size == 4) {
06461 FLD_Init(fld, Save_Str ( fiostruct_info[i].name ),
06462 Be_Type_Tbl ( fiostruct_info[i].type32 ),
06463 fiostruct_info[i].offset32);
06464 } else {
06465 FLD_Init(fld, Save_Str ( fiostruct_info[i].name ),
06466 Be_Type_Tbl ( fiostruct_info[i].type64 ),
06467 fiostruct_info[i].offset64);
06468 }
06469 if (i == last && ndims == 0)
06470 Set_FLD_last_field(fld);
06471 }
06472
06473
06474
06475
06476
06477
06478 while (ndims > 0) {
06479 FLD_HANDLE fld = New_FLD();
06480 if (Pointer_Size == 4) {
06481 FLD_Init(fld, Save_Str ( fiostruct_info[i].name ),
06482 Be_Type_Tbl ( fiostruct_info[i].type32 ),
06483 fiostruct_info[i].offset32);
06484 } else {
06485 FLD_Init(fld, Save_Str ( fiostruct_info[i].name ),
06486 Be_Type_Tbl ( fiostruct_info[i].type64 ),
06487 fiostruct_info[i].offset64);
06488 }
06489 i++;
06490 ndims--;
06491 if (ndims == 0) Set_FLD_last_field(fld);
06492 }
06493
06494
06495
06496
06497 dope_vector_ty[ ndims_on_entry ] = ty_idx;
06498
06499 }
06500
06501 static void
06502 Add_To_Iolist( FIOSTRUCTID id, FLD_HANDLE& last_field, INT32 *offset, INT32 ndims )
06503 {
06504 TY_IDX ty_idx;
06505
06506 if (id == FID_IOARRAY_ENTRY) {
06507 if (!dope_vector_ty[ ndims ]) {
06508 Fail_FmtAssertion ("dope_vector_ty not made yet: Add_To_Iolist");
06509 } else {
06510 ty_idx = dope_vector_ty[ ndims ];
06511
06512 }
06513 } else if (!fiostruct_ty[id]) {
06514 Make_IoStruct_TY ( id );
06515 ty_idx = fiostruct_ty[id];
06516 }
06517 else {
06518 ty_idx = fiostruct_ty[id];
06519 }
06520
06521
06522 FLD_HANDLE fld = New_FLD();
06523 FLD_Init (fld, Save_Str(fiostructid_info[id].name_local),
06524 ty_idx, *offset);
06525
06526 *offset += FIO_SIZE(id) + ndims * Pointer_Size;
06527 last_field = fld;
06528 }
06529
06530
06531 static INT32
06532 Create_Io_Entry ( WN *block, WN * item, WN *cilist_wn, WN *stack_wn,
06533 WN *iostat1, WN *iostat2,
06534 FIOOPER form, ST **iolist_st, TY_IDX *iolist_ty,
06535 INT32 *iolist_size,
06536 FLD_HANDLE& last_field, INT32 *offset, INT32 *icount,
06537 INT32 nested, BOOL need_loop)
06538
06539
06540
06541
06542
06543
06544
06545
06546
06547
06548
06549
06550
06551
06552
06553
06554
06555
06556
06557
06558
06559
06560
06561 {
06562 TY_IDX ty;
06563 INT32 ioentsize, i, j;
06564 #ifdef TEST_DOPE
06565 INT32 impldosize;
06566 #endif
06567 INT32 val_type, cray_type = 0;
06568 INT32 header_offset;
06569 IOITEM io_item;
06570 WN *kid0, *wn;
06571 ST *arr_dims[MAX_DIM];
06572 TY_IDX aty;
06573 UINT64 word1, word2;
06574 WN *new_item;
06575 INT32 ndims;
06576 BOOL impl_do_arr = FALSE;
06577 BOOL struct_array = FALSE;
06578 BOOL read_mode;
06579 UINT64 word;
06580 INT32 nkids;
06581 ioentry_header_type *ioentry_header_ptr;
06582 ioarray_entry_type *ioentry_array_ptr;
06583 iolist_header_type *io_header_ptr;
06584
06585 kid0 = WN_kid0( item );
06586 ty = WN_ty( item );
06587 io_item = (IOITEM) WN_intrinsic(item);
06588
06589 switch (io_item) {
06590 case IOL_CHAR_ARRAY:
06591
06592 new_item = Create_DopeVector_WN( block, item, ty, TY_AR_etype(ty), FALSE );
06593 WN_Delete( item );
06594 item = new_item;
06595 kid0 = NULL;
06596 ty = WN_ty( item );
06597 val_type = 2;
06598 ioentsize = (Pointer_Size == 4) ? 5 : 3;
06599 break;
06600
06601 case IOL_ARRAY:
06602 if (TY_kind(TY_AR_etype(ty)) == KIND_STRUCT) {
06603
06604
06605 val_type = 3;
06606 ioentsize = (Pointer_Size == 4) ? 6 : 5;
06607 #ifdef TEST_DOPE
06608 impldosize = (Pointer_Size == 4) ? 6 : 5;
06609 #endif
06610 struct_array = TRUE;
06611 break;
06612 }
06613
06614 new_item = Create_DopeVector_WN( block, item, WN_ty(item),
06615 TY_AR_etype(WN_ty(item)), FALSE );
06616 WN_Delete( item );
06617 item = new_item;
06618 kid0 = NULL;
06619 ty = WN_ty( item );
06620 val_type = 2;
06621 ioentsize = (Pointer_Size == 4) ? 5 : 3;
06622 break;
06623
06624 case IOL_DOPE:
06625 val_type = 2;
06626 ioentsize = (Pointer_Size == 4) ? 5 : 3;
06627
06628 fprintf( stderr, "No can do IOL_DOPE, not applicable to F77 ?\n" );
06629 abort();
06630 break;
06631
06632 case IOL_IMPLIED_DO:
06633 case IOL_IMPLIED_DO_1TRIP:
06634 val_type = 3;
06635 ioentsize = (Pointer_Size == 4) ? 6 : 5;
06636 break;
06637
06638 case IOL_CHAR:
06639
06640
06641
06642
06643
06644
06645 if (nested == NESTED_DOPE && WNOPR(WN_kid0( item )) == OPR_ARRAY) {
06646 WN *arr_item = WN_kid0( item );;
06647
06648 aty = WN_ty(item);
06649 ndims = TY_AR_ndims(Ty_Table[aty]);
06650 for (i = 0; i < ndims; i++) {
06651 WN *idx = Replace_Impl_Idx( WN_kid( arr_item, ndims * 2 - i ) );
06652 if (idx) {
06653 for (j = 0; j < num_impl; j++) {
06654 if (WN_st( idx ) == impl_idx[j]) {
06655 arr_dims[i] = WN_st( idx );
06656 WN_Delete( idx );
06657 break;
06658 }
06659 }
06660 if (idx == WN_kid( arr_item, ndims + i + 1 ))
06661 WN_kid( arr_item, ndims + i + 1 ) =
06662 WN_CreateIntconst( OPC_I4INTCONST, 1);
06663 }
06664 else
06665 arr_dims[i] = NULL;
06666 }
06667 new_item = Create_DopeVector_WN( block, arr_item, aty, TY_AR_etype(aty), TRUE );
06668 item = new_item;
06669 impl_do_arr = TRUE;
06670 kid0 = NULL;
06671 ioentsize = (Pointer_Size == 4) ? 5 : 3;
06672 ioentsize += ndims;
06673 ty = WN_ty( item );
06674 val_type = 2;
06675 cray_type = Cray_Type_From_TY(ty);
06676 break;
06677 } else {
06678 cray_type = 0x6000800;
06679 goto scalar;
06680 }
06681 case IOL_LOGICAL:
06682 cray_type = Cray_Type_From_TY(ty);
06683 case IOL_EXPR:
06684 if (TY_kind(ty) == KIND_STRUCT) {
06685 lower_f77_record_items( block, item, cilist_wn, stack_wn,
06686 iostat1, iostat2, form, iolist_st,
06687 iolist_ty, iolist_size,
06688 last_field, offset, icount, nested, ty, 0 );
06689 return(0);
06690 } else if (TY_kind(ty) == KIND_SCALAR) {
06691 if (nested == NESTED_DOPE) {
06692 WN *arr_item;
06693
06694 if (WN_kid_count(WN_kid0(item)) > 0) {
06695 arr_item = WN_kid0( WN_kid0( item ) );
06696
06697 if (io_item == IOL_LOGICAL && WN_kid_count(arr_item) > 0
06698 && WN_operator(WN_kid0( item )) == OPR_CVTL)
06699 arr_item = WN_kid0( arr_item );
06700 if (WN_operator(arr_item) == OPR_ARRAY) {
06701 aty = TY_pointed( WN_ty( WN_kid0(arr_item) ));
06702 ndims = ARB_dimension (TY_arb(aty));
06703 for (i = 0; i < ndims; i++) {
06704 WN *idx = Replace_Impl_Idx( WN_kid( arr_item, ndims * 2 - i ) );
06705
06706
06707
06708
06709 if (idx) {
06710 for (j = 0; j < num_impl; j++) {
06711 if (WN_st( idx ) == impl_idx[j]) {
06712 arr_dims[i] = WN_st( idx );
06713 WN_Delete( idx );
06714 break;
06715 }
06716 }
06717 if (idx == WN_kid( arr_item, ndims + i + 1 ))
06718 WN_kid( arr_item, ndims + i + 1 ) =
06719 WN_CreateIntconst( OPC_I4INTCONST, 1);
06720 }
06721 else
06722 arr_dims[i] = NULL;
06723 }
06724
06725
06726
06727
06728
06729
06730 WN_lda_offset(WN_kid0(arr_item)) += WN_load_offset(WN_kid0(item));
06731 new_item = Create_DopeVector_WN( block, arr_item, aty,
06732 WN_ty(item), TRUE );
06733 item = new_item;
06734 kid0 = WN_kid0( item );
06735 ty = WN_ty( item );
06736 val_type = 2;
06737 ioentsize = (Pointer_Size == 4) ? 5 : 3;
06738 ioentsize += ndims;
06739 impl_do_arr = TRUE;
06740 cray_type = Cray_Type_From_TY(ty);
06741 break;
06742 }
06743 }
06744 }
06745 else {
06746 impl_do_arr = FALSE;
06747 }
06748 cray_type = Cray_Type_From_TY(ty);
06749 } else if (TY_kind(ty) == KIND_POINTER) {
06750 cray_type = Cray_Type_From_TY(ty);
06751 } else
06752 Fail_FmtAssertion(
06753 "unexpected machine type (%s) for IOL_EXPR in IO Processing",
06754 MTYPE_name(TY_mtype(ty)));
06755 goto scalar;
06756 case IOL_VAR:
06757 if (nested == NESTED_DOPE) {
06758 WN *arr_item;
06759
06760 arr_item = WN_kid0(item);
06761 if (WN_operator(arr_item) == OPR_ARRAY) {
06762 aty = TY_pointed( WN_ty( WN_kid0(arr_item) ));
06763 ndims = ARB_dimension (TY_arb (aty));
06764 for (i = 0; i < ndims; i++) {
06765 WN *idx = Replace_Impl_Idx( WN_kid( arr_item, ndims * 2 - i ) );
06766
06767
06768
06769
06770 if (idx) {
06771 for (j = 0; j < num_impl; j++) {
06772 if (WN_st( idx ) == impl_idx[j]) {
06773 arr_dims[i] = WN_st( idx );
06774 WN_Delete( idx );
06775 break;
06776 }
06777 }
06778 if (idx == WN_kid( arr_item, ndims + i + 1 ))
06779 WN_kid( arr_item, ndims + i + 1 ) =
06780 WN_CreateIntconst( OPC_I4INTCONST, 1);
06781 }
06782 else
06783 arr_dims[i] = NULL;
06784 }
06785 new_item = Create_DopeVector_WN( block, arr_item, aty,
06786 TY_AR_etype(aty), TRUE );
06787 cray_type = Cray_Type_From_TY(ty);
06788 item = new_item;
06789 kid0 = WN_kid0( item );
06790 ty = WN_ty( item );
06791 val_type = 2;
06792 ioentsize = (Pointer_Size == 4) ? 5 : 3;
06793 ioentsize += ndims;
06794 impl_do_arr = TRUE;
06795 break;
06796 }
06797 else if (TY_kind(ty) == KIND_STRUCT) {
06798 lower_f77_record_items( block, item, cilist_wn, stack_wn,
06799 iostat1, iostat2, form, iolist_st,
06800 iolist_ty, iolist_size,
06801 last_field, offset,
06802 icount, nested,
06803 TY_pointed(WN_ty(arr_item)), 0 );
06804 return(0);
06805 }
06806 else {
06807 cray_type = Cray_Type_From_TY(ty);
06808 goto scalar;
06809 }
06810 }
06811 if (TY_kind(ty) == KIND_STRUCT) {
06812 lower_f77_record_items( block, item, cilist_wn, stack_wn,
06813 iostat1, iostat2, form, iolist_st,
06814 iolist_ty, iolist_size,
06815 last_field, offset, icount, nested, ty, 0 );
06816 return(0);
06817 }
06818 scalar:
06819 val_type = 1;
06820 ioentsize = (Pointer_Size == 4) ? 6 : 4;
06821 break;
06822 default:
06823 Fail_FmtAssertion("Unexpected io item (%d)", io_item);
06824 }
06825
06826 header_offset = *offset;
06827 *icount += 1;
06828
06829 if (val_type == 1) {
06830
06831
06832 Add_To_Iolist( FID_IOSCALAR_ENTRY, last_field, offset, 0 );
06833
06834 word1 = 0;
06835 if (Target_Byte_Sex == LITTLE_ENDIAN) {
06836 ioentry_header_ptr = (ioentry_header_type *)&word1;
06837 ioentry_header_ptr->valtype = val_type;
06838 ioentry_header_ptr->ioentsize = ioentsize;
06839 } else {
06840
06841 word1 = ((UINT64) val_type << 56) |
06842 ((UINT64) ioentsize);
06843 }
06844 Gen_Iolist_PutFieldConst (block, *iolist_st, header_offset, MTYPE_U8, word1);
06845
06846
06847 if (cray_type == 0) {
06848 word2 = (UINT64) Cray_Type_From_TY(ty);
06849 } else
06850 word2 = (UINT64) cray_type;
06851 Gen_Iolist_PutFieldConst( block, *iolist_st,
06852 header_offset + FIO_OFFSET(FCR_IOSCALAR_TYPE_T),
06853 FIO_TYPE(FCR_IOSCALAR_TYPE_T), word2);
06854
06855
06856 if (TY_kind(ty) == KIND_POINTER) {
06857 ST *tmp_st;
06858 WN *stid;
06859 tmp_st = Gen_Temp_Symbol( MTYPE_To_TY(Pointer_type), "temp-expr");
06860 stid = WN_Stid (Pointer_type, 0, tmp_st, ST_type(tmp_st), kid0);
06861 WN_INSERT_BlockLast(block, stid);
06862 wn = create_pointer_to_node (block, stid, (TY_IDX) 0, TRUE);
06863
06864 } else if (WN_operator(kid0) == OPR_LDID
06865 && TY_kind(WN_ty(kid0)) == KIND_POINTER) {
06866
06867
06868
06869
06870 wn = WN_COPY_Tree( kid0 );
06871 } else {
06872 wn = create_pointer_to_node (block, kid0, ty, TRUE);
06873 }
06874 Gen_Iolist_PutAddrWN ( block, *iolist_st,
06875 header_offset + FIO_OFFSET(FCR_IOSCALAR_ADDR),
06876 FIO_TYPE(FCR_IOSCALAR_ADDR), wn );
06877 if (io_item == IOL_CHAR) {
06878
06879 Gen_Iolist_PutFieldWN ( block, *iolist_st,
06880 header_offset + FIO_OFFSET(FCR_IOSCALAR_CHAR_LEN),
06881 FIO_TYPE(FCR_IOSCALAR_CHAR_LEN), WN_kid1( item ) );
06882 }
06883 } else if (val_type == 2) {
06884
06885 Add_To_Iolist( FID_IOARRAY_ENTRY, last_field, offset,
06886 impl_do_arr ? ndims : 0 );
06887
06888
06889
06890 Gen_Iolist_PutAddrWN( block, *iolist_st,
06891 header_offset + FIO_OFFSET(FCR_IOARRAY_DV_ADDR),
06892 FIO_TYPE(FCR_IOARRAY_DV_ADDR), item );
06893
06894
06895
06896
06897 word1 = 0;
06898 ioentry_array_ptr = (ioarray_entry_type *)&word1;
06899
06900 ioentry_array_ptr->indflag = (impl_do_arr ? 1 : 0);
06901
06902 Gen_Iolist_PutFieldConst( block, *iolist_st,
06903 header_offset + FIO_OFFSET(FCR_IOARRAY_FLAG),
06904 FIO_TYPE(FCR_IOARRAY_FLAG),
06905 word1);
06906
06907
06908
06909
06910
06911
06912
06913 if (impl_do_arr) {
06914 for (i = 0; i < ndims; i++) {
06915
06916
06917 if (arr_dims[i])
06918 Gen_Iolist_PutAddrWN( block, *iolist_st,
06919 header_offset + FIO_OFFSET(FCR_IOARRAY_IDX1+i),
06920 FIO_TYPE(FCR_IOARRAY_IDX1),
06921 Make_IoAddr_WN( arr_dims[i] ));
06922 else
06923 Gen_Iolist_PutFieldConst( block, *iolist_st,
06924 header_offset + FIO_OFFSET(FCR_IOARRAY_IDX1+i),
06925 FIO_TYPE(FCR_IOARRAY_IDX1), 0 );
06926 }
06927 }
06928 word1 = 0;
06929 if (Target_Byte_Sex == LITTLE_ENDIAN) {
06930 ioentry_header_ptr = (ioentry_header_type *)&word1;
06931 ioentry_header_ptr->valtype = val_type;
06932 ioentry_header_ptr->ioentsize = ioentsize;
06933 } else {
06934 word1 = ((UINT64) val_type << 56) |
06935 ((UINT64) ioentsize);
06936 }
06937 Gen_Iolist_PutFieldConst (block, *iolist_st, header_offset,
06938 FIO_TYPE(FCR_IOARRAY_ENTRY), word1);
06939 } else if (val_type == 3) {
06940 ST *idx_st[MAX_DIM];
06941
06942
06943
06944 if (!need_loop) {
06945
06946 #ifdef TEST_DOPE
06947 ARB *bnds;
06948
06949
06950
06951
06952
06953 if (struct_array) {
06954 ari = TY_arinfo(ty);
06955 ndims = ARI_ndims(ari);
06956 nkids = ndims * 2 + 1;
06957 kid0 = WN_Create( Pointer_Size == 4 ? OPC_U4ARRAY : OPC_U8ARRAY, nkids );
06958 WN_element_size(kid0) = TY_size(TY_AR_etype(TY_pointed(WN_ty(WN_kid0(item)))));
06959 WN_kid0(kid0) = WN_COPY_Tree( WN_kid0(item) );
06960 for (i = 0, ioffset = header_offset; i < ndims; i++, ioffset += 8 ) {
06961
06962 header_offset = ioffset;
06963 Add_To_Iolist( FID_IOIMPLIEDDO_ENTRY, last_field, &ioffset, 0 );
06964
06965 idx_st = Gen_Temp_Symbol( MTYPE_To_TY(MTYPE_I4), "struct_arr_idx");
06966 impl_idx[num_impl++] = idx_st;
06967 Gen_Iolist_PutAddrWN( block, *iolist_st,
06968 header_offset + FIO_OFFSET(FCR_IOIMPLIEDDO_VAR_ADDR),
06969 FIO_TYPE(FCR_IOIMPLIEDDO_VAR_ADDR),
06970 Make_IoAddr_WN( idx_st ));
06971 bnds = &ARI_bnd( ari, i);
06972
06973 if (ARB_const_lbnd(*bnds))
06974 wn = WN_CreateIntconst( OPC_I4INTCONST, ARB_lbnd_val( *bnds ) );
06975 else
06976 wn = WN_COPY_Tree( ARB_lbnd_tree( *bnds ) );
06977 Gen_Iolist_PutAddrWN( block, *iolist_st,
06978 header_offset + FIO_OFFSET(FCR_IOIMPLIEDDO_BEGIN_CNT),
06979 FIO_TYPE(FCR_IOIMPLIEDDO_BEGIN_CNT),
06980 create_pointer_to_node( block, wn, NULL, TRUE ));
06981
06982
06983 WN_kid(kid0, nkids-i-1) = WN_Sub( Int_Type,
06984 WN_Ldid(Int_Type, 0, idx_st, ST_type(idx_st) ),
06985 wn );
06986 if (ARB_const_ubnd(*bnds) && ARB_const_lbnd(*bnds))
06987 WN_kid(kid0, nkids-i-ndims-1) =
06988 WN_CreateIntconst( OPC_I4INTCONST,
06989 ARB_ubnd_val( *bnds ) - ARB_lbnd_val( *bnds ) + 1 );
06990 else
06991 WN_kid(kid0, nkids-i-ndims-1) =
06992 WN_Ldid(Int_Type, 0, WN_st(ARB_ubnd_tree( *bnds )),
06993 ST_type(WN_st(ARB_ubnd_tree( *bnds ))));
06994
06995
06996 if (ARB_const_ubnd(*bnds)) {
06997 wn = WN_CreateIntconst( OPC_I4INTCONST, ARB_ubnd_val( *bnds ) );
06998 wn = create_pointer_to_node( block, wn, NULL, TRUE );
06999 } else
07000 wn = create_pointer_to_node( block, ARB_ubnd_tree( *bnds ), NULL, TRUE );
07001 Gen_Iolist_PutAddrWN( block, *iolist_st,
07002 header_offset + FIO_OFFSET(FCR_IOIMPLIEDDO_END_CNT),
07003 FIO_TYPE(FCR_IOIMPLIEDDO_END_CNT), wn );
07004
07005 wn = WN_CreateIntconst( OPC_I4INTCONST, 1 );
07006 wn = create_pointer_to_node( block, wn, NULL, TRUE );
07007 Gen_Iolist_PutAddrWN( block, *iolist_st,
07008 header_offset + FIO_OFFSET(FCR_IOIMPLIEDDO_INC_CNT),
07009 FIO_TYPE(FCR_IOIMPLIEDDO_INC_CNT), wn );
07010 if (i < ndims-1) {
07011
07012
07013
07014 field = New_FLD (1, TRUE);
07015 FLD_name(field) = Save_Str("implied_do_iolist_header");
07016 FLD_ofst(field) = ioffset;
07017 FLD_type(field) = Be_Type_Tbl (MTYPE_U8);
07018 FLD_next(*last_field) = field;
07019 *last_field = field;
07020 }
07021 }
07022
07023
07024
07025
07026 read_mode = form == FIO_CR_READ_UNFORMATTED
07027 || form == FIO_CR_READ_FORMATTED
07028 || form == FIO_CR_READ_NAMELIST;
07029 wn = WN_CreateIoItem1( read_mode ? IOL_VAR : IOL_EXPR,
07030 WN_COPY_Tree( kid0 ), NULL );
07031 ty = TY_AR_etype(TY_pointed(WN_ty(WN_kid0(item))));
07032
07033 ncount = 0;
07034 *offset = ioffset;
07035
07036
07037
07038
07039
07040 lower_f77_record_items( block, wn, cilist_wn, stack_wn,
07041 iostat1, iostat2, form, iolist_st,
07042 iolist_ty, iolist_size,
07043 last_field, offset,
07044 &ncount, NESTED_DOPE, ty, 0 );
07045 ioffset -= 8;
07046 for (i = 0; i < ndims; i++) {
07047 if (i > 0) {
07048
07049 word = 0;
07050 if (Target_Byte_Sex == LITTLE_ENDIAN) {
07051 ioentry_header_ptr = (ioentry_header_type *)&word;
07052 ioentry_header_ptr->valtype = 3;
07053 ioentry_header_ptr->ioentsize = ioentsize;
07054 } else {
07055 word = ((UINT64) 3 << 56) | ((UINT64) ioentsize);
07056 }
07057 Gen_Iolist_PutFieldConst( block, *iolist_st, ioffset+8,
07058 MTYPE_U8, word);
07059 }
07060
07061 ioentsize += 8 / Pointer_Size;
07062 word = ( (UINT64) 1 << 61) |
07063 ( (UINT64) ncount << 16) |
07064 ( (UINT64) ioentsize );
07065 Gen_Iolist_PutFieldConst (block, *iolist_st,
07066 ioffset, MTYPE_U8, word);
07067 ncount = 1;
07068 ioentsize += impldosize;
07069 ioffset -= (impldosize*Pointer_Size+8);
07070 }
07071
07072 word = 0;
07073 if (Target_Byte_Sex == LITTLE_ENDIAN) {
07074 ioentry_header_ptr = (ioentry_header_type *)&word;
07075 ioentry_header_ptr->valtype = 3;
07076 ioentry_header_ptr->ioentsize = ioentsize;
07077 } else {
07078 word = ((UINT64) 3 << 56) | ((UINT64) ioentsize);
07079 }
07080 Gen_Iolist_PutFieldConst( block, *iolist_st, ioffset+8,
07081 MTYPE_U8, word);
07082 return( ioentsize-impldosize-8/Pointer_Size );
07083 }
07084 #endif
07085
07086 Add_To_Iolist( FID_IOIMPLIEDDO_ENTRY, last_field, offset, 0 );
07087
07088
07089
07090 impl_idx[num_impl++] = WN_st(WN_index(item));
07091
07092 Gen_Iolist_PutAddrWN( block, *iolist_st,
07093 header_offset + FIO_OFFSET(FCR_IOIMPLIEDDO_VAR_ADDR),
07094 FIO_TYPE(FCR_IOIMPLIEDDO_VAR_ADDR),
07095 Make_IoAddr_WN( WN_st(WN_index(item))));
07096
07097
07098 wn = create_pointer_to_node( block, WN_start(item), (TY_IDX) 0, TRUE );
07099 Gen_Iolist_PutAddrWN( block, *iolist_st,
07100 header_offset + FIO_OFFSET(FCR_IOIMPLIEDDO_BEGIN_CNT),
07101 FIO_TYPE(FCR_IOIMPLIEDDO_BEGIN_CNT), wn );
07102
07103
07104 wn = create_pointer_to_node( block, WN_end(item), (TY_IDX) 0, TRUE);
07105 Gen_Iolist_PutAddrWN( block, *iolist_st,
07106 header_offset + FIO_OFFSET(FCR_IOIMPLIEDDO_END_CNT),
07107 FIO_TYPE(FCR_IOIMPLIEDDO_END_CNT), wn );
07108
07109
07110 wn = create_pointer_to_node( block, WN_step(item), (TY_IDX) 0, TRUE );
07111 Gen_Iolist_PutAddrWN( block, *iolist_st,
07112 header_offset + FIO_OFFSET(FCR_IOIMPLIEDDO_INC_CNT),
07113 FIO_TYPE(FCR_IOIMPLIEDDO_INC_CNT), wn );
07114
07115
07116
07117
07118 ioentsize += lower_f77_io_items( block, item, cilist_wn,
07119 iostat1, iostat2, form, NESTED_DOPE,
07120 offset, 4, WN_kid_count(item) );
07121
07122
07123
07124 word1 = 0;
07125 if (Target_Byte_Sex == LITTLE_ENDIAN) {
07126 ioentry_header_ptr = (ioentry_header_type *)&word1;
07127 ioentry_header_ptr->valtype = 3;
07128 ioentry_header_ptr->ioentsize = ioentsize;
07129 } else {
07130 word1 = ((UINT64) val_type << 56) |
07131 ((UINT64) ioentsize);
07132 }
07133 Gen_Iolist_PutFieldConst (block, *iolist_st, header_offset,
07134 FIO_TYPE(FCR_IOIMPLIEDDO_ENTRY), word1);
07135 num_impl--;
07136 } else {
07137 INT32 impl_offset = 0;
07138 INT32 ntype, mtype;
07139 WN *top_label;
07140 WN *cont_label;
07141 WN *start, *step, *end;
07142 WN *load_index;
07143 ST *pregst;
07144 PREG_NUM pregnum;
07145
07146 if (struct_array) {
07147
07148 WN *top_label[MAX_DIM];
07149 WN *cont_label[MAX_DIM];
07150 WN *xstart, *xstep[MAX_DIM], *xend[MAX_DIM];
07151 WN *new_item;
07152 WN *arr_item;
07153 TY_IDX arr_ty;
07154
07155 if (*icount > 1) {
07156
07157
07158
07159
07160
07161 word = 0;
07162 if (Target_Byte_Sex == LITTLE_ENDIAN) {
07163 io_header_ptr = (iolist_header_type *)&word;
07164 io_header_ptr->version = 1;
07165 io_header_ptr->iolfirst = (first_last == 2 || first_last == 3) ? 1 : 0;
07166 io_header_ptr->iollast = (first_last == 1 || first_last == 3) ? 1 : 0;
07167 io_header_ptr->icount = *icount;
07168 io_header_ptr->ioetsize = *iolist_size;
07169 } else {
07170 word = ( (UINT64) 1 << 61) |
07171 ( (UINT64) first_last << 32) |
07172 ( (UINT64) *icount << 16) |
07173 ( (UINT64) *iolist_size );
07174 }
07175 Set_TY_size(Ty_Table[*iolist_ty], *offset);
07176 Set_FLD_last_field (last_field);
07177 Make_Cray_Io_Call( block, form, iostat1, iostat2, cilist_wn,
07178 stack_wn, *iolist_st, word);
07179
07180 *offset = 8;
07181 *iolist_st = Get_IoStruct_ST ( block, FID_CRAY_IOLIST, FALSE);
07182 *iolist_ty = fiostruct_ty[FID_CRAY_IOLIST];
07183 Set_ST_type(*iolist_st, *iolist_ty);
07184 *iolist_size = 8/Pointer_Size;
07185 last_field = TY_fld (Ty_Table[*iolist_ty]);
07186 }
07187 *icount = 0;
07188
07189 ARB_HANDLE arb_base = TY_arb(ty);
07190 ndims = TY_AR_ndims(ty);
07191 nkids = ndims * 2 + 1;
07192 kid0 = WN_Create( Pointer_Size == 4 ? OPC_U4ARRAY : OPC_U8ARRAY, nkids );
07193 for (arr_item = WN_kid0(item); WNOPR(arr_item) != OPR_LDA;)
07194 arr_item = WN_kid0(arr_item);
07195
07196
07197
07198 arr_ty = TY_pointed(WN_ty(arr_item));
07199 WN_element_size(kid0) = TY_size(TY_AR_etype(arr_ty));
07200 WN_kid0(kid0) = WN_COPY_Tree( arr_item );
07201 for (i = 0; i < ndims; i++) {
07202
07203 idx_st[i] = Gen_Temp_Symbol( MTYPE_To_TY(MTYPE_I4), "struct_arr_idx");
07204 ARB_HANDLE arb = arb_base[ndims-i-1];
07205
07206
07207 start = Get_ARB_WN(arb, ARB_LBOUND);
07208
07209 WN_kid(kid0, nkids-i-1) = WN_Sub( Int_Type,
07210 WN_Ldid(Int_Type, 0, idx_st[i], ST_type(idx_st[i]) ),
07211 start );
07212 if (ARB_const_ubnd(arb) && ARB_const_lbnd(arb))
07213 WN_kid(kid0, nkids-i-ndims-1) =
07214 WN_CreateIntconst( OPC_I4INTCONST,
07215 ARB_ubnd_val( arb ) - ARB_lbnd_val( arb ) + 1 );
07216 else
07217 WN_kid(kid0, nkids-i-ndims-1) = Get_ARB_WN(arb, ARB_UBOUND);
07218
07219 }
07220 read_mode = form == FIO_CR_READ_UNFORMATTED
07221 || form == FIO_CR_READ_FORMATTED
07222 || form == FIO_CR_READ_NAMELIST;
07223 new_item = WN_CreateIoItem1( read_mode ? IOL_VAR : IOL_EXPR,
07224 kid0, (TY_IDX) 0 );
07225 WN_set_ty(new_item, TY_AR_etype(arr_ty));
07226
07227
07228
07229
07230
07231
07232
07233
07234 for (i = 0; i < ndims; i++) {
07235 top_label[i] = WN_CreateNewLabel();
07236 cont_label[i] = WN_CreateNewLabel();
07237 ARB_HANDLE arb = arb_base[ndims-i-1];
07238
07239
07240 start = Get_ARB_WN(arb, ARB_LBOUND);;
07241 end = Get_ARB_WN(arb, ARB_UBOUND);
07242
07243 step = WN_CreateIntconst( OPC_IntWord, 1 );
07244
07245 ty = Be_Type_Tbl(Int_Type);
07246 ntype = mtype = TY_mtype(ty);
07247 if (ntype == MTYPE_I1 || ntype == MTYPE_I2)
07248 ntype = MTYPE_I4;
07249 load_index = WN_Ldid ( mtype, 0, idx_st[i], ty );
07250 xstart = WN_Stid( mtype, 0, idx_st[i], ty, start );
07251
07252 xstep[i] = WN_Stid ( mtype, 0, idx_st[i], ty,
07253 WN_CreateExp2( OPCODE_make_op( OPR_ADD, ntype, MTYPE_V ),
07254 WN_COPY_Tree( load_index ), step ));
07255 xend[i] = WN_LE ( ntype, load_index, end );
07256 WN_INSERT_BlockLast ( block, xstart );
07257 WN_INSERT_BlockLast ( block,
07258 WN_CreateGoto ((ST_IDX) NULL,WN_label_number(cont_label[i]) ));
07259 WN_INSERT_BlockLast ( block, top_label[i] );
07260 }
07261
07262 lower_f77_record_items ( block, new_item, cilist_wn, stack_wn,
07263 iostat1, iostat2, form, iolist_st,
07264 iolist_ty, iolist_size,
07265 last_field, offset, icount,
07266 NESTED_ITEM, TY_AR_etype(arr_ty), 0);
07267
07268 for (i = ndims-1; i >= 0; i--) {
07269 WN_INSERT_BlockLast ( block, xstep[i] );
07270 WN_INSERT_BlockLast ( block, cont_label[i] );
07271 WN_INSERT_BlockLast( block,
07272 WN_CreateTruebr( WN_label_number(top_label[i]), xend[i] ));
07273 }
07274 return(0);
07275 }
07276
07277 top_label = WN_CreateNewLabel();
07278 cont_label = WN_CreateNewLabel();
07279 WN_start(item) = extract_calls ( block, WN_start(item) );
07280 WN_end(item) = extract_calls ( block, WN_end(item) );
07281 WN_step(item) = extract_calls ( block, WN_step(item) );
07282 ty = ST_type(WN_st(WN_index(item)));
07283 if ( TY_kind(ty) != KIND_POINTER ) {
07284 ntype = mtype = TY_mtype(ty);
07285 if (ntype == MTYPE_I1 || ntype == MTYPE_I2)
07286 ntype = MTYPE_I4;
07287 load_index = WN_Ldid ( mtype, WN_idname_offset(WN_index(item)),
07288 WN_st(WN_index(item)), ty );
07289 start = WN_Stid ( mtype, WN_idname_offset(WN_index(item)),
07290 WN_st(WN_index(item)), ty, WN_start(item) );
07291 step = WN_Stid ( mtype, WN_idname_offset(WN_index(item)),
07292 WN_st(WN_index(item)), ty,
07293 WN_CreateExp2 ( OPCODE_make_op ( OPR_ADD, ntype,
07294 MTYPE_V ),
07295 WN_COPY_Tree ( load_index ),
07296 WN_step(item) ));
07297 } else {
07298 ntype = mtype = TY_mtype(TY_pointed(ty));
07299 if (ntype == MTYPE_I1 || ntype == MTYPE_I2)
07300 ntype = MTYPE_I4;
07301 load_index = WN_Iload ( mtype, 0, TY_pointed(ty),
07302 WN_Ldid ( Pointer_type,
07303 WN_idname_offset(WN_index(item)),
07304 WN_st(WN_index(item)), ty ));
07305 start = WN_Istore ( mtype, 0, ty,
07306 WN_Ldid ( Pointer_type,
07307 WN_idname_offset(WN_index(item)),
07308 WN_st(WN_index(item)), ty ),
07309 WN_start(item) );
07310 step = WN_Istore ( mtype, 0, ty,
07311 WN_Ldid ( Pointer_type,
07312 WN_idname_offset(WN_index(item)),
07313 WN_st(WN_index(item)), ty ),
07314 WN_CreateExp2 ( OPCODE_make_op ( OPR_ADD, ntype,
07315 MTYPE_V ),
07316 WN_COPY_Tree ( load_index ),
07317 WN_step(item) ));
07318 }
07319 if ( WN_operator(WN_step(item)) == OPR_INTCONST ||
07320 WN_operator(WN_step(item)) == OPR_CONST ) {
07321 if ( ( WN_operator(WN_step(item)) == OPR_INTCONST &&
07322 WN_const_val(WN_step(item)) >= 0 ) ||
07323 ( WN_operator(WN_step(item)) == OPR_CONST &&
07324 STC_val(WN_st(WN_step(item))).vals.ival.v0 >= 0 ) )
07325 end = WN_LE ( ntype, load_index, WN_end(item) );
07326 else
07327 end = WN_GE ( ntype, load_index, WN_end(item) );
07328 } else {
07329 pregst = MTYPE_To_PREG ( Boolean_type );
07330 pregnum = Create_Preg ( Boolean_type, "stoptemp");
07331 WN_INSERT_BlockLast ( block,
07332 WN_StidIntoPreg ( Boolean_type, pregnum,
07333 pregst,
07334 WN_GE ( ntype,
07335 WN_COPY_Tree ( WN_step(item) ),
07336 WN_Zerocon ( ntype ))));
07337 end = WN_Select ( Boolean_type,
07338 WN_LdidPreg ( Boolean_type, pregnum ),
07339 WN_LE ( ntype, load_index, WN_end(item) ),
07340 WN_GE ( ntype, WN_COPY_Tree (load_index),
07341 WN_COPY_Tree (WN_end(item)) ));
07342 }
07343 WN_INSERT_BlockLast ( block, start );
07344 if (io_item == IOL_IMPLIED_DO)
07345 WN_INSERT_BlockLast ( block,
07346 WN_CreateGoto ((ST_IDX) NULL,WN_label_number(cont_label) ));
07347 WN_INSERT_BlockLast ( block, top_label );
07348
07349 Set_TY_size(Ty_Table[*iolist_ty], *offset);
07350 lower_f77_io_items ( block, item, cilist_wn, iostat1, iostat2,
07351 form, NESTED_ITEM, &impl_offset, 4, WN_kid_count(item) );
07352
07353 WN_INSERT_BlockLast ( block, step );
07354 WN_INSERT_BlockLast ( block, cont_label );
07355 WN_INSERT_BlockLast( block, WN_CreateTruebr( WN_label_number(top_label), end ));
07356 return(0);
07357 }
07358 } else if (val_type == 4) {
07359
07360 fprintf( stderr, "valtype = %d not done\n", val_type );
07361 abort();
07362 } else if (val_type == 5) {
07363
07364 fprintf( stderr, "valtype = %d not done\n", val_type );
07365 abort();
07366 }
07367 return (ioentsize);
07368 }
07369
07370
07371 static WN *
07372 Convert_Iol_Item( WN *item, TY_IDX fty )
07373 {
07374
07375 WN *wn;
07376 WN *kid0;
07377 TY_IDX ety;
07378
07379 if (TY_kind( fty ) == KIND_ARRAY) {
07380
07381
07382
07383 ety = TY_AR_etype(fty);
07384 if (TY_kind( ety ) == KIND_ARRAY) {
07385
07386 ety = TY_AR_etype(ety);
07387 if (TY_is_character( ety )) {
07388
07389 ety = TY_AR_etype(fty);
07390 wn = WN_CreateIoItem3 ( IOL_CHAR_ARRAY,
07391 WN_COPY_Tree( WN_kid0( item ) ),
07392 WN_CreateIntconst( OPC_I4INTCONST, TY_size(ety)),
07393 WN_CreateIntconst ( OPC_I4INTCONST, TY_size(fty)/TY_size(ety)),
07394 ety );
07395 fty = ety;
07396 } else {
07397
07398 wn = WN_CreateIoItem2 ( IOL_ARRAY, WN_COPY_Tree( WN_kid0( item ) ),
07399 WN_CreateIntconst( OPC_I4INTCONST, TY_size(fty)), fty );
07400 }
07401 } else if (TY_mtype( ety ) == MTYPE_U1) {
07402
07403 wn = WN_CreateIoItem2 ( IOL_CHAR, WN_COPY_Tree( WN_kid0( item ) ),
07404 WN_CreateIntconst ( OPC_I4INTCONST, TY_size(fty)), fty );
07405 }
07406 else {
07407
07408 wn = WN_CreateIoItem2 ( IOL_ARRAY, WN_COPY_Tree( WN_kid0( item ) ),
07409 WN_CreateIntconst( OPC_I4INTCONST, TY_size(fty)), fty );
07410 }
07411 } else {
07412
07413 if ( WN_io_item(item) == IOL_EXPR)
07414 wn = WN_CreateIoItem1( IOL_EXPR, WN_COPY_Tree( WN_kid0(item) ),
07415 fty );
07416 else
07417 wn = WN_CreateIoItem1( IOL_VAR, WN_COPY_Tree( WN_kid0(item) ), fty );
07418 }
07419
07420 kid0 = WN_kid0(wn);
07421 while (WNOPR(kid0) != OPR_LDA) {
07422 kid0 = WN_kid0(kid0);
07423 }
07424 WN_set_ty(kid0, TY_pointer(fty));
07425
07426 return( wn );
07427 }
07428
07429
07430 static INT32
07431 Create_Field_Entry ( WN *block, WN * item, WN *cilist_wn, WN *stack_wn,
07432 WN *iostat1, WN *iostat2,
07433 FIOOPER form, ST **iolist_st,
07434 TY_IDX *iolist_ty, INT32 *iolist_size,
07435 FLD_HANDLE& last_field, INT32 *offset, INT32 *icount,
07436 INT32 nested, FLD_HANDLE fld, INT64 foffset)
07437
07438
07439
07440
07441
07442
07443
07444
07445
07446
07447
07448
07449
07450
07451
07452
07453
07454
07455 {
07456 TY_IDX ty;
07457 WN *wn1, *kid0;
07458 INT32 ioentsize = 0;
07459
07460 kid0 = WN_kid0(item);
07461 ty = FLD_type( fld );
07462
07463 switch (TY_kind(ty)) {
07464
07465 case KIND_SCALAR:
07466 case KIND_POINTER:
07467 (void) Make_Pointer_Type ( ty, FALSE );
07468 wn1 = Convert_Iol_Item(item, ty);
07469 kid0 = WN_kid0(wn1);
07470 while (WNOPR(kid0) != OPR_LDA) {
07471 kid0 = WN_kid0(kid0);
07472 }
07473 WN_lda_offset(kid0) += foffset;
07474 ioentsize = Create_Io_Entry( block, wn1, cilist_wn, stack_wn,
07475 iostat1, iostat2, form, iolist_st,
07476 iolist_ty, iolist_size,
07477 last_field, offset, icount, nested, FALSE);
07478 break;
07479
07480 case KIND_ARRAY:
07481 if (TY_kind(TY_AR_etype(ty)) == KIND_STRUCT) {
07482 (void) Make_Pointer_Type ( ty, FALSE );
07483 wn1 = Convert_Iol_Item(item, ty);
07484 kid0 = WN_kid0(wn1);
07485 while (WNOPR(kid0) != OPR_LDA) {
07486 kid0 = WN_kid0(kid0);
07487 }
07488 WN_lda_offset(kid0) += foffset;
07489 ioentsize = Create_Io_Entry( block, wn1, cilist_wn, stack_wn,
07490 iostat1, iostat2, form, iolist_st,
07491 iolist_ty, iolist_size,
07492 last_field, offset, icount, nested, TRUE);
07493 }
07494 else {
07495 (void) Make_Pointer_Type ( ty, FALSE );
07496 wn1 = Convert_Iol_Item(item, ty);
07497 kid0 = WN_kid0(wn1);
07498 while (WNOPR(kid0) != OPR_LDA) {
07499 kid0 = WN_kid0(kid0);
07500 }
07501 WN_lda_offset(kid0) += foffset;
07502 ioentsize = Create_Io_Entry( block, wn1, cilist_wn, stack_wn,
07503 iostat1, iostat2, form, iolist_st,
07504 iolist_ty, iolist_size,
07505 last_field, offset, icount, nested, FALSE);
07506 }
07507 break;
07508
07509 case KIND_STRUCT:
07510 lower_f77_record_items ( block, item, cilist_wn, stack_wn,
07511 iostat1, iostat2, form, iolist_st,
07512 iolist_ty, iolist_size,
07513 last_field, offset, icount,
07514 nested, ty, foffset);
07515 break;
07516 default:
07517 Fail_FmtAssertion("unexpected type (%s) in record I/O processing",
07518 MTYPE_name(TY_mtype(ty)));
07519 }
07520 return( ioentsize );
07521 }
07522
07523
07524
07525
07526
07527
07528
07529
07530
07531 static void
07532 lower_f77_record_items ( WN * block, WN *rec, WN *cilist_wn, WN *stack_wn,
07533 WN *iostat1, WN *iostat2,
07534 FIOOPER form, ST **iolist_st,
07535 TY_IDX * iolist_ty, INT32 *iolist_size,
07536 FLD_HANDLE& last_field, INT32 *offset, INT32 *icount,
07537 INT32 nested, TY_IDX rty, INT64 roffset)
07538
07539
07540
07541
07542
07543
07544 {
07545 TY_IDX ty;
07546 INT64 foffset;
07547 UINT64 word;
07548 iolist_header_type *iolist_header_ptr;
07549
07550 Is_True (TY_kind(rty) == KIND_STRUCT,
07551 ("non record type passed to lower_f77_record_items"));
07552
07553
07554
07555
07556
07557
07558
07559
07560
07561
07562
07563
07564
07565
07566
07567
07568
07569
07570
07571
07572 FLD_ITER fld_iter = Make_fld_iter (TY_fld(Ty_Table[rty]));
07573
07574 do {
07575
07576 FLD_HANDLE fld (fld_iter);
07577
07578 ty = FLD_type(fld);
07579 foffset = roffset + FLD_ofst(fld);
07580
07581 switch (TY_kind(ty)) {
07582
07583 case KIND_ARRAY:
07584 if (TY_kind(TY_AR_etype(ty)) == KIND_STRUCT) {
07585
07586
07587
07588
07589
07590
07591
07592
07593
07594
07595 if (*icount) {
07596 word = 0;
07597 if (Target_Byte_Sex == LITTLE_ENDIAN) {
07598 iolist_header_ptr = (iolist_header_type *)&word;
07599 iolist_header_ptr->version = 1;
07600 iolist_header_ptr->iolfirst = (first_last == 2 || first_last == 3) ? 1 : 0;
07601 iolist_header_ptr->iollast = (first_last == 1 || first_last == 3) ? 1 : 0;
07602 iolist_header_ptr->icount = *icount;
07603 iolist_header_ptr->ioetsize = *iolist_size;
07604 } else {
07605 word = ( (UINT64) 1 << 61) |
07606 ( (UINT64) first_last << 32) |
07607 ( (UINT64) *icount << 16) |
07608 ( (UINT64) *iolist_size );
07609 }
07610 Set_TY_size(*iolist_ty, *offset);
07611 Set_FLD_last_field (last_field);
07612 Make_Cray_Io_Call( block, form, iostat1, iostat2, cilist_wn,
07613 stack_wn, *iolist_st, word);
07614
07615 *icount = 0;
07616 *offset = 8;
07617 *iolist_st = Get_IoStruct_ST ( block, FID_CRAY_IOLIST, FALSE);
07618 *iolist_ty = fiostruct_ty[FID_CRAY_IOLIST];
07619 Set_ST_type(*iolist_st, *iolist_ty);
07620 *iolist_size = 8/Pointer_Size;
07621 last_field = TY_fld (Ty_Table[*iolist_ty]);
07622 }
07623 else if (first_last) {
07624 Create_Null_Call( block, form, cilist_wn, iostat1, iostat2,
07625 stack_wn);
07626 }
07627 Create_Field_Entry( block, rec, cilist_wn, stack_wn,
07628 iostat1, iostat2, form,
07629 iolist_st, iolist_ty, iolist_size,
07630 last_field, offset, icount,
07631 nested, fld, foffset );
07632 break;
07633 }
07634 case KIND_SCALAR:
07635 case KIND_POINTER:
07636
07637 *iolist_size += Create_Field_Entry( block, rec, cilist_wn, stack_wn,
07638 iostat1, iostat2, form,
07639 iolist_st, iolist_ty, iolist_size,
07640 last_field, offset, icount,
07641 nested, fld, foffset );
07642 break;
07643
07644 case KIND_STRUCT:
07645 lower_f77_record_items ( block, rec, cilist_wn, stack_wn,
07646 iostat1, iostat2, form, iolist_st,
07647 iolist_ty, iolist_size,
07648 last_field, offset, icount, nested, ty, foffset );
07649 break;
07650
07651 case KIND_VOID:
07652
07653 break;
07654
07655 default:
07656 Fail_FmtAssertion("unexpected type (%s) in record I/O processing",
07657 MTYPE_name(TY_mtype(ty)));
07658
07659 }
07660 } while (! FLD_last_field (fld_iter++));
07661
07662 if (*icount) {
07663 word = 0;
07664 if (Target_Byte_Sex == LITTLE_ENDIAN) {
07665 iolist_header_ptr = (iolist_header_type *)&word;
07666 iolist_header_ptr->version = 1;
07667 iolist_header_ptr->iolfirst = (first_last == 2 || first_last == 3) ? 1 : 0;
07668 iolist_header_ptr->iollast = (first_last == 1 || first_last == 3) ? 1 : 0;
07669 iolist_header_ptr->icount = *icount;
07670 iolist_header_ptr->ioetsize = *iolist_size;
07671 } else {
07672 word = ( (UINT64) 1 << 61) |
07673 ( (UINT64) first_last << 32) |
07674 ( (UINT64) *icount << 16) |
07675 ( (UINT64) *iolist_size );
07676 }
07677 Set_TY_size(*iolist_ty, *offset);
07678 Set_FLD_last_field (last_field);
07679 Make_Cray_Io_Call( block, form, iostat1, iostat2, cilist_wn,
07680 stack_wn, *iolist_st, word);
07681
07682 *icount = 0;
07683 *offset = 8;
07684 *iolist_st = Get_IoStruct_ST ( block, FID_CRAY_IOLIST, FALSE);
07685 *iolist_ty = fiostruct_ty[FID_CRAY_IOLIST];
07686 *iolist_size = 8/Pointer_Size;
07687 last_field = TY_fld (Ty_Table[ST_type(*iolist_st)]);
07688 }
07689 }
07690
07691 static INT32
07692 lower_f77_io_items ( WN * block, WN * tree, WN *cilist_wn,
07693 WN *iostat1, WN *iostat2,
07694 FIOOPER form, INT32 nested,
07695 INT32 *offset,
07696 INT32 kid_first, INT32 kid_last )
07697 {
07698 INT32 icount, i, itm;
07699 INT32 ioentsize;
07700 INT32 header_offset;
07701 UINT64 word;
07702 static ST *iolist_st;
07703 static TY_IDX iolist_ty;
07704 static FLD_HANDLE last_field;
07705 INT32 iolistsize;
07706 WN *item;
07707 static WN *stack_wn;
07708 INT32 iomode;
07709 INT32 iend;
07710 BOOL last_loop = FALSE;
07711 iolist_header_type *iolist_header_ptr;
07712 #define WRITE_STMT 0
07713 #define READ_STMT 1
07714
07715 #ifdef _IO_DEBUG
07716 if (!nested) {
07717 fprintf(stderr, "\n\n\n" );
07718 dump_tree(tree);
07719 }
07720 #endif
07721 if (form == FIO_CR_READ_FORMATTED || form == FIO_CR_READ_UNFORMATTED
07722 || form == FIO_CR_READ_NAMELIST)
07723 iomode = READ_STMT;
07724 else
07725 iomode = WRITE_STMT;
07726
07727 if (nested == FALSE) {
07728 first_last = 2;
07729 iolist_st = NULL;
07730 iolist_ty = (TY_IDX) 0;
07731 last_field = FLD_HANDLE();
07732 }
07733
07734 for (i = 0; i <= MAX_DIM; i++) {
07735 if (!dope_vector_ty[ i ]) {
07736 make_dope_vector_ty(i);
07737 }
07738 }
07739
07740 if (nested != NESTED_DOPE) {
07741 cwh_io_unmark();
07742 if (stack_ty == (TY_IDX) 0)
07743 stack_ty = Make_Simple_Array_Type("stack_space_type", STACK_LENGTH,
07744 Be_Type_Tbl(MTYPE_U8));
07745 if (Current_pu != cray_iolist_current_pu) {
07746 cray_iolist_current_pu = Current_pu;
07747 stack_st = Gen_Temp_Symbol ( stack_ty, TY_name(stack_ty) );
07748 }
07749 stack_wn = WN_CreateLda (opc_lda, 0,
07750 Make_Pointer_Type (stack_ty, FALSE), stack_st);
07751 io_set_addr_passed_flag(stack_st);
07752
07753 } else {
07754
07755
07756
07757
07758 FLD_HANDLE fld = New_FLD ();
07759 FLD_Init (fld, Save_Str("implied_do_iolist_header"),
07760 Be_Type_Tbl (MTYPE_U8), *offset);
07761 last_field = fld;
07762 }
07763
07764
07765 for (itm=kid_first; itm<kid_last; ) {
07766 if (last_loop)
07767
07768
07769
07770 *offset = 0;
07771 else if (nested != NESTED_DOPE && !last_loop) {
07772
07773 iolist_st = Get_IoStruct_ST ( block, FID_CRAY_IOLIST, FALSE);
07774 iolist_ty = fiostruct_ty[FID_CRAY_IOLIST];
07775 last_field = TY_flist (Ty_Table [iolist_ty]);
07776
07777 *offset = 0;
07778 }
07779
07780
07781
07782 header_offset = *offset;
07783 *offset += 8;
07784 iolistsize = 8/Pointer_Size;
07785 icount = 0;
07786 if (nested != NESTED_DOPE) {
07787 iend = itm;
07788 while (iend < kid_last) {
07789 item = WN_kid(tree,iend);
07790 if (cwh_io_analyse_io_item( item, NULL, iomode ))
07791 break;;
07792 iend++;
07793 }
07794 }
07795 else {
07796 iend = kid_last;
07797 }
07798
07799 if (itm == iend) {
07800
07801
07802
07803
07804
07805 if (first_last) {
07806 Create_Null_Call( block, form, cilist_wn, iostat1, iostat2,
07807 stack_wn);
07808 }
07809 item = WN_kid(tree,itm);
07810
07811
07812
07813
07814
07815 ioentsize = Create_Io_Entry( block, item, cilist_wn, stack_wn,
07816 iostat1, iostat2, form, &iolist_st,
07817 &iolist_ty, &iolistsize,
07818 last_field, offset, &icount, nested, TRUE);
07819 itm++;
07820 if (!ioentsize) {
07821
07822
07823
07824 if (!nested) {
07825 last_loop = TRUE;
07826 cwh_stab_free_auxst();
07827 }
07828 continue;
07829 }
07830 else {
07831
07832 iolistsize += ioentsize;
07833 last_loop = FALSE;
07834 }
07835 } else {
07836
07837 last_loop = FALSE;
07838 while (itm < iend) {
07839 item = WN_kid(tree,itm);
07840 ioentsize = Create_Io_Entry( block, item, cilist_wn, stack_wn,
07841 iostat1, iostat2, form, &iolist_st,
07842 &iolist_ty, &iolistsize,
07843 last_field, offset, &icount, nested, FALSE);
07844
07845 iolistsize += ioentsize;
07846 itm++;
07847 if (!ioentsize && !nested)
07848 last_loop = TRUE;
07849 else
07850 last_loop = FALSE;
07851 }
07852 }
07853
07854
07855
07856
07857 if (last_loop) {
07858 if (!nested)
07859 cwh_stab_free_auxst();
07860 continue;
07861 }
07862 if (!nested) {
07863
07864
07865
07866
07867 if (icount) {
07868 if (iend >= kid_last || itm >= kid_last)
07869 first_last |= 1;
07870 word = 0;
07871 if (Target_Byte_Sex == LITTLE_ENDIAN) {
07872 iolist_header_ptr = (iolist_header_type *)&word;
07873 iolist_header_ptr->version = 1;
07874 iolist_header_ptr->iolfirst = (first_last == 2 || first_last == 3) ? 1 : 0;
07875 iolist_header_ptr->iollast = (first_last == 1 || first_last == 3) ? 1 : 0;
07876 iolist_header_ptr->icount = icount;
07877 iolist_header_ptr->ioetsize = iolistsize;
07878 } else {
07879 word = ( (UINT64) 1 << 61) |
07880 ( (UINT64) first_last << 32) |
07881 ( (UINT64) icount << 16) |
07882 ( (UINT64) iolistsize );
07883 }
07884 Set_TY_size (Ty_Table [iolist_ty], *offset);
07885 Set_FLD_last_field (last_field);
07886 Make_Cray_Io_Call( block, form, iostat1, iostat2, cilist_wn,
07887 stack_wn, iolist_st, word);
07888 }
07889 cwh_io_unmark();
07890 } else if (nested == NESTED_ITEM) {
07891
07892
07893
07894
07895 word = 0;
07896 if (Target_Byte_Sex == LITTLE_ENDIAN) {
07897 iolist_header_ptr = (iolist_header_type *)&word;
07898 iolist_header_ptr->version = 1;
07899 iolist_header_ptr->icount = icount;
07900 iolist_header_ptr->ioetsize = iolistsize;
07901 } else {
07902 word = ( (UINT64) 1 << 61) |
07903 ( (UINT64) icount << 16) |
07904 ( (UINT64) iolistsize );
07905 }
07906
07907 Set_TY_size (Ty_Table [iolist_ty], *offset);
07908 Set_FLD_last_field (last_field);
07909
07910 Make_Cray_Io_Call( block, form, iostat1, iostat2, cilist_wn,
07911 stack_wn, iolist_st, word);
07912 } else if (nested == NESTED_DOPE) {
07913 word = 0;
07914 if (Target_Byte_Sex == LITTLE_ENDIAN) {
07915 iolist_header_ptr = (iolist_header_type *)&word;
07916 iolist_header_ptr->version = 1;
07917 iolist_header_ptr->icount = icount;
07918 iolist_header_ptr->ioetsize = iolistsize;
07919 } else {
07920 word = ( (UINT64) 1 << 61) |
07921 ( (UINT64) icount << 16) |
07922 ( (UINT64) iolistsize );
07923 }
07924 Gen_Iolist_PutFieldConst( block, iolist_st, header_offset,
07925 MTYPE_U8, word);
07926 }
07927
07928
07929
07930 if (!nested)
07931 cwh_stab_free_auxst();
07932 }
07933
07934 if (last_loop || kid_first >= kid_last) {
07935
07936
07937
07938
07939
07940 first_last |= 1;
07941 Create_Null_Call( block, form, cilist_wn, iostat1, iostat2,
07942 stack_wn );
07943 }
07944 if (nested != NESTED_DOPE)
07945 cwh_io_unmark();
07946 return( iolistsize );
07947 }
07948
07949
07950 static void lower_cray_io_items ( WN * block, WN * tree, INT32 kid_first,
07951 INT32 kid_last, BOOL needs_new_iolist_table,
07952 INT32 *word_count, INT32 flflag,
07953
07954 WN *cilist_wn, FIOOPER form)
07955 {
07956 static ST *iolist_st;
07957 static TY_IDX iolist_ty;
07958 static FLD_HANDLE last_field;
07959 static INT32 offset;
07960 static INT32 iolistsize;
07961 TY_IDX ty;
07962 WN *item;
07963 UINT64 word;
07964 INT32 icount;
07965 INT32 i;
07966 INT32 j;
07967 INT32 ioentsize;
07968 INT32 valtype;
07969 INT32 bound_check;
07970 INT32 indflag;
07971 IOITEM io_item;
07972 WN *kid0, *char_len;
07973 WN *wn;
07974 WN *dope_kid;
07975 INT32 save_impdo_word1_offset;
07976 INT32 save_iotable_word1_offset;
07977 WN *iolist_wn = NULL;
07978 UINT64 cray_type;
07979 WN *stack_wn = NULL;
07980 WN *dummy;
07981 ioentry_header_type *ioentry_header_ptr;
07982 ioarray_entry_type *ioarray_entry_ptr;
07983 iolist_header_type *iolist_header_ptr;
07984
07985 if (stack_ty == (TY_IDX) 0)
07986 stack_ty = Make_Simple_Array_Type("stack_space_type", STACK_LENGTH,
07987 Be_Type_Tbl(MTYPE_U8));
07988
07989 if (Current_pu != cray_iolist_current_pu) {
07990 cray_iolist_current_pu = Current_pu;
07991 stack_st = Gen_Temp_Symbol ( stack_ty, TY_name(stack_ty) );
07992 io_set_addr_passed_flag(stack_st);
07993 container_block_for_iolists = NULL;
07994 num_iolists = 0;
07995 }
07996
07997 stack_wn = WN_CreateLda (opc_lda, 0,
07998 Make_Pointer_Type (ST_type(stack_st), FALSE),
07999 stack_st);
08000
08001 if (needs_new_iolist_table) {
08002 iolist_st = Get_IoStruct_ST ( block, FID_CRAY_IOLIST, FALSE);
08003 iolist_ty = fiostruct_ty[FID_CRAY_IOLIST];
08004 save_iotable_word1_offset = 0;
08005 offset = 8;
08006 iolistsize = 8/Pointer_Size;
08007 } else {
08008 save_iotable_word1_offset = offset;
08009 FLD_HANDLE field = New_FLD ();
08010 FLD_Init (field, Save_Str("cray_iol_head"),
08011 Be_Type_Tbl (MTYPE_U8), offset);
08012 offset += 8;
08013 iolistsize += 8/Pointer_Size;
08014 }
08015
08016 *word_count = 8/Pointer_Size;
08017
08018 icount = kid_last - kid_first;
08019
08020
08021
08022 for (i=kid_first; i<kid_last; i++) {
08023
08024 item = WN_kid(tree,i);
08025 io_item = (IOITEM) WN_intrinsic(item);
08026 switch (io_item) {
08027
08028 case IOL_EXPR:
08029 {
08030 kid0 = WN_kid0(item);
08031 ty = WN_ty(item);
08032
08033 if (TY_kind(ty) != KIND_STRUCT &&
08034 TY_kind(ty) == KIND_SCALAR &&
08035 TY_kind(ty) == KIND_POINTER)
08036 Fail_FmtAssertion(
08037 "unexpected machine type (%s) for IOL_EXPR in IO Processing",
08038 MTYPE_name(TY_mtype(ty)));
08039
08040 cray_type = WN_const_val(WN_kid1(item));
08041
08042 valtype = 1;
08043 if (Pointer_Size == 4)
08044 ioentsize = 6;
08045 else
08046 ioentsize = 4;
08047
08048 FLD_HANDLE fld = New_FLD ();
08049 FLD_Init (fld, Save_Str("scalar_word1"),
08050 Be_Type_Tbl(MTYPE_U8), offset);
08051
08052 word = 0;
08053 if (Target_Byte_Sex == LITTLE_ENDIAN) {
08054 ioentry_header_ptr = (ioentry_header_type *)&word;
08055 ioentry_header_ptr->valtype = valtype;
08056 ioentry_header_ptr->ioentsize = ioentsize;
08057 } else {
08058 word = ( (UINT64) valtype << 56) |
08059 ( (UINT64) ioentsize );
08060 }
08061 Gen_Iolist_PutFieldConst( block, iolist_st, offset, MTYPE_U8,
08062 word );
08063 offset += 8;
08064
08065 fld = New_FLD ();
08066 FLD_Init (fld, Save_Str("scalar_word2"),
08067 Be_Type_Tbl (MTYPE_U8), offset);
08068
08069 word = (UINT64) cray_type;
08070 Gen_Iolist_PutFieldConst( block, iolist_st, offset, MTYPE_U8,
08071 word);
08072 offset += 8;
08073
08074 fld = New_FLD ();
08075 FLD_Init (fld, Save_Str("addr_of_scalar"),
08076 Be_Type_Tbl (Pointer_type), offset);
08077
08078 wn = create_pointer_to_node (block, kid0, ty, FALSE);
08079 Gen_Iolist_PutAddrWN ( block, iolist_st, offset, Pointer_type,
08080 wn );
08081 offset += fcd_size;
08082
08083 iolistsize += ioentsize;
08084 *word_count += ioentsize;
08085 break;
08086 }
08087
08088 case IOL_VAR:
08089 {
08090 kid0 = WN_kid0(item);
08091 ty = WN_ty(item);
08092
08093 if (TY_kind(ty) != KIND_STRUCT &&
08094 TY_kind(ty) == KIND_SCALAR &&
08095 TY_kind(ty) == KIND_POINTER)
08096 Fail_FmtAssertion(
08097 "unexpected machine type (%s) for IOL_EXPR in IO Processing",
08098 MTYPE_name(TY_mtype(ty)));
08099
08100 cray_type = WN_const_val(WN_kid1(item));
08101
08102 valtype = 1;
08103 if (Pointer_Size == 4)
08104 ioentsize = 6;
08105 else
08106 ioentsize = 4;
08107
08108 FLD_HANDLE fld = New_FLD ();
08109 FLD_Init(fld, Save_Str("scalar_word1"),
08110 Be_Type_Tbl (MTYPE_U8), offset);
08111
08112 word = 0;
08113 if (Target_Byte_Sex == LITTLE_ENDIAN) {
08114 ioentry_header_ptr = (ioentry_header_type *)&word;
08115 ioentry_header_ptr->valtype = valtype;
08116 ioentry_header_ptr->ioentsize = ioentsize;
08117 } else {
08118 word = ( (UINT64) valtype << 56) |
08119 ( (UINT64) ioentsize );
08120 }
08121 Gen_Iolist_PutFieldConst( block, iolist_st, offset, MTYPE_U8,
08122 word );
08123 offset += 8;
08124
08125 fld = New_FLD ();
08126 FLD_Init(fld, Save_Str("scalar_word2"),
08127 Be_Type_Tbl (MTYPE_U8), offset);
08128
08129 word = (UINT64) cray_type;
08130 Gen_Iolist_PutFieldConst( block, iolist_st, offset, MTYPE_U8,
08131 word);
08132 offset += 8;
08133
08134 fld = New_FLD ();
08135 FLD_Init(fld, Save_Str("addr_of_scalar"),
08136 Be_Type_Tbl (Pointer_type), offset);
08137
08138 Gen_Iolist_PutAddrWN ( block, iolist_st, offset, Pointer_type,
08139 kid0 );
08140 offset += fcd_size;
08141
08142 iolistsize += ioentsize;
08143 *word_count += ioentsize;
08144 break;
08145 }
08146
08147 case IOL_CHAR:
08148 {
08149 kid0 = WN_kid0(item);
08150 char_len = WN_kid2(item);
08151 valtype = 1;
08152 cray_type = WN_const_val(WN_kid1(item));
08153
08154 if (Pointer_Size == 4)
08155 ioentsize = 6;
08156 else
08157 ioentsize = 4;
08158
08159 FLD_HANDLE fld = New_FLD ();
08160 FLD_Init(fld, Save_Str("char_word1"),
08161 Be_Type_Tbl (MTYPE_U8), offset);
08162
08163 word = 0;
08164 if (Target_Byte_Sex == LITTLE_ENDIAN) {
08165 ioentry_header_ptr = (ioentry_header_type *)&word;
08166 ioentry_header_ptr->valtype = valtype;
08167 ioentry_header_ptr->ioentsize = ioentsize;
08168 } else {
08169 word = ( (UINT64) valtype << 56) |
08170 ( (UINT64) ioentsize );
08171 }
08172 Gen_Iolist_PutFieldConst( block, iolist_st, offset, MTYPE_U8,
08173 word);
08174 offset += 8;
08175
08176 fld = New_FLD ();
08177 FLD_Init(fld, Save_Str("char_word2"),
08178 Be_Type_Tbl (MTYPE_U8), offset);
08179
08180 word = (UINT64) cray_type;
08181 Gen_Iolist_PutFieldConst( block, iolist_st, offset, MTYPE_U8,
08182 word);
08183 offset += 8;
08184
08185 fld = New_FLD ();
08186 FLD_Init(fld, Save_Str("fcd_item_addr"),
08187 Be_Type_Tbl (Pointer_type), offset);
08188
08189 Gen_Iolist_PutAddrWN ( block, iolist_st, offset, Pointer_type,
08190 kid0 );
08191 offset += Pointer_Size;
08192
08193 fld = New_FLD ();
08194 FLD_Init(fld, Save_Str("fcd_item_len"),
08195 Be_Type_Tbl (Pointer_type), offset);
08196
08197 Gen_Iolist_PutFieldWN ( block, iolist_st, offset, Pointer_type,
08198 char_len );
08199 offset += Pointer_Size;
08200
08201 iolistsize += ioentsize;
08202 *word_count += ioentsize;
08203 break;
08204 }
08205
08206 case IOL_DOPE:
08207 {
08208
08209 kid0 = WN_kid0(item);
08210 bound_check = 0;
08211 valtype = 2;
08212 if (WN_kid_count(item) == 2) {
08213 indflag = 0;
08214 if (Pointer_Size == 4)
08215 ioentsize = 5;
08216 else
08217 ioentsize = 3;
08218 } else {
08219 indflag = 1;
08220 if (Pointer_Size == 4)
08221 ioentsize = 5 + WN_kid_count(item) - 2;
08222 else
08223 ioentsize = 3 + WN_kid_count(item) - 2;
08224 }
08225
08226
08227
08228
08229
08230 dummy = WN_kid1(item);
08231 Add_To_Dummy_List(dummy);
08232
08233 FLD_HANDLE fld = New_FLD ();
08234 FLD_Init(fld, Save_Str("dope_word1"),
08235 Be_Type_Tbl (MTYPE_U8), offset);
08236
08237 word = 0;
08238 if (Target_Byte_Sex == LITTLE_ENDIAN) {
08239 ioentry_header_ptr = (ioentry_header_type *)&word;
08240 ioentry_header_ptr->valtype = valtype;
08241 ioentry_header_ptr->ioentsize = ioentsize;
08242 } else {
08243 word = ( (UINT64) valtype << 56) |
08244 ( (UINT64) ioentsize );
08245 }
08246 Gen_Iolist_PutFieldConst( block, iolist_st, offset, MTYPE_U8,
08247 word );
08248 offset += 8;
08249
08250 fld = New_FLD ();
08251 FLD_Init(fld, Save_Str("dope_addr"),
08252 Be_Type_Tbl (Pointer_type), offset);
08253
08254 Gen_Iolist_PutAddrWN ( block, iolist_st, offset, Pointer_type,
08255 kid0 );
08256 offset += Pointer_Size;
08257
08258 fld = New_FLD ();
08259 FLD_Init(fld, Save_Str("dope_word3"),
08260 Be_Type_Tbl (MTYPE_U8), offset);
08261
08262 word = 0;
08263 if (Target_Byte_Sex == LITTLE_ENDIAN) {
08264 ioarray_entry_ptr = (ioarray_entry_type *)&word;
08265 ioarray_entry_ptr->indflag = indflag;
08266 ioarray_entry_ptr->boundchk = bound_check;
08267 } else {
08268 word = ( (UINT64) indflag << 63) |
08269 ( (UINT64) bound_check << 62);
08270 }
08271 Gen_Iolist_PutFieldConst( block, iolist_st, offset, MTYPE_U8,
08272 word );
08273 offset += 8;
08274
08275 if (indflag == 1) {
08276 char str[64];
08277 strcpy(str,"dope_dim");
08278 for (j=2; j<WN_kid_count(item); j++) {
08279 sprintf(&str[8], "%d", j);
08280 dope_kid = WN_kid(item,j);
08281 if ((WN_operator(dope_kid) == OPR_INTCONST) &&
08282 (WN_const_val(dope_kid) == 0)) {
08283 fld = New_FLD ();
08284 FLD_Init(fld, Save_Str(str),
08285 Be_Type_Tbl (Pointer_type), offset);
08286 Gen_Iolist_PutFieldConst( block, iolist_st, offset,
08287 Pointer_type, 0);
08288 offset += Pointer_Size;
08289 } else {
08290 fld = New_FLD ();
08291 FLD_Init(fld, Save_Str(str),
08292 Be_Type_Tbl (Pointer_type), offset);
08293 wn = create_pointer_to_node (block, dope_kid,
08294 (TY_IDX) 0, TRUE);
08295 Gen_Iolist_PutAddrWN ( block, iolist_st, offset,
08296 Pointer_type, wn );
08297 offset += Pointer_Size;
08298 }
08299 }
08300 }
08301 iolistsize += ioentsize;
08302 *word_count += ioentsize;
08303 break;
08304 }
08305
08306 case IOL_IMPLIED_DO:
08307 {
08308
08309 valtype = 3;
08310 save_impdo_word1_offset = offset;
08311
08312 FLD_HANDLE fld = New_FLD ();
08313 FLD_Init(fld, Save_Str("imp_do_word1"),
08314 Be_Type_Tbl (MTYPE_U8), offset);
08315
08316 offset += 8;
08317
08318 fld = New_FLD ();
08319 FLD_Init(fld, Save_Str("imp_do_loop_var"),
08320 Be_Type_Tbl (Pointer_type), offset);
08321
08322 wn = WN_CreateLda (
08323 opc_lda, 0,
08324 Make_Pointer_Type(ST_type(WN_st(WN_index(item))),
08325 FALSE),
08326 WN_st(WN_index(item)));
08327
08328 io_set_addr_passed_flag(WN_st(WN_index(item)));
08329 Gen_Iolist_PutAddrWN ( block, iolist_st, offset, Pointer_type,
08330 wn );
08331 offset += Pointer_Size;
08332
08333 fld = New_FLD ();
08334 FLD_Init(fld, Save_Str("imp_do_start"),
08335 Be_Type_Tbl (Pointer_type), offset);
08336
08337 wn = create_pointer_to_node (block, WN_start(item),
08338 (TY_IDX) 0, TRUE);
08339 Gen_Iolist_PutAddrWN ( block, iolist_st, offset, Pointer_type,
08340 wn );
08341 offset += Pointer_Size;
08342
08343 fld = New_FLD ();
08344 FLD_Init(fld, Save_Str("imp_do_end"),
08345 Be_Type_Tbl (Pointer_type), offset);
08346
08347 wn = create_pointer_to_node (block, WN_end(item), (TY_IDX) 0,
08348 TRUE);
08349 Gen_Iolist_PutAddrWN ( block, iolist_st, offset, Pointer_type,
08350 wn );
08351 offset += Pointer_Size;
08352
08353 fld = New_FLD ();
08354 FLD_Init(fld, Save_Str("imp_do_incr"),
08355 Be_Type_Tbl (Pointer_type), offset);
08356
08357 wn = create_pointer_to_node (block, WN_step(item),
08358 (TY_IDX) 0, TRUE);
08359 Gen_Iolist_PutAddrWN ( block, iolist_st, offset, Pointer_type,
08360 wn );
08361 offset += Pointer_Size;
08362
08363 ioentsize = 0;
08364 lower_cray_io_items(block, item, 4, WN_kid_count(item),
08365 FALSE, &ioentsize, flflag, cilist_wn, form);
08366 if (Pointer_Size == 4) {
08367 ioentsize = ioentsize + 6;
08368 iolistsize += 6;
08369 } else {
08370 ioentsize = ioentsize + 5;
08371 iolistsize += 5;
08372 }
08373 *word_count += ioentsize;
08374
08375 word = 0;
08376 if (Target_Byte_Sex == LITTLE_ENDIAN) {
08377 ioentry_header_ptr = (ioentry_header_type *)&word;
08378 ioentry_header_ptr->valtype = valtype;
08379 ioentry_header_ptr->ioentsize = ioentsize;
08380 } else {
08381 word = ( (UINT64) valtype << 56) |
08382 ( (UINT64) ioentsize );
08383 }
08384 Gen_Iolist_PutFieldConst( block, iolist_st,
08385 save_impdo_word1_offset, MTYPE_U8, word);
08386 break;
08387 }
08388
08389 default:
08390 break;
08391
08392 }
08393 }
08394
08395 if (needs_new_iolist_table) {
08396 word = 0;
08397 if (Target_Byte_Sex == LITTLE_ENDIAN) {
08398 iolist_header_ptr = (iolist_header_type *)&word;
08399 iolist_header_ptr->version = 1;
08400 iolist_header_ptr->iolfirst = (flflag == 2 || flflag == 3) ? 1 : 0;
08401 iolist_header_ptr->iollast = (flflag == 1 || flflag == 3) ? 1 : 0;
08402 iolist_header_ptr->icount = icount;
08403 iolist_header_ptr->ioetsize = iolistsize;
08404 } else {
08405 word = ( (UINT64) 1 << 61) |
08406 ( (UINT64) flflag << 32) |
08407 ( (UINT64) icount << 16) |
08408 ( (UINT64) iolistsize );
08409 }
08410 Set_TY_size (Ty_Table[iolist_ty], offset);
08411 Gen_Iolist_PutFieldConst (block, iolist_st, save_iotable_word1_offset,
08412 MTYPE_U8, word);
08413 Enter_TY(iolist_ty);
08414 if (container_block_for_iolists == NULL) {
08415 container_block_for_iolists = iolist_st;
08416 num_iolists++;
08417 } else {
08418 if (num_iolists == iolist_reuse_limit) {
08419 num_iolists = 1;
08420 container_block_for_iolists = iolist_st;
08421 } else {
08422
08423
08424
08425 St_Block_Union(container_block_for_iolists, iolist_st);
08426 num_iolists++;
08427 }
08428 }
08429 iolist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(iolist_st)),
08430 iolist_st);
08431
08432 if (PU_has_region(Get_Current_PU())) {
08433
08434
08435
08436
08437
08438
08439 GEN_IO_CALL_3 ( block, form, NULL, cr_iostat2, cilist_wn,
08440 iolist_wn, stack_wn);
08441 } else {
08442 if (LAST_CALL(flflag)) {
08443 GEN_IO_CALL_3 ( block, form, NULL, cr_iostat2, cilist_wn,
08444 iolist_wn, stack_wn);
08445 } else {
08446 GEN_IO_CALL_3 ( block, form, cr_iostat1, NULL, cilist_wn,
08447 iolist_wn, stack_wn);
08448 }
08449 }
08450
08451 } else {
08452 word = 0;
08453 if (Target_Byte_Sex == LITTLE_ENDIAN) {
08454 iolist_header_ptr = (iolist_header_type *)&word;
08455 iolist_header_ptr->version = 1;
08456 iolist_header_ptr->iolfirst = 0;
08457 iolist_header_ptr->iollast = 0;
08458 iolist_header_ptr->icount = icount;
08459 iolist_header_ptr->ioetsize = *word_count;
08460 } else {
08461 word = ( (UINT64) 1 << 61) |
08462 ( (UINT64) 0 << 33) |
08463 ( (UINT64) 0 << 32) |
08464 ( (UINT64) icount << 16) |
08465 ( (UINT64) *word_count );
08466 }
08467 Gen_Iolist_PutFieldConst (block, iolist_st, save_iotable_word1_offset,
08468 MTYPE_U8, word);
08469 }
08470 }
08471
08472
08473
08474
08475
08476
08477
08478
08479
08480
08481
08482 WN *lower_io_statement (WN *tree, LOWER_ACTIONS actions)
08483 {
08484 INT32 keytype;
08485 INT32 iolist;
08486 INT32 iomask;
08487 INT32 eeeflag = 0;
08488 INT32 iostat_flag = 0;
08489 INT32 eor_flag = 0;
08490 INT32 end_flag = 0;
08491 INT32 err_flag = 0;
08492 INT32 unit_flag;
08493 INT32 advance_flag = 0;
08494 INT32 is_direct = 0;
08495 INT32 is_internal_io;
08496 INT32 fmt_flag = 0;
08497 INT32 stk_size = 25;
08498 INT32 key_spec_item_size = 0;
08499 INT32 offset = 0;
08500 UINT64 word1;
08501 WN **key_spec_items = NULL;
08502 INT32 nkeys = 0;
08503 INT64 matchtype;
08504 IOITEM ioitem_tmp;
08505 IOITEM unit_type;
08506 IOITEM format_type;
08507 BOOL errstat;
08508 BOOL endstat;
08509 FIOCLASS ioclass;
08510 SRCPOS srcpos;
08511 WN *wn;
08512 WN *wnx;
08513 WN *kid0;
08514 WN *unit_wn = NULL;
08515 WN *pure_unit_wn = NULL;
08516 WN *unit_len;
08517 WN *unit_rec;
08518 WN *kid1;
08519 WN *format_wn;
08520 WN *fmtsrc_wn = NULL;
08521 WN *parsfmt_wn = NULL;
08522 WN *size_wn = NULL;
08523 WN *advance_wn = NULL;
08524 WN *rec_wn = NULL;
08525 WN *varfmt = NULL;
08526 WN *varfmtfp;
08527 WN *block;
08528 WN *wn_tmp;
08529 WN *items[IOITEM_LAST + 1];
08530 WN *itemsx[IOITEM_LAST + 1];
08531 WN *iostat = NULL;
08532 WN *inqlength = NULL;
08533 WN *iostat1;
08534 WN *iostat2;
08535 WN *cilist_wn = NULL;
08536 WN *arg1;
08537 WN *arg2;
08538 WN *stack_wn = NULL;
08539 WN *dummy;
08540 ST *st, *stkey;
08541 LABEL_IDX err = 0;
08542 LABEL_IDX end = 0;
08543 LABEL_IDX eor = 0;
08544 ST *unit_ptr;
08545 IOSTATEMENT iostatement;
08546 TCON tcon;
08547 INT32 table_size;
08548 INT32 flflag;
08549 INT32 edflag = 0;
08550 TY_IDX ty;
08551 BOOL iostat_processing_not_done = TRUE;
08552 BOOL zero_escape_freq = FALSE;
08553 cilist_header_type *cilist_header_ptr;
08554
08555 #ifdef IO_DEBUG
08556 USRCPOS s;
08557 INT32 lineno;
08558 s.srcpos = WN_Get_Linenum ( tree );
08559 lineno = USRCPOS_linenum(s);
08560 fprintf(stderr, "Processing I/O at line number %d\n", lineno);
08561 #endif
08562
08563
08564 Is_True(WN_opcode(tree) == OPC_IO,
08565 ("expected io statement node, not %s", OPCODE_name(WN_opcode(tree))));
08566 Is_True(Action(LOWER_IO_STATEMENT),
08567 ("actions does not contain LOWER_IO_STATEMENT"));
08568 Is_True(WN_kid_count(tree) >= 2,
08569 ("too few kids in io statement node"));
08570 Is_True(WN_io_item(WN_kid0(tree)) <= IOU_DOPE,
08571 ("io statement kid0 not a unit IOITEM"));
08572 Is_True((WN_io_item(WN_kid1(tree)) >= IOF_NONE) &&
08573 (WN_io_item(WN_kid1(tree)) <= IOF_CR_FMTSRC_DOPE),
08574 ("io statement kid1 not a format IOITEM"));
08575
08576
08577
08578 fio_dummy_count = 0;
08579 namelist_node = NULL;
08580 copyout_block = NULL;
08581 num_impl = 0;
08582
08583
08584 switch (WN_IO_Library(tree)) {
08585 case IOLIB_MIPS:
08586 case IOLIB_CRAY:
08587 current_io_library = WN_IO_Library(tree);
08588 break;
08589 default:
08590 Lmt_DevWarn(1,("I/O library unspecified"));
08591 current_io_library = (IOLIB) target_io_library;
08592 break;
08593 }
08594
08595
08596
08597 if (Pointer_Mtype == MTYPE_A4) {
08598 opc_lda = OPC_A4LDA;
08599 opc_const = OPC_A4INTCONST;
08600 fcd_size = fiostructid_info[FID_CRAY_FCD].size32;
08601 } else if (Pointer_Mtype == MTYPE_A8) {
08602 opc_lda = OPC_A8LDA;
08603 opc_const = OPC_A8INTCONST;
08604 fcd_size = fiostructid_info[FID_CRAY_FCD].size64;
08605 } else if (Pointer_Mtype == MTYPE_U4) {
08606 opc_lda = OPC_U4LDA;
08607 opc_const = OPC_U4INTCONST;
08608 fcd_size = fiostructid_info[FID_CRAY_FCD].size32;
08609 } else {
08610 opc_lda = OPC_U8LDA;
08611 opc_const = OPC_U8INTCONST;
08612 fcd_size = fiostructid_info[FID_CRAY_FCD].size64;
08613 }
08614
08615
08616
08617
08618
08619 block = WN_CreateBlock();
08620
08621 if (Language == LANG_F77) {
08622
08623
08624
08625 if (WN_io_statement(tree) == IOS_NAMELIST) {
08626 if (namelist_current_pu != Current_pu) {
08627 namelist_current_pu = Current_pu;
08628 namelist_node_list = NULL;
08629 }
08630 WN_next(tree) = namelist_node_list;
08631 namelist_node_list = tree;
08632 return (block);
08633 }
08634 }
08635
08636
08637
08638 kid0 = WN_kid0(tree);
08639 unit_type = (IOITEM) WN_io_item(kid0);
08640 switch (unit_type) {
08641 case IOU_NONE:
08642 unit_wn = NULL;
08643 unit_flag = 1;
08644 is_internal_io = 0;
08645 break;
08646 case IOU_DEFAULT:
08647 if (current_io_library == IOLIB_CRAY) {
08648 #ifndef KEY // bug 8586
08649 WN* unit = WN_kid0(kid0);
08650 if (WN_operator_is(unit,OPR_INTCONST) ||
08651 WN_operator_is(unit,OPR_LDID)) {
08652 INT32 ret_type = WN_rtype(unit);
08653 if (ret_type != MTYPE_I4 && ret_type != MTYPE_U4) {
08654 Fail_FmtAssertion("unexpected unit type (%d) in I/O processing", ret_type);
08655 }
08656 }
08657 #endif
08658
08659 if (WN_operator_is(WN_kid0(kid0), OPR_INTCONST) &&
08660 WN_const_val(WN_kid0(kid0)) == 0) {
08661
08662
08663
08664 unit_wn = create_pointer_to_node(block, WN_kid0(kid0),
08665 (TY_IDX) 0, TRUE);
08666 unit_flag = 0;
08667 }
08668 else {
08669 unit_wn = NULL;
08670 unit_flag = 1;
08671 }
08672 is_internal_io = 0;
08673 }
08674 else
08675 unit_wn = extract_calls ( block, WN_kid0(kid0) );
08676 break;
08677 case IOU_EXTERNAL:
08678 if (current_io_library == IOLIB_MIPS)
08679 unit_wn = extract_calls ( block, WN_kid0(kid0) );
08680 else {
08681
08682
08683
08684
08685
08686
08687
08688 pure_unit_wn = WN_kid0(kid0);
08689 #ifndef KEY // bug 8586
08690 if (WN_operator_is(pure_unit_wn,OPR_INTCONST) ||
08691 WN_operator_is(pure_unit_wn,OPR_LDID)) {
08692 INT32 ret_type = WN_rtype(pure_unit_wn);
08693 if (ret_type != MTYPE_I4 && ret_type != MTYPE_U4) {
08694 Fail_FmtAssertion("unexpected unit type (%d) in I/O processing", ret_type);
08695 }
08696 }
08697 #endif
08698
08699 unit_wn = create_pointer_to_node(block, WN_kid0(kid0),
08700 (TY_IDX) 0, TRUE);
08701 unit_flag = 0;
08702 is_internal_io = 0;
08703 }
08704 break;
08705 case IOU_INTERNAL:
08706 if (current_io_library == IOLIB_MIPS) {
08707 unit_wn = extract_calls ( block, WN_kid0(kid0) );
08708 if (WN_kid_count(kid0) >= 2)
08709 unit_len = extract_calls ( block, WN_kid1(kid0) );
08710 else
08711 unit_len = NULL;
08712 if (WN_kid_count(kid0) == 3)
08713 unit_rec = extract_calls ( block, WN_kid2(kid0) );
08714 else
08715 unit_rec = NULL;
08716 } else {
08717 is_internal_io = 1;
08718
08719
08720
08721
08722
08723 if (WN_kid_count( kid0 ) > 2) {
08724 unit_flag = 3;
08725 unit_wn = Create_Dope_From_IoItem( block, kid0 );
08726 } else {
08727 unit_flag = 2;
08728 unit_wn = Create_fcd(block, WN_kid0(kid0), WN_kid1(kid0));
08729 }
08730 }
08731 break;
08732 case IOU_DOPE:
08733 is_internal_io = 1;
08734 unit_flag = 3;
08735 unit_wn = WN_kid0(kid0);
08736
08737
08738
08739
08740
08741 dummy = WN_kid1(kid0);
08742 Add_To_Dummy_List(dummy);
08743
08744 break;
08745 default:
08746 Fail_FmtAssertion("unexpected unit (%d) in I/O processing", unit_type);
08747 }
08748 WN_Delete ( kid0 );
08749
08750
08751
08752 kid1 = WN_kid1(tree);
08753 format_type = (IOITEM) WN_io_item(kid1);
08754 switch (format_type) {
08755 case IOF_NONE:
08756 format_wn = NULL;
08757 fmtsrc_wn = NULL;
08758 fmt_flag = 0;
08759 break;
08760 case IOF_LIST_DIRECTED:
08761 case IOF_UNFORMATTED:
08762 format_wn = NULL;
08763 fmt_flag = 0;
08764 break;
08765 case IOF_CHAR_EXPR:
08766 format_wn = extract_calls ( block, WN_kid0(kid1) );
08767 if (current_io_library == IOLIB_CRAY) {
08768 if (WN_kid_count(kid1) == 2) {
08769 fmtsrc_wn = Create_fcd(block, WN_kid0(kid1), WN_kid1(kid1) );
08770
08771 } else {
08772 fmtsrc_wn = WN_kid0(kid1);
08773
08774 }
08775
08776
08777
08778
08779
08780
08781
08782 fmt_flag = 3;
08783 }
08784 break;
08785 case IOF_LABEL:
08786 case IOF_ASSIGNED_VAR:
08787 format_wn = extract_calls ( block, WN_kid0(kid1) );
08788 if (current_io_library == IOLIB_CRAY) {
08789 if (WN_kid_count(kid1) == 2) {
08790 fmtsrc_wn = Create_fcd(block, WN_kid0(kid1), WN_kid1(kid1) );
08791
08792 } else {
08793 fmtsrc_wn = WN_kid0(kid1);
08794
08795 }
08796 fmt_flag = 3;
08797 }
08798 break;
08799 case IOF_CR_FMTSRC:
08800
08801 if (WN_kid_count(kid1) == 1 ) {
08802 fmt_flag = 3;
08803 fmtsrc_wn = WN_kid0(kid1);
08804 } else {
08805 fmt_flag = 1;
08806 fmtsrc_wn = Create_fcd(block, WN_kid0(kid1), WN_kid1(kid1) );
08807 }
08808 break;
08809 case IOF_CR_FMTSRC_DOPE:
08810 if (TY_is_character(Ty_Table [WN_ty(kid1)]))
08811 fmt_flag = 2;
08812 else
08813 fmt_flag = 4;
08814 fmtsrc_wn = WN_kid0(kid1);
08815
08816
08817
08818
08819
08820 dummy = WN_kid1(kid1);
08821 Add_To_Dummy_List(dummy);
08822
08823 break;
08824
08825 case IOF_NAMELIST_DIRECTED:
08826 #ifndef KEY
08827 if (Language == LANG_F90) {
08828 #else
08829 if (PU_f90_lang(Get_Current_PU())) {
08830 #endif
08831 INT32 i;
08832 fmt_flag = 5;
08833 for(i=0; i<WN_kid_count(kid1); i++)
08834 Add_To_Dummy_List(WN_kid(kid1,i));
08835 } else {
08836 format_wn = extract_calls ( block, WN_kid0(kid1) );
08837 if (WN_operator(format_wn) != OPR_LDA)
08838 Fail_FmtAssertion("namelist format error in I/O processing");
08839 namelist_node = namelist_node_list;
08840 while (namelist_node &&
08841 ((WN_st(format_wn) != WN_st(WN_kid0(WN_kid1(namelist_node)))) ||
08842 (WN_offset(format_wn) != WN_offset(WN_kid0(WN_kid1(namelist_node))))))
08843 namelist_node = WN_next(namelist_node);
08844 if (namelist_node == NULL)
08845 Fail_FmtAssertion("cannot locate namelist in I/O processing");
08846 fmt_flag = 5;
08847 }
08848 break;
08849 default:
08850 Fail_FmtAssertion("unexpected format (%d) in I/O processing",
08851 format_type);
08852 }
08853 WN_Delete ( kid1 );
08854
08855
08856
08857
08858
08859 BZERO ( items, sizeof(items) );
08860 BZERO ( itemsx, sizeof(itemsx) );
08861
08862 for (iolist=2; iolist<WN_kid_count(tree); iolist++) {
08863
08864 wn_tmp = WN_kid(tree,iolist);
08865 ioitem_tmp = (IOITEM) WN_io_item(wn_tmp);
08866 if (ioitem_tmp >= IOL_ARRAY)
08867 break;
08868
08869 switch (ioitem_tmp) {
08870
08871 case IOC_END:
08872 end = WN_label_number(WN_kid0(wn_tmp));
08873 if (current_io_library == IOLIB_CRAY)
08874 end_flag = 1;
08875
08876 break;
08877
08878 case IOC_ERR:
08879 err = WN_label_number(WN_kid0(wn_tmp));
08880 if (current_io_library == IOLIB_CRAY)
08881 err_flag = 1;
08882
08883 break;
08884
08885 case IOC_EOR:
08886 eor = WN_label_number(WN_kid0(wn_tmp));
08887 if (current_io_library == IOLIB_CRAY)
08888 eor_flag = 1;
08889
08890 break;
08891
08892 case IOC_ERRFLAG:
08893 items[ioitem_tmp] = WN_kid0(wn_tmp);
08894 break;
08895
08896 case IOC_READONLY:
08897 case IOC_SHARED:
08898 items[ioitem_tmp] = extract_calls ( block, WN_kid0(wn_tmp) );
08899 break;
08900
08901 case IOC_KEY_START:
08902 if (key_spec_item_size <= nkeys) {
08903 if (key_spec_items == NULL)
08904 key_spec_items = (WN **) malloc( (key_spec_item_size = 12) *
08905 sizeof(WN *) );
08906 else
08907 key_spec_items = (WN **) realloc( key_spec_items,
08908 (key_spec_item_size += 12) *
08909 sizeof(WN *) );
08910 }
08911 key_spec_items[nkeys++] = extract_calls ( block, WN_kid0(wn_tmp) );
08912 break;
08913
08914 case IOC_KEY_CHARACTER:
08915 case IOC_KEY_INTEGER:
08916 case IOC_KEY_END:
08917 key_spec_items[nkeys++] = extract_calls ( block, WN_kid0(wn_tmp) );
08918 break;
08919
08920 case IOC_REC:
08921 if (current_io_library == IOLIB_MIPS) {
08922 items[ioitem_tmp] = extract_calls ( block, WN_kid0(wn_tmp) );
08923 if (WN_kid_count(wn_tmp) == 2)
08924 itemsx[ioitem_tmp] = extract_calls ( block, WN_kid1(wn_tmp) );
08925 } else {
08926 rec_wn = create_pointer_to_node(block, WN_kid0(wn_tmp),
08927 (TY_IDX) 0, TRUE);
08928 is_direct = 1;
08929 }
08930 break;
08931 case IOC_IOSTAT:
08932 if (current_io_library == IOLIB_MIPS)
08933 iostat = extract_calls ( block, WN_kid0(wn_tmp) );
08934 else {
08935 #ifdef KEY
08936
08937
08938 if (PU_f90_lang(Get_Current_PU()))
08939 #else
08940 if (Language == LANG_F90)
08941 #endif // KEY
08942 iostat = get_32bit_cilist_item(WN_kid0(wn_tmp), WN_ty(wn_tmp));
08943 else
08944 iostat = WN_kid0(wn_tmp);
08945 iostat_flag = 1;
08946
08947 items[IOC_IOSTAT] = iostat;
08948 }
08949 break;
08950 case IOF_CR_PARSFMT:
08951
08952 parsfmt_wn = create_pointer_to_node(block, WN_kid0(wn_tmp),
08953 (TY_IDX) 0, TRUE);
08954 break;
08955 case IOC_SIZE:
08956 #ifdef KEY
08957
08958
08959 if (PU_f90_lang(Get_Current_PU())) {
08960 #else
08961 if (Language == LANG_F90) {
08962 #endif // KEY
08963 size_wn = get_32bit_cilist_item(WN_kid0(wn_tmp), WN_ty(wn_tmp));
08964 } else {
08965 size_wn = create_pointer_to_node(block, WN_kid0(wn_tmp),
08966 (TY_IDX) 0, TRUE);
08967 }
08968
08969 break;
08970 case IOC_ADVANCE:
08971 kid0 = WN_kid0(wn_tmp);
08972 if (WN_operator(kid0) == OPR_LDA) {
08973 char *str;
08974 st = WN_st(kid0);
08975 if (ST_class(st) == CLASS_CONST) {
08976 tcon = STC_val(st);
08977 if (TCON_ty(tcon) == MTYPE_STRING) {
08978 str = Index_to_char_array(TCON_cp(tcon));
08979 if (*str=='y' || *str=='Y')
08980 advance_flag = 0;
08981 else if (*str=='n' || *str=='N')
08982 advance_flag = 1;
08983 }
08984 } else {
08985 advance_flag = 2;
08986 }
08987 } else {
08988 advance_flag = 2;
08989 }
08990 advance_wn = Create_fcd(block, WN_kid0(wn_tmp), WN_kid1(wn_tmp));
08991 break;
08992
08993 case IOC_CR_EEEFLAG:
08994 kid0 = WN_kid0(wn_tmp);
08995 if (WN_operator(kid0) == OPR_INTCONST) {
08996 eeeflag = WN_const_val(kid0);
08997 iostat_flag = ((eeeflag & 8) != 0) ? 1 : 0;
08998 eor_flag = ((eeeflag & 4) != 0) ? 1 : 0;
08999 end_flag = ((eeeflag & 2) != 0) ? 1 : 0;
09000 err_flag = ((eeeflag & 1) != 0) ? 1 : 0;
09001
09002 } else {
09003 Fail_FmtAssertion(
09004 "non constant value for control (%d) in I/O processing",
09005 ioitem_tmp);
09006 }
09007 break;
09008
09009 case IOC_CR_EDFLAG:
09010 kid0 = WN_kid0(wn_tmp);
09011 if (WN_operator(kid0) == OPR_INTCONST) {
09012 edflag = WN_const_val(kid0);
09013 if (edflag == 0)
09014 break;
09015 }
09016
09017 is_internal_io = 1;
09018 if (unit_flag == 0) {
09019 unit_wn = Create_fcd(block, WN_COPY_Tree(unit_wn), kid0);
09020 unit_flag = 2;
09021 } else if (unit_flag == 3) {
09022 if (Pointer_Size == 4) {
09023 wn = WN_CreateLdid(OPC_U4U4LDID, 0, WN_st(unit_wn),
09024 Be_Type_Tbl(MTYPE_U4));
09025 } else {
09026 wn = WN_CreateLdid(OPC_U8U8LDID, 0, WN_st(unit_wn),
09027 Be_Type_Tbl(MTYPE_U8));
09028 }
09029 unit_wn = Create_fcd(block, wn, kid0);
09030 unit_flag = 2;
09031
09032 } else if (unit_flag == 2) {
09033 st = WN_st(WN_kid0(unit_wn));
09034 Gen_Io_PutFieldWN ( block, st, FCR_FCD_LEN, kid0);
09035 }
09036 edflag = 1;
09037 break;
09038
09039 case IOC_CR_FLFLAG:
09040 kid0 = WN_kid0(wn_tmp);
09041 if (WN_operator(kid0) == OPR_INTCONST) {
09042 flflag = WN_const_val(kid0);
09043 } else {
09044 Fail_FmtAssertion(
09045 "non constant value for control (%d) in I/O processing",
09046 ioitem_tmp);
09047 }
09048 break;
09049
09050 case IOC_INQLENGTH_VAR:
09051 inqlength = WN_kid0(wn_tmp);
09052 break;
09053
09054
09055 case IOC_VARFMT:
09056 varfmt = WN_kid0(wn_tmp);
09057 varfmtfp = WN_LdidPreg ( Pointer_type, Frame_Pointer_Preg_Offset );
09058 break;
09059
09060 case IOC_VARFMT_ORIGFMT:
09061 WN_Delete ( WN_kid0(wn_tmp) );
09062 break;
09063
09064 case IOC_ASSOCIATEVARIABLE:
09065 case IOC_CARRIAGECONTROL:
09066 case IOC_DEFAULTFILE:
09067 case IOC_DISPOSE:
09068 case IOC_KEY:
09069 case IOC_KEYEQ:
09070 case IOC_KEYGE:
09071 case IOC_KEYGT:
09072 case IOC_KEYED:
09073 case IOC_KEYID:
09074 case IOC_MAXREC:
09075 case IOC_NML:
09076 case IOC_ORGANIZATION:
09077 case IOC_RECCOUNT:
09078 case IOC_RECORDTYPE:
09079 case IOC_TYPE:
09080 case IOC_U:
09081 items[ioitem_tmp] = extract_calls ( block, WN_kid0(wn_tmp) );
09082 if (WN_kid_count(wn_tmp) == 2)
09083 itemsx[ioitem_tmp] = extract_calls ( block, WN_kid1(wn_tmp) );
09084 break;
09085
09086 case IOC_RECL:
09087 case IOC_EXIST:
09088 case IOC_OPENED:
09089 case IOC_NUMBER:
09090 case IOC_NAMED:
09091 case IOC_NEXTREC:
09092 if (current_io_library == IOLIB_MIPS) {
09093 items[ioitem_tmp] = extract_calls ( block, WN_kid0(wn_tmp) );
09094 if (WN_kid_count(wn_tmp) == 2)
09095 itemsx[ioitem_tmp] = extract_calls ( block, WN_kid1(wn_tmp) );
09096 } else {
09097 #ifdef KEY
09098
09099
09100 if (PU_f90_lang(Get_Current_PU())) {
09101 #else
09102 if (Language == LANG_F90) {
09103 #endif // KEY
09104 items[ioitem_tmp] = get_32bit_cilist_item(WN_kid0(wn_tmp), WN_ty(wn_tmp));
09105 } else {
09106 items[ioitem_tmp] = create_pointer_to_node(block, WN_kid0(wn_tmp), (TY_IDX) 0, TRUE);
09107 }
09108
09109 }
09110 break;
09111
09112 case IOC_FILE:
09113 case IOC_STATUS:
09114 case IOC_ACCESS:
09115 case IOC_FORM:
09116 case IOC_BLANK:
09117 case IOC_NAME:
09118 case IOC_SEQUENTIAL:
09119 case IOC_DIRECT:
09120 case IOC_FORMATTED:
09121 case IOC_UNFORMATTED:
09122
09123 if (current_io_library == IOLIB_MIPS) {
09124 items[ioitem_tmp] = extract_calls ( block, WN_kid0(wn_tmp) );
09125 if (WN_kid_count(wn_tmp) == 2)
09126 itemsx[ioitem_tmp] = extract_calls ( block, WN_kid1(wn_tmp) );
09127 } else {
09128 items[ioitem_tmp] = Create_fcd(block, WN_kid0(wn_tmp), WN_kid1(wn_tmp));
09129 }
09130 break;
09131
09132 case IOC_POSITION:
09133 case IOC_ACTION:
09134 case IOC_DELIM:
09135 case IOC_PAD:
09136 case IOC_READ:
09137 case IOC_WRITE:
09138 case IOC_READWRITE:
09139 items[ioitem_tmp] = Create_fcd(block, WN_kid0(wn_tmp), WN_kid1(wn_tmp));
09140 break;
09141
09142
09143 default:
09144 Fail_FmtAssertion("unexpected control (%d) in I/O processing",
09145 ioitem_tmp);
09146
09147 }
09148
09149 WN_Delete ( wn_tmp );
09150
09151 }
09152
09153
09154
09155 errstat = iostat != NULL || err != (LABEL_IDX) 0;
09156 endstat = iostat != NULL || err != (LABEL_IDX) 0 || end != (LABEL_IDX) 0;
09157
09158
09159
09160
09161 if (unit_type == IOU_DEFAULT || unit_type == IOU_EXTERNAL)
09162 if (items[IOC_REC] == NULL)
09163 if (format_type == IOF_ASSIGNED_VAR || format_type == IOF_CHAR_EXPR ||
09164 format_type == IOF_LABEL)
09165 ioclass = FCL_EXT_FORMATTED;
09166 else if (format_type == IOF_UNFORMATTED)
09167 ioclass = FCL_EXT_UNFORMATTED;
09168 else if (format_type == IOF_LIST_DIRECTED)
09169 ioclass = FCL_EXT_LIST;
09170 else if (format_type == IOF_NAMELIST_DIRECTED)
09171 ioclass = FCL_EXT_NAMELIST;
09172 else
09173 ioclass = FIOCLASS_NONE;
09174 else
09175 if (format_type == IOF_ASSIGNED_VAR || format_type == IOF_CHAR_EXPR ||
09176 format_type == IOF_LABEL)
09177 ioclass = FCL_DIR_FORMATTED;
09178 else if (format_type == IOF_UNFORMATTED)
09179 ioclass = FCL_DIR_UNFORMATTED;
09180 else
09181 ioclass = FIOCLASS_NONE;
09182 else if (unit_type == IOU_INTERNAL)
09183 if (format_type == IOF_ASSIGNED_VAR || format_type == IOF_CHAR_EXPR ||
09184 format_type == IOF_LABEL)
09185 ioclass = FCL_INT_FORMATTED;
09186 else if (format_type == IOF_LIST_DIRECTED)
09187 ioclass = FCL_INT_LIST;
09188 else
09189 ioclass = FIOCLASS_NONE;
09190 else
09191 ioclass = FIOCLASS_NONE;
09192
09193
09194 if ( Cur_PU_Feedback && Cur_PU_Feedback->Same_in_out( tree ) )
09195 zero_escape_freq = TRUE;
09196
09197
09198
09199 switch (iostatement = (IOSTATEMENT) WN_io_statement(tree)) {
09200
09201 case IOS_BACKSPACE:
09202 if (current_io_library == IOLIB_MIPS) {
09203 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
09204 err, end, (LABEL_IDX) 0, zero_escape_freq );
09205 st = Get_IoStruct_ST ( block, FID_ALIST, FALSE );
09206 Gen_Io_PutFieldConst ( block, st, FSA_AERR, errstat );
09207 Gen_Io_PutFieldWN ( block, st, FSA_AUNIT, unit_wn );
09208 GEN_IO_CALL_1 ( block, FIO_BACKSPACE, iostat1, iostat2,
09209 Make_IoAddr_WN ( st ) );
09210 break;
09211 }
09212 else {
09213
09214 if (!items[IOC_ERRFLAG])
09215 items[IOC_ERRFLAG] = WN_CreateIntconst ( OPC_I4INTCONST, 0);
09216 }
09217
09218 case IOS_CR_BACKSPACE:
09219 process_iostat ( &iostat1, &iostat2, FALSE, iostat, err, end, eor,
09220 zero_escape_freq );
09221
09222 #ifdef KEY
09223
09224
09225 if (PU_f90_lang(Get_Current_PU()))
09226 #else
09227 if (Language == LANG_F90)
09228 #endif // KEY
09229 unit_wn = pure_unit_wn;
09230 if (unit_wn != NULL) {
09231 arg1 = unit_wn;
09232 } else {
09233 if (Pointer_Size == 4)
09234 arg1 = WN_CreateIntconst ( OPC_I4INTCONST, 0);
09235 else
09236 arg1 = WN_CreateIntconst ( OPC_I8INTCONST, 0);
09237 }
09238
09239 if (iostat != NULL) {
09240 arg2 = iostat;
09241 } else {
09242 if (Pointer_Size == 4)
09243 arg2 = WN_CreateIntconst ( OPC_I4INTCONST, 0);
09244 else
09245 arg2 = WN_CreateIntconst ( OPC_I8INTCONST, 0);
09246 }
09247
09248 GEN_IO_CALL_3(block, FIO_CR_BACKSPACE, iostat1, iostat2, arg1, arg2,
09249 items[IOC_ERRFLAG]);
09250 break;
09251
09252 case IOS_CLOSE:
09253 if (current_io_library == IOLIB_MIPS) {
09254 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
09255 err, end, (LABEL_IDX) 0, zero_escape_freq );
09256 st = Get_IoStruct_ST ( block, FID_CLLIST, FALSE );
09257 Gen_Io_PutFieldConst ( block, st, FSL_CLERR, errstat );
09258 Gen_Io_PutFieldWN ( block, st, FSL_CLUNIT, unit_wn );
09259 if (items[IOC_STATUS] != NULL)
09260 Gen_Io_PutAddrWN ( block, st, FSL_CLSTA, items[IOC_STATUS] );
09261 else if (items[IOC_DISPOSE] != NULL)
09262 Gen_Io_PutAddrWN ( block, st, FSL_CLSTA, items[IOC_DISPOSE] );
09263 else
09264 Gen_Io_PutFieldConst ( block, st, FSL_CLSTA, (INT64) 0 );
09265 GEN_IO_CALL_1 ( block, FIO_CLOSE, iostat1, iostat2,
09266 Make_IoAddr_WN ( st ) );
09267 break;
09268 }
09269
09270 case IOS_CR_CLOSE:
09271 process_iostat ( &iostat1, &iostat2, FALSE, iostat, err, end, eor,
09272 zero_escape_freq );
09273 st = Get_IoStruct_ST ( block, FID_CRAY_CLOSELIST, TRUE);
09274
09275 #ifdef KEY
09276
09277
09278 if (PU_f90_lang(Get_Current_PU()))
09279 #else
09280 if (Language == LANG_F90)
09281 #endif // KEY
09282 unit_wn = pure_unit_wn;
09283
09284 if (unit_wn != NULL)
09285 Gen_Io_PutAddrWN (block, st, FCR_CLOSE_UNIT, unit_wn);
09286 if (iostat != NULL)
09287 Gen_Io_PutAddrWN (block, st, FCR_CLOSE_IOSTAT, iostat);
09288 if (items[IOC_ERRFLAG] != NULL)
09289 Gen_Io_PutFieldWN(block, st, FCR_CLOSE_ERR, items[IOC_ERRFLAG]);
09290 if (items[IOC_STATUS] != NULL)
09291 Gen_Io_PutAddrWN(block, st, FCR_CLOSE_STATUS, items[IOC_STATUS]);
09292 GEN_IO_CALL_1(block, FIO_CR_CLOSE, iostat1, iostat2,
09293 Make_IoAddr_WN(st));
09294 break;
09295
09296 case IOS_DELETE:
09297 if (current_io_library == IOLIB_MIPS) {
09298 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
09299 err, end, (LABEL_IDX) 0, zero_escape_freq );
09300 st = Get_IoStruct_ST ( block, FID_ALIST, FALSE );
09301 Gen_Io_PutFieldConst ( block, st, FSA_AERR, errstat );
09302 Gen_Io_PutFieldWN ( block, st, FSA_AUNIT, unit_wn );
09303 GEN_IO_CALL_1 ( block, FIO_DELETE, iostat1, iostat2,
09304 Make_IoAddr_WN ( st ) );
09305 } else {
09306
09307 fprintf( stderr, "DELETE not yet implemented\n" );
09308 abort();
09309 }
09310 break;
09311
09312 case IOS_ENDFILE:
09313 if (current_io_library == IOLIB_MIPS) {
09314 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
09315 err, end, (LABEL_IDX) 0, zero_escape_freq );
09316 st = Get_IoStruct_ST ( block, FID_ALIST, FALSE );
09317 Gen_Io_PutFieldConst ( block, st, FSA_AERR, errstat );
09318 Gen_Io_PutFieldWN ( block, st, FSA_AUNIT, unit_wn );
09319 GEN_IO_CALL_1 ( block, FIO_ENDFILE, iostat1, iostat2,
09320 Make_IoAddr_WN ( st ) );
09321 break;
09322 }
09323 else {
09324
09325 if (!items[IOC_ERRFLAG])
09326 items[IOC_ERRFLAG] = WN_CreateIntconst ( OPC_I4INTCONST, 0);
09327 }
09328
09329 case IOS_CR_ENDFILE:
09330 process_iostat ( &iostat1, &iostat2, FALSE, iostat, err, end, eor,
09331 zero_escape_freq );
09332
09333 #ifdef KEY
09334
09335
09336 if (PU_f90_lang(Get_Current_PU()))
09337 #else
09338 if (Language == LANG_F90)
09339 #endif // KEY
09340 unit_wn = pure_unit_wn;
09341
09342 if (unit_wn != NULL) {
09343 arg1 = unit_wn;
09344 } else {
09345 if (Pointer_Size == 4)
09346 arg1 = WN_CreateIntconst ( OPC_I4INTCONST, 0);
09347 else
09348 arg1 = WN_CreateIntconst ( OPC_I8INTCONST, 0);
09349 }
09350
09351 if (iostat != NULL) {
09352 arg2 = iostat;
09353 } else {
09354 if (Pointer_Size == 4)
09355 arg2 = WN_CreateIntconst ( OPC_I4INTCONST, 0);
09356 else
09357 arg2 = WN_CreateIntconst ( OPC_I8INTCONST, 0);
09358 }
09359
09360 GEN_IO_CALL_3(block, FIO_CR_ENDFILE, iostat1, iostat2, arg1, arg2,
09361 items[IOC_ERRFLAG]);
09362 break;
09363
09364 case IOS_FIND:
09365 if (current_io_library == IOLIB_MIPS) {
09366 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
09367 err, end, (LABEL_IDX) 0, zero_escape_freq );
09368 st = Get_IoStruct_ST ( block, FID_FLIST, FALSE );
09369 Gen_Io_PutFieldConst ( block, st, FSF_FERR, errstat );
09370 Gen_Io_PutFieldWN ( block, st, FSF_FUNIT, unit_wn );
09371 Gen_Io_PutFieldWN ( block, st, FSF_FREC, items[IOC_REC] );
09372 GEN_IO_CALL_1 ( block, FIO_FIND, iostat1, iostat2,
09373 Make_IoAddr_WN ( st ) );
09374 } else {
09375
09376 fprintf( stderr, "FIND not yet implemented\n" );
09377 abort();
09378 }
09379 break;
09380
09381 case IOS_INQUIRE:
09382 if (current_io_library == IOLIB_MIPS) {
09383 iomask = 0;
09384 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
09385 err, end, (LABEL_IDX) 0, zero_escape_freq );
09386 st = Get_IoStruct_ST ( block, FID_INLIST, TRUE );
09387 if (errstat)
09388 Gen_Io_PutFieldConst ( block, st, FSN_INERR, 1 );
09389 if (unit_wn != NULL)
09390 Gen_Io_PutFieldWN ( block, st, FSN_INUNIT, unit_wn );
09391 if (items[IOC_FILE] != NULL) {
09392 Gen_Io_PutAddrWN ( block, st, FSN_INFILE, items[IOC_FILE] );
09393 Gen_Io_PutFieldWN ( block, st, FSN_INFILEN, itemsx[IOC_FILE] );
09394 }
09395 if (items[IOC_EXIST] != NULL) {
09396 Build_Io_Mask ( &iomask, FIM_EXIST, items[IOC_EXIST] );
09397 Gen_Io_PutAddrWN ( block, st, FSN_INEX, items[IOC_EXIST] );
09398 }
09399 if (items[IOC_OPENED] != NULL) {
09400 Build_Io_Mask ( &iomask, FIM_OPENED, items[IOC_OPENED] );
09401 Gen_Io_PutAddrWN ( block, st, FSN_INOPEN, items[IOC_OPENED] );
09402 }
09403 if (items[IOC_NUMBER] != NULL) {
09404 Build_Io_Mask ( &iomask, FIM_NUMBER, items[IOC_NUMBER] );
09405 Gen_Io_PutAddrWN ( block, st, FSN_INNUM, items[IOC_NUMBER] );
09406 }
09407 if (items[IOC_NAMED] != NULL) {
09408 Build_Io_Mask ( &iomask, FIM_NAMED, items[IOC_NAMED] );
09409 Gen_Io_PutAddrWN ( block, st, FSN_INNAMED, items[IOC_NAMED] );
09410 }
09411 if (items[IOC_NAME] != NULL) {
09412 Gen_Io_PutAddrWN ( block, st, FSN_INNAME, items[IOC_NAME] );
09413 Gen_Io_PutFieldWN ( block, st, FSN_INNAMLEN, itemsx[IOC_NAME] );
09414 }
09415 if (items[IOC_ACCESS] != NULL) {
09416 Gen_Io_PutAddrWN ( block, st, FSN_INACC, items[IOC_ACCESS] );
09417 Gen_Io_PutFieldWN ( block, st, FSN_INACCLEN, itemsx[IOC_ACCESS] );
09418 }
09419 if (items[IOC_SEQUENTIAL] != NULL) {
09420 Gen_Io_PutAddrWN ( block, st, FSN_INSEQ, items[IOC_SEQUENTIAL] );
09421 Gen_Io_PutFieldWN ( block, st, FSN_INSEQLEN, itemsx[IOC_SEQUENTIAL] );
09422 }
09423 if (items[IOC_DIRECT] != NULL) {
09424 Gen_Io_PutAddrWN ( block, st, FSN_INDIR, items[IOC_DIRECT] );
09425 Gen_Io_PutFieldWN ( block, st, FSN_INDIRLEN, itemsx[IOC_DIRECT] );
09426 }
09427 if (items[IOC_FORM] != NULL) {
09428 Gen_Io_PutAddrWN ( block, st, FSN_INFMT, items[IOC_FORM] );
09429 Gen_Io_PutFieldWN ( block, st, FSN_INFMTLEN, itemsx[IOC_FORM] );
09430 }
09431 if (items[IOC_FORMATTED] != NULL) {
09432 Gen_Io_PutAddrWN ( block, st, FSN_INFORM, items[IOC_FORMATTED] );
09433 Gen_Io_PutFieldWN ( block, st, FSN_INFORMLEN, itemsx[IOC_FORMATTED] );
09434 }
09435 if (items[IOC_UNFORMATTED] != NULL) {
09436 Gen_Io_PutAddrWN ( block, st, FSN_INUNF, items[IOC_UNFORMATTED] );
09437 Gen_Io_PutFieldWN ( block, st, FSN_INUNFLEN,
09438 itemsx[IOC_UNFORMATTED] );
09439 }
09440 if (items[IOC_RECL] != NULL) {
09441 Build_Io_Mask ( &iomask, FIM_RECL, items[IOC_RECL] );
09442 Gen_Io_PutAddrWN ( block, st, FSN_INRECL, items[IOC_RECL] );
09443 }
09444 if (items[IOC_NEXTREC] != NULL) {
09445 Build_Io_Mask ( &iomask, FIM_NEXTREC, items[IOC_NEXTREC] );
09446 Gen_Io_PutAddrWN ( block, st, FSN_INNREC, items[IOC_NEXTREC] );
09447 }
09448 if (items[IOC_BLANK] != NULL) {
09449 Gen_Io_PutAddrWN ( block, st, FSN_INBLANK, items[IOC_BLANK] );
09450 Gen_Io_PutFieldWN ( block, st, FSN_INBLANKLEN, itemsx[IOC_BLANK] );
09451 }
09452 if (items[IOC_DEFAULTFILE] != NULL) {
09453 Gen_Io_PutAddrWN ( block, st, FSN_INDEFAULTFILE,
09454 items[IOC_DEFAULTFILE] );
09455 Gen_Io_PutFieldWN ( block, st, FSN_INDEFAULTFILELEN,
09456 itemsx[IOC_DEFAULTFILE] );
09457 }
09458 if (items[IOC_CARRIAGECONTROL] != NULL) {
09459 Gen_Io_PutAddrWN ( block, st, FSN_INCC, items[IOC_CARRIAGECONTROL] );
09460 Gen_Io_PutFieldWN ( block, st, FSN_INCCLEN,
09461 itemsx[IOC_CARRIAGECONTROL] );
09462 }
09463 if (items[IOC_KEYED] != NULL) {
09464 Gen_Io_PutAddrWN ( block, st, FSN_INKEYED, items[IOC_KEYED] );
09465 Gen_Io_PutFieldWN ( block, st, FSN_INKEYEDLEN, itemsx[IOC_KEYED] );
09466 }
09467 if (items[IOC_ORGANIZATION] != NULL) {
09468 Gen_Io_PutAddrWN ( block, st, FSN_INORG, items[IOC_ORGANIZATION] );
09469 Gen_Io_PutFieldWN ( block, st, FSN_INORGLEN,
09470 itemsx[IOC_ORGANIZATION] );
09471 }
09472 if (items[IOC_RECORDTYPE] != NULL) {
09473 Gen_Io_PutAddrWN ( block, st, FSN_INRECORDTYPE,
09474 items[IOC_RECORDTYPE] );
09475 Gen_Io_PutFieldWN ( block, st, FSN_INRECORDTYPELEN,
09476 itemsx[IOC_RECORDTYPE] );
09477 }
09478 GEN_IO_CALL_2 ( block, FIO_INQUIRE, iostat1, iostat2,
09479 Make_IoAddr_WN ( st ),
09480 WN_CreateIntconst ( OPC_I4INTCONST, iomask ) );
09481 break;
09482 }
09483
09484
09485 case IOS_CR_INQUIRE:
09486 process_iostat ( &iostat1, &iostat2, FALSE, iostat, err, end, eor,
09487 zero_escape_freq );
09488 st = Get_IoStruct_ST ( block, FID_CRAY_INQLIST, TRUE);
09489
09490 #ifdef KEY
09491
09492
09493 if (PU_f90_lang(Get_Current_PU()))
09494 #else
09495 if (Language == LANG_F90)
09496 #endif // KEY
09497 unit_wn = pure_unit_wn;
09498
09499 if (unit_wn != NULL)
09500 Gen_Io_PutAddrWN (block, st, FCR_INQ_UNIT, unit_wn);
09501 if (items[IOC_FILE] != NULL)
09502 Gen_Io_PutAddrWN(block, st, FCR_INQ_FILE, items[IOC_FILE]);
09503 if (iostat != NULL)
09504 Gen_Io_PutAddrWN (block, st, FCR_INQ_IOSTAT, iostat);
09505 if (items[IOC_ERRFLAG] != NULL)
09506 Gen_Io_PutFieldWN(block, st, FCR_INQ_ERR, items[IOC_ERRFLAG]);
09507 if (items[IOC_EXIST] != NULL)
09508 Gen_Io_PutAddrWN(block, st, FCR_INQ_EXIST, items[IOC_EXIST]);
09509 if (items[IOC_OPENED] != NULL)
09510 Gen_Io_PutAddrWN(block, st, FCR_INQ_OPENED, items[IOC_OPENED]);
09511 if (items[IOC_NUMBER] != NULL)
09512 Gen_Io_PutAddrWN(block, st, FCR_INQ_NUMBER, items[IOC_NUMBER]);
09513 if (items[IOC_NAMED] != NULL)
09514 Gen_Io_PutAddrWN(block, st, FCR_INQ_NAMED, items[IOC_NAMED]);
09515 if (items[IOC_NAME] != NULL)
09516 Gen_Io_PutAddrWN(block, st, FCR_INQ_NAME, items[IOC_NAME]);
09517 if (items[IOC_ACCESS] != NULL)
09518 Gen_Io_PutAddrWN(block, st, FCR_INQ_ACCESS, items[IOC_ACCESS]);
09519 if (items[IOC_SEQUENTIAL] != NULL)
09520 Gen_Io_PutAddrWN(block, st, FCR_INQ_SEQUENTIAL, items[IOC_SEQUENTIAL]);
09521 if (items[IOC_DIRECT] != NULL)
09522 Gen_Io_PutAddrWN(block, st, FCR_INQ_DIRECT, items[IOC_DIRECT]);
09523 if (items[IOC_FORM] != NULL)
09524 Gen_Io_PutAddrWN(block, st, FCR_INQ_FORM, items[IOC_FORM]);
09525 if (items[IOC_FORMATTED] != NULL)
09526 Gen_Io_PutAddrWN(block, st, FCR_INQ_FORMATTED, items[IOC_FORMATTED]);
09527 if (items[IOC_UNFORMATTED] != NULL)
09528 Gen_Io_PutAddrWN(block, st, FCR_INQ_UNFORMATTED, items[IOC_UNFORMATTED]);
09529 if (items[IOC_RECL] != NULL)
09530 Gen_Io_PutAddrWN(block, st, FCR_INQ_RECL, items[IOC_RECL]);
09531 if (items[IOC_NEXTREC] != NULL)
09532 Gen_Io_PutAddrWN(block, st, FCR_INQ_NEXTREC, items[IOC_NEXTREC]);
09533 if (items[IOC_BLANK] != NULL)
09534 Gen_Io_PutAddrWN(block, st, FCR_INQ_BLANK, items[IOC_BLANK]);
09535 if (items[IOC_POSITION] != NULL)
09536 Gen_Io_PutAddrWN(block, st, FCR_INQ_POSITION, items[IOC_POSITION]);
09537 if (items[IOC_ACTION] != NULL)
09538 Gen_Io_PutAddrWN(block, st, FCR_INQ_ACTION, items[IOC_ACTION]);
09539 if (items[IOC_READ] != NULL)
09540 Gen_Io_PutAddrWN(block, st, FCR_INQ_READ, items[IOC_READ]);
09541 if (items[IOC_WRITE] != NULL)
09542 Gen_Io_PutAddrWN(block, st, FCR_INQ_WRITE, items[IOC_WRITE]);
09543 if (items[IOC_READWRITE] != NULL)
09544 Gen_Io_PutAddrWN(block, st, FCR_INQ_READWRITE, items[IOC_READWRITE]);
09545 if (items[IOC_DELIM] != NULL)
09546 Gen_Io_PutAddrWN(block, st, FCR_INQ_DELIM, items[IOC_DELIM]);
09547 if (items[IOC_PAD] != NULL)
09548 Gen_Io_PutAddrWN(block, st, FCR_INQ_PAD, items[IOC_PAD]);
09549 GEN_IO_CALL_1(block, FIO_CR_INQUIRE, iostat1, iostat2,
09550 Make_IoAddr_WN(st));
09551 break;
09552
09553 case IOS_DEFINEFILE:
09554 case IOS_OPEN:
09555 if (current_io_library == IOLIB_MIPS) {
09556 iomask = 0;
09557 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
09558 err, end, (LABEL_IDX) 0, zero_escape_freq );
09559 st = Get_IoStruct_ST ( block, FID_OLIST, TRUE );
09560 if (errstat)
09561 Gen_Io_PutFieldConst ( block, st, FSO_OERR, 1 );
09562 Gen_Io_PutFieldWN ( block, st, FSO_OUNIT, unit_wn );
09563 if (items[IOC_FILE] != NULL) {
09564 Gen_Io_PutAddrWN ( block, st, FSO_OFNM, items[IOC_FILE] );
09565 Gen_Io_PutFieldWN ( block, st, FSO_OFNMLEN, itemsx[IOC_FILE] );
09566 } else if (items[IOC_NAME] != NULL) {
09567 Gen_Io_PutAddrWN ( block, st, FSO_OFNM, items[IOC_NAME] );
09568 Gen_Io_PutFieldWN ( block, st, FSO_OFNMLEN, itemsx[IOC_NAME] );
09569 }
09570 if (nkeys) {
09571 Gen_Io_PutFieldWN ( block, st, FSO_ONKEYS,
09572 WN_CreateIntconst ( OPC_I4INTCONST, nkeys/3 ) );
09573 stkey = Get_KeyStruct_ST ( nkeys );
09574 Gen_Io_PutAddrWN ( block, st, FSO_OKEYS, Make_IoAddr_WN ( stkey ));
09575 Gen_Io_PutKeyFieldWN ( block, stkey, key_spec_items, nkeys );
09576 free ( key_spec_items );
09577 }
09578 if (items[IOC_TYPE] != NULL)
09579 Gen_Io_PutAddrWN ( block, st, FSO_OSTA, items[IOC_TYPE] );
09580 if (items[IOC_STATUS] != NULL)
09581 Gen_Io_PutAddrWN ( block, st, FSO_OSTA, items[IOC_STATUS] );
09582 if (items[IOC_ACCESS] != NULL)
09583 Gen_Io_PutAddrWN ( block, st, FSO_OACC, items[IOC_ACCESS] );
09584 if (items[IOC_ORGANIZATION] != NULL) {
09585 Gen_Io_PutAddrWN ( block, st, FSO_OORG, items[IOC_ORGANIZATION] );
09586 Gen_Io_PutFieldWN ( block, st, FSN_INORGLEN,
09587 itemsx[IOC_ORGANIZATION] );
09588 }
09589 if (items[IOC_FORM] != NULL)
09590 Gen_Io_PutAddrWN ( block, st, FSO_OFM, items[IOC_FORM] );
09591 if (items[IOC_RECL])
09592 Gen_Io_PutFieldWN ( block, st, FSO_ORL, items[IOC_RECL] );
09593 if (items[IOC_BLANK] != NULL)
09594 Gen_Io_PutAddrWN ( block, st, FSO_OBLNK, items[IOC_BLANK] );
09595 if (items[IOC_CARRIAGECONTROL] != NULL)
09596 Gen_Io_PutAddrWN ( block, st, FSO_OCC, items[IOC_CARRIAGECONTROL] );
09597 if (items[IOC_SHARED] != NULL)
09598 Gen_Io_PutFieldConst ( block, st, FSO_OSHARED, 1 );
09599 if (items[IOC_READONLY] != NULL)
09600 Gen_Io_PutFieldConst ( block, st, FSO_OREADONLY, 1 );
09601 if (items[IOC_ASSOCIATEVARIABLE] != NULL) {
09602 Build_Io_Mask ( &iomask, FIM_ASSOCIATEVARIABLE,
09603 items[IOC_ASSOCIATEVARIABLE] );
09604 Gen_Io_PutAddrWN ( block, st, FSO_OASSOCV,
09605 items[IOC_ASSOCIATEVARIABLE] );
09606 }
09607 if (items[IOC_MAXREC])
09608 Gen_Io_PutFieldWN ( block, st, FSO_OMAXREC, items[IOC_MAXREC] );
09609 if (items[IOC_DEFAULTFILE] != NULL) {
09610 Gen_Io_PutAddrWN ( block, st, FSO_ODFNM, items[IOC_DEFAULTFILE] );
09611 Gen_Io_PutFieldWN ( block, st, FSO_ODFNMLEN,
09612 itemsx[IOC_DEFAULTFILE] );
09613 }
09614 if (items[IOC_DISPOSE] != NULL)
09615 Gen_Io_PutAddrWN ( block, st, FSO_ODISP, items[IOC_DISPOSE] );
09616 if (items[IOC_RECORDTYPE] != NULL)
09617 Gen_Io_PutAddrWN ( block, st, FSO_ORECTYPE, items[IOC_RECORDTYPE] );
09618 GEN_IO_CALL_2 ( block,
09619 (iostatement == IOS_DEFINEFILE)
09620 ? FIO_DEFINEFILE : FIO_OPEN,
09621 iostat1, iostat2,
09622 Make_IoAddr_WN ( st ),
09623 WN_CreateIntconst ( OPC_I4INTCONST, iomask ) );
09624 break;
09625 }
09626
09627
09628 case IOS_CR_OPEN:
09629 process_iostat ( &iostat1, &iostat2, FALSE, iostat, err, end, eor,
09630 zero_escape_freq );
09631 st = Get_IoStruct_ST ( block, FID_CRAY_OPENLIST, TRUE);
09632
09633 #ifdef KEY
09634
09635
09636 if (PU_f90_lang(Get_Current_PU()))
09637 #else
09638 if (Language == LANG_F90)
09639 #endif // KEY
09640 unit_wn = pure_unit_wn;
09641
09642 if (unit_wn != NULL)
09643 Gen_Io_PutAddrWN (block, st, FCR_OPEN_UNIT, unit_wn);
09644 if (iostat != NULL)
09645 Gen_Io_PutAddrWN (block, st, FCR_OPEN_IOSTAT, iostat);
09646 if (items[IOC_ERRFLAG] != NULL)
09647 Gen_Io_PutFieldWN(block, st, FCR_OPEN_ERR, items[IOC_ERRFLAG]);
09648 if (items[IOC_FILE] != NULL)
09649 Gen_Io_PutAddrWN(block, st, FCR_OPEN_FILE, items[IOC_FILE]);
09650 if (items[IOC_NAME] != NULL)
09651 Gen_Io_PutAddrWN(block, st, FCR_OPEN_FILE, items[IOC_NAME]);
09652 if (items[IOC_STATUS] != NULL)
09653 Gen_Io_PutAddrWN(block, st, FCR_OPEN_STATUS, items[IOC_STATUS]);
09654 if (items[IOC_ACCESS] != NULL)
09655 Gen_Io_PutAddrWN(block, st, FCR_OPEN_ACCESS, items[IOC_ACCESS]);
09656 if (items[IOC_FORM] != NULL)
09657 Gen_Io_PutAddrWN(block, st, FCR_OPEN_FORM, items[IOC_FORM]);
09658 if (items[IOC_RECL] != NULL)
09659 Gen_Io_PutAddrWN(block, st, FCR_OPEN_RECL, items[IOC_RECL]);
09660 if (items[IOC_BLANK] != NULL)
09661 Gen_Io_PutAddrWN(block, st, FCR_OPEN_BLANK, items[IOC_BLANK]);
09662 if (items[IOC_POSITION] != NULL)
09663 Gen_Io_PutAddrWN(block, st, FCR_OPEN_POSITION, items[IOC_POSITION]);
09664 if (items[IOC_ACTION] != NULL)
09665 Gen_Io_PutAddrWN(block, st, FCR_OPEN_ACTION, items[IOC_ACTION]);
09666 if (items[IOC_DELIM] != NULL)
09667 Gen_Io_PutAddrWN(block, st, FCR_OPEN_DELIM, items[IOC_DELIM]);
09668 if (items[IOC_PAD] != NULL)
09669 Gen_Io_PutAddrWN(block, st, FCR_OPEN_PAD, items[IOC_PAD]);
09670 GEN_IO_CALL_1(block, FIO_CR_OPEN, iostat1, iostat2, Make_IoAddr_WN(st));
09671 break;
09672
09673
09674 case IOS_REWIND:
09675 if (current_io_library == IOLIB_MIPS) {
09676 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
09677 err, end, (LABEL_IDX) 0, zero_escape_freq );
09678 st = Get_IoStruct_ST ( block, FID_ALIST, FALSE );
09679 Gen_Io_PutFieldConst ( block, st, FSA_AERR, errstat );
09680 Gen_Io_PutFieldWN ( block, st, FSA_AUNIT, unit_wn );
09681 GEN_IO_CALL_1 ( block, FIO_REWIND, iostat1, iostat2,
09682 Make_IoAddr_WN ( st ) );
09683 break;
09684 } else {
09685
09686
09687 items[IOC_ERRFLAG] = WN_CreateIntconst( OPC_I4INTCONST,
09688 (err != (LABEL_IDX) 0) ? 1 : 0);
09689 }
09690
09691 case IOS_CR_REWIND:
09692 process_iostat ( &iostat1, &iostat2, FALSE, iostat, err, end, eor,
09693 zero_escape_freq );
09694
09695 #ifdef KEY
09696
09697
09698 if (PU_f90_lang(Get_Current_PU()))
09699 #else
09700 if (Language == LANG_F90)
09701 #endif // KEY
09702 unit_wn = pure_unit_wn;
09703
09704 if (unit_wn != NULL) {
09705 arg1 = unit_wn;
09706 } else {
09707 if (Pointer_Size == 4)
09708 arg1 = WN_CreateIntconst ( OPC_I4INTCONST, 0);
09709 else
09710 arg1 = WN_CreateIntconst ( OPC_I8INTCONST, 0);
09711 }
09712
09713 if (iostat != NULL) {
09714 arg2 = iostat;
09715 } else {
09716 if (Pointer_Size == 4)
09717 arg2 = WN_CreateIntconst ( OPC_I4INTCONST, 0);
09718 else
09719 arg2 = WN_CreateIntconst ( OPC_I8INTCONST, 0);
09720 }
09721
09722 GEN_IO_CALL_3(block, FIO_CR_REWIND, iostat1, iostat2, arg1, arg2,
09723 items[IOC_ERRFLAG]);
09724 break;
09725
09726 case IOS_UNLOCK:
09727 if (current_io_library == IOLIB_MIPS) {
09728 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
09729 err, end, (LABEL_IDX) 0, zero_escape_freq );
09730 st = Get_IoStruct_ST ( block, FID_ALIST, FALSE );
09731 Gen_Io_PutFieldConst ( block, st, FSA_AERR, errstat );
09732 Gen_Io_PutFieldWN ( block, st, FSA_AUNIT, unit_wn );
09733 GEN_IO_CALL_1 ( block, FIO_UNLOCK, iostat1, iostat2,
09734 Make_IoAddr_WN ( st ) );
09735 }
09736 else {
09737
09738 fprintf( stderr, "UNLOCK\n" );
09739 abort();
09740 }
09741 break;
09742
09743 case IOS_INQLENGTH:
09744 if (PU_has_region(Get_Current_PU())) {
09745 cr_iostat1 = NULL;
09746 process_inqvar(&cr_iostat2, inqlength);
09747 iostat_processing_not_done = FALSE;
09748 }
09749 if (FIRST_CALL(flflag) || (cilist_st == NULL)) {
09750 if (iostat_processing_not_done) {
09751 cr_iostat1 = NULL;
09752 process_inqvar(&cr_iostat2, inqlength);
09753 }
09754 cilist_st = Gen_Temp_Symbol(MTYPE_To_TY(MTYPE_U8), "inquire_arg1");
09755 ty = ST_type(cilist_st);
09756 word1 = 0;
09757 if (Target_Byte_Sex == LITTLE_ENDIAN) {
09758 cilist_header_ptr = (cilist_header_type *)&word1;
09759 cilist_header_ptr->version = 1;
09760 cilist_header_ptr->stksize = stk_size;
09761 cilist_header_ptr->icount = 1;
09762 } else {
09763 word1 = ((UINT64) 1 << 56) |
09764 ((UINT64) stk_size << 16 ) |
09765 ((UINT64) 1 );
09766 }
09767 WN_INSERT_BlockLast(block,
09768 WN_Stid (MTYPE_U8, 0, cilist_st, ty,
09769 WN_CreateIntconst (OPC_U8INTCONST,word1)));
09770 }
09771
09772 ty = ST_type(cilist_st);
09773 cilist_wn = WN_CreateLda (opc_lda, 0,
09774 Make_Pointer_Type(ty),
09775 cilist_st);
09776 lower_cray_io_items ( block, tree, iolist, WN_kid_count(tree),
09777 TRUE, &table_size, flflag, cilist_wn,
09778 FIO_INQLENGTH);
09779 break;
09780 case IOS_CR_FRU:
09781 fmt_flag = 0;
09782
09783 if (PU_has_region(Get_Current_PU())) {
09784 process_iostat ( &cr_iostat1, &cr_iostat2, FALSE, iostat,
09785 err, end, eor, zero_escape_freq );
09786 iostat_processing_not_done = FALSE;
09787 }
09788
09789
09790 if (FIRST_CALL(flflag) || (cilist_st == NULL)) {
09791 if (iostat_processing_not_done) {
09792 process_iostat ( &cr_iostat1, &cr_iostat2, TRUE, iostat,
09793 err, end, eor, zero_escape_freq );
09794 }
09795 cilist_st = Get_IoStruct_ST ( block, FID_CRAY_CLIST, TRUE);
09796 word1 = 0;
09797 if (Target_Byte_Sex == LITTLE_ENDIAN) {
09798 cilist_header_ptr = (cilist_header_type *)&word1;
09799 cilist_header_ptr->version = 1;
09800 cilist_header_ptr->uflag = unit_flag;
09801 cilist_header_ptr->iostatflg = iostat_flag;
09802 cilist_header_ptr->eorflag = eor_flag;
09803 cilist_header_ptr->endflag = end_flag;
09804 cilist_header_ptr->errflag = err_flag;
09805 cilist_header_ptr->advcode = advance_flag;
09806 cilist_header_ptr->edcode = edflag;
09807 cilist_header_ptr->internal = is_internal_io;
09808 cilist_header_ptr->dflag = is_direct;
09809 cilist_header_ptr->fmt = fmt_flag;
09810 cilist_header_ptr->stksize = stk_size;
09811 cilist_header_ptr->icount = 7;
09812 } else {
09813 word1 = ( (UINT64) 1 << 56 ) |
09814 ( (UINT64) unit_flag << 48 ) |
09815 ( (UINT64) eeeflag << 40 ) |
09816 ( (UINT64) advance_flag << 35 ) |
09817 ( (UINT64) edflag << 34 ) |
09818 ( (UINT64) is_internal_io << 33 ) |
09819 ( (UINT64) is_direct << 32 ) |
09820 ( (UINT64) fmt_flag << 24 ) |
09821 ( (UINT64) stk_size << 16 ) |
09822 ( (UINT64) 7 ) ;
09823 }
09824 Gen_Io_PutFieldConst ( block, cilist_st, FCR_CI_WORD1, word1 );
09825 if (unit_wn != NULL)
09826 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_UNIT, unit_wn );
09827 if (iostat != NULL)
09828 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_IOSTAT, iostat);
09829 if (rec_wn != NULL)
09830 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_REC, rec_wn );
09831 if (parsfmt_wn != NULL)
09832 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_PARSFMT, parsfmt_wn );
09833 if (fmtsrc_wn != NULL)
09834 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_FMTSRC, fmtsrc_wn );
09835 if (advance_wn != NULL)
09836 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_ADVANCE, advance_wn );
09837 if (size_wn != NULL)
09838 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_SIZE, size_wn );
09839 }
09840 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(cilist_st)),
09841 cilist_st);
09842 lower_cray_io_items ( block, tree, iolist, WN_kid_count(tree), TRUE,
09843 &table_size, flflag, cilist_wn,
09844 FIO_CR_READ_UNFORMATTED);
09845 break;
09846
09847 case IOS_CR_FRF:
09848
09849 if (PU_has_region(Get_Current_PU())) {
09850 process_iostat ( &cr_iostat1, &cr_iostat2, FALSE, iostat,
09851 err, end, eor, zero_escape_freq );
09852 iostat_processing_not_done = FALSE;
09853 }
09854
09855 if (FIRST_CALL(flflag) || (cilist_st == NULL)) {
09856 if (iostat_processing_not_done) {
09857 process_iostat ( &cr_iostat1, &cr_iostat2, TRUE, iostat,
09858 err, end, eor, zero_escape_freq );
09859 }
09860 cilist_st = Get_IoStruct_ST ( block, FID_CRAY_CLIST, TRUE);
09861 word1 = 0;
09862 if (Target_Byte_Sex == LITTLE_ENDIAN) {
09863 cilist_header_ptr = (cilist_header_type *)&word1;
09864 cilist_header_ptr->version = 1;
09865 cilist_header_ptr->uflag = unit_flag;
09866 cilist_header_ptr->iostatflg = iostat_flag;
09867 cilist_header_ptr->eorflag = eor_flag;
09868 cilist_header_ptr->endflag = end_flag;
09869 cilist_header_ptr->errflag = err_flag;
09870 cilist_header_ptr->advcode = advance_flag;
09871 cilist_header_ptr->edcode = edflag;
09872 cilist_header_ptr->internal = is_internal_io;
09873 cilist_header_ptr->dflag = is_direct;
09874 cilist_header_ptr->fmt = fmt_flag;
09875 cilist_header_ptr->stksize = stk_size;
09876 cilist_header_ptr->icount = 7;
09877 } else {
09878 word1 = ( (UINT64) 1 << 56 ) |
09879 ( (UINT64) unit_flag << 48 ) |
09880 ( (UINT64) eeeflag << 40 ) |
09881 ( (UINT64) advance_flag << 35 ) |
09882 ( (UINT64) edflag << 34 ) |
09883 ( (UINT64) is_internal_io << 33 ) |
09884 ( (UINT64) is_direct << 32 ) |
09885 ( (UINT64) fmt_flag << 24 ) |
09886 ( (UINT64) stk_size << 16 ) |
09887 ( (UINT64) 7 ) ;
09888 }
09889 Gen_Io_PutFieldConst ( block, cilist_st, FCR_CI_WORD1, word1 );
09890 if (unit_wn != NULL)
09891 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_UNIT, unit_wn );
09892 if (iostat != NULL)
09893 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_IOSTAT, iostat);
09894 if (rec_wn != NULL)
09895 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_REC, rec_wn );
09896 if (parsfmt_wn != NULL)
09897 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_PARSFMT, parsfmt_wn );
09898 if (fmtsrc_wn != NULL)
09899 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_FMTSRC, fmtsrc_wn );
09900 if (advance_wn != NULL)
09901 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_ADVANCE, advance_wn );
09902 if (size_wn != NULL)
09903 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_SIZE, size_wn );
09904 }
09905 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(cilist_st)),
09906 cilist_st);
09907 lower_cray_io_items ( block, tree, iolist, WN_kid_count(tree),
09908 TRUE, &table_size, flflag, cilist_wn,
09909 FIO_CR_READ_FORMATTED);
09910 break;
09911
09912 case IOS_CR_FWU:
09913 fmt_flag = 0;
09914
09915 if (PU_has_region(Get_Current_PU())) {
09916 process_iostat ( &cr_iostat1, &cr_iostat2, FALSE, iostat,
09917 err, end, eor, zero_escape_freq );
09918 iostat_processing_not_done = FALSE;
09919 }
09920
09921 if (FIRST_CALL(flflag) || (cilist_st == NULL)) {
09922 if (iostat_processing_not_done) {
09923 process_iostat ( &cr_iostat1, &cr_iostat2, TRUE, iostat,
09924 err, end, eor, zero_escape_freq );
09925 }
09926 cilist_st = Get_IoStruct_ST ( block, FID_CRAY_CLIST, TRUE);
09927 word1 = 0;
09928 if (Target_Byte_Sex == LITTLE_ENDIAN) {
09929 cilist_header_ptr = (cilist_header_type *)&word1;
09930 cilist_header_ptr->version = 1;
09931 cilist_header_ptr->uflag = unit_flag;
09932 cilist_header_ptr->iostatflg = iostat_flag;
09933 cilist_header_ptr->eorflag = eor_flag;
09934 cilist_header_ptr->endflag = end_flag;
09935 cilist_header_ptr->errflag = err_flag;
09936 cilist_header_ptr->advcode = advance_flag;
09937 cilist_header_ptr->edcode = edflag;
09938 cilist_header_ptr->internal = is_internal_io;
09939 cilist_header_ptr->dflag = is_direct;
09940 cilist_header_ptr->fmt = fmt_flag;
09941 cilist_header_ptr->stksize = stk_size;
09942 cilist_header_ptr->icount = 7;
09943 } else {
09944 word1 = ( (UINT64) 1 << 56 ) |
09945 ( (UINT64) unit_flag << 48 ) |
09946 ( (UINT64) eeeflag << 40 ) |
09947 ( (UINT64) advance_flag << 35 ) |
09948 ( (UINT64) edflag << 34 ) |
09949 ( (UINT64) is_internal_io << 33 ) |
09950 ( (UINT64) is_direct << 32 ) |
09951 ( (UINT64) fmt_flag << 24 ) |
09952 ( (UINT64) stk_size << 16 ) |
09953 ( (UINT64) 7 ) ;
09954 }
09955 Gen_Io_PutFieldConst ( block, cilist_st, FCR_CI_WORD1, word1 );
09956 if (unit_wn != NULL)
09957 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_UNIT, unit_wn );
09958 if (iostat != NULL)
09959 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_IOSTAT, iostat);
09960 if (rec_wn != NULL)
09961 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_REC, rec_wn );
09962 if (parsfmt_wn != NULL)
09963 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_PARSFMT, parsfmt_wn );
09964 if (fmtsrc_wn != NULL)
09965 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_FMTSRC, fmtsrc_wn );
09966 if (advance_wn != NULL)
09967 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_ADVANCE, advance_wn );
09968 if (size_wn != NULL)
09969 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_SIZE, size_wn );
09970 }
09971 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(cilist_st)),
09972 cilist_st);
09973 lower_cray_io_items ( block, tree, iolist, WN_kid_count(tree),
09974 TRUE, &table_size, flflag, cilist_wn,
09975 FIO_CR_WRITE_UNFORMATTED);
09976 break;
09977
09978 case IOS_CR_FWF:
09979
09980 if (PU_has_region(Get_Current_PU())) {
09981 process_iostat ( &cr_iostat1, &cr_iostat2, FALSE, iostat,
09982 err, end, eor, zero_escape_freq );
09983 iostat_processing_not_done = FALSE;
09984 }
09985
09986 if (FIRST_CALL(flflag) || (cilist_st == NULL)) {
09987 if (iostat_processing_not_done) {
09988 process_iostat ( &cr_iostat1, &cr_iostat2, TRUE, iostat,
09989 err, end, eor, zero_escape_freq );
09990 }
09991 cilist_st = Get_IoStruct_ST ( block, FID_CRAY_CLIST, TRUE);
09992 word1 = 0;
09993 if (Target_Byte_Sex == LITTLE_ENDIAN) {
09994 cilist_header_ptr = (cilist_header_type *)&word1;
09995 cilist_header_ptr->version = 1;
09996 cilist_header_ptr->uflag = unit_flag;
09997 cilist_header_ptr->iostatflg = iostat_flag;
09998 cilist_header_ptr->eorflag = eor_flag;
09999 cilist_header_ptr->endflag = end_flag;
10000 cilist_header_ptr->errflag = err_flag;
10001 cilist_header_ptr->advcode = advance_flag;
10002 cilist_header_ptr->edcode = edflag;
10003 cilist_header_ptr->internal = is_internal_io;
10004 cilist_header_ptr->dflag = is_direct;
10005 cilist_header_ptr->fmt = fmt_flag;
10006 cilist_header_ptr->stksize = stk_size;
10007 cilist_header_ptr->icount = 7;
10008 } else {
10009 word1 = ( (UINT64) 1 << 56 ) |
10010 ( (UINT64) unit_flag << 48 ) |
10011 ( (UINT64) eeeflag << 40 ) |
10012 ( (UINT64) advance_flag << 35 ) |
10013 ( (UINT64) edflag << 34 ) |
10014 ( (UINT64) is_internal_io << 33 ) |
10015 ( (UINT64) is_direct << 32 ) |
10016 ( (UINT64) fmt_flag << 24 ) |
10017 ( (UINT64) stk_size << 16 ) |
10018 ( (UINT64) 7 ) ;
10019 }
10020 Gen_Io_PutFieldConst ( block, cilist_st, FCR_CI_WORD1, word1 );
10021 if (unit_wn != NULL)
10022 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_UNIT, unit_wn );
10023 if (iostat != NULL)
10024 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_IOSTAT, iostat);
10025 if (rec_wn != NULL)
10026 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_REC, rec_wn );
10027 if (parsfmt_wn != NULL)
10028 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_PARSFMT, parsfmt_wn );
10029 if (fmtsrc_wn != NULL)
10030 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_FMTSRC, fmtsrc_wn );
10031 if (advance_wn != NULL)
10032 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_ADVANCE, advance_wn );
10033 if (size_wn != NULL)
10034 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_SIZE, size_wn );
10035 }
10036 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(cilist_st)),
10037 cilist_st);
10038 lower_cray_io_items ( block, tree, iolist, WN_kid_count(tree),
10039 TRUE, &table_size, flflag, cilist_wn,
10040 FIO_CR_WRITE_FORMATTED);
10041 break;
10042
10043 case IOS_CR_FRN:
10044
10045 fmt_flag = 5;
10046
10047 if (PU_has_region(Get_Current_PU())) {
10048 process_iostat ( &cr_iostat1, &cr_iostat2, FALSE, iostat,
10049 err, end, eor, zero_escape_freq );
10050 iostat_processing_not_done = FALSE;
10051 }
10052
10053 if (FIRST_CALL(flflag) || (cilist_st == NULL)) {
10054 if (iostat_processing_not_done) {
10055 process_iostat ( &cr_iostat1, &cr_iostat2, TRUE, iostat,
10056 err, end, eor, zero_escape_freq );
10057 }
10058 cilist_st = Get_IoStruct_ST ( block, FID_CRAY_CLIST, TRUE);
10059 word1 = 0;
10060 if (Target_Byte_Sex == LITTLE_ENDIAN) {
10061 cilist_header_ptr = (cilist_header_type *)&word1;
10062 cilist_header_ptr->version = 1;
10063 cilist_header_ptr->uflag = unit_flag;
10064 cilist_header_ptr->iostatflg = iostat_flag;
10065 cilist_header_ptr->eorflag = eor_flag;
10066 cilist_header_ptr->endflag = end_flag;
10067 cilist_header_ptr->errflag = err_flag;
10068 cilist_header_ptr->advcode = advance_flag;
10069 cilist_header_ptr->edcode = edflag;
10070 cilist_header_ptr->internal = is_internal_io;
10071 cilist_header_ptr->dflag = is_direct;
10072 cilist_header_ptr->fmt = fmt_flag;
10073 cilist_header_ptr->stksize = stk_size;
10074 cilist_header_ptr->icount = 7;
10075 } else {
10076 word1 = ( (UINT64) 1 << 56 ) |
10077 ( (UINT64) unit_flag << 48 ) |
10078 ( (UINT64) eeeflag << 40 ) |
10079 ( (UINT64) advance_flag << 35 ) |
10080 ( (UINT64) edflag << 34 ) |
10081 ( (UINT64) is_internal_io << 33 ) |
10082 ( (UINT64) is_direct << 32 ) |
10083 ( (UINT64) fmt_flag << 24 ) |
10084 ( (UINT64) stk_size << 16 ) |
10085 ( (UINT64) 7 ) ;
10086 }
10087 Gen_Io_PutFieldConst ( block, cilist_st, FCR_CI_WORD1, word1 );
10088 if (unit_wn != NULL)
10089 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_UNIT, unit_wn );
10090 if (iostat != NULL)
10091 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_IOSTAT, iostat);
10092 if (rec_wn != NULL)
10093 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_REC, rec_wn );
10094 if (parsfmt_wn != NULL)
10095 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_PARSFMT, parsfmt_wn );
10096 if (fmtsrc_wn != NULL)
10097 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_FMTSRC, fmtsrc_wn );
10098 if (advance_wn != NULL)
10099 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_ADVANCE, advance_wn );
10100 if (size_wn != NULL)
10101 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_SIZE, size_wn );
10102 }
10103 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(cilist_st)),
10104 cilist_st);
10105 if (stack_ty == (TY_IDX) 0)
10106 stack_ty = Make_Simple_Array_Type("stack_space_type", STACK_LENGTH,
10107 Be_Type_Tbl(MTYPE_U8));
10108
10109 if (Current_pu != cray_iolist_current_pu) {
10110 cray_iolist_current_pu = Current_pu;
10111 stack_st = Gen_Temp_Symbol ( stack_ty, TY_name(stack_ty) );
10112 container_block_for_iolists = NULL;
10113 num_iolists = 0;
10114 }
10115
10116 stack_wn = WN_CreateLda (opc_lda, 0,
10117 Make_Pointer_Type (ST_type(stack_st), FALSE),
10118 stack_st);
10119 if (PU_has_region(Get_Current_PU())) {
10120
10121
10122
10123
10124
10125
10126 GEN_IO_CALL_3 ( block, FIO_CR_READ_NAMELIST, NULL, cr_iostat2, cilist_wn,
10127 WN_kid0(WN_kid(tree,iolist)), stack_wn);
10128 } else {
10129 if (LAST_CALL(flflag)) {
10130 GEN_IO_CALL_3 ( block, FIO_CR_READ_NAMELIST, NULL,
10131 cr_iostat2, cilist_wn,
10132 WN_kid0(WN_kid(tree,iolist)), stack_wn);
10133 } else {
10134 GEN_IO_CALL_3 ( block, FIO_CR_READ_NAMELIST, cr_iostat1,
10135 NULL, cilist_wn,
10136 WN_kid0(WN_kid(tree,iolist)), stack_wn);
10137 }
10138 }
10139 break;
10140
10141 case IOS_CR_FWN:
10142 fmt_flag = 5;
10143
10144 if (PU_has_region(Get_Current_PU())) {
10145 process_iostat ( &cr_iostat1, &cr_iostat2, FALSE, iostat,
10146 err, end, eor, zero_escape_freq );
10147 iostat_processing_not_done = FALSE;
10148 }
10149
10150 if (FIRST_CALL(flflag) || (cilist_st == NULL)) {
10151 if (iostat_processing_not_done) {
10152 process_iostat ( &cr_iostat1, &cr_iostat2, TRUE, iostat,
10153 err, end, eor, zero_escape_freq );
10154 }
10155 cilist_st = Get_IoStruct_ST ( block, FID_CRAY_CLIST, TRUE);
10156 word1 = 0;
10157 if (Target_Byte_Sex == LITTLE_ENDIAN) {
10158 cilist_header_ptr = (cilist_header_type *)&word1;
10159 cilist_header_ptr->version = 1;
10160 cilist_header_ptr->uflag = unit_flag;
10161 cilist_header_ptr->iostatflg = iostat_flag;
10162 cilist_header_ptr->eorflag = eor_flag;
10163 cilist_header_ptr->endflag = end_flag;
10164 cilist_header_ptr->errflag = err_flag;
10165 cilist_header_ptr->advcode = advance_flag;
10166 cilist_header_ptr->edcode = edflag;
10167 cilist_header_ptr->internal = is_internal_io;
10168 cilist_header_ptr->dflag = is_direct;
10169 cilist_header_ptr->fmt = fmt_flag;
10170 cilist_header_ptr->stksize = stk_size;
10171 cilist_header_ptr->icount = 7;
10172 } else {
10173 word1 = ( (UINT64) 1 << 56 ) |
10174 ( (UINT64) unit_flag << 48 ) |
10175 ( (UINT64) eeeflag << 40 ) |
10176 ( (UINT64) advance_flag << 35 ) |
10177 ( (UINT64) edflag << 34 ) |
10178 ( (UINT64) is_internal_io << 33 ) |
10179 ( (UINT64) is_direct << 32 ) |
10180 ( (UINT64) fmt_flag << 24 ) |
10181 ( (UINT64) stk_size << 16 ) |
10182 ( (UINT64) 7 ) ;
10183 }
10184 Gen_Io_PutFieldConst ( block, cilist_st, FCR_CI_WORD1, word1 );
10185 if (unit_wn != NULL)
10186 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_UNIT, unit_wn );
10187 if (iostat != NULL)
10188 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_IOSTAT, iostat);
10189 if (rec_wn != NULL)
10190 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_REC, rec_wn );
10191 if (parsfmt_wn != NULL)
10192 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_PARSFMT, parsfmt_wn );
10193 if (fmtsrc_wn != NULL)
10194 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_FMTSRC, fmtsrc_wn );
10195 if (advance_wn != NULL)
10196 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_ADVANCE, advance_wn );
10197 if (size_wn != NULL)
10198 Gen_Io_PutAddrWN ( block, cilist_st, FCR_CI_SIZE, size_wn );
10199 }
10200 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(cilist_st)),
10201 cilist_st);
10202 if (stack_ty == (TY_IDX) 0)
10203 stack_ty = Make_Simple_Array_Type("stack_space_type", STACK_LENGTH,
10204 Be_Type_Tbl(MTYPE_U8));
10205
10206 if (Current_pu != cray_iolist_current_pu) {
10207 cray_iolist_current_pu = Current_pu;
10208 stack_st = Gen_Temp_Symbol ( stack_ty, TY_name(stack_ty) );
10209 container_block_for_iolists = NULL;
10210 num_iolists = 0;
10211 }
10212
10213 stack_wn = WN_CreateLda (opc_lda, 0,
10214 Make_Pointer_Type (ST_type(stack_st), FALSE),
10215 stack_st);
10216 if (PU_has_region(Get_Current_PU())) {
10217
10218
10219
10220
10221
10222
10223 GEN_IO_CALL_3 ( block, FIO_CR_WRITE_NAMELIST, NULL, cr_iostat2, cilist_wn,
10224 WN_kid0(WN_kid(tree,iolist)), stack_wn);
10225 } else {
10226 if (LAST_CALL(flflag)) {
10227 GEN_IO_CALL_3 ( block, FIO_CR_WRITE_NAMELIST, NULL,
10228 cr_iostat2, cilist_wn,
10229 WN_kid0(WN_kid(tree,iolist)), stack_wn);
10230 } else {
10231 GEN_IO_CALL_3 ( block, FIO_CR_WRITE_NAMELIST, cr_iostat1,
10232 NULL, cilist_wn,
10233 WN_kid0(WN_kid(tree,iolist)), stack_wn);
10234 }
10235 }
10236 break;
10237
10238 case IOS_ACCEPT:
10239 case IOS_DECODE:
10240 case IOS_READ:
10241
10242 switch (ioclass) {
10243
10244 case FCL_EXT_FORMATTED:
10245 if (current_io_library == IOLIB_MIPS) {
10246 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10247 err, end, (LABEL_IDX) 0, zero_escape_freq );
10248 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
10249 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
10250 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
10251 Gen_Io_PutFieldConst ( block, st, FSC_CIEND, endstat );
10252 Gen_Io_PutAddrWN ( block, st, FSC_CIFMT, format_wn );
10253 if (items[IOC_KEY] != NULL) {
10254 keytype = IOC_KEY;
10255 matchtype = ISEQUAL;
10256 } else if (items[IOC_KEYEQ] != NULL) {
10257 keytype = IOC_KEYEQ;
10258 matchtype = ISEQUAL;
10259 } else if (items[IOC_KEYGE] != NULL) {
10260 keytype = IOC_KEYGE;
10261 matchtype = ISGTEQ;
10262 } else if (items[IOC_KEYGT] != NULL) {
10263 keytype = IOC_KEYGT;
10264 matchtype = ISGREAT;
10265 } else
10266 keytype = 0;
10267 if (keytype) {
10268 if (itemsx[keytype]) {
10269
10270 Gen_Io_PutAddrWN ( block, st, FSC_CIKEYVAL, items[keytype] );
10271 Gen_Io_PutFieldWN ( block, st, FSC_CIKEYVALLEN,
10272 itemsx[keytype] );
10273 Gen_Io_PutFieldConst( block, st, FSC_CIKEYTYPE, CHARTYPE );
10274 } else {
10275
10276
10277
10278
10279
10280 INT32 foffset = (Pointer_Size == 4)
10281 ? fiostruct_info[FSC_CIKEYVAL].offset32
10282 : fiostruct_info[FSC_CIKEYVAL].offset64;
10283 wnx = WN_CreateStid ( OPC_I4STID, foffset, st,
10284 Be_Type_Tbl(MTYPE_I4), items[keytype] );
10285 WN_INSERT_BlockLast ( block, wnx );
10286 Gen_Io_PutFieldConst( block, st, FSC_CIKEYTYPE, LONGTYPE );
10287 }
10288 Gen_Io_PutFieldConst( block, st, FSC_CIMATCH, matchtype );
10289 }
10290 else {
10291
10292 Gen_Io_PutFieldConst( block, st, FSC_CIMATCH, 0 );
10293 Gen_Io_PutFieldConst ( block, st, FSC_CIKEYTYPE, 0 );
10294 }
10295 if (items[IOC_KEYID] != NULL)
10296 Gen_Io_PutFieldWN ( block, st, FSC_CIKEYID, items[IOC_KEYID] );
10297 else
10298 Gen_Io_PutFieldConst( block, st, FSC_CIKEYID, -1L );
10299 if (varfmt != NULL) {
10300 Gen_Io_PutAddrWN ( block, st, FSC_CIVFMT, varfmt );
10301 Gen_Io_PutAddrWN ( block, st, FSC_CIVFMTFP, varfmtfp );
10302 }
10303 if (mp_io) {
10304 unit_ptr = Get_UnitPointer_ST();
10305 GEN_IO_CALL_2 ( block, FIO_EXT_READ_FORMAT_start, iostat1, NULL,
10306 Make_IoAddr_WN ( st ),
10307 Make_IoAddr_WN ( unit_ptr ) );
10308 }
10309 else
10310 GEN_IO_CALL_1 ( block, FIO_EXT_READ_FORMAT_start, iostat1, NULL,
10311 Make_IoAddr_WN ( st ) );
10312 lower_io_items ( block, tree, FFT_FORMAT, iostat1,
10313 iolist, WN_kid_count(tree) );
10314 if (mp_io) {
10315 GEN_IO_CALL_1 ( block, FIO_EXT_READ_FORMAT_end, iostat1,
10316 iostat2, Make_IoAddr_WN ( unit_ptr ) );
10317 }
10318 else
10319 GEN_IO_CALL_0 ( block, FIO_EXT_READ_FORMAT_end, iostat1,
10320 iostat2 );
10321 } else {
10322 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10323 err, end, (LABEL_IDX) 0, zero_escape_freq );
10324 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
10325
10326
10327
10328 word1 = 0;
10329 if (Target_Byte_Sex == LITTLE_ENDIAN) {
10330 cilist_header_ptr = (cilist_header_type *)&word1;
10331 cilist_header_ptr->version = 1;
10332 cilist_header_ptr->uflag = unit_flag;
10333 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
10334 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
10335 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
10336 cilist_header_ptr->internal = is_internal_io;
10337 cilist_header_ptr->dflag = is_direct;
10338 cilist_header_ptr->fmt = fmt_flag;
10339 cilist_header_ptr->stksize = stk_size;
10340 cilist_header_ptr->icount = 7;
10341 } else {
10342 word1 = ( (UINT64) 1 << 56 ) |
10343 ( (UINT64) unit_flag << 48 ) |
10344 ( (UINT64) eeeflag << 40 ) |
10345 ( (UINT64) is_internal_io << 33 ) |
10346 ( (UINT64) is_direct << 32 ) |
10347 ( (UINT64) fmt_flag << 24 ) |
10348 ( (UINT64) stk_size << 16 ) |
10349 ( (UINT64) 7 ) ;
10350 }
10351 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
10352 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
10353 parsfmt_wn, fmtsrc_wn, advance_wn,
10354 size_wn, varfmt );
10355
10356 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
10357 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
10358 FIO_CR_READ_FORMATTED, FALSE, &offset,
10359 iolist, WN_kid_count(tree));
10360 }
10361 break;
10362
10363 case FCL_EXT_UNFORMATTED:
10364 if (current_io_library == IOLIB_MIPS) {
10365 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10366 err, end, (LABEL_IDX) 0, zero_escape_freq );
10367 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
10368 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
10369 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
10370 Gen_Io_PutFieldConst ( block, st, FSC_CIEND, endstat );
10371 if (items[IOC_KEY] != NULL) {
10372 keytype = IOC_KEY;
10373 matchtype = ISEQUAL;
10374 } else if (items[IOC_KEYEQ] != NULL) {
10375 keytype = IOC_KEYEQ;
10376 matchtype = ISEQUAL;
10377 } else if (items[IOC_KEYGE] != NULL) {
10378 keytype = IOC_KEYGE;
10379 matchtype = ISGTEQ;
10380 } else if (items[IOC_KEYGT] != NULL) {
10381 keytype = IOC_KEYGT;
10382 matchtype = ISGREAT;
10383 } else
10384 keytype = 0;
10385 if (keytype) {
10386 if (itemsx[keytype]) {
10387 Gen_Io_PutAddrWN ( block, st, FSC_CIKEYVAL, items[keytype] );
10388 Gen_Io_PutFieldWN ( block, st, FSC_CIKEYVALLEN,
10389 itemsx[keytype] );
10390 Gen_Io_PutFieldConst( block, st, FSC_CIKEYTYPE, CHARTYPE );
10391 } else {
10392
10393
10394
10395
10396
10397 INT32 foffset = (Pointer_Size == 4)
10398 ? fiostruct_info[FSC_CIKEYVAL].offset32
10399 : fiostruct_info[FSC_CIKEYVAL].offset64;
10400 wnx = WN_CreateStid ( OPC_I4STID, foffset, st,
10401 Be_Type_Tbl(MTYPE_I4), items[keytype] );
10402 WN_INSERT_BlockLast ( block, wnx );
10403 Gen_Io_PutFieldConst( block, st, FSC_CIKEYTYPE, LONGTYPE );
10404 }
10405 Gen_Io_PutFieldConst( block, st, FSC_CIMATCH, matchtype );
10406 }
10407 else {
10408 Gen_Io_PutFieldConst( block, st, FSC_CIMATCH, 0 );
10409 Gen_Io_PutFieldConst ( block, st, FSC_CIKEYTYPE, 0 );
10410 }
10411 if (items[IOC_KEYID] != NULL)
10412 Gen_Io_PutFieldWN ( block, st, FSC_CIKEYID, items[IOC_KEYID] );
10413 else
10414 Gen_Io_PutFieldConst( block, st, FSC_CIKEYID, -1L );
10415 if (mp_io) {
10416 unit_ptr = Get_UnitPointer_ST();
10417 GEN_IO_CALL_2 ( block, FIO_EXT_READ_UNFORMAT_start,
10418 iostat1, NULL, Make_IoAddr_WN ( st ),
10419 Make_IoAddr_WN ( unit_ptr ) );
10420 }
10421 else
10422 GEN_IO_CALL_1 ( block, FIO_EXT_READ_UNFORMAT_start,
10423 iostat1, NULL, Make_IoAddr_WN ( st ) );
10424 lower_io_items ( block, tree, FFT_UNFORMAT, iostat1,
10425 iolist, WN_kid_count(tree) );
10426 if (mp_io) {
10427 GEN_IO_CALL_1 ( block, FIO_EXT_READ_UNFORMAT_end, iostat1,
10428 iostat2, Make_IoAddr_WN ( unit_ptr ) );
10429 }
10430 else
10431 GEN_IO_CALL_0 ( block, FIO_EXT_READ_UNFORMAT_end, iostat1,
10432 iostat2 );
10433 } else {
10434 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10435 err, end, (LABEL_IDX) 0, zero_escape_freq );
10436 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
10437
10438
10439
10440 word1 = 0;
10441 if (Target_Byte_Sex == LITTLE_ENDIAN) {
10442 cilist_header_ptr = (cilist_header_type *)&word1;
10443 cilist_header_ptr->version = 1;
10444 cilist_header_ptr->uflag = unit_flag;
10445 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
10446 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
10447 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
10448 cilist_header_ptr->internal = is_internal_io;
10449 cilist_header_ptr->dflag = is_direct;
10450 cilist_header_ptr->fmt = fmt_flag;
10451 cilist_header_ptr->stksize = stk_size;
10452 cilist_header_ptr->icount = 7;
10453 } else {
10454 word1 = ( (UINT64) 1 << 56 ) |
10455 ( (UINT64) unit_flag << 48 ) |
10456 ( (UINT64) eeeflag << 40 ) |
10457 ( (UINT64) is_internal_io << 33 ) |
10458 ( (UINT64) is_direct << 32 ) |
10459 ( (UINT64) fmt_flag << 24 ) |
10460 ( (UINT64) stk_size << 16 ) |
10461 ( (UINT64) 7 ) ;
10462 }
10463 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
10464 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
10465 parsfmt_wn, fmtsrc_wn, advance_wn,
10466 size_wn, varfmt );
10467 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
10468 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
10469 FIO_CR_READ_UNFORMATTED, FALSE, &offset,
10470 iolist, WN_kid_count(tree));
10471 }
10472 break;
10473
10474 case FCL_EXT_LIST:
10475 if (current_io_library == IOLIB_MIPS) {
10476 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10477 err, end, (LABEL_IDX) 0, zero_escape_freq );
10478 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
10479 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
10480 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
10481 Gen_Io_PutFieldConst ( block, st, FSC_CIEND, endstat );
10482 Gen_Io_PutFieldConst ( block, st, FSC_CIKEYTYPE, 0 );
10483 if (mp_io) {
10484 unit_ptr = Get_UnitPointer_ST();
10485 GEN_IO_CALL_2 ( block, FIO_EXT_READ_LIST_start, iostat1, NULL,
10486 Make_IoAddr_WN ( st ),
10487 Make_IoAddr_WN ( unit_ptr ) );
10488 }
10489 else
10490 GEN_IO_CALL_1 ( block, FIO_EXT_READ_LIST_start, iostat1, NULL,
10491 Make_IoAddr_WN ( st ) );
10492 lower_io_items ( block, tree, FFT_LIST, iostat1,
10493 iolist, WN_kid_count(tree) );
10494 if (mp_io) {
10495 GEN_IO_CALL_1 ( block, FIO_EXT_READ_LIST_end, iostat1,
10496 iostat2, Make_IoAddr_WN ( unit_ptr ) );
10497 }
10498 else
10499 GEN_IO_CALL_0 ( block, FIO_EXT_READ_LIST_end, iostat1,
10500 iostat2 );
10501 } else {
10502 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10503 err, end, (LABEL_IDX) 0, zero_escape_freq );
10504 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
10505
10506
10507
10508 word1 = 0;
10509 if (Target_Byte_Sex == LITTLE_ENDIAN) {
10510 cilist_header_ptr = (cilist_header_type *)&word1;
10511 cilist_header_ptr->version = 1;
10512 cilist_header_ptr->uflag = unit_flag;
10513 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
10514 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
10515 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
10516 cilist_header_ptr->internal = is_internal_io;
10517 cilist_header_ptr->dflag = is_direct;
10518 cilist_header_ptr->fmt = fmt_flag;
10519 cilist_header_ptr->stksize = stk_size;
10520 cilist_header_ptr->icount = 7;
10521 } else {
10522 word1 = ( (UINT64) 1 << 56 ) |
10523 ( (UINT64) unit_flag << 48 ) |
10524 ( (UINT64) eeeflag << 40 ) |
10525 ( (UINT64) is_internal_io << 33 ) |
10526 ( (UINT64) is_direct << 32 ) |
10527 ( (UINT64) fmt_flag << 24 ) |
10528 ( (UINT64) stk_size << 16 ) |
10529 ( (UINT64) 7 ) ;
10530 }
10531 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
10532 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
10533 parsfmt_wn, fmtsrc_wn, advance_wn,
10534 size_wn, varfmt );
10535 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
10536 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
10537 FIO_CR_READ_FORMATTED, FALSE, &offset,
10538 iolist, WN_kid_count(tree));
10539 }
10540 break;
10541
10542 case FCL_EXT_NAMELIST:
10543 if (current_io_library == IOLIB_MIPS) {
10544 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
10545 err, end, (LABEL_IDX) 0, zero_escape_freq );
10546 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
10547 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
10548 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
10549 Gen_Io_PutFieldConst ( block, st, FSC_CIEND, endstat );
10550 Gen_Io_PutAddrWN ( block, st, FSC_CINML, format_wn );
10551 if (mp_io) {
10552 unit_ptr = Get_UnitPointer_ST();
10553 GEN_IO_CALL_2 ( block, FIO_EXT_READ_NAMELIST_start, iostat1,
10554 iostat2, Make_IoAddr_WN ( st ),
10555 Make_IoAddr_WN ( unit_ptr ) );
10556 }
10557 else
10558 GEN_IO_CALL_1 ( block, FIO_EXT_READ_NAMELIST_start, iostat1,
10559 iostat2, Make_IoAddr_WN ( st ) );
10560 } else {
10561 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
10562 err, end, (LABEL_IDX) 0, zero_escape_freq );
10563 cilist_st = Get_IoStruct_ST ( block, FID_CRAY_CLIST, TRUE);
10564 word1 = 0;
10565 if (Target_Byte_Sex == LITTLE_ENDIAN) {
10566 cilist_header_ptr = (cilist_header_type *)&word1;
10567 cilist_header_ptr->version = 1;
10568 cilist_header_ptr->uflag = unit_flag;
10569 cilist_header_ptr->iostatflg = iostat_flag;
10570 cilist_header_ptr->eorflag = eor_flag;
10571 cilist_header_ptr->endflag = end_flag;
10572 cilist_header_ptr->errflag = err_flag;
10573 cilist_header_ptr->advcode = advance_flag;
10574 cilist_header_ptr->edcode = edflag;
10575 cilist_header_ptr->internal = is_internal_io;
10576 cilist_header_ptr->dflag = is_direct;
10577 cilist_header_ptr->fmt = fmt_flag;
10578 cilist_header_ptr->stksize = stk_size;
10579 cilist_header_ptr->icount = 7;
10580 } else {
10581 word1 = ( (UINT64) 1 << 56 ) |
10582 ( (UINT64) unit_flag << 48 ) |
10583 ( (UINT64) eeeflag << 40 ) |
10584 ( (UINT64) advance_flag << 35 ) |
10585 ( (UINT64) edflag << 34 ) |
10586 ( (UINT64) is_internal_io << 33 ) |
10587 ( (UINT64) is_direct << 32 ) |
10588 ( (UINT64) fmt_flag << 24 ) |
10589 ( (UINT64) stk_size << 16 ) |
10590 ( (UINT64) 7 ) ;
10591 }
10592 Gen_Io_PutFieldConst ( block, cilist_st, FCR_CI_WORD1, word1 );
10593 Set_Cilist_Fields( block, cilist_st, unit_wn, items, rec_wn,
10594 parsfmt_wn, fmtsrc_wn, advance_wn,
10595 size_wn, varfmt );
10596 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(cilist_st)),
10597 cilist_st);
10598 if (stack_ty == (TY_IDX) 0)
10599 stack_ty = Make_Simple_Array_Type("stack_space_type", STACK_LENGTH,
10600 Be_Type_Tbl(MTYPE_U8));
10601
10602 if (Current_pu != cray_iolist_current_pu) {
10603 cray_iolist_current_pu = Current_pu;
10604 stack_st = Gen_Temp_Symbol ( stack_ty, TY_name(stack_ty) );
10605 io_set_addr_passed_flag(stack_st);
10606 }
10607
10608 stack_wn = WN_CreateLda (opc_lda, 0,
10609 Make_Pointer_Type (ST_type(stack_st), FALSE),
10610 stack_st);
10611
10612 GEN_IO_CALL_3 ( block, FIO_CR_READ_NAMELIST, NULL,
10613 iostat2, cilist_wn,
10614 format_wn, stack_wn);
10615 }
10616 break;
10617
10618 case FCL_INT_FORMATTED:
10619 if (current_io_library == IOLIB_MIPS) {
10620 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10621 err, end, (LABEL_IDX) 0, zero_escape_freq );
10622 st = Get_IoStruct_ST ( block, FID_ICILIST, FALSE );
10623 Gen_Io_PutFieldConst ( block, st, FSI_ICIERR, errstat );
10624 Gen_Io_PutAddrWN ( block, st, FSI_ICIUNIT, unit_wn );
10625 Gen_Io_PutFieldConst ( block, st, FSI_ICIEND, endstat );
10626 Gen_Io_PutAddrWN ( block, st, FSI_ICIFMT, format_wn );
10627 if (unit_len != NULL)
10628 Gen_Io_PutFieldWN ( block, st, FSI_ICIRLEN, unit_len );
10629 else if (WN_opcode(unit_wn) == OPC_U4LDA ||
10630 WN_opcode(unit_wn) == OPC_U8LDA)
10631 Gen_Io_PutFieldConst ( block, st, FSI_ICIRLEN,
10632 TY_size (Ty_Table [ST_type (WN_st(unit_wn))])
10633 );
10634 else
10635 Fail_FmtAssertion(
10636 "unexpected decode length (%s) in I/O processing",
10637 OPCODE_name(WN_opcode(unit_wn)));
10638 if (unit_rec != NULL)
10639 Gen_Io_PutFieldWN ( block, st, FSI_ICIRNUM, unit_rec );
10640 else
10641 Gen_Io_PutFieldConst ( block, st, FSI_ICIRNUM, 1 );
10642 if (varfmt != NULL) {
10643 Gen_Io_PutAddrWN ( block, st, FSI_ICIVFMT, varfmt );
10644 Gen_Io_PutAddrWN ( block, st, FSI_ICIVFMTFP, varfmtfp );
10645 }
10646 if (mp_io) {
10647 unit_ptr = Get_UnitPointer_ST();
10648 GEN_IO_CALL_2 ( block, FIO_INT_READ_FORMAT_start, iostat1, NULL,
10649 Make_IoAddr_WN ( st ),
10650 Make_IoAddr_WN ( unit_ptr ) );
10651 }
10652 else
10653 GEN_IO_CALL_1 ( block, FIO_INT_READ_FORMAT_start, iostat1, NULL,
10654 Make_IoAddr_WN ( st ) );
10655 lower_io_items ( block, tree, FFT_FORMAT, iostat1,
10656 iolist, WN_kid_count(tree) );
10657 if (mp_io) {
10658 GEN_IO_CALL_1 ( block, FIO_INT_READ_FORMAT_end, iostat1,
10659 iostat2, Make_IoAddr_WN ( unit_ptr ) );
10660 }
10661 else
10662 GEN_IO_CALL_0 ( block, FIO_INT_READ_FORMAT_end, iostat1,
10663 iostat2 );
10664 } else {
10665 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10666 err, end, (LABEL_IDX) 0, zero_escape_freq );
10667 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
10668
10669
10670
10671 word1 = 0;
10672 if (Target_Byte_Sex == LITTLE_ENDIAN) {
10673 cilist_header_ptr = (cilist_header_type *)&word1;
10674 cilist_header_ptr->version = 1;
10675 cilist_header_ptr->uflag = unit_flag;
10676 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
10677 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
10678 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
10679 cilist_header_ptr->edcode = edflag;
10680 cilist_header_ptr->internal = is_internal_io;
10681 cilist_header_ptr->dflag = is_direct;
10682 cilist_header_ptr->fmt = fmt_flag;
10683 cilist_header_ptr->stksize = stk_size;
10684 cilist_header_ptr->icount = 7;
10685 } else {
10686 word1 = ( (UINT64) 1 << 56 ) |
10687 ( (UINT64) unit_flag << 48 ) |
10688 ( (UINT64) eeeflag << 40 ) |
10689 ( (UINT64) edflag << 34 ) |
10690 ( (UINT64) is_internal_io << 33 ) |
10691 ( (UINT64) is_direct << 32 ) |
10692 ( (UINT64) fmt_flag << 24 ) |
10693 ( (UINT64) stk_size << 16 ) |
10694 ( (UINT64) 7 ) ;
10695 }
10696 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
10697 Gen_Io_PutAddrWN ( block, st, FCR_CI_FMTSRC, format_wn );
10698 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
10699 parsfmt_wn, fmtsrc_wn, advance_wn,
10700 size_wn, varfmt );
10701 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
10702 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
10703 FIO_CR_READ_FORMATTED, FALSE, &offset,
10704 iolist, WN_kid_count(tree));
10705 }
10706 break;
10707
10708 case FCL_INT_LIST:
10709 if (current_io_library == IOLIB_MIPS) {
10710 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10711 err, end, (LABEL_IDX) 0, zero_escape_freq );
10712 st = Get_IoStruct_ST ( block, FID_ICILIST, FALSE );
10713 Gen_Io_PutFieldConst ( block, st, FSI_ICIERR, errstat );
10714 Gen_Io_PutAddrWN ( block, st, FSI_ICIUNIT, unit_wn );
10715 Gen_Io_PutFieldConst ( block, st, FSI_ICIEND, endstat );
10716 if (unit_len != NULL)
10717 Gen_Io_PutFieldWN ( block, st, FSI_ICIRLEN, unit_len );
10718 else if (WN_opcode(unit_wn) == OPC_U4LDA ||
10719 WN_opcode(unit_wn) == OPC_U8LDA)
10720 Gen_Io_PutFieldConst ( block, st, FSI_ICIRLEN,
10721 TY_size (Ty_Table [ST_type (WN_st(unit_wn))])
10722 );
10723 else
10724 Fail_FmtAssertion(
10725 "unexpected decode length (%s) in I/O processing",
10726 OPCODE_name(WN_opcode(unit_wn)));
10727 if (unit_rec != NULL)
10728 Gen_Io_PutFieldWN ( block, st, FSI_ICIRNUM, unit_rec );
10729 else
10730 Gen_Io_PutFieldConst ( block, st, FSI_ICIRNUM, 1 );
10731 if (mp_io) {
10732 unit_ptr = Get_UnitPointer_ST();
10733 GEN_IO_CALL_2 ( block, FIO_INT_READ_LIST_start, iostat1, NULL,
10734 Make_IoAddr_WN ( st ),
10735 Make_IoAddr_WN ( unit_ptr ) );
10736 }
10737 else
10738 GEN_IO_CALL_1 ( block, FIO_INT_READ_LIST_start, iostat1, NULL,
10739 Make_IoAddr_WN ( st ) );
10740 lower_io_items ( block, tree, FFT_LIST, iostat1,
10741 iolist, WN_kid_count(tree) );
10742 if (mp_io) {
10743 GEN_IO_CALL_1 ( block, FIO_INT_READ_LIST_end, iostat1,
10744 iostat2, Make_IoAddr_WN ( unit_ptr ) );
10745 }
10746 else
10747 GEN_IO_CALL_0 ( block, FIO_INT_READ_LIST_end, iostat1,
10748 iostat2 );
10749 } else {
10750 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10751 err, end, (LABEL_IDX) 0, zero_escape_freq );
10752 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
10753
10754
10755
10756 word1 = 0;
10757 if (Target_Byte_Sex == LITTLE_ENDIAN) {
10758 cilist_header_ptr = (cilist_header_type *)&word1;
10759 cilist_header_ptr->version = 1;
10760 cilist_header_ptr->uflag = unit_flag;
10761 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
10762 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
10763 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
10764 cilist_header_ptr->internal = is_internal_io;
10765 cilist_header_ptr->dflag = is_direct;
10766 cilist_header_ptr->fmt = fmt_flag;
10767 cilist_header_ptr->stksize = stk_size;
10768 cilist_header_ptr->icount = 7;
10769 } else {
10770 word1 = ( (UINT64) 1 << 56 ) |
10771 ( (UINT64) unit_flag << 48 ) |
10772 ( (UINT64) eeeflag << 40 ) |
10773 ( (UINT64) is_internal_io << 33 ) |
10774 ( (UINT64) is_direct << 32 ) |
10775 ( (UINT64) fmt_flag << 24 ) |
10776 ( (UINT64) stk_size << 16 ) |
10777 ( (UINT64) 7 ) ;
10778 }
10779 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
10780 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
10781 parsfmt_wn, fmtsrc_wn, advance_wn,
10782 size_wn, varfmt );
10783 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
10784 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
10785 FIO_CR_READ_FORMATTED, FALSE, &offset,
10786 iolist, WN_kid_count(tree));
10787 }
10788 break;
10789
10790 case FCL_DIR_FORMATTED:
10791 if (current_io_library == IOLIB_MIPS) {
10792 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10793 err, end, (LABEL_IDX) 0, zero_escape_freq );
10794 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
10795 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
10796 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
10797 Gen_Io_PutFieldConst ( block, st, FSC_CIEND, endstat );
10798 Gen_Io_PutAddrWN ( block, st, FSC_CIFMT, format_wn );
10799 Gen_Io_PutFieldWN ( block, st, FSC_CIREC, items[IOC_REC] );
10800 if (varfmt != NULL) {
10801 Gen_Io_PutAddrWN ( block, st, FSC_CIVFMT, varfmt );
10802 Gen_Io_PutAddrWN ( block, st, FSC_CIVFMTFP, varfmtfp );
10803 }
10804 if (mp_io) {
10805 unit_ptr = Get_UnitPointer_ST();
10806 GEN_IO_CALL_2 ( block, FIO_DIR_READ_FORMAT_start, iostat1, NULL,
10807 Make_IoAddr_WN ( st ),
10808 Make_IoAddr_WN ( unit_ptr ) );
10809 }
10810 else
10811 GEN_IO_CALL_1 ( block, FIO_DIR_READ_FORMAT_start, iostat1, NULL,
10812 Make_IoAddr_WN ( st ) );
10813 lower_io_items ( block, tree, FFT_FORMAT, iostat1,
10814 iolist, WN_kid_count(tree) );
10815 if (mp_io) {
10816 GEN_IO_CALL_1 ( block, FIO_DIR_READ_FORMAT_end, iostat1,
10817 iostat2, Make_IoAddr_WN ( unit_ptr ) );
10818 }
10819 else
10820 GEN_IO_CALL_0 ( block, FIO_DIR_READ_FORMAT_end, iostat1,
10821 iostat2 );
10822 } else {
10823 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10824 err, end, (LABEL_IDX) 0, zero_escape_freq );
10825 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
10826
10827
10828
10829 word1 = 0;
10830 if (Target_Byte_Sex == LITTLE_ENDIAN) {
10831 cilist_header_ptr = (cilist_header_type *)&word1;
10832 cilist_header_ptr->version = 1;
10833 cilist_header_ptr->uflag = unit_flag;
10834 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
10835 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
10836 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
10837 cilist_header_ptr->internal = is_internal_io;
10838 cilist_header_ptr->dflag = is_direct;
10839 cilist_header_ptr->fmt = fmt_flag;
10840 cilist_header_ptr->stksize = stk_size;
10841 cilist_header_ptr->icount = 7;
10842 } else {
10843 word1 = ( (UINT64) 1 << 56 ) |
10844 ( (UINT64) unit_flag << 48 ) |
10845 ( (UINT64) eeeflag << 40 ) |
10846 ( (UINT64) is_internal_io << 33 ) |
10847 ( (UINT64) is_direct << 32 ) |
10848 ( (UINT64) fmt_flag << 24 ) |
10849 ( (UINT64) stk_size << 16 ) |
10850 ( (UINT64) 7 ) ;
10851 }
10852 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
10853 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
10854 parsfmt_wn, fmtsrc_wn, advance_wn,
10855 size_wn, varfmt );
10856 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
10857 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
10858 FIO_CR_READ_FORMATTED, FALSE, &offset,
10859 iolist, WN_kid_count(tree));
10860 }
10861 break;
10862
10863 case FCL_DIR_UNFORMATTED:
10864 if (current_io_library == IOLIB_MIPS) {
10865 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10866 err, end, (LABEL_IDX) 0, zero_escape_freq );
10867 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
10868 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
10869 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
10870 Gen_Io_PutFieldConst ( block, st, FSC_CIEND, endstat );
10871 Gen_Io_PutFieldWN ( block, st, FSC_CIREC, items[IOC_REC] );
10872 if (mp_io) {
10873 unit_ptr = Get_UnitPointer_ST();
10874 GEN_IO_CALL_2 ( block, FIO_DIR_READ_UNFORMAT_start, iostat1,
10875 NULL, Make_IoAddr_WN ( st ),
10876 Make_IoAddr_WN ( unit_ptr ) );
10877 }
10878 else
10879 GEN_IO_CALL_1 ( block, FIO_DIR_READ_UNFORMAT_start, iostat1,
10880 NULL, Make_IoAddr_WN ( st ) );
10881 lower_io_items ( block, tree, FFT_UNFORMAT, iostat1,
10882 iolist, WN_kid_count(tree) );
10883 if (mp_io) {
10884 GEN_IO_CALL_1 ( block, FIO_DIR_READ_UNFORMAT_end, iostat1,
10885 iostat2, Make_IoAddr_WN ( unit_ptr ) );
10886 }
10887 else
10888 GEN_IO_CALL_0 ( block, FIO_DIR_READ_UNFORMAT_end, iostat1,
10889 iostat2 );
10890 } else {
10891 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10892 err, end, (LABEL_IDX) 0, zero_escape_freq );
10893 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
10894
10895
10896
10897 word1 = 0;
10898 if (Target_Byte_Sex == LITTLE_ENDIAN) {
10899 cilist_header_ptr = (cilist_header_type *)&word1;
10900 cilist_header_ptr->version = 1;
10901 cilist_header_ptr->uflag = unit_flag;
10902 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
10903 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
10904 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
10905 cilist_header_ptr->internal = is_internal_io;
10906 cilist_header_ptr->dflag = is_direct;
10907 cilist_header_ptr->fmt = fmt_flag;
10908 cilist_header_ptr->stksize = stk_size;
10909 cilist_header_ptr->icount = 7;
10910 } else {
10911 word1 = ( (UINT64) 1 << 56 ) |
10912 ( (UINT64) unit_flag << 48 ) |
10913 ( (UINT64) eeeflag << 40 ) |
10914 ( (UINT64) is_internal_io << 33 ) |
10915 ( (UINT64) is_direct << 32 ) |
10916 ( (UINT64) fmt_flag << 24 ) |
10917 ( (UINT64) stk_size << 16 ) |
10918 ( (UINT64) 7 ) ;
10919 }
10920 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
10921 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
10922 parsfmt_wn, fmtsrc_wn, advance_wn,
10923 size_wn, varfmt );
10924 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
10925 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
10926 FIO_CR_READ_UNFORMATTED, FALSE, &offset,
10927 iolist, WN_kid_count(tree));
10928 }
10929 break;
10930
10931 default:
10932 Fail_FmtAssertion(
10933 "unexpected I/O statement (%d) in I/O processing",
10934 ioclass);
10935
10936 }
10937
10938 break;
10939
10940 case IOS_ENCODE:
10941 case IOS_PRINT:
10942 case IOS_TYPE:
10943 case IOS_WRITE:
10944
10945 switch (ioclass) {
10946
10947 case FCL_EXT_FORMATTED:
10948 if (current_io_library == IOLIB_MIPS) {
10949 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10950 err, end, (LABEL_IDX) 0, zero_escape_freq );
10951 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
10952 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
10953 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
10954 Gen_Io_PutAddrWN ( block, st, FSC_CIFMT, format_wn );
10955 if (varfmt != NULL) {
10956 Gen_Io_PutAddrWN ( block, st, FSC_CIVFMT, varfmt );
10957 Gen_Io_PutAddrWN ( block, st, FSC_CIVFMTFP, varfmtfp );
10958 }
10959 if (mp_io) {
10960 unit_ptr = Get_UnitPointer_ST();
10961 GEN_IO_CALL_2 ( block, FIO_EXT_WRITE_FORMAT_start, iostat1,
10962 NULL, Make_IoAddr_WN ( st ),
10963 Make_IoAddr_WN ( unit_ptr ) );
10964 }
10965 else
10966 GEN_IO_CALL_1 ( block, FIO_EXT_WRITE_FORMAT_start, iostat1,
10967 NULL, Make_IoAddr_WN ( st ) );
10968 lower_io_items ( block, tree, FFT_FORMAT, iostat1,
10969 iolist, WN_kid_count(tree) );
10970 if (mp_io) {
10971 GEN_IO_CALL_1 ( block, FIO_EXT_WRITE_FORMAT_end, iostat1,
10972 iostat2, Make_IoAddr_WN ( unit_ptr ) );
10973 }
10974 else
10975 GEN_IO_CALL_0 ( block, FIO_EXT_WRITE_FORMAT_end, iostat1,
10976 iostat2 );
10977 } else {
10978 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
10979 err, end, (LABEL_IDX) 0, zero_escape_freq );
10980 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
10981
10982
10983
10984 word1 = 0;
10985 if (Target_Byte_Sex == LITTLE_ENDIAN) {
10986 cilist_header_ptr = (cilist_header_type *)&word1;
10987 cilist_header_ptr->version = 1;
10988 cilist_header_ptr->uflag = unit_flag;
10989 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
10990 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
10991 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
10992 cilist_header_ptr->internal = is_internal_io;
10993 cilist_header_ptr->dflag = is_direct;
10994 cilist_header_ptr->fmt = fmt_flag;
10995 cilist_header_ptr->stksize = stk_size;
10996 cilist_header_ptr->icount = 7;
10997 } else {
10998 word1 = ( (UINT64) 1 << 56 ) |
10999 ( (UINT64) unit_flag << 48 ) |
11000 ( (UINT64) eeeflag << 40 ) |
11001 ( (UINT64) is_internal_io << 33 ) |
11002 ( (UINT64) is_direct << 32 ) |
11003 ( (UINT64) fmt_flag << 24 ) |
11004 ( (UINT64) stk_size << 16 ) |
11005 ( (UINT64) 7 ) ;
11006 }
11007 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
11008 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
11009 parsfmt_wn, fmtsrc_wn, advance_wn,
11010 size_wn, varfmt );
11011
11012 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
11013 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
11014 FIO_CR_WRITE_FORMATTED, FALSE, &offset,
11015 iolist, WN_kid_count(tree));
11016 }
11017 break;
11018
11019 case FCL_EXT_UNFORMATTED:
11020 if (current_io_library == IOLIB_MIPS) {
11021 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11022 err, end, (LABEL_IDX) 0, zero_escape_freq );
11023 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
11024 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
11025 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
11026 if (mp_io) {
11027 unit_ptr = Get_UnitPointer_ST();
11028 GEN_IO_CALL_2 ( block, FIO_EXT_WRITE_UNFORMAT_start, iostat1,
11029 NULL, Make_IoAddr_WN ( st ),
11030 Make_IoAddr_WN ( unit_ptr ) );
11031 }
11032 else
11033 GEN_IO_CALL_1 ( block, FIO_EXT_WRITE_UNFORMAT_start, iostat1,
11034 NULL, Make_IoAddr_WN ( st ) );
11035 lower_io_items ( block, tree, FFT_UNFORMAT, iostat1,
11036 iolist, WN_kid_count(tree) );
11037 if (mp_io) {
11038 GEN_IO_CALL_1 ( block, FIO_EXT_WRITE_UNFORMAT_end, iostat1,
11039 iostat2, Make_IoAddr_WN ( unit_ptr ) );
11040 }
11041 else
11042 GEN_IO_CALL_0 ( block, FIO_EXT_WRITE_UNFORMAT_end, iostat1,
11043 iostat2 );
11044 } else {
11045 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11046 err, end, (LABEL_IDX) 0, zero_escape_freq );
11047 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
11048
11049
11050
11051 word1 = 0;
11052 if (Target_Byte_Sex == LITTLE_ENDIAN) {
11053 cilist_header_ptr = (cilist_header_type *)&word1;
11054 cilist_header_ptr->version = 1;
11055 cilist_header_ptr->uflag = unit_flag;
11056 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
11057 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
11058 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
11059 cilist_header_ptr->internal = is_internal_io;
11060 cilist_header_ptr->dflag = is_direct;
11061 cilist_header_ptr->fmt = fmt_flag;
11062 cilist_header_ptr->stksize = stk_size;
11063 cilist_header_ptr->icount = 7;
11064 } else {
11065 word1 = ( (UINT64) 1 << 56 ) |
11066 ( (UINT64) unit_flag << 48 ) |
11067 ( (UINT64) eeeflag << 40 ) |
11068 ( (UINT64) is_internal_io << 33 ) |
11069 ( (UINT64) is_direct << 32 ) |
11070 ( (UINT64) fmt_flag << 24 ) |
11071 ( (UINT64) stk_size << 16 ) |
11072 ( (UINT64) 7 ) ;
11073 }
11074 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
11075 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
11076 parsfmt_wn, fmtsrc_wn, advance_wn,
11077 size_wn, varfmt );
11078
11079 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
11080 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
11081 FIO_CR_WRITE_UNFORMATTED, FALSE, &offset,
11082 iolist, WN_kid_count(tree));
11083 }
11084 break;
11085
11086 case FCL_EXT_LIST:
11087 if (current_io_library == IOLIB_MIPS) {
11088 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11089 err, end, (LABEL_IDX) 0, zero_escape_freq );
11090 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
11091 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
11092 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
11093 if (mp_io) {
11094 unit_ptr = Get_UnitPointer_ST();
11095 GEN_IO_CALL_2 ( block, FIO_EXT_WRITE_LIST_start, iostat1,
11096 NULL, Make_IoAddr_WN ( st ),
11097 Make_IoAddr_WN ( unit_ptr ) );
11098 }
11099 else
11100 GEN_IO_CALL_1 ( block, FIO_EXT_WRITE_LIST_start, iostat1, NULL,
11101 Make_IoAddr_WN ( st ) );
11102 lower_io_items ( block, tree, FFT_LIST, iostat1,
11103 iolist, WN_kid_count(tree) );
11104 if (mp_io) {
11105 GEN_IO_CALL_1 ( block, FIO_EXT_WRITE_LIST_end, iostat1,
11106 iostat2, Make_IoAddr_WN ( unit_ptr ) );
11107 }
11108 else
11109 GEN_IO_CALL_0 ( block, FIO_EXT_WRITE_LIST_end, iostat1,
11110 iostat2 );
11111 } else {
11112 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11113 err, end, (LABEL_IDX) 0, zero_escape_freq );
11114 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
11115
11116
11117
11118 word1 = 0;
11119 if (Target_Byte_Sex == LITTLE_ENDIAN) {
11120 cilist_header_ptr = (cilist_header_type *)&word1;
11121 cilist_header_ptr->version = 1;
11122 cilist_header_ptr->uflag = unit_flag;
11123 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
11124 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
11125 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
11126 cilist_header_ptr->internal = is_internal_io;
11127 cilist_header_ptr->dflag = is_direct;
11128 cilist_header_ptr->fmt = fmt_flag;
11129 cilist_header_ptr->stksize = stk_size;
11130 cilist_header_ptr->icount = 7;
11131 } else {
11132 word1 = ( (UINT64) 1 << 56 ) |
11133 ( (UINT64) unit_flag << 48 ) |
11134 ( (UINT64) eeeflag << 40 ) |
11135 ( (UINT64) is_internal_io << 33 ) |
11136 ( (UINT64) is_direct << 32 ) |
11137 ( (UINT64) fmt_flag << 24 ) |
11138 ( (UINT64) stk_size << 16 ) |
11139 ( (UINT64) 7 ) ;
11140 }
11141 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
11142 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
11143 parsfmt_wn, fmtsrc_wn, advance_wn,
11144 size_wn, varfmt );
11145
11146 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
11147 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
11148 FIO_CR_WRITE_FORMATTED, FALSE, &offset,
11149 iolist, WN_kid_count(tree));
11150 }
11151 break;
11152
11153 case FCL_EXT_NAMELIST:
11154 if (current_io_library == IOLIB_MIPS) {
11155 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
11156 err, end, (LABEL_IDX) 0, zero_escape_freq );
11157 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
11158 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
11159 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
11160 Gen_Io_PutFieldConst ( block, st, FSC_CIEND, endstat );
11161 Gen_Io_PutAddrWN ( block, st, FSC_CINML, format_wn );
11162 if (mp_io) {
11163 unit_ptr = Get_UnitPointer_ST();
11164 GEN_IO_CALL_2 ( block, FIO_EXT_WRITE_NAMELIST_start, iostat1,
11165 iostat2, Make_IoAddr_WN ( st ),
11166 Make_IoAddr_WN ( unit_ptr ) );
11167 }
11168 else
11169 GEN_IO_CALL_1 ( block, FIO_EXT_WRITE_NAMELIST_start, iostat1,
11170 iostat2, Make_IoAddr_WN ( st ) );
11171 } else {
11172 process_iostat ( &iostat1, &iostat2, FALSE, iostat,
11173 err, end, (LABEL_IDX) 0, zero_escape_freq );
11174 cilist_st = Get_IoStruct_ST ( block, FID_CRAY_CLIST, TRUE);
11175 word1 = 0;
11176 if (Target_Byte_Sex == LITTLE_ENDIAN) {
11177 cilist_header_ptr = (cilist_header_type *)&word1;
11178 cilist_header_ptr->version = 1;
11179 cilist_header_ptr->uflag = unit_flag;
11180 cilist_header_ptr->iostatflg = iostat_flag;
11181 cilist_header_ptr->eorflag = eor_flag;
11182 cilist_header_ptr->endflag = end_flag;
11183 cilist_header_ptr->errflag = err_flag;
11184 cilist_header_ptr->advcode = advance_flag;
11185 cilist_header_ptr->edcode = edflag;
11186 cilist_header_ptr->internal = is_internal_io;
11187 cilist_header_ptr->dflag = is_direct;
11188 cilist_header_ptr->fmt = fmt_flag;
11189 cilist_header_ptr->stksize = stk_size;
11190 cilist_header_ptr->icount = 7;
11191 } else {
11192 word1 = ( (UINT64) 1 << 56 ) |
11193 ( (UINT64) unit_flag << 48 ) |
11194 ( (UINT64) eeeflag << 40 ) |
11195 ( (UINT64) advance_flag << 35 ) |
11196 ( (UINT64) edflag << 34 ) |
11197 ( (UINT64) is_internal_io << 33 ) |
11198 ( (UINT64) is_direct << 32 ) |
11199 ( (UINT64) fmt_flag << 24 ) |
11200 ( (UINT64) stk_size << 16 ) |
11201 ( (UINT64) 7 ) ;
11202 }
11203 Gen_Io_PutFieldConst ( block, cilist_st, FCR_CI_WORD1, word1 );
11204 Set_Cilist_Fields( block, cilist_st, unit_wn, items, rec_wn,
11205 parsfmt_wn, fmtsrc_wn, advance_wn,
11206 size_wn, varfmt );
11207 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(cilist_st)),
11208 cilist_st);
11209 if (stack_ty == (TY_IDX) 0)
11210 stack_ty = Make_Simple_Array_Type("stack_space_type", STACK_LENGTH,
11211 Be_Type_Tbl(MTYPE_U8));
11212
11213 if (Current_pu != cray_iolist_current_pu) {
11214 cray_iolist_current_pu = Current_pu;
11215 stack_st = Gen_Temp_Symbol ( stack_ty, TY_name(stack_ty) );
11216 io_set_addr_passed_flag(stack_st);
11217 }
11218
11219 stack_wn = WN_CreateLda (opc_lda, 0,
11220 Make_Pointer_Type (ST_type(stack_st), FALSE),
11221 stack_st);
11222
11223 GEN_IO_CALL_3 ( block, FIO_CR_WRITE_NAMELIST, NULL,
11224 iostat2, cilist_wn,
11225 format_wn, stack_wn);
11226 }
11227 break;
11228
11229 case FCL_INT_FORMATTED:
11230 if (current_io_library == IOLIB_MIPS) {
11231 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11232 err, end, (LABEL_IDX) 0, zero_escape_freq );
11233 st = Get_IoStruct_ST ( block, FID_ICILIST, FALSE );
11234 Gen_Io_PutFieldConst ( block, st, FSI_ICIERR, errstat );
11235 Gen_Io_PutAddrWN ( block, st, FSI_ICIUNIT, unit_wn );
11236 Gen_Io_PutAddrWN ( block, st, FSI_ICIFMT, format_wn );
11237 if (unit_len != NULL)
11238 Gen_Io_PutFieldWN ( block, st, FSI_ICIRLEN, unit_len );
11239 else if (WN_opcode(unit_wn) == OPC_U4LDA ||
11240 WN_opcode(unit_wn) == OPC_U8LDA)
11241 Gen_Io_PutFieldConst ( block, st, FSI_ICIRLEN,
11242 TY_size (Ty_Table [ST_type (WN_st(unit_wn))])
11243 );
11244 else
11245 Fail_FmtAssertion(
11246 "unexpected decode length (%s) in I/O processing",
11247 OPCODE_name(WN_opcode(unit_wn)));
11248 if (unit_rec != NULL)
11249 Gen_Io_PutFieldWN ( block, st, FSI_ICIRNUM, unit_rec );
11250 else
11251 Gen_Io_PutFieldConst ( block, st, FSI_ICIRNUM, 1 );
11252 if (varfmt != NULL) {
11253 Gen_Io_PutAddrWN ( block, st, FSI_ICIVFMT, varfmt );
11254 Gen_Io_PutAddrWN ( block, st, FSI_ICIVFMTFP, varfmtfp );
11255 }
11256 if (mp_io) {
11257 unit_ptr = Get_UnitPointer_ST();
11258 GEN_IO_CALL_2 ( block, FIO_INT_WRITE_FORMAT_start, iostat1,
11259 NULL, Make_IoAddr_WN ( st ),
11260 Make_IoAddr_WN ( unit_ptr ) );
11261 }
11262 else
11263 GEN_IO_CALL_1 ( block, FIO_INT_WRITE_FORMAT_start, iostat1,
11264 NULL, Make_IoAddr_WN ( st ) );
11265 lower_io_items ( block, tree, FFT_FORMAT, iostat1,
11266 iolist, WN_kid_count(tree) );
11267 if (mp_io) {
11268 GEN_IO_CALL_1 ( block, FIO_INT_WRITE_FORMAT_end, iostat1,
11269 iostat2, Make_IoAddr_WN ( unit_ptr ) );
11270 }
11271 else
11272 GEN_IO_CALL_0 ( block, FIO_INT_WRITE_FORMAT_end, iostat1,
11273 iostat2 );
11274 } else {
11275 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11276 err, end, (LABEL_IDX) 0, zero_escape_freq );
11277 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
11278
11279
11280
11281 word1 = 0;
11282 if (Target_Byte_Sex == LITTLE_ENDIAN) {
11283 cilist_header_ptr = (cilist_header_type *)&word1;
11284 cilist_header_ptr->version = 1;
11285 cilist_header_ptr->uflag = unit_flag;
11286 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
11287 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
11288 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
11289 cilist_header_ptr->internal = is_internal_io;
11290 cilist_header_ptr->dflag = is_direct;
11291 cilist_header_ptr->fmt = fmt_flag;
11292 cilist_header_ptr->stksize = stk_size;
11293 cilist_header_ptr->icount = 7;
11294 } else {
11295 word1 = ( (UINT64) 1 << 56 ) |
11296 ( (UINT64) unit_flag << 48 ) |
11297 ( (UINT64) eeeflag << 40 ) |
11298 ( (UINT64) is_internal_io << 33 ) |
11299 ( (UINT64) is_direct << 32 ) |
11300 ( (UINT64) fmt_flag << 24 ) |
11301 ( (UINT64) stk_size << 16 ) |
11302 ( (UINT64) 7 ) ;
11303 }
11304 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
11305 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
11306 parsfmt_wn, fmtsrc_wn, advance_wn,
11307 size_wn, varfmt );
11308
11309 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
11310 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
11311 FIO_CR_WRITE_FORMATTED, FALSE, &offset,
11312 iolist, WN_kid_count(tree));
11313 }
11314 break;
11315
11316 case FCL_INT_LIST:
11317 if (current_io_library == IOLIB_MIPS) {
11318 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11319 err, end, (LABEL_IDX) 0, zero_escape_freq );
11320 st = Get_IoStruct_ST ( block, FID_ICILIST, FALSE );
11321 Gen_Io_PutFieldConst ( block, st, FSI_ICIERR, errstat );
11322 Gen_Io_PutAddrWN ( block, st, FSI_ICIUNIT, unit_wn );
11323 if (unit_len != NULL)
11324 Gen_Io_PutFieldWN ( block, st, FSI_ICIRLEN, unit_len );
11325 else if (WN_opcode(unit_wn) == OPC_U4LDA ||
11326 WN_opcode(unit_wn) == OPC_U8LDA)
11327 Gen_Io_PutFieldConst ( block, st, FSI_ICIRLEN,
11328 TY_size (Ty_Table [ST_type (WN_st(unit_wn))])
11329 );
11330
11331 else
11332 Fail_FmtAssertion(
11333 "unexpected decode length (%s) in I/O processing",
11334 OPCODE_name(WN_opcode(unit_wn)));
11335 if (unit_rec != NULL)
11336 Gen_Io_PutFieldWN ( block, st, FSI_ICIRNUM, unit_rec );
11337 else
11338 Gen_Io_PutFieldConst ( block, st, FSI_ICIRNUM, 1 );
11339 if (mp_io) {
11340 unit_ptr = Get_UnitPointer_ST();
11341 GEN_IO_CALL_2 ( block, FIO_INT_WRITE_LIST_start, iostat1,
11342 NULL, Make_IoAddr_WN ( st ),
11343 Make_IoAddr_WN ( unit_ptr ) );
11344 }
11345 else
11346 GEN_IO_CALL_1 ( block, FIO_INT_WRITE_LIST_start, iostat1, NULL,
11347 Make_IoAddr_WN ( st ) );
11348 lower_io_items ( block, tree, FFT_LIST, iostat1,
11349 iolist, WN_kid_count(tree) );
11350 if (mp_io) {
11351 GEN_IO_CALL_1 ( block, FIO_INT_WRITE_LIST_end, iostat1,
11352 iostat2, Make_IoAddr_WN ( unit_ptr ) );
11353 }
11354 else
11355 GEN_IO_CALL_0 ( block, FIO_INT_WRITE_LIST_end, iostat1,
11356 iostat2 );
11357 } else {
11358 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11359 err, end, (LABEL_IDX) 0, zero_escape_freq );
11360 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
11361
11362
11363
11364 word1 = 0;
11365 if (Target_Byte_Sex == LITTLE_ENDIAN) {
11366 cilist_header_ptr = (cilist_header_type *)&word1;
11367 cilist_header_ptr->version = 1;
11368 cilist_header_ptr->uflag = unit_flag;
11369 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
11370 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
11371 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
11372 cilist_header_ptr->internal = is_internal_io;
11373 cilist_header_ptr->dflag = is_direct;
11374 cilist_header_ptr->fmt = fmt_flag;
11375 cilist_header_ptr->stksize = stk_size;
11376 cilist_header_ptr->icount = 7;
11377 } else {
11378 word1 = ( (UINT64) 1 << 56 ) |
11379 ( (UINT64) unit_flag << 48 ) |
11380 ( (UINT64) eeeflag << 40 ) |
11381 ( (UINT64) is_internal_io << 33 ) |
11382 ( (UINT64) is_direct << 32 ) |
11383 ( (UINT64) fmt_flag << 24 ) |
11384 ( (UINT64) stk_size << 16 ) |
11385 ( (UINT64) 7 ) ;
11386 }
11387 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
11388 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
11389 parsfmt_wn, fmtsrc_wn, advance_wn,
11390 size_wn, varfmt );
11391
11392 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
11393 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
11394 FIO_CR_WRITE_FORMATTED, FALSE, &offset,
11395 iolist, WN_kid_count(tree));
11396 }
11397 break;
11398
11399 case FCL_DIR_FORMATTED:
11400 if (current_io_library == IOLIB_MIPS) {
11401 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11402 err, end, (LABEL_IDX) 0, zero_escape_freq );
11403 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
11404 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
11405 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
11406 Gen_Io_PutAddrWN ( block, st, FSC_CIFMT, format_wn );
11407 Gen_Io_PutFieldWN ( block, st, FSC_CIREC, items[IOC_REC] );
11408 if (varfmt != NULL) {
11409 Gen_Io_PutAddrWN ( block, st, FSC_CIVFMT, varfmt );
11410 Gen_Io_PutAddrWN ( block, st, FSC_CIVFMTFP, varfmtfp );
11411 }
11412 if (mp_io) {
11413 unit_ptr = Get_UnitPointer_ST();
11414 GEN_IO_CALL_2 ( block, FIO_DIR_WRITE_FORMAT_start, iostat1,
11415 NULL, Make_IoAddr_WN ( st ),
11416 Make_IoAddr_WN ( unit_ptr ) );
11417 }
11418 else
11419 GEN_IO_CALL_1 ( block, FIO_DIR_WRITE_FORMAT_start, iostat1,
11420 NULL, Make_IoAddr_WN ( st ) );
11421 lower_io_items ( block, tree, FFT_FORMAT, iostat1,
11422 iolist, WN_kid_count(tree) );
11423 if (mp_io) {
11424 GEN_IO_CALL_1 ( block, FIO_DIR_WRITE_FORMAT_end, iostat1,
11425 iostat2, Make_IoAddr_WN ( unit_ptr ) );
11426 }
11427 else
11428 GEN_IO_CALL_0 ( block, FIO_DIR_WRITE_FORMAT_end, iostat1,
11429 iostat2 );
11430 } else {
11431 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11432 err, end, (LABEL_IDX) 0, zero_escape_freq );
11433 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
11434
11435
11436
11437 word1 = 0;
11438 if (Target_Byte_Sex == LITTLE_ENDIAN) {
11439 cilist_header_ptr = (cilist_header_type *)&word1;
11440 cilist_header_ptr->version = 1;
11441 cilist_header_ptr->uflag = unit_flag;
11442 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
11443 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
11444 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
11445 cilist_header_ptr->internal = is_internal_io;
11446 cilist_header_ptr->dflag = is_direct;
11447 cilist_header_ptr->fmt = fmt_flag;
11448 cilist_header_ptr->stksize = stk_size;
11449 cilist_header_ptr->icount = 7;
11450 } else {
11451 word1 = ( (UINT64) 1 << 56 ) |
11452 ( (UINT64) unit_flag << 48 ) |
11453 ( (UINT64) eeeflag << 40 ) |
11454 ( (UINT64) is_internal_io << 33 ) |
11455 ( (UINT64) is_direct << 32 ) |
11456 ( (UINT64) fmt_flag << 24 ) |
11457 ( (UINT64) stk_size << 16 ) |
11458 ( (UINT64) 7 ) ;
11459 }
11460 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
11461 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
11462 parsfmt_wn, fmtsrc_wn, advance_wn,
11463 size_wn, varfmt );
11464
11465 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
11466 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
11467 FIO_CR_WRITE_FORMATTED, FALSE, &offset,
11468 iolist, WN_kid_count(tree));
11469 }
11470 break;
11471
11472 case FCL_DIR_UNFORMATTED:
11473 if (current_io_library == IOLIB_MIPS) {
11474 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11475 err, end, (LABEL_IDX) 0, zero_escape_freq );
11476 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
11477 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
11478 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
11479 Gen_Io_PutFieldWN ( block, st, FSC_CIREC, items[IOC_REC] );
11480 if (mp_io) {
11481 unit_ptr = Get_UnitPointer_ST();
11482 GEN_IO_CALL_2 ( block, FIO_DIR_WRITE_UNFORMAT_start, iostat1,
11483 NULL, Make_IoAddr_WN ( st ),
11484 Make_IoAddr_WN ( unit_ptr ) );
11485 }
11486 else
11487 GEN_IO_CALL_1 ( block, FIO_DIR_WRITE_UNFORMAT_start, iostat1,
11488 NULL, Make_IoAddr_WN ( st ) );
11489 lower_io_items ( block, tree, FFT_UNFORMAT, iostat1,
11490 iolist, WN_kid_count(tree) );
11491 if (mp_io) {
11492 GEN_IO_CALL_1 ( block, FIO_DIR_WRITE_UNFORMAT_end, iostat1,
11493 iostat2, Make_IoAddr_WN ( unit_ptr ) );
11494 }
11495 else
11496 GEN_IO_CALL_0 ( block, FIO_DIR_WRITE_UNFORMAT_end, iostat1,
11497 iostat2 );
11498 } else {
11499 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11500 err, end, (LABEL_IDX) 0, zero_escape_freq );
11501 st = Get_IoStruct_ST( block, FID_CRAY_CLIST, TRUE );
11502
11503
11504
11505 word1 = 0;
11506 if (Target_Byte_Sex == LITTLE_ENDIAN) {
11507 cilist_header_ptr = (cilist_header_type *)&word1;
11508 cilist_header_ptr->version = 1;
11509 cilist_header_ptr->uflag = unit_flag;
11510 cilist_header_ptr->iostatflg = (iostat != NULL) ? 1 : 0;
11511 cilist_header_ptr->endflag = (end != (LABEL_IDX) 0) ? 1 : 0;
11512 cilist_header_ptr->errflag = (errstat != FALSE) ? 1 : 0;
11513 cilist_header_ptr->internal = is_internal_io;
11514 cilist_header_ptr->dflag = is_direct;
11515 cilist_header_ptr->fmt = fmt_flag;
11516 cilist_header_ptr->stksize = stk_size;
11517 cilist_header_ptr->icount = 7;
11518 } else {
11519 word1 = ( (UINT64) 1 << 56 ) |
11520 ( (UINT64) unit_flag << 48 ) |
11521 ( (UINT64) eeeflag << 40 ) |
11522 ( (UINT64) is_internal_io << 33 ) |
11523 ( (UINT64) is_direct << 32 ) |
11524 ( (UINT64) fmt_flag << 24 ) |
11525 ( (UINT64) stk_size << 16 ) |
11526 ( (UINT64) 7 ) ;
11527 }
11528 Gen_Io_PutFieldConst( block, st, FCR_CI_WORD1, word1 );
11529 Set_Cilist_Fields( block, st, unit_wn, items, rec_wn,
11530 parsfmt_wn, fmtsrc_wn, advance_wn,
11531 size_wn, varfmt );
11532
11533 cilist_wn = WN_CreateLda (opc_lda, 0, TY_pointer(ST_type(st)), st);
11534 lower_f77_io_items ( block, tree, cilist_wn, iostat1, iostat2,
11535 FIO_CR_WRITE_UNFORMATTED, FALSE, &offset,
11536 iolist, WN_kid_count(tree));
11537 }
11538 break;
11539
11540 default:
11541 Fail_FmtAssertion(
11542 "unexpected I/O statement (%d) in I/O processing",
11543 ioclass);
11544
11545 }
11546
11547 break;
11548
11549 case IOS_REWRITE:
11550
11551 if (current_io_library == IOLIB_MIPS) {
11552 switch (ioclass) {
11553
11554 case FCL_EXT_FORMATTED:
11555 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11556 err, end, (LABEL_IDX) 0, zero_escape_freq );
11557 st = Get_IoStruct_ST ( block, FID_CILIST, FALSE );
11558 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
11559 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
11560 Gen_Io_PutAddrWN ( block, st, FSC_CIFMT, format_wn );
11561 if (varfmt != NULL) {
11562 Gen_Io_PutAddrWN ( block, st, FSC_CIVFMT, varfmt );
11563 Gen_Io_PutAddrWN ( block, st, FSC_CIVFMTFP, varfmtfp );
11564 }
11565 if (mp_io) {
11566 unit_ptr = Get_UnitPointer_ST();
11567 GEN_IO_CALL_2 ( block, FIO_EXT_REWRITE_FORMAT_start, iostat1,
11568 NULL, Make_IoAddr_WN ( st ),
11569 Make_IoAddr_WN ( unit_ptr ) );
11570 }
11571 else
11572 GEN_IO_CALL_1 ( block, FIO_EXT_REWRITE_FORMAT_start, iostat1,
11573 NULL, Make_IoAddr_WN ( st ) );
11574 lower_io_items ( block, tree, FFT_FORMAT, iostat1,
11575 iolist, WN_kid_count(tree) );
11576 if (mp_io) {
11577 GEN_IO_CALL_1 ( block, FIO_EXT_REWRITE_FORMAT_end, iostat1,
11578 iostat2, Make_IoAddr_WN ( unit_ptr ) );
11579 }
11580 else
11581 GEN_IO_CALL_0 ( block, FIO_EXT_REWRITE_FORMAT_end, iostat1,
11582 iostat2 );
11583 break;
11584
11585 case FCL_EXT_UNFORMATTED:
11586 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11587 err, end, (LABEL_IDX) 0, zero_escape_freq );
11588 st = Get_IoStruct_ST ( block, FID_CILIST, TRUE );
11589 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
11590 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
11591 if (mp_io) {
11592 unit_ptr = Get_UnitPointer_ST();
11593 GEN_IO_CALL_2 ( block, FIO_EXT_REWRITE_UNFORMAT_start, iostat1,
11594 NULL, Make_IoAddr_WN ( st ),
11595 Make_IoAddr_WN ( unit_ptr ) );
11596 }
11597 else
11598 GEN_IO_CALL_1 ( block, FIO_EXT_REWRITE_UNFORMAT_start, iostat1,
11599 NULL, Make_IoAddr_WN ( st ) );
11600 lower_io_items ( block, tree, FFT_UNFORMAT, iostat1,
11601 iolist, WN_kid_count(tree) );
11602 if (mp_io) {
11603 GEN_IO_CALL_1 ( block, FIO_EXT_REWRITE_UNFORMAT_end, iostat1,
11604 iostat2, Make_IoAddr_WN ( unit_ptr ) );
11605 }
11606 else
11607 GEN_IO_CALL_0 ( block, FIO_EXT_REWRITE_UNFORMAT_end, iostat1,
11608 iostat2 );
11609 break;
11610
11611 case FCL_EXT_LIST:
11612 process_iostat ( &iostat1, &iostat2, TRUE, iostat,
11613 err, end, (LABEL_IDX) 0, zero_escape_freq );
11614 st = Get_IoStruct_ST ( block, FID_CILIST, TRUE );
11615 Gen_Io_PutFieldConst ( block, st, FSC_CIERR, errstat );
11616 Gen_Io_PutFieldWN ( block, st, FSC_CIUNIT, unit_wn );
11617 if (mp_io) {
11618 unit_ptr = Get_UnitPointer_ST();
11619 GEN_IO_CALL_2 ( block, FIO_EXT_REWRITE_LIST_start, iostat1,
11620 NULL, Make_IoAddr_WN ( st ),
11621 Make_IoAddr_WN ( unit_ptr ) );
11622 }
11623 else
11624 GEN_IO_CALL_1 ( block, FIO_EXT_REWRITE_LIST_start, iostat1,
11625 NULL, Make_IoAddr_WN ( st ) );
11626 lower_io_items ( block, tree, FFT_LIST, iostat1,
11627 iolist, WN_kid_count(tree) );
11628 if (mp_io) {
11629 GEN_IO_CALL_1 ( block, FIO_EXT_REWRITE_LIST_end, iostat1,
11630 iostat2, Make_IoAddr_WN ( unit_ptr ) );
11631 }
11632 else
11633 GEN_IO_CALL_0 ( block, FIO_EXT_REWRITE_LIST_end, iostat1,
11634 iostat2 );
11635 break;
11636
11637 default:
11638 Fail_FmtAssertion(
11639 "unexpected I/O statement (%d) in I/O processing",
11640 ioclass);
11641
11642 }
11643 } else {
11644
11645 fprintf( stderr, "REWRITE not yet implemented\n" );
11646 abort();
11647 }
11648
11649 break;
11650
11651 default:
11652 Fail_FmtAssertion("unexpected I/O statement (%d) in I/O processing",
11653 iostatement);
11654
11655 }
11656
11657
11658
11659
11660
11661
11662
11663 srcpos = WN_Get_Linenum ( tree );
11664 for (wn = WN_first( block ); wn; wn = WN_next( wn )) {
11665 WN_Set_Linenum ( wn, srcpos );
11666 }
11667
11668 if ( Cur_PU_Feedback ) {
11669
11670
11671
11672
11673
11674 if ( Cur_PU_Feedback->Same_in_out( tree ) )
11675 Cur_PU_Feedback->FB_set_in_out_same( block );
11676
11677 Cur_PU_Feedback->Delete( tree );
11678 }
11679
11680
11681
11682 WN_Delete ( tree );
11683
11684
11685
11686
11687
11688
11689
11690
11691
11692
11693
11694 if (actions != LOWER_IO_STATEMENT)
11695 block = lower_block ( block, actions & ~LOWER_IO_STATEMENT);
11696
11697 return (block);
11698
11699 }
11700
11701
11702 #define READ_WRITE_MASK 1
11703 #define NAMELIST_MODE(x) ((x) & NML_MASK)
11704 #define READ_MODE(x) ((x) & READ_WRITE_MASK)
11705 #define WRITE_MODE(x) (!((x) & READ_WRITE_MASK))
11706
11707
11708
11709
11710
11711
11712
11713
11714
11715
11716
11717
11718
11719
11720
11721
11722
11723
11724
11725
11726
11727
11728 typedef struct alist {
11729 INT32 total_args ;
11730 INT32 declared_args ;
11731 INT32 args_seen ;
11732 INT32 arg_lengths_seen ;
11733 TYLIST *last_parm_ty_seen ;
11734 TYLIST *last_len_ty_seen ;
11735 struct alist * next_entry ;
11736 TY * rty ;
11737 ST **arglist ;
11738 BOOL global ;
11739 } DUMMIES ;
11740
11741
11742
11743
11744
11745
11746
11747
11748
11749 typedef struct blist {
11750 ST * element ;
11751 struct blist * next ;
11752 } ITEM ;
11753
11754
11755
11756 typedef struct clist {
11757 ITEM * first ;
11758 ITEM * last ;
11759 INT32 nitems ;
11760 } LIST ;
11761
11762
11763
11764
11765
11766
11767
11768
11769
11770
11771
11772
11773
11774
11775
11776
11777
11778
11779
11780
11781
11782 typedef struct auxst {
11783 DUMMIES * dummy ;
11784 WN * pragma ;
11785 ST * stptr ;
11786 BOOL fstarg ;
11787 BOOL isalt ;
11788 LIST altentry ;
11789 LIST comlist ;
11790 LIST nlist ;
11791 char * stem ;
11792 struct auxst * next;
11793 USRCPOS pos ;
11794 INT32 assign_id;
11795 BOOL visited;
11796 } AUXST ;
11797
11798 static AUXST * Top_Auxst[INTERNAL_LEVEL+1] = {NULL,NULL,NULL,NULL};
11799
11800
11801
11802
11803
11804
11805
11806
11807
11808
11809
11810
11811 static AUXST *
11812 cwh_stab_find_auxst(ST *st, BOOL create)
11813 {
11814 AUXST * o ;
11815
11816 o = (AUXST *) BE_ST_io_auxst(ST_st_idx(st));
11817
11818 if (o == NULL) {
11819 if (create) {
11820 o = (AUXST *) malloc(sizeof(AUXST));
11821
11822 o ->dummy = NULL;
11823 o ->pragma = NULL;
11824 o ->stptr = st ;
11825 o ->fstarg = FALSE;
11826 o ->isalt = FALSE;
11827 o ->stem = NULL;
11828 o ->next = Top_Auxst[ST_level(st)];
11829 USRCPOS_clear(o->pos);
11830 o->assign_id = -1;
11831 o->visited = FALSE;
11832
11833 o ->altentry.first = NULL;
11834 o ->altentry.last = NULL;
11835 o ->comlist.first = NULL;
11836 o ->comlist.last = NULL;
11837 o ->nlist.first = NULL;
11838 o ->nlist.last = NULL;
11839
11840 BE_ST_set_io_auxst(ST_st_idx(st),(void *)o);
11841 Top_Auxst[ST_level(st)] = o ;
11842 }
11843 }
11844 return(o);
11845 }
11846
11847
11848
11849
11850
11851
11852
11853
11854
11855
11856
11857 extern BOOL *
11858 cwh_stab_visited(ST * st)
11859 {
11860 AUXST *o ;
11861
11862 o = cwh_stab_find_auxst(st, TRUE);
11863 return &(o->visited) ;
11864 }
11865
11866
11867
11868
11869
11870
11871
11872
11873
11874
11875 static void
11876 cwh_stab_free_list (LIST ** lp)
11877 {
11878 ITEM *i;
11879 ITEM *n;
11880 LIST *l;
11881
11882 if (*lp != NULL) {
11883 l = *lp ;
11884
11885 i = l->first ;
11886
11887 while (i != NULL) {
11888 n = i-> next ;
11889 free(i) ;
11890 i = n ;
11891 }
11892
11893 *lp = NULL ;
11894 }
11895 }
11896
11897
11898
11899
11900
11901
11902
11903
11904
11905
11906
11907 static void
11908 cwh_stab_free_auxst(void)
11909 {
11910 AUXST *o,*n;
11911 LIST *l ;
11912
11913 o = Top_Auxst[CURRENT_SYMTAB];
11914
11915 while (o != NULL ) {
11916
11917 BE_ST_set_io_auxst(ST_st_idx(o->stptr),NULL);
11918
11919 l = &o->comlist;
11920 cwh_stab_free_list(&l);
11921
11922 l = &o->altentry;
11923 cwh_stab_free_list(&l);
11924
11925 l = &o->nlist;
11926 cwh_stab_free_list(&l);
11927
11928 if (o->stem != NULL)
11929 free (o->stem) ;
11930
11931 n = o->next ;
11932 free(o);
11933 o = n;
11934 }
11935 Top_Auxst[CURRENT_SYMTAB] = NULL;
11936 }
11937
11938
11939
11940
11941
11942
11943
11944
11945
11946
11947
11948
11949
11950 static ST *
11951 cwh_io_ST_base(ST *st)
11952 {
11953
11954 ST *base;
11955 INT64 ofst;
11956 Expand_ST_into_base_and_ofst(st,ST_ofst(st),&base,&ofst);
11957 return base;
11958 }
11959
11960
11961
11962
11963
11964
11965
11966
11967
11968
11969
11970
11971
11972
11973
11974
11975
11976
11977
11978 static BOOL
11979 cwh_io_analyse_io_item(WN *tree, IMPDO_INFO *impdo_set, INT32 mode)
11980 {
11981
11982 INTRINSIC item;
11983 WN *kid0;
11984 OPERATOR opr;
11985 ST *index;
11986 IMPDO_INFO *new_impdo_set;
11987 BOOL *visited;
11988 INT32 i;
11989 INT32 nd;
11990
11991 item = (INTRINSIC) WN_intrinsic(tree);
11992
11993 switch(item) {
11994
11995 case IOL_IMPLIED_DO:
11996
11997 index = cwh_io_ST_base(WN_st(WN_index(tree)));
11998
11999
12000
12001
12002 if (ST_btype(WN_st(WN_index(tree))) != MTYPE_I4)
12003 return TRUE;
12004 new_impdo_set = (IMPDO_INFO *) malloc(sizeof(IMPDO_INFO));
12005 Impdo_index(new_impdo_set) = WN_st(WN_index(tree));
12006 Impdo_next(new_impdo_set) = impdo_set;
12007
12008 visited = cwh_stab_visited(index);
12009 if (*visited) {
12010 return TRUE;
12011 } else {
12012 *visited = TRUE;
12013 cwh_io_add_st_to_marked_set(index);
12014 }
12015
12016 if (cwh_io_analyse_expr(WN_start(tree), new_impdo_set, mode))
12017 return TRUE;
12018 else if (cwh_io_analyse_expr(WN_end(tree), new_impdo_set, mode))
12019 return TRUE;
12020 else if (cwh_io_analyse_expr(WN_step(tree), new_impdo_set, mode))
12021 return TRUE;
12022
12023 for(i=4; i<WN_kid_count(tree); i++) {
12024 if (cwh_io_analyse_io_item(WN_kid(tree,i), new_impdo_set, mode))
12025 return TRUE;
12026
12027
12028 if ((WN_io_item(WN_kid(tree,i)) == IOL_VAR
12029 || WN_io_item(WN_kid(tree,i)) == IOL_EXPR)
12030 &&TY_kind(WN_ty(WN_kid(tree,i))) == KIND_STRUCT)
12031 return TRUE;
12032 if (WN_io_item(WN_kid(tree,i)) == IOL_ARRAY) {
12033 for (kid0 = WN_kid0(WN_kid(tree,i)); WNOPR(kid0) != OPR_LDA; )
12034 kid0 = WN_kid0(kid0);
12035 if (TY_kind(TY_pointed(WN_ty(kid0))) == KIND_ARRAY
12036 && TY_kind(TY_AR_etype(TY_pointed(WN_ty(kid0)))) == KIND_STRUCT)
12037 return TRUE;
12038 }
12039 }
12040 break;
12041
12042 case IOL_EXPR:
12043 case IOL_LOGICAL:
12044
12045 kid0 = WN_kid0(tree);
12046 opr = WNOPR(kid0);
12047
12048 if (opr == OPR_ILOAD && WNOPR(WN_kid0(kid0)) == OPR_ARRAY) {
12049 if (cwh_io_analyse_arr(WN_kid0(kid0), impdo_set, mode))
12050 return TRUE;
12051 } else if (opr == OPR_CVTL && WN_kid_count(WN_kid0(kid0)) > 0 && WNOPR(WN_kid0(WN_kid0(kid0))) == OPR_ARRAY) {
12052 if (cwh_io_analyse_arr(WN_kid0(WN_kid0(kid0)), impdo_set, mode))
12053 return TRUE;
12054 } else {
12055 if (cwh_io_analyse_expr(kid0, impdo_set, mode))
12056 return TRUE;
12057 }
12058 break;
12059
12060 case IOL_VAR:
12061
12062 kid0 = WN_kid0(tree);
12063 opr = WNOPR(kid0);
12064
12065 if (opr == OPR_ARRAY) {
12066 if (cwh_io_analyse_arr(kid0, impdo_set, mode))
12067 return TRUE;
12068 } else {
12069 if (cwh_io_analyse_expr(kid0, impdo_set, mode))
12070 return TRUE;
12071 }
12072 break;
12073
12074 case IOL_CHAR:
12075 kid0 = WN_kid0(tree);
12076
12077
12078
12079 if (cwh_io_analyse_expr(WN_kid1(tree), impdo_set, mode))
12080 return TRUE;
12081
12082 opr = WNOPR(kid0);
12083
12084 if (opr == OPR_ARRAY) {
12085
12086 nd = WN_kid_count(kid0)/2;
12087
12088 if (WNOPR(WN_kid0(kid0)) == OPR_LDA) {
12089 if (cwh_io_analyse_arr(kid0, impdo_set, mode))
12090 return TRUE;
12091 } else if ((nd == 1) && (WNOPR(WN_kid0(kid0)) == OPR_ARRAY)) {
12092 if (cwh_io_analyse_arr(WN_kid0(kid0), impdo_set, mode))
12093 return TRUE;
12094 for (i=2*nd; i > nd; i-- ) {
12095 if (cwh_io_analyse_index_expr(WN_kid(kid0,i),
12096 impdo_set, mode) != 0)
12097 return TRUE;
12098 }
12099 } else {
12100 if (cwh_io_analyse_expr(kid0, impdo_set, mode))
12101 return TRUE;
12102 }
12103
12104 } else {
12105 if (cwh_io_analyse_expr(kid0, impdo_set, mode))
12106 return TRUE;
12107 }
12108 break;
12109
12110 case IOL_DOPE:
12111
12112 case IOL_ARRAY:
12113 if (WN_kid_count(tree) > 0
12114 && WNOPR(WN_kid0(tree)) == OPR_LDA
12115 && TY_kind(WN_ty(WN_kid0(tree))) == KIND_POINTER
12116 && TY_kind(TY_pointed(WN_ty(WN_kid0(tree)))) == KIND_ARRAY
12117 && TY_kind(TY_AR_etype(TY_pointed(WN_ty(WN_kid0(tree))))) == KIND_STRUCT)
12118 return TRUE;
12119 case IOL_CHAR_ARRAY:
12120 break;
12121
12122 default:
12123 DevAssert((0),("Odd iolist Item"));
12124 }
12125
12126 return FALSE;
12127 }
12128
12129
12130
12131
12132
12133
12134
12135
12136
12137
12138
12139
12140
12141
12142
12143
12144
12145
12146 static BOOL
12147 cwh_io_analyse_expr(WN *tree, IMPDO_INFO *impdo_set, INT32 mode)
12148 {
12149 ST *st;
12150 BOOL *visited;
12151 INT32 i;
12152
12153 if ( OPCODE_has_aux(WN_opcode(tree))) {
12154 st = cwh_io_ST_base(WN_st(tree));
12155 visited = cwh_stab_visited(st);
12156 if (*visited) {
12157 return TRUE;
12158 } else if (READ_MODE(mode)) {
12159 *visited = TRUE;
12160 cwh_io_add_st_to_marked_set(st);
12161 }
12162 } else {
12163 for ( i = 0; i < WN_kid_count(tree); i++ )
12164 if (cwh_io_analyse_expr(WN_kid(tree,i), impdo_set, mode))
12165 return TRUE;
12166 }
12167 return FALSE;
12168 }
12169
12170
12171
12172
12173
12174
12175
12176
12177
12178
12179
12180
12181
12182
12183
12184
12185
12186
12187
12188 static BOOL
12189 cwh_io_analyse_arr(WN *tree, IMPDO_INFO *impdo_set, INT32 mode)
12190 {
12191 INT32 nd;
12192 WN *addr;
12193 ST *st;
12194 BOOL *visited;
12195 INT32 i;
12196
12197 nd = WN_kid_count(tree)/2;
12198
12199
12200 addr = WN_kid0(tree);
12201
12202 if (WNOPR(addr) == OPR_LDA) {
12203
12204 st = cwh_io_ST_base(WN_st(addr));
12205 if (ST_class(st) == CLASS_BLOCK)
12206 return TRUE;
12207 if (TY_kind(ST_type(st)) == KIND_STRUCT)
12208 return TRUE;
12209 visited = cwh_stab_visited(st);
12210 if (*visited) {
12211 return TRUE;
12212 } else if (READ_MODE(mode)) {
12213 *visited = TRUE;
12214 cwh_io_add_st_to_marked_set(st);
12215 }
12216 for (i=2*nd; i > nd; i-- ) {
12217 if (cwh_io_analyse_index_expr(WN_kid(tree,i), impdo_set, mode) == -1)
12218 return TRUE;
12219 }
12220 } else {
12221 if (cwh_io_analyse_expr(tree, impdo_set, mode))
12222 return TRUE;
12223 }
12224
12225 return FALSE;
12226 }
12227
12228
12229
12230
12231
12232
12233
12234
12235
12236
12237
12238
12239
12240
12241
12242
12243
12244
12245
12246
12247
12248
12249
12250
12251
12252 static INT32
12253 cwh_io_analyse_index_expr(WN *tree, IMPDO_INFO *impdo_set, INT32 mode)
12254 {
12255 INT32 kid0_status;
12256 INT32 kid1_status;
12257 INT32 i;
12258 INT32 pos;
12259 BOOL *visited;
12260 ST *st;
12261
12262 if (WNOPR(tree) == OPR_TRIPLET) {
12263 for (i=1; i<=2; i++)
12264 if (cwh_io_analyse_expr(WN_kid(tree, i), impdo_set, mode))
12265 return -1;
12266
12267 kid0_status = cwh_io_analyse_index_expr(WN_kid0(tree), impdo_set,
12268 mode);
12269 return kid0_status;
12270
12271 } else if (WNOPR(tree) == OPR_LDID) {
12272
12273 if ( (pos = member (WN_st(tree), impdo_set)) != 0) {
12274 return pos;
12275 } else {
12276 st = cwh_io_ST_base(WN_st(tree));
12277 visited = cwh_stab_visited(st);
12278 if (*visited)
12279 return -1;
12280 else
12281 return 0;
12282 }
12283 } else if ( WN_operator_is(tree,OPR_CONST) ||
12284 WN_operator_is(tree,OPR_INTCONST)) {
12285 return 0;
12286 } else if ( WN_operator_is(tree,OPR_ADD) ) {
12287 kid0_status = cwh_io_analyse_index_expr(WN_kid0(tree), impdo_set, mode);
12288 kid1_status = cwh_io_analyse_index_expr(WN_kid1(tree), impdo_set, mode);
12289 switch(kid0_status) {
12290 case 0:
12291 return kid1_status;
12292 case -1:
12293 return -1;
12294 default:
12295 if (kid1_status == 0)
12296 return kid0_status;
12297 else
12298 return -1;
12299 }
12300 } else if (WN_operator_is(tree,OPR_SUB)) {
12301 kid0_status = cwh_io_analyse_index_expr(WN_kid0(tree), impdo_set, mode);
12302 kid1_status = cwh_io_analyse_index_expr(WN_kid1(tree), impdo_set, mode);
12303 switch(kid0_status) {
12304 case 0:
12305 if (kid1_status == 0)
12306 return 0;
12307 else
12308 return -1;
12309 case -1:
12310 return -1;
12311 default:
12312 if (kid1_status == 0)
12313 return kid0_status;
12314 else
12315 return -1;
12316 }
12317 }
12318 return -1;
12319 }
12320
12321
12322
12323
12324
12325
12326
12327
12328
12329
12330
12331
12332
12333 static mINT32
12334 member(ST *st, IMPDO_INFO *impdo_set)
12335 {
12336 mINT32 ret_val = 1;
12337 while (impdo_set) {
12338 if (st == Impdo_index(impdo_set))
12339 return ret_val;
12340 impdo_set = Impdo_next(impdo_set);
12341 ret_val++;
12342 }
12343 return 0;
12344 }
12345
12346
12347
12348
12349
12350
12351
12352
12353
12354
12355
12356
12357
12358 static INT32
12359 cwh_io_search_implied_do_index(WN *tree, IMPDO_INFO *impdo_set)
12360 {
12361 INT32 pos;
12362 ST *st;
12363 INT32 i;
12364
12365 if (WNOPR(tree) == OPR_LDID) {
12366 st = WN_st(tree);
12367 if ( (pos = member (st, impdo_set)) != 0)
12368 return pos;
12369 } else {
12370 for(i=0; i < WN_kid_count(tree); i++) {
12371 pos = cwh_io_search_implied_do_index(WN_kid(tree, i),impdo_set);
12372 if (pos != 0)
12373 return pos;
12374 }
12375 }
12376 return 0;
12377 }
12378
12379
12380
12381
12382
12383
12384
12385
12386
12387
12388 static void
12389 cwh_io_add_st_to_marked_set(ST *st) {
12390
12391 MARKED_SET *new_marked_set;
12392
12393 new_marked_set = (MARKED_SET *) malloc(sizeof(MARKED_SET));
12394 Marked_st(new_marked_set) = st;
12395 Marked_next(new_marked_set) = marked_set;
12396
12397 marked_set = new_marked_set;
12398 }
12399
12400
12401
12402
12403
12404
12405
12406
12407
12408
12409
12410 static void
12411 cwh_io_unmark(void) {
12412
12413 BOOL *visited;
12414 MARKED_SET *temp;
12415
12416 while(marked_set) {
12417 temp = marked_set;
12418 visited = cwh_stab_visited(Marked_st(marked_set));
12419 *visited = FALSE;
12420 marked_set = Marked_next(marked_set);
12421 free(temp);
12422 }
12423 }
12424
12425
12426
12427
12428
12429
12430
12431
12432
12433
12434
12435
12436 static WN *
12437 Substitute_1_For_Impdo_Index_Val(WN *tree, IMPDO_INFO *impdo)
12438 {
12439 INT32 i;
12440 OPCODE opc_intconst;
12441 INT32 rtype;
12442
12443 if (WN_operator_is(tree,OPR_LDID) &&
12444 (WN_st(tree) == Impdo_index(impdo)) ) {
12445 rtype = WN_rtype(tree);
12446 switch (rtype) {
12447 case MTYPE_I4:
12448 opc_intconst = OPC_I4INTCONST;
12449 break;
12450 case MTYPE_I8:
12451 opc_intconst = OPC_I8INTCONST;
12452 break;
12453 case MTYPE_U4:
12454 opc_intconst = OPC_U4INTCONST;
12455 break;
12456 case MTYPE_U8:
12457 opc_intconst = OPC_U8INTCONST;
12458 break;
12459 default:
12460 DevAssert((0),("Odd type"));
12461 }
12462 return (WN_CreateIntconst ( opc_intconst, 1));
12463 } else {
12464 for(i=0; i<WN_kid_count(tree); i++ ) {
12465 WN_kid(tree, i) = Substitute_1_For_Impdo_Index_Val(WN_kid(tree, i),
12466 impdo);
12467 }
12468 }
12469 return tree;
12470 }
12471
12472
12473
12474
12475
12476
12477
12478
12479
12480
12481 static BOOL
12482 OPCODE_has_aux(const OPCODE opc)
12483 {
12484
12485 OPERATOR opr = OPCODE_operator(opc);
12486 return (opr == OPR_LDID || opr == OPR_STID ||
12487 opr == OPR_LDA || opr == OPR_IDNAME);
12488 }
12489
12490
12491 extern void
12492 Lower_IO_Init (void)
12493 {
12494 if (Current_pu != cray_iolist_current_pu) {
12495 cray_iolist_current_pu = Current_pu;
12496 if (stack_ty == (TY_IDX) 0)
12497 stack_ty = Make_Simple_Array_Type("stack_space_type", STACK_LENGTH,
12498 Be_Type_Tbl(MTYPE_U8));
12499 stack_st = Gen_Temp_Symbol ( stack_ty, TY_name(stack_ty) );
12500 io_set_addr_passed_flag(stack_st);
12501 }
12502 container_block_for_iolists = NULL;
12503 num_iolists = 0;
12504
12505
12506 if (Current_pu != fio_current_pu) {
12507 fio_current_pu = Current_pu;
12508 local_sequence = 1;
12509 INT32 i;
12510 for (i=FIOSTRUCTID_FIRST; i<=FIOSTRUCTID_LAST; i++)
12511 fiostruct_st[i] = NULL;
12512 cilist_st = NULL;
12513 }
12514
12515 }
12516