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 #ifndef wn_core_INCLUDED
00037 #define wn_core_INCLUDED
00038
00039 #ifndef symtab_INCLUDED
00040 #include "symtab.h"
00041 #endif
00042
00043 #ifndef irbdata_INCLUDED
00044 #include "irbdata.h"
00045 #endif
00046
00047 #ifndef wintrinsic_INCLUDED
00048 #include "wintrinsic.h"
00049 #endif
00050 #ifndef wio_INCLUDED
00051 #include "wio.h"
00052 #endif
00053
00376 #define MAX_FIELD_ID 0x3ffe
00377 #define UNKNOWN_FIELD_ID 0x3fff
00378
00379 class WN;
00380 class STMT_WN;
00381
00382 typedef INT32 WN_OFFSET;
00383 typedef INT64 WN_ESIZE;
00384 typedef INT32 WN_MAP_ID;
00385
00386 typedef enum REGION_KIND {
00387 REGION_KIND_PRAGMA = 0x0,
00388 REGION_KIND_FUNC_ENTRY = 0x1,
00389 REGION_KIND_LOOP = 0x2,
00390 REGION_KIND_OLIMIT = 0x3,
00391 REGION_KIND_MP = 0x4,
00392 REGION_KIND_RPI = 0x5,
00393 REGION_KIND_COLD = 0x6,
00394 REGION_KIND_SWP = 0x7,
00395
00396 REGION_KIND_EH = 0x8,
00397 REGION_KIND_TRY = 0x8,
00398 REGION_KIND_CLEANUP = 0x9,
00399 REGION_KIND_EXC_SPEC = 0xa,
00400 REGION_KIND_MASK = 0xb,
00401 REGION_KIND_GUARD = 0xc,
00402 REGION_KIND_NULL_CLEANUP = 0xd
00403 } REGION_KIND;
00404
00405 class WN {
00406 public:
00407 union {
00408 struct {
00409 union {
00410 WN_OFFSET load_offset;
00411 WN_OFFSET lda_offset;
00412 WN_OFFSET store_offset;
00413 WN_OFFSET idname_offset;
00414 INT32 num_entries;
00415 TY_IDX loadx_addr_ty;
00416 INT16 cvtl_bits;
00417 INT32 label_number;
00418 UINT32 call_flag;
00419 UINT32 if_flag;
00420 UINT32 io_flag;
00421 UINT32 asm_flag;
00422 UINT32 asm_operand_num;
00423 UINT32 eq_logical_flag;
00424 struct {
00425 mUINT16 trip_est;
00426 mUINT16 loop_depth;
00427 } li;
00428 struct {
00429 mUINT16 pragma_flags;
00430 mUINT16 pragma_id;
00431 } pragma;
00432 TY_IDX io_item_ty;
00433 struct {
00434 REGION_KIND region_kind: 4;
00435 mUINT32 region_id :28;
00436 } region;
00437 } ua;
00438 union {
00439 ST_IDX st_idx;
00440 TY_IDX ty;
00441
00442 INT32 id;
00443 INTRINSIC intrinsic;
00444 IOSTATEMENT iostatement;
00445 IOITEM ioitem;
00446 UINT32 prefetch_flag;
00447 UINT32 loop_flag;
00448 INT32 last_label;
00449 INITO_IDX ereg_supp;
00450 UINT32 label_level;
00451 } ub;
00452 } uu;
00453 WN_ESIZE element_size;
00454 } u1u2;
00455
00456
00457
00458
00459 struct {
00460 OPERATOR wn_operator : 8;
00461 TYPE_ID rtype : 5;
00462 mINT16 kid_count :14;
00463 TYPE_ID desc : 5;
00464 INT32 map_id;
00465 } common;
00466
00467 union {
00468 struct {
00469 WN *dummy1;
00470 TY_IDX ty;
00471 } ty_fields;
00472 WN *kids[2];
00473 INT64 const_val;
00474 struct {
00475 UINT32 num_inputs;
00476 UINT32 num_clobbers;
00477 } asm_fields;
00478 struct {
00479 WN *dummy2;
00480 UINT32 label_flag;
00481 } label_flag_fields;
00482 struct {
00483 WN *first;
00484 WN *last;
00485 } block;
00486
00487 union {
00488 INT64 pragma_arg64;
00489 struct {
00490 INT32 pragma_arg1;
00491 union {
00492 INT32 pragma_arg2;
00493 struct {
00494 mUINT32 pragma_asm_opnd_num : 8;
00495 PREG_NUM pragma_asm_copyout_preg : 24;
00496 } asm_pragma;
00497 };
00498 } up1;
00499 struct {
00500 mINT16 pragma_pad1;
00501 mINT8 pragma_distr_type;
00502 mINT8 pragma_index;
00503 INT32 pragma_preg;
00504 } up2;
00505 } pragma;
00506 } u3;
00507
00508 #ifndef WN_NO_ACCESSOR_FUNCTIONS
00509
00510 WN () {}
00511 WN (const WN& wn) { }
00512 WN (const WN* wn) { }
00513 WN& operator= (const WN& wn) { return *this;}
00514 ~WN () {}
00515
00516 public:
00517
00518 friend inline WN_OFFSET WN_load_offset (const WN *);
00519 friend inline WN_OFFSET& WN_load_offset (WN *);
00520 friend inline WN_OFFSET WN_lda_offset (const WN *);
00521 friend inline WN_OFFSET& WN_lda_offset (WN *);
00522 friend inline WN_OFFSET WN_store_offset (const WN *);
00523 friend inline WN_OFFSET& WN_store_offset (WN *);
00524 friend inline WN_OFFSET WN_idname_offset (const WN *);
00525 friend inline WN_OFFSET& WN_idname_offset (WN *);
00526 friend inline WN_OFFSET WN_offset (const WN *);
00527 friend inline WN_OFFSET& WN_offset (WN *);
00528 friend inline INT32 WN_num_entries (const WN *);
00529 friend inline INT32& WN_num_entries (WN *);
00530
00531
00532 friend inline INT16 WN_cvtl_bits (const WN *);
00533 friend inline INT16& WN_cvtl_bits (WN *);
00534 friend inline INT32& WN_label_number (WN *);
00535 friend inline INT32 WN_label_number (const WN *);
00536 friend inline UINT32& WN_call_flag (WN *);
00537 friend inline UINT32 WN_call_flag (const WN *);
00538
00539 friend inline UINT32& WN_eq_logical_flag (WN *);
00540 friend inline UINT32 WN_eq_logical_flag (const WN *);
00541
00542 friend inline UINT32& WN_if_flag (WN *);
00543 friend inline UINT32 WN_if_flag (const WN *);
00544 friend inline UINT32& WN_io_flag (WN *);
00545 friend inline UINT32 WN_io_flag (const WN *);
00546 friend inline UINT32& WN_asm_flag (WN *);
00547 friend inline UINT32 WN_asm_flag (const WN *);
00548 friend inline UINT32& WN_asm_num_inputs (WN *);
00549 friend inline UINT32 WN_asm_num_inputs (const WN *);
00550 friend inline UINT32& WN_asm_num_clobbers (WN *);
00551 friend inline UINT32 WN_asm_num_clobbers (const WN *);
00552 friend inline char * WN_asm_string (const WN *);
00553 friend inline char * WN_asm_input_constraint (const WN *);
00554 friend inline UINT32 WN_asm_opnd_num(const WN *);
00555 friend inline UINT32& WN_label_level (WN *);
00556 friend inline UINT32 WN_label_level (const WN *);
00557
00558 friend inline mUINT16 WN_loop_trip_est (const WN *);
00559 friend inline mUINT16& WN_loop_trip_est (WN *);
00560 friend inline mUINT16 WN_loop_depth (const WN *);
00561 friend inline mUINT16& WN_loop_depth (WN *);
00562
00563 friend inline mUINT16 WN_pragma_flags (const WN *);
00564 friend inline mUINT16& WN_pragma_flags (WN *);
00565 friend inline mUINT16 WN_pragma (const WN *);
00566 friend inline mUINT16& WN_pragma (WN *);
00567 friend inline UINT32 WN_pragma_asm_opnd_num (const WN *);
00568 friend inline void WN_set_pragma_asm_opnd_num (WN *, UINT32);
00569
00570
00571
00572
00573 friend inline REGION_KIND WN_region_kind (const WN *);
00574 friend inline void WN_set_region_kind (WN *, REGION_KIND);
00575 friend inline mUINT32 WN_region_id (const WN *);
00576 friend inline void WN_set_region_id (WN *, mUINT32);
00577
00578 friend inline ST_IDX WN_st_idx (const WN *);
00579 friend inline ST_IDX& WN_st_idx (WN *);
00580
00581
00582 friend inline INTRINSIC WN_intrinsic (const WN *);
00583 friend inline INTRINSIC& WN_intrinsic (WN *);
00584 friend inline IOSTATEMENT WN_io_statement(const WN *);
00585 friend inline IOSTATEMENT& WN_io_statement(WN *);
00586 friend inline IOITEM WN_io_item(const WN *);
00587 friend inline IOITEM& WN_io_item(WN *);
00588
00589
00590 friend inline UINT32 WN_prefetch_flag (const WN *);
00591 friend inline UINT32& WN_prefetch_flag (WN *);
00592 friend inline UINT32 WN_loop_flag (const WN *);
00593 friend inline UINT32& WN_loop_flag (WN *);
00594 friend inline INT32 WN_last_label (const WN *);
00595 friend inline INT32& WN_last_label (WN *);
00596 friend inline INITO_IDX WN_ereg_supp (const WN *);
00597 friend inline INITO_IDX& WN_ereg_supp (WN *);
00598
00599 friend inline WN_ESIZE WN_element_size (const WN *);
00600 friend inline WN_ESIZE& WN_element_size (WN *);
00601
00602 friend inline OPERATOR WN_operator (const WN *);
00603 friend inline void WN_set_operator (WN *, OPERATOR);
00604 friend inline TYPE_ID WN_rtype (const WN *);
00605 friend inline void WN_set_rtype (WN *, TYPE_ID);
00606 friend inline INT WN_kid_count (const WN *);
00607 friend inline void WN_set_kid_count (WN *, UINT);
00608 friend inline UINT WN_field_id (const WN *);
00609 friend inline void WN_set_field_id (WN *, UINT);
00610 friend inline UINT WN_bit_offset (const WN *);
00611 friend inline void WN_set_bit_offset (WN *, UINT);
00612 friend inline UINT WN_bit_size (const WN *);
00613 friend inline void WN_set_bit_size (WN *, UINT);
00614 friend inline TYPE_ID WN_desc (const WN *);
00615 friend inline void WN_set_desc (WN *, TYPE_ID);
00616 friend inline INT32 WN_map_id (const WN *);
00617 friend inline INT32& WN_map_id (WN *);
00618
00619 friend inline TY_IDX WN_ty (const WN *, const int);
00620 friend inline TY_IDX& WN_ty (WN *, const int);
00621 friend inline WN* WN_kid (const WN *, const int);
00622 friend inline WN*& WN_kid (WN *, const int);
00623 friend inline WN* WN_kid0 (const WN *);
00624 friend inline WN*& WN_kid0 (WN *);
00625 friend inline WN* WN_kid1 (const WN *);
00626 friend inline WN*& WN_kid1 (WN *);
00627 friend inline WN* WN_kid2 (const WN *);
00628 friend inline WN*& WN_kid2 (WN *);
00629 friend inline WN* WN_kid3 (const WN *);
00630 friend inline WN*& WN_kid3 (WN *);
00631 friend inline INT64 WN_const_val (const WN *);
00632 friend inline INT64& WN_const_val (WN *);
00633 friend inline UINT32 WN_label_flag (const WN *);
00634 friend inline UINT32& WN_label_flag (WN *);
00635
00636 friend inline WN* WN_first (const WN *);
00637 friend inline WN*& WN_first (WN *);
00638 friend inline WN* WN_last (const WN *);
00639 friend inline WN*& WN_last (WN *);
00640
00641 friend inline INT64 WN_pragma_arg64 (const WN *);
00642 friend inline INT64& WN_pragma_arg64 (WN *);
00643 friend inline INT32 WN_pragma_arg1 (const WN *);
00644 friend inline INT32& WN_pragma_arg1 (WN *);
00645 friend inline INT32 WN_pragma_arg2 (const WN *);
00646 friend inline INT32& WN_pragma_arg2 (WN *);
00647 friend inline mINT8 WN_pragma_distr_type (const WN *);
00648 friend inline mINT8& WN_pragma_distr_type (WN *);
00649 friend inline mINT8 WN_pragma_index (const WN *);
00650 friend inline mINT8& WN_pragma_index (WN *);
00651 friend inline INT32 WN_pragma_preg (const WN *);
00652 friend inline INT32& WN_pragma_preg (WN *);
00653
00654 friend inline char * WN_pragma_asm_constraint (const WN *);
00655 friend inline PREG_NUM WN_pragma_asm_copyout_preg (const WN *);
00656 friend inline void WN_set_pragma_asm_copyout_preg (WN *, PREG_NUM);
00657
00658 friend inline OPCODE WN_opcode (const WN*);
00659 friend inline void WN_set_opcode (WN*, OPCODE);
00660 friend inline TY_IDX WN_ty (const WN*);
00661 friend inline void WN_set_ty (WN*, TY_IDX);
00662 friend inline TY_IDX WN_load_addr_ty (const WN *);
00663 friend inline void WN_set_load_addr_ty (WN*, TY_IDX);
00664
00665 friend inline void WN_Copy_u1u2 (WN*, const WN*);
00666 friend inline void WN_Copy_u3 (WN*, const WN*);
00667
00668 #endif
00669 };
00670
00671 #ifndef WN_NO_ACCESSOR_FUNCTIONS
00672
00673 inline WN_OFFSET WN_load_offset (const WN* wn) { return wn->u1u2.uu.ua.load_offset; }
00674 inline WN_OFFSET& WN_load_offset (WN* wn) { return wn->u1u2.uu.ua.load_offset; }
00675 inline WN_OFFSET WN_lda_offset (const WN* wn) { return wn->u1u2.uu.ua.lda_offset; }
00676 inline WN_OFFSET& WN_lda_offset (WN* wn) { return wn->u1u2.uu.ua.lda_offset; }
00677 inline WN_OFFSET WN_store_offset (const WN* wn) { return wn->u1u2.uu.ua.store_offset; }
00678 inline WN_OFFSET& WN_store_offset (WN* wn) { return wn->u1u2.uu.ua.store_offset; }
00679 inline WN_OFFSET WN_idname_offset (const WN* wn) { return wn->u1u2.uu.ua.idname_offset; }
00680 inline WN_OFFSET& WN_idname_offset (WN* wn) { return wn->u1u2.uu.ua.idname_offset; }
00681 inline WN_OFFSET WN_offset (const WN* wn) { return wn->u1u2.uu.ua.idname_offset; }
00682 inline WN_OFFSET& WN_offset (WN* wn) { return wn->u1u2.uu.ua.idname_offset; }
00683 inline INT32 WN_num_entries (const WN* wn) { return wn->u1u2.uu.ua.num_entries; }
00684 inline INT32& WN_num_entries (WN* wn) { return wn->u1u2.uu.ua.num_entries; }
00685 inline INT16 WN_cvtl_bits (const WN* wn) { return wn->u1u2.uu.ua.cvtl_bits; }
00686 inline INT16& WN_cvtl_bits (WN* wn) { return wn->u1u2.uu.ua.cvtl_bits; }
00687 inline INT32 WN_label_number (const WN* wn) { return wn->u1u2.uu.ua.label_number; }
00688 inline INT32& WN_label_number (WN* wn) { return wn->u1u2.uu.ua.label_number; }
00689 inline UINT32 WN_call_flag (const WN* wn) { return wn->u1u2.uu.ua.call_flag; }
00690 inline UINT32& WN_call_flag (WN* wn) { return wn->u1u2.uu.ua.call_flag; }
00691
00692 inline UINT32 WN_eq_logical_flag (const WN* wn) { return wn->u1u2.uu.ua.eq_logical_flag; }
00693 inline UINT32& WN_eq_logical_flag (WN* wn) { return wn->u1u2.uu.ua.eq_logical_flag; }
00694
00695 inline UINT32 WN_if_flag (const WN* wn) { return wn->u1u2.uu.ua.if_flag; }
00696 inline UINT32& WN_if_flag (WN* wn) { return wn->u1u2.uu.ua.if_flag; }
00697 inline UINT32 WN_io_flag (const WN* wn) { return wn->u1u2.uu.ua.io_flag; }
00698 inline UINT32& WN_io_flag (WN* wn) { return wn->u1u2.uu.ua.io_flag; }
00699 inline UINT32 WN_asm_flag (const WN *wn) { return wn->u1u2.uu.ua.asm_flag; }
00700 inline UINT32& WN_asm_flag (WN *wn) { return wn->u1u2.uu.ua.asm_flag; }
00701 inline UINT32 WN_label_level (const WN *wn) { return wn->u1u2.uu.ub.label_level; }
00702 inline UINT32& WN_label_level (WN *wn) { return wn->u1u2.uu.ub.label_level; }
00703 inline mUINT16 WN_loop_trip_est (const WN* wn) { return wn->u1u2.uu.ua.li.trip_est; }
00704 inline mUINT16& WN_loop_trip_est (WN* wn) { return wn->u1u2.uu.ua.li.trip_est; }
00705 inline mUINT16 WN_loop_depth (const WN* wn) { return wn->u1u2.uu.ua.li.loop_depth; }
00706 inline mUINT16& WN_loop_depth (WN* wn) { return wn->u1u2.uu.ua.li.loop_depth; }
00707 inline mUINT16 WN_pragma_flags (const WN* wn) { return wn->u1u2.uu.ua.pragma.pragma_flags; }
00708 inline mUINT16& WN_pragma_flags (WN* wn) { return wn->u1u2.uu.ua.pragma.pragma_flags; }
00709 inline mUINT16 WN_pragma (const WN* wn) { return wn->u1u2.uu.ua.pragma.pragma_id; }
00710 inline mUINT16& WN_pragma (WN* wn) { return wn->u1u2.uu.ua.pragma.pragma_id; }
00711
00712 inline char *WN_pragma_asm_constraint(const WN *wn) { return ST_name(&St_Table[(ST_IDX) WN_pragma_arg1(wn)]); }
00713 inline PREG_NUM WN_pragma_asm_copyout_preg(const WN *wn) { return wn->u3.pragma.up1.asm_pragma.pragma_asm_copyout_preg; }
00714 inline void WN_set_pragma_asm_copyout_preg(WN *wn, PREG_NUM r) { wn->u3.pragma.up1.asm_pragma.pragma_asm_copyout_preg = r; }
00715 inline UINT32 WN_pragma_asm_opnd_num(const WN *wn) { return wn->u3.pragma.up1.asm_pragma.pragma_asm_opnd_num; }
00716 inline void WN_set_pragma_asm_opnd_num(WN *wn, UINT32 i) { wn->u3.pragma.up1.asm_pragma.pragma_asm_opnd_num = i; }
00717
00718 inline REGION_KIND WN_region_kind (const WN* wn) { return wn->u1u2.uu.ua.region.region_kind; }
00719 inline void WN_set_region_kind (WN* wn, REGION_KIND k) { wn->u1u2.uu.ua.region.region_kind = k; }
00720 inline mUINT32 WN_region_id (const WN* wn) { return wn->u1u2.uu.ua.region.region_id; }
00721 inline void WN_set_region_id (WN* wn, mUINT32 i) { wn->u1u2.uu.ua.region.region_id = i; }
00722
00723 inline ST_IDX WN_st_idx (const WN* wn) { return wn->u1u2.uu.ub.st_idx; }
00724 inline ST_IDX& WN_st_idx (WN* wn) { return wn->u1u2.uu.ub.st_idx; }
00725 inline INTRINSIC WN_intrinsic (const WN* wn) { return wn->u1u2.uu.ub.intrinsic; }
00726 inline INTRINSIC& WN_intrinsic (WN* wn) { return wn->u1u2.uu.ub.intrinsic; }
00727 inline IOSTATEMENT WN_io_statement(const WN* wn) { return wn->u1u2.uu.ub.iostatement; }
00728 inline IOSTATEMENT& WN_io_statement(WN* wn) { return wn->u1u2.uu.ub.iostatement; }
00729 inline IOITEM WN_io_item(const WN* wn) { return wn->u1u2.uu.ub.ioitem; }
00730 inline IOITEM & WN_io_item(WN* wn) { return wn->u1u2.uu.ub.ioitem; }
00731 inline UINT32 WN_prefetch_flag (const WN* wn) { return wn->u1u2.uu.ub.prefetch_flag; }
00732 inline UINT32& WN_prefetch_flag (WN* wn) { return wn->u1u2.uu.ub.prefetch_flag; }
00733 inline UINT32 WN_loop_flag (const WN* wn) { return wn->u1u2.uu.ub.loop_flag; }
00734 inline UINT32& WN_loop_flag (WN* wn) { return wn->u1u2.uu.ub.loop_flag; }
00735 inline INT32 WN_last_label (const WN* wn) { return wn->u1u2.uu.ub.last_label; }
00736 inline INT32& WN_last_label (WN* wn) { return wn->u1u2.uu.ub.last_label; }
00737 inline INITO_IDX WN_ereg_supp (const WN* wn) { return wn->u1u2.uu.ub.ereg_supp; }
00738 inline INITO_IDX& WN_ereg_supp (WN* wn) { return wn->u1u2.uu.ub.ereg_supp; }
00739 inline WN_ESIZE WN_element_size (const WN* wn) { return wn->u1u2.element_size; }
00740 inline WN_ESIZE& WN_element_size (WN* wn) { return wn->u1u2.element_size; }
00741
00742 inline OPERATOR WN_operator (const WN* wn) { return wn->common.wn_operator; }
00743 inline void WN_set_operator (WN* wn, OPERATOR opr) { wn->common.wn_operator = opr; }
00744 inline TYPE_ID WN_rtype (const WN* wn) { return wn->common.rtype; }
00745 inline void WN_set_rtype (WN* wn, TYPE_ID ty) { wn->common.rtype = ty; }
00746 inline INT WN_kid_count (const WN* wn) { return OPERATOR_nkids(WN_operator(wn)) == -1 ? wn->common.kid_count : OPERATOR_nkids(WN_operator(wn)); }
00747 inline void WN_set_kid_count (WN* wn, UINT n) { if (OPERATOR_nkids(WN_operator(wn)) == -1) wn->common.kid_count = n; }
00748 inline UINT WN_field_id (const WN* wn) { return wn->common.kid_count; }
00749 inline void WN_set_field_id (WN* wn, UINT n) { wn->common.kid_count = (n > MAX_FIELD_ID) ? UNKNOWN_FIELD_ID : n; }
00750 inline UINT WN_bit_offset (const WN* wn) { return wn->common.kid_count >> 7; }
00751 inline UINT WN_bit_size (const WN* wn) { return wn->common.kid_count & 0x7f; }
00752 inline void WN_set_bit_offset_size (WN* wn, UINT ofst, UINT siz) { wn->common.kid_count = ((ofst << 7) + siz); }
00753 inline TYPE_ID WN_desc (const WN* wn) { return wn->common.desc; }
00754 inline void WN_set_desc (WN* wn, TYPE_ID ty) { wn->common.desc = ty; }
00755 inline INT32 WN_map_id (const WN* wn) { return wn->common.map_id; }
00756 inline INT32& WN_map_id (WN* wn) { return wn->common.map_id; }
00757
00758 inline WN* WN_kid (const WN* wn, const int i) { return wn->u3.kids [i]; }
00759 inline WN*& WN_kid (WN* wn, const int i) { return wn->u3.kids [i]; }
00760 inline WN* WN_kid0 (const WN* wn) { return wn->u3.kids [0]; }
00761 inline WN*& WN_kid0 (WN* wn) { return wn->u3.kids [0]; }
00762 inline WN* WN_kid1 (const WN* wn) { return wn->u3.kids [1]; }
00763 inline WN*& WN_kid1 (WN* wn) { return wn->u3.kids [1]; }
00764 inline WN* WN_kid2 (const WN* wn) { return wn->u3.kids [2]; }
00765 inline WN*& WN_kid2 (WN* wn) { return wn->u3.kids [2]; }
00766 inline WN* WN_kid3 (const WN* wn) { return wn->u3.kids [3]; }
00767 inline WN*& WN_kid3 (WN* wn) { return wn->u3.kids [3]; }
00768
00769 inline INT64 WN_const_val (const WN* wn) { return wn->u3.const_val; }
00770 inline INT64& WN_const_val (WN* wn) { return wn->u3.const_val; }
00771 inline UINT32 WN_label_flag (const WN* wn) { return wn->u3.label_flag_fields.label_flag; }
00772 inline UINT32& WN_label_flag (WN* wn) { return wn->u3.label_flag_fields.label_flag; }
00773 inline WN* WN_first (const WN* wn) { return wn->u3.block.first; }
00774 inline WN*& WN_first (WN* wn) { return wn->u3.block.first; }
00775 inline WN* WN_last (const WN* wn) { return wn->u3.block.last; }
00776 inline WN*& WN_last (WN* wn) { return wn->u3.block.last; }
00777 inline UINT32 WN_asm_num_inputs (const WN *wn) { return wn->u3.asm_fields.num_inputs; }
00778 inline UINT32& WN_asm_num_inputs (WN *wn) { return wn->u3.asm_fields.num_inputs; }
00779 inline UINT32 WN_asm_opnd_num (const WN *wn) { return wn->u1u2.uu.ua.asm_operand_num; }
00780 inline UINT32& WN_asm_opnd_num (WN *wn) { return wn->u1u2.uu.ua.asm_operand_num; }
00781 inline UINT32 WN_asm_num_clobbers (const WN *wn) { return wn->u3.asm_fields.num_clobbers; }
00782 inline UINT32& WN_asm_num_clobbers (WN *wn) { return wn->u3.asm_fields.num_clobbers; }
00783 inline INT64 WN_pragma_arg64 (const WN* wn) { return wn->u3.pragma.pragma_arg64; }
00784 inline INT64& WN_pragma_arg64 (WN* wn) { return wn->u3.pragma.pragma_arg64; }
00785 inline INT32 WN_pragma_arg1 (const WN* wn) { return wn->u3.pragma.up1.pragma_arg1; }
00786 inline INT32& WN_pragma_arg1 (WN* wn) { return wn->u3.pragma.up1.pragma_arg1; }
00787 inline INT32 WN_pragma_arg2 (const WN* wn) { return wn->u3.pragma.up1.pragma_arg2; }
00788 inline INT32& WN_pragma_arg2 (WN* wn) { return wn->u3.pragma.up1.pragma_arg2; }
00789 inline mINT8 WN_pragma_distr_type (const WN* wn) { return wn->u3.pragma.up2.pragma_distr_type; }
00790 inline mINT8& WN_pragma_distr_type (WN* wn) { return wn->u3.pragma.up2.pragma_distr_type; }
00791 inline mINT8 WN_pragma_index (const WN* wn) { return wn->u3.pragma.up2.pragma_index; }
00792 inline mINT8& WN_pragma_index (WN* wn) { return wn->u3.pragma.up2.pragma_index; }
00793 inline INT32 WN_pragma_preg (const WN* wn) { return wn->u3.pragma.up2.pragma_preg; }
00794 inline INT32& WN_pragma_preg (WN* wn) { return wn->u3.pragma.up2.pragma_preg; }
00795
00796
00797
00798 inline void WN_Copy_u1u2 (WN* dst, const WN* src) { dst->u1u2 = src->u1u2; }
00799 inline void WN_Copy_u3 (WN* dst, const WN* src) { dst->u3 = src->u3; }
00800
00801 #else
00802
00803 #define WN_load_offset(x) ((x)->u1u2.uu.ua.load_offset)
00804 #define WN_lda_offset(x) ((x)->u1u2.uu.ua.lda_offset)
00805 #define WN_store_offset(x) ((x)->u1u2.uu.ua.store_offset)
00806 #define WN_idname_offset(x) ((x)->u1u2.uu.ua.idname_offset)
00807 #define WN_offset(x) ((x)->u1u2.uu.ua.idname_offset)
00808 #define WN_num_entries(x) ((x)->u1u2.uu.ua.num_entries)
00809 #define WN_cvtl_bits(x) ((x)->u1u2.uu.ua.cvtl_bits)
00810 #define WN_label_number(x) ((x)->u1u2.uu.ua.label_number)
00811 #define WN_call_flag(x) ((x)->u1u2.uu.ua.call_flag)
00812
00813 #define WN_eq_logical_flag(x) ((x)->u1u2.uu.ua.eq_logical_flag)
00814
00815 #define WN_if_flag(x) ((x)->u1u2.uu.ua.if_flag)
00816 #define WN_io_flag(x) ((x)->u1u2.uu.ua.io_flag)
00817 #define WN_asm_flag(x) ((x)->u1u2.uu.ua.asm_flag)
00818 #define WN_asm_string(x) (ST_name(WN_st(x)))
00819 #define WN_asm_input_constraint(x) (ST_name(WN_st(x)))
00820 #define WN_loop_trip_est(x) ((x)->u1u2.uu.ua.li.trip_est)
00821 #define WN_loop_depth(x) ((x)->u1u2.uu.ua.li.loop_depth)
00822 #define WN_pragma_flags(x) ((x)->u1u2.uu.ua.pragma.pragma_flags)
00823 #define WN_pragma(x) ((x)->u1u2.uu.ua.pragma.pragma_id)
00824 #define WN_pragma_asm_constraint(x) (ST_name(&St_Table[(ST_IDX) WN_pragma_arg1(wn)]))
00825 #define WN_pragma_asm_copyout_preg(x) ((PREG_NUM) (x)->u3.pragma.up1.asm_pragma.pragma_asm_copyout_preg)
00826 #define WN_pragma_asm_opnd_num(x) ((x)->u3.pragma.up1.asm_pragma.pragma_asm_opnd_num)
00827 #define WN_region_kind(x) ((REGION_KIND)((x)->u1u2.uu.ua.region.region_kind))
00828 #define WN_set_region_kind(x,y) ((x)->u1u2.uu.ua.region.region_kind = y)
00829 #define WN_region_id(x) ((mUINT32)((x)->u1u2.uu.ua.region.region_id))
00830 #define WN_st_idx(x) ((x)->u1u2.uu.ub.st_idx)
00831 #define WN_intrinsic(x) ((x)->u1u2.uu.ub.intrinsic)
00832 #define WN_io_statement(x) ((x)->u1u2.uu.ub.iostatement)
00833 #define WN_io_item(x) ((x)->u1u2.uu.ub.ioitem)
00834 #define WN_prefetch_flag(x) ((x)->u1u2.uu.ub.prefetch_flag)
00835 #define WN_loop_flag(x) ((x)->u1u2.uu.ub.loop_flag)
00836 #define WN_last_label(x) ((x)->u1u2.uu.ub.last_label)
00837 #define WN_ereg_supp(x) ((x)->u1u2.uu.ub.ereg_supp)
00838
00839 #define WN_asm_num_inputs(x) ((x)->u3.asm_fields.num_inputs)
00840 #define WN_asm_num_clobbers(x) ((x)->u3.asm_fields.num_clobbers)
00841
00842 #define WN_asm_opnd_num(x) ((x)->u1u2.uu.ua.asm_operand_num)
00843
00844 #define WN_element_size(x) ((x)->u1u2.element_size)
00845
00846 #define WN_operator(x) ((OPERATOR) (x)->common.wn_operator)
00847 #define WN_set_operator(x,y) ((x)->common.wn_operator = y)
00848 #define WN_rtype(x) ((TYPE_ID) (x)->common.rtype)
00849 #define WN_set_rtype(x,y) ((x)->common.rtype = y)
00850 #define WN_kid_count(x) (OPERATOR_nkids(WN_operator(x)) == -1 ? (x)->common.kid_count : OPERATOR_nkids(WN_operator(x)))
00851 #define WN_set_kid_count(x,y) if (OPERATOR_nkids(WN_operator(x)) == -1) (x)->common.kid_count = y; else
00852 #define WN_field_id(x) ((x)->common.kid_count)
00853 #define WN_set_field_id(x,y) ((x)->common.kid_count = (y > MAX_FIELD_ID) ? UNKNOWN_FIELD_ID : y)
00854 #define WN_bit_offset(x) ((x)->common.kid_count >> 7)
00855 #define WN_bit_size(x) ((x)->common.kid_count & 0x7f)
00856 #define WN_set_bit_offset_size(x,y,z) ((x)->common.kid_count = ((y << 7) + z))
00857 #define WN_desc(x) ((TYPE_ID) (x)->common.desc)
00858 #define WN_set_desc(x,y) ((x)->common.desc = y)
00859 #define WN_map_id(x) ((x)->common.map_id)
00860
00861 #define WN_kid(x,i) ((x)->u3.kids[i])
00862 #define WN_kid0(x) WN_kid((x),0)
00863 #define WN_kid1(x) WN_kid((x),1)
00864 #define WN_kid2(x) WN_kid((x),2)
00865 #define WN_kid3(x) WN_kid((x),3)
00866 #define WN_const_val(x) ((x)->u3.const_val)
00867 #define WN_label_flag(x) ((x)->u3.label_flag_fields.label_flag)
00868 #define WN_first(x) ((x)->u3.block.first)
00869 #define WN_last(x) ((x)->u3.block.last)
00870 #define WN_pragma_arg64(x) ((x)->u3.pragma.pragma_arg64)
00871 #define WN_pragma_arg1(x) ((x)->u3.pragma.up1.pragma_arg1)
00872 #define WN_pragma_arg2(x) ((x)->u3.pragma.up1.pragma_arg2)
00873 #define WN_pragma_distr_type(x) ((x)->u3.pragma.up2.pragma_distr_type)
00874 #define WN_pragma_index(x) ((x)->u3.pragma.up2.pragma_index)
00875 #define WN_pragma_preg(x) ((x)->u3.pragma.up2.pragma_preg)
00876
00877 #define WN_Copy_u1u2(x,y) ((x)->u1u2 = (y)->u1u2)
00878 #define WN_Copy_u3(x,y) ((x)->u3 = (y)->u3)
00879
00880 #endif
00881
00882 #define WN_num_dim(x) (WN_kid_count(x)>>1)
00883
00884 #define WN_asm_clobbers(x) (WN_kid0(x))
00885 #define WN_asm_constraints(x) (WN_kid1(x))
00886
00887 inline OPCODE
00888 WN_opcode (const WN *wn) {
00889 return OPCODE_make_op (wn->common.wn_operator,
00890 wn->common.rtype,
00891 wn->common.desc);
00892 }
00893
00894 inline void
00895 WN_set_opcode (WN *wn, OPCODE opc) {
00896 wn->common.wn_operator = OPCODE_operator(opc);
00897 wn->common.rtype = OPCODE_rtype(opc);
00898 wn->common.desc = OPCODE_desc(opc);
00899 }
00900
00901 class STMT_WN_BASE {
00902 public:
00903 WN *prev;
00904 WN *next;
00905 mUINT64 linenum;
00906 };
00907
00908 class STMT_WN : public STMT_WN_BASE {
00909 public:
00910 WN wn;
00911
00912 #ifndef WN_NO_ACCESSOR_FUNCTIONS
00913 friend inline WN* WN_prev (const WN*);
00914 friend inline WN*& WN_prev (WN*);
00915 friend inline WN* WN_next (const WN*);
00916 friend inline WN*& WN_next (WN*);
00917 friend inline mUINT64 WN_linenum (const WN*);
00918 friend inline mUINT64& WN_linenum (WN*);
00919 friend inline void* WN_StartAddress (WN*);
00920 friend inline WN* WN_prev_free (const STMT_WN*);
00921 friend inline WN*& WN_prev_free (STMT_WN*);
00922 friend inline WN& WN_real_fields (STMT_WN*);
00923 #endif
00924 };
00925
00926
00927
00928
00929 #define WN_CAST_WN_TO_STMT_WN(x) ((STMT_WN *)( (STMT_WN_BASE *)x - 1))
00930
00931 #ifndef WN_NO_ACCESSOR_FUNCTIONS
00932 inline WN* WN_prev (const WN* wn) { return (WN_CAST_WN_TO_STMT_WN(wn)->prev); }
00933 inline WN*& WN_prev (WN* wn) { return (WN_CAST_WN_TO_STMT_WN(wn)->prev); }
00934 inline WN* WN_next (const WN* wn) { return (WN_CAST_WN_TO_STMT_WN(wn)->next); }
00935 inline WN*& WN_next (WN* wn) { return (WN_CAST_WN_TO_STMT_WN(wn)->next); }
00936 inline mUINT64 WN_linenum (const WN* wn) { return (WN_CAST_WN_TO_STMT_WN(wn)->linenum); }
00937 inline mUINT64& WN_linenum (WN* wn) { return (WN_CAST_WN_TO_STMT_WN(wn)->linenum); }
00938 inline WN* WN_prev_free (const STMT_WN* stmt_wn) { return stmt_wn->prev; }
00939 inline WN*& WN_prev_free (STMT_WN* stmt_wn) { return stmt_wn->prev; }
00940 inline WN& WN_real_fields (STMT_WN* stmt_wn) { return stmt_wn->wn; }
00941 #else
00942 #define WN_next(x) (WN_CAST_WN_TO_STMT_WN(x)->next)
00943 #define WN_next_func(x) (WN_CAST_WN_TO_STMT_WN(x)->next)
00944 #define WN_prev(x) (WN_CAST_WN_TO_STMT_WN(x)->prev)
00945 #define WN_linenum(x) (WN_CAST_WN_TO_STMT_WN(x)->linenum)
00946
00947
00948 #define WN_real_fields(x) ((x)->wn)
00949 #define WN_prev_free(x) ((x)->prev)
00950 #endif
00951
00952 #define WN_has_sym(x) (OPERATOR_has_sym(WN_operator(x)))
00953
00954
00955 inline ST *
00956 WN_st (const WN *x)
00957 {
00958 Is_True(WN_has_sym(x), ("WN_st: wn doesn't have ST field"));
00959 Is_True(ST_IDX_index(WN_st_idx(x)) != 0 ||
00960 WN_st_idx(x) == 0,
00961 ("WN_st: zero index in nonzero level disallowed"));
00962 return (WN_st_idx(x) != 0 ?
00963 &St_Table[WN_st_idx(x)] :
00964 NULL);
00965 }
00966
00967 #ifndef WN_NO_ACCESSOR_FUNCTIONS
00968 inline char * WN_asm_string(const WN *wn) { return ST_name(WN_st(wn)); }
00969 inline char * WN_asm_input_constraint(const WN *wn) { return ST_name(WN_st(wn)); }
00970 #endif
00971
00972 #define WN_parm_flag(x) WN_call_flag(x)
00973 #define WN_region_is_EH(x) (WN_region_kind(x) & REGION_KIND_EH)
00974 #define WN_label_loop_info(x) \
00975 (WN_kid_count(x)>0 ? WN_kid((x),0) : NULL)
00976 #define WN_set_label_loop_info(x,li) (WN_kid0(x) = (li))
00977
00978
00979
00980 #define WN_PRAGMA_COMPILER_GENERATED 0x01
00981 #define WN_PRAGMA_OMP 0x02
00982
00983 #define WN_pragma_compiler_generated(x) ((WN_pragma_flags(x))&WN_PRAGMA_COMPILER_GENERATED)
00984 #define WN_set_pragma_compiler_generated(x) ((WN_pragma_flags(x))|=WN_PRAGMA_COMPILER_GENERATED)
00985 #define WN_pragma_omp(x) ((WN_pragma_flags(x)) & WN_PRAGMA_OMP)
00986 #define WN_set_pragma_omp(x) ((WN_pragma_flags(x)) |= WN_PRAGMA_OMP)
00987 #define WN_reset_pragma_omp(x) ((WN_pragma_flags(x)) &= ~(WN_PRAGMA_OMP))
00988
00989
00990 #define WN_entry_name(x) WN_st_idx(x)
00991 #define WN_formal(x,i) WN_kid((x),i)
00992 #define WN_num_formals(x) (WN_kid_count(x)-3)
00993 #define WN_func_pragmas(x) WN_kid((x),WN_kid_count(x)-3)
00994 #define WN_func_varrefs(x) WN_kid((x),WN_kid_count(x)-2)
00995 #define WN_func_body(x) WN_kid((x),WN_kid_count(x)-1)
00996 #define WN_entry_first(x) WN_first(WN_func_body(x))
00997 #define WN_entry_last(x) WN_last(WN_func_body(x))
00998 #define WN_actual(x,i) WN_kid((x),i)
00999
01000
01001 #define WN_index(x) WN_kid((x),0)
01002 #define WN_start(x) WN_kid((x),1)
01003 #define WN_end(x) WN_kid((x),2)
01004 #define WN_step(x) WN_kid((x),3)
01005 #define WN_do_body(x) WN_kid((x),4)
01006 #define WN_do_loop_info(x) \
01007 (WN_kid_count(x)>5 ? WN_kid((x),5) : NULL)
01008 #define WN_set_do_loop_info(x,li) (WN_kid((x),5) = (li))
01009
01010 #define WN_while_test(x) WN_kid((x),0)
01011 #define WN_while_body(x) WN_kid((x),1)
01012
01013 #define WN_if_test(x) WN_kid((x),0)
01014 #define WN_then(x) WN_kid((x),1)
01015 #define WN_else(x) WN_kid((x),2)
01016 #define WN_else_is_empty(x) (WN_first(WN_else(x)) == NULL)
01017
01018 #define WN_region_exits(x) WN_kid((x),0)
01019 #define WN_region_pragmas(x) WN_kid((x),1)
01020 #define WN_region_body(x) WN_kid((x),2)
01021
01022 #define WN_array_index(x,i) WN_kid((x),WN_num_dim(x)+i+1)
01023 #define WN_array_dim(x,i) WN_kid((x),i+1)
01024 #define WN_array_base(x) WN_kid((x),0)
01025
01026
01027 #define WN_loop_induction(x)\
01028 (WN_kid_count(x)>0 ? WN_kid((x),0) : NULL)
01029 #define WN_set_loop_induction(x,ind) (WN_kid((x),0) = (ind))
01030 #define WN_loop_trip(x) \
01031 (WN_kid_count(x)>1 ? WN_kid((x),1) : NULL)
01032 #define WN_set_loop_trip(x,trip) (WN_kid((x),1) = (trip))
01033
01034
01035 #define WN_switch_test(x) WN_kid((x),0)
01036 #define WN_switch_table(x) WN_kid((x),1)
01037 #define WN_switch_default(x) WN_kid((x),2)
01038
01039 #if (defined(_LP64) || defined(__GNUC__)) && !defined(_SGI_COMPILER_VERSION)
01040
01041 #else
01042 #define max(a,b) ((a > b) ? a : b)
01043 #endif
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077 #define WN_operator_is(x,y) (WN_operator(x)==(y))
01078
01079
01080 #define WN_class(x) (ST_class(WN_st(x)))
01081 #define WN_sclass(x) (ST_sclass(WN_st(x)))
01082 #define WN_type(x) (ST_type(WN_st(x)))
01083
01084 inline TCON&
01085 WN_val (const WN *x) { return ST_tcon_val (WN_st(x)); }
01086
01087 inline TYPE_ID
01088 WN_val_type (const WN *x) { return TCON_ty (WN_val (x)); }
01089
01090
01091 #define WN_has_map_id(x) (WN_map_id(x)!= -1)
01092
01093 #define WN_block_empty(x) (WN_first(x) == NULL)
01094 #define WN_block_nonempty(x) (WN_first(x) != NULL)
01095
01096
01097
01098
01099
01100
01101
01102 inline TY_IDX WN_ty(const WN *wn)
01103 {
01104 OPERATOR opr;
01105 opr = WN_operator(wn);
01106 if ((opr == OPR_LDA) || (opr == OPR_LDID) || (opr == OPR_STID) ||
01107 (opr == OPR_LDBITS) || (opr == OPR_STBITS)|| (opr == OPR_PSTID)) {
01108 return(wn->u3.ty_fields.ty);
01109 } else if (opr == OPR_IO_ITEM) {
01110 return (wn->u1u2.uu.ua.io_item_ty);
01111 } else {
01112 return (wn->u1u2.uu.ub.ty);
01113 }
01114 }
01115
01116
01117 inline void WN_set_ty(WN *wn, TY_IDX ty)
01118 {
01119 OPERATOR opr;
01120 opr = WN_operator(wn);
01121 if ((opr == OPR_LDA) || (opr == OPR_LDID) || (opr == OPR_STID) ||
01122 (opr == OPR_LDBITS) || (opr == OPR_STBITS)|| (opr == OPR_PSTID)) {
01123 wn->u3.ty_fields.ty = ty;
01124 } else if (opr == OPR_IO_ITEM) {
01125 wn->u1u2.uu.ua.io_item_ty = ty;
01126 } else {
01127 wn->u1u2.uu.ub.ty = ty;
01128 }
01129 }
01130
01131
01132
01133
01134 inline TY_IDX WN_load_addr_ty(const WN *wn)
01135 {
01136 OPERATOR opr;
01137 opr = WN_operator(wn);
01138 if (opr == OPR_ILOAD || opr == OPR_ILDBITS) {
01139 return(wn->u3.ty_fields.ty);
01140 } else {
01141 return (wn->u1u2.uu.ua.loadx_addr_ty);
01142 }
01143 }
01144
01145
01146 inline void WN_set_load_addr_ty(WN *wn, TY_IDX ty)
01147 {
01148 OPERATOR opr;
01149 opr = WN_operator(wn);
01150 if (opr == OPR_ILOAD || opr == OPR_ILDBITS) {
01151 wn->u3.ty_fields.ty = ty;
01152 } else {
01153 wn->u1u2.uu.ua.loadx_addr_ty = ty;
01154 }
01155 }
01156
01157
01158
01159
01160
01161
01162 inline UINT32 WN_flag(const WN *wn)
01163 {
01164 OPERATOR opr;
01165 opr = WN_operator(wn);
01166 switch (opr) {
01167 case OPR_CALL:
01168 case OPR_ICALL:
01169 case OPR_PICCALL:
01170 case OPR_INTRINSIC_CALL:
01171 case OPR_INTRINSIC_OP:
01172 case OPR_REGION:
01173 case OPR_PARM:
01174 return(WN_call_flag(wn));
01175 case OPR_PREFETCH:
01176 case OPR_PREFETCHX:
01177 return(WN_prefetch_flag(wn));
01178 case OPR_IF:
01179 return (WN_if_flag(wn));
01180 case OPR_LOOP_INFO:
01181 return (WN_loop_flag(wn));
01182 case OPR_IO:
01183 return (WN_io_flag(wn));
01184 case OPR_ASM_STMT:
01185 return (WN_asm_flag(wn));
01186
01187 case OPR_EQ:
01188 case OPR_NE:
01189 return (WN_eq_logical_flag(wn));
01190
01191 default:
01192 return(WN_label_flag(wn));
01193 }
01194 }
01195
01196
01197 inline void WN_set_flag(WN *wn, UINT32 flag)
01198 {
01199 OPERATOR opr;
01200 opr = WN_operator(wn);
01201 switch (opr) {
01202 case OPR_CALL:
01203 case OPR_ICALL:
01204 case OPR_PICCALL:
01205 case OPR_INTRINSIC_CALL:
01206 case OPR_INTRINSIC_OP:
01207 case OPR_REGION:
01208 case OPR_PARM:
01209 WN_call_flag(wn) = flag;
01210 break;
01211 case OPR_PREFETCH:
01212 case OPR_PREFETCHX:
01213 WN_prefetch_flag(wn) = flag;
01214 break;
01215 case OPR_IF:
01216 WN_if_flag(wn) = flag;
01217 break;
01218 case OPR_IO:
01219 WN_io_flag(wn) = flag;
01220 break;
01221 case OPR_LOOP_INFO:
01222 WN_loop_flag(wn) = flag;
01223 break;
01224 case OPR_EQ:
01225 case OPR_NE:
01226 WN_eq_logical_flag(wn) =flag;
01227
01228 default:
01229 WN_label_flag(wn) = flag;
01230 break;
01231 }
01232 }
01233
01234
01235
01236
01237 inline void *WN_StartAddress(WN *wn)
01238 {
01239 if (OPCODE_has_next_prev(WN_opcode(wn))) {
01240 return((void *)WN_CAST_WN_TO_STMT_WN(wn));
01241 } else return((void *) wn);
01242 }
01243
01244
01245
01246 inline INT32 WN_Size(WN *wn)
01247 {
01248 INT16 extra_kids = max(0,WN_kid_count(wn)-2);
01249 if (OPCODE_has_next_prev(WN_opcode(wn))) {
01250 return(sizeof(WN) + (2+extra_kids)*sizeof(WN*) + sizeof(mUINT64));
01251 } else {
01252 return(sizeof(WN) + (0+extra_kids)*sizeof(WN*));
01253 }
01254 }
01255
01256
01257 inline void WN_Set_Linenum(WN *wn, INT64 ln)
01258 {
01259 Is_True(OPCODE_has_next_prev(WN_opcode(wn)),
01260 ("can only set line numbers for statements"));
01261 WN_linenum(wn) = ln;
01262 }
01263
01264
01265 inline INT64 WN_Get_Linenum(const WN *wn)
01266 {
01267 if (OPCODE_has_next_prev(WN_opcode(wn))) {
01268 return WN_linenum(wn);
01269 } else {
01270 return 0;
01271 }
01272 }
01273
01274
01275
01276 inline BOOL WN_Is_Volatile_Mem(const WN *wn)
01277 {
01278 OPCODE opc = WN_opcode(wn);
01279 if (OPCODE_has_1ty(opc) || OPCODE_has_2ty(opc)) {
01280 if (OPCODE_operator(opc) == OPR_ISTORE ||
01281 OPCODE_operator(opc) == OPR_PSTORE ||
01282 OPCODE_operator(opc) == OPR_MSTORE) {
01283 TY_IDX pointed = TY_pointed (Ty_Table[WN_ty (wn)]);
01284 DevAssert(pointed, ("TY_pointed of ISTORE/MSTORE type is NULL"));
01285 return TY_is_volatile(pointed);
01286 } else {
01287 return TY_is_volatile(WN_ty(wn)) ||
01288 OPCODE_has_2ty(opc) && TY_is_volatile(WN_load_addr_ty(wn));
01289 }
01290 }
01291 return FALSE;
01292 }
01293
01294
01295 #define WN_IF_IS_GUARD 0x1
01296 #define WN_Is_If_Guard(x) (WN_if_flag(x) & WN_IF_IS_GUARD)
01297 #define WN_Set_If_Guard(x) (WN_if_flag(x) |= WN_IF_IS_GUARD)
01298 #define WN_Reset_If_Guard(x) (WN_if_flag(x) &= ~(WN_IF_IS_GUARD))
01299
01300 #define WN_IF_IS_MPVERSION 0x2
01301 #define WN_Is_If_MpVersion(x) (WN_if_flag(x) & WN_IF_IS_MPVERSION)
01302 #define WN_Set_If_MpVersion(x) (WN_if_flag(x) |= WN_IF_IS_MPVERSION)
01303 #define WN_Reset_If_MpVersion(x) (WN_if_flag(x) &= ~(WN_IF_IS_MPVERSION))
01304
01305 #define WN_LABEL_BREAK 0x1
01306 #define WN_Label_Is_Break(x) (WN_label_flag(x) & WN_LABEL_BREAK)
01307 #define WN_Set_Label_Is_Break(x) (WN_label_flag(x) |= WN_LABEL_BREAK)
01308 #define WN_Reset_Label_Is_Break(x) (WN_label_flag(x) &= ~(WN_LABEL_BREAK))
01309
01310
01311
01312 #define WN_LOOP_INNERMOST 0x1
01313 #define WN_LOOP_WINDDOWN_REG 0x2
01314 #define WN_LOOP_WINDDOWN_CACHE 0x4
01315 #define WN_LOOP_UNIMPORTANT_MISC 0x8
01316 #define WN_LOOP_NZ_TRIP 0x10
01317
01318
01319 #define WN_LOOP_SYMB_TRIP 0x20
01320
01321
01322 #define WN_Loop_Innermost(x) (WN_loop_flag(x) & WN_LOOP_INNERMOST)
01323 #define WN_Set_Loop_Innermost(x) (WN_loop_flag(x) |= WN_LOOP_INNERMOST)
01324 #define WN_Reset_Loop_Innermost(x) (WN_loop_flag(x) &= ~WN_LOOP_INNERMOST)
01325
01326
01327
01328 #define WN_Loop_Winddown_Reg(x) (WN_loop_flag(x) & WN_LOOP_WINDDOWN_REG)
01329 #define WN_Set_Loop_Winddown_Reg(x) (WN_loop_flag(x) |= WN_LOOP_WINDDOWN_REG)
01330 #define WN_Reset_Loop_Winddown_Reg(x) \
01331 (WN_loop_flag(x) &= ~WN_LOOP_WINDDOWN_REG)
01332
01333
01334
01335 #define WN_Loop_Winddown_Cache(x) \
01336 (WN_loop_flag(x) & WN_LOOP_WINDDOWN_CACHE)
01337 #define WN_Set_Loop_Winddown_Cache(x) \
01338 (WN_loop_flag(x) |= WN_LOOP_WINDDOWN_CACHE)
01339 #define WN_Reset_Loop_Winddown_Cache(x) \
01340 (WN_loop_flag(x) &= ~WN_LOOP_WINDDOWN_CACHE)
01341
01342
01343
01344
01345
01346
01347
01348 #define WN_Loop_Unimportant_Misc(x) \
01349 (WN_loop_flag(x) & WN_LOOP_UNIMPORTANT_MISC)
01350 #define WN_Set_Loop_Unimportant_Misc(x) \
01351 (WN_loop_flag(x) |= WN_LOOP_UNIMPORTANT_MISC)
01352 #define WN_Reset_Loop_Unimportant_Misc(x) \
01353 (WN_loop_flag(x) &= ~WN_LOOP_UNIMPORTANT_MISC)
01354
01355 #define WN_Loop_Unimportant(x) \
01356 (WN_loop_flag(x) & \
01357 (WN_LOOP_WINDDOWN_CACHE | WN_LOOP_WINDDOWN_REG | WN_LOOP_UNIMPORTANT_MISC))
01358
01359 #define WN_Loop_Nz_Trip(x) (WN_loop_flag(x) & WN_LOOP_NZ_TRIP)
01360 #define WN_Set_Loop_Nz_Trip(x) (WN_loop_flag(x) |= WN_LOOP_NZ_TRIP)
01361 #define WN_Reset_Loop_Nz_Trip(x) (WN_loop_flag(x) &= ~WN_LOOP_NZ_TRIP)
01362
01363 #define WN_Loop_Symb_Trip(x) (WN_loop_flag(x) & WN_LOOP_SYMB_TRIP)
01364 #define WN_Set_Loop_Symb_Trip(x) (WN_loop_flag(x) |= WN_LOOP_SYMB_TRIP)
01365 #define WN_Reset_Loop_Symb_Trip(x) (WN_loop_flag(x) &= ~WN_LOOP_SYMB_TRIP)
01366
01367 #define WN_LABEL_HANDLER_BEGIN 0x2
01368 #define WN_Label_Is_Handler_Begin(x) (WN_label_flag(x) & \
01369 WN_LABEL_HANDLER_BEGIN)
01370 #define WN_Set_Label_Is_Handler_Begin(x) (WN_label_flag(x) |= \
01371 WN_LABEL_HANDLER_BEGIN)
01372 #define WN_Reset_Label_Is_Handler_Begin(x) (WN_label_flag(x) &= \
01373 ~(WN_LABEL_HANDLER_BEGIN))
01374
01375 #define WN_Set_IO_Library(x,y) (WN_io_flag(x) = (y))
01376 #define WN_IO_Library(x) ((IOLIB) WN_io_flag(x))
01377
01378 #define WN_PARM_BY_REFERENCE 0x01
01379 #define WN_PARM_BY_VALUE 0x02
01380 #define WN_PARM_IN WN_PARM_BY_VALUE
01381 #define WN_PARM_OUT 0x04
01382 #define WN_PARM_DUMMY 0x08
01383
01384 #define WN_PARM_READ_ONLY 0x10
01385
01386 #define WN_PARM_PASSED_NOT_SAVED 0x20
01387
01388
01389 #define WN_PARM_NOT_EXPOSED_USE 0x40
01390 #define WN_PARM_IS_KILLED 0x80
01391
01392
01393
01394
01395
01396
01397 # define WN_PARM_PASS_ADDRESS 0x0100
01398 # define WN_PARM_PASS_ADDRESS_FROM_DV 0x0200
01399 # define WN_PARM_PASS_DV 0x0400
01400 # define WN_PARM_PASS_DV_COPY 0x0800
01401 # define WN_PARM_COPY_IN 0x2000
01402 # define WN_PARM_COPY_IN_COPY_OUT 0x4000
01403 # define WN_PARM_MAKE_DV 0x8000
01404 # define WN_PARM_COPY_IN_MAKE_DV 0x010000
01405 # define WN_PARM_MAKE_NEW_DV 0x020000
01406 # define WN_PARM_PASS_SECTION_ADDRESS 0x040000
01407 # define WN_PARM_CHECK_CONTIG_FLAG 0x080000
01408
01409
01410 #define WN_Parm_By_Reference(x) (WN_parm_flag(x) & WN_PARM_BY_REFERENCE)
01411 #define WN_Set_Parm_By_Reference(x) (WN_parm_flag(x) |= WN_PARM_BY_REFERENCE)
01412 #define WN_Clear_Parm_By_Reference(x) (WN_parm_flag(x) &= ~WN_PARM_BY_REFERENCE)
01413 #define WN_Parm_By_Value(x) (WN_parm_flag(x) & WN_PARM_BY_VALUE)
01414 #define WN_Set_Parm_By_Value(x) (WN_parm_flag(x) |= WN_PARM_BY_VALUE)
01415 #define WN_Clear_Parm_By_Value(x) (WN_parm_flag(x) &= ~WN_PARM_BY_VALUE)
01416 #define WN_Parm_In(x) (WN_parm_flag(x) & WN_PARM_IN)
01417 #define WN_Set_Parm_In(x) (WN_parm_flag(x) |= WN_PARM_IN)
01418 #define WN_Parm_Out(x) (WN_parm_flag(x) & WN_PARM_OUT)
01419 #define WN_Set_Parm_Out(x) (WN_parm_flag(x) |= WN_PARM_OUT)
01420 #define WN_Parm_Dummy(x) (WN_parm_flag(x) & WN_PARM_DUMMY)
01421 #define WN_Set_Parm_Dummy(x) (WN_parm_flag(x) |= WN_PARM_DUMMY)
01422 #define WN_Parm_Read_Only(x) (WN_parm_flag(x) & WN_PARM_READ_ONLY)
01423 #define WN_Set_Parm_Read_Only(x) (WN_parm_flag(x) |= WN_PARM_READ_ONLY)
01424 #define WN_Parm_Passed_Not_Saved(x) (WN_parm_flag(x) & WN_PARM_PASSED_NOT_SAVED)
01425 #define WN_Set_Parm_Passed_Not_Saved(x) (WN_parm_flag(x) |= WN_PARM_PASSED_NOT_SAVED)
01426 #define WN_Set_Parm_Not_Exposed_Use(x) (WN_parm_flag(x) |= WN_PARM_NOT_EXPOSED_USE)
01427 #define WN_Parm_Not_Exposed_Use(x) (WN_parm_flag(x) & WN_PARM_NOT_EXPOSED_USE)
01428 #define WN_Set_Parm_Is_Killed(x) (WN_parm_flag(x) |= WN_PARM_IS_KILLED)
01429 #define WN_Parm_Is_Killed(x) (WN_parm_flag(x) & WN_PARM_IS_KILLED)
01430
01431 #define WN_Parm_Pass_Address(x) (WN_parm_flag(x) & WN_PARM_PASS_ADDRESS)
01432 #define WN_Set_Parm_Pass_Address(x) (WN_parm_flag(x) |= WN_PARM_PASS_ADDRESS)
01433 #define WN_Parm_Pass_Address_From_Dv(x) (WN_parm_flag(x) & WN_PARM_PASS_ADDRESS_FROM_DV)
01434 #define WN_Set_Parm_Pass_Address_From_Dv(x) (WN_parm_flag(x) |= WN_PARM_PASS_ADDRESS_FROM_DV)
01435 #define WN_Parm_Pass_Dv(x) (WN_parm_flag(x) & WN_PARM_PASS_DV)
01436 #define WN_Set_Parm_Pass_Dv(x) (WN_parm_flag(x) |= WN_PARM_PASS_DV)
01437 #define WN_Parm_Pass_Dv_Copy(x) (WN_parm_flag(x) & WN_PARM_PASS_DV_COPY)
01438 #define WN_Set_Parm_Pass_Dv_Copy(x) (WN_parm_flag(x) |= WN_PARM_PASS_DV_COPY)
01439 #define WN_Parm_Copy_In(x) (WN_parm_flag(x) & WN_PARM_COPY_IN)
01440 #define WN_Set_Parm_Copy_In(x) (WN_parm_flag(x) |= WN_PARM_COPY_IN)
01441 #define WN_Parm_Copy_In_Copy_out(x) (WN_parm_flag(x) & WN_PARM_BY_REFERENCE)
01442 #define WN_Set_Parm_Copy_In_Copy_out(x) (WN_parm_flag(x) |= WN_PARM_COPY_IN_COPY_OUT)
01443 #define WN_Parm_Make_Dv(x) (WN_parm_flag(x) & WN_PARM_MAKE_DV)
01444 #define WN_Set_Parm_Make_Dv(x) (WN_parm_flag(x) |= WN_PARM_MAKE_DV)
01445 #define WN_Parm_Copy_In_Make_Dv(x) (WN_parm_flag(x) & WN_PARM_COPY_IN_MAKE_DV)
01446 #define WN_Set_Parm_Copy_In_Make_Dv(x) (WN_parm_flag(x) |= WN_PARM_COPY_IN_MAKE_DV)
01447 #define WN_Parm_Make_New_Dv(x) (WN_parm_flag(x) & WN_PARM_MAKE_NEW_DV)
01448 #define WN_Set_Parm_Make_New_Dv(x) (WN_parm_flag(x) |= WN_PARM_MAKE_NEW_DV)
01449 #define WN_Parm_Pass_Section_Address(x) (WN_parm_flag(x) & WN_PARM_PASS_SECTION_ADDRESS)
01450 #define WN_Set_Parm_Pass_Section_Address(x) (WN_parm_flag(x) |= WN_PARM_PASS_SECTION_ADDRESS)
01451 #define WN_Parm_Check_Contig_Flag(x) (WN_parm_flag(x) & WN_PARM_CHECK_CONTIG_FLAG)
01452 #define WN_Set_Parm_Check_Contig_Flag(x) (WN_parm_flag(x) |= WN_PARM_CHECK_CONTIG_FLAG)
01453
01454 #define WN_EQ_IS_LOGICAL 0x01
01455 #define WN_Eq_Is_Logical(x) (WN_eq_logical_flag(x) & WN_EQ_IS_LOGICAL)
01456 #define WN_Set_Eq_Is_Logical(x) (WN_eq_logical_flag(x) |= WN_EQ_IS_LOGICAL)
01457 #define WN_Reset_Eq_Is_Logical(x) (WN_eq_logical_flag(x) &= WN_EQ_IS_LOGICAL)
01458
01459 #define WN_CALL_NEVER_RETURN 0x01
01460 #define WN_CALL_NON_DATA_MOD 0x02
01461 #define WN_CALL_NON_PARM_MOD 0x04
01462 #define WN_CALL_PARM_MOD 0x08
01463 #define WN_CALL_NON_DATA_REF 0x10
01464 #define WN_CALL_NON_PARM_REF 0x20
01465 #define WN_CALL_PARM_REF 0x40
01466 #define WN_CALL_INLINE 0x80
01467 #define WN_CALL_DONT_INLINE 0x100
01468 #define WN_CALL_DOES_MEM_ALLOC 0x200
01469 #define WN_CALL_DOES_MEM_FREE 0x400
01470 #define WN_CALL_FORTRAN_POINTER_RULE 0x800
01471
01472
01473 #define WN_CALL_REPLACE_BY_JUMP 0x1000
01474
01475
01476
01477
01478
01479
01480 #define WN_CALL_CONSERVATIVE (WN_CALL_NON_DATA_MOD | \
01481 WN_CALL_NON_PARM_MOD | \
01482 WN_CALL_PARM_MOD | \
01483 WN_CALL_NON_DATA_REF | \
01484 WN_CALL_NON_PARM_REF | \
01485 WN_CALL_PARM_REF)
01486
01487 #define WN_Call_Never_Return(x) (WN_call_flag(x) & WN_CALL_NEVER_RETURN)
01488 #define WN_Set_Call_Never_Return(x) (WN_call_flag(x) |= WN_CALL_NEVER_RETURN)
01489 #define WN_Reset_Call_Never_Return(x) (WN_call_flag(x) &= ~WN_CALL_NEVER_RETURN)
01490 #define WN_Call_Non_Data_Mod(x) (WN_call_flag(x) & WN_CALL_NON_DATA_MOD)
01491 #define WN_Set_Call_Non_Data_Mod(x) (WN_call_flag(x) |= WN_CALL_NON_DATA_MOD)
01492 #define WN_Reset_Call_Non_Data_Mod(x) (WN_call_flag(x) &= ~WN_CALL_NON_DATA_MOD)
01493 #define WN_Call_Non_Data_Ref(x) (WN_call_flag(x) & WN_CALL_NON_DATA_REF)
01494 #define WN_Set_Call_Non_Data_Ref(x) (WN_call_flag(x) |= WN_CALL_NON_DATA_REF)
01495 #define WN_Reset_Call_Non_Data_Ref(x) (WN_call_flag(x) &= ~WN_CALL_NON_DATA_REF)
01496 #define WN_Call_Non_Parm_Mod(x) (WN_call_flag(x) & WN_CALL_NON_PARM_MOD)
01497 #define WN_Set_Call_Non_Parm_Mod(x) (WN_call_flag(x) |= WN_CALL_NON_PARM_MOD)
01498 #define WN_Reset_Call_Non_Parm_Mod(x) (WN_call_flag(x) &= ~WN_CALL_NON_PARM_MOD)
01499 #define WN_Call_Non_Parm_Ref(x) (WN_call_flag(x) & WN_CALL_NON_PARM_REF)
01500 #define WN_Set_Call_Non_Parm_Ref(x) (WN_call_flag(x) |= WN_CALL_NON_PARM_REF)
01501 #define WN_Reset_Call_Non_Parm_Ref(x) (WN_call_flag(x) &= ~WN_CALL_NON_PARM_REF)
01502 #define WN_Call_Parm_Mod(x) (WN_call_flag(x) & WN_CALL_PARM_MOD)
01503 #define WN_Set_Call_Parm_Mod(x) (WN_call_flag(x) |= WN_CALL_PARM_MOD)
01504 #define WN_Reset_Call_Parm_Mod(x) (WN_call_flag(x) &= ~WN_CALL_PARM_MOD)
01505 #define WN_Call_Parm_Ref(x) (WN_call_flag(x) & WN_CALL_PARM_REF)
01506 #define WN_Set_Call_Parm_Ref(x) (WN_call_flag(x) |= WN_CALL_PARM_REF)
01507 #define WN_Reset_Call_Parm_Ref(x) (WN_call_flag(x) &= ~WN_CALL_PARM_REF)
01508 #define WN_Call_Inline(x) (WN_call_flag(x) & WN_CALL_INLINE)
01509 #define WN_Set_Call_Inline(x) (WN_call_flag(x) |= WN_CALL_INLINE)
01510 #define WN_Reset_Call_Inline(x) (WN_call_flag(x) &= ~WN_CALL_INLINE)
01511 #define WN_Call_Dont_Inline(x) (WN_call_flag(x) & WN_CALL_DONT_INLINE)
01512 #define WN_Set_Call_Dont_Inline(x) (WN_call_flag(x) |= WN_CALL_DONT_INLINE)
01513 #define WN_Reset_Call_Dont_Inline(x) (WN_call_flag(x) &= ~WN_CALL_DONT_INLINE)
01514 #define WN_Call_Does_Mem_Alloc(x) (WN_call_flag(x) & WN_CALL_DOES_MEM_ALLOC)
01515 #define WN_Set_Call_Does_Mem_Alloc(x) (WN_call_flag(x) |= WN_CALL_DOES_MEM_ALLOC)
01516 #define WN_Reset_Call_Does_Mem_Alloc(x) (WN_call_flag(x) &= ~WN_CALL_DOES_MEM_ALLOC)
01517 #define WN_Call_Does_Mem_Free(x) (WN_call_flag(x) & WN_CALL_DOES_MEM_FREE)
01518 #define WN_Set_Call_Does_Mem_Free(x) (WN_call_flag(x) |= WN_CALL_DOES_MEM_FREE)
01519 #define WN_Reset_Call_Does_Mem_Free(x) (WN_call_flag(x) &= ~WN_CALL_DOES_MEM_FREE)
01520 #define WN_Call_Fortran_Pointer_Rule(x) (WN_call_flag(x) & WN_CALL_FORTRAN_POINTER_RULE)
01521 #define WN_Set_Call_Fortran_Pointer_Rule(x) \
01522 (WN_call_flag(x) |= WN_CALL_FORTRAN_POINTER_RULE)
01523 #define WN_Reset_Call_Fortran_Pointer_Rule(x) \
01524 (WN_call_flag(x) &= ~WN_CALL_FORTRAN_POINTER_RULE)
01525 #define WN_Call_Replace_By_Jump(x) (WN_call_flag(x) & WN_CALL_REPLACE_BY_JUMP)
01526 #define WN_Set_Call_Replace_By_Jump(x) (WN_call_flag(x) |= WN_CALL_REPLACE_BY_JUMP)
01527 #define WN_Reset_Call_Replace_By_Jump(x) (WN_call_flag(x) &= ~WN_CALL_REPLACE_BY_JUMP)
01528
01529 #define WN_Set_Call_Default_Flags(x) (WN_call_flag(x) |= WN_CALL_CONSERVATIVE)
01530 #define WN_Call_No_Side_Effect(x) ((WN_call_flag(x) & (WN_CALL_NON_DATA_MOD | WN_CALL_NON_PARM_MOD | WN_CALL_PARM_MOD)) == 0)
01531 #define WN_Call_Pure(x) ((WN_call_flag(x) & (WN_CALL_NON_DATA_MOD | WN_CALL_NON_PARM_MOD | WN_CALL_PARM_MOD | WN_CALL_NON_DATA_REF | WN_CALL_NON_PARM_REF)) == 0)
01532
01533
01534
01535 #define WN_ASM_VOLATILE 0x0001
01536 #define WN_ASM_CLOBBERS_MEM 0x0002
01537 #define WN_ASM_CLOBBERS_CC 0x0004
01538
01539 #define WN_Asm_Volatile(x) (WN_asm_flag(x) & WN_ASM_VOLATILE)
01540 #define WN_Set_Asm_Volatile(x) (WN_asm_flag(x) |= WN_ASM_VOLATILE)
01541 #define WN_Reset_Asm_Volatile(x) (WN_asm_flag(x) &= ~WN_ASM_VOLATILE)
01542 #define WN_Asm_Clobbers_Mem(x) (WN_asm_flag(x) & WN_ASM_CLOBBERS_MEM)
01543 #define WN_Set_Asm_Clobbers_Mem(x) (WN_asm_flag(x) |= WN_ASM_CLOBBERS_MEM)
01544 #define WN_Reset_Asm_Clobbers_Mem(x) (WN_asm_flag(x) &= ~WN_ASM_CLOBBERS_MEM)
01545 #define WN_Asm_Clobbers_Cc(x) (WN_asm_flag(x) & WN_ASM_CLOBBERS_CC)
01546 #define WN_Set_Asm_Clobbers_Cc(x) (WN_asm_flag(x) |= WN_ASM_CLOBBERS_CC)
01547 #define WN_Reset_Asm_Clobbers_Cc(x) (WN_asm_flag(x) &= ~WN_ASM_CLOBBERS_CC)
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557
01558 inline mINT16 WN_num_actuals(const WN *wn)
01559 {
01560 INT32 n= WN_kid_count(wn);
01561 INT32 i;
01562 OPERATOR opr = WN_operator(wn);
01563
01564
01565
01566
01567 if (opr == OPR_ICALL || opr == OPR_PICCALL) n--;
01568
01569 for(i= n-1; i>=0; i--)
01570 {
01571 WN *kid = WN_kid(wn,i);
01572 if (!kid) { continue; }
01573
01574 OPERATOR kid_opr = WN_operator(kid);
01575 if ( (kid_opr != OPR_PARM) || !WN_Parm_Dummy(kid) )
01576 {
01577 return i+1;
01578 }
01579 }
01580 return 0;
01581 }
01582
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592
01593
01594
01595
01596
01597
01598
01599
01600
01601 #define PF_GET_READ(flag) (((~(flag)) >> 24) & 0x1)
01602 #define PF_GET_WRITE(flag) (((flag) >> 24) & 0x1)
01603 #define PF_GET_STRIDE_1L(flag) ((flag) & 0xff)
01604 #define PF_GET_STRIDE_2L(flag) (((flag) >> 8) & 0xff)
01605 #define PF_GET_CONFIDENCE(flag) (((flag) >> 28) & 0xf)
01606 #define PF_GET_MANUAL(flag) (((flag) >> 25) & 0x1)
01607
01608 #define PF_SET_READ(flag) flag &= 0xfeffffff
01609 #define PF_SET_WRITE(flag) flag |= 0x01000000
01610 #define PF_SET_STRIDE_1L(flag, x) flag = (((flag)&0xffffff00) | ((x)&0xff))
01611 #define PF_SET_STRIDE_2L(flag, x) flag = (((flag)&0xffff00ff) | ((x)&0xff)<<8)
01612 #define PF_SET_CONFIDENCE(flag, x) flag = (((flag)&0x0fffffff) | ((x)&0xf)<<28)
01613 #define PF_SET_MANUAL(flag) flag |= 0x02000000
01614 #define PF_UNSET_MANUAL(flag) flag &= 0xfdffffff
01615
01616 #define WN_pf_read(wn) (((~(WN_prefetch_flag(wn))) >> 24) & 0x1)
01617 #define WN_pf_write(wn) (((WN_prefetch_flag(wn)) >> 24) & 0x1)
01618 #define WN_pf_stride_1L(wn) ((WN_prefetch_flag(wn)) & 0xff)
01619 #define WN_pf_stride_2L(wn) (((WN_prefetch_flag(wn)) >> 8) & 0xff)
01620 #define WN_pf_confidence(wn) (((WN_prefetch_flag(wn)) >> 28) & 0xf)
01621 #define WN_pf_manual(wn) (((WN_prefetch_flag(wn)) >> 25) & 0x1)
01622
01623 #define WN_pf_set_read(wn) WN_prefetch_flag(wn) &= 0xfeffffff
01624 #define WN_pf_set_write(wn) WN_prefetch_flag(wn) |= 0x01000000
01625 #define WN_pf_set_stride_1L(wn, x) WN_prefetch_flag(wn) = (((WN_prefetch_flag(wn))&0xffffff00) | ((x)&0xff))
01626 #define WN_pf_set_stride_2L(wn, x) WN_prefetch_flag(wn) = (((WN_prefetch_flag(wn))&0xffff00ff) | ((x)&0xff)<<8)
01627 #define WN_pf_set_confidence(wn, x) WN_prefetch_flag(wn) = (((WN_prefetch_flag(wn))&0x0fffffff) | ((x)&0xf)<<28)
01628 #define WN_pf_set_manual(wn) WN_prefetch_flag(wn) |= 0x02000000
01629 #define WN_pf_unset_manual(wn) WN_prefetch_flag(wn) &= 0xfdffffff
01630
01631
01632
01633
01634
01635
01636
01637
01638
01639
01640
01641
01642
01643
01644
01645
01646
01647
01648
01649
01650
01651
01652
01653
01654
01655
01656
01657
01658
01659
01660
01661
01662
01663
01664
01665
01666
01667
01668
01669
01670
01671
01672
01673 #endif