11/**
2+ * Local optimizations of elem trees
3+ *
24 * Compiler implementation of the
35 * $(LINK2 http://www.dlang.org, D programming language).
46 *
@@ -787,12 +789,40 @@ private elem * elmemset(elem *e, goal_t goal)
787789 case SHORTSIZE : tym = TYshort; goto L1 ;
788790 case LONGSIZE : tym = TYlong; goto L1 ;
789791 case LLONGSIZE : if (_tysize[TYint] == 2 )
790- goto Ldefault ;
792+ goto default ;
791793 tym = TYllong; goto L1 ;
794+
795+ case 16 : if (REGSIZE == 8 && e1.Eoper == OPrelconst)
796+ goto L1 ;
797+ goto default ;
792798 L1 :
793799 {
794800 tym_t ety = e.Ety;
795801 memset(&value, value & 0xFF , value.sizeof);
802+ if (nbytes == 2 * REGSIZE && e1.Eoper == OPrelconst)
803+ {
804+ /* Rewrite as:
805+ * (*e1.0 = value),(*e1.4 = value),(e1)
806+ */
807+ tym = REGSIZE == 8 ? TYllong : TYint;
808+
809+ auto e1a = el_copytree(e1);
810+ e1a.Eoper = OPvar;
811+ e1a.Ety = tym;
812+ auto ea = el_bin(OPeq,TYint,e1a,el_long(tym,value));
813+
814+ auto e1b = el_copytree(e1);
815+ e1b.Eoper = OPvar;
816+ e1b.Ety = tym;
817+ e1b.EV .Voffset += REGSIZE ;
818+ auto eb = el_bin(OPeq,tym,e1b,el_long(tym,value));
819+
820+ e.EV .E1 = null ;
821+ el_free(e);
822+ e = el_combine(el_combine(ea, eb), e1);
823+ e = optelem(e, GOALvalue);
824+ return e;
825+ }
796826 evalue.EV .Vullong = value;
797827 evalue.Ety = tym;
798828 e.Eoper = OPeq;
@@ -807,11 +837,10 @@ private elem * elmemset(elem *e, goal_t goal)
807837 e.EV .E2 = el_selecte2(e.EV .E2 );
808838 e = el_combine(e, tmp);
809839 e = optelem(e,GOALvalue);
810- break ;
811840 }
841+ break ;
812842
813843 default :
814- Ldefault:
815844 break ;
816845 }
817846 }
@@ -3268,7 +3297,7 @@ private elem * elbit(elem *e, goal_t goal)
32683297 e.Eoper = OPu8_16;
32693298 e.EV .E2 = null ;
32703299 el_free(e2);
3271- goto L1 ;
3300+ return optelem (e,GOALvalue); // optimize result
32723301 }
32733302
32743303 if (w + b == sz) // if field is left-justified
@@ -3282,7 +3311,7 @@ private elem * elbit(elem *e, goal_t goal)
32823311 e.Eoper = OPs8_16;
32833312 e.EV .E2 = null ;
32843313 el_free(e2);
3285- goto L1 ;
3314+ return optelem (e,GOALvalue); // optimize result
32863315 }
32873316 m = ~ cast (targ_ullong)0 ;
32883317 c = sz - (w + b);
@@ -3297,7 +3326,6 @@ private elem * elbit(elem *e, goal_t goal)
32973326 e.EV .E1 = el_bin(OPshr,tym1,
32983327 el_bin(OPshl,tym1,e.EV .E1 ,el_long(TYint,c)),
32993328 el_long(TYint,b));
3300- L1 :
33013329 return optelem (e,GOALvalue); // optimize result
33023330}
33033331
@@ -3684,7 +3712,9 @@ elem * elstruct(elem *e, goal_t goal)
36843712 }
36853713 }
36863714 else if (I32 && targ1 && targ2)
3715+ {
36873716 tym = TYllong;
3717+ }
36883718 assert (tym != TYstruct);
36893719 }
36903720 assert (tym != ~ 0 );
@@ -3772,6 +3802,8 @@ elem * elstruct(elem *e, goal_t goal)
37723802 break ;
37733803 }
37743804 }
3805+ // printf("elstruct return\n");
3806+ // elem_print(e);
37753807 return e;
37763808}
37773809
@@ -4071,13 +4103,6 @@ static if (0)
40714103
40724104 if (e1.Eoper == OPcomma)
40734105 return cgel_lvalue (e);
4074- version (MARS)
4075- {
4076- // No bit fields to deal with
4077- return e;
4078- }
4079- else
4080- {
40814106 if (e1.Eoper != OPbit)
40824107 return e;
40834108 if (e1.EV .E1 .Eoper == OPcomma || OTassign(e1.EV .E1 .Eoper))
@@ -4139,7 +4164,6 @@ else
41394164 el_free(e);
41404165 return optelem (eres,GOALvalue);
41414166}
4142- }
41434167
41444168/* *********************************
41454169 */
@@ -4186,8 +4210,7 @@ private elem * elopass(elem *e, goal_t goal)
41864210 { e = fixconvop(e);
41874211 return optelem (e,GOALvalue);
41884212 }
4189- version (SCPP) // have bit fields to worry about?
4190- {
4213+
41914214 goal_t wantres = goal;
41924215 if (e1.Eoper == OPbit)
41934216 {
@@ -4266,7 +4289,7 @@ version (SCPP) // have bit fields to worry about?
42664289 e = optelem(eres,GOALvalue);
42674290 return e;
42684291 }
4269- }
4292+
42704293 {
42714294 if (e1.Eoper == OPcomma || OTassign(e1.Eoper))
42724295 e = cgel_lvalue(e); // replace (e,v)op=e2 with e,(v op= e2)
@@ -5732,7 +5755,7 @@ private elem * optelem(elem *e, goal_t goal)
57325755beg:
57335756 // __gshared uint count;
57345757 // printf("count: %u\n", ++count);
5735- // { printf("xoptelem: %p ",e); WROP(e.Eoper); printf(" goal x%x\n", goal); }
5758+ // { printf("xoptelem: %p %s goal x%x\n",e, oper_str(e.Eoper) , goal); }
57365759 assert (e);
57375760 elem_debug(e);
57385761 assert (e.Ecount == 0 ); // no CSEs
@@ -6208,11 +6231,11 @@ beg:
62086231 }
62096232
62106233// if (debugb)
6211- // { print("optelem: %p ",e); WROP (op); print("\n" ); }
6234+ // { print("optelem: %p %s\n ",e, oper_str (op)); }
62126235
62136236 static if (0 )
62146237 {
6215- { print (" xoptelem: %p " ,e); WROP (e.Eoper); print ( " \n " ); }
6238+ printf (" xoptelem: %p %s \n " , e, oper_str (e.Eoper));
62166239 elem_print(e);
62176240 e = (* elxxx[op])(e, goal);
62186241 printf(" After:\n " );
0 commit comments