Changeset 807
- Timestamp:
- 12/14/10 10:19:40 (14 years ago)
- Files:
-
- branches/dmd-1.x/src/backend/cod4.c (modified) (2 diffs)
- branches/dmd-1.x/src/backend/el.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/el.h (modified) (1 diff)
- trunk/src/backend/cod4.c (modified) (2 diffs)
- trunk/src/backend/el.c (modified) (1 diff)
- trunk/src/backend/el.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/backend/cod4.c
r805 r807 724 724 c = gen1(c,0x48 + reg); // DEC reg 725 725 else 726 726 { 727 727 c = genc2(c,0x81,modregrm(3,0,reg),postinc); 728 728 } 729 729 } 730 730 } 731 731 freenode(e1); 732 732 return c; 733 733 } 734 734 735 735 736 736 /************************ 737 737 * Generate code for += -= &= |= ^= negass 738 738 */ 739 739 740 740 code *cdaddass(elem *e,regm_t *pretregs) 741 741 { regm_t retregs,forccs,forregs; 742 742 tym_t tyml; 743 743 unsigned reg,op,op1,op2,mode,wantres; 744 targ_long val;745 744 int byte; 746 745 code *cl,*cr,*c,*ce,cs; 747 746 elem *e1; 748 747 elem *e2; 749 748 unsigned opsize; 750 749 unsigned reverse; 751 750 int sz; 752 751 regm_t varregm; 753 752 unsigned varreg; 754 753 unsigned cflags; 755 754 756 755 //printf("cdaddass(e=%p, *pretregs = x%x)\n",e,*pretregs); 757 756 op = e->Eoper; 758 757 retregs = 0; 759 758 reverse = 0; 760 759 e1 = e->E1; 761 760 tyml = tybasic(e1->Ety); // type of lvalue 762 761 sz = tysize[tyml]; 763 762 byte = (sz == 1); // 1 for byte operation, else 0 764 763 if (tyfloating(tyml)) … … 838 837 cs.Iop = 0x81; 839 838 getlvalue_msw(&cs); 840 839 cs.IFL2 = FLconst; 841 840 cs.IEV2.Vuns = 0; 842 841 gen(c,&cs); // SBB EA+2,0 843 842 break; 844 843 845 844 case LLONGSIZE: 846 845 if (I16) 847 846 assert(0); // not implemented yet 848 847 goto neg_2reg; 849 848 850 849 default: 851 850 assert(0); 852 851 } 853 852 c = cat3(cl,cr,c); 854 853 forccs = 0; // flags already set by NEG 855 854 *pretregs &= ~mPSW; 856 855 } 857 856 else if ((e2 = e->E2)->Eoper == OPconst && // if rvalue is a const 857 el_signx32(e2) && 858 858 // Don't evaluate e2 in register if we can use an INC or DEC 859 859 (((sz <= REGSIZE || tyfv(tyml)) && 860 860 (op == OPaddass || op == OPminass) && 861 ( (val = el_tolong(e2)) == 1 || val == -1)861 (el_allbits(e2, 1) || el_allbits(e2, -1)) 862 862 ) || 863 863 (!evalinregister(e2) && tyml != TYhptr) 864 864 ) 865 865 ) 866 866 { 867 867 cl = getlvalue(&cs,e1,0); 868 868 cl = cat(cl,modEA(&cs)); 869 869 cs.IFL2 = FLconst; 870 870 cs.IEV2.Vint = e2->EV.Vint; 871 871 if (sz <= REGSIZE || tyfv(tyml) || opsize) 872 872 { 873 targ_ size_t i = cs.IEV2.Vsize_t;873 targ_int i = cs.IEV2.Vint; 874 874 875 875 /* Handle shortcuts. Watch out for if result has */ 876 876 /* to be in flags. */ 877 877 878 878 if (reghasvalue(ALLREGS,i,®) && i != 1 && i != -1 && 879 879 !opsize) 880 880 { 881 881 cs.Iop = op1; 882 882 cs.Irm |= modregrm(0,reg,0); 883 883 } 884 884 else 885 885 { 886 886 cs.Iop = 0x81; 887 887 cs.Irm |= modregrm(0,mode,0); 888 888 switch (op) 889 889 { case OPminass: /* convert to += */ 890 890 cs.Irm ^= modregrm(0,5,0); 891 891 i = -i; 892 892 cs.IEV2.Vsize_t = i; 893 893 /* FALL-THROUGH */ branches/dmd-1.x/src/backend/el.c
r790 r807 3011 3011 value = e->EV.Vullong; 3012 3012 switch (tysize(e->Ety)) 3013 3013 { 3014 3014 case 1: value = (signed char) value; 3015 3015 break; 3016 3016 case 2: value = (short) value; 3017 3017 break; 3018 3018 case 4: value = (int) value; 3019 3019 break; 3020 3020 case 8: break; 3021 3021 default: 3022 3022 assert(0); 3023 3023 } 3024 3024 if (bit == -1) 3025 3025 value++; 3026 3026 else if (bit == 1) 3027 3027 value--; 3028 3028 return value == 0; 3029 3029 } 3030 3030 3031 /******************************************** 3032 * Determine if constant e is a 32 bit or less value, or is a 32 bit value sign extended to 64 bits. 3033 */ 3034 3035 int el_signx32(elem *e) 3036 { 3037 elem_debug(e); 3038 assert(e->Eoper == OPconst); 3039 if (tysize(e->Ety) == 8) 3040 { 3041 if (e->EV.Vullong != (int)e->EV.Vullong) 3042 return FALSE; 3043 } 3044 return TRUE; 3045 } 3046 3031 3047 /****************************** 3032 3048 * Extract long double value from constant elem. 3033 3049 * Silently ignore types which are not floating point values. 3034 3050 */ 3035 3051 3036 3052 targ_ldouble el_toldouble(elem *e) 3037 3053 { targ_ldouble result; 3038 3054 3039 3055 elem_debug(e); 3040 3056 assert(cnst(e)); 3041 3057 #if TX86 3042 3058 switch (tybasic(typemask(e))) 3043 3059 { 3044 3060 case TYfloat: 3045 3061 case TYifloat: 3046 3062 result = e->EV.Vfloat; 3047 3063 break; 3048 3064 case TYdouble: 3049 3065 case TYidouble: 3050 3066 case TYdouble_alias: branches/dmd-1.x/src/backend/el.h
r792 r807 166 166 #define el_copy(to,from) {*(to) = *(from);} 167 167 #endif 168 168 elem_p el_alloctmp(tym_t); 169 169 elem_p el_selecte1(elem_p); 170 170 elem_p el_selecte2(elem_p); 171 171 elem_p el_copytree(elem_p); 172 172 void el_replace_sym(elem *e,symbol *s1,symbol *s2); 173 173 elem_p el_scancommas(elem_p); 174 174 int el_sideeffect(elem_p); 175 175 #if TX86 176 176 int el_depends(elem *ea,elem *eb); 177 177 #endif 178 178 #if LONGLONG 179 179 targ_llong el_tolongt(elem_p); 180 180 targ_llong el_tolong(elem_p); 181 181 #else 182 182 targ_long el_tolongt(elem_p); 183 183 targ_long el_tolong(elem_p); 184 184 #endif 185 185 int el_allbits(elem_p,int); 186 int el_signx32(elem_p); 186 187 targ_ldouble el_toldouble(elem_p); 187 188 void el_toconst(elem_p); 188 189 elem_p el_same(elem_p *); 189 190 int el_match(elem_p ,elem_p); 190 191 int el_match2(elem_p ,elem_p); 191 192 int el_match3(elem_p ,elem_p); 192 193 int el_match4(elem_p ,elem_p); 193 194 194 195 int el_appears(elem *e,symbol *s); 195 196 Symbol *el_basesym(elem *e); 196 197 int el_anydef(elem *ed, elem *e); 197 198 elem_p el_bint(unsigned,type *,elem_p ,elem_p); 198 199 elem_p el_unat(unsigned,type *,elem_p); 199 200 elem_p el_bin(unsigned,tym_t,elem_p ,elem_p); 200 201 elem_p el_una(unsigned,tym_t,elem_p); 201 202 #if LONGLONG // DJB 202 203 elem_p el_longt(type *,targ_llong); 203 204 #else 204 205 elem_p el_longt(type *,targ_long); 205 206 #endif trunk/src/backend/cod4.c
r805 r807 724 724 c = gen1(c,0x48 + reg); // DEC reg 725 725 else 726 726 { 727 727 c = genc2(c,0x81,modregrm(3,0,reg),postinc); 728 728 } 729 729 } 730 730 } 731 731 freenode(e1); 732 732 return c; 733 733 } 734 734 735 735 736 736 /************************ 737 737 * Generate code for += -= &= |= ^= negass 738 738 */ 739 739 740 740 code *cdaddass(elem *e,regm_t *pretregs) 741 741 { regm_t retregs,forccs,forregs; 742 742 tym_t tyml; 743 743 unsigned reg,op,op1,op2,mode,wantres; 744 targ_long val;745 744 int byte; 746 745 code *cl,*cr,*c,*ce,cs; 747 746 elem *e1; 748 747 elem *e2; 749 748 unsigned opsize; 750 749 unsigned reverse; 751 750 int sz; 752 751 regm_t varregm; 753 752 unsigned varreg; 754 753 unsigned cflags; 755 754 756 755 //printf("cdaddass(e=%p, *pretregs = x%x)\n",e,*pretregs); 757 756 op = e->Eoper; 758 757 retregs = 0; 759 758 reverse = 0; 760 759 e1 = e->E1; 761 760 tyml = tybasic(e1->Ety); // type of lvalue 762 761 sz = tysize[tyml]; 763 762 byte = (sz == 1); // 1 for byte operation, else 0 764 763 if (tyfloating(tyml)) … … 838 837 cs.Iop = 0x81; 839 838 getlvalue_msw(&cs); 840 839 cs.IFL2 = FLconst; 841 840 cs.IEV2.Vuns = 0; 842 841 gen(c,&cs); // SBB EA+2,0 843 842 break; 844 843 845 844 case LLONGSIZE: 846 845 if (I16) 847 846 assert(0); // not implemented yet 848 847 goto neg_2reg; 849 848 850 849 default: 851 850 assert(0); 852 851 } 853 852 c = cat3(cl,cr,c); 854 853 forccs = 0; // flags already set by NEG 855 854 *pretregs &= ~mPSW; 856 855 } 857 856 else if ((e2 = e->E2)->Eoper == OPconst && // if rvalue is a const 857 el_signx32(e2) && 858 858 // Don't evaluate e2 in register if we can use an INC or DEC 859 859 (((sz <= REGSIZE || tyfv(tyml)) && 860 860 (op == OPaddass || op == OPminass) && 861 ( (val = el_tolong(e2)) == 1 || val == -1)861 (el_allbits(e2, 1) || el_allbits(e2, -1)) 862 862 ) || 863 863 (!evalinregister(e2) && tyml != TYhptr) 864 864 ) 865 865 ) 866 866 { 867 867 cl = getlvalue(&cs,e1,0); 868 868 cl = cat(cl,modEA(&cs)); 869 869 cs.IFL2 = FLconst; 870 870 cs.IEV2.Vint = e2->EV.Vint; 871 871 if (sz <= REGSIZE || tyfv(tyml) || opsize) 872 872 { 873 targ_ size_t i = cs.IEV2.Vsize_t;873 targ_int i = cs.IEV2.Vint; 874 874 875 875 /* Handle shortcuts. Watch out for if result has */ 876 876 /* to be in flags. */ 877 877 878 878 if (reghasvalue(ALLREGS,i,®) && i != 1 && i != -1 && 879 879 !opsize) 880 880 { 881 881 cs.Iop = op1; 882 882 cs.Irm |= modregrm(0,reg,0); 883 883 } 884 884 else 885 885 { 886 886 cs.Iop = 0x81; 887 887 cs.Irm |= modregrm(0,mode,0); 888 888 switch (op) 889 889 { case OPminass: /* convert to += */ 890 890 cs.Irm ^= modregrm(0,5,0); 891 891 i = -i; 892 892 cs.IEV2.Vsize_t = i; 893 893 /* FALL-THROUGH */ trunk/src/backend/el.c
r790 r807 3011 3011 value = e->EV.Vullong; 3012 3012 switch (tysize(e->Ety)) 3013 3013 { 3014 3014 case 1: value = (signed char) value; 3015 3015 break; 3016 3016 case 2: value = (short) value; 3017 3017 break; 3018 3018 case 4: value = (int) value; 3019 3019 break; 3020 3020 case 8: break; 3021 3021 default: 3022 3022 assert(0); 3023 3023 } 3024 3024 if (bit == -1) 3025 3025 value++; 3026 3026 else if (bit == 1) 3027 3027 value--; 3028 3028 return value == 0; 3029 3029 } 3030 3030 3031 /******************************************** 3032 * Determine if constant e is a 32 bit or less value, or is a 32 bit value sign extended to 64 bits. 3033 */ 3034 3035 int el_signx32(elem *e) 3036 { 3037 elem_debug(e); 3038 assert(e->Eoper == OPconst); 3039 if (tysize(e->Ety) == 8) 3040 { 3041 if (e->EV.Vullong != (int)e->EV.Vullong) 3042 return FALSE; 3043 } 3044 return TRUE; 3045 } 3046 3031 3047 /****************************** 3032 3048 * Extract long double value from constant elem. 3033 3049 * Silently ignore types which are not floating point values. 3034 3050 */ 3035 3051 3036 3052 targ_ldouble el_toldouble(elem *e) 3037 3053 { targ_ldouble result; 3038 3054 3039 3055 elem_debug(e); 3040 3056 assert(cnst(e)); 3041 3057 #if TX86 3042 3058 switch (tybasic(typemask(e))) 3043 3059 { 3044 3060 case TYfloat: 3045 3061 case TYifloat: 3046 3062 result = e->EV.Vfloat; 3047 3063 break; 3048 3064 case TYdouble: 3049 3065 case TYidouble: 3050 3066 case TYdouble_alias: trunk/src/backend/el.h
r792 r807 166 166 #define el_copy(to,from) {*(to) = *(from);} 167 167 #endif 168 168 elem_p el_alloctmp(tym_t); 169 169 elem_p el_selecte1(elem_p); 170 170 elem_p el_selecte2(elem_p); 171 171 elem_p el_copytree(elem_p); 172 172 void el_replace_sym(elem *e,symbol *s1,symbol *s2); 173 173 elem_p el_scancommas(elem_p); 174 174 int el_sideeffect(elem_p); 175 175 #if TX86 176 176 int el_depends(elem *ea,elem *eb); 177 177 #endif 178 178 #if LONGLONG 179 179 targ_llong el_tolongt(elem_p); 180 180 targ_llong el_tolong(elem_p); 181 181 #else 182 182 targ_long el_tolongt(elem_p); 183 183 targ_long el_tolong(elem_p); 184 184 #endif 185 185 int el_allbits(elem_p,int); 186 int el_signx32(elem_p); 186 187 targ_ldouble el_toldouble(elem_p); 187 188 void el_toconst(elem_p); 188 189 elem_p el_same(elem_p *); 189 190 int el_match(elem_p ,elem_p); 190 191 int el_match2(elem_p ,elem_p); 191 192 int el_match3(elem_p ,elem_p); 192 193 int el_match4(elem_p ,elem_p); 193 194 194 195 int el_appears(elem *e,symbol *s); 195 196 Symbol *el_basesym(elem *e); 196 197 int el_anydef(elem *ed, elem *e); 197 198 elem_p el_bint(unsigned,type *,elem_p ,elem_p); 198 199 elem_p el_unat(unsigned,type *,elem_p); 199 200 elem_p el_bin(unsigned,tym_t,elem_p ,elem_p); 200 201 elem_p el_una(unsigned,tym_t,elem_p); 201 202 #if LONGLONG // DJB 202 203 elem_p el_longt(type *,targ_llong); 203 204 #else 204 205 elem_p el_longt(type *,targ_long); 205 206 #endif
