Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
wn.h
Go to the documentation of this file.
00001 /*
00002 
00003   Copyright (C) 2000, 2001 Silicon Graphics, Inc.  All Rights Reserved.
00004 
00005   This program is free software; you can redistribute it and/or modify it
00006   under the terms of version 2 of the GNU General Public License as
00007   published by the Free Software Foundation.
00008 
00009   This program is distributed in the hope that it would be useful, but
00010   WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
00012 
00013   Further, this software is distributed without any warranty that it is
00014   free of the rightful claim of any third person regarding infringement 
00015   or the like.  Any license provided herein, whether implied or 
00016   otherwise, applies only to this software file.  Patent licenses, if 
00017   any, provided herein do not apply to combinations of this program with 
00018   other software, or any other product whatsoever.  
00019 
00020   You should have received a copy of the GNU General Public License along
00021   with this program; if not, write the Free Software Foundation, Inc., 59
00022   Temple Place - Suite 330, Boston MA 02111-1307, USA.
00023 
00024   Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pky,
00025   Mountain View, CA 94043, or:
00026 
00027   http://www.sgi.com
00028 
00029   For further information regarding this notice, see:
00030 
00031   http://oss.sgi.com/projects/GenInfo/NoticeExplan
00032 
00033 */
00034 
00035 
00036 #ifndef wn_INCLUDED
00037 #define wn_INCLUDED
00038 
00039 #ifndef WN_RCS_ID
00040 #define WN_RCS_ID
00041 #endif
00042 
00043 
00044 #include "defs.h"
00045 #include "opcode.h"
00046 #include "mempool.h"
00047 #include "srcpos.h"
00048 
00049 #include "wn_core.h"                /* core definitions of the tree node
00050                                        structures */
00051 #include "wn_map.h"
00052 #include "wio.h"
00053 #include "wn_pragmas.h"
00054 
00055 #include "stab.h"
00056 
00057 
00677 extern BOOL Types_Are_Compatible(TYPE_ID ltype, WN *wn);
00678 extern BOOL IPO_Types_Are_Compatible(TYPE_ID ltype, TYPE_ID rtype);
00679 extern BOOL Is_Const_Parm (WN *, INT );     /* for a call call_wn, 
00680                                              is arg j a const parm */
00681 
00682 extern void Dont_Use_WN_Free_List (void);
00683 extern MEM_POOL *WN_mem_pool_ptr;
00684 
00685 extern WN *WN_Create(OPERATOR opr, TYPE_ID rtype, TYPE_ID desc, mINT16 kid_count);
00686 inline WN *
00687 WN_Create(OPCODE opcode, mINT16 kid_count) {
00688   return WN_Create (OPCODE_operator(opcode), OPCODE_rtype(opcode),
00689                     OPCODE_desc(opcode), kid_count);
00690 }
00691 
00692 extern WN *
00693 WN_Create_Generic (OPERATOR opr, TYPE_ID rtype, TYPE_ID desc,
00694                    mINT16 kid_count, WN *next, WN *prev,
00695                    ST_IDX st, INT32 label_number, INT32 num_entries,
00696                    TY_IDX ty, TY_IDX load_addr_ty, WN_OFFSET  offset,
00697                    INT16 cvtl_bits, INT32 num_dim, WN_ESIZE element_size,
00698                    INT64 const_value, UINT32 flag, INTRINSIC intrinsic);  
00699 inline WN *
00700 WN_Create_Generic (OPCODE opcode, mINT16 kid_count, WN *next, WN *prev,
00701                    ST_IDX st, INT32 label_number, INT32 num_entries,
00702                    TY_IDX ty, TY_IDX load_addr_ty, WN_OFFSET  offset,
00703                    INT16 cvtl_bits, INT32 num_dim, WN_ESIZE element_size,
00704                    INT64 const_value, UINT32 flag, INTRINSIC intrinsic) {
00705   return WN_Create_Generic (OPCODE_operator(opcode), OPCODE_rtype(opcode),
00706                             OPCODE_desc(opcode), kid_count, next, prev,
00707                             st, label_number, num_entries,
00708                             ty, load_addr_ty, offset, cvtl_bits, num_dim,
00709                             element_size, const_value, flag, intrinsic);
00710 }
00711 
00712 extern void IPA_WN_Delete(WN_MAP_TAB *maptab, WN *wn);
00713 
00714 #define WN_Delete(wn) \
00715   IPA_WN_Delete(Current_Map_Tab, (wn))
00716 
00717 extern void IPA_WN_DELETE_Tree(WN_MAP_TAB *maptab, WN *tree);
00718 
00719 extern void WN_Register_Delete_Cleanup_Function(void (*cleanup_fn)(WN *wn));
00720 
00721 extern void WN_Remove_Delete_Cleanup_Function(void (*cleanup_fn)(WN *wn));
00722 
00723 extern  BOOL WN_Equiv(WN *wn1, WN *wn2);
00724 
00725 extern WN *WN_CreateBlock(void);
00726 
00727 extern WN *WN_CreateDO(WN *index,
00728                        WN *start,
00729                        WN *end,
00730                        WN *step,
00731                        WN *body,
00732                        WN *loop_info);
00733 
00734 extern WN *WN_CreateDoWhile(WN *test,
00735                           WN *body);
00736 
00737 extern WN *WN_CreateWhileDo(WN *test,
00738                           WN *body);
00739 
00740 extern WN *WN_CreateIf(WN *test,
00741                        WN *if_then,
00742                        WN *if_else);
00743 
00744 extern WN *WN_CreateEntry (INT16 nkids, ST_IDX name, WN *body, WN *pragmas,
00745                            WN *varrefs);
00746 
00747 extern WN *WN_CreateRegion(REGION_KIND kind,
00748                            WN *body, 
00749                            WN *pragmas,
00750                            WN *exits, 
00751                            INT region_id,
00752                            INITO_IDX ereg_supp);
00753 extern WN *WN_CreateRegionExit (INT32 label_number);
00754 
00755 /* set maximum region id seen so far;
00756  * special case 0 to mean reset region ids to 0 (done at each PU) */
00757 extern void Set_Max_Region_Id (INT id);
00758 
00759 extern WN *WN_CreateGoto(INT32 label_number);
00760 
00761 extern WN *WN_CreateGotoOuterBlock (INT32 label_number, SYMTAB_IDX label_level);
00762 
00763 extern WN *WN_CreateAgoto(WN *addr);
00764 
00765 extern WN *WN_CreateAltentry(ST_IDX entry);
00766 
00767 #define WN_CreateCondbr WN_CreateTruebr
00768 extern WN *WN_CreateTruebr(INT32 label_number, WN *exp);
00769 extern WN *WN_CreateFalsebr(INT32 label_number, WN *exp);
00770 
00771 extern WN *WN_CreateReturn(void);
00772 extern WN *WN_CreateReturn_Val (OPERATOR opr, TYPE_ID rtype, TYPE_ID desc, WN * val);
00773 inline WN *
00774 WN_CreateReturn_Val (OPCODE opc, WN * val) {
00775   return WN_CreateReturn_Val (OPCODE_operator (opc),
00776                               OPCODE_rtype (opc),
00777                               OPCODE_desc (opc),
00778                               val);
00779 }
00780 
00781 extern WN *WN_CreateLabel(INT32 label_number, UINT32 label_flag, WN *loop_info);
00782 
00783 extern WN *WN_CreateCompgoto(INT32 num_entries,
00784                            WN *value, WN *block, WN *deflt, INT32 last_label);
00785 
00786 extern WN *WN_CreateSwitch(INT32 num_entries,
00787                            WN *value, WN *block, WN *deflt, INT32 last_label);
00788 
00789 extern WN *WN_CreateCasegoto(INT64 case_value, INT32 case_label_number);
00790 
00791 extern WN *WN_CreateXgoto (INT32 num_entries, WN *value, WN *block, ST_IDX st);
00792 
00793 extern WN *WN_CreateIstore(OPERATOR opr,
00794                           TYPE_ID rtype, 
00795                           TYPE_ID desc, 
00796                           WN_OFFSET offset, 
00797                           TY_IDX ty,
00798                           WN *value, 
00799                           WN *addr,
00800                           UINT field_id = 0);
00801 extern WN *WN_CreatePstore(OPERATOR opr,
00802                           TYPE_ID rtype,
00803                           TYPE_ID desc,
00804                           WN_OFFSET offset,
00805                           TY_IDX ty,
00806                           WN *value,
00807                           WN *addr,
00808                           UINT field_id = 0);
00809 
00810 
00811 inline WN *
00812 WN_CreateIstore (OPCODE opc, WN_OFFSET offset, TY_IDX ty, WN *value, WN *addr,
00813                  UINT field_id = 0) {
00814   return WN_CreateIstore (OPCODE_operator(opc), OPCODE_rtype(opc),
00815                           OPCODE_desc(opc), offset, ty, value, addr, field_id);
00816 }
00817 inline WN *
00818 WN_CreatePstore (OPCODE opc, WN_OFFSET offset, TY_IDX ty, WN *value, WN *addr,
00819                  UINT field_id = 0) {
00820   return WN_CreatePstore (OPCODE_operator(opc), OPCODE_rtype(opc),
00821                           OPCODE_desc(opc), offset, ty, value, addr, field_id);
00822 }
00823 
00824 
00825 extern WN *WN_CreateIstorex(OPERATOR opr, 
00826                           TYPE_ID rtype, 
00827                           TYPE_ID desc, 
00828                           TY_IDX ty,
00829                           WN *value,
00830                           WN *addr1,
00831                           WN *addr2);
00832 inline WN *
00833 WN_CreateIstorex(OPCODE opc, TY_IDX ty, WN *value, WN *addr1, WN *addr2) {
00834   return WN_CreateIstorex (OPCODE_operator(opc), OPCODE_rtype(opc),
00835                            OPCODE_desc(opc), ty, value, addr1, addr2);
00836 }
00837 
00838 extern WN *WN_CreateMstore(WN_OFFSET offset,
00839                            TY_IDX ty,
00840                            WN *value,
00841                            WN *addr,
00842                            WN *num_bytes);
00843 
00844 extern WN *WN_CreateStid(OPERATOR opr,
00845                          TYPE_ID rtype, 
00846                          TYPE_ID desc, 
00847                          WN_OFFSET offset, 
00848                          ST *st, 
00849                          TY_IDX ty, 
00850                          WN *value,
00851                          UINT field_id = 0);
00852 extern WN *WN_CreatePStid(OPERATOR opr,
00853                          TYPE_ID rtype,
00854                          TYPE_ID desc,
00855                          WN_OFFSET offset,
00856                          ST *st,
00857                          TY_IDX ty,
00858                          WN *value,
00859                          UINT field_id = 0);
00860 
00861 inline WN *
00862      WN_CreateStid(OPCODE opc, WN_OFFSET offset, ST *st, TY_IDX ty, 
00863                                           WN *value, UINT field_id = 0) {
00864   return WN_CreateStid (OPCODE_operator(opc), OPCODE_rtype(opc),
00865                         OPCODE_desc(opc), offset, st, ty, value, field_id);
00866 }
00867 inline WN *
00868 WN_CreatePStid(OPCODE opc, WN_OFFSET offset, ST *st, TY_IDX ty,
00869                                              WN *value, UINT field_id = 0) {
00870   return WN_CreatePStid (OPCODE_operator(opc), OPCODE_rtype(opc),
00871                         OPCODE_desc(opc), offset, st, ty, value, field_id);
00872 }
00873 
00874 
00875 extern WN *WN_CreatePrefetch( WN_OFFSET offset,  UINT32 flag, WN *addr);
00876 extern WN *WN_CreatePrefetchx(UINT32 flag, WN *addr1, WN *addr2);
00877 
00878 extern WN *WN_CreateIo(IOSTATEMENT iostatement, mINT16 kid_count);
00879 extern WN *WN_CreateIoItem0(IOITEM ioitem, TY_IDX ty);
00880 extern WN *WN_CreateIoItem1(IOITEM ioitem, WN *kid0, TY_IDX ty);
00881 extern WN *WN_CreateIoItem2(IOITEM ioitem, WN *kid0, WN *kid1, TY_IDX ty);
00882 extern WN *WN_CreateIoItem3(IOITEM ioitem, WN *kid0, WN *kid1, WN *kid2, TY_IDX ty);
00883 extern WN *WN_CreateIoItemN(IOITEM ioitem, mINT16 kid_count, TY_IDX ty);
00884 
00885 extern WN *WN_CreateEval(WN *exp);
00886 
00887 extern WN *WN_CreatePragma(WN_PRAGMA_ID pragma_name, ST_IDX st, 
00888                            INT32 arg1, INT32 arg2);
00889 extern WN *WN_CreatePragma(WN_PRAGMA_ID pragma_name, ST_IDX st, 
00890                            INT32 arg1, PREG_NUM asm_copyout_preg,
00891                            UINT32 asm_opnd_num);
00892 extern WN *WN_CreateXpragma(WN_PRAGMA_ID pragma_name, ST_IDX st, 
00893                             INT16 kid_count);
00894 
00895 extern WN *WN_CreateExp0(OPERATOR opr, TYPE_ID rtype, TYPE_ID desc);
00896 inline WN *
00897 WN_CreateExp0 (OPCODE opc) {
00898   return WN_CreateExp0 (OPCODE_operator(opc), OPCODE_rtype(opc),
00899                         OPCODE_desc(opc));
00900 }
00901 
00902 extern WN *WN_CreateExp1(OPERATOR opr,
00903                          TYPE_ID rtype,
00904                          TYPE_ID desc,
00905                          WN *kid0);
00906 inline WN *
00907 WN_CreateExp1 (OPCODE opc, WN *kid0) {
00908   return WN_CreateExp1 (OPCODE_operator(opc), OPCODE_rtype(opc),
00909                         OPCODE_desc(opc), kid0);
00910 }
00911 
00912 extern WN *WN_CreateExp2(OPERATOR opr,
00913                          TYPE_ID rtype,
00914                          TYPE_ID desc,
00915                          WN *kid0,
00916                          WN *kid1);
00917 inline WN*
00918 WN_CreateExp2 (OPCODE opc, WN *kid0, WN *kid1) {
00919   return WN_CreateExp2 (OPCODE_operator(opc), OPCODE_rtype(opc),
00920                         OPCODE_desc(opc), kid0, kid1);
00921 }
00922 
00923 extern WN *WN_CreateExp3(OPERATOR opr,
00924                          TYPE_ID rtype,
00925                          TYPE_ID desc,
00926                          WN *kid0,
00927                          WN *kid1,
00928                          WN *kid2);
00929 inline WN *
00930 WN_CreateExp3 (OPCODE opc, WN *kid0, WN *kid1, WN *kid2) {
00931   return WN_CreateExp3 (OPCODE_operator(opc), OPCODE_rtype(opc),
00932                         OPCODE_desc(opc), kid0, kid1, kid2);
00933 }
00934 
00935 extern WN *WN_CreateIload(OPERATOR opr,
00936                          TYPE_ID rtype,
00937                          TYPE_ID desc,
00938                          WN_OFFSET offset, 
00939                          TY_IDX ty,
00940                          TY_IDX load_addr_ty,
00941                          WN *addr,
00942                          UINT field_id = 0);
00943 inline WN*
00944 WN_CreateIload (OPCODE opc, WN_OFFSET offset, TY_IDX ty,
00945                 TY_IDX load_addr_ty, WN *addr, UINT field_id = 0) {
00946   return WN_CreateIload (OPCODE_operator(opc), OPCODE_rtype(opc),
00947                          OPCODE_desc(opc), offset, ty, load_addr_ty, addr,
00948                          field_id);
00949 }
00950 
00951 extern WN *WN_CreateIloadx(OPERATOR opr, 
00952                          TYPE_ID rtype,
00953                          TYPE_ID desc,
00954                          TY_IDX ty,
00955                          TY_IDX load_addr_ty,
00956                          WN *addr1,
00957                          WN *addr2);
00958 inline WN*
00959 WN_CreateIloadx (OPCODE opc, TY_IDX ty, TY_IDX load_addr_ty,
00960                  WN *addr1, WN *addr2) {
00961   return WN_CreateIloadx (OPCODE_operator(opc), OPCODE_rtype(opc),
00962                           OPCODE_desc(opc), ty, load_addr_ty, addr1, addr2);
00963 }
00964 
00965 extern WN *WN_CreateMload(WN_OFFSET offset, 
00966                           TY_IDX ty,
00967                           WN *addr,
00968                           WN *num_bytes);
00969 
00970 extern WN *WN_CreateLdid(OPERATOR opr,
00971                          TYPE_ID rtype,
00972                          TYPE_ID desc,
00973                          WN_OFFSET offset,
00974                          ST_IDX st,
00975                          TY_IDX ty,
00976                          UINT field_id = 0);
00977 inline WN*
00978 WN_CreateLdid (OPCODE opc, WN_OFFSET offset, ST_IDX st, TY_IDX ty, UINT field_id = 0) {
00979   return WN_CreateLdid (OPCODE_operator(opc), OPCODE_rtype(opc),
00980                         OPCODE_desc(opc), offset, st, ty, field_id);
00981 }
00982 
00983 extern WN *WN_CreateLda(OPERATOR opr, 
00984                         TYPE_ID rtype,
00985                         TYPE_ID desc,
00986                         WN_OFFSET offset,
00987                         TY_IDX ty,
00988                         ST_IDX st,
00989                         UINT field_id = 0);
00990 inline WN*
00991 WN_CreateLda (OPCODE opc, WN_OFFSET offset, TY_IDX ty, ST_IDX st, 
00992               UINT field_id = 0) {
00993   return WN_CreateLda (OPCODE_operator(opc), OPCODE_rtype(opc),
00994                        OPCODE_desc(opc), offset, ty, st, field_id);
00995 }
00996 
00997 extern WN *WN_CreateIlda(OPERATOR opr, 
00998                          TYPE_ID rtype,
00999                          TYPE_ID desc,
01000                          WN_OFFSET offset,
01001                          TY_IDX ty);
01002 
01003 extern WN *WN_CreateLdaLabel(OPERATOR opr,
01004                              TYPE_ID rtype,
01005                              TYPE_ID desc,
01006                              mUINT32 label_number);
01007 
01008 extern WN *WN_CreateIdname(WN_OFFSET offset,
01009                            ST_IDX st);
01010 
01011 extern WN *WN_CreateConst (OPERATOR opr, TYPE_ID rtype, TYPE_ID desc, ST_IDX st);
01012 inline WN*
01013 WN_CreateConst (OPCODE opc, ST_IDX st) {
01014   return WN_CreateConst (OPCODE_operator(opc), OPCODE_rtype(opc),
01015                          OPCODE_desc(opc), st);
01016 }
01017 
01018 extern WN *WN_CreateIntconst(OPERATOR opr, 
01019                              TYPE_ID rtype,
01020                              TYPE_ID desc,
01021                              INT64 const_val);
01022 inline WN *
01023 WN_CreateIntconst (OPCODE opc, INT64 const_val) {
01024   return WN_CreateIntconst (OPCODE_operator(opc), OPCODE_rtype(opc),
01025                             OPCODE_desc(opc), const_val);
01026 }
01027 
01028 extern WN *WN_CreateCvtl(OPERATOR opr,
01029                          TYPE_ID rtype,
01030                          TYPE_ID desc,
01031                          INT16 cvtl_bits,
01032                          WN *kid0);
01033 inline WN *
01034 WN_CreateCvtl (OPCODE opc, INT16 cvtl_bits, WN *kid0) {
01035   return WN_CreateCvtl (OPCODE_operator(opc), OPCODE_rtype(opc),
01036                         OPCODE_desc(opc), cvtl_bits, kid0);
01037 }
01038 
01039 extern WN *WN_Create_Intrinsic(OPERATOR opr,
01040                                TYPE_ID rtype,
01041                                TYPE_ID desc,
01042                                INTRINSIC intrinsic,
01043                                INT32 n,
01044                                WN *kids[]);
01045 inline WN *
01046 WN_Create_Intrinsic (OPCODE opc, INTRINSIC intrinsic, INT32 n, WN *kids[]) {
01047   return WN_Create_Intrinsic (OPCODE_operator(opc), OPCODE_rtype(opc),
01048                               OPCODE_desc(opc), intrinsic, n, kids);
01049 }
01050 
01051 extern WN *WN_CreateParm(TYPE_ID rtype,
01052                          WN *parm_node,
01053                          TY_IDX ty, 
01054                          UINT32 flag);
01055 
01056 extern WN *WN_CreateComma(OPERATOR opr, TYPE_ID rtype, TYPE_ID desc, WN *block, WN *value);
01057 inline WN *
01058 WN_CreateComma (OPCODE opc, WN *block, WN *value) {
01059   return WN_CreateComma (OPCODE_operator(opc), OPCODE_rtype(opc),
01060                          OPCODE_desc(opc), block, value);
01061 }
01062 
01063 extern WN *WN_CreateRcomma(OPERATOR opr, TYPE_ID rtype, TYPE_ID desc, WN *value, WN *block);
01064 inline WN *
01065 WN_CreateRcomma (OPCODE opc, WN *value, WN *block) {
01066   return WN_CreateRcomma (OPCODE_operator(opc), OPCODE_rtype(opc),
01067                           OPCODE_desc(opc), value, block);
01068 }
01069 
01070 extern WN *WN_CreateComment (char *s);  /* create comment node */
01071 extern STR_IDX WN_GetComment (const WN *wn);  /* get string idx from comment node */
01072 
01073 extern WN *WN_CreateAsm_Stmt (INT16 kid_count, char *asm_string);
01074 
01075 extern WN *WN_CreateAsm_Input (char *constraint, UINT32 opnd_num, WN *opnd_expr);
01076 
01077 extern WN *WN_CopyNode(const WN* src_wn);
01078 
01079 
01080 #if 0
01081 #define WN_Move_Maps(dst,src) \
01082   IPA_WN_Move_Maps(Current_Map_Tab, (dst), (src))
01083 extern void IPA_WN_Move_Maps(WN_MAP_TAB *maptab, WN *dst, WN *src);
01084 #endif
01085 
01086 extern void IPA_WN_Move_Maps_PU(WN_MAP_TAB *src, WN_MAP_TAB *dst, WN *wn);
01087 
01088 
01089 extern void WN_Mem_Push(void);
01090 
01091 extern void WN_Mem_Pop(void);
01092 
01093 extern WN *WN_Ldid(TYPE_ID desc,
01094                    WN_OFFSET offset,
01095                    ST_IDX sym,
01096                    TY_IDX align,
01097                    UINT field_id = 0);
01098 
01099 extern WN *WN_RLdid(TYPE_ID rtype,
01100                     TYPE_ID desc,
01101                     WN_OFFSET offset,
01102                     ST_IDX sym,
01103                     TY_IDX align);
01104 
01105 extern WN *WN_LdidPreg(TYPE_ID desc,
01106                        WN_OFFSET pregno);
01107 
01108 extern WN *WN_Iload(TYPE_ID desc,
01109                     WN_OFFSET offset,
01110                     TY_IDX align,
01111                     WN *addr,
01112                     UINT field_id = 0);
01113 
01114 extern WN *WN_RIload(TYPE_ID rtype,
01115                      TYPE_ID desc,
01116                      WN_OFFSET offset,
01117                      TY_IDX align,
01118                      WN *addr);
01119 
01120 extern WN *WN_IloadLdid(TYPE_ID desc,
01121                         WN_OFFSET offset,
01122                         TY_IDX align,
01123                         ST *sym,
01124                         WN_OFFSET symOffset);
01125 
01126 extern WN *WN_Istore(TYPE_ID desc,
01127                      WN_OFFSET offset,
01128                      TY_IDX align,
01129                      WN *addr,
01130                      WN *value,
01131                      UINT field_id = 0);
01132 extern WN *WN_Pstore(TYPE_ID desc,
01133                      WN_OFFSET offset,
01134                      TY_IDX align,
01135                      WN *addr,
01136                      WN *value,
01137                      UINT field_id = 0);
01138 
01139 
01140 extern WN *WN_Unary(OPERATOR opr,
01141                     TYPE_ID rtype,
01142                     WN *l);
01143 
01144 extern WN *WN_Binary(OPERATOR opr,
01145                      TYPE_ID rtype,
01146                      WN *l,
01147                      WN *r);
01148 
01149 extern WN *WN_Ternary(OPERATOR opr,
01150                       TYPE_ID rtype,
01151                       WN *kid0,
01152                       WN *kid1,
01153                       WN *kid2);
01154 
01155 extern WN *WN_Stid(TYPE_ID desc,
01156                    WN_OFFSET offset,
01157                    ST *sym,
01158                    TY_IDX align,
01159                    WN *value,
01160                    UINT field_id = 0);
01161 
01162 extern WN *WN_PStid(TYPE_ID desc,
01163                    WN_OFFSET offset,
01164                    ST *sym,
01165                    TY_IDX align,
01166                    WN *value,
01167                    UINT field_id = 0);
01168 
01169 
01170 
01171 extern WN *WN_StidIntoPreg(TYPE_ID desc,
01172                            WN_OFFSET offset,
01173                            ST *sym,
01174                            WN *value);
01175 
01176 #define WN_StidPreg(desc,pregno,value) WN_StidIntoPreg((desc),(pregno),MTYPE_To_PREG(desc),(value))
01177 
01178 extern WN *WN_Binary(OPERATOR opr,
01179                      TYPE_ID rtype,
01180                      WN *l,
01181                      WN *r);
01182 
01183 extern WN *WN_Intconst(TYPE_ID rtype,
01184                        INT64 value);
01185 
01186 extern WN *WN_RotateIntconst(WN *tree,
01187                              INT32 rotate);
01188 
01189 extern WN *WN_Inverse(TYPE_ID type,
01190                       WN *tree);
01191 
01192 extern WN *WN_Floatconst(TYPE_ID type,
01193                          double value);
01194 
01195 extern WN *WN_UVConst(TYPE_ID type);
01196 
01197 extern WN * WN_Zerocon (TYPE_ID ty);
01198 
01199 extern WN *WN_Cvt(TYPE_ID desc,
01200                   TYPE_ID rtype,
01201                   WN *kid0);
01202 
01203 extern WN *WN_Trunc(TYPE_ID desc,
01204                     TYPE_ID rtype,
01205                     WN *kid0);
01206 
01207 extern WN *WN_Rnd(TYPE_ID desc,
01208                   TYPE_ID rtype,
01209                   WN *kid0);
01210 
01211 extern WN *WN_Ceil(TYPE_ID desc,
01212                    TYPE_ID rtype,
01213                    WN *kid0);
01214 
01215 extern WN *WN_Floor(TYPE_ID desc,
01216                     TYPE_ID rtype,
01217                     WN *kid0);
01218 
01219 extern WN *WN_Relational(OPERATOR opr,
01220                          TYPE_ID desc,
01221                          WN *kid0,
01222                          WN *kid1);
01223 
01224 extern WN *WN_ConstPowerOf2(TYPE_ID rtype,
01225                             INT32 n);
01226 
01227 extern WN *WN_Lda(TYPE_ID rtype,
01228                   WN_OFFSET ldaOffset,
01229                   ST *sym,
01230                   UINT field_id = 0);
01231 
01232 
01233 extern WN *WN_LdaString(char *str,
01234                         WN_OFFSET ldaOffset,
01235                         INT32 len);
01236 
01237 extern WN *WN_LdaLabel(TYPE_ID rtype,
01238                        INT32   label_number);
01239 
01240 extern WN *WN_Icall(TYPE_ID rtype,
01241                     TYPE_ID desc,
01242                     INT32 n,
01243                     TY_IDX ty);
01244 
01245 extern WN *WN_generic_call(OPERATOR opr,
01246                            TYPE_ID rtype,
01247                            TYPE_ID desc,
01248                            INT32 n,
01249                            ST_IDX sym);
01250 
01251 extern WN *WN_generic_intrinsic(OPERATOR opr,
01252                                 TYPE_ID rtype,
01253                                 TYPE_ID desc,
01254                                 INT32 n,
01255                                 INTRINSIC intrinsic);
01256 
01257 #define WN_Call(type,desc,n,s)          WN_generic_call(OPR_CALL,type,desc,n,s)
01258 #define WN_Piccall(type,desc,n,s)       WN_generic_call(OPR_PICCALL,type,desc,n,s)
01259 
01260 extern WN *WN_CreateLoopInfo (WN *induction, WN *trip, UINT16 trip_est, UINT16 depth, INT32 flags);
01261 
01262 extern WN *WN_CreateExcScopeBegin(INT32 id, INT16 nkids, struct inito* ereg_supp);
01263 
01264 extern WN *WN_CreateExcScopeEnd(INT32 id);
01265 
01266 extern WN *WN_CreateBarrier (BOOL forward, INT16 nkids);
01267 
01268 extern WN *WN_CreateTrap (INT32 value);
01269 
01270 extern WN *WN_CreateAssert (INT32 value, WN *condition);
01271 
01272 extern void WN_CopyMap( WN          *dst,
01273                         WN_MAP      map,
01274                         const WN    *src);
01275 
01276 extern WN *WN_Tas(TYPE_ID rtype,
01277                   TY_IDX ty,
01278                   WN *l);
01279 
01280 extern WN *WN_Iloadx(TYPE_ID rtype,
01281                      TY_IDX ty,
01282                      TY_IDX addr_ty,
01283                      WN *base,
01284                      WN *index);
01285 
01286 extern WN *WN_Istorex(TYPE_ID desc,
01287                       TY_IDX ty,
01288                       WN *value,
01289                       WN *base,
01290                       WN *index);
01291 
01292 #define WN_Neg(type,l)                  WN_Unary(OPR_NEG,type,l)
01293 #define WN_Abs(type,l)                  WN_Unary(OPR_ABS,type,l)
01294 #define WN_Recip(type,l)                WN_Unary(OPR_RECIP,type,l)
01295 #define WN_Sqrt(type,l)                 WN_Unary(OPR_SQRT,type,l)
01296 #define WN_Rsqrt(type,l)                WN_Unary(OPR_RSQRT,type,l)
01297 #define WN_Paren(type,l)                WN_Unary(OPR_PAREN,type,l)
01298 
01299 #define WN_Select(type,rel,t,f)         WN_Ternary(OPR_SELECT,type,rel,t,f)
01300 #define WN_Cselect(type,rel,t,f)        WN_Ternary(OPR_CSELECT,type,rel,t,f)
01301 #define WN_Add(type,l,r)                WN_Binary(OPR_ADD,type,l,r)
01302 #define WN_Sub(type,l,r)                WN_Binary(OPR_SUB,type,l,r)
01303 #define WN_Mpy(type,l,r)                WN_Binary(OPR_MPY,type,l,r)
01304 #define WN_Div(type,l,r)                WN_Binary(OPR_DIV,type,l,r)
01305 #define WN_Madd(type,l,r,a)             WN_Ternary(OPR_MADD,type,l,r,a)
01306 #define WN_Msub(type,l,r,a)             WN_Ternary(OPR_MSUB,type,l,r,a)
01307 #define WN_Nmadd(type,l,r,a)            WN_Ternary(OPR_NMADD,type,l,r,a)
01308 #define WN_Nmsub(type,l,r,a)            WN_Ternary(OPR_NMSUB,type,l,r,a)
01309 
01310 
01311 
01312 #define WN_EQ(type,l,r)                 WN_Relational(OPR_EQ,type,l,r)
01313 #define WN_NE(type,l,r)                 WN_Relational(OPR_NE,type,l,r)
01314 #define WN_LT(type,l,r)                 WN_Relational(OPR_LT,type,l,r)
01315 #define WN_LE(type,l,r)                 WN_Relational(OPR_LE,type,l,r)
01316 #define WN_GT(type,l,r)                 WN_Relational(OPR_GT,type,l,r)
01317 #define WN_GE(type,l,r)                 WN_Relational(OPR_GE,type,l,r)
01318 
01319 #define WN_LNOT(l)                      WN_Unary(OPR_LNOT,Boolean_type,l)
01320 #define WN_LAND(l,r)                    WN_Binary(OPR_LAND,Boolean_type,l,r)
01321 #define WN_LIOR(l,r)                    WN_Binary(OPR_LIOR,Boolean_type,l,r)
01322 #define WN_CAND(l,r)                    WN_Binary(OPR_CAND,Boolean_type,l,r)
01323 #define WN_CIOR(l,r)                    WN_Binary(OPR_CIOR,Boolean_type,l,r)
01324 
01325 #define WN_Lshr(type,l,r)               WN_Binary(OPR_LSHR,type,l,r)
01326 #define WN_Ashr(type,l,r)               WN_Binary(OPR_ASHR,type,l,r)
01327 #define WN_Shl(type,l,r)                WN_Binary(OPR_SHL,type,l,r)
01328 
01329 #define WN_Bnot(type,l)                 WN_Unary(OPR_BNOT,type,l)
01330 #define WN_Band(type,l,r)               WN_Binary(OPR_BAND,type,l,r)
01331 #define WN_Bior(type,l,r)               WN_Binary(OPR_BIOR,type,l,r)
01332 #define WN_Bxor(type,l,r)               WN_Binary(OPR_BXOR,type,l,r)
01333 
01334 #define WN_Realpart(t,l)                WN_Unary(OPR_REALPART,t,l)
01335 #define WN_Imagpart(t,l)                WN_Unary(OPR_IMAGPART,t,l)
01336 #define WN_Complex(type,l,r)            WN_Binary(OPR_COMPLEX,type,l,r)
01337 
01338 extern WN * WN_Int_Type_Conversion( WN *wn, TYPE_ID to_type );
01339 extern WN * WN_Float_Type_Conversion( WN *wn, TYPE_ID to_type );
01340 extern WN * WN_Type_Conversion( WN *wn, TYPE_ID to_type );
01341 
01342 extern INT32 WN_Size_and_StartAddress (WN *wn, void **StartAddress);
01343 
01344 extern BOOL WN_verifier(WN *);
01345 
01346 
01347 /*
01348 Return TRUE if tree rooted at pu_wn has any OPR_LABEL nodes that share
01349 label numbers, return FALSE otherwise. tmp_pool must be initialized and not
01350 frozen.
01351 */
01352 
01353 extern BOOL WN_Tree_Has_Duplicate_Labels(
01354        WN *pu_wn,
01355        MEM_POOL *tmp_pool
01356 );
01357 
01358 /*
01359 The Whirl tree copied_wn is a copy of orig_wn, created using LWN_Copy_Tree
01360 or something similar. This routine renames all labels in copied_wn such
01361 that all LABEL nodes get newly-created label numbers, and all other WNs
01362 that refer to those labels are changed to refer to the new label numbers.
01363 Finally, the return value is FALSE if any WN in the tree pu_wn references
01364 one of the labels in orig_wn (i.e., if orig_wn contains any label that
01365 isn't "internal"), or TRUE otherwise. Nodes in pu_wn that are also in
01366 orig_wn are not checked for being internal (hence orig_wn is allowed to be
01367 a subtree of pu_wn). tmp_pool must be initialized and not frozen.
01368 */
01369 
01370 extern BOOL WN_Rename_Duplicate_Labels (
01371        WN *orig_wn,
01372        WN *copied_wn,
01373        WN *pu_wn,
01374        MEM_POOL *tmp_pool
01375 );
01376 
01377 
01378 inline WN *
01379 WN_Create_Generic (OPERATOR opr, TYPE_ID rtype, TYPE_ID desc,
01380                    mINT16 kid_count, WN *next, WN *prev,
01381                    ST *st, INT32 label_number, INT32 num_entries,
01382                    TY_IDX ty, TY_IDX load_addr_ty, WN_OFFSET  offset,
01383                    INT16 cvtl_bits, INT32 num_dim, WN_ESIZE element_size,
01384                    INT64 const_value, UINT32 flag, INTRINSIC intrinsic)
01385 {
01386     return WN_Create_Generic (opr, rtype, desc,
01387                               kid_count, next, prev, ST_st_idx (st),
01388                               label_number, num_entries, ty, load_addr_ty,
01389                               offset, cvtl_bits, num_dim, element_size,
01390                               const_value, flag, intrinsic);
01391 } // WN_Create_Generic
01392 
01393 inline WN *
01394 WN_Create_Generic (OPCODE opcode, mINT16 kid_count, WN *next, WN *prev,
01395                    ST *st, INT32 label_number, INT32 num_entries,
01396                    TY_IDX ty, TY_IDX load_addr_ty, WN_OFFSET  offset,
01397                    INT16 cvtl_bits, INT32 num_dim, WN_ESIZE element_size,
01398                    INT64 const_value, UINT32 flag, INTRINSIC intrinsic)
01399 {
01400     return WN_Create_Generic (OPCODE_operator(opcode), OPCODE_rtype(opcode),
01401                               OPCODE_desc(opcode), kid_count, next, prev, st,
01402                               label_number, num_entries, ty, load_addr_ty,
01403                               offset, cvtl_bits, num_dim, element_size,
01404                               const_value, flag, intrinsic);
01405 } // WN_Create_Generic
01406 
01407 inline WN *
01408 WN_CreateEntry (INT16 nkids, ST *name, WN *body, WN *pragmas, WN *varrefs)
01409 {
01410     return WN_CreateEntry (nkids, ST_st_idx (name), body, pragmas, varrefs);
01411 }
01412 
01413 /* ARGSUSED */
01414 inline WN *
01415 WN_CreateRegionExit (ST *st, INT32 label_number)
01416 {
01417     return WN_CreateRegionExit (label_number);
01418 }
01419 /* ARGSUSED */
01420 inline WN *
01421 WN_CreateRegionExit (ST_IDX st, INT32 label_number)
01422 {
01423     return WN_CreateRegionExit (label_number);
01424 }
01425 
01426 /* ARGSUSED */
01427 inline WN *
01428 WN_CreateGoto (ST *st, INT32 label_number)
01429 {
01430     return WN_CreateGoto (label_number);
01431 }
01432 /* ARGSUSED */
01433 inline WN *
01434 WN_CreateGoto (ST_IDX st, INT32 label_number)
01435 {
01436     return WN_CreateGoto (label_number);
01437 }
01438 
01439 /*ARGSUSED */
01440 inline WN *
01441 WN_CreateLabel (ST_IDX st, INT32 label_number, UINT32 label_flag, WN *loop_info)
01442 {
01443     return WN_CreateLabel (label_number, label_flag, loop_info);
01444 }
01445 
01446 inline WN *
01447 WN_CreateAltentry (ST *entry)
01448 {
01449     return WN_CreateAltentry (ST_st_idx (entry));
01450 }
01451 
01452 inline WN *
01453 WN_CreateXgoto (INT32 num_entries, WN *value, WN *block, ST *st)
01454 {
01455     return WN_CreateXgoto (num_entries, value, block, ST_st_idx (st));
01456 }
01457 
01458 inline WN *
01459 WN_CreateStid (OPERATOR opr, TYPE_ID rtype, TYPE_ID desc,
01460                WN_OFFSET offset, ST_IDX st, TY_IDX ty, WN *value, 
01461                UINT field_id = 0)
01462 {
01463     return WN_CreateStid (opr, rtype, desc, offset, &St_Table[st], ty, value, field_id);
01464 }
01465 
01466 inline WN *
01467 WN_CreatePStid (OPERATOR opr, TYPE_ID rtype, TYPE_ID desc,
01468                WN_OFFSET offset, ST_IDX st, TY_IDX ty, WN *value,
01469                UINT field_id = 0)
01470 {
01471  return WN_CreatePStid (opr, rtype, desc, offset, &St_Table[st], ty, value, 
01472                                           field_id);
01473 }
01474 
01475 
01476 inline WN *
01477 WN_CreateStid (OPCODE opc, WN_OFFSET offset, ST_IDX st, TY_IDX ty, WN *value,
01478                UINT field_id = 0)
01479 {
01480     return WN_CreateStid (OPCODE_operator(opc), OPCODE_rtype(opc),
01481                           OPCODE_desc(opc), offset, st, ty, value, field_id);
01482 }
01483 
01484 inline WN *
01485 WN_CreatePStid (OPCODE opc, WN_OFFSET offset, ST_IDX st, TY_IDX ty, WN *value,
01486                UINT field_id = 0)
01487 {
01488     return WN_CreatePStid (OPCODE_operator(opc), OPCODE_rtype(opc),
01489                           OPCODE_desc(opc), offset, st, ty, value, field_id);
01490 }
01491 
01492 
01493 inline WN *
01494 WN_CreatePragma (WN_PRAGMA_ID pragma_name, ST *st, INT32 arg1, INT32 arg2)
01495 {
01496     return WN_CreatePragma (pragma_name, ST_st_idx (st), arg1, arg2);
01497 }
01498 
01499 inline WN *
01500 WN_CreatePragma (WN_PRAGMA_ID  pragma_name,
01501                  ST           *st,
01502                  INT32         arg1,
01503                  PREG_NUM      asm_copyout_preg,
01504                  UINT32        asm_opnd_num)
01505 {
01506     return WN_CreatePragma (pragma_name, ST_st_idx (st),
01507                             arg1, asm_copyout_preg, asm_opnd_num);
01508 }
01509 
01510 inline WN *
01511 WN_CreateXpragma (WN_PRAGMA_ID pragma_name, ST *st, INT16 kid_count)
01512 {
01513     return WN_CreateXpragma (pragma_name, ST_st_idx (st), kid_count);
01514 }
01515 
01516 inline WN *
01517 WN_CreateLdid (OPERATOR opr, TYPE_ID rtype, TYPE_ID desc,
01518                WN_OFFSET offset, ST *st, TY_IDX ty, UINT field_id = 0)
01519 {
01520     return WN_CreateLdid (opr, rtype, desc, offset, ST_st_idx (st), ty, field_id);
01521 }
01522 
01523 inline WN *
01524 WN_CreateLdid (OPCODE opc, WN_OFFSET offset, ST *st, TY_IDX ty, UINT field_id = 0)
01525 {
01526     return WN_CreateLdid (OPCODE_operator(opc), OPCODE_rtype(opc),
01527                           OPCODE_desc(opc), offset, st, ty, field_id);
01528 }
01529 
01530 inline WN *
01531 WN_CreateLda (OPERATOR opr, TYPE_ID rtype, TYPE_ID desc,
01532               WN_OFFSET offset, TY_IDX ty, ST *st, UINT field_id = 0)
01533 {
01534     return WN_CreateLda(opr, rtype, desc, offset, ty, ST_st_idx (st), field_id);
01535 }
01536 
01537 inline WN *
01538 WN_CreateLda (OPCODE opc, WN_OFFSET offset, TY_IDX ty, ST *st)
01539 {
01540     return WN_CreateLda (OPCODE_operator(opc), OPCODE_rtype(opc),
01541                          OPCODE_desc(opc), offset, ty, st);
01542 }
01543 
01544 inline WN *
01545 WN_CreateIdname (WN_OFFSET offset, ST *st)
01546 {
01547     return WN_CreateIdname (offset, ST_st_idx (st));
01548 }
01549 
01550 inline WN *
01551 WN_CreateConst (OPERATOR opr, TYPE_ID rtype, TYPE_ID desc, ST *st )
01552 {
01553     return WN_CreateConst (opr, rtype, desc, ST_st_idx (st));
01554 }
01555 
01556 inline WN *
01557 WN_CreateConst (OPCODE opc, ST *st )
01558 {
01559     return WN_CreateConst (OPCODE_operator(opc), OPCODE_rtype(opc),
01560                            OPCODE_desc(opc), st);
01561 }
01562 
01563 inline WN *
01564 WN_Ldid (TYPE_ID desc, WN_OFFSET offset, ST *sym, TY_IDX align, UINT field_id = 0)
01565 {
01566     return WN_Ldid (desc, offset, ST_st_idx (sym), align, field_id);
01567 }
01568 
01569 inline WN *
01570 WN_RLdid (TYPE_ID rtype, TYPE_ID desc, WN_OFFSET offset, ST *sym, TY_IDX align)
01571 {
01572     return WN_RLdid (rtype, desc, offset, ST_st_idx (sym), align);
01573 }
01574 
01575 inline WN *
01576 WN_generic_call (OPERATOR opr, TYPE_ID rtype, TYPE_ID desc, INT32 n, ST *sym)
01577 {
01578     return WN_generic_call (opr, rtype, desc, n, ST_st_idx (sym));
01579 }
01580 
01581 
01582 extern WN* WN_CreateAffirm (WN* condition);
01583 extern WN* WN_CreateAlloca (WN* size);
01584 extern WN* WN_CreateDealloca (INT32 n);
01585 extern WN* WN_CreateLdma (TYPE_ID rtype, WN_OFFSET offset, TY_IDX ty, 
01586                           ST_IDX st, UINT field_id = 0);
01587 
01588 inline WN*
01589 WN_CreateLdma (OPCODE opc, WN_OFFSET offset, TY_IDX ty, ST_IDX st, 
01590               UINT field_id = 0) {
01591   return WN_CreateLdma (OPCODE_rtype(opc), offset, ty, st, field_id);
01592 }
01593 
01594 
01595 extern void WN_set_st_addr_saved (WN *);
01596 
01597 extern BOOL WN_has_side_effects (const WN*);
01598 
01599 extern WN *WN_Rrotate (TYPE_ID desc, WN *src, WN *cnt);
01600 
01601 #endif /* wn_INCLUDED */
01602 
01603 
01604 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines