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
00045 static char USMID[] = "\n@(#)5.0_pl/sources/s_cnstrct.c 5.6 09/29/99 00:38:21\n";
00046
00047 # include "defines.h"
00048
00049 # include "host.m"
00050 # include "host.h"
00051 # include "target.m"
00052 # include "target.h"
00053
00054 # include "globals.m"
00055 # include "tokens.m"
00056 # include "sytb.m"
00057 # include "s_globals.m"
00058 # include "debug.m"
00059 # include "s_asg_expr.m"
00060 # include "s_cnstrct.m"
00061
00062 # include "globals.h"
00063 # include "tokens.h"
00064 # include "sytb.h"
00065 # include "s_globals.h"
00066 # include "s_cnstrct.h"
00067 # include "fmath.h"
00068
00069 # if defined(_HOST_OS_UNICOS) || defined(_HOST_OS_MAX)
00070 # include <fortran.h>
00071 # endif
00072
00073
00074
00075
00076
00077
00078
00079 static boolean interpret_constructor(opnd_type *, expr_arg_type *,
00080 boolean, long64 *);
00081 static void increment_count(expr_arg_type *);
00082 static void write_constant(int);
00083 static boolean interpret_implied_do(int, expr_arg_type *, boolean, long64 *);
00084 static boolean interpret_ref(opnd_type *, expr_arg_type *, boolean, long64 *);
00085 static void enlarge_char_result_buffer(void);
00086 static void broadcast_scalar(expr_arg_type *, long64);
00087 static boolean interpret_struct_construct_opr(int, expr_arg_type *,
00088 boolean, long64 *);
00089 static boolean interpret_array_construct_opr(int, expr_arg_type *,
00090 boolean, long64 *);
00091 static boolean interpret_unary_opr(int, expr_arg_type *, boolean, long64 *);
00092 static boolean interpret_binary_opr(int, expr_arg_type *, boolean, long64 *);
00093 static boolean interpret_concat_opr(int, expr_arg_type *, boolean, long64 *);
00094 static boolean interpret_trim_intrinsic(int, expr_arg_type *, boolean,long64 *);
00095 static boolean interpret_adjustl_intrinsic(int, expr_arg_type *,
00096 boolean, long64 *);
00097 static boolean interpret_repeat_intrinsic(int, expr_arg_type *,
00098 boolean, long64 *);
00099 static boolean interpret_transfer_intrinsic(int, expr_arg_type *,
00100 boolean, long64 *);
00101 static boolean interpret_reshape_intrinsic(int, expr_arg_type *,
00102 boolean, long64 *);
00103 static boolean interpret_size_intrinsic(int, expr_arg_type *,
00104 boolean, long64 *);
00105 static boolean interpret_ubound_intrinsic(int, expr_arg_type *,
00106 boolean, long64 *);
00107 static boolean interpret_shape_intrinsic(int, expr_arg_type *,
00108 boolean, long64 *);
00109 static boolean interpret_sik_intrinsic(int, expr_arg_type *,
00110 boolean, long64 *);
00111 static boolean interpret_srk_intrinsic(int, expr_arg_type *,
00112 boolean, long64 *);
00113 static boolean interpret_unary_intrinsic_opr(int, expr_arg_type *,
00114 boolean, long64 *);
00115 static boolean interpret_binary_intrinsic_opr(int, expr_arg_type *,
00116 boolean, long64 *);
00117 static boolean interpret_max_min_opr(int, expr_arg_type *,
00118 boolean, long64 *);
00119 static boolean interpret_csmg_opr(int, expr_arg_type *, boolean, long64 *);
00120 static boolean interpret_cvmgt_opr(int, expr_arg_type *, boolean, long64 *);
00121 static boolean interpret_index_opr(int, expr_arg_type *, boolean, long64 *);
00122
00123 #ifdef _WHIRL_HOST64_TARGET64
00124 extern int double_stride;
00125 #endif
00126
00127 #if 0
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 static long_type pack_int32_to_int64(long_type* opnds)
00145 {
00146 long_type result = 0LL;
00147 # ifdef _WHIRL_HOST64_TARGET64
00148 result |= opnds[1] << 32;
00149 result |= result_value[0];
00150 # else
00151 result |= result_value[0] << 32;
00152 result |= result_value[1];
00153 # endif
00154 return result;
00155 }
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173 void unpack_int64_to_int32(long_type opnd, long_type* results)
00174 {
00175 # ifdef _WHIRL_HOST64_TARGET64
00176 results[1] = opnd >> 32;
00177 results[0] = opnd & 0xffffffff;
00178 # else
00179 results[0] = opnd >> 32;
00180 results[1] = opnd & 0xffffffff;
00181 # endif
00182 }
00183 #endif
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 boolean create_constructor_constant(opnd_type *top_opnd,
00206 expr_arg_type *exp_desc)
00207
00208 {
00209 int asg_idx;
00210 int bd_idx;
00211 opnd_type char_len_opnd;
00212 int col;
00213 int i;
00214 int ir_idx;
00215 int line;
00216 int list_idx;
00217 boolean ok = TRUE;
00218 expr_arg_type loc_exp_desc;
00219 int mult_idx;
00220 long64 num_elements = 1;
00221 boolean save_defer_stmt_expansion;
00222 expr_arg_type save_exp_desc;
00223 int save_target_array_idx = 0;
00224 int sub_idx;
00225 int tmp_idx;
00226 int type_idx;
00227 long64 zero = 0;
00228
00229
00230 TRACE (Func_Entry, "create_constructor_constant", NULL);
00231
00232 save_defer_stmt_expansion = defer_stmt_expansion;
00233 defer_stmt_expansion = FALSE;
00234
00235 single_value_array = FALSE;
00236 single_value_opnd = null_opnd;
00237
00238 if (OPND_FLD((*top_opnd)) == CN_Tbl_Idx &&
00239 exp_desc->type != Character &&
00240 exp_desc->type != Structure) {
00241 single_value_array = TRUE;
00242 COPY_OPND(single_value_opnd, (*top_opnd));
00243 }
00244
00245
00246
00247
00248 if (check_type_conversion) {
00249
00250 if (! check_asg_semantics(target_type_idx, exp_desc->type_idx, -1,0)) {
00251 check_type_conversion = FALSE;
00252 }
00253 }
00254
00255 save_exp_desc = (*exp_desc);
00256 ir_idx = OPND_IDX((*top_opnd));
00257
00258 find_opnd_line_and_column(top_opnd, &line, &col);
00259
00260 char_result_offset = 0;
00261 bits_in_constructor = 0;
00262
00263 unequal_char_lens = FALSE;
00264
00265 if (IR_OPR(ir_idx) != Constant_Struct_Construct_Opr &&
00266 exp_desc->type == Character) {
00267
00268 copy_subtree(&(exp_desc->char_len), &char_len_opnd);
00269 OPND_LINE_NUM(char_len_opnd) = line;
00270 OPND_COL_NUM(char_len_opnd) = col;
00271
00272 if (OPND_FLD(char_len_opnd) != CN_Tbl_Idx) {
00273 process_char_len(&char_len_opnd);
00274 }
00275
00276 # ifdef _DEBUG
00277 if (OPND_FLD(char_len_opnd) != CN_Tbl_Idx) {
00278 PRINTMSG(line, 1203, Internal, col);
00279 }
00280 # endif
00281
00282 if (! check_type_conversion) {
00283
00284 check_type_conversion = TRUE;
00285 target_type_idx = Character_1;
00286 target_char_len_idx = OPND_IDX(char_len_opnd);
00287 }
00288 }
00289
00290
00291
00292 if (IR_OPR(ir_idx) != Constant_Struct_Construct_Opr &&
00293 exp_desc->constructor_size_level == Simple_Expr_Size) {
00294
00295 increment_count(exp_desc);
00296 }
00297 else {
00298
00299 (*exp_desc) = init_exp_desc;
00300 ok = interpret_constructor(top_opnd, exp_desc, TRUE, &zero);
00301 }
00302
00303 switch (stmt_type) {
00304 case Allocate_Stmt :
00305 case Arith_If_Stmt :
00306 case Assignment_Stmt :
00307 case Backspace_Stmt :
00308 case Buffer_Stmt :
00309 case Call_Stmt :
00310 case Case_Stmt :
00311 case Close_Stmt :
00312 case Deallocate_Stmt :
00313 case Decode_Stmt :
00314 case Do_Iterative_Stmt :
00315 case Do_While_Stmt :
00316 case Do_Infinite_Stmt :
00317 case Else_If_Stmt :
00318 case Else_Where_Stmt :
00319 case Encode_Stmt :
00320 case Endfile_Stmt :
00321 case If_Cstrct_Stmt :
00322 case If_Stmt :
00323 case Inquire_Stmt :
00324 case Nullify_Stmt :
00325 case Open_Stmt :
00326 case Outmoded_If_Stmt :
00327 case Print_Stmt :
00328 case Read_Stmt :
00329 case Rewind_Stmt :
00330 case Select_Stmt :
00331 case Where_Cstrct_Stmt :
00332 case Where_Stmt :
00333 case Write_Stmt :
00334
00335
00336
00337
00338
00339 if (ok &&
00340 ! single_value_array &&
00341 OPND_FLD(exp_desc->shape[0]) == CN_Tbl_Idx &&
00342 compare_cn_and_value(OPND_IDX(exp_desc->shape[0]),
00343 5000,
00344 Gt_Opr)) {
00345
00346
00347 COPY_OPND((save_exp_desc.shape[0]), (exp_desc->shape[0]));
00348 (*exp_desc) = save_exp_desc;
00349
00350 exp_desc->will_fold_later = FALSE;
00351 exp_desc->foldable = FALSE;
00352 IR_OPR(ir_idx) = Array_Construct_Opr;
00353 exp_desc->constructor_size_level = Simple_Expr_Size;
00354
00355 ok = create_runtime_array_constructor(top_opnd, exp_desc);
00356
00357 goto EXIT;
00358 }
00359 break;
00360 }
00361
00362 if (exp_desc->type == Character) {
00363
00364 if (unequal_char_lens) {
00365 PRINTMSG(line, 903, Ansi, col);
00366 }
00367
00368 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
00369
00370 TYP_TYPE(TYP_WORK_IDX) = Character;
00371 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
00372 TYP_CHAR_CLASS(TYP_WORK_IDX)= Const_Len_Char;
00373 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
00374 TYP_IDX(TYP_WORK_IDX) = target_char_len_idx;
00375
00376 exp_desc->type_idx = ntr_type_tbl();
00377 exp_desc->type = Character;
00378 exp_desc->linear_type = CHARACTER_DEFAULT_TYPE;
00379 exp_desc->char_len.fld = TYP_FLD(exp_desc->type_idx);
00380 exp_desc->char_len.idx = TYP_IDX(exp_desc->type_idx);
00381 }
00382 else if (check_type_conversion) {
00383 exp_desc->type_idx = target_type_idx;
00384 exp_desc->type = TYP_TYPE(target_type_idx);
00385 exp_desc->linear_type = TYP_LINEAR(target_type_idx);
00386 }
00387
00388 char_result_offset = 0;
00389
00390 if (! ok) {
00391 goto EXIT;
00392 }
00393
00394 if (target_array_idx != NULL_IDX) {
00395
00396 save_target_array_idx = target_array_idx;
00397 }
00398
00399
00400 if (exp_desc->rank == 0 &&
00401 target_array_idx != NULL_IDX &&
00402 BD_RESOLVED(target_array_idx)) {
00403
00404 if (BD_LEN_FLD(target_array_idx) == CN_Tbl_Idx) {
00405 num_elements = CN_INT_TO_C(BD_LEN_IDX(target_array_idx));
00406 bits_in_constructor *= num_elements;
00407 }
00408
00409 exp_desc->rank = BD_RANK(target_array_idx);
00410
00411 for (i = 0; i < BD_RANK(target_array_idx); i++) {
00412 OPND_FLD(exp_desc->shape[i]) = BD_XT_FLD(target_array_idx, i + 1);
00413 OPND_IDX(exp_desc->shape[i]) = BD_XT_IDX(target_array_idx, i + 1);
00414 OPND_LINE_NUM(exp_desc->shape[i]) = line;
00415 OPND_COL_NUM(exp_desc->shape[i]) = col;
00416 }
00417 }
00418
00419 if (! single_value_array) {
00420 target_array_idx = NULL_IDX;
00421 words_in_constructor = STORAGE_WORD_SIZE(bits_in_constructor);
00422
00423
00424
00425 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
00426 TYP_TYPE(TYP_WORK_IDX) = Typeless;
00427 TYP_LINEAR(TYP_WORK_IDX) = Long_Typeless;
00428 TYP_BIT_LEN(TYP_WORK_IDX) = bits_in_constructor;
00429 type_idx = ntr_type_tbl();
00430
00431
00432
00433 the_cn_idx = ntr_const_tbl(type_idx, FALSE, NULL);
00434 the_cn_bit_offset = 0;
00435
00436
00437
00438 if (num_elements > 0) {
00439 ok = interpret_constructor(top_opnd, &loc_exp_desc, FALSE, &zero);
00440
00441 if (num_elements > 1) {
00442 bcast_cn_bit_offset = 0;
00443 broadcast_scalar(exp_desc, num_elements);
00444 }
00445 }
00446
00447 # ifdef _DEBUG
00448 # if 0
00449 print_cn(the_cn_idx);
00450 # endif
00451 # endif
00452
00453 }
00454 else {
00455
00456 if (check_type_conversion &&
00457 TYP_LINEAR(CN_TYPE_IDX(OPND_IDX(single_value_opnd))) !=
00458 TYP_LINEAR(target_type_idx)) {
00459
00460
00461 cast_to_type_idx(&single_value_opnd,
00462 &save_exp_desc,
00463 target_type_idx);
00464 }
00465 }
00466
00467
00468 check_type_conversion = FALSE;
00469
00470 if (! ok) {
00471 goto EXIT;
00472 }
00473
00474 exp_desc->constructor = TRUE;
00475
00476 # if 0
00477
00478
00479
00480 if (stmt_type == Data_Stmt) {
00481
00482 OPND_FLD((*top_opnd)) = CN_Tbl_Idx;
00483 OPND_IDX((*top_opnd)) = the_cn_idx;
00484 OPND_LINE_NUM((*top_opnd)) = line;
00485 OPND_COL_NUM((*top_opnd)) = col;
00486 exp_desc->foldable = TRUE;
00487 exp_desc->constant = TRUE;
00488 goto EXIT;
00489 }
00490 # endif
00491
00492
00493
00494 if (OPND_FLD(init_target_opnd) != NO_Tbl_Idx) {
00495 tmp_idx = find_left_attr(&init_target_opnd);
00496
00497
00498 NTR_IR_TBL(asg_idx);
00499 IR_OPR(asg_idx) = Init_Opr;
00500 IR_TYPE_IDX(asg_idx) = TYPELESS_DEFAULT_TYPE;
00501 IR_LINE_NUM(asg_idx) = line;
00502 IR_COL_NUM(asg_idx) = col;
00503 IR_LINE_NUM_L(asg_idx) = line;
00504 IR_COL_NUM_L(asg_idx) = col;
00505
00506 if (single_value_array &&
00507 OPND_FLD(init_target_opnd) == AT_Tbl_Idx) {
00508
00509 bd_idx = ATD_ARRAY_IDX(tmp_idx);
00510
00511 NTR_IR_TBL(sub_idx);
00512 IR_OPR(sub_idx) = Subscript_Opr;
00513 IR_TYPE_IDX(sub_idx) = ATD_TYPE_IDX(tmp_idx);
00514 IR_LINE_NUM(sub_idx) = line;
00515 IR_COL_NUM(sub_idx) = col;
00516 IR_FLD_L(sub_idx) = AT_Tbl_Idx;
00517 IR_IDX_L(sub_idx) = tmp_idx;
00518 IR_LINE_NUM_L(sub_idx) = line;
00519 IR_COL_NUM_L(sub_idx) = col;
00520
00521 IR_FLD_L(asg_idx) = IR_Tbl_Idx;
00522 IR_IDX_L(asg_idx) = sub_idx;
00523
00524 NTR_IR_LIST_TBL(list_idx);
00525 IR_FLD_R(sub_idx) = IL_Tbl_Idx;
00526 IR_LIST_CNT_R(sub_idx) = BD_RANK(bd_idx);
00527 IR_IDX_R(sub_idx) = list_idx;
00528
00529 IL_FLD(list_idx) = BD_LB_FLD(bd_idx, 1);
00530 IL_IDX(list_idx) = BD_LB_IDX(bd_idx, 1);
00531 IL_LINE_NUM(list_idx) = line;
00532 IL_COL_NUM(list_idx) = col;
00533
00534 for (i = 2; i <= BD_RANK(bd_idx); i++) {
00535 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
00536 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
00537 list_idx = IL_NEXT_LIST_IDX(list_idx);
00538
00539 IL_FLD(list_idx) = BD_LB_FLD(bd_idx, i);
00540 IL_IDX(list_idx) = BD_LB_IDX(bd_idx, i);
00541 IL_LINE_NUM(list_idx) = line;
00542 IL_COL_NUM(list_idx) = col;
00543 }
00544 }
00545 else {
00546 COPY_OPND(IR_OPND_L(asg_idx), init_target_opnd);
00547 }
00548
00549 NTR_IR_LIST_TBL(list_idx);
00550 IR_FLD_R(asg_idx) = IL_Tbl_Idx;
00551 IR_IDX_R(asg_idx) = list_idx;
00552 IR_LIST_CNT_R(asg_idx) = 3;
00553
00554 IL_FLD(list_idx) = CN_Tbl_Idx;
00555 IL_IDX(list_idx) = (single_value_array ?
00556 OPND_IDX(single_value_opnd) : the_cn_idx);
00557 IL_LINE_NUM(list_idx) = line;
00558 IL_COL_NUM(list_idx) = col;
00559
00560 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
00561 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
00562 list_idx = IL_NEXT_LIST_IDX(list_idx);
00563
00564 IL_FLD(list_idx) = CN_Tbl_Idx;
00565
00566 if (single_value_array) {
00567 IL_IDX(list_idx) = BD_LEN_IDX(ATD_ARRAY_IDX(tmp_idx));
00568 }
00569 else {
00570 IL_IDX(list_idx) = CN_INTEGER_ONE_IDX;
00571 }
00572
00573 IL_LINE_NUM(list_idx) = line;
00574 IL_COL_NUM(list_idx) = col;
00575
00576 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
00577 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
00578 list_idx = IL_NEXT_LIST_IDX(list_idx);
00579
00580 IL_FLD(list_idx) = CN_Tbl_Idx;
00581
00582 if (single_value_array) {
00583 IL_IDX(list_idx) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
00584 storage_bit_size_tbl[exp_desc->linear_type]);
00585 }
00586 else {
00587 IL_IDX(list_idx) = CN_INTEGER_ZERO_IDX;
00588 }
00589
00590 IL_LINE_NUM(list_idx) = line;
00591 IL_COL_NUM(list_idx) = col;
00592
00593 gen_sh(Before, Assignment_Stmt, line, col,
00594 FALSE, FALSE, TRUE);
00595 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
00596 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
00597 }
00598 else {
00599 tmp_idx = gen_compiler_tmp(line, col, Shared, TRUE);
00600 AT_SEMANTICS_DONE(tmp_idx)= TRUE;
00601 ATD_TYPE_IDX(tmp_idx) = exp_desc->type_idx;
00602
00603 if (exp_desc->rank) {
00604 #ifdef _WHIRL_HOST64_TARGET64
00605 if (storage_bit_size_tbl[exp_desc->linear_type] > 32)
00606 double_stride = 1;
00607 #endif
00608 ATD_ARRAY_IDX(tmp_idx) = save_target_array_idx ?
00609 save_target_array_idx : create_bd_ntry_for_const(exp_desc,
00610 line,
00611 col);
00612 #ifdef _WHIRL_HOST64_TARGET64
00613 double_stride = 0;
00614 #endif
00615 }
00616
00617 ATD_SAVED(tmp_idx) = TRUE;
00618 ATD_DATA_INIT(tmp_idx) = TRUE;
00619 ATD_STOR_BLK_IDX(tmp_idx) = SCP_SB_STATIC_INIT_IDX(curr_scp_idx);
00620
00621 if (single_value_array) {
00622 NTR_IR_TBL(mult_idx);
00623 IR_OPR(mult_idx) = Mult_Opr;
00624 IR_TYPE_IDX(mult_idx) = CG_INTEGER_DEFAULT_TYPE;
00625 IR_LINE_NUM(mult_idx) = line;
00626 IR_COL_NUM(mult_idx) = col;
00627 IR_FLD_L(mult_idx) = BD_LEN_FLD(ATD_ARRAY_IDX(tmp_idx));
00628 IR_IDX_L(mult_idx) = BD_LEN_IDX(ATD_ARRAY_IDX(tmp_idx));
00629 IR_LINE_NUM_L(mult_idx) = line;
00630 IR_COL_NUM_L(mult_idx) = col;
00631 COPY_OPND(IR_OPND_R(mult_idx), single_value_opnd);
00632 IR_LINE_NUM_R(mult_idx) = line;
00633 IR_COL_NUM_R(mult_idx) = col;
00634
00635 ATD_FLD(tmp_idx) = IR_Tbl_Idx;
00636 ATD_TMP_IDX(tmp_idx) = mult_idx;
00637 }
00638 else {
00639 ATD_FLD(tmp_idx) = CN_Tbl_Idx;
00640 ATD_TMP_IDX(tmp_idx) = the_cn_idx;
00641 }
00642
00643 ATD_TMP_INIT_NOT_DONE(tmp_idx) = TRUE;
00644 }
00645
00646 OPND_FLD((*top_opnd)) = AT_Tbl_Idx;
00647 OPND_IDX((*top_opnd)) = tmp_idx;
00648 OPND_LINE_NUM((*top_opnd)) = line;
00649 OPND_COL_NUM((*top_opnd)) = col;
00650
00651 if (insert_subs_ok) {
00652
00653 if (exp_desc->rank) {
00654
00655 ok = gen_whole_subscript(top_opnd, &loc_exp_desc);
00656 }
00657 else if (exp_desc->type == Character) {
00658 ok = gen_whole_substring(top_opnd, exp_desc->rank);
00659 }
00660 }
00661
00662 AT_REFERENCED(tmp_idx) = Referenced;
00663 AT_DEFINED(tmp_idx) = TRUE;
00664
00665 exp_desc->foldable = TRUE;
00666 exp_desc->tmp_reference = TRUE;
00667 exp_desc->constant = TRUE;
00668
00669 if (exp_desc->rank > 0) {
00670 exp_desc->contig_array = TRUE;
00671 }
00672
00673 target_array_idx = save_target_array_idx;
00674
00675 EXIT:
00676
00677 defer_stmt_expansion = save_defer_stmt_expansion;
00678
00679 TRACE (Func_Exit, "create_constructor_constant", NULL);
00680
00681 return(ok);
00682
00683 }
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705 boolean fold_aggragate_expression(opnd_type *top_opnd,
00706 expr_arg_type *exp_desc,
00707 boolean return_const)
00708
00709 {
00710 int asg_idx;
00711 int bd_idx;
00712 char *char_ptr;
00713 int col;
00714 int i;
00715 int line;
00716 int list_idx;
00717 long64 loc_char_result_offset;
00718 long64 loc_element;
00719 expr_arg_type loc_exp_desc;
00720 long_type loc_value[MAX_WORDS_FOR_NUMERIC];
00721 int mult_idx;
00722 long64 num_elements = 1;
00723 boolean ok = TRUE;
00724 expr_arg_type save_exp_desc;
00725 int save_target_array_idx = NULL_IDX;
00726 int sub_idx;
00727 long64 the_constant;
00728 int tmp_idx;
00729 int type_idx;
00730 long64 zero = 0;
00731
00732
00733 TRACE (Func_Entry, "fold_aggragate_expression", NULL);
00734
00735 single_value_array = FALSE;
00736 single_value_opnd = null_opnd;
00737
00738 if (OPND_FLD((*top_opnd)) == CN_Tbl_Idx &&
00739 ! return_const &&
00740 exp_desc->type != Character &&
00741 exp_desc->type != Structure) {
00742 single_value_array = TRUE;
00743 COPY_OPND(single_value_opnd, (*top_opnd));
00744 }
00745
00746 save_exp_desc = *exp_desc;
00747
00748 find_opnd_line_and_column(top_opnd, &line, &col);
00749
00750
00751
00752
00753 if (check_type_conversion) {
00754
00755 if (! check_asg_semantics(target_type_idx, exp_desc->type_idx,
00756 line, col)) {
00757 check_type_conversion = FALSE;
00758 }
00759 }
00760
00761 char_result_offset = 0;
00762
00763 if (exp_desc->rank == 0 &&
00764 target_array_idx == NULL_IDX &&
00765 #ifdef KEY
00766
00767
00768
00769
00770
00771
00772
00773 (!(exp_desc->constant && exp_desc->pointer)) &&
00774 #endif
00775 exp_desc->type != Structure) {
00776
00777
00778
00779
00780
00781 if (exp_desc->type == Character &&
00782 (! check_type_conversion ||
00783 TYP_TYPE(target_type_idx) == Character)) {
00784
00785 bits_in_constructor = 0;
00786 unequal_char_lens = FALSE;
00787
00788 ok = interpret_constructor(top_opnd, exp_desc, TRUE, &zero);
00789
00790 if (exp_desc->constant) {
00791 increment_count(exp_desc);
00792 }
00793
00794 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
00795
00796 TYP_TYPE(TYP_WORK_IDX) = Character;
00797 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
00798 TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
00799 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
00800
00801 if (! check_type_conversion) {
00802 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(Integer_8, char_result_len);
00803 }
00804 else {
00805 TYP_IDX(TYP_WORK_IDX) = target_char_len_idx;
00806 }
00807
00808 exp_desc->type_idx = ntr_type_tbl();
00809 exp_desc->type = Character;
00810 exp_desc->linear_type = CHARACTER_DEFAULT_TYPE;
00811 exp_desc->char_len.fld = TYP_FLD(exp_desc->type_idx);
00812 exp_desc->char_len.idx = TYP_IDX(exp_desc->type_idx);
00813 words_in_constructor = STORAGE_WORD_SIZE(bits_in_constructor);
00814
00815
00816
00817 the_cn_idx = ntr_const_tbl(exp_desc->type_idx, TRUE, NULL);
00818 the_cn_bit_offset = 0;
00819 ok = interpret_constructor(top_opnd,
00820 &loc_exp_desc,
00821 FALSE,
00822 &zero);
00823 char_result_offset = 0;
00824
00825 if (loc_exp_desc.constant) {
00826 write_constant(loc_exp_desc.type_idx);
00827 }
00828
00829 the_constant = CN_INT_TO_C(TYP_IDX(CN_TYPE_IDX(the_cn_idx)));
00830
00831
00832
00833 char_ptr = (char *)&(CN_CONST(the_cn_idx));
00834
00835 while (the_constant % TARGET_CHARS_PER_WORD != 0) {
00836 char_ptr[the_constant] = ' ';
00837 the_constant++;
00838 }
00839
00840 OPND_FLD((*top_opnd)) = CN_Tbl_Idx;
00841 OPND_IDX((*top_opnd)) = the_cn_idx;
00842 OPND_LINE_NUM((*top_opnd)) = line;
00843 OPND_COL_NUM((*top_opnd)) = col;
00844 exp_desc->constant = TRUE;
00845 exp_desc->foldable = TRUE;
00846 }
00847 else {
00848 ok = interpret_constructor(top_opnd, &loc_exp_desc, FALSE, &zero);
00849 #ifdef KEY
00850 if (!ok) {
00851 return ok;
00852 }
00853 #endif
00854
00855 if (loc_exp_desc.constant) {
00856
00857 if (check_type_conversion) {
00858 type_idx = target_type_idx;
00859
00860 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
00861 loc_value[i] = result_value[i];
00862 }
00863
00864 ok &= folder_driver((char *)loc_value,
00865 loc_exp_desc.type_idx,
00866 NULL,
00867 NULL_IDX,
00868 result_value,
00869 &type_idx,
00870 stmt_start_line,
00871 stmt_start_col,
00872 1,
00873 Cvrt_Opr);
00874
00875 exp_desc->type_idx = target_type_idx;
00876 exp_desc->type = TYP_TYPE(target_type_idx);
00877 exp_desc->linear_type = TYP_LINEAR(target_type_idx);
00878 }
00879 else {
00880 type_idx = exp_desc->type_idx;
00881 }
00882
00883 if (OPND_FLD((*top_opnd)) == CN_Tbl_Idx &&
00884 (! check_type_conversion ||
00885 TYP_LINEAR(CN_TYPE_IDX(OPND_IDX((*top_opnd)))) ==
00886 TYP_LINEAR(target_type_idx))) {
00887
00888
00889
00890 }
00891 else if ((loc_exp_desc.type == Typeless ||
00892 loc_exp_desc.type == Character) &&
00893 TYP_TYPE(type_idx) == Real) {
00894
00895 OPND_IDX((*top_opnd)) = ntr_unshared_const_tbl(type_idx,
00896 FALSE,
00897 result_value);
00898 }
00899 else {
00900 OPND_IDX((*top_opnd)) = ntr_const_tbl(type_idx,
00901 FALSE,
00902 result_value);
00903 }
00904
00905 OPND_FLD((*top_opnd)) = CN_Tbl_Idx;
00906
00907 OPND_LINE_NUM((*top_opnd)) = line;
00908 OPND_COL_NUM((*top_opnd)) = col;
00909 exp_desc->constant = TRUE;
00910 exp_desc->foldable = TRUE;
00911 }
00912 else {
00913 PRINTMSG(line, 979, Internal, col);
00914 }
00915 }
00916 }
00917 else {
00918
00919 bits_in_constructor = 0;
00920 unequal_char_lens = FALSE;
00921
00922 if (OPND_FLD((*top_opnd)) == IR_Tbl_Idx &&
00923 IR_ARRAY_SYNTAX(OPND_IDX((*top_opnd)))) {
00924
00925 loc_element = 1;
00926 }
00927 else {
00928 loc_element = 0;
00929 }
00930
00931 ok = interpret_constructor(top_opnd, exp_desc, TRUE, &loc_element);
00932
00933 if (exp_desc->constant) {
00934 #ifdef KEY
00935
00936
00937
00938 int top_idx, struct_idx;
00939 if (exp_desc->pointer &&
00940 OPND_FLD((*top_opnd)) == IR_Tbl_Idx &&
00941 IR_FLD_L(top_idx = OPND_IDX((*top_opnd))) == IR_Tbl_Idx &&
00942 IR_FLD_R(struct_idx = IR_IDX_L(top_idx)) == AT_Tbl_Idx) {
00943 bits_in_constructor += stor_bit_size_of(IR_IDX_R(struct_idx),
00944 TRUE, FALSE).constant[0];
00945 }
00946 else
00947 #endif
00948 increment_count(exp_desc);
00949 }
00950
00951 if (exp_desc->type == Character &&
00952 (! check_type_conversion ||
00953 TYP_TYPE(target_type_idx) == Character)) {
00954
00955 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
00956
00957 TYP_TYPE(TYP_WORK_IDX) = Character;
00958 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
00959 TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
00960 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
00961
00962 if (! check_type_conversion) {
00963 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(Integer_8, char_result_len);
00964 }
00965 else {
00966 TYP_IDX(TYP_WORK_IDX) = target_char_len_idx;
00967 }
00968
00969 exp_desc->type_idx = ntr_type_tbl();
00970 exp_desc->type = Character;
00971 exp_desc->linear_type = CHARACTER_DEFAULT_TYPE;
00972 exp_desc->char_len.fld = TYP_FLD(exp_desc->type_idx);
00973 exp_desc->char_len.idx = TYP_IDX(exp_desc->type_idx);
00974 }
00975 else if (check_type_conversion) {
00976 exp_desc->type_idx = target_type_idx;
00977 exp_desc->type = TYP_TYPE(target_type_idx);
00978 exp_desc->linear_type = TYP_LINEAR(target_type_idx);
00979 }
00980
00981 if (target_array_idx != NULL_IDX) {
00982
00983 save_target_array_idx = target_array_idx;
00984 }
00985
00986 if (exp_desc->rank == 0 &&
00987 target_array_idx != NULL_IDX &&
00988 BD_RESOLVED(target_array_idx)) {
00989
00990 if (BD_LEN_FLD(target_array_idx) == CN_Tbl_Idx) {
00991 num_elements = CN_INT_TO_C(BD_LEN_IDX(target_array_idx));
00992 bits_in_constructor *= num_elements;
00993 }
00994
00995 exp_desc->rank = BD_RANK(target_array_idx);
00996
00997 for (i = 0; i < BD_RANK(target_array_idx); i++) {
00998 OPND_FLD(exp_desc->shape[i]) = BD_XT_FLD(target_array_idx, i + 1);
00999 OPND_IDX(exp_desc->shape[i]) = BD_XT_IDX(target_array_idx, i + 1);
01000 OPND_LINE_NUM(exp_desc->shape[i]) = line;
01001 OPND_COL_NUM(exp_desc->shape[i]) = col;
01002 }
01003 }
01004
01005 if (! single_value_array) {
01006
01007 target_array_idx = NULL_IDX;
01008 words_in_constructor = STORAGE_WORD_SIZE(bits_in_constructor);
01009
01010 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
01011 TYP_TYPE(TYP_WORK_IDX) = Typeless;
01012 TYP_LINEAR(TYP_WORK_IDX) = Long_Typeless;
01013 TYP_BIT_LEN(TYP_WORK_IDX) = bits_in_constructor;
01014 type_idx = ntr_type_tbl();
01015
01016
01017
01018 the_cn_idx = ntr_const_tbl(type_idx, FALSE, NULL);
01019 the_cn_bit_offset = 0;
01020
01021
01022
01023 if (num_elements == 0) {
01024
01025 }
01026 else if (OPND_FLD((*top_opnd)) == IR_Tbl_Idx &&
01027 IR_ARRAY_SYNTAX(OPND_IDX((*top_opnd)))) {
01028
01029 loc_element = 1;
01030 while (loc_element >= 0) {
01031 loc_char_result_offset = char_result_offset;
01032 ok = interpret_constructor(top_opnd, &loc_exp_desc, FALSE,
01033 &loc_element);
01034 char_result_offset= loc_char_result_offset;
01035
01036 if (loc_exp_desc.constant) {
01037 write_constant(loc_exp_desc.type_idx);
01038 }
01039 }
01040 }
01041 else {
01042 loc_char_result_offset = char_result_offset;
01043 ok = interpret_constructor(top_opnd, &loc_exp_desc, FALSE, &zero);
01044 char_result_offset= loc_char_result_offset;
01045
01046 if (loc_exp_desc.constant) {
01047 write_constant(loc_exp_desc.type_idx);
01048 }
01049
01050 if (num_elements > 1) {
01051 bcast_cn_bit_offset = 0;
01052 broadcast_scalar(exp_desc, num_elements);
01053 }
01054 }
01055 }
01056 else {
01057
01058 if (check_type_conversion &&
01059 TYP_LINEAR(CN_TYPE_IDX(OPND_IDX(single_value_opnd))) !=
01060 TYP_LINEAR(target_type_idx)) {
01061
01062
01063 cast_to_type_idx(&single_value_opnd,
01064 &save_exp_desc,
01065 target_type_idx);
01066 }
01067 }
01068
01069
01070 if (return_const) {
01071 OPND_FLD((*top_opnd)) = CN_Tbl_Idx;
01072 OPND_IDX((*top_opnd)) = the_cn_idx;
01073 OPND_LINE_NUM((*top_opnd)) = line;
01074 OPND_COL_NUM((*top_opnd)) = col;
01075 exp_desc->constant = TRUE;
01076 exp_desc->foldable = TRUE;
01077 goto EXIT;
01078 }
01079
01080 if (OPND_FLD(init_target_opnd) != NO_Tbl_Idx) {
01081 tmp_idx = find_left_attr(&init_target_opnd);
01082
01083 if (do_constructor_init) {
01084
01085
01086 NTR_IR_TBL(asg_idx);
01087 IR_OPR(asg_idx) = Init_Opr;
01088 IR_TYPE_IDX(asg_idx) = TYPELESS_DEFAULT_TYPE;
01089 IR_LINE_NUM(asg_idx) = line;
01090 IR_COL_NUM(asg_idx) = col;
01091 IR_LINE_NUM_L(asg_idx) = line;
01092 IR_COL_NUM_L(asg_idx) = col;
01093
01094 if (single_value_array &&
01095 OPND_FLD(init_target_opnd) == AT_Tbl_Idx) {
01096
01097 bd_idx = ATD_ARRAY_IDX(tmp_idx);
01098
01099 NTR_IR_TBL(sub_idx);
01100 IR_OPR(sub_idx) = Subscript_Opr;
01101 IR_TYPE_IDX(sub_idx) = ATD_TYPE_IDX(tmp_idx);
01102 IR_LINE_NUM(sub_idx) = line;
01103 IR_COL_NUM(sub_idx) = col;
01104 IR_FLD_L(sub_idx) = AT_Tbl_Idx;
01105 IR_IDX_L(sub_idx) = tmp_idx;
01106 IR_LINE_NUM_L(sub_idx) = line;
01107 IR_COL_NUM_L(sub_idx) = col;
01108
01109 IR_FLD_L(asg_idx) = IR_Tbl_Idx;
01110 IR_IDX_L(asg_idx) = sub_idx;
01111
01112 NTR_IR_LIST_TBL(list_idx);
01113 IR_FLD_R(sub_idx) = IL_Tbl_Idx;
01114 IR_LIST_CNT_R(sub_idx) = BD_RANK(bd_idx);
01115 IR_IDX_R(sub_idx) = list_idx;
01116
01117 IL_FLD(list_idx) = BD_LB_FLD(bd_idx, 1);
01118 IL_IDX(list_idx) = BD_LB_IDX(bd_idx, 1);
01119 IL_LINE_NUM(list_idx) = line;
01120 IL_COL_NUM(list_idx) = col;
01121
01122 for (i = 2; i <= BD_RANK(bd_idx); i++) {
01123 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01124 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
01125 list_idx = IL_NEXT_LIST_IDX(list_idx);
01126
01127 IL_FLD(list_idx) = BD_LB_FLD(bd_idx, i);
01128 IL_IDX(list_idx) = BD_LB_IDX(bd_idx, i);
01129 IL_LINE_NUM(list_idx) = line;
01130 IL_COL_NUM(list_idx) = col;
01131 }
01132 }
01133 else {
01134 COPY_OPND(IR_OPND_L(asg_idx), init_target_opnd);
01135 }
01136
01137 NTR_IR_LIST_TBL(list_idx);
01138 IR_FLD_R(asg_idx) = IL_Tbl_Idx;
01139 IR_IDX_R(asg_idx) = list_idx;
01140 IR_LIST_CNT_R(asg_idx) = 3;
01141
01142 IL_FLD(list_idx) = CN_Tbl_Idx;
01143 IL_IDX(list_idx) = (single_value_array ?
01144 OPND_IDX(single_value_opnd) : the_cn_idx);
01145 IL_LINE_NUM(list_idx) = line;
01146 IL_COL_NUM(list_idx) = col;
01147
01148 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01149 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
01150 list_idx = IL_NEXT_LIST_IDX(list_idx);
01151
01152 IL_FLD(list_idx) = CN_Tbl_Idx;
01153
01154 if (single_value_array) {
01155 IL_IDX(list_idx) = BD_LEN_IDX(ATD_ARRAY_IDX(tmp_idx));
01156 }
01157 else {
01158 IL_IDX(list_idx) = CN_INTEGER_ONE_IDX;
01159 }
01160
01161 IL_LINE_NUM(list_idx) = line;
01162 IL_COL_NUM(list_idx) = col;
01163
01164 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx));
01165 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx;
01166 list_idx = IL_NEXT_LIST_IDX(list_idx);
01167
01168 IL_FLD(list_idx) = CN_Tbl_Idx;
01169
01170 if (single_value_array) {
01171 IL_IDX(list_idx) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
01172 storage_bit_size_tbl[exp_desc->linear_type]);
01173 }
01174 else {
01175 IL_IDX(list_idx) = CN_INTEGER_ZERO_IDX;
01176 }
01177
01178 IL_LINE_NUM(list_idx) = line;
01179 IL_COL_NUM(list_idx) = col;
01180
01181 gen_sh(Before, Assignment_Stmt, line, col,
01182 FALSE, FALSE, TRUE);
01183 SH_IR_IDX(SH_PREV_IDX(curr_stmt_sh_idx)) = asg_idx;
01184 SH_P2_SKIP_ME(SH_PREV_IDX(curr_stmt_sh_idx)) = TRUE;
01185 }
01186 }
01187 else {
01188 tmp_idx = gen_compiler_tmp(line, col, Shared, TRUE);
01189 AT_SEMANTICS_DONE(tmp_idx) = TRUE;
01190 ATD_TYPE_IDX(tmp_idx) = exp_desc->type_idx;
01191
01192 if (exp_desc->rank) {
01193 ATD_ARRAY_IDX(tmp_idx) = save_target_array_idx ?
01194 save_target_array_idx : create_bd_ntry_for_const(exp_desc,
01195 line,
01196 col);
01197 }
01198
01199 ATD_SAVED(tmp_idx) = TRUE;
01200 ATD_DATA_INIT(tmp_idx) = TRUE;
01201 ATD_STOR_BLK_IDX(tmp_idx) = SCP_SB_STATIC_INIT_IDX(curr_scp_idx);
01202
01203 if (single_value_array) {
01204 NTR_IR_TBL(mult_idx);
01205 IR_OPR(mult_idx) = Mult_Opr;
01206 IR_TYPE_IDX(mult_idx) = CG_INTEGER_DEFAULT_TYPE;
01207 IR_LINE_NUM(mult_idx) = line;
01208 IR_COL_NUM(mult_idx) = col;
01209 IR_FLD_L(mult_idx) = BD_LEN_FLD(ATD_ARRAY_IDX(tmp_idx));
01210 IR_IDX_L(mult_idx) = BD_LEN_IDX(ATD_ARRAY_IDX(tmp_idx));
01211 IR_LINE_NUM_L(mult_idx) = line;
01212 IR_COL_NUM_L(mult_idx) = col;
01213 COPY_OPND(IR_OPND_R(mult_idx), single_value_opnd);
01214 IR_LINE_NUM_R(mult_idx) = line;
01215 IR_COL_NUM_R(mult_idx) = col;
01216
01217 ATD_FLD(tmp_idx) = IR_Tbl_Idx;
01218 ATD_TMP_IDX(tmp_idx) = mult_idx;
01219 }
01220 else {
01221 ATD_FLD(tmp_idx) = CN_Tbl_Idx;
01222 ATD_TMP_IDX(tmp_idx) = the_cn_idx;
01223 }
01224
01225 if (do_constructor_init) {
01226 ATD_TMP_INIT_NOT_DONE(tmp_idx) = TRUE;
01227 }
01228 }
01229
01230 #ifdef KEY
01231
01232
01233
01234
01235
01236 if (exp_desc->pointer) {
01237 ATD_POINTER(tmp_idx) = ATD_IM_A_DOPE(tmp_idx) = TRUE;
01238 int save_tmp_idx = tmp_idx;
01239 NTR_IR_TBL(tmp_idx);
01240 IR_OPR(tmp_idx) = Dv_Deref_Opr;
01241 IR_LINE_NUM(tmp_idx) = line;
01242 IR_COL_NUM(tmp_idx) = col;
01243 IR_TYPE_IDX(tmp_idx) = exp_desc->type_idx;
01244 IR_FLD_L(tmp_idx) = AT_Tbl_Idx;
01245 IR_IDX_L(tmp_idx) = save_tmp_idx;
01246 IR_LINE_NUM_L(tmp_idx) = line;
01247 IR_COL_NUM_L(tmp_idx) = col;
01248 OPND_FLD((*top_opnd)) = IR_Tbl_Idx;
01249 }
01250 else
01251 #endif
01252 OPND_FLD((*top_opnd)) = AT_Tbl_Idx;
01253 OPND_IDX((*top_opnd)) = tmp_idx;
01254 OPND_LINE_NUM((*top_opnd)) = line;
01255 OPND_COL_NUM((*top_opnd)) = col;
01256
01257 if (insert_subs_ok) {
01258
01259 if (exp_desc->rank) {
01260 ok = gen_whole_subscript(top_opnd, &loc_exp_desc);
01261 }
01262 else if (exp_desc->type == Character) {
01263 ok = gen_whole_substring(top_opnd, 0);
01264 }
01265 }
01266
01267 AT_REFERENCED(tmp_idx) = Referenced;
01268 AT_DEFINED(tmp_idx) = TRUE;
01269
01270 exp_desc->foldable = TRUE;
01271 exp_desc->constructor = TRUE;
01272 exp_desc->tmp_reference = TRUE;
01273 exp_desc->constant = TRUE;
01274
01275 if (exp_desc->rank > 0) {
01276 exp_desc->contig_array = TRUE;
01277 }
01278 }
01279
01280 target_array_idx = save_target_array_idx;
01281
01282 EXIT:
01283
01284 TRACE (Func_Exit, "fold_aggragate_expression", NULL);
01285
01286 return(ok);
01287
01288 }
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319 int get_next_array_expr_element(opnd_type *top_opnd,
01320 long64 *element)
01321
01322 {
01323 int const_idx = NULL_IDX;
01324 expr_arg_type exp_desc;
01325 boolean unused;
01326
01327
01328 TRACE (Func_Entry, "get_next_array_expr_element", NULL);
01329
01330 unused = interpret_constructor(top_opnd, &exp_desc, FALSE, element);
01331
01332 if (! no_result_value) {
01333 const_idx = ntr_const_tbl(exp_desc.type_idx,
01334 FALSE,
01335 result_value);
01336 }
01337
01338 TRACE (Func_Exit, "get_next_array_expr_element", NULL);
01339
01340 return(const_idx);
01341
01342 }
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359
01360
01361
01362
01363
01364
01365
01366
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376
01377 static boolean interpret_constructor(opnd_type *top_opnd,
01378 expr_arg_type *exp_desc,
01379 boolean count,
01380 long64 *element)
01381
01382 {
01383 int attr_idx;
01384 int new_spec_idx;
01385 char *char_ptr;
01386 char *char_ptr2;
01387 long64 char_strct_len;
01388 int cn_idx;
01389 int col;
01390 long64 i;
01391 int ir_idx;
01392 long64 k;
01393 int line;
01394 expr_arg_type loc_exp_desc;
01395 boolean ok = TRUE;
01396 opnd_type opnd;
01397 int param_cn_idx;
01398 save_env_type save;
01399 int type_idx;
01400
01401
01402 TRACE (Func_Entry, "interpret_constructor", NULL);
01403
01404 (*exp_desc) = init_exp_desc;
01405 no_result_value = FALSE;
01406
01407 find_opnd_line_and_column(top_opnd, &line, &col);
01408
01409 switch (OPND_FLD((*top_opnd))) {
01410
01411 case NO_Tbl_Idx :
01412 break;
01413
01414 case CN_Tbl_Idx:
01415
01416 cn_idx = OPND_IDX((*top_opnd));
01417 type_idx = CN_TYPE_IDX(cn_idx);
01418 exp_desc->constant = TRUE;
01419
01420 exp_desc->type_idx = CN_TYPE_IDX(cn_idx);
01421 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
01422
01423 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
01424
01425 if (exp_desc->type == Character &&
01426 compare_cn_and_value(TYP_IDX(exp_desc->type_idx),
01427 MAX_CHARS_IN_TYPELESS,
01428 Le_Opr)) {
01429 exp_desc->linear_type = Short_Char_Const;
01430 }
01431
01432 if (*element > 0 && !count) {
01433 *element = -1;
01434 }
01435
01436 if (exp_desc->linear_type == Short_Typeless_Const &&
01437 check_type_conversion) {
01438
01439 cn_idx = cast_typeless_constant(cn_idx,
01440 target_type_idx,
01441 line,
01442 col);
01443
01444 type_idx = target_type_idx;
01445 exp_desc->type_idx = type_idx;
01446 exp_desc->type = TYP_TYPE(type_idx);
01447 exp_desc->linear_type = TYP_LINEAR(type_idx);
01448 OPND_IDX((*top_opnd)) = cn_idx;
01449 }
01450
01451 switch (TYP_TYPE(type_idx)) {
01452 case Typeless :
01453 for (i = 0;
01454 i < (TYP_BIT_LEN(type_idx)/TARGET_BITS_PER_WORD);
01455 i++) {
01456
01457 result_value[i] = CP_CONSTANT(CN_POOL_IDX(cn_idx) + i);
01458 }
01459 break;
01460
01461 case Integer :
01462 case Logical :
01463 case Real :
01464 case Complex :
01465 for (i = 0; i < num_host_wds[TYP_LINEAR(type_idx)]; i++) {
01466 result_value[i] = CP_CONSTANT(CN_POOL_IDX(cn_idx) + i);
01467 }
01468 break;
01469
01470 case Character :
01471
01472 if (count) {
01473 char_result_len = CN_INT_TO_C(TYP_IDX(exp_desc->type_idx));
01474
01475 if (char_result_len < 0) {
01476 char_result_len = 0;
01477 }
01478 }
01479 else {
01480 result_value[0] = CN_CONST(cn_idx);
01481 char_result_len = CN_INT_TO_C(TYP_IDX(exp_desc->type_idx));
01482
01483 if (char_result_len < 0) {
01484 char_result_len = 0;
01485 }
01486
01487 if (char_result_offset +
01488 CN_INT_TO_C(TYP_IDX(exp_desc->type_idx)) >=
01489 char_result_buffer_len) {
01490
01491 enlarge_char_result_buffer();
01492 }
01493
01494 char_ptr = (char *)&(CN_CONST(cn_idx));
01495
01496 for (i = 0; i < CN_INT_TO_C(TYP_IDX(exp_desc->type_idx));
01497 i++) {
01498
01499 char_result_buffer[char_result_offset] = char_ptr[i];
01500 char_result_offset++;
01501
01502 }
01503 }
01504 break;
01505
01506 }
01507 break;
01508
01509 case AT_Tbl_Idx :
01510
01511 attr_idx = OPND_IDX((*top_opnd));
01512 type_idx = ATD_TYPE_IDX(attr_idx);
01513
01514 if (*element > 0 && !count) {
01515 *element = -1;
01516 }
01517
01518 exp_desc->type_idx = ATD_TYPE_IDX(attr_idx);
01519 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
01520
01521 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
01522
01523 if (exp_desc->type == Character &&
01524 compare_cn_and_value(TYP_IDX(exp_desc->type_idx),
01525 MAX_CHARS_IN_TYPELESS,
01526 Le_Opr)) {
01527 exp_desc->linear_type = Short_Char_Const;
01528 }
01529
01530 if (ATD_LCV_IS_CONST(attr_idx)) {
01531
01532 exp_desc->constant = TRUE;
01533
01534 switch (TYP_TYPE(type_idx)) {
01535 case Integer :
01536 case Typeless :
01537 case Real :
01538 GET_LCV_CONST(attr_idx, result_value[0],
01539 num_host_wds[TYP_LINEAR(type_idx)]);
01540 break;
01541
01542 default :
01543 PRINTMSG(line, 980, Internal, col);
01544 break;
01545
01546 }
01547 }
01548 else if (TYP_TYPE(type_idx) == Structure) {
01549
01550
01551 if (! count) {
01552
01553 if (ATD_FLD(attr_idx) != CN_Tbl_Idx) {
01554 PRINTMSG(line, 981, Internal, col);
01555 break;
01556 }
01557 param_cn_idx = ATD_TMP_IDX(attr_idx);
01558
01559 if (ATT_CHAR_SEQ(TYP_IDX(exp_desc->type_idx))) {
01560
01561
01562
01563 char_strct_len = CN_INT_TO_C(ATT_STRUCT_BIT_LEN_IDX(
01564 TYP_IDX(exp_desc->type_idx))) >> 3;
01565
01566 char_ptr = (char *) &(CN_CONST(the_cn_idx)) +
01567 (the_cn_bit_offset/CHAR_BIT);
01568
01569 char_ptr2 = (char *)&(CN_CONST(param_cn_idx));
01570
01571 the_cn_bit_offset += char_strct_len * CHAR_BIT;
01572
01573 for (i = 0; i < char_strct_len; i++) {
01574 char_ptr[i] = char_ptr2[i];
01575 }
01576
01577 }
01578 #ifdef KEY
01579
01580 else if (ATD_POINTER(attr_idx) &&
01581 ATD_CLASS(attr_idx) == Compiler_Tmp &&
01582 ATD_TMP_INIT_NOT_DONE(attr_idx) &&
01583 ATD_FLD(attr_idx) == CN_Tbl_Idx) {
01584 k = TARGET_BITS_TO_WORDS(the_cn_bit_offset);
01585 for (i = 0;
01586 i < STORAGE_WORD_SIZE(TYP_BIT_LEN(CN_TYPE_IDX(ATD_TMP_IDX(attr_idx))));
01587 i += 1, k += 1) {
01588 CP_CONSTANT(CN_POOL_IDX(the_cn_idx) + k) =
01589 CP_CONSTANT(CN_POOL_IDX(param_cn_idx) + i);
01590 }
01591 the_cn_bit_offset += i * TARGET_BITS_PER_WORD;
01592 }
01593 #endif
01594 else {
01595
01596 k = TARGET_BITS_TO_WORDS(the_cn_bit_offset);
01597
01598 for (i = 0;
01599 i < STORAGE_WORD_SIZE(CN_INT_TO_C(ATT_STRUCT_BIT_LEN_IDX(
01600 TYP_IDX(exp_desc->type_idx))));
01601 i++) {
01602 CP_CONSTANT(CN_POOL_IDX(the_cn_idx) + k) =
01603 CP_CONSTANT(CN_POOL_IDX(param_cn_idx) + i);
01604
01605 k++;
01606 }
01607
01608 the_cn_bit_offset += i * TARGET_BITS_PER_WORD;
01609 }
01610 }
01611 else {
01612
01613 exp_desc->constant = TRUE;
01614 }
01615 }
01616 else if (ATD_IM_A_DOPE(attr_idx)) {
01617
01618 if (! count) {
01619
01620 if (ATD_FLD(attr_idx) != CN_Tbl_Idx) {
01621 PRINTMSG(line, 981, Internal, col);
01622 break;
01623 }
01624 param_cn_idx = ATD_TMP_IDX(attr_idx);
01625
01626 k = TARGET_BITS_TO_WORDS(the_cn_bit_offset);
01627
01628 for (i = 0;
01629 i < STORAGE_WORD_SIZE(
01630 TYP_BIT_LEN(CN_TYPE_IDX(param_cn_idx)));
01631 i++) {
01632
01633
01634 CP_CONSTANT(CN_POOL_IDX(the_cn_idx) + k) =
01635 CP_CONSTANT(CN_POOL_IDX(param_cn_idx) + i);
01636
01637 k++;
01638 }
01639
01640 the_cn_bit_offset += i * TARGET_BITS_PER_WORD;
01641 }
01642 else {
01643
01644 exp_desc->constant = TRUE;
01645 }
01646
01647 }
01648 else {
01649 PRINTMSG(line, 982, Internal, col);
01650 }
01651
01652 break;
01653
01654 case IR_Tbl_Idx :
01655
01656 ir_idx = OPND_IDX((*top_opnd));
01657
01658 switch (IR_OPR(ir_idx)) {
01659 case Null_Opr :
01660 break;
01661
01662 case Dv_Deref_Opr :
01663 COPY_OPND(opnd, IR_OPND_L(ir_idx));
01664 ok = interpret_constructor(&opnd, exp_desc, count, element);
01665 break;
01666
01667 case Struct_Construct_Opr :
01668 case Constant_Struct_Construct_Opr :
01669
01670 ok = interpret_struct_construct_opr(ir_idx, exp_desc,
01671 count, element);
01672 break;
01673
01674 case Array_Construct_Opr :
01675 case Constant_Array_Construct_Opr :
01676
01677 ok = interpret_array_construct_opr(ir_idx, exp_desc,
01678 count, element);
01679 break;
01680
01681 case Implied_Do_Opr :
01682
01683 ok = interpret_implied_do(ir_idx, exp_desc, count, element);
01684
01685 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
01686 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
01687 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
01688 break;
01689
01690 case Uplus_Opr :
01691 case Uminus_Opr :
01692 case Cvrt_Opr :
01693 case Cvrt_Unsigned_Opr :
01694 case Not_Opr :
01695 case Bnot_Opr :
01696
01697 ok = interpret_unary_opr(ir_idx, exp_desc, count, element);
01698 break;
01699
01700
01701 case Power_Opr :
01702 case Mult_Opr :
01703 case Div_Opr :
01704 case Minus_Opr :
01705 case Plus_Opr :
01706 case Eq_Opr :
01707 case Ne_Opr :
01708 case Lg_Opr :
01709 case Lt_Opr :
01710 case Le_Opr :
01711 case Gt_Opr :
01712 case Ge_Opr :
01713 case And_Opr :
01714 case Or_Opr :
01715 case Eqv_Opr :
01716 case Neqv_Opr :
01717 case Band_Opr :
01718 case Bor_Opr :
01719 case Beqv_Opr :
01720 case Bneqv_Opr :
01721
01722 ok = interpret_binary_opr(ir_idx, exp_desc, count, element);
01723 break;
01724
01725
01726 case Concat_Opr :
01727
01728 ok = interpret_concat_opr(ir_idx, exp_desc, count, element);
01729 break;
01730
01731
01732 case Struct_Opr :
01733 case Whole_Subscript_Opr :
01734 case Section_Subscript_Opr :
01735 case Subscript_Opr :
01736 case Whole_Substring_Opr :
01737 case Substring_Opr :
01738
01739 if (IR_FLD_L(ir_idx) == IR_Tbl_Idx &&
01740 IR_OPR(IR_IDX_L(ir_idx)) == Dv_Deref_Opr) {
01741 COPY_OPND(opnd, IR_OPND_L(IR_IDX_L(ir_idx)));
01742 ok = interpret_constructor(&opnd, exp_desc, count, element);
01743 }
01744 else if (IR_FLD_L(ir_idx) == IR_Tbl_Idx &&
01745 IR_FLD_L(IR_IDX_L(ir_idx)) == IR_Tbl_Idx &&
01746 IR_OPR(IR_IDX_L(IR_IDX_L(ir_idx))) == Dv_Deref_Opr) {
01747 COPY_OPND(opnd, IR_OPND_L(IR_IDX_L(IR_IDX_L(ir_idx))));
01748 ok = interpret_constructor(&opnd, exp_desc, count, element);
01749 }
01750 else {
01751 ok = interpret_ref(top_opnd, exp_desc, count, element);
01752 }
01753 break;
01754
01755 case Stmt_Expansion_Opr :
01756
01757 if (IR_LIST_CNT_R(ir_idx) == 5) {
01758
01759 COPY_OPND(IR_OPND_L(ir_idx),
01760 IL_OPND(IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(
01761 IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(
01762 IR_IDX_R(ir_idx)))))));
01763
01764 IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(
01765 IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(
01766 IR_IDX_R(ir_idx))))) = NULL_IDX;
01767 IR_LIST_CNT_R(ir_idx) = 4;
01768 }
01769
01770 COPY_OPND(opnd, IR_OPND_L(ir_idx));
01771 ok = interpret_constructor(&opnd, exp_desc, count, element);
01772 break;
01773
01774 case Paren_Opr :
01775
01776 COPY_OPND(opnd, IR_OPND_L(ir_idx));
01777 ok = interpret_constructor(&opnd, exp_desc, count, element);
01778
01779 break;
01780
01781 case Stmt_Func_Call_Opr :
01782
01783 process_deferred_functions(top_opnd);
01784
01785 ok = interpret_constructor(top_opnd, exp_desc, count, element);
01786 break;
01787
01788
01789
01790
01791
01792 case Call_Opr :
01793 # ifdef _DEBUG
01794 if (! AT_IS_INTRIN(IR_IDX_L(ir_idx))) {
01795 PRINTMSG(IR_LINE_NUM_L(ir_idx), 904, Internal,
01796 IR_COL_NUM_L(ir_idx));
01797 }
01798 # endif
01799
01800
01801 switch (ATP_INTRIN_ENUM(IR_IDX_L(ir_idx))) {
01802 case Trim_Intrinsic:
01803
01804 ok = interpret_trim_intrinsic(ir_idx, exp_desc, count,
01805 element);
01806 break;
01807
01808 case Adjustl_Intrinsic:
01809 case Adjustr_Intrinsic:
01810
01811 ok = interpret_adjustl_intrinsic(ir_idx, exp_desc, count,
01812 element);
01813 break;
01814
01815 case Repeat_Intrinsic:
01816
01817 ok = interpret_repeat_intrinsic(ir_idx, exp_desc, count,
01818 element);
01819 break;
01820
01821 case Transfer_Intrinsic:
01822
01823 ok = interpret_transfer_intrinsic(ir_idx, exp_desc, count,
01824 element);
01825 break;
01826
01827 case Reshape_Intrinsic:
01828
01829 ok = interpret_reshape_intrinsic(ir_idx, exp_desc, count,
01830 element);
01831 break;
01832
01833 case Size_Intrinsic:
01834
01835 ok = interpret_size_intrinsic(ir_idx, exp_desc, count,
01836 element);
01837 break;
01838
01839 case Ubound_Intrinsic:
01840
01841 ok = interpret_ubound_intrinsic(ir_idx, exp_desc, count,
01842 element);
01843 break;
01844
01845 case Shape_Intrinsic:
01846
01847 ok = interpret_shape_intrinsic(ir_idx, exp_desc, count,
01848 element);
01849 break;
01850
01851 case SIK_Intrinsic:
01852
01853 ok = interpret_sik_intrinsic(ir_idx, exp_desc, count,
01854 element);
01855 break;
01856
01857 case SRK_Intrinsic:
01858
01859 ok = interpret_srk_intrinsic(ir_idx, exp_desc, count,
01860 element);
01861 break;
01862
01863 default :
01864
01865 loc_exp_desc = init_exp_desc;
01866
01867 SAVE_ENV;
01868 check_type_conversion = FALSE;
01869
01870 (*(void (*)())intrinsic_semantics[
01871 ATP_INTRIN_ENUM(IR_IDX_L(ir_idx))] )
01872 (top_opnd,
01873 &loc_exp_desc,
01874 IR_IDX_L(ir_idx),
01875 &new_spec_idx);
01876
01877 RESTORE_ENV;
01878
01879 ok = interpret_constructor(top_opnd,exp_desc,count,element);
01880 break;
01881
01882 }
01883 break;
01884
01885
01886
01887
01888
01889 case Abs_Opr :
01890 case Sin_Opr :
01891 case Cos_Opr :
01892 case Log_E_Opr :
01893 case Log_10_Opr :
01894 case Tan_Opr :
01895 case Tanh_Opr :
01896 case Sinh_Opr :
01897 case Atan_Opr :
01898 case Cosh_Opr :
01899 case Aimag_Opr :
01900 case Sqrt_Opr :
01901 case Cot_Opr :
01902 case Exp_Opr :
01903 case Int_Opr :
01904 case Anint_Opr :
01905 case Nint_Opr :
01906 case Aint_Opr :
01907 case Exponent_Opr :
01908 case Fraction_Opr :
01909 case Spacing_Opr :
01910 case Len_Trim_Opr :
01911 case Rrspacing_Opr :
01912 case Ichar_Opr :
01913 case Char_Opr :
01914 case Adjustl_Opr :
01915 case Adjustr_Opr :
01916 case Mask_Opr :
01917
01918
01919 ok = interpret_unary_intrinsic_opr(ir_idx, exp_desc, count,
01920 element);
01921 break;
01922
01923
01924
01925
01926
01927
01928 case Mod_Opr :
01929 case Modulo_Opr :
01930 case Shift_Opr :
01931 case Shiftl_Opr :
01932 case Shiftr_Opr :
01933 case Shifta_Opr :
01934 case Dim_Opr :
01935 case Sign_Opr :
01936 case Lge_Opr :
01937 case Lgt_Opr :
01938 case Lle_Opr :
01939 case Llt_Opr :
01940 case Nearest_Opr :
01941 case Scale_Opr :
01942 case Set_Exponent_Opr :
01943
01944 ok = interpret_binary_intrinsic_opr(ir_idx, exp_desc, count,
01945 element);
01946 break;
01947
01948
01949
01950 case Max_Opr :
01951 case Min_Opr :
01952
01953 ok = interpret_max_min_opr(ir_idx, exp_desc, count,
01954 element);
01955 break;
01956
01957 case Csmg_Opr :
01958 case Ishftc_Opr :
01959 case Ibits_Opr :
01960 ok = interpret_csmg_opr(ir_idx, exp_desc, count, element);
01961 break;
01962
01963 #ifdef KEY
01964 case Cselect_Opr :
01965 #endif
01966 case Cvmgt_Opr :
01967 ok = interpret_cvmgt_opr(ir_idx, exp_desc, count, element);
01968 break;
01969
01970 case Index_Opr :
01971 case Verify_Opr :
01972 case Scan_Opr :
01973
01974 ok = interpret_index_opr(ir_idx, exp_desc, count,
01975 element);
01976 break;
01977
01978
01979
01980
01981
01982
01983
01984 # ifdef _TARGET_OS_MAX
01985 case My_Pe_Opr :
01986 # ifdef _F_MINUS_MINUS
01987 if (cmd_line_flags.co_array_fortran) {
01988
01989 OPND_FLD((*top_opnd)) = CN_Tbl_Idx;
01990 OPND_IDX((*top_opnd)) = CN_INTEGER_ONE_IDX;
01991 OPND_LINE_NUM((*top_opnd)) = IR_LINE_NUM(ir_idx);
01992 OPND_COL_NUM((*top_opnd)) = IR_COL_NUM(ir_idx);
01993 ok = interpret_constructor(top_opnd,exp_desc,count,element);
01994 }
01995 else {
01996 PRINTMSG(IR_LINE_NUM(ir_idx), 895, Internal,
01997 IR_COL_NUM(ir_idx));
01998 }
01999 break;
02000 # endif
02001
02002 # endif
02003
02004 default:
02005 PRINTMSG(IR_LINE_NUM(ir_idx), 895, Internal,
02006 IR_COL_NUM(ir_idx));
02007 break;
02008 }
02009
02010 break;
02011
02012 case IL_Tbl_Idx :
02013 break;
02014
02015 }
02016
02017 TRACE (Func_Exit, "interpret_constructor", NULL);
02018
02019 return(ok);
02020
02021 }
02022
02023
02024
02025
02026
02027
02028
02029
02030
02031
02032
02033
02034
02035
02036
02037
02038
02039
02040 static void increment_count(expr_arg_type *exp_desc)
02041
02042 {
02043
02044 int i;
02045 long64 num_elements = 1;
02046
02047
02048 TRACE (Func_Entry, "increment_count", NULL);
02049
02050 if (exp_desc->rank > 0) {
02051 for (i = 0; i < exp_desc->rank; i++) {
02052 num_elements *= CN_INT_TO_C(exp_desc->shape[i].idx);
02053 }
02054 }
02055
02056 if (check_type_conversion) {
02057
02058 if (TYP_LINEAR(target_type_idx) == Character_1) {
02059
02060
02061
02062 bits_in_constructor += CN_INT_TO_C(target_char_len_idx) *
02063 num_elements * 8;
02064 }
02065 else {
02066 bits_in_constructor += storage_bit_size_tbl[
02067 TYP_LINEAR(target_type_idx)] * num_elements;
02068 }
02069 }
02070 else {
02071 switch (exp_desc->type) {
02072 case Typeless :
02073 bits_in_constructor += TYP_BIT_LEN(exp_desc->type_idx)
02074 * num_elements;
02075 break;
02076
02077 case Integer :
02078 case Logical :
02079 case Real :
02080 case Complex :
02081 bits_in_constructor += storage_bit_size_tbl[
02082 exp_desc->linear_type] * num_elements;
02083 break;
02084
02085 case Character:
02086 bits_in_constructor += char_result_len * num_elements * 8;
02087 break;
02088
02089 case Structure :
02090 bits_in_constructor += CN_INT_TO_C(ATT_STRUCT_BIT_LEN_IDX(TYP_IDX(
02091 exp_desc->type_idx))) * num_elements;
02092 break;
02093 }
02094 }
02095
02096 TRACE (Func_Exit, "increment_count", NULL);
02097
02098 return;
02099
02100 }
02101
02102
02103
02104
02105
02106
02107
02108
02109
02110
02111
02112
02113
02114
02115
02116
02117
02118 static void write_constant(int type_idx)
02119
02120 {
02121 #ifdef KEY
02122 long64 bits = 0;
02123 #else
02124 long64 bits;
02125 #endif
02126 char *char_ptr;
02127 long64 cn_word_offset;
02128 long64 i;
02129 int j;
02130 long_type loc_value[MAX_WORDS_FOR_NUMERIC];
02131 int loc_type_idx;
02132 long64 target_char_len;
02133 basic_type_type type;
02134 long64 words;
02135
02136
02137 TRACE (Func_Entry, "write_constant", NULL);
02138
02139 if (no_result_value) {
02140 goto DONE;
02141 }
02142
02143 type = TYP_TYPE(type_idx);
02144
02145 if (check_type_conversion) {
02146
02147 if (TYP_LINEAR(target_type_idx) == Character_1) {
02148
02149 char_ptr = (char *) &(CN_CONST(the_cn_idx)) +
02150 (the_cn_bit_offset/CHAR_BIT);
02151
02152 target_char_len = CN_INT_TO_C(target_char_len_idx);
02153 the_cn_bit_offset += target_char_len * CHAR_BIT;
02154
02155 if (char_result_len < target_char_len) {
02156
02157 for (i = 0; i < char_result_len; i++) {
02158 char_ptr[i] = char_result_buffer[char_result_offset + i];
02159 }
02160
02161 for (i = char_result_len; i < target_char_len; i++) {
02162 char_ptr[i] = ' ';
02163 }
02164 }
02165 else {
02166
02167 for (i = 0; i < target_char_len; i++) {
02168 char_ptr[i] = char_result_buffer[char_result_offset + i];
02169 }
02170 }
02171
02172 goto DONE;
02173 }
02174 else {
02175 bits = storage_bit_size_tbl[TYP_LINEAR(target_type_idx)];
02176
02177 for (j = 0; j < MAX_WORDS_FOR_NUMERIC; j++) {
02178 loc_value[j] = result_value[j];
02179 }
02180
02181 loc_type_idx = target_type_idx;
02182
02183 if (folder_driver((char *)loc_value,
02184 type_idx,
02185 NULL,
02186 NULL_IDX,
02187 result_value,
02188 &loc_type_idx,
02189 stmt_start_line,
02190 stmt_start_col,
02191 1,
02192 Cvrt_Opr)) {
02193
02194 }
02195
02196 type_idx = loc_type_idx;
02197 }
02198 }
02199 else {
02200 switch (type) {
02201 case Typeless :
02202 bits = TYP_BIT_LEN(type_idx);
02203 break;
02204
02205 case Integer :
02206 case Logical :
02207 case Real :
02208 case Complex :
02209 bits = storage_bit_size_tbl[TYP_LINEAR(type_idx)];
02210 break;
02211
02212 case Character:
02213 char_ptr = (char *) &(CN_CONST(the_cn_idx))
02214 + (the_cn_bit_offset/CHAR_BIT);
02215
02216 the_cn_bit_offset += char_result_len * CHAR_BIT;
02217
02218 for (i = 0; i < char_result_len; i++) {
02219 char_ptr[i] = char_result_buffer[char_result_offset + i];
02220 }
02221 goto DONE;
02222
02223 case Structure :
02224 printf("invalid type in write_constant\n");
02225 goto DONE;
02226 }
02227 }
02228
02229 # if 0
02230
02231 # if defined(_TARGET64)
02232 if (TYP_LINEAR(type_idx) == Complex_4 &&
02233 bits == TARGET_BITS_PER_WORD) {
02234
02235
02236
02237
02238
02239 cn_word_offset = the_cn_bit_offset/TARGET_BITS_PER_WORD;
02240
02241 CP_CONSTANT(CN_POOL_IDX(the_cn_idx)+cn_word_offset) =
02242 pack_int32_to_int64(result_value);
02243 }
02244 else
02245 # endif
02246 # endif
02247
02248 if (bits % TARGET_BITS_PER_WORD != 0) {
02249 if (bits < TARGET_BITS_PER_WORD) {
02250
02251 cn_word_offset = the_cn_bit_offset/TARGET_BITS_PER_WORD;
02252
02253 if (bits == 8) {
02254 result_value[0] = result_value[0] & 0XFF;
02255 }
02256 else if (bits == 16) {
02257 result_value[0] = result_value[0] & 0XFFFF;
02258 }
02259 else if (bits == 32) {
02260 result_value[0] = result_value[0] & 0XFFFFFFFF;
02261 }
02262
02263 # if defined(_HOST_LITTLE_ENDIAN) && defined(_TARGET_LITTLE_ENDIAN)
02264 CP_CONSTANT(CN_POOL_IDX(the_cn_idx)+cn_word_offset) |=
02265 result_value[0] << (the_cn_bit_offset % TARGET_BITS_PER_WORD);
02266 # else
02267 CP_CONSTANT(CN_POOL_IDX(the_cn_idx)+cn_word_offset) |=
02268 result_value[0] << ((TARGET_BITS_PER_WORD -
02269 the_cn_bit_offset % TARGET_BITS_PER_WORD) - bits);
02270 # endif
02271 # ifdef _DEBUG
02272 if (dump_flags.constant_bits) {
02273 long neg_one = -2;
02274 long_type _constant;
02275 _constant = CP_CONSTANT(CN_POOL_IDX(the_cn_idx)+cn_word_offset);
02276 write(1,&_constant,
02277 sizeof(long_type));
02278 write(1,&neg_one, 4);
02279 }
02280 # endif
02281
02282 }
02283 else {
02284 printf("problem in write_constant\n");
02285 }
02286 }
02287 else {
02288 words = TARGET_BITS_TO_WORDS(bits);
02289
02290 cn_word_offset = TARGET_BITS_TO_WORDS(the_cn_bit_offset);
02291
02292 for (i = 0; i < words; i++) {
02293 CP_CONSTANT(CN_POOL_IDX(the_cn_idx)+cn_word_offset) = result_value[i];
02294 cn_word_offset++;
02295 }
02296 }
02297
02298 the_cn_bit_offset += bits;
02299
02300 DONE:
02301
02302 TRACE (Func_Exit, "write_constant", NULL);
02303
02304 return;
02305
02306 }
02307
02308
02309
02310
02311
02312
02313
02314
02315
02316
02317
02318
02319
02320
02321
02322
02323
02324
02325
02326
02327
02328
02329
02330
02331 static boolean interpret_implied_do(int ir_idx,
02332 expr_arg_type *exp_desc,
02333 boolean count,
02334 long64 *element)
02335
02336 {
02337 int col;
02338 operator_type compare_opr = Le_Opr;
02339 long_type end_value[MAX_WORDS_FOR_NUMERIC];
02340 expr_arg_type exp_desc_l;
02341 long64 extent;
02342 int i;
02343 int lcv_idx;
02344 long_type lcv_value[MAX_WORDS_FOR_NUMERIC];
02345 linear_type_type lin_type;
02346 int line;
02347 int list_idx;
02348 int list2_idx;
02349 int list3_idx;
02350 long64 loc_char_result_offset;
02351 long64 loc_element = 0;
02352 long_type loc_value[MAX_WORDS_FOR_NUMERIC];
02353 long64 longest_char_len = 0;
02354 boolean ok = TRUE;
02355 opnd_type opnd;
02356 int position_idx;
02357 #ifdef KEY
02358 opnd_type save_atd_tmp_opnd = INIT_OPND_TYPE;
02359 #else
02360 opnd_type save_atd_tmp_opnd;
02361 #endif
02362 long_type start_value[MAX_WORDS_FOR_NUMERIC];
02363 long_type stride_value[MAX_WORDS_FOR_NUMERIC];
02364 long64 sub_elements;
02365 int type_idx;
02366 int unused;
02367
02368
02369 TRACE (Func_Entry, "interpret_implied_do", NULL);
02370
02371 list_idx = IR_IDX_R(ir_idx);
02372 lcv_idx = IL_IDX(list_idx);
02373
02374 line = IR_LINE_NUM(ir_idx);
02375 col = IR_COL_NUM(ir_idx);
02376
02377 extent = 0L;
02378
02379 if (*element == 0) {
02380
02381
02382
02383 if (! count) {
02384
02385
02386
02387 AT_REFERENCED(lcv_idx) = Not_Referenced;
02388 }
02389 else {
02390 OPND_FLD(save_atd_tmp_opnd) = (fld_type) ATD_FLD(lcv_idx);
02391 OPND_IDX(save_atd_tmp_opnd) = ATD_TMP_IDX(lcv_idx);
02392 }
02393
02394
02395
02396
02397
02398 GET_LCV_CONST(lcv_idx, loc_value[0],
02399 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
02400
02401 ATD_FLD(lcv_idx) = CN_Tbl_Idx;
02402 ATD_TMP_IDX(lcv_idx) = ntr_const_tbl(ATD_TYPE_IDX(lcv_idx),
02403 FALSE,
02404 loc_value);
02405
02406
02407 list_idx = IL_NEXT_LIST_IDX(list_idx);
02408 COPY_OPND(opnd, IL_OPND(list_idx));
02409 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
02410 &loc_element);
02411
02412 type_idx = ATD_TYPE_IDX(lcv_idx);
02413
02414 if (TYP_LINEAR(type_idx) != exp_desc_l.linear_type) {
02415
02416 if (folder_driver((char *)result_value,
02417 exp_desc_l.linear_type,
02418 NULL,
02419 NULL_IDX,
02420 start_value,
02421 &type_idx,
02422 line,
02423 col,
02424 1,
02425 Cvrt_Opr)) {
02426
02427 }
02428 }
02429 else {
02430 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i ++) {
02431 start_value[i] = result_value[i];
02432 }
02433 }
02434
02435 list_idx = IL_NEXT_LIST_IDX(list_idx);
02436 COPY_OPND(opnd, IL_OPND(list_idx));
02437 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
02438 &loc_element) && ok;
02439
02440 type_idx = ATD_TYPE_IDX(lcv_idx);
02441
02442 if (TYP_LINEAR(type_idx) != exp_desc_l.linear_type) {
02443
02444 if (folder_driver((char *)result_value,
02445 exp_desc_l.linear_type,
02446 NULL,
02447 NULL_IDX,
02448 end_value,
02449 &type_idx,
02450 line,
02451 col,
02452 1,
02453 Cvrt_Opr)) {
02454
02455 }
02456 }
02457 else {
02458 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i ++) {
02459 end_value[i] = result_value[i];
02460 }
02461 }
02462
02463 list_idx = IL_NEXT_LIST_IDX(list_idx);
02464 COPY_OPND(opnd, IL_OPND(list_idx));
02465 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
02466 &loc_element) && ok;
02467
02468 type_idx = ATD_TYPE_IDX(lcv_idx);
02469
02470 if (TYP_LINEAR(type_idx) != exp_desc_l.linear_type) {
02471
02472 if (folder_driver((char *)result_value,
02473 exp_desc_l.linear_type,
02474 NULL,
02475 NULL_IDX,
02476 stride_value,
02477 &type_idx,
02478 line,
02479 col,
02480 1,
02481 Cvrt_Opr)) {
02482
02483 }
02484 }
02485 else {
02486 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i ++) {
02487 stride_value[i] = result_value[i];
02488 }
02489 }
02490
02491 type_idx = CG_LOGICAL_DEFAULT_TYPE;
02492
02493 if (folder_driver((char *)stride_value,
02494 ATD_TYPE_IDX(lcv_idx),
02495 (char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
02496 CG_INTEGER_DEFAULT_TYPE,
02497 loc_value,
02498 &type_idx,
02499 line,
02500 col,
02501 2,
02502 Eq_Opr)) {
02503
02504 if (THIS_IS_TRUE(loc_value, type_idx)) {
02505 find_opnd_line_and_column(&opnd, &line, &col);
02506 PRINTMSG(line, 1084, Error, col);
02507 ok = FALSE;
02508 goto DONE;
02509 }
02510 }
02511
02512 type_idx = CG_LOGICAL_DEFAULT_TYPE;
02513
02514 if (folder_driver((char *)stride_value,
02515 ATD_TYPE_IDX(lcv_idx),
02516 (char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
02517 CG_INTEGER_DEFAULT_TYPE,
02518 loc_value,
02519 &type_idx,
02520 line,
02521 col,
02522 2,
02523 Lt_Opr)) {
02524
02525 if (THIS_IS_TRUE(loc_value, type_idx)) {
02526 compare_opr = Ge_Opr;
02527 }
02528 }
02529
02530 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i ++) {
02531 lcv_value[i] = start_value[i];
02532 }
02533
02534 while (TRUE) {
02535
02536 type_idx = CG_LOGICAL_DEFAULT_TYPE;
02537
02538 if (folder_driver((char *)lcv_value,
02539 ATD_TYPE_IDX(lcv_idx),
02540 (char *)end_value,
02541 ATD_TYPE_IDX(lcv_idx),
02542 loc_value,
02543 &type_idx,
02544 line,
02545 col,
02546 2,
02547 compare_opr)) {
02548
02549 if ( ! THIS_IS_TRUE(loc_value, type_idx)) {
02550 break;
02551 }
02552 }
02553 else {
02554 break;
02555 }
02556 # ifdef KEY
02557 SET_LCV_CONST(lcv_idx, lcv_value[0],
02558 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))], num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
02559 # else
02560 SET_LCV_CONST(lcv_idx, lcv_value[0],
02561 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
02562 # endif
02563
02564 list_idx = IR_IDX_L(ir_idx);
02565
02566 while (list_idx) {
02567
02568 COPY_OPND(opnd, IL_OPND(list_idx));
02569
02570 if (IL_FLD(list_idx) == IR_Tbl_Idx &&
02571 IR_ARRAY_SYNTAX(IL_IDX(list_idx))) {
02572
02573
02574
02575 loc_element = 1;
02576
02577 if (count) {
02578
02579 ok = interpret_constructor(&opnd, &exp_desc_l, count,
02580 &loc_element) && ok;
02581
02582 sub_elements = 1;
02583
02584 if (exp_desc_l.rank == 0) {
02585 extent++;
02586 }
02587 else {
02588
02589 for (i = 0; i < exp_desc_l.rank; i++) {
02590 if (exp_desc_l.shape[i].fld == CN_Tbl_Idx) {
02591 sub_elements *= CN_INT_TO_C(exp_desc_l.shape[i].idx);
02592 }
02593 else {
02594 break;
02595 }
02596 }
02597 extent += sub_elements;
02598 }
02599
02600 if (exp_desc_l.type == Character) {
02601 if (char_result_len > longest_char_len) {
02602
02603 if (longest_char_len != 0) {
02604 unequal_char_lens = TRUE;
02605 }
02606 longest_char_len = char_result_len;
02607 }
02608 }
02609 else if (exp_desc_l.constant) {
02610 increment_count(&exp_desc_l);
02611 }
02612 }
02613 else {
02614
02615
02616
02617 loc_element = 1;
02618 while (loc_element >= 0) {
02619 loc_char_result_offset = char_result_offset;
02620 ok = interpret_constructor(&opnd, &exp_desc_l,
02621 count, &loc_element) && ok;
02622 char_result_offset = loc_char_result_offset;
02623
02624 if (exp_desc_l.constant) {
02625 write_constant(exp_desc_l.type_idx);
02626 }
02627 }
02628 }
02629 }
02630 else {
02631
02632
02633
02634 loc_element = 0;
02635
02636 loc_char_result_offset = char_result_offset;
02637 COPY_OPND(opnd, IL_OPND(list_idx));
02638 ok = interpret_constructor(&opnd, &exp_desc_l, count,
02639 &loc_element) && ok;
02640 char_result_offset = loc_char_result_offset;
02641
02642 if (count) {
02643 sub_elements = 1;
02644
02645 if (exp_desc_l.rank == 0) {
02646 extent++;
02647 }
02648 else {
02649
02650 for (i = 0; i < exp_desc_l.rank; i++) {
02651 if (exp_desc_l.shape[i].fld == CN_Tbl_Idx) {
02652 sub_elements *= CN_INT_TO_C(exp_desc_l.shape[i].idx);
02653 }
02654 else {
02655 break;
02656 }
02657 }
02658 extent += sub_elements;
02659 }
02660
02661 if (exp_desc_l.type == Character) {
02662 if (char_result_len > longest_char_len) {
02663
02664 if (longest_char_len != 0) {
02665 unequal_char_lens = TRUE;
02666 }
02667 longest_char_len = char_result_len;
02668 }
02669 }
02670 else if (exp_desc_l.constant) {
02671 increment_count(&exp_desc_l);
02672 }
02673
02674 }
02675 else {
02676 if (exp_desc_l.constant) {
02677 write_constant(exp_desc_l.type_idx);
02678 }
02679 }
02680 }
02681
02682 list_idx = IL_NEXT_LIST_IDX(list_idx);
02683 }
02684
02685 type_idx = ATD_TYPE_IDX(lcv_idx);
02686
02687 if (folder_driver((char *)lcv_value,
02688 ATD_TYPE_IDX(lcv_idx),
02689 (char *)stride_value,
02690 ATD_TYPE_IDX(lcv_idx),
02691 loc_value,
02692 &type_idx,
02693 line,
02694 col,
02695 2,
02696 Plus_Opr)) {
02697
02698 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
02699 lcv_value[i] = loc_value[i];
02700 }
02701 }
02702 else {
02703 break;
02704 }
02705 }
02706
02707
02708 # ifdef KEY
02709 SET_LCV_CONST(lcv_idx, CN_CONST(ATD_TMP_IDX(lcv_idx)),
02710 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))],
02711 num_host_wds[TYP_LINEAR(CN_TYPE_IDX(ATD_TMP_IDX(lcv_idx)))]);
02712 # else
02713 SET_LCV_CONST(lcv_idx, CN_CONST(ATD_TMP_IDX(lcv_idx)),
02714 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
02715 # endif
02716
02717
02718 if (count) {
02719 exp_desc->rank = 1;
02720 exp_desc->shape[0].fld = CN_Tbl_Idx;
02721 exp_desc->shape[0].idx = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE, extent);
02722 char_result_len = longest_char_len;
02723
02724 ATD_FLD(lcv_idx) = OPND_FLD(save_atd_tmp_opnd);
02725 ATD_TMP_IDX(lcv_idx) = OPND_IDX(save_atd_tmp_opnd);
02726 }
02727 }
02728 else {
02729
02730
02731 if (count) {
02732
02733 OPND_FLD(save_atd_tmp_opnd) = (fld_type) ATD_FLD(lcv_idx);
02734 OPND_IDX(save_atd_tmp_opnd) = ATD_TMP_IDX(lcv_idx);
02735
02736
02737
02738
02739
02740 GET_LCV_CONST(lcv_idx, loc_value[0],
02741 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
02742
02743 ATD_FLD(lcv_idx) = CN_Tbl_Idx;
02744 ATD_TMP_IDX(lcv_idx) = ntr_const_tbl(ATD_TYPE_IDX(lcv_idx),
02745 FALSE,
02746 loc_value);
02747
02748 list_idx = IL_NEXT_LIST_IDX(list_idx);
02749 COPY_OPND(opnd, IL_OPND(list_idx));
02750 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
02751 &loc_element);
02752
02753 type_idx = ATD_TYPE_IDX(lcv_idx);
02754
02755 if (TYP_LINEAR(type_idx) != exp_desc_l.linear_type) {
02756
02757 if (folder_driver((char *)result_value,
02758 exp_desc_l.linear_type,
02759 NULL,
02760 NULL_IDX,
02761 start_value,
02762 &type_idx,
02763 line,
02764 col,
02765 1,
02766 Cvrt_Opr)) {
02767
02768 }
02769 }
02770 else {
02771 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i ++) {
02772 start_value[i] = result_value[i];
02773 }
02774 }
02775
02776 list_idx = IL_NEXT_LIST_IDX(list_idx);
02777 COPY_OPND(opnd, IL_OPND(list_idx));
02778 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
02779 &loc_element) && ok;
02780
02781 type_idx = ATD_TYPE_IDX(lcv_idx);
02782
02783 if (TYP_LINEAR(type_idx) != exp_desc_l.linear_type) {
02784
02785 if (folder_driver((char *)result_value,
02786 exp_desc_l.linear_type,
02787 NULL,
02788 NULL_IDX,
02789 end_value,
02790 &type_idx,
02791 line,
02792 col,
02793 1,
02794 Cvrt_Opr)) {
02795
02796 }
02797 }
02798 else {
02799 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i ++) {
02800 end_value[i] = result_value[i];
02801 }
02802 }
02803
02804 list_idx = IL_NEXT_LIST_IDX(list_idx);
02805 COPY_OPND(opnd, IL_OPND(list_idx));
02806 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
02807 &loc_element) && ok;
02808
02809 type_idx = ATD_TYPE_IDX(lcv_idx);
02810
02811 if (TYP_LINEAR(type_idx) != exp_desc_l.linear_type) {
02812
02813 if (folder_driver((char *)result_value,
02814 exp_desc_l.linear_type,
02815 NULL,
02816 NULL_IDX,
02817 stride_value,
02818 &type_idx,
02819 line,
02820 col,
02821 1,
02822 Cvrt_Opr)) {
02823
02824 }
02825 }
02826 else {
02827 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i ++) {
02828 stride_value[i] = result_value[i];
02829 }
02830 }
02831
02832 type_idx = CG_LOGICAL_DEFAULT_TYPE;
02833
02834 if (folder_driver((char *)stride_value,
02835 ATD_TYPE_IDX(lcv_idx),
02836 (char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
02837 CG_INTEGER_DEFAULT_TYPE,
02838 loc_value,
02839 &type_idx,
02840 line,
02841 col,
02842 2,
02843 Eq_Opr)) {
02844
02845 if (THIS_IS_TRUE(loc_value, type_idx)) {
02846 find_opnd_line_and_column(&opnd, &line, &col);
02847 PRINTMSG(line, 1084, Error, col);
02848 ok = FALSE;
02849 goto DONE;
02850 }
02851 }
02852
02853 loc_element = 1;
02854
02855 type_idx = CG_LOGICAL_DEFAULT_TYPE;
02856
02857 if (folder_driver((char *)stride_value,
02858 ATD_TYPE_IDX(lcv_idx),
02859 (char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
02860 CG_INTEGER_DEFAULT_TYPE,
02861 loc_value,
02862 &type_idx,
02863 line,
02864 col,
02865 2,
02866 Lt_Opr)) {
02867
02868 if (THIS_IS_TRUE(loc_value, type_idx)) {
02869 compare_opr = Ge_Opr;
02870 }
02871 }
02872
02873 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i ++) {
02874 lcv_value[i] = start_value[i];
02875 }
02876
02877 while (TRUE) {
02878
02879 type_idx = CG_LOGICAL_DEFAULT_TYPE;
02880
02881 if (folder_driver((char *)lcv_value,
02882 ATD_TYPE_IDX(lcv_idx),
02883 (char *)end_value,
02884 ATD_TYPE_IDX(lcv_idx),
02885 loc_value,
02886 &type_idx,
02887 line,
02888 col,
02889 2,
02890 compare_opr)) {
02891
02892 if (! THIS_IS_TRUE(loc_value, type_idx)) {
02893 break;
02894 }
02895 }
02896 else {
02897 break;
02898 }
02899
02900 # ifdef KEY
02901 SET_LCV_CONST(lcv_idx, lcv_value[0],
02902 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))], num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
02903 # else
02904 SET_LCV_CONST(lcv_idx, lcv_value[0],
02905 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
02906 # endif
02907
02908 list_idx = IR_IDX_L(ir_idx);
02909
02910 while (list_idx) {
02911
02912 COPY_OPND(opnd, IL_OPND(list_idx));
02913
02914 ok = interpret_constructor(&opnd, &exp_desc_l, count,
02915 &loc_element) && ok;
02916
02917 sub_elements = 1;
02918
02919 if (exp_desc_l.rank == 0) {
02920 extent++;
02921 }
02922 else {
02923
02924 for (i = 0; i < exp_desc_l.rank; i++) {
02925 if (exp_desc_l.shape[i].fld == CN_Tbl_Idx) {
02926 sub_elements *= CN_INT_TO_C(exp_desc_l.shape[i].idx);
02927 }
02928 else {
02929 break;
02930 }
02931 }
02932 extent += sub_elements;
02933 }
02934
02935 if (exp_desc_l.type == Character) {
02936 if (char_result_len > longest_char_len) {
02937
02938 if (longest_char_len != 0) {
02939 unequal_char_lens = TRUE;
02940 }
02941 longest_char_len = char_result_len;
02942 }
02943 }
02944
02945 *element += sub_elements;
02946 list_idx = IL_NEXT_LIST_IDX(list_idx);
02947 }
02948
02949 type_idx = ATD_TYPE_IDX(lcv_idx);
02950
02951 if (folder_driver((char *)lcv_value,
02952 ATD_TYPE_IDX(lcv_idx),
02953 (char *)stride_value,
02954 ATD_TYPE_IDX(lcv_idx),
02955 loc_value,
02956 &type_idx,
02957 line,
02958 col,
02959 2,
02960 Plus_Opr)) {
02961
02962 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
02963 lcv_value[i] = loc_value[i];
02964 }
02965 }
02966 else {
02967 break;
02968 }
02969 }
02970
02971 exp_desc->rank = 1;
02972 exp_desc->shape[0].fld = CN_Tbl_Idx;
02973 exp_desc->shape[0].idx = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE, extent);
02974 char_result_len = longest_char_len;
02975
02976
02977 #ifdef KEY
02978 SET_LCV_CONST(lcv_idx, CN_CONST(ATD_TMP_IDX(lcv_idx)),
02979 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))],
02980 num_host_wds[TYP_LINEAR(CN_TYPE_IDX(ATD_TMP_IDX(lcv_idx)))]);
02981 #else
02982 SET_LCV_CONST(lcv_idx, CN_CONST(ATD_TMP_IDX(lcv_idx)),
02983 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
02984 #endif
02985
02986 ATD_FLD(lcv_idx) = OPND_FLD(save_atd_tmp_opnd);
02987 ATD_TMP_IDX(lcv_idx) = OPND_IDX(save_atd_tmp_opnd);
02988 }
02989 else {
02990
02991
02992
02993
02994
02995 if (*element == 1) {
02996
02997
02998
02999
03000
03001
03002
03003
03004
03005
03006
03007
03008
03009
03010
03011
03012
03013
03014
03015
03016
03017
03018
03019
03020
03021
03022
03023
03024
03025
03026
03027
03028
03029
03030
03031
03032
03033
03034
03035
03036
03037
03038
03039
03040
03041
03042
03043
03044
03045
03046
03047
03048
03049
03050
03051
03052
03053
03054
03055
03056
03057 AT_REFERENCED(lcv_idx) = Not_Referenced;
03058
03059
03060
03061
03062
03063 GET_LCV_CONST(lcv_idx, loc_value[0],
03064 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
03065
03066 ATD_FLD(lcv_idx) = CN_Tbl_Idx;
03067 ATD_TMP_IDX(lcv_idx) = ntr_const_tbl(ATD_TYPE_IDX(lcv_idx),
03068 FALSE,
03069 loc_value);
03070
03071 list_idx = IL_NEXT_LIST_IDX(list_idx);
03072 COPY_OPND(opnd, IL_OPND(list_idx));
03073 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
03074 &loc_element);
03075
03076 type_idx = ATD_TYPE_IDX(lcv_idx);
03077
03078 if (TYP_LINEAR(type_idx) != exp_desc_l.linear_type) {
03079
03080 if (folder_driver((char *)result_value,
03081 exp_desc_l.linear_type,
03082 NULL,
03083 NULL_IDX,
03084 start_value,
03085 &type_idx,
03086 line,
03087 col,
03088 1,
03089 Cvrt_Opr)) {
03090
03091 }
03092 }
03093 else {
03094 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i ++) {
03095 start_value[i] = result_value[i];
03096 }
03097 }
03098
03099 list_idx = IL_NEXT_LIST_IDX(list_idx);
03100 COPY_OPND(opnd, IL_OPND(list_idx));
03101 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
03102 &loc_element) && ok;
03103
03104 type_idx = ATD_TYPE_IDX(lcv_idx);
03105
03106 if (TYP_LINEAR(type_idx) != exp_desc_l.linear_type) {
03107
03108 if (folder_driver((char *)result_value,
03109 exp_desc_l.linear_type,
03110 NULL,
03111 NULL_IDX,
03112 end_value,
03113 &type_idx,
03114 line,
03115 col,
03116 1,
03117 Cvrt_Opr)) {
03118
03119 }
03120 }
03121 else {
03122 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i ++) {
03123 end_value[i] = result_value[i];
03124 }
03125 }
03126
03127 list_idx = IL_NEXT_LIST_IDX(list_idx);
03128 COPY_OPND(opnd, IL_OPND(list_idx));
03129 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
03130 &loc_element) && ok;
03131
03132 type_idx = ATD_TYPE_IDX(lcv_idx);
03133
03134 if (TYP_LINEAR(type_idx) != exp_desc_l.linear_type) {
03135
03136 if (folder_driver((char *)result_value,
03137 exp_desc_l.linear_type,
03138 NULL,
03139 NULL_IDX,
03140 stride_value,
03141 &type_idx,
03142 line,
03143 col,
03144 1,
03145 Cvrt_Opr)) {
03146
03147 }
03148 }
03149 else {
03150 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i ++) {
03151 stride_value[i] = result_value[i];
03152 }
03153 }
03154
03155 type_idx = CG_LOGICAL_DEFAULT_TYPE;
03156
03157 if (folder_driver((char *)stride_value,
03158 ATD_TYPE_IDX(lcv_idx),
03159 (char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
03160 CG_INTEGER_DEFAULT_TYPE,
03161 loc_value,
03162 &type_idx,
03163 line,
03164 col,
03165 2,
03166 Eq_Opr)) {
03167
03168 if (THIS_IS_TRUE(loc_value, type_idx)) {
03169 find_opnd_line_and_column(&opnd, &line, &col);
03170 PRINTMSG(line, 1084, Error, col);
03171 ok = FALSE;
03172 goto DONE;
03173 }
03174 }
03175
03176
03177
03178
03179
03180 type_idx = ATD_TYPE_IDX(lcv_idx);
03181
03182 if (folder_driver((char *)end_value,
03183 ATD_TYPE_IDX(lcv_idx),
03184 (char *)start_value,
03185 ATD_TYPE_IDX(lcv_idx),
03186 loc_value,
03187 &type_idx,
03188 line,
03189 col,
03190 2,
03191 Minus_Opr)) {
03192
03193 if (folder_driver((char *)loc_value,
03194 ATD_TYPE_IDX(lcv_idx),
03195 (char *)stride_value,
03196 ATD_TYPE_IDX(lcv_idx),
03197 loc_value,
03198 &type_idx,
03199 line,
03200 col,
03201 2,
03202 Div_Opr)) {
03203
03204 if (folder_driver((char *)loc_value,
03205 ATD_TYPE_IDX(lcv_idx),
03206 (char *)&CN_CONST(CN_INTEGER_ONE_IDX),
03207 CG_INTEGER_DEFAULT_TYPE,
03208 loc_value,
03209 &type_idx,
03210 line,
03211 col,
03212 2,
03213 Plus_Opr)) {
03214
03215 type_idx = CG_LOGICAL_DEFAULT_TYPE;
03216
03217 if (folder_driver((char *)loc_value,
03218 ATD_TYPE_IDX(lcv_idx),
03219 (char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
03220 CG_INTEGER_DEFAULT_TYPE,
03221 loc_value,
03222 &type_idx,
03223 line,
03224 col,
03225 2,
03226 Lt_Opr)) {
03227
03228 if (THIS_IS_TRUE(loc_value, type_idx)) {
03229 *element = -1;
03230 goto DONE;
03231 }
03232 }
03233 }
03234 }
03235 }
03236
03237 list_idx = IL_NEXT_LIST_IDX(IR_IDX_R(ir_idx));
03238 #ifdef KEY
03239 SET_LCV_CONST(lcv_idx, start_value[0],
03240 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))], num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
03241 #else
03242 SET_LCV_CONST(lcv_idx, start_value[0],
03243 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
03244 #endif
03245
03246 list_idx = IL_NEXT_LIST_IDX(list_idx);
03247
03248
03249 NTR_IR_LIST_TBL(list2_idx);
03250 NTR_IR_LIST_TBL(list3_idx);
03251 IL_NEXT_LIST_IDX(list2_idx) = list3_idx;
03252 COPY_OPND(IL_OPND(list3_idx), IL_OPND(list_idx));
03253 IL_FLD(list2_idx) = CN_Tbl_Idx;
03254 IL_IDX(list2_idx) = ntr_const_tbl(ATD_TYPE_IDX(lcv_idx),
03255 FALSE,
03256 end_value);
03257 IL_LINE_NUM(list2_idx) = line;
03258 IL_COL_NUM(list2_idx) = col;
03259
03260 # ifdef _DEBUG
03261 if (IL_FLD(list_idx) == IL_Tbl_Idx) {
03262
03263 PRINTMSG(line, 626, Internal, col,
03264 "no DAG", "interpret_implied_do");
03265 }
03266 # endif
03267
03268 IL_FLD(list_idx) = IL_Tbl_Idx;
03269 IL_LIST_CNT(list_idx) = 2;
03270 IL_IDX(list_idx) = list2_idx;
03271
03272 list_idx = IL_NEXT_LIST_IDX(list_idx);
03273
03274
03275
03276 NTR_IR_LIST_TBL(list2_idx);
03277 NTR_IR_LIST_TBL(list3_idx);
03278 IL_NEXT_LIST_IDX(list2_idx) = list3_idx;
03279 COPY_OPND(IL_OPND(list3_idx), IL_OPND(list_idx));
03280 IL_FLD(list2_idx) = CN_Tbl_Idx;
03281 IL_IDX(list2_idx) = ntr_const_tbl(ATD_TYPE_IDX(lcv_idx),
03282 FALSE,
03283 stride_value);
03284 IL_LINE_NUM(list2_idx) = line;
03285 IL_COL_NUM(list2_idx) = col;
03286
03287 IL_FLD(list_idx) = IL_Tbl_Idx;
03288 IL_LIST_CNT(list_idx) = 2;
03289 IL_IDX(list_idx) = list2_idx;
03290
03291
03292
03293
03294 NTR_IR_LIST_TBL(position_idx);
03295 IL_NEXT_LIST_IDX(list_idx) = position_idx;
03296 IL_NEXT_LIST_IDX(position_idx) = IR_IDX_L(ir_idx);
03297 IL_ELEMENT(position_idx) = 1;
03298
03299
03300 }
03301 else {
03302
03303 list_idx = IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(list_idx));
03304
03305 for (i = 0;
03306 i < num_host_wds[TYP_LINEAR(
03307 CN_TYPE_IDX(IL_IDX(IL_IDX(list_idx))))];
03308 i++) {
03309
03310 end_value[i] =
03311 CP_CONSTANT(CN_POOL_IDX(IL_IDX(IL_IDX(list_idx)))+i);
03312 }
03313
03314 list_idx = IL_NEXT_LIST_IDX(list_idx);
03315
03316 for (i = 0;
03317 i < num_host_wds[TYP_LINEAR(
03318 CN_TYPE_IDX(IL_IDX(IL_IDX(list_idx))))];
03319 i++) {
03320
03321 stride_value[i] =
03322 CP_CONSTANT(CN_POOL_IDX(IL_IDX(IL_IDX(list_idx)))+i);
03323 }
03324
03325
03326 position_idx = IL_NEXT_LIST_IDX(list_idx);
03327 }
03328
03329 loc_char_result_offset = char_result_offset;
03330 COPY_OPND(opnd, IL_OPND(IL_NEXT_LIST_IDX(position_idx)));
03331 loc_element = IL_ELEMENT(position_idx);
03332 ok = interpret_constructor(&opnd, &exp_desc_l, count,
03333 &loc_element) && ok;
03334 char_result_offset = loc_char_result_offset;
03335
03336 if (loc_element < 0) {
03337
03338 if (IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(position_idx))) {
03339 IL_NEXT_LIST_IDX(position_idx) =
03340 IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(position_idx));
03341 IL_ELEMENT(position_idx) = 1;
03342 (*element)++;
03343 }
03344 else {
03345 lin_type = TYP_LINEAR(ATD_TYPE_IDX(lcv_idx));
03346
03347 GET_LCV_CONST(lcv_idx, start_value[0], num_host_wds[lin_type]);
03348
03349 unused = ATD_TYPE_IDX(lcv_idx);
03350 ok = folder_driver((char *)start_value,
03351 ATD_TYPE_IDX(lcv_idx),
03352 (char *)stride_value,
03353 ATD_TYPE_IDX(lcv_idx),
03354 lcv_value,
03355 &unused,
03356 line,
03357 col,
03358 2,
03359 Plus_Opr) && ok;
03360
03361 unused = CG_LOGICAL_DEFAULT_TYPE;
03362 if (folder_driver((char *)stride_value,
03363 ATD_TYPE_IDX(lcv_idx),
03364 (char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
03365 CG_INTEGER_DEFAULT_TYPE,
03366 loc_value,
03367 &unused,
03368 line,
03369 col,
03370 2,
03371 Lt_Opr)) {
03372
03373 if (THIS_IS_TRUE(loc_value, unused)) {
03374 compare_opr = Ge_Opr;
03375 }
03376 }
03377
03378 unused = CG_LOGICAL_DEFAULT_TYPE;
03379 ok = folder_driver((char *)lcv_value,
03380 ATD_TYPE_IDX(lcv_idx),
03381 (char *)end_value,
03382 ATD_TYPE_IDX(lcv_idx),
03383 loc_value,
03384 &unused,
03385 line,
03386 col,
03387 2,
03388 compare_opr) && ok;
03389
03390 if (THIS_IS_TRUE(loc_value, unused)) {
03391 #ifdef KEY
03392 SET_LCV_CONST(lcv_idx, lcv_value[0],
03393 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))], num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
03394 #else
03395 SET_LCV_CONST(lcv_idx, lcv_value[0],
03396 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
03397 #endif
03398 IL_NEXT_LIST_IDX(position_idx) = IR_IDX_L(ir_idx);
03399 IL_ELEMENT(position_idx) = 1;
03400 (*element)++;
03401 }
03402 else {
03403
03404 (*element) = -1;
03405 list_idx = IR_IDX_R(ir_idx);
03406 list_idx = IL_NEXT_LIST_IDX(list_idx);
03407 list_idx = IL_NEXT_LIST_IDX(list_idx);
03408
03409
03410 list2_idx = IL_IDX(list_idx);
03411 COPY_OPND(IL_OPND(list_idx),
03412 IL_OPND(IL_NEXT_LIST_IDX(list2_idx)));
03413
03414 FREE_IR_LIST_NODE(IL_NEXT_LIST_IDX(list2_idx));
03415 FREE_IR_LIST_NODE(list2_idx);
03416
03417 list_idx = IL_NEXT_LIST_IDX(list_idx);
03418
03419
03420 list2_idx = IL_IDX(list_idx);
03421 COPY_OPND(IL_OPND(list_idx),
03422 IL_OPND(IL_NEXT_LIST_IDX(list2_idx)));
03423
03424 FREE_IR_LIST_NODE(IL_NEXT_LIST_IDX(list2_idx));
03425 FREE_IR_LIST_NODE(list2_idx);
03426
03427
03428 FREE_IR_LIST_NODE(IL_NEXT_LIST_IDX(list_idx));
03429 IL_NEXT_LIST_IDX(list_idx) = NULL_IDX;
03430
03431
03432 #ifdef KEY
03433 SET_LCV_CONST(lcv_idx, CN_CONST(ATD_TMP_IDX(lcv_idx)),
03434 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))],num_host_wds[TYP_LINEAR(CN_TYPE_IDX(ATD_TMP_IDX(lcv_idx)))]);
03435 #else
03436 SET_LCV_CONST(lcv_idx, CN_CONST(ATD_TMP_IDX(lcv_idx)),
03437 num_host_wds[TYP_LINEAR(ATD_TYPE_IDX(lcv_idx))]);
03438 #endif
03439 }
03440 }
03441 }
03442 else {
03443 IL_ELEMENT(position_idx)++;
03444 (*element)++;
03445 }
03446 }
03447 }
03448
03449 DONE:
03450
03451 TRACE (Func_Exit, "interpret_implied_do", NULL);
03452
03453 return(ok);
03454
03455 }
03456
03457 #ifdef KEY
03458 boolean constant_ptr_ok = FALSE;
03459 #endif
03460
03461
03462
03463
03464
03465
03466
03467
03468
03469
03470
03471
03472
03473
03474
03475
03476
03477
03478
03479 static boolean interpret_ref(opnd_type *top_opnd,
03480 expr_arg_type *exp_desc,
03481 boolean count,
03482 long64 *element)
03483
03484 {
03485
03486 int base_attr_idx;
03487 #ifdef KEY
03488 int base_cn_idx = 0;
03489 #else
03490 int base_cn_idx;
03491 #endif
03492 int bd_idx;
03493 long64 bit_offset = 0;
03494 char *char_ptr;
03495 char *char_ptr2;
03496 #ifdef KEY
03497 long64 char_len = 0;
03498 #else
03499 long64 char_len;
03500 #endif
03501 long64 cn_bit_offset;
03502 int col;
03503 long64 end_array[8];
03504 long64 end_value;
03505 long64 extent;
03506 long64 i;
03507 long64 index;
03508 int index_list;
03509 long64 index_array[8];
03510 int ir_idx;
03511 boolean is_vec_subscript[8];
03512 int left_attr;
03513 int line;
03514 int list_idx;
03515 int listr_idx;
03516 int list2_idx;
03517 long64 loc_element;
03518 expr_arg_type loc_exp_desc;
03519 long_type loc_value[MAX_WORDS_FOR_NUMERIC];
03520 boolean neg_stride[8];
03521 #ifdef KEY
03522 long64 num_bits = 0;
03523 #else
03524 long64 num_bits;
03525 #endif
03526 long64 num_words;
03527 boolean ok = TRUE;
03528 opnd_type opnd;
03529 opnd_type opnd2;
03530 int rank;
03531 boolean rank_array[8];
03532 #ifdef KEY
03533 int rank_idx = 0;
03534 #else
03535 int rank_idx;
03536 #endif
03537 boolean single_value_const = FALSE;
03538 long64 sm_in_bits;
03539 long64 start_array[8];
03540 long64 start_value;
03541 long64 stride_array[8];
03542 long64 stride_value;
03543 long64 substring_offset = 0;
03544 int type_idx;
03545 long64 word_offset = 0;
03546 boolean zero_size_array;
03547
03548
03549 TRACE (Func_Entry, "interpret_ref", NULL);
03550
03551 COPY_OPND(opnd, (*top_opnd));
03552
03553 ir_idx = OPND_IDX(opnd);
03554 rank = IR_RANK(ir_idx);
03555
03556 if (! count) {
03557 left_attr = find_left_attr(&opnd);
03558
03559 if (ATD_FLD(left_attr) == IR_Tbl_Idx) {
03560 single_value_const = TRUE;
03561 base_cn_idx = IR_IDX_R(ATD_TMP_IDX(left_attr));
03562 }
03563 else {
03564 base_cn_idx = ATD_TMP_IDX(left_attr);
03565 }
03566 }
03567
03568 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
03569 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
03570 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
03571
03572 if (exp_desc->type == Character &&
03573 rank == 0 &&
03574 compare_cn_and_value(TYP_IDX(exp_desc->type_idx),
03575 MAX_CHARS_IN_TYPELESS,
03576 Le_Opr)) {
03577 exp_desc->linear_type = Short_Char_Const;
03578 }
03579
03580 exp_desc->rank = rank;
03581 exp_desc->constant = TRUE;
03582 exp_desc->foldable = TRUE;
03583
03584 switch (exp_desc->type) {
03585 case Typeless :
03586 num_bits = TYP_BIT_LEN(exp_desc->type_idx);
03587 break;
03588
03589 case Integer :
03590 case Logical :
03591 case Real :
03592 case Complex :
03593 num_bits = storage_bit_size_tbl[exp_desc->linear_type];
03594 break;
03595
03596 case Character:
03597
03598 list_idx = IR_IDX_R(ir_idx);
03599 COPY_OPND(opnd2, IL_OPND(list_idx));
03600 loc_element = 0;
03601 ok = interpret_constructor(&opnd2, &loc_exp_desc, FALSE,
03602 &loc_element);
03603 start_value = F_INT_TO_C(result_value, loc_exp_desc.linear_type);
03604
03605 substring_offset = start_value - 1L;
03606
03607 list_idx = IL_NEXT_LIST_IDX(list_idx);
03608
03609 COPY_OPND(opnd2, IL_OPND(list_idx));
03610
03611 ok = interpret_constructor(&opnd2, &loc_exp_desc, FALSE,
03612 &loc_element);
03613 end_value = F_INT_TO_C(result_value, loc_exp_desc.linear_type);
03614
03615 char_len = end_value - start_value + 1L;
03616
03617 if (char_len < 0) {
03618 char_len = 0;
03619 }
03620 char_result_len = char_len;
03621 break;
03622
03623 case Structure :
03624 num_bits = CN_INT_TO_C(ATT_STRUCT_BIT_LEN_IDX(
03625 TYP_IDX(exp_desc->type_idx)));
03626 break;
03627 }
03628
03629 #ifdef KEY
03630
03631
03632
03633
03634
03635
03636
03637
03638
03639
03640
03641
03642
03643
03644
03645
03646
03647
03648
03649
03650
03651
03652
03653
03654
03655
03656
03657
03658
03659
03660
03661
03662
03663
03664
03665
03666
03667
03668
03669
03670
03671
03672
03673
03674 int component_attr = NULL_IDX;
03675 if (Struct_Opr == IR_OPR(ir_idx) && AT_Tbl_Idx == IR_FLD_R(ir_idx) &&
03676 ATD_POINTER(component_attr = IR_IDX_R(ir_idx))) {
03677 exp_desc->pointer = TRUE;
03678 if (constant_ptr_ok) {
03679 num_bits = stor_bit_size_of(component_attr, TRUE, FALSE).constant[0];
03680 if (Character == exp_desc->type) {
03681 if (CN_Tbl_Idx == TYP_FLD(exp_desc->type_idx)) {
03682 char_result_len = CN_INT_TO_C(TYP_IDX(exp_desc->type_idx));
03683 }
03684 else {
03685
03686 PRINTMSG(IR_LINE_NUM(ir_idx), 1024, Internal, IR_COL_NUM(ir_idx));
03687 }
03688 }
03689 }
03690 else if (!count) {
03691 PRINTMSG(IR_LINE_NUM(ir_idx), 1677, Error, IR_COL_NUM(ir_idx));
03692 ok = FALSE;
03693 }
03694 }
03695 #endif
03696
03697 if (count) {
03698
03699 if (rank == 0) {
03700
03701 }
03702 else {
03703 while (OPND_FLD(opnd) == IR_Tbl_Idx) {
03704 if (IR_OPR(OPND_IDX(opnd)) == Whole_Subscript_Opr ||
03705 IR_OPR(OPND_IDX(opnd)) == Section_Subscript_Opr) {
03706 break;
03707 }
03708 COPY_OPND(opnd, IR_OPND_L(OPND_IDX(opnd)));
03709 }
03710
03711 ir_idx = OPND_IDX(opnd);
03712 list_idx = IR_IDX_R(ir_idx);
03713 loc_element = 0;
03714 rank = 0;
03715
03716 while (list_idx &&
03717 ! IL_PE_SUBSCRIPT(list_idx)) {
03718
03719 if (IL_FLD(list_idx) == IR_Tbl_Idx &&
03720 IR_OPR(IL_IDX(list_idx)) == Triplet_Opr) {
03721
03722 list2_idx = IR_IDX_L(IL_IDX(list_idx));
03723 COPY_OPND(opnd, IL_OPND(list2_idx));
03724 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
03725 &loc_element);
03726 start_value = F_INT_TO_C(result_value, loc_exp_desc.linear_type);
03727
03728 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
03729 COPY_OPND(opnd, IL_OPND(list2_idx));
03730 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
03731 &loc_element);
03732 end_value = F_INT_TO_C(result_value, loc_exp_desc.linear_type);
03733
03734 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
03735 COPY_OPND(opnd, IL_OPND(list2_idx));
03736 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
03737 &loc_element);
03738 stride_value = F_INT_TO_C(result_value,
03739 loc_exp_desc.linear_type);
03740
03741 exp_desc->shape[rank].fld = CN_Tbl_Idx;
03742 extent = ((end_value - start_value) / stride_value) + 1L;
03743
03744 if (extent < 0L) {
03745 extent = 0L;
03746 }
03747
03748 exp_desc->shape[rank].idx = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
03749 extent);
03750 rank++;
03751 }
03752 else {
03753
03754 COPY_OPND(opnd, IL_OPND(list_idx));
03755 loc_element = 1;
03756 ok = interpret_constructor(&opnd, &loc_exp_desc, TRUE,
03757 &loc_element);
03758 loc_element = 0;
03759
03760 if (loc_exp_desc.rank > 0) {
03761 COPY_OPND(exp_desc->shape[rank], loc_exp_desc.shape[0]);
03762 rank++;
03763 }
03764 }
03765 list_idx = IL_NEXT_LIST_IDX(list_idx);
03766 }
03767 }
03768 }
03769 else if (*element > 0 &&
03770 rank > 0) {
03771
03772
03773
03774
03775 # ifdef _DEBUG
03776 if (exp_desc->type == Structure) {
03777 PRINTMSG(IR_LINE_NUM(ir_idx), 984, Internal, IR_COL_NUM(ir_idx));
03778 }
03779 # endif
03780
03781 zero_size_array = FALSE;
03782
03783 if (*element == 1) {
03784
03785
03786
03787
03788
03789
03790
03791
03792
03793
03794
03795
03796
03797
03798
03799
03800
03801
03802
03803
03804
03805
03806
03807
03808
03809
03810
03811
03812
03813
03814
03815
03816
03817
03818
03819
03820
03821
03822
03823
03824
03825
03826
03827
03828
03829
03830
03831
03832
03833
03834
03835
03836
03837
03838
03839
03840
03841
03842
03843
03844
03845
03846
03847
03848
03849
03850
03851
03852
03853
03854
03855
03856
03857
03858
03859
03860
03861
03862
03863
03864
03865
03866
03867
03868
03869
03870
03871
03872
03873
03874
03875
03876
03877
03878
03879
03880
03881
03882
03883
03884
03885
03886
03887
03888
03889
03890
03891
03892
03893
03894
03895
03896
03897
03898
03899
03900
03901
03902
03903
03904
03905
03906
03907
03908
03909
03910
03911
03912
03913 while (OPND_FLD(opnd) == IR_Tbl_Idx) {
03914
03915 ir_idx = OPND_IDX(opnd);
03916
03917 switch (IR_OPR(ir_idx)) {
03918
03919 case Struct_Opr :
03920 bit_offset += CN_INT_TO_C(ATD_CPNT_OFFSET_IDX(
03921 IR_IDX_R(ir_idx)));
03922 break;
03923
03924 case Whole_Subscript_Opr :
03925 case Section_Subscript_Opr :
03926
03927 rank_idx = ir_idx;
03928 break;
03929
03930 case Subscript_Opr :
03931 base_attr_idx = find_base_attr(&opnd, &line, &col);
03932 bd_idx = ATD_ARRAY_IDX(base_attr_idx);
03933
03934 if (TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Structure &&
03935 ATT_CHAR_SEQ(TYP_IDX(ATD_TYPE_IDX(base_attr_idx)))) {
03936
03937 sm_in_bits = 8;
03938 }
03939
03940
03941 else if ( TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Integer ||
03942 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Logical ||
03943 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == CRI_Ptr ||
03944 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == CRI_Ch_Ptr ||
03945 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Real ||
03946 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Complex ) {
03947 sm_in_bits = storage_bit_size_tbl[CG_INTEGER_DEFAULT_TYPE];
03948 }
03949 else {
03950 sm_in_bits = sm_unit_in_bits(ATD_TYPE_IDX(base_attr_idx));
03951 }
03952
03953 list_idx = IR_IDX_R(ir_idx);
03954
03955 for (i = 1; i <= BD_RANK(bd_idx); i++) {
03956
03957 loc_element = 0;
03958 COPY_OPND(opnd2, IL_OPND(list_idx));
03959 ok = interpret_constructor(&opnd2, &loc_exp_desc,
03960 FALSE, &loc_element);
03961
03962 bit_offset += (F_INT_TO_C(result_value,
03963 loc_exp_desc.linear_type)
03964 - CN_INT_TO_C(BD_LB_IDX(bd_idx,i)))
03965 * CN_INT_TO_C(BD_SM_IDX(bd_idx,i))
03966 * sm_in_bits;
03967
03968 list_idx = IL_NEXT_LIST_IDX(list_idx);
03969 }
03970 break;
03971 }
03972
03973 COPY_OPND(opnd, IR_OPND_L(OPND_IDX(opnd)));
03974 }
03975
03976 if (exp_desc->type == Character) {
03977
03978
03979 cn_bit_offset = (substring_offset * CHAR_BIT) + bit_offset;
03980 }
03981 else {
03982
03983 cn_bit_offset = bit_offset;
03984 }
03985
03986 list_idx = IR_IDX_R(rank_idx);
03987 NTR_IR_LIST_TBL(list2_idx);
03988 IL_ELEMENT(list2_idx) = cn_bit_offset;
03989 IL_NEXT_LIST_IDX(list2_idx) = list_idx;
03990 IR_IDX_R(rank_idx) = list2_idx;
03991
03992 base_attr_idx = find_base_attr(&(IR_OPND_L(rank_idx)), &line, &col);
03993 bd_idx = ATD_ARRAY_IDX(base_attr_idx);
03994
03995 for (i = 1; i <= BD_RANK(bd_idx); i++) {
03996
03997 NTR_IR_LIST_TBL(index_list);
03998
03999 if (IL_FLD(list_idx) == IR_Tbl_Idx &&
04000 IR_OPR(IL_IDX(list_idx)) == Triplet_Opr) {
04001
04002 loc_element = 0;
04003
04004 NTR_IR_LIST_TBL(listr_idx);
04005
04006 # ifdef _DEBUG
04007 if (IR_FLD_R(IL_IDX(list_idx)) == IL_Tbl_Idx) {
04008 PRINTMSG(line, 626, Internal, col,
04009 "no DAG", "interpret_ref");
04010 }
04011 # endif
04012
04013 IR_FLD_R(IL_IDX(list_idx)) = IL_Tbl_Idx;
04014 IR_LIST_CNT_R(IL_IDX(list_idx)) = 3;
04015 IR_IDX_R(IL_IDX(list_idx)) = listr_idx;
04016
04017 list2_idx = IR_IDX_L(IL_IDX(list_idx));
04018 COPY_OPND(opnd, IL_OPND(list2_idx));
04019 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04020 &loc_element);
04021
04022 IL_ELEMENT(index_list) =
04023 F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04024 IL_ELEMENT(listr_idx) =
04025 F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04026 start_value =
04027 F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04028
04029 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(listr_idx));
04030 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(listr_idx)) = listr_idx;
04031 listr_idx = IL_NEXT_LIST_IDX(listr_idx);
04032
04033 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
04034 COPY_OPND(opnd, IL_OPND(list2_idx));
04035 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04036 &loc_element);
04037 IL_ELEMENT(listr_idx) =
04038 F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04039 end_value = F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04040
04041 NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(listr_idx));
04042 IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(listr_idx)) = listr_idx;
04043 listr_idx = IL_NEXT_LIST_IDX(listr_idx);
04044
04045 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
04046 COPY_OPND(opnd, IL_OPND(list2_idx));
04047 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04048 &loc_element);
04049 IL_ELEMENT(listr_idx) =
04050 F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04051 stride_value =
04052 F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04053
04054 if ((((end_value - start_value) / stride_value) + 1L) <= 0) {
04055
04056
04057 zero_size_array = TRUE;
04058 }
04059
04060
04061
04062 NTR_IR_LIST_TBL(list2_idx);
04063 COPY_OPND(IL_OPND(list2_idx), IL_OPND(list_idx));
04064
04065 # ifdef _DEBUG
04066 if (IL_FLD(list_idx) == IL_Tbl_Idx) {
04067 PRINTMSG(line, 626, Internal, col,
04068 "no DAG", "interpret_ref");
04069 }
04070 # endif
04071
04072 IL_FLD(list_idx) = IL_Tbl_Idx;
04073 IL_IDX(list_idx) = index_list;
04074 IL_LIST_CNT(list_idx) = 2;
04075 IL_NEXT_LIST_IDX(index_list) = list2_idx;
04076
04077 }
04078 else {
04079 COPY_OPND(opnd, IL_OPND(list_idx));
04080 loc_element = 1;
04081 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04082 &loc_element);
04083 IL_ELEMENT(index_list) =
04084 F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04085
04086 if (no_result_value) {
04087 zero_size_array = TRUE;
04088 }
04089
04090 NTR_IR_LIST_TBL(listr_idx);
04091 IL_ELEMENT(listr_idx) = loc_element;
04092
04093 NTR_IR_LIST_TBL(list2_idx);
04094 COPY_OPND(IL_OPND(list2_idx), IL_OPND(list_idx));
04095
04096 # ifdef _DEBUG
04097 if (IL_FLD(list_idx) == IL_Tbl_Idx) {
04098 PRINTMSG(line, 626, Internal, col,
04099 "no DAG", "interpret_ref");
04100 }
04101 # endif
04102 IL_FLD(list_idx) = IL_Tbl_Idx;
04103 IL_IDX(list_idx) = index_list;
04104 IL_LIST_CNT(list_idx) = 3;
04105 IL_NEXT_LIST_IDX(index_list) = listr_idx;
04106 IL_NEXT_LIST_IDX(listr_idx) = list2_idx;
04107 }
04108
04109 list_idx = IL_NEXT_LIST_IDX(list_idx);
04110 }
04111 }
04112 else {
04113
04114 while (OPND_FLD(opnd) == IR_Tbl_Idx) {
04115
04116 if (IR_OPR(OPND_IDX(opnd)) == Whole_Subscript_Opr ||
04117 IR_OPR(OPND_IDX(opnd)) == Section_Subscript_Opr) {
04118 rank_idx = OPND_IDX(opnd);
04119 break;
04120 }
04121 COPY_OPND(opnd, IR_OPND_L(OPND_IDX(opnd)));
04122 }
04123
04124 base_attr_idx = find_base_attr(&(IR_OPND_L(rank_idx)), &line, &col);
04125 bd_idx = ATD_ARRAY_IDX(base_attr_idx);
04126 }
04127
04128 if (zero_size_array) {
04129 list_idx = NULL_IDX;
04130 no_result_value = TRUE;
04131 goto ZERO_ARRAY;
04132 }
04133
04134 list_idx = IR_IDX_R(rank_idx);
04135 bit_offset = IL_ELEMENT(list_idx);
04136
04137 list_idx = IL_NEXT_LIST_IDX(list_idx);
04138 list2_idx = list_idx;
04139
04140 if (TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Structure &&
04141 ATT_CHAR_SEQ(TYP_IDX(ATD_TYPE_IDX(base_attr_idx)))) {
04142
04143 sm_in_bits = 8;
04144 }
04145
04146
04147 else if ( TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Integer ||
04148 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Logical ||
04149 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == CRI_Ptr ||
04150 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == CRI_Ch_Ptr ||
04151 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Real ||
04152 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Complex ) {
04153 sm_in_bits = storage_bit_size_tbl[CG_INTEGER_DEFAULT_TYPE];
04154 }
04155 else {
04156 sm_in_bits = sm_unit_in_bits(ATD_TYPE_IDX(base_attr_idx));
04157 }
04158
04159 for (i = 1; i <= BD_RANK(bd_idx); i++) {
04160 bit_offset += (IL_ELEMENT(IL_IDX(list2_idx)) -
04161 CN_INT_TO_C(BD_LB_IDX(bd_idx,i)))
04162 * CN_INT_TO_C(BD_SM_IDX(bd_idx,i))
04163 * sm_in_bits;
04164
04165 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
04166 }
04167
04168 while (list_idx) {
04169 list2_idx = IL_IDX(list_idx);
04170
04171 if (IL_VECTOR_SUBSCRIPT(list_idx)) {
04172
04173 listr_idx = IL_NEXT_LIST_IDX(list2_idx);
04174
04175 if (IL_ELEMENT(listr_idx) > 0) {
04176
04177 COPY_OPND(opnd, IL_OPND(IL_NEXT_LIST_IDX(listr_idx)));
04178 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04179 &(IL_ELEMENT(listr_idx)));
04180 IL_ELEMENT(list2_idx) =
04181 F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04182 break;
04183 }
04184 else {
04185
04186
04187 IL_ELEMENT(listr_idx) = 1;
04188 COPY_OPND(opnd, IL_OPND(IL_NEXT_LIST_IDX(listr_idx)));
04189 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04190 &(IL_ELEMENT(listr_idx)));
04191 IL_ELEMENT(list2_idx) =
04192 F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04193
04194 }
04195 }
04196 else if (IL_FLD(IL_NEXT_LIST_IDX(list2_idx)) == IR_Tbl_Idx &&
04197 IR_OPR(IL_IDX(IL_NEXT_LIST_IDX(list2_idx))) == Triplet_Opr) {
04198
04199 listr_idx = IR_IDX_R(IL_IDX(IL_NEXT_LIST_IDX(list2_idx)));
04200 start_value = IL_ELEMENT(listr_idx);
04201 listr_idx = IL_NEXT_LIST_IDX(listr_idx);
04202 end_value = IL_ELEMENT(listr_idx);
04203 listr_idx = IL_NEXT_LIST_IDX(listr_idx);
04204 stride_value = IL_ELEMENT(listr_idx);
04205 index = IL_ELEMENT(list2_idx);
04206
04207 if (stride_value < 0) {
04208
04209 if (index + stride_value >= end_value) {
04210 IL_ELEMENT(list2_idx) += stride_value;
04211 break;
04212 }
04213 else {
04214 IL_ELEMENT(list2_idx) = start_value;
04215 }
04216 }
04217 else {
04218
04219 if (index + stride_value <= end_value) {
04220 IL_ELEMENT(list2_idx) += stride_value;
04221 break;
04222 }
04223 else {
04224 IL_ELEMENT(list2_idx) = start_value;
04225 }
04226 }
04227
04228 }
04229 else {
04230
04231 }
04232
04233 list_idx = IL_NEXT_LIST_IDX(list_idx);
04234 }
04235
04236 ZERO_ARRAY:
04237
04238 if (list_idx == NULL_IDX) {
04239
04240 *element = -1;
04241
04242
04243 list_idx = IR_IDX_R(rank_idx);
04244 IR_IDX_R(rank_idx) = IL_NEXT_LIST_IDX(list_idx);
04245 FREE_IR_LIST_NODE(list_idx);
04246
04247 list_idx = IR_IDX_R(rank_idx);
04248 while (list_idx) {
04249
04250 list2_idx = IL_IDX(list_idx);
04251
04252 if (IL_VECTOR_SUBSCRIPT(list_idx)) {
04253 COPY_OPND(IL_OPND(list_idx),
04254 IL_OPND(IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(list2_idx))));
04255 FREE_IR_LIST_NODE(IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(list2_idx)));
04256 FREE_IR_LIST_NODE(IL_NEXT_LIST_IDX(list2_idx));
04257
04258 FREE_IR_LIST_NODE(list2_idx);
04259 }
04260 else if (IL_FLD(IL_NEXT_LIST_IDX(list2_idx)) == IR_Tbl_Idx &&
04261 IR_OPR(IL_IDX(IL_NEXT_LIST_IDX(list2_idx))) ==
04262 Triplet_Opr) {
04263
04264 COPY_OPND(IL_OPND(list_idx),
04265 IL_OPND(IL_NEXT_LIST_IDX(list2_idx)));
04266
04267 FREE_IR_LIST_NODE(IL_NEXT_LIST_IDX(list2_idx));
04268 FREE_IR_LIST_NODE(list2_idx);
04269
04270 list2_idx = IR_IDX_R(IL_IDX(list_idx));
04271 FREE_IR_LIST_NODE(IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(list2_idx)));
04272 FREE_IR_LIST_NODE(IL_NEXT_LIST_IDX(list2_idx));
04273 FREE_IR_LIST_NODE(list2_idx);
04274 IR_FLD_R(IL_IDX(list_idx)) = NO_Tbl_Idx;
04275 IR_IDX_R(IL_IDX(list_idx)) = NULL_IDX;
04276 }
04277 else {
04278
04279 COPY_OPND(IL_OPND(list_idx),
04280 IL_OPND(IL_NEXT_LIST_IDX(list2_idx)));
04281
04282 FREE_IR_LIST_NODE(IL_NEXT_LIST_IDX(list2_idx));
04283 FREE_IR_LIST_NODE(list2_idx);
04284 }
04285
04286 list_idx = IL_NEXT_LIST_IDX(list_idx);
04287 }
04288 }
04289 else {
04290 (*element)++;
04291 }
04292
04293 if (single_value_const) {
04294 bit_offset = 0;
04295 }
04296
04297 if (no_result_value) {
04298
04299 }
04300 else if (exp_desc->type == Character) {
04301
04302 if ((char_result_offset + char_len) >= char_result_buffer_len) {
04303
04304 enlarge_char_result_buffer();
04305 }
04306
04307 for (i = 0; i < char_len; i++) {
04308 char_result_buffer[char_result_offset] =
04309 *((char *)&(CN_CONST(base_cn_idx))
04310 + (bit_offset/CHAR_BIT) + i);
04311
04312 char_result_offset++;
04313 }
04314 }
04315 else {
04316 # if 0
04317
04318 # if defined(_TARGET64)
04319 if (exp_desc->linear_type == Complex_4 &&
04320 num_bits == TARGET_BITS_PER_WORD) {
04321
04322
04323
04324
04325
04326 if (single_value_const) {
04327 result_value[0] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx));
04328 result_value[1] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx) + 1);
04329 }
04330 else {
04331 word_offset = bit_offset/TARGET_BITS_PER_WORD;
04332
04333 unpack_int64_to_int32 (
04334 CP_CONSTANT(CN_POOL_IDX(base_cn_idx) + word_offset), result_value );
04335 }
04336 }
04337 else
04338 # endif
04339 # endif
04340 if (single_value_const &&
04341 num_bits < TARGET_BITS_PER_WORD &&
04342 (exp_desc->type == Integer ||
04343 exp_desc->type == Real ||
04344 exp_desc->type == Logical)) {
04345
04346 result_value[0] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx));
04347 }
04348 else if (num_bits % TARGET_BITS_PER_WORD != 0) {
04349
04350 word_offset = bit_offset/TARGET_BITS_PER_WORD;
04351
04352
04353
04354 result_value[0] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx) +
04355 word_offset);
04356
04357 # if defined(_HOST_LITTLE_ENDIAN) && defined(_TARGET_LITTLE_ENDIAN)
04358 result_value[0] = result_value[0] >>
04359 (bit_offset % TARGET_BITS_PER_WORD);
04360 if (num_bits == 8) {
04361 result_value[0] = result_value[0] & 0XFF;
04362 }
04363 else if (num_bits == 16) {
04364 result_value[0] = result_value[0] & 0XFFFF;
04365 }
04366 else if (num_bits == 32) {
04367 result_value[0] = result_value[0] & 0XFFFFFFFF;
04368 }
04369 # else
04370
04371
04372 result_value[0] = result_value[0] <<
04373 (bit_offset % TARGET_BITS_PER_WORD);
04374
04375
04376 result_value[0] = result_value[0] >>
04377 (TARGET_BITS_PER_WORD - num_bits);
04378 # endif
04379
04380 }
04381 else {
04382
04383 word_offset = bit_offset/TARGET_BITS_PER_WORD;
04384 num_words = num_bits/TARGET_BITS_PER_WORD;
04385
04386 for (i = 0; i < num_words; i++) {
04387 result_value[i] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx) +
04388 word_offset + i);
04389 }
04390 }
04391 }
04392
04393 }
04394 else if (rank == 0) {
04395
04396 while (OPND_FLD(opnd) == IR_Tbl_Idx) {
04397
04398 ir_idx = OPND_IDX(opnd);
04399
04400 switch (IR_OPR(ir_idx)) {
04401
04402 case Struct_Opr :
04403 bit_offset +=CN_INT_TO_C(ATD_CPNT_OFFSET_IDX(IR_IDX_R(ir_idx)));
04404 break;
04405
04406 case Subscript_Opr :
04407 base_attr_idx = find_base_attr(&opnd, &line, &col);
04408 bd_idx = ATD_ARRAY_IDX(base_attr_idx);
04409
04410 list_idx = IR_IDX_R(ir_idx);
04411
04412 if (TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Structure &&
04413 ATT_CHAR_SEQ(TYP_IDX(ATD_TYPE_IDX(base_attr_idx)))) {
04414
04415 sm_in_bits = 8;
04416 }
04417
04418
04419 else if ( TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Integer ||
04420 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Logical ||
04421 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == CRI_Ptr ||
04422 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == CRI_Ch_Ptr ||
04423 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Real ||
04424 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Complex ) {
04425 sm_in_bits = storage_bit_size_tbl[CG_INTEGER_DEFAULT_TYPE];
04426 }
04427 else {
04428 sm_in_bits = sm_unit_in_bits(ATD_TYPE_IDX(base_attr_idx));
04429 }
04430
04431 for (i = 1; i <= BD_RANK(bd_idx); i++) {
04432
04433 loc_element = 0;
04434 COPY_OPND(opnd2, IL_OPND(list_idx));
04435 ok = interpret_constructor(&opnd2, &loc_exp_desc,
04436 FALSE, &loc_element);
04437
04438
04439 bit_offset += (F_INT_TO_C(result_value,
04440 loc_exp_desc.linear_type) -
04441 CN_INT_TO_C(BD_LB_IDX(bd_idx,i)))
04442 * CN_INT_TO_C(BD_SM_IDX(bd_idx,i))
04443 * sm_in_bits;
04444
04445 list_idx = IL_NEXT_LIST_IDX(list_idx);
04446 }
04447 break;
04448 }
04449
04450 COPY_OPND(opnd, IR_OPND_L(OPND_IDX(opnd)));
04451 }
04452
04453 if (exp_desc->type == Character) {
04454
04455
04456 bit_offset = (substring_offset * CHAR_BIT) + bit_offset;
04457 }
04458
04459 if (single_value_const) {
04460 bit_offset = 0;
04461 }
04462
04463 if (no_result_value) {
04464
04465 }
04466 else if (exp_desc->type == Character) {
04467
04468 if ((char_result_offset + char_len) >= char_result_buffer_len) {
04469
04470 enlarge_char_result_buffer();
04471 }
04472
04473 for (i = 0; i < char_len; i++) {
04474 char_result_buffer[char_result_offset] =
04475 *((char *)&(CN_CONST(base_cn_idx))
04476 + (bit_offset/CHAR_BIT) + i);
04477
04478 char_result_offset++;
04479 }
04480 }
04481 else if (exp_desc->type == Structure) {
04482
04483
04484
04485
04486
04487 exp_desc->constant = FALSE;
04488
04489
04490
04491
04492
04493 char_ptr = (char *) &(CN_CONST(the_cn_idx))
04494 + (the_cn_bit_offset/CHAR_BIT);
04495
04496 the_cn_bit_offset += num_bits;
04497
04498 char_ptr2 = (char *)&(CN_CONST(base_cn_idx)) + (bit_offset/CHAR_BIT);
04499
04500 char_len = num_bits/CHAR_BIT;
04501
04502 for (i = 0; i < char_len; i++) {
04503 char_ptr[i] = char_ptr2[i];
04504 }
04505 }
04506 else {
04507 #if 0
04508
04509 # if defined(_TARGET64)
04510 if (exp_desc->linear_type == Complex_4 &&
04511 num_bits == TARGET_BITS_PER_WORD) {
04512
04513 if (single_value_const) {
04514 result_value[0] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx));
04515 result_value[1] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx) + 1);
04516 }
04517 else {
04518
04519
04520
04521 word_offset = bit_offset/TARGET_BITS_PER_WORD;
04522
04523 unpack_int64_to_int32 (
04524 CP_CONSTANT(CN_POOL_IDX(base_cn_idx) + word_offset), result_value );
04525 }
04526 }
04527 else
04528 # endif
04529 # endif
04530 if (single_value_const &&
04531 num_bits < TARGET_BITS_PER_WORD &&
04532 (exp_desc->type == Integer ||
04533 exp_desc->type == Real ||
04534 exp_desc->type == Logical)) {
04535
04536 result_value[0] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx));
04537 }
04538 else if (num_bits % TARGET_BITS_PER_WORD != 0) {
04539
04540 word_offset = bit_offset/TARGET_BITS_PER_WORD;
04541
04542 result_value[0] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx) +
04543 word_offset);
04544
04545 # if defined(_HOST_LITTLE_ENDIAN) && defined(_TARGET_LITTLE_ENDIAN)
04546 result_value[0] = result_value[0] >>
04547 (bit_offset % TARGET_BITS_PER_WORD);
04548 if (num_bits == 8) {
04549 result_value[0] = result_value[0] & 0XFF;
04550 }
04551 else if (num_bits == 16) {
04552 result_value[0] = result_value[0] & 0XFFFF;
04553 }
04554 else if (num_bits == 32) {
04555 result_value[0] = result_value[0] & 0XFFFFFFFF;
04556 }
04557 # else
04558
04559
04560 result_value[0] = result_value[0] <<
04561 (bit_offset % TARGET_BITS_PER_WORD);
04562
04563
04564 result_value[0] = result_value[0] >>
04565 (TARGET_BITS_PER_WORD - num_bits);
04566 # endif
04567
04568 }
04569 else {
04570
04571 word_offset = bit_offset/TARGET_BITS_PER_WORD;
04572 num_words = num_bits/TARGET_BITS_PER_WORD;
04573
04574 for (i = 0; i < num_words; i++) {
04575 result_value[i] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx) +
04576 word_offset + i);
04577 }
04578 }
04579 }
04580
04581 if (*element > 0) {
04582 *element = -1;
04583 }
04584 }
04585 else {
04586
04587
04588 exp_desc->constant = FALSE;
04589 zero_size_array = FALSE;
04590 cn_bit_offset = 0;
04591
04592 while (OPND_FLD(opnd) == IR_Tbl_Idx) {
04593
04594 ir_idx = OPND_IDX(opnd);
04595
04596 switch (IR_OPR(ir_idx)) {
04597
04598 case Struct_Opr :
04599 cn_bit_offset += CN_INT_TO_C(ATD_CPNT_OFFSET_IDX(
04600 IR_IDX_R(ir_idx)));
04601 break;
04602
04603 case Whole_Subscript_Opr :
04604 case Section_Subscript_Opr :
04605
04606 rank_idx = ir_idx;
04607 break;
04608
04609 case Subscript_Opr :
04610 base_attr_idx = find_base_attr(&opnd, &line, &col);
04611 bd_idx = ATD_ARRAY_IDX(base_attr_idx);
04612
04613 list_idx = IR_IDX_R(ir_idx);
04614
04615 if (TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Structure &&
04616 ATT_CHAR_SEQ(TYP_IDX(ATD_TYPE_IDX(base_attr_idx)))) {
04617
04618 sm_in_bits = 8;
04619 }
04620
04621
04622 else if ( TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Integer ||
04623 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Logical ||
04624 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == CRI_Ptr ||
04625 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == CRI_Ch_Ptr ||
04626 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Real ||
04627 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Complex ) {
04628 sm_in_bits = storage_bit_size_tbl[CG_INTEGER_DEFAULT_TYPE];
04629 }
04630 else {
04631 sm_in_bits = sm_unit_in_bits(ATD_TYPE_IDX(base_attr_idx));
04632 }
04633
04634 for (i = 1; i <= BD_RANK(bd_idx); i++) {
04635
04636 loc_element = 0;
04637 COPY_OPND(opnd2, IL_OPND(list_idx));
04638 ok = interpret_constructor(&opnd2, &loc_exp_desc,
04639 FALSE, &loc_element);
04640 type_idx = Integer_8;
04641
04642 ok = folder_driver((char *)result_value,
04643 loc_exp_desc.linear_type,
04644 (char *) CN_CONST(BD_LB_IDX(bd_idx,i)),
04645 CN_TYPE_IDX(BD_LB_IDX(bd_idx,i)),
04646 loc_value,
04647 &type_idx,
04648 line,
04649 col,
04650 2,
04651 Minus_Opr);
04652
04653 ok = folder_driver((char *)loc_value,
04654 type_idx,
04655 (char *) CN_CONST(BD_SM_IDX(bd_idx,i)),
04656 CN_TYPE_IDX(BD_SM_IDX(bd_idx,i)),
04657 loc_value,
04658 &type_idx,
04659 line,
04660 col,
04661 2,
04662 Mult_Opr);
04663
04664 cn_bit_offset += F_INT_TO_C(loc_value, type_idx) * sm_in_bits;
04665
04666 list_idx = IL_NEXT_LIST_IDX(list_idx);
04667 }
04668 break;
04669 }
04670
04671 COPY_OPND(opnd, IR_OPND_L(OPND_IDX(opnd)));
04672 }
04673
04674 if (exp_desc->type == Character) {
04675
04676 cn_bit_offset += substring_offset * CHAR_BIT;
04677 }
04678
04679 base_attr_idx = find_base_attr(&(IR_OPND_L(rank_idx)), &line, &col);
04680 bd_idx = ATD_ARRAY_IDX(base_attr_idx);
04681 list_idx = IR_IDX_R(rank_idx);
04682
04683 for (i = 1; i <= BD_RANK(bd_idx); i++) {
04684
04685 if (IL_FLD(list_idx) == IR_Tbl_Idx &&
04686 IR_OPR(IL_IDX(list_idx)) == Triplet_Opr) {
04687
04688 is_vec_subscript[i] = FALSE;
04689 rank_array[i] = TRUE;
04690 loc_element = 0;
04691
04692 list2_idx = IR_IDX_L(IL_IDX(list_idx));
04693 COPY_OPND(opnd, IL_OPND(list2_idx));
04694 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04695 &loc_element);
04696 index_array[i] = F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04697 start_array[i] = index_array[i];
04698
04699 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
04700 COPY_OPND(opnd, IL_OPND(list2_idx));
04701 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04702 &loc_element);
04703 end_array[i] = F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04704
04705 list2_idx = IL_NEXT_LIST_IDX(list2_idx);
04706 COPY_OPND(opnd, IL_OPND(list2_idx));
04707 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04708 &loc_element);
04709 stride_array[i] = F_INT_TO_C(result_value,loc_exp_desc.linear_type);
04710
04711 if ((((end_array[i] - start_array[i]) / stride_array[i]) + 1L)
04712 <= 0) {
04713
04714
04715 zero_size_array = TRUE;
04716 }
04717
04718 if (stride_array[i] < 0) {
04719 neg_stride[i] = TRUE;
04720 }
04721 else {
04722 neg_stride[i] = FALSE;
04723 }
04724
04725 }
04726 else {
04727 COPY_OPND(opnd, IL_OPND(list_idx));
04728 loc_element = 1;
04729 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04730 &loc_element);
04731 index_array[i] = F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04732
04733 if (no_result_value) {
04734 zero_size_array = TRUE;
04735 }
04736
04737 if (loc_element < 0) {
04738 rank_array[i] = FALSE;
04739 }
04740 else {
04741 start_array[i] = loc_element;
04742 end_array[i] = list_idx;
04743 is_vec_subscript[i] = TRUE;
04744 rank_array[i] = TRUE;
04745 }
04746 }
04747
04748 list_idx = IL_NEXT_LIST_IDX(list_idx);
04749 }
04750
04751
04752
04753 if (zero_size_array) {
04754 goto DONE;
04755 }
04756
04757 while (TRUE) {
04758 bit_offset = 0;
04759
04760 if (TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Structure &&
04761 ATT_CHAR_SEQ(TYP_IDX(ATD_TYPE_IDX(base_attr_idx)))) {
04762
04763 sm_in_bits = 8;
04764 }
04765
04766
04767 else if ( TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Integer ||
04768 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Logical ||
04769 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == CRI_Ptr ||
04770 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == CRI_Ch_Ptr ||
04771 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Real ||
04772 TYP_TYPE(ATD_TYPE_IDX(base_attr_idx)) == Complex ) {
04773 sm_in_bits = storage_bit_size_tbl[CG_INTEGER_DEFAULT_TYPE];
04774 }
04775 else {
04776 sm_in_bits = sm_unit_in_bits(ATD_TYPE_IDX(base_attr_idx));
04777 }
04778
04779 for (i = 1; i <= BD_RANK(bd_idx); i++) {
04780
04781 bit_offset += (index_array[i] - CN_INT_TO_C(BD_LB_IDX(bd_idx,i)))
04782 * CN_INT_TO_C(BD_SM_IDX(bd_idx,i))
04783 * sm_in_bits;
04784 }
04785
04786 if (single_value_const) {
04787 bit_offset = 0;
04788 cn_bit_offset = 0;
04789 }
04790
04791 if (exp_desc->type == Structure) {
04792
04793
04794
04795
04796 char_ptr = (char *) &(CN_CONST(the_cn_idx))
04797 + (the_cn_bit_offset/CHAR_BIT);
04798
04799 the_cn_bit_offset += num_bits;
04800
04801 char_ptr2 = (char *)&(CN_CONST(base_cn_idx))
04802 + ((cn_bit_offset + bit_offset)/CHAR_BIT);
04803
04804 char_len = num_bits/CHAR_BIT;
04805
04806 for (i = 0; i < char_len; i++) {
04807 char_ptr[i] = char_ptr2[i];
04808 }
04809 }
04810 else {
04811
04812 if (exp_desc->type == Character) {
04813 char_result_offset = 0;
04814
04815 if ((char_result_offset + char_len) >= char_result_buffer_len) {
04816
04817 enlarge_char_result_buffer();
04818 }
04819
04820 for (i = 0; i < char_len; i++) {
04821 char_result_buffer[i] = *((char *)&(CN_CONST(base_cn_idx))
04822 + ((cn_bit_offset + bit_offset)/CHAR_BIT) + i);
04823 }
04824 }
04825 else {
04826 # if 0
04827
04828 # if defined(_TARGET64)
04829 if (exp_desc->linear_type == Complex_4 &&
04830 num_bits == TARGET_BITS_PER_WORD) {
04831
04832 if (single_value_const) {
04833 result_value[0] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx));
04834 result_value[1] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx)+1);
04835 }
04836 else {
04837
04838
04839
04840 word_offset = bit_offset/TARGET_BITS_PER_WORD;
04841
04842 unpack_int64_to_int32 (
04843 CP_CONSTANT(CN_POOL_IDX(base_cn_idx) + word_offset), result_value );
04844 }
04845 }
04846 else
04847 # endif
04848 # endif
04849 if (single_value_const &&
04850 num_bits < TARGET_BITS_PER_WORD &&
04851 (exp_desc->type == Integer ||
04852 exp_desc->type == Real ||
04853 exp_desc->type == Logical)) {
04854
04855 result_value[0] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx));
04856 }
04857 else if (num_bits % TARGET_BITS_PER_WORD != 0) {
04858
04859 word_offset = (cn_bit_offset + bit_offset)/
04860 TARGET_BITS_PER_WORD;
04861
04862 result_value[0] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx) +
04863 word_offset);
04864
04865 # if defined(_HOST_LITTLE_ENDIAN) && defined(_TARGET_LITTLE_ENDIAN)
04866 result_value[0] = result_value[0] >>
04867 ((cn_bit_offset + bit_offset) % TARGET_BITS_PER_WORD);
04868 if (num_bits == 8) {
04869 result_value[0] = result_value[0] & 0XFF;
04870 }
04871 else if (num_bits == 16) {
04872 result_value[0] = result_value[0] & 0XFFFF;
04873 }
04874 else if (num_bits == 32) {
04875 result_value[0] = result_value[0] & 0XFFFFFFFF;
04876 }
04877 # else
04878
04879
04880 result_value[0] = result_value[0] <<
04881 ((cn_bit_offset + bit_offset) % TARGET_BITS_PER_WORD);
04882
04883
04884 result_value[0] = result_value[0] >>
04885 (TARGET_BITS_PER_WORD - num_bits);
04886 # endif
04887 }
04888 else {
04889
04890 word_offset = (cn_bit_offset + bit_offset)/
04891 TARGET_BITS_PER_WORD;
04892 num_words = num_bits/TARGET_BITS_PER_WORD;
04893
04894 for (i = 0; i < num_words; i++) {
04895 result_value[i] = CP_CONSTANT(CN_POOL_IDX(base_cn_idx) +
04896 word_offset + i);
04897 }
04898 }
04899 }
04900
04901 write_constant(exp_desc->type_idx);
04902
04903 }
04904
04905
04906
04907 i = 1;
04908 while (i <= BD_RANK(bd_idx)) {
04909
04910 if (! rank_array[i]) {
04911
04912 }
04913 else if (is_vec_subscript[i]) {
04914
04915 if (start_array[i] > 0) {
04916 COPY_OPND(opnd, IL_OPND(end_array[i]));
04917 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04918 &(start_array[i]));
04919 index_array[i] =
04920 F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04921 break;
04922 }
04923 else if (i < BD_RANK(bd_idx)) {
04924 start_array[i] = 1;
04925 COPY_OPND(opnd, IL_OPND(end_array[i]));
04926 ok = interpret_constructor(&opnd, &loc_exp_desc, FALSE,
04927 &(start_array[i]));
04928 index_array[i] =
04929 F_INT_TO_C(result_value, loc_exp_desc.linear_type);
04930 }
04931 }
04932 else if (neg_stride[i]) {
04933
04934 if (index_array[i] + stride_array[i] >= end_array[i]) {
04935 index_array[i] += stride_array[i];
04936 break;
04937 }
04938 else {
04939 index_array[i] = start_array[i];
04940 }
04941 }
04942 else {
04943
04944 if (index_array[i] + stride_array[i] <= end_array[i]) {
04945 index_array[i] += stride_array[i];
04946 break;
04947 }
04948 else {
04949 index_array[i] = start_array[i];
04950 }
04951 }
04952
04953 i++;
04954
04955 if (i > BD_RANK(bd_idx)) {
04956 goto DONE;
04957 }
04958 }
04959 }
04960 }
04961
04962 DONE:
04963
04964 TRACE (Func_Exit, "interpret_ref", NULL);
04965
04966 return(ok);
04967
04968 }
04969
04970
04971
04972
04973
04974
04975
04976
04977
04978
04979
04980
04981
04982
04983
04984
04985
04986
04987 static void enlarge_char_result_buffer(void)
04988
04989 {
04990 long64 new_size;
04991
04992
04993 TRACE (Func_Entry, "enlarge_char_result_buffer", NULL);
04994
04995 new_size = char_result_buffer_len + 1024;
04996
04997 if (char_result_buffer_len == 0) {
04998
04999
05000
05001 MEM_ALLOC(char_result_buffer, char, new_size);
05002
05003 }
05004 else {
05005
05006 MEM_REALLOC(char_result_buffer, char, new_size);
05007
05008 }
05009
05010 char_result_buffer_len = new_size;
05011
05012 TRACE (Func_Exit, "enlarge_char_result_buffer", NULL);
05013
05014 return;
05015
05016 }
05017
05018
05019
05020
05021
05022
05023
05024
05025
05026
05027
05028
05029
05030
05031
05032
05033
05034
05035 static void broadcast_scalar(expr_arg_type *exp_desc,
05036 long64 num_elements)
05037
05038 {
05039 long64 bcast_cn_word_offset;
05040 long64 bits = 0;
05041 long64 bytes = 0;
05042 long64 char_num;
05043 char *char_ptr_1;
05044 char *char_ptr_2;
05045 long64 cn_word_offset;
05046 long64 i;
05047 long64 k;
05048 int type_idx;
05049 long64 words = 0;
05050
05051
05052 TRACE (Func_Entry, "broadcast_scalar", NULL);
05053
05054 if (check_type_conversion &&
05055 exp_desc->type != Character &&
05056 target_type_idx != exp_desc->type_idx) {
05057
05058 type_idx = target_type_idx;
05059 }
05060 else {
05061 type_idx = exp_desc->type_idx;
05062 }
05063
05064 switch (TYP_TYPE(type_idx)) {
05065 case Typeless :
05066 bits = TYP_BIT_LEN(type_idx);
05067 break;
05068
05069 case Integer :
05070 case Logical :
05071 case Real :
05072 case Complex :
05073 bits = storage_bit_size_tbl[TYP_LINEAR(type_idx)];
05074 break;
05075
05076 case Character:
05077 bits = CN_INT_TO_C(TYP_IDX(type_idx)) * CHAR_BIT;
05078 break;
05079
05080 case Structure :
05081 bits = CN_INT_TO_C(ATT_STRUCT_BIT_LEN_IDX(TYP_IDX(type_idx)));
05082 break;
05083 }
05084
05085 if (check_type_conversion && exp_desc->type == Character) {
05086 bits = CN_INT_TO_C(target_char_len_idx) * CHAR_BIT;
05087 }
05088
05089 if (bits % TARGET_BITS_PER_WORD != 0) {
05090 bytes = bits/CHAR_BIT;
05091 }
05092 else {
05093 words = TARGET_BITS_TO_WORDS(bits);
05094 }
05095
05096 if (words) {
05097 cn_word_offset = TARGET_BITS_TO_WORDS(the_cn_bit_offset);
05098 bcast_cn_word_offset = TARGET_BITS_TO_WORDS(bcast_cn_bit_offset);
05099
05100 for (k = 2; k <= num_elements; k++) {
05101 for (i = 0; i < words; i++) {
05102 CP_CONSTANT(CN_POOL_IDX(the_cn_idx) + cn_word_offset) =
05103 CP_CONSTANT(CN_POOL_IDX(the_cn_idx) + bcast_cn_word_offset + i);
05104 cn_word_offset++;
05105 }
05106 }
05107 }
05108 else {
05109 char_ptr_2 = (char *) &(CN_CONST(the_cn_idx)) +
05110 (the_cn_bit_offset/CHAR_BIT);
05111 char_ptr_1 = (char *) &(CN_CONST(the_cn_idx)) +
05112 + (bcast_cn_bit_offset/CHAR_BIT);
05113 char_num = 0;
05114
05115 for (k = 2; k <= num_elements; k++) {
05116 for (i = 0; i < bytes; i++) {
05117 char_ptr_2[char_num] = char_ptr_1[i];
05118 char_num++;
05119 }
05120 }
05121 }
05122
05123 the_cn_bit_offset += bits;
05124
05125 TRACE (Func_Exit, "broadcast_scalar", NULL);
05126
05127 return;
05128
05129 }
05130
05131
05132
05133
05134
05135
05136
05137
05138
05139
05140
05141
05142
05143
05144
05145
05146
05147 static boolean interpret_struct_construct_opr(int ir_idx,
05148 expr_arg_type *exp_desc,
05149 boolean count,
05150 long64 *element)
05151
05152 {
05153 int attr_idx;
05154 int bd_idx;
05155 long64 char_result_offset_l;
05156 expr_arg_type exp_desc_l;
05157 int i;
05158 int list_idx;
05159 long64 loc_bcast_cn_bit_offset;
05160 long64 loc_element = 0;
05161 long64 num;
05162 boolean ok = TRUE;
05163 opnd_type opnd;
05164 int opnd_column;
05165 int opnd_line;
05166 save_env_type save;
05167 int sn_idx;
05168 long64 start_cn_bit_offset;
05169
05170
05171 TRACE (Func_Entry, "interpret_struct_construct_opr", NULL);
05172
05173 save.check_type_conversion = check_type_conversion;
05174
05175
05176
05177
05178 bits_in_constructor += CN_INT_TO_C(ATT_STRUCT_BIT_LEN_IDX(
05179 IR_IDX_L(ir_idx)));
05180 save.bits_in_constructor = bits_in_constructor;
05181
05182 check_type_conversion = FALSE;
05183 save.target_type_idx = target_type_idx;
05184 save.target_char_len_idx = target_char_len_idx;
05185
05186 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
05187 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
05188 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
05189 list_idx = IR_IDX_R(ir_idx);
05190 sn_idx = ATT_FIRST_CPNT_IDX(IR_IDX_L(ir_idx));
05191
05192 start_cn_bit_offset = the_cn_bit_offset;
05193
05194 if (! count &&
05195 *element > 0) {
05196 *element = -1;
05197 }
05198
05199 while (list_idx) {
05200
05201 attr_idx = SN_ATTR_IDX(sn_idx);
05202
05203 if (! count) {
05204 the_cn_bit_offset = start_cn_bit_offset +
05205 CN_INT_TO_C(ATD_CPNT_OFFSET_IDX(attr_idx));
05206 }
05207
05208
05209 switch (TYP_TYPE(ATD_TYPE_IDX(attr_idx))) {
05210 case Integer:
05211 case Real:
05212 case Complex:
05213 case Logical:
05214 check_type_conversion = TRUE;
05215 target_type_idx = ATD_TYPE_IDX(attr_idx);
05216 break;
05217
05218 case Character:
05219 target_char_len_idx = TYP_IDX(ATD_TYPE_IDX(attr_idx));
05220 char_result_offset = 0;
05221 target_type_idx = Character_1;
05222 check_type_conversion = TRUE;
05223 break;
05224
05225 default:
05226 check_type_conversion = FALSE;
05227 break;
05228 }
05229
05230 if (IL_FLD(list_idx) == IR_Tbl_Idx &&
05231 IR_ARRAY_SYNTAX(IL_IDX(list_idx))) {
05232
05233 bd_idx = ATD_ARRAY_IDX(attr_idx);
05234
05235 COPY_OPND(opnd, IL_OPND(list_idx));
05236
05237 if (count) {
05238 loc_element = 1;
05239 ok &= interpret_constructor(&opnd, &exp_desc_l, count,
05240 &loc_element);
05241
05242
05243
05244 for (i = 0; i < BD_RANK(bd_idx); i++) {
05245
05246 if (fold_relationals(BD_XT_IDX(bd_idx, i + 1),
05247 exp_desc_l.shape[i].idx,
05248 Ne_Opr)) {
05249 find_opnd_line_and_column(&opnd,
05250 &opnd_line,
05251 &opnd_column);
05252
05253 PRINTMSG(opnd_line, 252, Error, opnd_column);
05254 ok = FALSE;
05255 break;
05256 }
05257 }
05258 }
05259 else {
05260 loc_element = 1;
05261 while (loc_element > 0) {
05262
05263 char_result_offset_l = char_result_offset;
05264 ok &= interpret_constructor(&opnd, &exp_desc_l, count,
05265 &loc_element);
05266
05267 char_result_offset = char_result_offset_l;
05268
05269 if (exp_desc_l.constant) {
05270 write_constant(exp_desc_l.type_idx);
05271 }
05272 }
05273 }
05274 }
05275 else {
05276
05277 loc_bcast_cn_bit_offset = the_cn_bit_offset;
05278
05279 char_result_offset_l = char_result_offset;
05280 COPY_OPND(opnd, IL_OPND(list_idx));
05281 ok = interpret_constructor(&opnd, &exp_desc_l, count,
05282 &loc_element) && ok;
05283
05284 char_result_offset = char_result_offset_l;
05285
05286 if (count) {
05287
05288 if (ATD_ARRAY_IDX(attr_idx)) {
05289
05290 bd_idx = ATD_ARRAY_IDX(attr_idx);
05291
05292 if (BD_RANK(bd_idx) == exp_desc_l.rank) {
05293
05294
05295 for (i = 0; i < BD_RANK(bd_idx); i++) {
05296
05297 if (fold_relationals(BD_XT_IDX(bd_idx, i + 1),
05298 exp_desc_l.shape[i].idx,
05299 Ne_Opr)) {
05300
05301 find_opnd_line_and_column(&opnd,
05302 &opnd_line,
05303 &opnd_column);
05304
05305 PRINTMSG(opnd_line, 252, Error,
05306 opnd_column);
05307 ok = FALSE;
05308 break;
05309 }
05310 }
05311 }
05312 }
05313 }
05314 else if (BD_ARRAY_CLASS(ATD_ARRAY_IDX(attr_idx)) == Deferred_Shape ||
05315 (ATD_ARRAY_IDX(attr_idx) &&
05316 compare_cn_and_value(BD_LEN_IDX(ATD_ARRAY_IDX(attr_idx)),
05317 0, Eq_Opr))) {
05318
05319
05320
05321
05322
05323
05324 }
05325 else {
05326
05327 if (exp_desc_l.constant) {
05328 write_constant(exp_desc_l.type_idx);
05329
05330 }
05331
05332 if (ATD_ARRAY_IDX(attr_idx) &&
05333 exp_desc_l.rank == 0) {
05334
05335 bcast_cn_bit_offset = loc_bcast_cn_bit_offset;
05336 num = CN_INT_TO_C(BD_LEN_IDX(ATD_ARRAY_IDX(attr_idx)));
05337
05338 broadcast_scalar(&exp_desc_l, num);
05339 }
05340 }
05341 }
05342
05343 list_idx = IL_NEXT_LIST_IDX(list_idx);
05344 sn_idx = SN_SIBLING_LINK(sn_idx);
05345 }
05346
05347 check_type_conversion = save.check_type_conversion;
05348 target_type_idx = save.target_type_idx;
05349 target_char_len_idx = save.target_char_len_idx;
05350 bits_in_constructor = save.bits_in_constructor;
05351
05352 if (! count) {
05353 the_cn_bit_offset = start_cn_bit_offset +
05354 CN_INT_TO_C(ATT_STRUCT_BIT_LEN_IDX(TYP_IDX(exp_desc->type_idx)));
05355 }
05356
05357
05358 TRACE (Func_Exit, "interpret_struct_construct_opr", NULL);
05359
05360 return(ok);
05361
05362 }
05363
05364
05365
05366
05367
05368
05369
05370
05371
05372
05373
05374
05375
05376
05377
05378
05379
05380 static boolean interpret_array_construct_opr(int ir_idx,
05381 expr_arg_type *exp_desc,
05382 boolean count,
05383 long64 *element)
05384
05385 {
05386 long64 char_result_offset_l;
05387 int col;
05388 expr_arg_type exp_desc_l;
05389 #ifdef KEY
05390 long64 extent = 0;
05391 #else
05392 long64 extent;
05393 #endif
05394 int i;
05395 int line;
05396 int list_idx;
05397 long64 loc_element = 0;
05398 long64 longest_char_len = 0;
05399 boolean ok = TRUE;
05400 opnd_type opnd;
05401 int position_idx;
05402 long64 sub_elements;
05403
05404
05405 TRACE (Func_Entry, "interpret_array_construct_opr", NULL);
05406
05407 line = IR_LINE_NUM(ir_idx);
05408 col = IR_COL_NUM(ir_idx);
05409
05410 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
05411 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
05412 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
05413
05414 if (*element > 0) {
05415
05416 loc_element = 1;
05417
05418 if (count) {
05419 extent = 0L;
05420
05421 list_idx = IR_IDX_R(ir_idx);
05422 while (list_idx) {
05423
05424 COPY_OPND(opnd, IL_OPND(list_idx));
05425 ok = interpret_constructor(&opnd, &exp_desc_l, count,
05426 &loc_element) && ok;
05427
05428 sub_elements = 1;
05429
05430 if (exp_desc_l.type == Character &&
05431 char_result_len > longest_char_len) {
05432
05433 if (longest_char_len != 0) {
05434 unequal_char_lens = TRUE;
05435 }
05436 longest_char_len = char_result_len;
05437 }
05438
05439 if (exp_desc_l.rank == 0) {
05440 extent++;
05441 }
05442 else {
05443
05444 for (i = 0; i < exp_desc_l.rank; i++) {
05445 if (exp_desc_l.shape[i].fld == CN_Tbl_Idx) {
05446 sub_elements *= CN_INT_TO_C(exp_desc_l.shape[i].idx);
05447 }
05448 else {
05449 break;
05450 }
05451 }
05452 extent += sub_elements;
05453 }
05454
05455 *element += sub_elements;
05456 list_idx = IL_NEXT_LIST_IDX(list_idx);
05457 }
05458 }
05459 else {
05460
05461
05462
05463
05464
05465
05466
05467
05468
05469
05470
05471
05472
05473
05474
05475
05476
05477
05478
05479
05480
05481
05482 if (*element == 1) {
05483 NTR_IR_LIST_TBL(position_idx);
05484 IR_IDX_L(ir_idx) = position_idx;
05485 IL_NEXT_LIST_IDX(position_idx) = IR_IDX_R(ir_idx);
05486 IL_ELEMENT(position_idx) = 1;
05487 }
05488 else {
05489 position_idx = IR_IDX_L(ir_idx);
05490 # ifdef _DEBUG
05491 if (position_idx == NULL_IDX) {
05492 PRINTMSG(line, 983, Internal, col);
05493 }
05494 # endif
05495 }
05496
05497 char_result_offset_l = char_result_offset;
05498 COPY_OPND(opnd, IL_OPND(IL_NEXT_LIST_IDX(position_idx)));
05499 loc_element = (int) (IL_ELEMENT(position_idx));
05500 ok = interpret_constructor(&opnd, &exp_desc_l, count,
05501 &loc_element) && ok;
05502
05503 char_result_offset = char_result_offset_l;
05504
05505 if (loc_element < 0) {
05506 if (IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(position_idx))) {
05507 IL_NEXT_LIST_IDX(position_idx) =
05508 IL_NEXT_LIST_IDX(IL_NEXT_LIST_IDX(position_idx));
05509 IL_ELEMENT(position_idx) = 1;
05510 (*element)++;
05511 }
05512 else {
05513 *element = -1;
05514 FREE_IR_LIST_NODE(position_idx);
05515 IR_IDX_L(ir_idx) = NULL_IDX;
05516 }
05517 }
05518 else {
05519 IL_ELEMENT(position_idx)++;
05520 (*element)++;
05521 }
05522 }
05523 }
05524 else {
05525
05526
05527
05528 extent = 0L;
05529
05530 list_idx = IR_IDX_R(ir_idx);
05531 while (list_idx) {
05532
05533 COPY_OPND(opnd, IL_OPND(list_idx));
05534
05535 if (IL_FLD(list_idx) == IR_Tbl_Idx &&
05536 IR_ARRAY_SYNTAX(IL_IDX(list_idx))) {
05537
05538
05539
05540 loc_element = 1;
05541
05542 if (count) {
05543
05544 ok = interpret_constructor(&opnd, &exp_desc_l, count,
05545 &loc_element) && ok;
05546
05547 sub_elements = 1;
05548
05549 if (exp_desc_l.rank == 0) {
05550 extent++;
05551 }
05552 else {
05553
05554 for (i = 0; i < exp_desc_l.rank; i++) {
05555 if (exp_desc_l.shape[i].fld == CN_Tbl_Idx) {
05556 sub_elements *= CN_INT_TO_C(exp_desc_l.shape[i].idx);
05557 }
05558 else {
05559 break;
05560 }
05561 }
05562 extent += sub_elements;
05563 }
05564
05565 if (exp_desc_l.type == Character) {
05566 if (char_result_len > longest_char_len) {
05567
05568 if (longest_char_len != 0) {
05569 unequal_char_lens = TRUE;
05570 }
05571 longest_char_len = char_result_len;
05572 }
05573 }
05574 else if (exp_desc_l.constant) {
05575 increment_count(&exp_desc_l);
05576 }
05577 }
05578 else {
05579
05580
05581
05582 loc_element = 1;
05583 while (loc_element >= 0) {
05584 char_result_offset_l = char_result_offset;
05585 ok = interpret_constructor(&opnd, &exp_desc_l,
05586 count, &loc_element) && ok;
05587
05588 char_result_offset = char_result_offset_l;
05589
05590 if (exp_desc_l.constant) {
05591
05592 write_constant(exp_desc_l.type_idx);
05593 }
05594 }
05595 }
05596 }
05597 else {
05598
05599
05600
05601 loc_element = 0;
05602
05603 char_result_offset_l = char_result_offset;
05604 COPY_OPND(opnd, IL_OPND(list_idx));
05605 ok = interpret_constructor(&opnd, &exp_desc_l, count,
05606 &loc_element) && ok;
05607
05608 char_result_offset = char_result_offset_l;
05609
05610 if (count) {
05611 sub_elements = 1;
05612
05613 if (exp_desc_l.rank == 0) {
05614 extent++;
05615 }
05616 else {
05617
05618 for (i = 0; i < exp_desc_l.rank; i++) {
05619 if (exp_desc_l.shape[i].fld == CN_Tbl_Idx) {
05620 sub_elements *= CN_INT_TO_C(exp_desc_l.shape[i].idx);
05621 }
05622 else {
05623 break;
05624 }
05625 }
05626 extent += sub_elements;
05627 }
05628
05629 if (exp_desc_l.type == Character) {
05630 if (char_result_len > longest_char_len) {
05631
05632 if (longest_char_len != 0) {
05633 unequal_char_lens = TRUE;
05634 }
05635 longest_char_len = char_result_len;
05636 }
05637 }
05638 else if (exp_desc_l.constant) {
05639 increment_count(&exp_desc_l);
05640 }
05641
05642 }
05643 else {
05644 if (exp_desc_l.constant) {
05645
05646 write_constant(exp_desc_l.type_idx);
05647 }
05648 }
05649 }
05650
05651 list_idx = IL_NEXT_LIST_IDX(list_idx);
05652 }
05653 }
05654
05655 exp_desc->rank = 1;
05656
05657 if (count) {
05658 exp_desc->shape[0].fld = CN_Tbl_Idx;
05659 exp_desc->shape[0].idx = C_INT_TO_CN(NULL_IDX, extent);
05660
05661 if (exp_desc->type == Character) {
05662 char_result_len = longest_char_len;
05663 if (*element == 0) {
05664 increment_count(exp_desc);
05665 }
05666 }
05667 }
05668
05669
05670 TRACE (Func_Exit, "interpret_array_construct_opr", NULL);
05671
05672 return(ok);
05673
05674 }
05675
05676
05677
05678
05679
05680
05681
05682
05683
05684
05685
05686
05687
05688
05689
05690
05691
05692 static boolean interpret_unary_opr(int ir_idx,
05693 expr_arg_type *exp_desc,
05694 boolean count,
05695 long64 *element)
05696
05697 {
05698 int col;
05699 expr_arg_type exp_desc_l;
05700 int i;
05701 int line;
05702 long_type loc_value_l[MAX_WORDS_FOR_NUMERIC];
05703 boolean ok = TRUE;
05704 opnd_type opnd;
05705 int type_idx;
05706
05707
05708 TRACE (Func_Entry, "interpret_unary_opr", NULL);
05709
05710 line = IR_LINE_NUM(ir_idx);
05711 col = IR_COL_NUM(ir_idx);
05712
05713 if (IR_FLD_L(ir_idx) == IL_Tbl_Idx) {
05714 COPY_OPND(opnd, IL_OPND(IR_IDX_L(ir_idx)));
05715 }
05716 else {
05717 COPY_OPND(opnd, IR_OPND_L(ir_idx));
05718 }
05719
05720 if (count) {
05721 if (IR_RANK(ir_idx) == 0) {
05722 exp_desc->constant = TRUE;
05723
05724 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
05725 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
05726
05727 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
05728
05729 }
05730 else {
05731
05732 ok = interpret_constructor(&opnd, exp_desc, count,
05733 element);
05734 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
05735 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
05736
05737 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
05738 }
05739 }
05740 else {
05741 ok = interpret_constructor(&opnd, &exp_desc_l, count,
05742 element);
05743 exp_desc->constant = TRUE;
05744
05745 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
05746 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
05747
05748 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
05749
05750 if (IR_OPR(ir_idx) != Uplus_Opr && ! no_result_value) {
05751
05752 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
05753 loc_value_l[i] = result_value[i];
05754 }
05755
05756 type_idx = exp_desc->type_idx;
05757
05758 ok &= folder_driver((char *)loc_value_l,
05759 exp_desc_l.type_idx,
05760 NULL,
05761 NULL_IDX,
05762 result_value,
05763 &type_idx,
05764 line,
05765 col,
05766 1,
05767 IR_OPR(ir_idx));
05768
05769 exp_desc->type_idx = type_idx;
05770
05771 }
05772 }
05773
05774 TRACE (Func_Exit, "interpret_unary_opr", NULL);
05775
05776 return(ok);
05777
05778 }
05779
05780
05781
05782
05783
05784
05785
05786
05787
05788
05789
05790
05791
05792
05793
05794
05795
05796 static boolean interpret_binary_opr(int ir_idx,
05797 expr_arg_type *exp_desc,
05798 boolean count,
05799 long64 *element)
05800
05801
05802 {
05803 long64 char_result_len_l;
05804 long64 char_result_len_r;
05805 long64 char_result_offset_l;
05806 long64 char_result_offset_r;
05807 int col;
05808 expr_arg_type exp_desc_l;
05809 expr_arg_type exp_desc_r;
05810 int i;
05811 int line;
05812 long64 loc_element_l = 0;
05813 long64 loc_element_r = 0;
05814 boolean loc_no_result_value = FALSE;
05815 long_type loc_value_l[MAX_WORDS_FOR_NUMERIC];
05816 long_type loc_value_r[MAX_WORDS_FOR_NUMERIC];
05817 boolean ok = TRUE;
05818 opnd_type opnd_l;
05819 opnd_type opnd_r;
05820 int type_idx;
05821
05822
05823 TRACE (Func_Entry, "interpret_binary_opr", NULL);
05824
05825 line = IR_LINE_NUM(ir_idx);
05826 col = IR_COL_NUM(ir_idx);
05827
05828 if (IR_FLD_L(ir_idx) == IL_Tbl_Idx) {
05829
05830 COPY_OPND(opnd_l, IL_OPND(IR_IDX_L(ir_idx)));
05831 COPY_OPND(opnd_r, IL_OPND(IL_NEXT_LIST_IDX(IR_IDX_L(ir_idx))));
05832
05833 }
05834 else {
05835 COPY_OPND(opnd_l, IR_OPND_L(ir_idx));
05836 COPY_OPND(opnd_r, IR_OPND_R(ir_idx));
05837 }
05838
05839 if (count) {
05840 if (IR_RANK(ir_idx) == 0) {
05841 exp_desc->constant = TRUE;
05842
05843 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
05844 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
05845
05846 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
05847
05848 }
05849 else {
05850
05851 exp_desc->constant = TRUE;
05852
05853 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
05854 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
05855
05856 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
05857
05858 loc_element_l = *element;
05859 ok = interpret_constructor(&opnd_l, &exp_desc_l, count,
05860 &loc_element_l);
05861
05862 loc_element_l = *element;
05863 ok &= interpret_constructor(&opnd_r, &exp_desc_r, count,
05864 &loc_element_l);
05865
05866
05867
05868 if (exp_desc_r.rank == exp_desc_l.rank) {
05869
05870 for (i = 0; i < exp_desc_r.rank; i++) {
05871
05872
05873 if (fold_relationals(OPND_IDX(exp_desc_l.shape[i]),
05874 OPND_IDX(exp_desc_r.shape[i]),
05875 Ne_Opr)) {
05876
05877
05878 PRINTMSG(line, 252, Error, col);
05879 ok = FALSE;
05880 break;
05881 }
05882 }
05883 exp_desc->rank = exp_desc_r.rank;
05884 COPY_SHAPE(exp_desc->shape,exp_desc_r.shape,
05885 exp_desc_r.rank);
05886 }
05887 else if (exp_desc_r.rank > exp_desc_l.rank) {
05888 exp_desc->rank = exp_desc_r.rank;
05889 COPY_SHAPE(exp_desc->shape,exp_desc_r.shape,
05890 exp_desc_r.rank);
05891 }
05892 else {
05893 exp_desc->rank = exp_desc_l.rank;
05894 COPY_SHAPE(exp_desc->shape,exp_desc_l.shape,
05895 exp_desc_l.rank);
05896 }
05897 }
05898 }
05899 else {
05900 exp_desc->constant = TRUE;
05901
05902 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
05903 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
05904
05905 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
05906
05907 char_result_offset_l = char_result_offset;
05908 loc_element_l = *element;
05909 ok = interpret_constructor(&opnd_l, &exp_desc_l, count, &loc_element_l);
05910
05911 char_result_len_l = char_result_len;
05912
05913 if (no_result_value) {
05914 loc_no_result_value = TRUE;
05915 }
05916
05917 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
05918 loc_value_l[i] = result_value[i];
05919 }
05920
05921 char_result_offset = char_result_offset_l + char_result_len;
05922 char_result_offset_r = char_result_offset;
05923 loc_element_r = *element;
05924 ok &= interpret_constructor(&opnd_r, &exp_desc_r, count, &loc_element_r);
05925
05926 char_result_len_r = char_result_len;
05927
05928 if (no_result_value) {
05929 loc_no_result_value = TRUE;
05930 }
05931
05932 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
05933 loc_value_r[i] = result_value[i];
05934 }
05935
05936 *element = (loc_element_r > loc_element_l) ?
05937 loc_element_r : loc_element_l;
05938
05939 if (loc_no_result_value) {
05940 goto EXIT;
05941 }
05942
05943 if (exp_desc_l.type == Character &&
05944 exp_desc_r.type == Character) {
05945
05946 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
05947 TYP_TYPE(TYP_WORK_IDX) = Character;
05948 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
05949 TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
05950 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
05951 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
05952 char_result_len_l);
05953 exp_desc_l.type_idx = ntr_type_tbl();
05954
05955 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
05956 TYP_TYPE(TYP_WORK_IDX) = Character;
05957 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
05958 TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
05959 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
05960 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
05961 char_result_len_r);
05962 exp_desc_r.type_idx = ntr_type_tbl();
05963
05964 type_idx = exp_desc->type_idx;
05965
05966 ok &= folder_driver(&(char_result_buffer[char_result_offset_l]),
05967 exp_desc_l.type_idx,
05968 &(char_result_buffer[char_result_offset_r]),
05969 exp_desc_r.type_idx,
05970 result_value,
05971 &type_idx,
05972 line,
05973 col,
05974 2,
05975 IR_OPR(ir_idx));
05976
05977 exp_desc->type_idx = type_idx;
05978 }
05979 else {
05980 type_idx = exp_desc->type_idx;
05981
05982 ok &= folder_driver((char *)loc_value_l,
05983 exp_desc_l.type_idx,
05984 (char *)loc_value_r,
05985 exp_desc_r.type_idx,
05986 result_value,
05987 &type_idx,
05988 line,
05989 col,
05990 2,
05991 IR_OPR(ir_idx));
05992
05993 exp_desc->type_idx = type_idx;
05994 }
05995
05996
05997 char_result_offset = char_result_offset_l;
05998 }
05999
06000 EXIT:
06001
06002 TRACE (Func_Exit, "interpret_binary_opr", NULL);
06003
06004 return(ok);
06005
06006 }
06007
06008
06009
06010
06011
06012
06013
06014
06015
06016
06017
06018
06019
06020
06021
06022
06023
06024 static boolean interpret_concat_opr(int ir_idx,
06025 expr_arg_type *exp_desc,
06026 boolean count,
06027 long64 *element)
06028
06029 {
06030 long64 char_result_offset_l;
06031 expr_arg_type exp_desc_l;
06032 expr_arg_type exp_desc_r;
06033 int i;
06034 int list_idx;
06035 long64 loc_element_l = 0;
06036 long64 loc_element_r = 0;
06037 long64 longest_char_len = 0;
06038 boolean ok = TRUE;
06039 opnd_type opnd;
06040
06041
06042 TRACE (Func_Entry, "interpret_concat_opr", NULL);
06043
06044 exp_desc->constant = TRUE;
06045
06046 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
06047 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
06048
06049 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
06050
06051 if (exp_desc->type == Character &&
06052 IR_RANK(ir_idx) == 0 &&
06053 compare_cn_and_value(TYP_IDX(exp_desc->type_idx),
06054 MAX_CHARS_IN_TYPELESS,
06055 Le_Opr)) {
06056 exp_desc->linear_type = Short_Char_Const;
06057 }
06058
06059 if (count) {
06060 longest_char_len = 0;
06061 list_idx = IR_IDX_L(ir_idx);
06062
06063 while (list_idx) {
06064
06065 COPY_OPND(opnd, IL_OPND(list_idx));
06066 loc_element_l = *element;
06067 ok = interpret_constructor(&opnd, &exp_desc_l, count,
06068 &loc_element_l);
06069
06070 longest_char_len += char_result_len;
06071
06072 if (list_idx == IR_IDX_L(ir_idx)) {
06073 exp_desc_r = exp_desc_l;
06074 }
06075 else {
06076
06077 if (exp_desc_r.rank == exp_desc_l.rank) {
06078
06079 for (i = 0; i < exp_desc_r.rank; i++) {
06080
06081
06082 if (fold_relationals(OPND_IDX(exp_desc_l.shape[i]),
06083 OPND_IDX(exp_desc_r.shape[i]),
06084 Ne_Opr)) {
06085
06086
06087 PRINTMSG(IR_LINE_NUM(ir_idx), 252, Error,
06088 IR_COL_NUM(ir_idx));
06089 ok = FALSE;
06090 break;
06091 }
06092 }
06093 exp_desc->rank = exp_desc_r.rank;
06094 COPY_SHAPE(exp_desc->shape,exp_desc_r.shape,
06095 exp_desc_r.rank);
06096 }
06097 else if (exp_desc_r.rank > exp_desc_l.rank) {
06098 exp_desc->rank = exp_desc_r.rank;
06099 COPY_SHAPE(exp_desc->shape,exp_desc_r.shape,
06100 exp_desc_r.rank);
06101 }
06102 else {
06103 exp_desc->rank = exp_desc_l.rank;
06104 COPY_SHAPE(exp_desc->shape,exp_desc_l.shape,
06105 exp_desc_l.rank);
06106 exp_desc_r = exp_desc_l;
06107 }
06108 }
06109
06110 list_idx = IL_NEXT_LIST_IDX(list_idx);
06111 }
06112
06113 char_result_len = longest_char_len;
06114 }
06115 else {
06116
06117 char_result_offset_l = char_result_offset;
06118 longest_char_len = 0;
06119
06120 list_idx = IR_IDX_L(ir_idx);
06121
06122 if (*element > 0) {
06123 loc_element_r = -1;
06124 }
06125 else {
06126 loc_element_r = 0;
06127 }
06128
06129 while (list_idx) {
06130
06131 char_result_offset = char_result_offset_l + longest_char_len;
06132 COPY_OPND(opnd, IL_OPND(list_idx));
06133 loc_element_l = *element;
06134 ok = interpret_constructor(&opnd, &exp_desc_l, count,
06135 &loc_element_l);
06136
06137 longest_char_len += char_result_len;
06138
06139 if (loc_element_l > loc_element_r) {
06140 loc_element_r = loc_element_l;
06141 }
06142
06143 list_idx = IL_NEXT_LIST_IDX(list_idx);
06144 }
06145
06146 char_result_len = longest_char_len;
06147 char_result_offset = char_result_offset_l;
06148 *element = loc_element_r;
06149 }
06150
06151
06152 TRACE (Func_Exit, "interpret_concat_opr", NULL);
06153
06154 return(ok);
06155
06156 }
06157
06158
06159
06160
06161
06162
06163
06164
06165
06166
06167
06168
06169
06170
06171
06172
06173
06174 static boolean interpret_trim_intrinsic(int ir_idx,
06175 expr_arg_type *exp_desc,
06176 boolean count,
06177 long64 *element)
06178
06179 {
06180 long64 char_result_offset_l;
06181 expr_arg_type exp_desc_l;
06182 int ir2_idx;
06183 long64 loc_element = 0;
06184 boolean ok = TRUE;
06185 opnd_type opnd;
06186
06187
06188 TRACE (Func_Entry, "interpret_trim_intrinsic", NULL);
06189
06190 exp_desc->constant = TRUE;
06191 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
06192 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
06193
06194 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
06195
06196 if (count) {
06197
06198 NTR_IR_TBL(ir2_idx);
06199 IR_OPR(ir2_idx) = Len_Trim_Opr;
06200 IR_TYPE_IDX(ir2_idx) = CG_INTEGER_DEFAULT_TYPE;
06201
06202 copy_subtree(&IL_OPND(IR_IDX_R(ir_idx)), &opnd);
06203 COPY_OPND(IR_OPND_L(ir2_idx), opnd);
06204
06205 OPND_FLD(opnd) = IR_Tbl_Idx;
06206 OPND_IDX(opnd) = ir2_idx;
06207
06208 loc_element = 0;
06209 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
06210 &loc_element);
06211
06212 char_result_len = F_INT_TO_C(result_value, exp_desc_l.linear_type);
06213 if (char_result_len < 0) {
06214 char_result_len = 0;
06215 }
06216 }
06217 else {
06218
06219 loc_element = 0;
06220 char_result_offset_l = char_result_offset;
06221 COPY_OPND(opnd, IL_OPND(IR_IDX_R(ir_idx)));
06222 ok = interpret_constructor(&opnd, &exp_desc_l, count,
06223 &loc_element);
06224
06225 while (char_result_len > 0 &&
06226 char_result_buffer[char_result_offset_l +
06227 char_result_len - 1] == ' ') {
06228
06229 char_result_len--;
06230 char_result_offset--;
06231 }
06232
06233 if (*element > 0) {
06234 *element = -1;
06235 }
06236 }
06237
06238
06239 TRACE (Func_Exit, "interpret_trim_intrinsic", NULL);
06240
06241 return(ok);
06242
06243 }
06244
06245
06246
06247
06248
06249
06250
06251
06252
06253
06254
06255
06256
06257
06258
06259
06260
06261 static boolean interpret_adjustl_intrinsic(int ir_idx,
06262 expr_arg_type *exp_desc,
06263 boolean count,
06264 long64 *element)
06265
06266 {
06267 long64 char_result_len_l;
06268 long64 char_result_offset_l;
06269 int col;
06270 expr_arg_type exp_desc_l;
06271 int line;
06272 long_type loc_value_l[MAX_WORDS_FOR_NUMERIC];
06273 boolean ok = TRUE;
06274 opnd_type opnd;
06275 int spec_idx;
06276 opnd_type tmp_opnd;
06277 int type_idx;
06278
06279
06280 TRACE (Func_Entry, "interpret_adjustl_intrinsic", NULL);
06281
06282 spec_idx = IR_IDX_L(ir_idx);
06283 line = IR_LINE_NUM(ir_idx);
06284 col = IR_COL_NUM(ir_idx);
06285
06286 COPY_OPND(opnd, IL_OPND(IR_IDX_R(ir_idx)));
06287
06288 exp_desc->constant = TRUE;
06289 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
06290 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
06291
06292 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
06293
06294 if (count) {
06295
06296 ok = interpret_constructor(&opnd, exp_desc, count,
06297 element);
06298
06299 }
06300 else {
06301
06302 char_result_offset_l = char_result_offset;
06303 ok = interpret_constructor(&opnd, &exp_desc_l, count,
06304 element);
06305
06306 char_result_offset = char_result_offset_l;
06307 char_result_len_l = char_result_len;
06308
06309 *(exp_desc) = exp_desc_l;
06310
06311 exp_desc->constant = TRUE;
06312
06313 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
06314 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
06315
06316 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
06317
06318 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
06319 TYP_TYPE(TYP_WORK_IDX) = Character;
06320 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
06321 TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
06322 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
06323 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
06324 char_result_len_l);
06325 type_idx = ntr_type_tbl();
06326
06327 exp_desc->type_idx = type_idx;
06328
06329 ok = folder_driver(&(char_result_buffer[char_result_offset_l]),
06330 type_idx,
06331 NULL,
06332 NULL_IDX,
06333 loc_value_l,
06334 &type_idx,
06335 line,
06336 col,
06337 1,
06338 (ATP_INTRIN_ENUM(spec_idx) == Adjustl_Intrinsic ?
06339 Adjustl_Opr : Adjustr_Opr));
06340
06341
06342 OPND_FLD(tmp_opnd) = CN_Tbl_Idx;
06343 OPND_IDX(tmp_opnd) = loc_value_l[0];
06344 OPND_LINE_NUM(tmp_opnd) = line;
06345 OPND_COL_NUM(tmp_opnd) = col;
06346
06347 char_result_offset = char_result_offset_l;
06348
06349 ok = interpret_constructor(&tmp_opnd, exp_desc, FALSE,
06350 element);
06351
06352 exp_desc->type_idx = type_idx;
06353 exp_desc->linear_type = TYP_LINEAR(type_idx);
06354
06355 }
06356
06357 TRACE (Func_Exit, "interpret_adjustl_intrinsic", NULL);
06358
06359 return(ok);
06360
06361 }
06362
06363
06364
06365
06366
06367
06368
06369
06370
06371
06372
06373
06374
06375
06376
06377
06378
06379 static boolean interpret_repeat_intrinsic(int ir_idx,
06380 expr_arg_type *exp_desc,
06381 boolean count,
06382 long64 *element)
06383
06384
06385 {
06386 char *char_ptr;
06387 long64 char_result_offset_l;
06388 int cn_idx;
06389 expr_arg_type exp_desc_l;
06390 long64 i;
06391 int info_idx;
06392 int ir2_idx;
06393 long64 k;
06394 int list_idx;
06395 long64 loc_element = 0;
06396 boolean ok = TRUE;
06397 opnd_type opnd;
06398
06399
06400 TRACE (Func_Entry, "interpret_repeat_intrinsic", NULL);
06401
06402 exp_desc->constant = TRUE;
06403 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
06404 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
06405
06406 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
06407
06408 if (count) {
06409
06410 info_idx = IL_ARG_DESC_IDX(IR_IDX_R(ir_idx));
06411 list_idx = IL_NEXT_LIST_IDX(IR_IDX_R(ir_idx));
06412
06413 NTR_IR_TBL(ir2_idx);
06414 IR_OPR(ir2_idx) = Mult_Opr;
06415 IR_TYPE_IDX(ir2_idx) = CG_INTEGER_DEFAULT_TYPE;
06416
06417 copy_subtree(&(arg_info_list[info_idx].ed.char_len), &opnd);
06418 COPY_OPND(IR_OPND_L(ir2_idx), opnd);
06419
06420 copy_subtree(&IL_OPND(list_idx), &opnd);
06421 COPY_OPND(IR_OPND_R(ir2_idx), opnd);
06422
06423 IR_LINE_NUM_R(ir2_idx) = stmt_start_line;
06424 IR_COL_NUM_R(ir2_idx) = stmt_start_col;
06425
06426 OPND_FLD(opnd) = IR_Tbl_Idx;
06427 OPND_IDX(opnd) = ir2_idx;
06428
06429 loc_element = 0;
06430 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
06431 &loc_element);
06432
06433 char_result_len = F_INT_TO_C(result_value, exp_desc_l.linear_type);
06434 if (char_result_len < 0) {
06435 char_result_len = 0;
06436 }
06437 }
06438 else {
06439
06440 loc_element = 0;
06441 char_result_offset_l = char_result_offset;
06442 COPY_OPND(opnd, IL_OPND(IR_IDX_R(ir_idx)));
06443 ok = interpret_constructor(&opnd, &exp_desc_l, count,
06444 &loc_element);
06445
06446 loc_element = 0;
06447 COPY_OPND(opnd,
06448 IL_OPND(IL_NEXT_LIST_IDX(IR_IDX_R(ir_idx))));
06449 ok = interpret_constructor(&opnd, &exp_desc_l, count,
06450 &loc_element);
06451
06452 while ((char_result_offset_l + ((F_INT_TO_C(result_value,
06453 exp_desc_l.linear_type) - 1)
06454 * char_result_len)) >=
06455 char_result_buffer_len) {
06456
06457 enlarge_char_result_buffer();
06458 }
06459
06460 char_ptr = &(char_result_buffer[char_result_offset_l +
06461 char_result_len]);
06462
06463
06464 cn_idx = 0;
06465
06466 for (k = 1; k < F_INT_TO_C(result_value, exp_desc_l.linear_type); k++) {
06467
06468 for (i = 0; i < char_result_len; i++) {
06469 char_ptr[cn_idx] = char_result_buffer[i + char_result_offset_l];
06470 cn_idx++;
06471 char_result_offset++;
06472 }
06473 }
06474
06475 char_result_len = char_result_len *
06476 F_INT_TO_C(result_value, exp_desc_l.linear_type);
06477
06478 if (char_result_len < 0) {
06479 char_result_len = 0;
06480 }
06481
06482 if (*element > 0) {
06483 *element = -1;
06484 }
06485 }
06486
06487
06488 TRACE (Func_Exit, "interpret_repeat_intrinsic", NULL);
06489
06490 return(ok);
06491
06492 }
06493
06494
06495
06496
06497
06498
06499
06500
06501
06502
06503
06504
06505
06506
06507
06508
06509
06510 static boolean interpret_transfer_intrinsic(int ir_idx,
06511 expr_arg_type *exp_desc,
06512 boolean count,
06513 long64 *element)
06514
06515
06516 {
06517 int cn_idx;
06518 int col;
06519 int_dope_type dope_result;
06520 int_dope_type dope_1;
06521 int_dope_type dope_2;
06522 expr_arg_type exp_desc_l;
06523 long64 extent;
06524 long64 i;
06525 long64 k;
06526 int line;
06527 int list_idx;
06528 int list_idx1;
06529 int list_idx2;
06530 int list_idx3;
06531 long64 loc_element_l = 0;
06532 long64 longest_char_len = 0;
06533 boolean ok = TRUE;
06534 opnd_type opnd;
06535 save_env_type save;
06536 int tmp_idx;
06537 int type_idx;
06538 int type_idx1;
06539 int type_idx2;
06540 #ifdef KEY
06541 int type_idx3 = 0;
06542 #else
06543 int type_idx3;
06544 #endif
06545
06546
06547 TRACE (Func_Entry, "interpret_transfer_intrinsic", NULL);
06548
06549 line = IR_LINE_NUM(ir_idx);
06550 col = IR_COL_NUM(ir_idx);
06551
06552 exp_desc->constant = TRUE;
06553 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
06554 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
06555
06556 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
06557
06558 if (count) {
06559
06560 save.bits_in_constructor = bits_in_constructor;
06561
06562 list_idx1 = IR_IDX_R(ir_idx);
06563 list_idx2 = IL_NEXT_LIST_IDX(list_idx1);
06564 list_idx3 = IL_NEXT_LIST_IDX(list_idx2);
06565
06566 COPY_OPND(opnd, IL_OPND(list_idx2));
06567 loc_element_l = 0;
06568 ok = interpret_constructor(&opnd,
06569 &exp_desc_l,
06570 TRUE,
06571 &loc_element_l);
06572 bits_in_constructor = 0;
06573 exp_desc_l.rank = 0;
06574 increment_count(&exp_desc_l);
06575 k = bits_in_constructor;
06576
06577 longest_char_len = char_result_len;
06578
06579 if (IL_FLD(list_idx3) != NO_Tbl_Idx) {
06580
06581 COPY_OPND(opnd, IL_OPND(list_idx3));
06582 loc_element_l = 0;
06583 ok = interpret_constructor(&opnd,
06584 &exp_desc_l,
06585 FALSE,
06586 &loc_element_l);
06587
06588 exp_desc->rank = 1;
06589 exp_desc->shape[0].fld = CN_Tbl_Idx;
06590 exp_desc->shape[0].idx = ntr_const_tbl(CG_INTEGER_DEFAULT_TYPE,
06591 FALSE,
06592 result_value);
06593 }
06594 else if (arg_info_list[IL_ARG_DESC_IDX(list_idx2)].ed.rank) {
06595
06596 bits_in_constructor = 0;
06597 COPY_OPND(opnd, IL_OPND(list_idx1));
06598 loc_element_l = 0;
06599 ok = interpret_constructor(&opnd,
06600 &exp_desc_l,
06601 TRUE,
06602 &loc_element_l);
06603
06604 if (exp_desc_l.constant) {
06605 increment_count(&exp_desc_l);
06606 }
06607
06608 extent = bits_in_constructor/k;
06609
06610 if (bits_in_constructor%k != 0) {
06611 extent++;
06612 }
06613
06614 exp_desc->rank = 1;
06615 exp_desc->shape[0].fld = CN_Tbl_Idx;
06616 exp_desc->shape[0].idx = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
06617 extent);
06618 }
06619 else {
06620 exp_desc->rank = 0;
06621 }
06622
06623 char_result_len = longest_char_len;
06624 bits_in_constructor = save.bits_in_constructor;
06625 }
06626 else if (*element <= 1) {
06627
06628 SAVE_ENV;
06629 check_type_conversion = FALSE;
06630
06631 init_target_opnd = null_opnd;
06632 do_constructor_init = FALSE;
06633
06634 list_idx1 = IR_IDX_R(ir_idx);
06635 list_idx2 = IL_NEXT_LIST_IDX(list_idx1);
06636 list_idx3 = IL_NEXT_LIST_IDX(list_idx2);
06637
06638 COPY_OPND(opnd, IL_OPND(list_idx1));
06639
06640 gen_internal_dope_vector(&dope_1,
06641 &opnd,
06642 FALSE,
06643 &arg_info_list[IL_ARG_DESC_IDX(list_idx1)].ed);
06644
06645 type_idx1 = arg_info_list[IL_ARG_DESC_IDX(list_idx1)].ed.type_idx;
06646
06647 COPY_OPND(opnd, IL_OPND(list_idx2));
06648
06649 gen_internal_dope_vector(&dope_2,
06650 &opnd,
06651 FALSE,
06652 &arg_info_list[IL_ARG_DESC_IDX(list_idx2)].ed);
06653
06654 type_idx2 = arg_info_list[IL_ARG_DESC_IDX(list_idx2)].ed.type_idx;
06655
06656 if (IL_FLD(list_idx3) != NO_Tbl_Idx) {
06657 COPY_OPND(opnd, IL_OPND(list_idx3));
06658
06659 loc_element_l = 0;
06660 ok = interpret_constructor(&opnd,
06661 &arg_info_list[IL_ARG_DESC_IDX(list_idx3)].ed,
06662 FALSE,
06663 &loc_element_l);
06664
06665 type_idx3 = arg_info_list[IL_ARG_DESC_IDX(list_idx3)].ed.type_idx;
06666 }
06667
06668 gen_internal_dope_vector(&dope_result,
06669 &opnd,
06670 TRUE,
06671 &arg_info_list[IL_ARG_DESC_IDX(list_idx2)].ed);
06672
06673 type_idx = exp_desc->type_idx;
06674
06675 if (IL_FLD(list_idx3) == NO_Tbl_Idx) {
06676 ok &= folder_driver((char *)&dope_1,
06677 type_idx1,
06678 (char *)&dope_2,
06679 type_idx2,
06680 (long_type *)&dope_result,
06681 &type_idx,
06682 line,
06683 col,
06684 3,
06685 Transfer_Opr,
06686 0,
06687 0);
06688 }
06689 else {
06690 ok &= folder_driver((char *)&dope_1,
06691 type_idx1,
06692 (char *)&dope_2,
06693 type_idx2,
06694 (long_type *)&dope_result,
06695 &type_idx,
06696 line,
06697 col,
06698 3,
06699 Transfer_Opr,
06700 result_value,
06701 type_idx3);
06702 }
06703
06704 k = 1;
06705 for (i = 1; i <= dope_result.num_dims; i++) {
06706 k = k * dope_result.dim[i-1].extent;
06707 exp_desc->shape[i-1].fld = CN_Tbl_Idx;
06708 extent = dope_result.dim[i-1].extent;
06709 exp_desc->shape[i-1].idx = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
06710 extent);
06711 }
06712 k = k * dope_result.el_len;
06713
06714 if (char_len_in_bytes) {
06715 if (TYP_TYPE(IR_TYPE_IDX(ir_idx)) == Character) {
06716
06717 k *= CHAR_BIT;
06718 }
06719 }
06720
06721 exp_desc->rank = dope_result.num_dims;
06722
06723 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
06724 TYP_TYPE(TYP_WORK_IDX) = Typeless;
06725 TYP_LINEAR(TYP_WORK_IDX) = Long_Typeless;
06726 TYP_BIT_LEN(TYP_WORK_IDX) = k;
06727 type_idx = ntr_type_tbl();
06728
06729
06730
06731 cn_idx = ntr_const_tbl(type_idx,
06732 FALSE,
06733 (long_type *)(dope_result.base_addr));
06734
06735 tmp_idx = gen_compiler_tmp(line, col, Shared, TRUE);
06736 AT_SEMANTICS_DONE(tmp_idx) = TRUE;
06737 ATD_TYPE_IDX(tmp_idx) = IR_TYPE_IDX(ir_idx);
06738
06739 ATD_ARRAY_IDX(tmp_idx) = create_bd_ntry_for_const(exp_desc,
06740 line, col);
06741
06742 ATD_STOR_BLK_IDX(tmp_idx) = SCP_SB_STATIC_IDX(curr_scp_idx);
06743 ATD_FLD(tmp_idx) = CN_Tbl_Idx;
06744 ATD_TMP_IDX(tmp_idx) = cn_idx;
06745
06746 OPND_IDX(opnd) = tmp_idx;
06747 OPND_FLD(opnd) = AT_Tbl_Idx;
06748 OPND_LINE_NUM(opnd) = line;
06749 OPND_COL_NUM(opnd) = col;
06750
06751 if (exp_desc->rank) {
06752 ok = gen_whole_subscript(&opnd, exp_desc);
06753 }
06754 else if (exp_desc->type == Character) {
06755 ok = gen_whole_substring(&opnd,
06756 exp_desc->rank);
06757 }
06758
06759 if (*element == 1) {
06760 NTR_IR_LIST_TBL(list_idx);
06761 IL_NEXT_LIST_IDX(list_idx) = IR_IDX_R(ir_idx);
06762 IR_IDX_R(ir_idx) = list_idx;
06763 (IR_LIST_CNT_R(ir_idx))++;
06764 COPY_OPND(IL_OPND(list_idx), opnd);
06765 }
06766
06767 RESTORE_ENV;
06768
06769 ok = interpret_constructor(&opnd,
06770 exp_desc,
06771 count,
06772 element);
06773 }
06774 else {
06775
06776 COPY_OPND(opnd, IL_OPND(IR_IDX_R(ir_idx)));
06777
06778 ok = interpret_constructor(&opnd,
06779 exp_desc,
06780 count,
06781 element);
06782
06783 if (*element < 0) {
06784 list_idx = IR_IDX_R(ir_idx);
06785 IR_IDX_R(ir_idx) = IL_NEXT_LIST_IDX(list_idx);
06786 (IR_LIST_CNT_R(ir_idx))--;
06787 FREE_IR_LIST_NODE(list_idx);
06788 }
06789 }
06790
06791
06792 TRACE (Func_Exit, "interpret_transfer_intrinsic", NULL);
06793
06794 return(ok);
06795
06796 }
06797
06798
06799
06800
06801
06802
06803
06804
06805
06806
06807
06808
06809
06810
06811
06812
06813
06814 static boolean interpret_reshape_intrinsic(int ir_idx,
06815 expr_arg_type *exp_desc,
06816 boolean count,
06817 long64 *element)
06818
06819
06820 {
06821 int cn_idx;
06822 int col;
06823 int_dope_type dope_result;
06824 int_dope_type dope_1;
06825 int_dope_type dope_2;
06826 int_dope_type dope_3;
06827 int_dope_type dope_4;
06828 expr_arg_type exp_desc_l;
06829 long64 extent;
06830 long64 i;
06831 long64 k;
06832 int line;
06833 int list_idx;
06834 long64 loc_element = 0;
06835 boolean ok = TRUE;
06836 opnd_type opnd;
06837 save_env_type save;
06838 int tmp_idx;
06839 int type_idx;
06840 int type_idx1;
06841 int type_idx2;
06842 #ifdef KEY
06843 int type_idx3 = 0;
06844 int type_idx4 = 0;
06845 #else
06846 int type_idx3;
06847 int type_idx4;
06848 #endif
06849
06850
06851
06852 TRACE (Func_Entry, "interpret_reshape_intrinsic", NULL);
06853
06854 line = IR_LINE_NUM(ir_idx);
06855 col = IR_COL_NUM(ir_idx);
06856
06857 exp_desc->constant = TRUE;
06858 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
06859 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
06860
06861 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
06862
06863 if (count) {
06864
06865 COPY_OPND(opnd,
06866 IL_OPND(IL_NEXT_LIST_IDX(IR_IDX_R(ir_idx))));
06867
06868 loc_element = 1;
06869 exp_desc->rank = 0;
06870 while (loc_element > 0) {
06871
06872 exp_desc->rank++;
06873 ok = interpret_constructor(&opnd, &exp_desc_l, FALSE,
06874 &loc_element);
06875
06876 exp_desc->shape[exp_desc->rank-1].fld = CN_Tbl_Idx;
06877 exp_desc->shape[exp_desc->rank-1].idx =
06878 ntr_const_tbl(CG_INTEGER_DEFAULT_TYPE,
06879 FALSE,
06880 result_value);
06881 }
06882 }
06883 else if (*element <= 1) {
06884
06885 SAVE_ENV;
06886 check_type_conversion = FALSE;
06887
06888 init_target_opnd = null_opnd;
06889 do_constructor_init = FALSE;
06890
06891 list_idx = IR_IDX_R(ir_idx);
06892 COPY_OPND(opnd, IL_OPND(list_idx));
06893
06894 exp_desc_l = arg_info_list[IL_ARG_DESC_IDX(list_idx)].ed;
06895
06896 gen_internal_dope_vector(&dope_1,
06897 &opnd,
06898 FALSE,
06899 &exp_desc_l);
06900
06901 type_idx1 = exp_desc_l.type_idx;
06902
06903 list_idx = IL_NEXT_LIST_IDX(list_idx);
06904
06905 COPY_OPND(opnd, IL_OPND(list_idx));
06906
06907 gen_internal_dope_vector(&dope_2,
06908 &opnd,
06909 FALSE,
06910 &arg_info_list[IL_ARG_DESC_IDX(list_idx)].ed);
06911
06912 type_idx2 = arg_info_list[IL_ARG_DESC_IDX(list_idx)].ed.type_idx;
06913
06914 list_idx = IL_NEXT_LIST_IDX(list_idx);
06915
06916 i = 3;
06917
06918 if (IL_FLD(list_idx) != NO_Tbl_Idx) {
06919 i += 4;
06920 COPY_OPND(opnd, IL_OPND(list_idx));
06921
06922 gen_internal_dope_vector(&dope_3,
06923 &opnd,
06924 FALSE,
06925 &arg_info_list[IL_ARG_DESC_IDX(list_idx)].ed);
06926
06927 type_idx3 = arg_info_list[IL_ARG_DESC_IDX(list_idx)].ed.type_idx;
06928 }
06929
06930 list_idx = IL_NEXT_LIST_IDX(list_idx);
06931
06932 if (IL_FLD(list_idx) != NO_Tbl_Idx) {
06933 i += 8;
06934 COPY_OPND(opnd, IL_OPND(list_idx));
06935
06936 gen_internal_dope_vector(&dope_4,
06937 &opnd,
06938 FALSE,
06939 &arg_info_list[IL_ARG_DESC_IDX(list_idx)].ed);
06940
06941 type_idx4 = arg_info_list[IL_ARG_DESC_IDX(list_idx)].ed.type_idx;
06942 }
06943
06944 gen_internal_dope_vector(&dope_result,
06945 &opnd,
06946 TRUE,
06947 &exp_desc_l);
06948
06949 type_idx = exp_desc->type_idx;
06950
06951 if (i == 3) {
06952 ok &= folder_driver((char *)&dope_1,
06953 type_idx1,
06954 (char *)&dope_2,
06955 type_idx2,
06956 (long_type *)&dope_result,
06957 &type_idx,
06958 line,
06959 col,
06960 4,
06961 Reshape_Opr,
06962 0,
06963 0,
06964 0,
06965 0);
06966 }
06967 else if (i == 7) {
06968 ok &= folder_driver((char *)&dope_1,
06969 type_idx1,
06970 (char *)&dope_2,
06971 type_idx2,
06972 (long_type *)&dope_result,
06973 &type_idx,
06974 line,
06975 col,
06976 4,
06977 Reshape_Opr,
06978 (char *)&dope_3,
06979 type_idx3,
06980 0,
06981 0);
06982 }
06983 else if (i == 11) {
06984 ok &= folder_driver((char *)&dope_1,
06985 type_idx1,
06986 (char *)&dope_2,
06987 type_idx2,
06988 (long_type *)&dope_result,
06989 &type_idx,
06990 line,
06991 col,
06992 4,
06993 Reshape_Opr,
06994 0,
06995 0,
06996 (char *)&dope_4,
06997 type_idx4);
06998 }
06999 else {
07000 ok &= folder_driver((char *)&dope_1,
07001 type_idx1,
07002 (char *)&dope_2,
07003 type_idx2,
07004 (long_type *)&dope_result,
07005 &type_idx,
07006 line,
07007 col,
07008 4,
07009 Reshape_Opr,
07010 (char *)&dope_3,
07011 type_idx3,
07012 (char *)&dope_4,
07013 type_idx4);
07014 }
07015
07016 k = 1;
07017 for (i = 1; i <= dope_result.num_dims; i++) {
07018 k = k * dope_result.dim[i-1].extent;
07019 exp_desc->shape[i-1].fld = CN_Tbl_Idx;
07020 extent = dope_result.dim[i-1].extent;
07021 exp_desc->shape[i-1].idx = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,extent);
07022 }
07023 k = k * dope_result.el_len;
07024
07025 if (char_len_in_bytes) {
07026 if (TYP_TYPE(IR_TYPE_IDX(ir_idx)) == Character) {
07027
07028 k *= CHAR_BIT;
07029 }
07030 }
07031
07032 exp_desc->rank = dope_result.num_dims;
07033
07034 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
07035 TYP_TYPE(TYP_WORK_IDX) = Typeless;
07036 TYP_LINEAR(TYP_WORK_IDX) = Long_Typeless;
07037 TYP_BIT_LEN(TYP_WORK_IDX) = k;
07038 type_idx = ntr_type_tbl();
07039
07040
07041
07042 cn_idx = ntr_const_tbl(type_idx,
07043 FALSE,
07044 (long_type *)(dope_result.base_addr));
07045
07046 tmp_idx = gen_compiler_tmp(line, col, Shared, TRUE);
07047 AT_SEMANTICS_DONE(tmp_idx) = TRUE;
07048 ATD_TYPE_IDX(tmp_idx) = IR_TYPE_IDX(ir_idx);
07049
07050 ATD_ARRAY_IDX(tmp_idx) =
07051 create_bd_ntry_for_const(exp_desc,
07052 line, col);
07053
07054 ATD_STOR_BLK_IDX(tmp_idx) = SCP_SB_STATIC_IDX(curr_scp_idx);
07055 ATD_FLD(tmp_idx) = CN_Tbl_Idx;
07056 ATD_TMP_IDX(tmp_idx) = cn_idx;
07057
07058 OPND_IDX(opnd) = tmp_idx;
07059 OPND_FLD(opnd) = AT_Tbl_Idx;
07060 OPND_LINE_NUM(opnd) = line;
07061 OPND_COL_NUM(opnd) = col;
07062
07063 if (exp_desc->rank) {
07064 ok = gen_whole_subscript(&opnd, exp_desc);
07065 }
07066 else if (exp_desc->type == Character) {
07067 ok = gen_whole_substring(&opnd,
07068 exp_desc->rank);
07069 }
07070
07071 if (*element == 1) {
07072 NTR_IR_LIST_TBL(list_idx);
07073 IL_NEXT_LIST_IDX(list_idx) = IR_IDX_R(ir_idx);
07074 IR_IDX_R(ir_idx) = list_idx;
07075 (IR_LIST_CNT_R(ir_idx))++;
07076 COPY_OPND(IL_OPND(list_idx), opnd);
07077 }
07078
07079 RESTORE_ENV;
07080
07081 ok = interpret_constructor(&opnd,
07082 exp_desc,
07083 count,
07084 element);
07085 }
07086 else {
07087
07088 COPY_OPND(opnd, IL_OPND(IR_IDX_R(ir_idx)));
07089
07090 ok = interpret_constructor(&opnd,
07091 exp_desc,
07092 count,
07093 element);
07094
07095 if (*element < 0) {
07096 list_idx = IR_IDX_R(ir_idx);
07097 IR_IDX_R(ir_idx) = IL_NEXT_LIST_IDX(list_idx);
07098 (IR_LIST_CNT_R(ir_idx))--;
07099 FREE_IR_LIST_NODE(list_idx);
07100 }
07101 }
07102
07103
07104 TRACE (Func_Exit, "interpret_reshape_intrinsic", NULL);
07105
07106 return(ok);
07107
07108 }
07109
07110
07111
07112
07113
07114
07115
07116
07117
07118
07119
07120
07121
07122
07123
07124
07125
07126 static boolean interpret_size_intrinsic(int ir_idx,
07127 expr_arg_type *exp_desc,
07128 boolean count,
07129 long64 *element)
07130
07131
07132 {
07133 expr_arg_type exp_desc_l;
07134 expr_arg_type exp_desc_r;
07135 long64 extent;
07136 int i;
07137 int info_idx;
07138 int list_idx1;
07139 long64 loc_element = 0;
07140 boolean ok = TRUE;
07141 opnd_type opnd;
07142 int type_idx;
07143
07144
07145 TRACE (Func_Entry, "interpret_size_intrinsic", NULL);
07146
07147
07148
07149 exp_desc->constant = TRUE;
07150 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
07151 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
07152
07153 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
07154
07155 list_idx1 = IR_IDX_R(ir_idx);
07156 info_idx = IL_ARG_DESC_IDX(list_idx1);
07157
07158
07159 if (count) {
07160
07161 }
07162 else {
07163
07164 if (*element > 0) {
07165 *element = -1;
07166 }
07167
07168 extent = 1;
07169 exp_desc_l = arg_info_list[info_idx].ed;
07170
07171 for (i = 0; i < exp_desc_l.rank; i++) {
07172 COPY_OPND(opnd,
07173 exp_desc_l.shape[i]);
07174 loc_element = 0;
07175 ok = interpret_constructor(&opnd, &exp_desc_r,
07176 FALSE,
07177 &loc_element) && ok;
07178
07179 type_idx = CG_LOGICAL_DEFAULT_TYPE;
07180
07181 if (folder_driver((char *)result_value,
07182 exp_desc_r.type_idx,
07183 (char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
07184 CG_INTEGER_DEFAULT_TYPE,
07185 result_value,
07186 &type_idx,
07187 IR_LINE_NUM(ir_idx),
07188 IR_COL_NUM(ir_idx),
07189 2,
07190 Le_Opr)) {
07191
07192 if (THIS_IS_TRUE(result_value, type_idx)) {
07193 C_TO_F_INT(result_value, 0, exp_desc_r.linear_type);
07194 }
07195 }
07196
07197 extent *= F_INT_TO_C(result_value, exp_desc_r.linear_type);
07198 }
07199
07200 C_TO_F_INT(result_value, extent, Integer_8);
07201 }
07202
07203
07204 TRACE (Func_Exit, "interpret_size_intrinsic", NULL);
07205
07206 return(ok);
07207
07208 }
07209
07210
07211
07212
07213
07214
07215
07216
07217
07218
07219
07220
07221
07222
07223
07224
07225
07226 static boolean interpret_ubound_intrinsic(int ir_idx,
07227 expr_arg_type *exp_desc,
07228 boolean count,
07229 long64 *element)
07230
07231 {
07232 expr_arg_type exp_desc_r;
07233 int i;
07234 int info_idx;
07235 int list_idx1;
07236 long64 loc_element = 0;
07237 boolean ok = TRUE;
07238 opnd_type opnd;
07239 int type_idx;
07240
07241
07242 TRACE (Func_Entry, "interpret_ubound_intrinsic", NULL);
07243
07244
07245
07246 exp_desc->constant = TRUE;
07247 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
07248 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
07249
07250 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
07251
07252 list_idx1 = IR_IDX_R(ir_idx);
07253 info_idx = IL_ARG_DESC_IDX(list_idx1);
07254
07255 if (count) {
07256 exp_desc->rank = 1;
07257 exp_desc->shape[0].fld = CN_Tbl_Idx;
07258 exp_desc->shape[0].idx = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
07259 arg_info_list[info_idx].ed.rank);
07260 }
07261 else if (*element == 0) {
07262
07263 for (i = 0; i < arg_info_list[info_idx].ed.rank; i++) {
07264 COPY_OPND(opnd,
07265 arg_info_list[info_idx].ed.shape[i]);
07266 loc_element = 0;
07267 ok = interpret_constructor(&opnd, &exp_desc_r,
07268 FALSE,
07269 &loc_element) && ok;
07270
07271 type_idx = CG_LOGICAL_DEFAULT_TYPE;
07272
07273 if (folder_driver((char *)result_value,
07274 exp_desc_r.type_idx,
07275 (char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
07276 CG_INTEGER_DEFAULT_TYPE,
07277 result_value,
07278 &type_idx,
07279 IR_LINE_NUM(ir_idx),
07280 IR_COL_NUM(ir_idx),
07281 2,
07282 Le_Opr)) {
07283
07284 if (THIS_IS_TRUE(result_value, type_idx)) {
07285 C_TO_F_INT(result_value, 0, exp_desc_r.linear_type);
07286 }
07287 }
07288
07289 if (exp_desc_r.constant) {
07290 write_constant(exp_desc_r.type_idx);
07291 }
07292 }
07293
07294 exp_desc->constant = FALSE;
07295 }
07296 else {
07297 COPY_OPND(opnd,
07298 arg_info_list[info_idx].ed.shape[*element-1]);
07299 loc_element = 0;
07300 ok = interpret_constructor(&opnd, &exp_desc_r,
07301 FALSE, &loc_element);
07302
07303 if (*element == arg_info_list[info_idx].ed.rank) {
07304 *element = -1;
07305 }
07306 else {
07307 (*element)++;
07308 }
07309 }
07310
07311
07312 TRACE (Func_Exit, "interpret_ubound_intrinsic", NULL);
07313
07314 return(ok);
07315
07316 }
07317
07318
07319
07320
07321
07322
07323
07324
07325
07326
07327
07328
07329
07330
07331
07332
07333
07334 static boolean interpret_shape_intrinsic(int ir_idx,
07335 expr_arg_type *exp_desc,
07336 boolean count,
07337 long64 *element)
07338
07339 {
07340 expr_arg_type exp_desc_r;
07341 int i;
07342 int info_idx;
07343 int list_idx1;
07344 long64 loc_element = 0;
07345 boolean ok = TRUE;
07346 opnd_type opnd;
07347
07348
07349 TRACE (Func_Entry, "interpret_shape_intrinsic", NULL);
07350
07351 exp_desc->constant = TRUE;
07352 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
07353 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
07354
07355 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
07356
07357 list_idx1 = IR_IDX_R(ir_idx);
07358 info_idx = IL_ARG_DESC_IDX(list_idx1);
07359
07360 if (count) {
07361 exp_desc->rank = 1;
07362 exp_desc->shape[0].fld = CN_Tbl_Idx;
07363 exp_desc->shape[0].idx = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
07364 arg_info_list[info_idx].ed.rank);
07365 }
07366 else if (*element == 0) {
07367
07368 for (i = 0; i < arg_info_list[info_idx].ed.rank; i++) {
07369 COPY_OPND(opnd,
07370 arg_info_list[info_idx].ed.shape[i]);
07371 loc_element = 0;
07372 ok = interpret_constructor(&opnd, &exp_desc_r,
07373 FALSE,
07374 &loc_element) && ok;
07375
07376 if (exp_desc_r.constant) {
07377 write_constant(exp_desc_r.type_idx);
07378 }
07379 }
07380
07381 exp_desc->constant = FALSE;
07382 }
07383 else {
07384 COPY_OPND(opnd,
07385 arg_info_list[info_idx].ed.shape[*element-1]);
07386 loc_element = 0;
07387 ok = interpret_constructor(&opnd, &exp_desc_r,
07388 FALSE, &loc_element);
07389
07390 if (*element == arg_info_list[info_idx].ed.rank) {
07391 *element = -1;
07392 }
07393 else {
07394 (*element)++;
07395 }
07396 }
07397
07398 TRACE (Func_Exit, "interpret_shape_intrinsic", NULL);
07399
07400 return(ok);
07401
07402 }
07403
07404
07405
07406
07407
07408
07409
07410
07411
07412
07413
07414
07415
07416
07417
07418
07419
07420 static boolean interpret_sik_intrinsic(int ir_idx,
07421 expr_arg_type *exp_desc,
07422 boolean count,
07423 long64 *element)
07424
07425 {
07426 expr_arg_type exp_desc_l;
07427 long64 loc_element = 0;
07428 boolean ok = TRUE;
07429 opnd_type opnd;
07430 long64 value;
07431
07432
07433 TRACE (Func_Entry, "interpret_sik_intrinsic", NULL);
07434
07435
07436
07437 exp_desc->constant = TRUE;
07438 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
07439 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
07440
07441 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
07442
07443 if (count) {
07444
07445 }
07446 else {
07447
07448 COPY_OPND(opnd, IL_OPND(IR_IDX_R(ir_idx)));
07449
07450 loc_element = 0;
07451 ok = interpret_constructor(&opnd, &exp_desc_l, count,
07452 &loc_element);
07453
07454 if (*element > 0) {
07455 *element = -1;
07456 }
07457
07458 value = F_INT_TO_C(result_value, exp_desc_l.linear_type);
07459
07460 # ifdef _TARGET32
07461
07462 if (value <= RANGE_INT2_F90) {
07463 value = 1;
07464 }
07465 else if (value <= RANGE_INT4_F90) {
07466 value = 4;
07467 }
07468 else {
07469 value = -1;
07470 }
07471 # else
07472 if (value < RANGE_INT4_F90) {
07473 value = 1;
07474 }
07475 else if (value < RANGE_INT8_F90) {
07476 value = 8;
07477 }
07478 else {
07479 value = -1;
07480 }
07481 # endif
07482
07483 C_TO_F_INT(result_value, value, exp_desc->linear_type);
07484 }
07485
07486 TRACE (Func_Exit, "interpret_sik_intrinsic", NULL);
07487
07488 return(ok);
07489
07490 }
07491
07492
07493
07494
07495
07496
07497
07498
07499
07500
07501
07502
07503
07504
07505
07506
07507
07508 static boolean interpret_srk_intrinsic(int ir_idx,
07509 expr_arg_type *exp_desc,
07510 boolean count,
07511 long64 *element)
07512
07513 {
07514 expr_arg_type exp_desc_l;
07515 expr_arg_type exp_desc_r;
07516 int i;
07517 int list_idx;
07518 int list_idx2;
07519 long64 loc_element = 0;
07520 long_type loc_value_l[MAX_WORDS_FOR_NUMERIC];
07521 long_type loc_value_r[MAX_WORDS_FOR_NUMERIC];
07522 boolean ok = TRUE;
07523 opnd_type opnd;
07524 int type_idx;
07525
07526
07527 TRACE (Func_Entry, "interpret_srk_intrinsic", NULL);
07528
07529
07530
07531 exp_desc->constant = TRUE;
07532 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
07533 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
07534
07535 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
07536
07537 if (count) {
07538
07539 }
07540 else {
07541
07542 list_idx = IR_IDX_R(ir_idx);
07543
07544 if (IL_IDX(list_idx) != NULL_IDX) {
07545 COPY_OPND(opnd, IL_OPND(list_idx));
07546
07547 loc_element = 0;
07548 ok = interpret_constructor(&opnd, &exp_desc_l, count,
07549 &loc_element);
07550
07551
07552 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
07553 loc_value_l[i] = result_value[i];
07554 }
07555 }
07556
07557 list_idx2 = IL_NEXT_LIST_IDX(list_idx);
07558
07559 if (IL_IDX(list_idx2) != NULL_IDX) {
07560 COPY_OPND(opnd, IL_OPND(list_idx2));
07561
07562 loc_element = 0;
07563 ok = interpret_constructor(&opnd, &exp_desc_r, count,
07564 &loc_element);
07565
07566
07567 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
07568 loc_value_r[i] = result_value[i];
07569 }
07570 }
07571
07572 if (*element > 0) {
07573 *element = -1;
07574 }
07575
07576 type_idx = exp_desc->type_idx;
07577
07578 if (IL_IDX(list_idx) != NULL_IDX &&
07579 IL_IDX(list_idx2) != NULL_IDX) {
07580
07581 ok &= folder_driver((char *)loc_value_l,
07582 exp_desc_l.type_idx,
07583 (char *)loc_value_r,
07584 exp_desc_r.type_idx,
07585 result_value,
07586 &type_idx,
07587 IR_LINE_NUM(ir_idx),
07588 IR_COL_NUM(ir_idx),
07589 2,
07590 SRK_Opr);
07591 }
07592 else if (IL_IDX(list_idx) != NULL_IDX) {
07593
07594 ok &= folder_driver((char *)loc_value_l,
07595 exp_desc_l.type_idx,
07596 NULL,
07597 NULL_IDX,
07598 result_value,
07599 &type_idx,
07600 IR_LINE_NUM(ir_idx),
07601 IR_COL_NUM(ir_idx),
07602 2,
07603 SRK_Opr);
07604 }
07605 else if (IL_IDX(list_idx2) != NULL_IDX) {
07606
07607 ok &= folder_driver(NULL,
07608 NULL_IDX,
07609 (char *)loc_value_r,
07610 exp_desc_r.type_idx,
07611 result_value,
07612 &type_idx,
07613 IR_LINE_NUM(ir_idx),
07614 IR_COL_NUM(ir_idx),
07615 2,
07616 SRK_Opr);
07617 }
07618 }
07619
07620
07621 TRACE (Func_Exit, "interpret_srk_intrinsic", NULL);
07622
07623 return(ok);
07624
07625 }
07626
07627
07628
07629
07630
07631
07632
07633
07634
07635
07636
07637
07638
07639
07640
07641
07642
07643 static boolean interpret_unary_intrinsic_opr(int ir_idx,
07644 expr_arg_type *exp_desc,
07645 boolean count,
07646 long64 *element)
07647
07648 {
07649 long64 char_result_len_l;
07650 long64 char_result_offset_l;
07651 int col;
07652 expr_arg_type exp_desc_l;
07653 int i;
07654 int line;
07655 int list_idx;
07656 long_type loc_value_l[MAX_WORDS_FOR_NUMERIC];
07657 boolean ok = TRUE;
07658 opnd_type opnd;
07659 opnd_type tmp_opnd;
07660 int type_idx;
07661
07662
07663 TRACE (Func_Entry, "interpret_unary_intrinsic_opr", NULL);
07664
07665 line = IR_LINE_NUM(ir_idx);
07666 col = IR_COL_NUM(ir_idx);
07667
07668
07669
07670 if (IR_FLD_L(ir_idx) == IL_Tbl_Idx) {
07671 list_idx = IR_IDX_L(ir_idx);
07672 COPY_OPND(opnd, IL_OPND(list_idx));
07673 }
07674 else {
07675 COPY_OPND(opnd, IR_OPND_L(ir_idx));
07676 }
07677
07678 if (count) {
07679
07680 if (IR_RANK(ir_idx) == 0) {
07681
07682 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
07683 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
07684
07685 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
07686
07687 if (IR_OPR(ir_idx) == Adjustr_Opr ||
07688 IR_OPR(ir_idx) == Adjustl_Opr) {
07689
07690 ok = interpret_constructor(&opnd, exp_desc, count,
07691 element);
07692 }
07693
07694 exp_desc->constant = TRUE;
07695
07696 }
07697 else {
07698
07699 ok = interpret_constructor(&opnd, exp_desc, count,
07700 element);
07701 exp_desc->constant = TRUE;
07702
07703 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
07704 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
07705
07706 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
07707
07708 }
07709
07710 if (IR_OPR(ir_idx) == Char_Opr) {
07711 char_result_len = 1;
07712 }
07713 }
07714 else {
07715 char_result_offset_l = char_result_offset;
07716 ok = interpret_constructor(&opnd, &exp_desc_l, count,
07717 element);
07718
07719 char_result_offset = char_result_offset_l;
07720 char_result_len_l = char_result_len;
07721
07722 *(exp_desc) = exp_desc_l;
07723
07724 exp_desc->constant = TRUE;
07725
07726 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
07727 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
07728
07729 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
07730
07731 if (! no_result_value) {
07732
07733 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
07734 loc_value_l[i] = result_value[i];
07735 }
07736
07737 type_idx = exp_desc->type_idx;
07738
07739 switch (IR_OPR(ir_idx)) {
07740
07741 case Len_Trim_Opr :
07742
07743 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
07744 TYP_TYPE(TYP_WORK_IDX) = Character;
07745 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
07746 TYP_CHAR_CLASS(TYP_WORK_IDX)= Const_Len_Char;
07747 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
07748 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
07749 char_result_len_l);
07750 exp_desc_l.type_idx = ntr_type_tbl();
07751
07752 type_idx = exp_desc->type_idx;
07753
07754 ok = folder_driver(&(char_result_buffer[char_result_offset_l]),
07755 exp_desc_l.type_idx,
07756 NULL,
07757 NULL_IDX,
07758 result_value,
07759 &type_idx,
07760 line,
07761 col,
07762 1,
07763 IR_OPR(ir_idx));
07764
07765 exp_desc->type_idx = type_idx;
07766 exp_desc->linear_type = TYP_LINEAR(type_idx);
07767
07768
07769 break;
07770
07771
07772 case Ichar_Opr :
07773
07774
07775
07776 C_TO_F_INT(result_value,
07777 char_result_buffer[char_result_offset_l],
07778 exp_desc->linear_type);
07779 break;
07780
07781 case Char_Opr :
07782
07783 if (char_result_offset + 1 >= char_result_buffer_len) {
07784
07785 enlarge_char_result_buffer();
07786 }
07787
07788 char_result_buffer[char_result_offset] =
07789 F_INT_TO_C(result_value, exp_desc_l.linear_type);
07790 char_result_len = 1;
07791 break;
07792
07793 case Adjustl_Opr :
07794 case Adjustr_Opr :
07795
07796
07797 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
07798 TYP_TYPE(TYP_WORK_IDX) = Character;
07799 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
07800 TYP_CHAR_CLASS(TYP_WORK_IDX)= Const_Len_Char;
07801 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
07802 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
07803 char_result_len_l);
07804 type_idx = ntr_type_tbl();
07805
07806 exp_desc->type_idx = type_idx;
07807
07808 ok = folder_driver(&(char_result_buffer[char_result_offset_l]),
07809 type_idx,
07810 NULL,
07811 NULL_IDX,
07812 loc_value_l,
07813 &type_idx,
07814 line,
07815 col,
07816 1,
07817 IR_OPR(ir_idx));
07818
07819
07820 OPND_FLD(tmp_opnd) = CN_Tbl_Idx;
07821 OPND_IDX(tmp_opnd) = loc_value_l[0];
07822 OPND_LINE_NUM(tmp_opnd) = line;
07823 OPND_COL_NUM(tmp_opnd) = col;
07824
07825 char_result_offset = char_result_offset_l;
07826
07827 ok = interpret_constructor(&tmp_opnd, exp_desc, FALSE,
07828 element);
07829
07830 exp_desc->type_idx = type_idx;
07831 exp_desc->linear_type = TYP_LINEAR(type_idx);
07832
07833
07834 break;
07835
07836 default :
07837
07838 ok = folder_driver((char *)loc_value_l,
07839 exp_desc_l.type_idx,
07840 NULL,
07841 NULL_IDX,
07842 result_value,
07843 &type_idx,
07844 line,
07845 col,
07846 1,
07847 IR_OPR(ir_idx));
07848
07849 exp_desc->type_idx = type_idx;
07850 exp_desc->linear_type = TYP_LINEAR(type_idx);
07851
07852
07853 break;
07854
07855
07856 }
07857 }
07858 }
07859
07860 TRACE (Func_Exit, "interpret_unary_intrinsic_opr", NULL);
07861
07862 return(ok);
07863
07864 }
07865
07866
07867
07868
07869
07870
07871
07872
07873
07874
07875
07876
07877
07878
07879
07880
07881
07882 static boolean interpret_binary_intrinsic_opr(int ir_idx,
07883 expr_arg_type *exp_desc,
07884 boolean count,
07885 long64 *element)
07886
07887 {
07888 long64 char_result_len_l;
07889 long64 char_result_len_r;
07890 long64 char_result_offset_l;
07891 long64 char_result_offset_r;
07892 int col;
07893 expr_arg_type exp_desc_l;
07894 expr_arg_type exp_desc_r;
07895 int i;
07896 int line;
07897 long64 loc_element_l = 0;
07898 long64 loc_element_r = 0;
07899 boolean loc_no_result_value = FALSE;
07900 long_type loc_value_l[MAX_WORDS_FOR_NUMERIC];
07901 long_type loc_value_r[MAX_WORDS_FOR_NUMERIC];
07902 boolean ok = TRUE;
07903 opnd_type opnd_l;
07904 opnd_type opnd_r;
07905 int type_idx;
07906
07907
07908 TRACE (Func_Entry, "interpret_binary_intrinsic_opr", NULL);
07909
07910 line = IR_LINE_NUM(ir_idx);
07911 col = IR_COL_NUM(ir_idx);
07912
07913 if (IR_FLD_L(ir_idx) == IL_Tbl_Idx) {
07914
07915 COPY_OPND(opnd_l, IL_OPND(IR_IDX_L(ir_idx)));
07916 COPY_OPND(opnd_r, IL_OPND(IL_NEXT_LIST_IDX(IR_IDX_L(ir_idx))));
07917
07918 }
07919 else {
07920 COPY_OPND(opnd_l, IR_OPND_L(ir_idx));
07921 COPY_OPND(opnd_r, IR_OPND_R(ir_idx));
07922 }
07923
07924 if (count) {
07925 if (IR_RANK(ir_idx) == 0) {
07926
07927 exp_desc->constant = TRUE;
07928
07929 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
07930 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
07931
07932 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
07933 }
07934 else {
07935
07936 exp_desc->constant = TRUE;
07937
07938 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
07939 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
07940
07941 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
07942
07943 loc_element_l = *element;
07944 ok = interpret_constructor(&opnd_l, &exp_desc_l, count,
07945 &loc_element_l);
07946
07947 loc_element_l = *element;
07948
07949
07950 ok = interpret_constructor(&opnd_r, &exp_desc_r, count,
07951 &loc_element_l) && ok;
07952
07953
07954
07955
07956 if (exp_desc_r.rank == exp_desc_l.rank) {
07957
07958 for (i = 0; i < exp_desc_r.rank; i++) {
07959
07960
07961 if (fold_relationals(OPND_IDX(exp_desc_l.shape[i]),
07962 OPND_IDX(exp_desc_r.shape[i]),
07963 Ne_Opr)) {
07964
07965
07966 PRINTMSG(line, 252, Error, col);
07967 ok = FALSE;
07968 break;
07969 }
07970 }
07971 exp_desc->rank = exp_desc_r.rank;
07972 COPY_SHAPE(exp_desc->shape,exp_desc_r.shape,
07973 exp_desc_r.rank);
07974 }
07975 else if (exp_desc_r.rank > exp_desc_l.rank) {
07976 exp_desc->rank = exp_desc_r.rank;
07977 COPY_SHAPE(exp_desc->shape,exp_desc_r.shape,
07978 exp_desc_r.rank);
07979 }
07980 else {
07981 exp_desc->rank = exp_desc_l.rank;
07982 COPY_SHAPE(exp_desc->shape,exp_desc_l.shape,
07983 exp_desc_l.rank);
07984 }
07985 }
07986 }
07987 else {
07988 exp_desc->constant = TRUE;
07989 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
07990 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
07991
07992 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
07993
07994 loc_element_l = *element;
07995 char_result_offset_l = char_result_offset;
07996
07997 ok = interpret_constructor(&opnd_l, &exp_desc_l, count,
07998 &loc_element_l);
07999
08000 char_result_len_l = char_result_len;
08001
08002 if (no_result_value) {
08003 loc_no_result_value = TRUE;
08004 }
08005
08006 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08007 loc_value_l[i] = result_value[i];
08008 }
08009
08010 char_result_offset = char_result_offset_l + char_result_len;
08011 char_result_offset_r = char_result_offset;
08012 loc_element_r = *element;
08013 ok = interpret_constructor(&opnd_r, &exp_desc_r, count,
08014 &loc_element_r) && ok;
08015
08016 char_result_offset = char_result_offset_l;
08017 char_result_len_r = char_result_len;
08018
08019 if (no_result_value) {
08020 loc_no_result_value = TRUE;
08021 }
08022
08023 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08024 loc_value_r[i] = result_value[i];
08025 }
08026
08027 *element = (loc_element_r > loc_element_l) ?
08028 loc_element_r : loc_element_l;
08029
08030 if (loc_no_result_value) {
08031 goto EXIT;
08032 }
08033
08034 type_idx = exp_desc->type_idx;
08035
08036 switch (IR_OPR(ir_idx)) {
08037
08038 case Lge_Opr :
08039 case Lgt_Opr :
08040 case Lle_Opr :
08041 case Llt_Opr :
08042
08043 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
08044 TYP_TYPE(TYP_WORK_IDX) = Character;
08045 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
08046 TYP_CHAR_CLASS(TYP_WORK_IDX)= Const_Len_Char;
08047 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
08048 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
08049 char_result_len_l);
08050 exp_desc_l.type_idx = ntr_type_tbl();
08051
08052 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
08053 TYP_TYPE(TYP_WORK_IDX) = Character;
08054 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
08055 TYP_CHAR_CLASS(TYP_WORK_IDX)= Const_Len_Char;
08056 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
08057 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
08058 char_result_len_r);
08059 exp_desc_r.type_idx = ntr_type_tbl();
08060
08061 ok = folder_driver(&(char_result_buffer[char_result_offset_l]),
08062 exp_desc_l.type_idx,
08063 &(char_result_buffer[char_result_offset_r]),
08064 exp_desc_r.type_idx,
08065 result_value,
08066 &type_idx,
08067 line,
08068 col,
08069 2,
08070 IR_OPR(ir_idx));
08071
08072 exp_desc->type_idx = type_idx;
08073 exp_desc->linear_type = TYP_LINEAR(type_idx);
08074
08075
08076 break;
08077
08078 default :
08079
08080 ok = folder_driver((char *)loc_value_l,
08081 exp_desc_l.type_idx,
08082 (char *)loc_value_r,
08083 exp_desc_r.type_idx,
08084 result_value,
08085 &type_idx,
08086 line,
08087 col,
08088 2,
08089 IR_OPR(ir_idx));
08090
08091 exp_desc->type_idx = type_idx;
08092 exp_desc->linear_type = TYP_LINEAR(type_idx);
08093
08094
08095 break;
08096
08097 }
08098 }
08099
08100 EXIT:
08101
08102 TRACE (Func_Exit, "interpret_binary_intrinsic_opr", NULL);
08103
08104 return(ok);
08105
08106 }
08107
08108
08109
08110
08111
08112
08113
08114
08115
08116
08117
08118
08119
08120
08121
08122
08123
08124 static boolean interpret_max_min_opr(int ir_idx,
08125 expr_arg_type *exp_desc,
08126 boolean count,
08127 long64 *element)
08128
08129 {
08130 int col;
08131 expr_arg_type exp_desc_l;
08132 expr_arg_type exp_desc_r;
08133 int i;
08134 int line;
08135 int list_idx;
08136 long64 loc_element_l = 0;
08137 long64 loc_element_r = 0;
08138 boolean loc_no_result_value = FALSE;
08139 long_type loc_value_l[MAX_WORDS_FOR_NUMERIC];
08140 long_type loc_value_r[MAX_WORDS_FOR_NUMERIC];
08141 int opr;
08142 boolean ok = TRUE;
08143 opnd_type opnd;
08144 int type_idx;
08145
08146
08147 TRACE (Func_Entry, "interpret_max_min_opr", NULL);
08148
08149 line = IR_LINE_NUM(ir_idx);
08150 col = IR_COL_NUM(ir_idx);
08151
08152 if (count) {
08153
08154 if (IR_RANK(ir_idx) == 0) {
08155
08156 exp_desc->constant = TRUE;
08157
08158 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08159 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08160
08161 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08162
08163 }
08164 else {
08165
08166 exp_desc->constant = TRUE;
08167
08168 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08169 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08170
08171 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08172
08173
08174 list_idx = IR_IDX_L(ir_idx);
08175
08176 loc_element_l = *element;
08177 COPY_OPND(opnd, IL_OPND(list_idx));
08178 ok = interpret_constructor(&opnd, &exp_desc_l, count,
08179 &loc_element_l);
08180
08181 exp_desc->rank = exp_desc_l.rank;
08182 COPY_SHAPE(exp_desc->shape,exp_desc_l.shape,
08183 exp_desc_l.rank);
08184
08185 list_idx = IL_NEXT_LIST_IDX(list_idx);
08186
08187 while (list_idx &&
08188 (IL_IDX(list_idx) != NULL_IDX) &&
08189 ok) {
08190
08191 loc_element_l = *element;
08192 COPY_OPND(opnd, IL_OPND(list_idx));
08193 ok = interpret_constructor(&opnd, &exp_desc_l, count,
08194 &loc_element_l) && ok;
08195
08196
08197
08198 if (exp_desc->rank == exp_desc_l.rank) {
08199
08200 for (i = 0; i < exp_desc->rank; i++) {
08201
08202
08203 if (fold_relationals(OPND_IDX(exp_desc_l.shape[i]),
08204 OPND_IDX(exp_desc->shape[i]),
08205 Ne_Opr)) {
08206
08207
08208 PRINTMSG(line, 252, Error, col);
08209 ok = FALSE;
08210 break;
08211 }
08212 }
08213 }
08214 else if (exp_desc->rank < exp_desc_l.rank) {
08215 exp_desc->rank = exp_desc_l.rank;
08216 COPY_SHAPE(exp_desc->shape,exp_desc_l.shape,
08217 exp_desc_l.rank);
08218 }
08219
08220 list_idx = IL_NEXT_LIST_IDX(list_idx);
08221 }
08222 }
08223 }
08224 else {
08225
08226 exp_desc->constant = TRUE;
08227
08228 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08229 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08230
08231 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08232
08233 list_idx = IR_IDX_L(ir_idx);
08234
08235 loc_element_l = *element;
08236 COPY_OPND(opnd, IL_OPND(list_idx));
08237 ok = interpret_constructor(&opnd, &exp_desc_l, count,
08238 &loc_element_l);
08239
08240 if (no_result_value) {
08241 loc_no_result_value = TRUE;
08242 }
08243
08244 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08245 loc_value_l[i] = result_value[i];
08246 }
08247
08248 if (IR_OPR(ir_idx) == Max_Opr) {
08249 opr = Gt_Opr;
08250 }
08251 else {
08252 opr = Lt_Opr;
08253 }
08254
08255 list_idx = IL_NEXT_LIST_IDX(list_idx);
08256
08257 while (list_idx &&
08258 (IL_IDX(list_idx) != NULL_IDX)) {
08259
08260 loc_element_r = *element;
08261 COPY_OPND(opnd, IL_OPND(list_idx));
08262 ok = interpret_constructor(&opnd, &exp_desc_r, count,
08263 &loc_element_r) && ok;
08264
08265 if (no_result_value) {
08266 loc_no_result_value = TRUE;
08267 }
08268
08269 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08270 loc_value_r[i] = result_value[i];
08271 }
08272
08273 if (loc_element_r > loc_element_l) {
08274 loc_element_l = loc_element_r;
08275 }
08276
08277 type_idx = exp_desc->type_idx;
08278
08279 ok = folder_driver((char *)loc_value_r,
08280 exp_desc_r.type_idx,
08281 (char *)loc_value_l,
08282 exp_desc_l.type_idx,
08283 result_value,
08284 &type_idx,
08285 line,
08286 col,
08287 2,
08288 opr) && ok;
08289
08290 exp_desc->type_idx = type_idx;
08291
08292 if (THIS_IS_TRUE(result_value, type_idx)) {
08293
08294 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08295 loc_value_l[i] = loc_value_r[i];
08296 }
08297 }
08298
08299 list_idx = IL_NEXT_LIST_IDX(list_idx);
08300 }
08301
08302 if (exp_desc->type != exp_desc_l.type) {
08303
08304 type_idx = exp_desc->type_idx;
08305
08306 if (folder_driver((char *)loc_value_l,
08307 exp_desc_l.linear_type,
08308 NULL,
08309 NULL_IDX,
08310 result_value,
08311 &type_idx,
08312 line,
08313 col,
08314 1,
08315 Cvrt_Opr)) {
08316
08317 }
08318 }
08319 else {
08320 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08321 result_value[i] = loc_value_l[i];
08322 }
08323 }
08324
08325 *element = loc_element_l;
08326
08327 if (loc_no_result_value) {
08328 no_result_value = TRUE;
08329 }
08330 }
08331
08332
08333 TRACE (Func_Exit, "interpret_max_min_opr", NULL);
08334
08335 return(ok);
08336
08337 }
08338
08339
08340
08341
08342
08343
08344
08345
08346
08347
08348
08349
08350
08351
08352
08353
08354
08355 static boolean interpret_csmg_opr(int ir_idx,
08356 expr_arg_type *exp_desc,
08357 boolean count,
08358 long64 *element)
08359
08360 {
08361 int col;
08362 expr_arg_type exp_desc_x;
08363 expr_arg_type exp_desc_y;
08364 expr_arg_type exp_desc_z;
08365 int i;
08366 int line;
08367 int list_idx;
08368 long64 loc_element_x = 0;
08369 long64 loc_element_y = 0;
08370 long64 loc_element_z = 0;
08371 boolean loc_no_result_value = FALSE;
08372 long_type loc_value_x[MAX_WORDS_FOR_NUMERIC];
08373 long_type loc_value_y[MAX_WORDS_FOR_NUMERIC];
08374 long_type loc_value_z[MAX_WORDS_FOR_NUMERIC];
08375 boolean ok = TRUE;
08376 opnd_type opnd;
08377 int type_idx;
08378
08379
08380 TRACE (Func_Entry, "interpret_csmg_opr", NULL);
08381
08382 line = IR_LINE_NUM(ir_idx);
08383 col = IR_COL_NUM(ir_idx);
08384
08385 if (count) {
08386
08387 if (IR_RANK(ir_idx) == 0) {
08388
08389 exp_desc->constant = TRUE;
08390
08391 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08392 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08393
08394 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08395 }
08396 else {
08397
08398 exp_desc->constant = TRUE;
08399
08400 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08401 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08402
08403 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08404
08405 list_idx = IR_IDX_L(ir_idx);
08406
08407 loc_element_x = *element;
08408 COPY_OPND(opnd, IL_OPND(list_idx));
08409 ok = interpret_constructor(&opnd, &exp_desc_x, count,
08410 &loc_element_x);
08411
08412 exp_desc->rank = exp_desc_x.rank;
08413 COPY_SHAPE(exp_desc->shape,exp_desc_x.shape,
08414 exp_desc_x.rank);
08415
08416 list_idx = IL_NEXT_LIST_IDX(list_idx);
08417
08418 while (list_idx &&
08419 (IL_IDX(list_idx) != NULL_IDX) &&
08420 ok) {
08421
08422 loc_element_x = *element;
08423 COPY_OPND(opnd, IL_OPND(list_idx));
08424 ok = interpret_constructor(&opnd, &exp_desc_x, count,
08425 &loc_element_x) && ok;
08426
08427
08428
08429 if (exp_desc->rank == exp_desc_x.rank) {
08430
08431 for (i = 0; i < exp_desc->rank; i++) {
08432
08433
08434 if (fold_relationals(OPND_IDX(exp_desc_x.shape[i]),
08435 OPND_IDX(exp_desc->shape[i]),
08436 Ne_Opr)) {
08437
08438
08439 PRINTMSG(line, 252, Error, col);
08440 ok = FALSE;
08441 break;
08442 }
08443 }
08444 }
08445 else if (exp_desc->rank < exp_desc_x.rank) {
08446 exp_desc->rank = exp_desc_x.rank;
08447 COPY_SHAPE(exp_desc->shape,exp_desc_x.shape,
08448 exp_desc_x.rank);
08449 }
08450
08451 list_idx = IL_NEXT_LIST_IDX(list_idx);
08452 }
08453 }
08454 }
08455 else {
08456
08457 exp_desc->constant = TRUE;
08458
08459 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08460 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08461
08462 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08463
08464 list_idx = IR_IDX_L(ir_idx);
08465
08466 loc_element_x = *element;
08467 COPY_OPND(opnd, IL_OPND(list_idx));
08468 ok = interpret_constructor(&opnd, &exp_desc_x, count,
08469 &loc_element_x);
08470
08471 if (no_result_value) {
08472 loc_no_result_value = TRUE;
08473 }
08474
08475 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08476 loc_value_x[i] = result_value[i];
08477 }
08478
08479 list_idx = IL_NEXT_LIST_IDX(list_idx);
08480
08481 loc_element_y = *element;
08482 COPY_OPND(opnd, IL_OPND(list_idx));
08483 ok = interpret_constructor(&opnd, &exp_desc_y, count,
08484 &loc_element_y);
08485
08486 if (no_result_value) {
08487 loc_no_result_value = TRUE;
08488 }
08489
08490 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08491 loc_value_y[i] = result_value[i];
08492 }
08493
08494 if (loc_element_y > loc_element_x) {
08495 loc_element_x = loc_element_y;
08496 }
08497
08498 list_idx = IL_NEXT_LIST_IDX(list_idx);
08499
08500 loc_element_z = *element;
08501 COPY_OPND(opnd, IL_OPND(list_idx));
08502 ok = interpret_constructor(&opnd, &exp_desc_z, count,
08503 &loc_element_z);
08504
08505 if (no_result_value) {
08506 loc_no_result_value = TRUE;
08507 }
08508
08509 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08510 loc_value_z[i] = result_value[i];
08511 }
08512
08513 if (loc_element_z > loc_element_x) {
08514 loc_element_x = loc_element_z;
08515 }
08516
08517 type_idx = exp_desc->type_idx;
08518
08519 ok = folder_driver((char *)loc_value_x,
08520 exp_desc_x.type_idx,
08521 (char *)loc_value_y,
08522 exp_desc_y.type_idx,
08523 result_value,
08524 &type_idx,
08525 line,
08526 col,
08527 3,
08528 IR_OPR(ir_idx),
08529 (char *)loc_value_z,
08530 exp_desc_z.type_idx) && ok;
08531
08532
08533 *element = loc_element_x;
08534
08535 if (loc_no_result_value) {
08536 no_result_value = TRUE;
08537 }
08538 }
08539
08540
08541 TRACE (Func_Exit, "interpret_csmg_opr", NULL);
08542
08543 return(ok);
08544
08545 }
08546
08547
08548
08549
08550
08551
08552
08553
08554
08555
08556
08557
08558
08559
08560
08561
08562
08563 static boolean interpret_cvmgt_opr(int ir_idx,
08564 expr_arg_type *exp_desc,
08565 boolean count,
08566 long64 *element)
08567
08568 {
08569 int col;
08570 expr_arg_type exp_desc_x;
08571 expr_arg_type exp_desc_y;
08572 expr_arg_type exp_desc_z;
08573 int i;
08574 int line;
08575 int list_idx;
08576 long64 loc_element_x = 0;
08577 long64 loc_element_y = 0;
08578 long64 loc_element_z = 0;
08579 boolean loc_no_result_value = FALSE;
08580 long_type loc_value_x[MAX_WORDS_FOR_NUMERIC];
08581 long_type loc_value_y[MAX_WORDS_FOR_NUMERIC];
08582 long_type loc_value_z[MAX_WORDS_FOR_NUMERIC];
08583 boolean ok = TRUE;
08584 opnd_type opnd;
08585
08586
08587 TRACE (Func_Entry, "interpret_cvmgt_opr", NULL);
08588
08589 line = IR_LINE_NUM(ir_idx);
08590 col = IR_COL_NUM(ir_idx);
08591
08592 if (count) {
08593
08594 if (IR_RANK(ir_idx) == 0) {
08595
08596 exp_desc->constant = TRUE;
08597
08598 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08599 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08600
08601 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08602 }
08603 else {
08604
08605 exp_desc->constant = TRUE;
08606
08607 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08608 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08609
08610 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08611
08612 list_idx = IR_IDX_L(ir_idx);
08613
08614 loc_element_x = *element;
08615 COPY_OPND(opnd, IL_OPND(list_idx));
08616 ok = interpret_constructor(&opnd, &exp_desc_x, count,
08617 &loc_element_x);
08618
08619 exp_desc->rank = exp_desc_x.rank;
08620 COPY_SHAPE(exp_desc->shape,exp_desc_x.shape,
08621 exp_desc_x.rank);
08622
08623 list_idx = IL_NEXT_LIST_IDX(list_idx);
08624
08625 while (list_idx &&
08626 (IL_IDX(list_idx) != NULL_IDX) &&
08627 ok) {
08628
08629 loc_element_x = *element;
08630 COPY_OPND(opnd, IL_OPND(list_idx));
08631 ok = interpret_constructor(&opnd, &exp_desc_x, count,
08632 &loc_element_x) && ok;
08633
08634
08635
08636 if (exp_desc->rank == exp_desc_x.rank) {
08637
08638 for (i = 0; i < exp_desc->rank; i++) {
08639
08640
08641 if (fold_relationals(OPND_IDX(exp_desc_x.shape[i]),
08642 OPND_IDX(exp_desc->shape[i]),
08643 Ne_Opr)) {
08644
08645
08646 PRINTMSG(line, 252, Error, col);
08647 ok = FALSE;
08648 break;
08649 }
08650 }
08651 }
08652 else if (exp_desc->rank < exp_desc_x.rank) {
08653 exp_desc->rank = exp_desc_x.rank;
08654 COPY_SHAPE(exp_desc->shape,exp_desc_x.shape,
08655 exp_desc_x.rank);
08656 }
08657
08658 list_idx = IL_NEXT_LIST_IDX(list_idx);
08659 }
08660 }
08661 }
08662 else {
08663
08664 exp_desc->constant = TRUE;
08665
08666 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08667 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08668
08669 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08670
08671 list_idx = IR_IDX_L(ir_idx);
08672
08673 loc_element_x = *element;
08674 COPY_OPND(opnd, IL_OPND(list_idx));
08675 ok = interpret_constructor(&opnd, &exp_desc_x, count,
08676 &loc_element_x);
08677
08678 if (no_result_value) {
08679 loc_no_result_value = TRUE;
08680 }
08681
08682 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08683 loc_value_x[i] = result_value[i];
08684 }
08685
08686 list_idx = IL_NEXT_LIST_IDX(list_idx);
08687
08688 loc_element_y = *element;
08689 COPY_OPND(opnd, IL_OPND(list_idx));
08690 ok = interpret_constructor(&opnd, &exp_desc_y, count,
08691 &loc_element_y);
08692
08693 if (no_result_value) {
08694 loc_no_result_value = TRUE;
08695 }
08696
08697 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08698 loc_value_y[i] = result_value[i];
08699 }
08700
08701 if (loc_element_y > loc_element_x) {
08702 loc_element_x = loc_element_y;
08703 }
08704
08705 list_idx = IL_NEXT_LIST_IDX(list_idx);
08706
08707 loc_element_z = *element;
08708 COPY_OPND(opnd, IL_OPND(list_idx));
08709 ok = interpret_constructor(&opnd, &exp_desc_z, count,
08710 &loc_element_z);
08711
08712 if (no_result_value) {
08713 loc_no_result_value = TRUE;
08714 }
08715
08716 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08717 loc_value_z[i] = result_value[i];
08718 }
08719
08720 if (loc_element_z > loc_element_x) {
08721 loc_element_x = loc_element_z;
08722 }
08723
08724 if (THIS_IS_TRUE(loc_value_z, exp_desc_z.type_idx)) {
08725 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08726 result_value[i] = loc_value_x[i];
08727 }
08728 *exp_desc = exp_desc_x;
08729 }
08730 else {
08731 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08732 result_value[i] = loc_value_y[i];
08733 }
08734 *exp_desc = exp_desc_y;
08735 }
08736
08737 *element = loc_element_x;
08738
08739 if (loc_no_result_value) {
08740 no_result_value = TRUE;
08741 }
08742 }
08743
08744
08745 TRACE (Func_Exit, "interpret_cvmgt_opr", NULL);
08746
08747 return(ok);
08748
08749 }
08750
08751
08752
08753
08754
08755
08756
08757
08758
08759
08760
08761
08762
08763
08764
08765
08766
08767 static boolean interpret_index_opr(int ir_idx,
08768 expr_arg_type *exp_desc,
08769 boolean count,
08770 long64 *element)
08771
08772 {
08773 long64 char_result_len_l;
08774 long64 char_result_len_r;
08775 long64 char_result_offset_l;
08776 long64 char_result_offset_r;
08777 int col;
08778 expr_arg_type exp_desc_l;
08779 expr_arg_type exp_desc_r;
08780 int i;
08781 int line;
08782 int list_idx;
08783 long64 loc_element_l = 0;
08784 long64 loc_element_r = 0;
08785 boolean loc_no_result_value = FALSE;
08786 long_type loc_value_r[MAX_WORDS_FOR_NUMERIC];
08787 boolean ok = TRUE;
08788 opnd_type opnd;
08789 int type_idx;
08790
08791
08792 TRACE (Func_Entry, "interpret_index_opr", NULL);
08793
08794 line = IR_LINE_NUM(ir_idx);
08795 col = IR_COL_NUM(ir_idx);
08796
08797 if (count) {
08798 if (IR_RANK(ir_idx) == 0) {
08799
08800 exp_desc->constant = TRUE;
08801
08802 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08803 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08804
08805 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08806 }
08807 else {
08808
08809
08810 exp_desc->constant = TRUE;
08811
08812 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08813 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08814
08815 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08816
08817 list_idx = IR_IDX_L(ir_idx);
08818
08819 loc_element_l = *element;
08820 COPY_OPND(opnd, IL_OPND(list_idx));
08821 ok = interpret_constructor(&opnd, &exp_desc_l, count,
08822 &loc_element_l);
08823
08824 exp_desc->rank = exp_desc_l.rank;
08825 COPY_SHAPE(exp_desc->shape,exp_desc_l.shape,
08826 exp_desc_l.rank);
08827
08828 list_idx = IL_NEXT_LIST_IDX(list_idx);
08829
08830 while (list_idx &&
08831 (IL_IDX(list_idx) != NULL_IDX) &&
08832 ok) {
08833
08834 loc_element_l = *element;
08835 COPY_OPND(opnd, IL_OPND(list_idx));
08836 ok = interpret_constructor(&opnd, &exp_desc_l, count,
08837 &loc_element_l) && ok;
08838
08839
08840
08841 if (exp_desc->rank == exp_desc_l.rank) {
08842
08843 for (i = 0; i < exp_desc->rank; i++) {
08844
08845
08846 if (fold_relationals(OPND_IDX(exp_desc_l.shape[i]),
08847 OPND_IDX(exp_desc->shape[i]),
08848 Ne_Opr)) {
08849
08850
08851 PRINTMSG(line, 252, Error, col);
08852 ok = FALSE;
08853 break;
08854 }
08855 }
08856 }
08857 else if (exp_desc->rank < exp_desc_l.rank) {
08858 exp_desc->rank = exp_desc_l.rank;
08859 COPY_SHAPE(exp_desc->shape,exp_desc_l.shape,
08860 exp_desc_l.rank);
08861 }
08862
08863 list_idx = IL_NEXT_LIST_IDX(list_idx);
08864 }
08865 }
08866 }
08867 else {
08868
08869 exp_desc->constant = TRUE;
08870 exp_desc->type_idx = IR_TYPE_IDX(ir_idx);
08871 exp_desc->type = TYP_TYPE(exp_desc->type_idx);
08872
08873 exp_desc->linear_type = TYP_LINEAR(exp_desc->type_idx);
08874
08875 list_idx = IR_IDX_L(ir_idx);
08876
08877 char_result_offset_l = char_result_offset;
08878 loc_element_l = *element;
08879 COPY_OPND(opnd, IL_OPND(list_idx));
08880 ok = interpret_constructor(&opnd, &exp_desc_l, count,
08881 &loc_element_l);
08882
08883 char_result_len_l = char_result_len;
08884
08885 if (no_result_value) {
08886 loc_no_result_value = TRUE;
08887 }
08888
08889 list_idx = IL_NEXT_LIST_IDX(list_idx);
08890
08891 char_result_offset = char_result_offset_l + char_result_len;
08892 char_result_offset_r = char_result_offset;
08893 loc_element_r = *element;
08894 COPY_OPND(opnd, IL_OPND(list_idx));
08895 ok = interpret_constructor(&opnd, &exp_desc_r, count,
08896 &loc_element_r) && ok;
08897
08898 char_result_offset = char_result_offset_l;
08899 char_result_len_r = char_result_len;
08900
08901 if (no_result_value) {
08902 loc_no_result_value = TRUE;
08903 }
08904
08905 if (loc_element_r > loc_element_l) {
08906 loc_element_l = loc_element_r;
08907 }
08908
08909 list_idx = IL_NEXT_LIST_IDX(list_idx);
08910
08911 loc_element_r = *element;
08912 COPY_OPND(opnd, IL_OPND(list_idx));
08913 ok = interpret_constructor(&opnd, &exp_desc_r, count,
08914 &loc_element_r) && ok;
08915
08916 if (no_result_value) {
08917 loc_no_result_value = TRUE;
08918 }
08919
08920 if (loc_element_r > loc_element_l) {
08921 loc_element_l = loc_element_r;
08922 }
08923
08924 for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
08925 loc_value_r[i] = result_value[i];
08926 }
08927
08928 #ifdef KEY
08929
08930
08931
08932 *element = loc_element_l;
08933 #endif
08934
08935 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
08936 TYP_TYPE(TYP_WORK_IDX) = Character;
08937 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
08938 TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
08939 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
08940 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
08941 char_result_len_l);
08942 exp_desc_l.type_idx = ntr_type_tbl();
08943
08944 CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
08945 TYP_TYPE(TYP_WORK_IDX) = Character;
08946 TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
08947 TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
08948 TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
08949 TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE,
08950 char_result_len_r);
08951 exp_desc_r.type_idx = ntr_type_tbl();
08952
08953 type_idx = exp_desc->type_idx;
08954
08955 ok = folder_driver(&(char_result_buffer[char_result_offset_l]),
08956 exp_desc_l.type_idx,
08957 &(char_result_buffer[char_result_offset_r]),
08958 exp_desc_r.type_idx,
08959 result_value,
08960 &type_idx,
08961 line,
08962 col,
08963 3,
08964 IR_OPR(ir_idx),
08965 (char *)loc_value_r,
08966 LOGICAL_DEFAULT_TYPE);
08967
08968 exp_desc->type_idx = type_idx;
08969 exp_desc->linear_type = TYP_LINEAR(type_idx);
08970 }
08971
08972
08973 TRACE (Func_Exit, "interpret_index_opr", NULL);
08974
08975 return(ok);
08976
08977 }