Author: mberg Date: 2011-04-18 14:42:38 -0400 (Mon, 18 Apr 2011) New Revision: 3557
Modified: trunk/osprey/be/cg/cg.cxx trunk/osprey/be/cg/cg_flags.cxx trunk/osprey/be/cg/cg_flags.h trunk/osprey/be/cg/cgdriver.cxx trunk/osprey/be/cg/ebo_special.h trunk/osprey/be/cg/oputil.cxx trunk/osprey/be/cg/x8664/cgemit_targ.cxx trunk/osprey/be/cg/x8664/cgtarget.cxx trunk/osprey/be/cg/x8664/ebo_special.cxx trunk/osprey/common/targ_info/isa/x8664/isa.cxx trunk/osprey/common/targ_info/isa/x8664/isa_operands.cxx trunk/osprey/common/targ_info/isa/x8664/isa_pack.cxx trunk/osprey/common/targ_info/isa/x8664/isa_print.cxx trunk/osprey/common/targ_info/isa/x8664/isa_properties.cxx trunk/osprey/common/targ_info/isa/x8664/isa_subset.cxx trunk/osprey/common/targ_info/proc/x8664/barcelona_si.cxx trunk/osprey/common/targ_info/proc/x8664/core_si.cxx trunk/osprey/common/targ_info/proc/x8664/em64t_si.cxx trunk/osprey/common/targ_info/proc/x8664/opteron_si.cxx trunk/osprey/common/targ_info/proc/x8664/orochi_si.cxx trunk/osprey/common/targ_info/proc/x8664/wolfdale_si.cxx Log: Additions of CG based SIB address mode functionality under the control of -CG:merge_counters_x86=<on,off>, where initially this check in is off by default. Code Reviewed by Jian-Xin. Modified: trunk/osprey/be/cg/cg.cxx =================================================================== --- trunk/osprey/be/cg/cg.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/be/cg/cg.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -1490,6 +1490,18 @@ GRA_LIVE_Rename_TNs(); #if !defined(TARG_PPC32) // PPC IGLS_Schedule_Region bugs IGLS_Schedule_Region (TRUE /* before register allocation */); +#ifdef TARG_X8664 + void Counter_Merge (char*); + if (CG_merge_counters_x86 == TRUE && CG_opt_level > 1) { + if (Enable_CG_Peephole) { + Set_Error_Phase ( "SIB counter merging" ); + GRA_LIVE_Recalc_Liveness(region ? REGION_get_rid( rwn) : NULL); + GRA_LIVE_Rename_TNs (); + Counter_Merge (Cur_PU_Name); + } + } +#endif + #endif #endif // TARG_SL Modified: trunk/osprey/be/cg/cg_flags.cxx =================================================================== --- trunk/osprey/be/cg/cg_flags.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/be/cg/cg_flags.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -125,6 +125,7 @@ BOOL CG_branch_fuse = TRUE; BOOL CG_dispatch_schedule = FALSE; BOOL CG_strcmp_expand = TRUE; +BOOL CG_merge_counters_x86 = FALSE; #endif BOOL CG_opt_level; BOOL CG_localize_tns = FALSE; Modified: trunk/osprey/be/cg/cg_flags.h =================================================================== --- trunk/osprey/be/cg/cg_flags.h 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/be/cg/cg_flags.h 2011-04-18 18:42:38 UTC (rev 3557) @@ -533,6 +533,7 @@ extern BOOL CG_128bitstore; extern BOOL CG_branch_fuse; extern BOOL CG_strcmp_expand; +extern BOOL CG_merge_counters_x86; #endif extern INT CG_opt_level; extern BOOL CG_localize_tns; Modified: trunk/osprey/be/cg/cgdriver.cxx =================================================================== --- trunk/osprey/be/cg/cgdriver.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/be/cg/cgdriver.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -475,6 +475,8 @@ 0, 0, 0, &CG_branch_fuse, NULL }, { OVK_BOOL, OV_VISIBLE, TRUE, "strcmp_expand", "", 0, 0, 0, &CG_strcmp_expand, NULL }, + { OVK_BOOL, OV_VISIBLE, TRUE, "merge_counters_x86", "", + 0, 0, 0, &CG_merge_counters_x86, NULL }, #endif { OVK_BOOL, OV_INTERNAL, TRUE, "skip_local_sched", "", 0, 0, 0, &CG_skip_local_sched, NULL }, Modified: trunk/osprey/be/cg/ebo_special.h =================================================================== --- trunk/osprey/be/cg/ebo_special.h 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/be/cg/ebo_special.h 2011-04-18 18:42:38 UTC (rev 3557) @@ -206,6 +206,8 @@ void Init_Load_Exec_Map( BB*, MEM_POOL* ); BOOL Delete_Unwanted_Prefetches( OP* ); BOOL EBO_Can_Eliminate_Zero_Opnd_OP(OP *); +void Counter_Merge(); +void Peel_Spills(); #endif /* TARG_X8664 */ BOOL EBO_Can_Merge_Into_Offset (OP *op); Modified: trunk/osprey/be/cg/oputil.cxx =================================================================== --- trunk/osprey/be/cg/oputil.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/be/cg/oputil.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -2041,6 +2041,8 @@ {TOP_ldupdxx, TOP_vldupdxx}, {TOP_ldupd_n32, TOP_vldupd_n32}, {TOP_ldups, TOP_vldups}, + {TOP_ldupsx, TOP_vldupsx}, + {TOP_ldupsxx, TOP_vldupsxx}, {TOP_ldups_n32, TOP_vldups_n32}, {TOP_stdqu, TOP_vstdqu}, {TOP_stdqu_n32, TOP_vstdqu_n32}, @@ -2048,6 +2050,8 @@ {TOP_sthps, TOP_vsthps}, {TOP_stlpd, TOP_vstlpd}, {TOP_sthpd, TOP_vsthpd}, + {TOP_sthpdx, TOP_vsthpdx}, + {TOP_sthpdxx, TOP_vsthpdxx}, {TOP_stlps_n32, TOP_vstlps_n32}, {TOP_sthps_n32, TOP_vsthps_n32}, {TOP_stlpd_n32, TOP_vstlpd_n32}, Modified: trunk/osprey/be/cg/x8664/cgemit_targ.cxx =================================================================== --- trunk/osprey/be/cg/x8664/cgemit_targ.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/be/cg/x8664/cgemit_targ.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -3539,6 +3539,8 @@ OP_Name[TOP_ldupdxx] = "movupd"; OP_Name[TOP_ldupd_n32] = "movupd"; OP_Name[TOP_ldups] = "movups"; + OP_Name[TOP_ldupsx] = "movups"; + OP_Name[TOP_ldupsxx] = "movups"; OP_Name[TOP_ldups_n32] = "movups"; OP_Name[TOP_movss] = "movaps"; OP_Name[TOP_movdq] = "movdqa"; Modified: trunk/osprey/be/cg/x8664/cgtarget.cxx =================================================================== --- trunk/osprey/be/cg/x8664/cgtarget.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/be/cg/x8664/cgtarget.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -392,6 +392,8 @@ case TOP_ldaps: case TOP_ldaps_n32: case TOP_ldups: + case TOP_ldupsx: + case TOP_ldupsxx: case TOP_ldups_n32: case TOP_ldupd: case TOP_ldupdx: @@ -444,6 +446,8 @@ case TOP_vldaps: case TOP_vldaps_n32: case TOP_vldups: + case TOP_vldupsx: + case TOP_vldupsxx: case TOP_vldups_n32: case TOP_vldupd: case TOP_vldupdx: Modified: trunk/osprey/be/cg/x8664/ebo_special.cxx =================================================================== --- trunk/osprey/be/cg/x8664/ebo_special.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/be/cg/x8664/ebo_special.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -126,6 +126,15 @@ #include "config_lno.h" +#include <iostream> +#include <string> +#include <sstream> +#include <set> +#include <vector> +#include <list> +#include <deque> +#include <map> + extern BOOL TN_live_out_of( TN*, BB* ); extern void Set_flags_strcmp_expand(); @@ -4533,6 +4542,7 @@ {TOP_UNDEFINED, TOP_ldsd, TOP_ldsdx, TOP_ldsdxx, TOP_ldsd_n32}, {TOP_UNDEFINED, TOP_lddqa, TOP_lddqax, TOP_lddqaxx, TOP_lddqa_n32}, {TOP_UNDEFINED, TOP_ldupd, TOP_ldupdx, TOP_ldupdxx, TOP_UNDEFINED}, + {TOP_UNDEFINED, TOP_ldups, TOP_ldupsx, TOP_ldupsxx, TOP_ldups_n32}, {TOP_UNDEFINED, TOP_lddqu, TOP_lddqux, TOP_lddquxx, TOP_UNDEFINED}, {TOP_UNDEFINED, TOP_ldlps, TOP_ldlpsx, TOP_ldlpsxx, TOP_ldlps_n32}, {TOP_UNDEFINED, TOP_ldlpd, TOP_ldlpdx, TOP_ldlpdxx, TOP_UNDEFINED}, @@ -4590,6 +4600,8 @@ {TOP_UNDEFINED, TOP_prefetcht0, TOP_prefetcht0x, TOP_prefetcht0xx, TOP_UNDEFINED}, {TOP_UNDEFINED, TOP_prefetcht1, TOP_prefetcht1x, TOP_prefetcht1xx, TOP_UNDEFINED}, + {TOP_UNDEFINED, TOP_prefetchnta, TOP_prefetchntax, TOP_prefetchntaxx, TOP_UNDEFINED}, + {TOP_UNDEFINED, TOP_sthpd, TOP_sthpdx, TOP_sthpdxx, TOP_sthpd_n32}, // LEA {TOP_UNDEFINED, TOP_lea32, TOP_leax32, TOP_leaxx32, TOP_UNDEFINED}, {TOP_UNDEFINED, TOP_lea64, TOP_leax64, TOP_leaxx64, TOP_UNDEFINED}, @@ -5126,6 +5138,915 @@ return TOP_UNDEFINED; } + +bool +Test_if_base_mode (OP* op) { + //function that banks on the number of operands to figure + // out if the BASE MODE is being used + ADDR_MODE mode = BASE_MODE; + const TOP new_top = Get_Top_For_Addr_Mode(OP_code(op), mode); + if (new_top == OP_code(op)) { + if (OP_store(op) || OP_load(op) || OP_prefetch(op)) + return true; + + if (OP_load_exe(op)) { + if (OP_icmp(op)) { + // Some integer compares are not easy to convert to SIB + return false; + } + if (OP_opnds(op) > 3) { + return false; + } else if (OP_opnds(op) == 2 || OP_opnds(op) == 3) { + if (OP_results(op) == 1) { + return true; + } else { + return false; + } + } else { + return false; + } + } else { + return false; + } + } else { + return false; + } +} + +OP * +Compose_Mem_Base_Index_Mode ( OP* op, TN* index, TN* offset, TN* scale, TN* base ) +{ + // Based on existing function + Is_True( offset != NULL, ("Compose_Mem_Base_Index_Mode: offset is NULL") ); + Is_True( index != NULL, ("Compose_Mem_Base_Index_Mode: index is NULL") ); + Is_True( scale != NULL, ("Compose_Mem_Base_Index_Mode: scale is NULL") ); + Is_True( base != NULL, ("Compose_Mem_Base_Index_Mode: base is NULL") ); + OP* new_op = NULL; + ADDR_MODE mode = BASE_INDEX_MODE; + const TOP new_top = Get_Top_For_Addr_Mode(OP_code(op), mode); + FmtAssert( new_top != TOP_UNDEFINED, ("Compose_Mem_Op: unknown top") ); + if( TOP_is_prefetch( new_top ) ){ + new_op = Mk_OP( new_top, OP_opnd( op, 0 ), base, offset, index, scale ); + } else { + TN* storeval = NULL; + + if( TOP_is_store(new_top) ){ + storeval = OP_opnd( op, OP_find_opnd_use( op, OU_storeval ) ); + } else { + storeval = OP_result( op, 0 ); + } + if (OP_load(op) || OP_store(op) || OP_prefetch(op)) { + new_op = Mk_OP( new_top, storeval, base, offset, index, scale ); + } else if (OP_load_exe(op)) { + if (OP_opnds(op) == 2) { + FmtAssert ((storeval != NULL), + ("Unsupported storeval with operands == 2 || == 1")); + new_op = Mk_OP( new_top, storeval, base, index, scale, offset ); + return new_op; + } else if (OP_opnds(op) == 3) { + FmtAssert ((storeval != NULL), + ("Unsupported storeval with operands >2")); + new_op = Mk_OP( new_top, storeval, + OP_opnd(op,0), base, index, scale, offset ); + return new_op; + } + FmtAssert(0,("Unsupported for Compose_Mem_Base_Index_Mode\n")); + } else { + FmtAssert(0,("Unsupported for Compose_Mem_Base_Index_Mode\n")); + } + } + Copy_WN_For_Memory_OP(new_op, op); + if (OP_volatile(op)) // Bug 4245 - copy "volatile" flag + Set_OP_volatile(new_op); + OP_srcpos(new_op) = OP_srcpos(op); + + Set_OP_unrolling(new_op, OP_unrolling(op)); + Set_OP_orig_idx(new_op, OP_map_idx(op)); + Set_OP_unroll_bb(new_op, OP_unroll_bb(op)); + + return new_op; +} + +static bool histogram_of_index_counters ( + std::set<TN*> counted_base_regs, + std::map<int,std::list<OP*> >& val_lis_map, + std::map<TN*,OP*> add_map) { + if (counted_base_regs.size() < 3) + return false; + std::set<TN*>::const_iterator counted_base_regs_it; + for (counted_base_regs_it = counted_base_regs.begin(); + counted_base_regs_it != counted_base_regs.end(); + ++counted_base_regs_it) { + OP* add_op_c = add_map[*counted_base_regs_it]; + TN* constant_tn = OP_opnd(add_op_c,1); + val_lis_map[TN_value(constant_tn)].push_front(add_op_c); + } + + if (val_lis_map.size() != 1) { + return false; + } else if (val_lis_map.begin()->first < 4) { + return false; + } + return true; +} + +static bool test_change_affects_flags ( + std::set<TN*> counted_base_regs, + std::map<TN*,OP*> add_map) { + std::set<TN*>::const_iterator counted_base_regs_it; + for (counted_base_regs_it = counted_base_regs.begin(); + counted_base_regs_it != counted_base_regs.end(); + ++counted_base_regs_it) { + OP* whc = add_map[*counted_base_regs_it]; + bool anychange = false; + for (OP *tesop = OP_next(whc); + tesop != NULL; + tesop = OP_next(tesop)) { + TOP top = OP_code(tesop); + if (OP_reads_rflags(tesop)) { + return true; + } + if (TOP_is_change_rflags(top)) { + anychange = true; + break; + } + } + if (anychange == false) + return false; + } + return false; +} + +static bool collect_counters (bool pdom_header, + bool compare_undo, BB *fromwhere, + GTN_SET* otherliveins, std::map<TN*, bool>& avoid_table, + std::set<TN*>& seen_defs, std::set<TN*>& used_at_all, + std::map<TN*, OP*>& add_map, BB** add_bb, + std::map<TN*,std::deque<OP*> >& use_map, + std::map<TN*, OP*>& compare_map, + std::set<TN*>& compare_opnds) { + OP* op; + op = BB_first_op(fromwhere); + int insnum = 0; + while(op != NULL) { + // avoid_table holds operands for which + // SIB is not to be done + // known defs tracks all defs along the + // traversed control flow path + for (INT i = 0; i < OP_opnds(op); ++i) { + if (avoid_table.find(OP_opnd(op,i)) == avoid_table.end()) { + avoid_table[OP_opnd(op,i)] = false; + } + } + for (INT i = 0; i < OP_results(op); ++i) { + if (avoid_table.find(OP_result(op,i)) == avoid_table.end()) { + avoid_table[OP_result(op,i)] = false; + } + } + std::ostringstream reason; + { + bool doesnotapply = false; + if (OP_load_exe(op) || OP_load(op) + || OP_store(op) || OP_prefetch(op)) { + if (Test_if_base_mode(op) == false) { + doesnotapply = true; + } else if (!(TN_has_value(OP_opnd(op, + OP_find_opnd_use(op,OU_offset))))) { + doesnotapply = true; + } + } else { + if (pdom_header) { + if (compare_undo) { + if (!(OP_iadd(op) && + (OP_result(op,0) == OP_opnd(op,0) && + (TN_is_constant((OP_opnd(op,1)))))) && + !((OP_code(op) == TOP_cmp64) && + (TN_is_register(OP_opnd(op,1)) == TRUE) && + (TN_is_register(OP_opnd(op,0)) == TRUE)) && + !((OP_code(op) == TOP_cmp32) + && (TN_is_register(OP_opnd(op,1)) == TRUE) && + (TN_is_register(OP_opnd(op,0)) == TRUE))) { + doesnotapply = true; + } + } else { + if (!(OP_iadd(op) && + (OP_result(op,0) == OP_opnd(op,0) && + (TN_is_constant((OP_opnd(op,1))))))) { + doesnotapply = true; + } + } + } else { + doesnotapply = true; + } + } + if (doesnotapply) { + // + // cases for which SIB is not applicable + // we need to ensure that the registers + // used in these cases are not used in + // a SIB situation (simplifying assumption) + // add operands to the avoid_table + // + for (INT i = 0; i < OP_opnds(op); ++i) { + avoid_table[OP_opnd(op,i)] = true; + } + for (INT i = 0; i < OP_results(op); ++i) { + avoid_table[OP_result(op,i)] = true; + } + } else { + if (OP_load_exe(op) || OP_load(op) + || OP_store(op) || OP_prefetch(op)) { + for (INT i = 0; i < OP_results(op); ++i) { + avoid_table[OP_result(op,i)] = true; + } + TN* which_base = OP_opnd(op, + TOP_Find_Operand_Use(OP_code(op), OU_base)); + + for (INT i = 0; i < OP_opnds(op); ++i) { + if (OP_opnd(op,i) != which_base) { + avoid_table[OP_opnd(op,i)] = true; + } + } + if (avoid_table[which_base] == false) { + used_at_all.insert(which_base); + // This will not replace an exiting mapping + use_map[which_base].push_front(op); + } + } else if (pdom_header && OP_iadd(op) + && (OP_result(op,0) == OP_opnd(op,0) + && (TN_is_constant((OP_opnd(op,1)))))) { + FmtAssert((OP_results(op) == 1), + ("Add operation with more than one result")); + if (avoid_table[OP_result(op,0)] == false) { + if (otherliveins != NULL) { + if (GTN_SET_MemberP(otherliveins, + OP_result(op,0)) == 0) { + if (*add_bb == NULL) + *add_bb = op->bb; + if (*add_bb != op->bb) + return false; + add_map[OP_result(op,0)] = op; + if (seen_defs.find (OP_result(op,0)) + == seen_defs.end()) + seen_defs.insert(OP_result(op,0)); + else + avoid_table[OP_result(op,0)] = true; + } else { + // Some SIB like counters are + // used outside the loop. we need + // a special case fix for these. + // as of now we don't enable + // SIB for these. + reason << " reason:LiveOut variable"; + avoid_table[OP_result(op,0)] = true; + } + } else { + if (*add_bb == NULL) + *add_bb = op->bb; + if (*add_bb != op->bb) { + return false; + } + + add_map[OP_result(op,0)] = op; + if (seen_defs.find (OP_result(op,0)) + == seen_defs.end()) + seen_defs.insert(OP_result(op,0)); + else + avoid_table[OP_result(op,0)] = true; + } + } + } else if (compare_undo && (OP_code(op) == TOP_cmp64 + || OP_code(op) == TOP_cmp32)) { + for (INT i = 0; i < OP_opnds(op); ++i) { + if (TN_is_register(OP_opnd(op,i))) { + if (avoid_table[OP_opnd(op,i)] == false) { + if (otherliveins != NULL) { + if (GTN_SET_MemberP(otherliveins, + OP_result(op,0)) == 0) { + if (compare_map.find(OP_opnd(op,i)) == compare_map.end()) { + compare_map[OP_opnd(op,i)] = op; + compare_opnds.insert(OP_opnd(op,i)); + } else { + avoid_table[OP_opnd(op,i)] = true; + } + } else { + avoid_table[OP_opnd(op,i)] = true; + } + } else { + if (compare_map.find(OP_opnd(op,i)) == compare_map.end()) { + compare_map[OP_opnd(op,i)] = op; + compare_opnds.insert(OP_opnd(op,i)); + } else { + avoid_table[OP_opnd(op,i)] = true; + } + } + } + } + } + } else { + if (pdom_header || compare_undo) { + return false; + } else { + for (INT i = 0; i < OP_opnds(op); ++i) { + avoid_table[OP_opnd(op,i)] = true; + } + for (INT i = 0; i < OP_results(op); ++i) { + avoid_table[OP_result(op,i)] = true; + } + } + } + } + } + op = OP_next(op); + insnum++; + } + return true; +} + +static void fix_base_instructions (char* Cur_PU_Name, + LOOP_DESCR* loop, GTN_SET* otherliveins) { + std::map<TN*, bool> avoid_table; + std::set<TN*> seen_defs; + std::set<TN*> used_at_all; + std::map<TN*, OP*> add_map; + std::map<TN*,std::deque<OP*> > use_map; + std::set<OP*> dep_map; + std::set<TN*> counted_base_regs; + std::map<TN*, OP*> compare_map; + std::set<TN*> compare_opnds; + BB *lhead; + lhead = LOOP_DESCR_loophead(loop); + BB *add_bb; + BB *abbinloop; + OP *opi; + bool outofhere = false; + add_bb = NULL; + FOR_ALL_BB_SET_members(LOOP_DESCR_bbset(loop), abbinloop) { + bool pdom_header = false; + bool compare_undo = false; + if (BS_MemberP(BB_pdom_set(lhead), BB_id(abbinloop))) { + pdom_header = true; + } else { + pdom_header = false; + } + + if (collect_counters (pdom_header, + compare_undo && pdom_header, abbinloop, + otherliveins, avoid_table, + seen_defs, used_at_all, + add_map, &add_bb, use_map, + compare_map, compare_opnds) == false) { + outofhere == true; + break; + } + } + + if (outofhere) { + return; + } else if (add_bb == NULL) { + return; + } + + for (std::set<TN*>::iterator sdit = + seen_defs.begin(); sdit != seen_defs.end(); ++sdit) { + if (avoid_table[*sdit] == false) { + if (used_at_all.find(*sdit) != used_at_all.end()) { + counted_base_regs.insert(*sdit); + } + } + } + + // + // find out the implications of reordering the add instruction + // We do a walk on the counted_base_regs, get the use_map + // for each such reg, and check if the def is either + // dominating or post-dominating it. If it is dominating it, + // we dont need compensation code for it. If it is post-dominating + // and the new inc's location is not post-dominating it, + // then we need compensation code for the use. + // + + std::set<TN*>::iterator cbreg_it; + std::set<TN*> skip_set; + for (cbreg_it = counted_base_regs.begin(); + cbreg_it != counted_base_regs.end(); + ++cbreg_it) { + std::map<TN*, std::deque<OP*> >::iterator use_map_it; + if (add_map.find(*cbreg_it) == add_map.end()) { + skip_set.insert (*cbreg_it); + } + } + + for (std::set<TN*>::iterator skip_it = skip_set.begin(); + skip_it != skip_set.end(); ++skip_it) { + counted_base_regs.erase(*skip_it); + } + + + for (cbreg_it = counted_base_regs.begin(); + cbreg_it != counted_base_regs.end(); + ++cbreg_it) { + OP* defing_ins = add_map[*cbreg_it]; + BB* defing_bb = defing_ins->bb; + + std::deque<OP*>::iterator use_deq_it; + for (use_deq_it = use_map[*cbreg_it].begin(); + use_deq_it != use_map[*cbreg_it].end(); + ++use_deq_it) { + BB* where_used = (*use_deq_it)->bb; + if (defing_bb == where_used) { + bool usefirst = true; + for (OP* whichop = *use_deq_it; + whichop != NULL; + whichop = OP_prev(whichop)) { + if (whichop == defing_ins) { + usefirst = false; + break; + } + } + if (usefirst == true) + dep_map.insert (*use_deq_it); + } + } + } + + std::map<int,std::list<OP*> > val_lis_map; + if (histogram_of_index_counters (counted_base_regs, + val_lis_map, add_map) == false) { + return; + } + + if (test_change_affects_flags (counted_base_regs, + add_map) == true) { + return; + } + + OP* add_template = val_lis_map.begin()->second.front(); + if (counted_base_regs.size() == 0) { + return; + } else { + TN* newinc; + newinc = OP_opnd(add_template,1); + if (TN_value(newinc) <= 0 ) { + return; + } + } + + TN* newinc; + if (Is_Target_32bit()) { + newinc = Gen_Literal_TN (TN_value(OP_opnd(add_template,1)), 4); + } else { + newinc = Gen_Literal_TN (TN_value(OP_opnd(add_template,1)), 8); + } + OP* newadd; + TN* newres = Build_TN_Like(OP_result(add_template,0)); + Set_TN_is_global_reg(newres); + TOP alea; + if (Is_Target_32bit()) { + alea = TOP_lea32; + } else { + alea = TOP_lea64; + } + newadd = Mk_OP(alea, newres, newres, newinc); + newadd->bb = add_bb; + BB_Prepend_Op(add_bb,newadd); + bool aft_prnt = false; + std::set<TN*>::const_iterator counted_base_regs_it; + std::set<OP*> changed_ops; + for (counted_base_regs_it = counted_base_regs.begin(); + counted_base_regs_it != counted_base_regs.end(); + ++counted_base_regs_it) { + std::deque<OP*> used_ops; + used_ops = use_map[(*counted_base_regs_it)]; + std::deque<OP*>::iterator used_ops_it; + for (used_ops_it = used_ops.begin(); + used_ops_it != used_ops.end(); + ++used_ops_it) { + OP* whatnow; + OP* newadd; + OP* newmovop; + TN *movtn; + TN* scale; + if( Is_Target_32bit() ){ + scale = Gen_Literal_TN(1,4); + } else { + scale = Gen_Literal_TN(1,8); + } + + TN* offset_d; + if (dep_map.find(*used_ops_it) == dep_map.end()) { + if (Is_Target_32bit()) { + offset_d = Gen_Literal_TN (TN_value(OP_opnd(*used_ops_it, + TOP_Find_Operand_Use(OP_code(*used_ops_it), + OU_offset))), 4); + } else { + offset_d = Gen_Literal_TN (TN_value(OP_opnd(*used_ops_it, + TOP_Find_Operand_Use(OP_code(*used_ops_it), + OU_offset))), 4); + } + } else { + if( Is_Target_32bit() ){ + offset_d = Gen_Literal_TN ( + TN_value(OP_opnd(*used_ops_it, + TOP_Find_Operand_Use( + OP_code(*used_ops_it), OU_offset))) + - TN_value(newinc), 4); + } else { + offset_d = Gen_Literal_TN ( + TN_value(OP_opnd(*used_ops_it, + TOP_Find_Operand_Use( + OP_code(*used_ops_it), OU_offset))) + - TN_value(newinc), 8); + } + } + + whatnow = Compose_Mem_Base_Index_Mode(*used_ops_it, + newres, offset_d, scale, + OP_opnd(*used_ops_it, + TOP_Find_Operand_Use(OP_code(*used_ops_it), + OU_base))); + OP_scycle(whatnow) = OP_scycle(*used_ops_it); + + BB_Insert_Op_Before((*used_ops_it)->bb,*used_ops_it,whatnow); + whatnow->bb = (*used_ops_it)->bb; + changed_ops.insert(whatnow); + OPS_Remove_Op(&((*used_ops_it)->bb->ops), *used_ops_it); + } + } + + for (counted_base_regs_it = counted_base_regs.begin(); + counted_base_regs_it != counted_base_regs.end(); + ++counted_base_regs_it) { + OP* anaddop = add_map[*counted_base_regs_it]; + BB_Remove_Op(anaddop->bb,anaddop); + } + + std::set<OP*>::iterator changed_ops_it; + bool enable_large_disp_opt = false; + std::set<OP*> large_disp_ops; + if (enable_large_disp_opt) { + for (changed_ops_it = changed_ops.begin(); + changed_ops_it != changed_ops.end(); + ++changed_ops_it) { + TN* theofst = OP_opnd(*changed_ops_it, + TOP_Find_Operand_Use(OP_code(*changed_ops_it), + OU_offset)); + FmtAssert ((TN_is_constant(theofst)), + ("Not a constant offset\n")); + INT64 theval = TN_value(theofst); + // make a new lea op Mk_Op + if (theval < 127) + if (theval > -128) + continue; + TOP alea; + TN* zeroval; + if (Is_Target_32bit()) { + zeroval = Gen_Literal_TN (0,4); + alea = TOP_lea32; + } else { + zeroval = Gen_Literal_TN (0,8); + alea = TOP_lea64; + } + TN* thebase = OP_opnd(*changed_ops_it, + TOP_Find_Operand_Use(OP_code(*changed_ops_it), + OU_base)); + TN* newgprtn = Build_TN_Like(thebase); + OP* thelea = Mk_OP(alea, newgprtn, thebase, theofst); + INT offset_loc, base_loc; + offset_loc = TOP_Find_Operand_Use(OP_code(*changed_ops_it), + OU_offset); + base_loc = TOP_Find_Operand_Use(OP_code(*changed_ops_it), + OU_base); + Set_OP_opnd(*changed_ops_it, offset_loc, zeroval); + Set_OP_opnd(*changed_ops_it, base_loc, newgprtn); + large_disp_ops.insert(thelea); + } + } + + BBLIST* predlis = BB_preds(LOOP_DESCR_loophead(loop)); + bool inserted_some = false; + while (predlis) { + BB *pred = BBLIST_item(predlis); + predlis = BBLIST_next(predlis); + if (!BB_SET_MemberP(LOOP_DESCR_bbset(loop), pred)) { + inserted_some = true; + OP* init_co; + TN* zeroval; + TOP whichldc; + if( Is_Target_32bit()) { + zeroval = Gen_Literal_TN (0,4); + whichldc = TOP_ldc32; + } else { + whichldc = TOP_ldc64; + zeroval = Gen_Literal_TN (0,8); + } + init_co = Mk_OP (whichldc, newres, zeroval , newres); + if (BB_branch_op(pred)) { + BB_Insert_Op_Before(pred,BB_branch_op(pred),init_co); + init_co->bb = pred; + std::set<OP*>::iterator init_ops_it; + if (enable_large_disp_opt) { + for (init_ops_it = large_disp_ops.begin(); + init_ops_it != large_disp_ops.end(); + ++init_ops_it) { + OP* toinse; + toinse = Mk_OP (OP_code(*init_ops_it), + OP_result (*init_ops_it,0), + OP_opnd (*init_ops_it,0), + OP_opnd (*init_ops_it,1)); + BB_Insert_Op_Before(pred,BB_branch_op(pred),toinse); + } + } + } else { + BB_Append_Op(pred,init_co); + init_co->bb = pred; + std::set<OP*>::iterator init_ops_it; + if (enable_large_disp_opt) { + for (init_ops_it = large_disp_ops.begin(); + init_ops_it != large_disp_ops.end(); + ++init_ops_it) { + OP* toinse; + toinse = Mk_OP (OP_code(*init_ops_it), + OP_result (*init_ops_it,0), + OP_opnd (*init_ops_it,0), + OP_opnd (*init_ops_it,1)); + BB_Append_Op(pred,toinse); + } + } + } + } + } + FmtAssert(inserted_some == true, + ("No init instruction inserted!")); + GRA_LIVE_Recalc_Liveness (NULL); +} + +static void fix_compare_binding (LOOP_DESCR* loop, + GTN_SET* otherliveins) { + std::map<TN*, bool> avoid_table; + std::set<TN*> seen_defs; + std::set<TN*> used_at_all; + std::map<TN*, OP*> add_map; + std::map<TN*,std::deque<OP*> > use_map; + std::set<OP*> dep_map; + std::set<TN*> counted_base_regs; + std::map<TN*, OP*> compare_map; + std::set<TN*> compare_opnds; + BB *lhead; + lhead = LOOP_DESCR_loophead(loop); + BB *add_bb; + add_bb = NULL; + BB *abbinloop; + OP *opi; + bool outofhere = false; + FOR_ALL_BB_SET_members(LOOP_DESCR_bbset(loop), abbinloop) { + bool pdom_header = false; + bool compare_undo = true; + if (BS_MemberP(BB_pdom_set(lhead), BB_id(abbinloop))) { + pdom_header = true; + } else { + pdom_header = false; + } + + if (collect_counters (pdom_header, + compare_undo && pdom_header, abbinloop, + otherliveins, avoid_table, + seen_defs, used_at_all, + add_map, &add_bb, use_map, + compare_map, compare_opnds) == false) { + outofhere == true; + break; + } + } + + if (outofhere) { + return; + } else if (add_bb == NULL) { + return; + } + + // additional checks + for (std::set<TN*>::iterator sdit = + seen_defs.begin(); sdit != seen_defs.end(); ++sdit) { + if (avoid_table[*sdit] == false) { + if (used_at_all.find(*sdit) != used_at_all.end()) { + counted_base_regs.insert(*sdit); + } + } + } + + // + // find out the implications of reordering the add instruction + // We do a walk on the counted_base_regs, get the use_map + // for each such reg, and check if the def is either + // dominating or post-dominating it. If it is dominating it, + // we dont need compensation code for it. If it is post-dominating + // and the new inc's location is not post-dominating it, + // then we need compensation code for the use. + // + + std::set<TN*>::iterator cbreg_it; + std::set<TN*> skip_set; + // additional checks + for (cbreg_it = counted_base_regs.begin(); + cbreg_it != counted_base_regs.end(); + ++cbreg_it) { + std::map<TN*, std::deque<OP*> >::iterator use_map_it; + if (add_map.find(*cbreg_it) == add_map.end()) { + skip_set.insert (*cbreg_it); + } + } + + for (std::set<TN*>::iterator skip_it = skip_set.begin(); + skip_it != skip_set.end(); ++skip_it) { + counted_base_regs.erase(*skip_it); + } + + std::map<int,std::list<OP*> > val_lis_map; + if (histogram_of_index_counters (counted_base_regs, + val_lis_map, add_map) == false) { + return; + } + + if (test_change_affects_flags (counted_base_regs, + add_map) == true) { + return; + } + + int cardinale = 0; + std::set<TN*> interset; + for (std::set<TN*>::iterator comit = + compare_opnds.begin(); comit != compare_opnds.end(); ++comit) { + if (counted_base_regs.find(*comit) != counted_base_regs.end()) { + cardinale++; + interset.insert(*comit); + } + } + + if (cardinale != 1) { + for (std::set<TN*>::iterator comit = + compare_opnds.begin(); comit != compare_opnds.end(); ++comit) { + counted_base_regs.erase (*comit); + } + } else { + TN* bound_name = *(interset.begin()); + counted_base_regs.erase (bound_name); + TOP whichmov; + TN* homing_gr; + if (Is_Target_32bit()) { + whichmov = TOP_mov32; + } else { + whichmov = TOP_mov64; + } + homing_gr = Build_TN_Like(bound_name); + OP* new_add_op; + TOP add_opcod; + if (Is_Target_32bit()) { + add_opcod = TOP_addi32; + } else { + add_opcod = TOP_addi64; + } + + new_add_op = Mk_OP(add_opcod, homing_gr, homing_gr, + OP_opnd(add_map[bound_name],1)); + BB_Insert_Op_Before (add_bb, add_map[bound_name], new_add_op); + OP_scycle(new_add_op) = OP_scycle(add_map[bound_name]); + new_add_op->bb = add_bb; + + FOR_ALL_BB_SET_members(LOOP_DESCR_bbset(loop), abbinloop) { + FOR_ALL_BB_OPs (abbinloop,opi) { + if (opi != compare_map [bound_name] + && opi != add_map[bound_name]) { + for (int i = 0; i < OP_opnds(opi); i++) { + if (OP_opnd(opi,i) == bound_name) + Set_OP_opnd (opi, i, homing_gr); + } + for (int i = 0; i < OP_results(opi); i++) { + if (OP_result(opi,i) == bound_name) + Set_OP_result (opi, i, homing_gr); + } + } + } + } + + use_map[homing_gr] = use_map[bound_name]; + use_map.erase(bound_name); + add_map[homing_gr] = new_add_op; + add_map.erase(bound_name); + counted_base_regs.insert (homing_gr); + counted_base_regs.erase (bound_name); + + BBLIST* predlis = BB_preds(LOOP_DESCR_loophead(loop)); + while (predlis) { + BB *pred = BBLIST_item(predlis); + predlis = BBLIST_next(predlis); + if (!BB_SET_MemberP(LOOP_DESCR_bbset(loop), pred)) { + if (BB_branch_op(pred)) { + OP* homing_mov; + homing_mov = Mk_OP(whichmov, homing_gr, bound_name); + BB_Insert_Op_Before (pred, BB_branch_op(pred), homing_mov); + homing_mov->bb = pred; + } else { + OP* homing_mov; + homing_mov = Mk_OP(whichmov, homing_gr, bound_name); + BB_Append_Op(pred,homing_mov); + homing_mov->bb = pred; + } + } + } + GRA_LIVE_Recalc_Liveness (NULL); + } +} + +void Counter_Merge (char *Cur_PU_Name) { + GRA_LIVE_Recalc_Liveness (NULL); + MEM_POOL loop_descr_pool; + MEM_POOL_Initialize(&loop_descr_pool, "loop_descriptors", TRUE); + MEM_POOL_Push (&loop_descr_pool); + Calculate_Dominators(); + + LOOP_DESCR *theloops = LOOP_DESCR_Detect_Loops(&loop_descr_pool); + for (LOOP_DESCR *loop = theloops; loop; loop = LOOP_DESCR_next(loop)) { + if (!BB_innermost(LOOP_DESCR_loophead(loop))) + continue; + BB *abbinloop; + OP *opi; + bool dontdoit = false; + FOR_ALL_BB_SET_members(LOOP_DESCR_bbset(loop), abbinloop) { + FOR_ALL_BB_OPs (abbinloop,opi) { + // escape hatch for loops that hold volatile + // registers or have calls. calls may modify + // contents of SIB registers + if (OP_volatile(opi)) + dontdoit = true; + if (OP_call(opi)) + dontdoit = true; + } + } + if (dontdoit) continue; + + // + // collect the LiveIn sets of pdoms of loop header + // which are not part of the loop + // + GTN_SET* otherliveins; + otherliveins = NULL; + MEM_POOL merge_counter_pool; + MEM_POOL_Initialize(&merge_counter_pool, + "loop_descriptors", TRUE); + MEM_POOL_Push (&merge_counter_pool); + + // We collect the live-ins of successors of the loop BBs + // which are not part of the loop. + // We will avoid doing SIB for the variables which are + // part of that live-in set + FOR_ALL_BB_SET_members(LOOP_DESCR_bbset(loop), abbinloop) { + BBLIST* succlis = BB_succs(abbinloop); + while (succlis) { + BB *succ = BBLIST_item(succlis); + succlis = BBLIST_next(succlis); + if (!BB_SET_MemberP(LOOP_DESCR_bbset(loop), succ)) { + if (otherliveins == NULL) { + otherliveins = BB_live_in(succ); + } else { + otherliveins = GTN_SET_Union (otherliveins, + BB_live_in (succ), &merge_counter_pool); + } + } + } + } + + fix_compare_binding (loop, otherliveins); + + // collect otherliveins again as fix_compare_binding may have + // changed liveness + otherliveins = NULL; + FOR_ALL_BB_SET_members(LOOP_DESCR_bbset(loop), abbinloop) { + BBLIST* succlis = BB_succs(abbinloop); + while (succlis) { + BB *succ = BBLIST_item(succlis); + succlis = BBLIST_next(succlis); + if (!BB_SET_MemberP(LOOP_DESCR_bbset(loop), succ)) { + if (otherliveins == NULL) { + otherliveins = BB_live_in(succ); + } else { + otherliveins = GTN_SET_Union (otherliveins, + BB_live_in (succ), &merge_counter_pool); + } + } + } + } + + fix_base_instructions (Cur_PU_Name, loop, otherliveins); + + MEM_POOL_Pop(&merge_counter_pool); + } + + MEM_POOL_Pop (&loop_descr_pool); + MEM_POOL_Delete(&loop_descr_pool); + Free_Dominators_Memory (); +} + static OP * Compose_Mem_Op( OP* op, TN* index, TN* offset, TN* scale, TN* base ) { Modified: trunk/osprey/common/targ_info/isa/x8664/isa.cxx =================================================================== --- trunk/osprey/common/targ_info/isa/x8664/isa.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/isa/x8664/isa.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -871,6 +871,8 @@ "ldapdx", "ldapdxx", "ldups", + "ldupsx", + "ldupsxx", "ldupd", "ldupdx", "ldupdxx", Modified: trunk/osprey/common/targ_info/isa/x8664/isa_operands.cxx =================================================================== --- trunk/osprey/common/targ_info/isa/x8664/isa_operands.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/isa/x8664/isa_operands.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -5144,6 +5144,7 @@ TOP_ldupdx, TOP_ldapdx, TOP_ldapsx, + TOP_ldupsx, TOP_fmovsldupxx, TOP_fmovshdupxx, TOP_fmovddupxx, @@ -5212,6 +5213,7 @@ TOP_ldupdxx, TOP_ldapdxx, TOP_ldapsxx, + TOP_ldupsxx, TOP_fmovsldupxxx, TOP_fmovshdupxxx, TOP_fmovddupxxx, Modified: trunk/osprey/common/targ_info/isa/x8664/isa_pack.cxx =================================================================== --- trunk/osprey/common/targ_info/isa/x8664/isa_pack.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/isa/x8664/isa_pack.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -771,6 +771,8 @@ TOP_ldaps, 0x000000ff, TOP_ldupd, 0x000000ff, TOP_ldups, 0x000000ff, + TOP_ldupsx, 0x000000ff, + TOP_ldupsxx, 0x000000ff, TOP_stapd, 0x000000ff, TOP_staps, 0x000000ff, TOP_stupd, 0x000000ff, Modified: trunk/osprey/common/targ_info/isa/x8664/isa_print.cxx =================================================================== --- trunk/osprey/common/targ_info/isa/x8664/isa_print.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/isa/x8664/isa_print.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -3603,6 +3603,7 @@ TOP_ldx32_64, TOP_ldapdx, TOP_ldapsx, + TOP_ldupsx, TOP_fmovsldupxx, TOP_fmovshdupxx, TOP_fmovddupxx, @@ -3658,6 +3659,7 @@ TOP_ldhpdxx, TOP_ldxx32_64, TOP_ldapdxx, + TOP_ldupsxx, TOP_ldapsxx, TOP_fmovsldupxxx, TOP_fmovshdupxxx, Modified: trunk/osprey/common/targ_info/isa/x8664/isa_properties.cxx =================================================================== --- trunk/osprey/common/targ_info/isa/x8664/isa_properties.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/isa/x8664/isa_properties.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -849,6 +849,8 @@ TOP_ldupdxx, TOP_ldupd_n32, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, TOP_ldups_n32, TOP_lddqax, TOP_lddqux, @@ -3443,6 +3445,8 @@ TOP_ldupdx, TOP_ldupdxx, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, /* AVX instructions */ TOP_vlddqu_n32, TOP_vlddqu, @@ -3998,6 +4002,8 @@ TOP_ldupdxx, TOP_ldupd_n32, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, TOP_ldups_n32, TOP_stdqu, TOP_stdqu_n32, @@ -5891,6 +5897,8 @@ TOP_ldupdxx, TOP_ldupd_n32, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, TOP_ldups_n32, TOP_ld64_2sse, TOP_ld64_2sse_n32, @@ -9523,6 +9531,8 @@ TOP_ldapsx, TOP_ldapsxx, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, TOP_ldups_n32, TOP_ldlps, TOP_ldlps_n32, Modified: trunk/osprey/common/targ_info/isa/x8664/isa_subset.cxx =================================================================== --- trunk/osprey/common/targ_info/isa/x8664/isa_subset.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/isa/x8664/isa_subset.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -737,6 +737,8 @@ TOP_ldupdxx, TOP_ldupd_n32, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, TOP_ldups_n32, TOP_stdqu, TOP_stdqu_n32, Modified: trunk/osprey/common/targ_info/proc/x8664/barcelona_si.cxx =================================================================== --- trunk/osprey/common/targ_info/proc/x8664/barcelona_si.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/proc/x8664/barcelona_si.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -758,6 +758,8 @@ TOP_ldupdxx, TOP_ldupd_n32, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, TOP_ldups_n32, TOP_ldmxcsr, TOP_UNDEFINED ); Modified: trunk/osprey/common/targ_info/proc/x8664/core_si.cxx =================================================================== --- trunk/osprey/common/targ_info/proc/x8664/core_si.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/proc/x8664/core_si.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -758,6 +758,8 @@ TOP_ldupdxx, TOP_ldupd_n32, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, TOP_ldups_n32, TOP_ldmxcsr, TOP_UNDEFINED ); Modified: trunk/osprey/common/targ_info/proc/x8664/em64t_si.cxx =================================================================== --- trunk/osprey/common/targ_info/proc/x8664/em64t_si.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/proc/x8664/em64t_si.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -751,6 +751,8 @@ TOP_ldupdxx, TOP_ldupd_n32, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, TOP_ldups_n32, TOP_ldmxcsr, TOP_UNDEFINED ); Modified: trunk/osprey/common/targ_info/proc/x8664/opteron_si.cxx =================================================================== --- trunk/osprey/common/targ_info/proc/x8664/opteron_si.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/proc/x8664/opteron_si.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -758,6 +758,8 @@ TOP_ldupdxx, TOP_ldupd_n32, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, TOP_ldups_n32, TOP_ldmxcsr, TOP_UNDEFINED ); Modified: trunk/osprey/common/targ_info/proc/x8664/orochi_si.cxx =================================================================== --- trunk/osprey/common/targ_info/proc/x8664/orochi_si.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/proc/x8664/orochi_si.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -782,6 +782,8 @@ TOP_ldupdxx, TOP_ldupd_n32, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, TOP_ldups_n32, TOP_ldmxcsr, TOP_UNDEFINED ); Modified: trunk/osprey/common/targ_info/proc/x8664/wolfdale_si.cxx =================================================================== --- trunk/osprey/common/targ_info/proc/x8664/wolfdale_si.cxx 2011-04-16 09:01:45 UTC (rev 3556) +++ trunk/osprey/common/targ_info/proc/x8664/wolfdale_si.cxx 2011-04-18 18:42:38 UTC (rev 3557) @@ -758,6 +758,8 @@ TOP_ldupdxx, TOP_ldupd_n32, TOP_ldups, + TOP_ldupsx, + TOP_ldupsxx, TOP_ldups_n32, TOP_ldmxcsr, TOP_UNDEFINED ); ------------------------------------------------------------------------------ Benefiting from Server Virtualization: Beyond Initial Workload Consolidation -- Increasing the use of server virtualization is a top priority.Virtualization can reduce costs, simplify management, and improve application availability and disaster protection. Learn more about boosting the value of server virtualization. http://p.sf.net/sfu/vmware-sfdev2dev _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel