Author: yug Date: 2011-11-20 02:59:33 -0500 (Sun, 20 Nov 2011) New Revision: 3819
Modified: trunk/osprey/be/cg/x8664/cgtarget.cxx Log: Fix bug597. Implement the constraint 'p' for x86_64 target. Code Review: Sun Chan. Modified: trunk/osprey/be/cg/x8664/cgtarget.cxx =================================================================== --- trunk/osprey/be/cg/x8664/cgtarget.cxx 2011-11-19 14:51:55 UTC (rev 3818) +++ trunk/osprey/be/cg/x8664/cgtarget.cxx 2011-11-20 07:59:33 UTC (rev 3819) @@ -1,4 +1,7 @@ /* + * Copyright (C) 2011 Hewlett Packard, Company. All Rights Reserved. + */ +/* * Copyright (C) 2008-2010 Advanced Micro Devices, Inc. All Rights Reserved. */ @@ -3674,6 +3677,59 @@ else ret_tn = (pref_tn ? pref_tn : Build_RCLASS_TN(ISA_REGISTER_CLASS_float)); } + else if (*constraint == 'p') + { + FmtAssert(load, (" there must be load expression for constraint p\n")); + if (load && WN_operator(load)==OPR_LDID && WN_class(load)==CLASS_PREG) + { + // immediate could have been put in preg by wopt + if (Preg_Is_Rematerializable(WN_load_offset(load), NULL)) { + load = Preg_Is_Rematerializable(WN_load_offset(load), NULL); + } + // shared load(lda) has been lifted to preg + else if (Preg_Lda(WN_load_offset(load))) { + load = Preg_Lda(WN_load_offset(load)); + } + else { + load = NULL; + } + } + if (WN_operator(load) == OPR_INTCONST) + { + if (Is_Target_32bit() && (WN_const_val(load) > INT32_MAX || WN_const_val(load) < INT32_MIN)) { + char c[200]; + sprintf(c,"%lld", WN_const_val(load)); + ErrMsgSrcpos(EC_Ill_Int_Oflow, WN_Get_Linenum(asm_wn), + INT32_MIN,c,INT32_MAX); + } + ret_tn = Gen_Literal_TN(WN_const_val(load), + MTYPE_bit_size(WN_rtype(load))/8); + } + else if ( WN_operator(load) == OPR_LDA && ST_sym_class(WN_st(load)) == CLASS_CONST) + { + ST * base; + INT64 ofst; + // Allocate the string to the rodata section + Allocate_Object (WN_st(load)); + Base_Symbol_And_Offset (WN_st(load), &base, &ofst); + ret_tn = Gen_Symbol_TN(base, ofst, 0); + } + else if ( WN_operator(load) == OPR_LDA && ST_sym_class(WN_st(load)) == CLASS_VAR) + { + ST * base; + INT64 ofst; + Base_Symbol_And_Offset_For_Addressing (WN_st(load), WN_lda_offset(load), &base, &ofst); + if (ofst == 0) { //no offset, using a symbol TN + ret_tn = Gen_Symbol_TN(base, ofst, 0); + } else { //has a offset, using a new TN to express the address + ret_tn = (pref_tn ? pref_tn : Build_TN_Of_Mtype(WN_rtype(load))); + } + } + else //other cases + { + ret_tn = (pref_tn ? pref_tn : Build_TN_Of_Mtype(WN_rtype(load))); + } + } else { FmtAssert(FALSE, ("ASM constraint <%s> not supported", constraint)); ------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity, and more. Splunk takes this data and makes sense of it. IT sense. And common sense. http://p.sf.net/sfu/splunk-novd2d _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel