Changeset 773
- Timestamp:
- 12/04/10 04:54:06 (14 years ago)
- Files:
-
- branches/dmd-1.x/src/backend/cgcod.c (modified) (3 diffs)
- branches/dmd-1.x/src/backend/cgelem.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/debug.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/el.c (modified) (1 diff)
- trunk/src/backend/cgcod.c (modified) (3 diffs)
- trunk/src/backend/cgelem.c (modified) (1 diff)
- trunk/src/backend/debug.c (modified) (1 diff)
- trunk/src/backend/el.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/backend/cgcod.c
r768 r773 1639 1639 #endif 1640 1640 int i = 0; 1641 1641 while (1) 1642 1642 { 1643 1643 if (!(regm & 0xF)) 1644 1644 { 1645 1645 regm >>= 4; 1646 1646 i += 4; 1647 1647 if (!regm) 1648 1648 break; 1649 1649 } 1650 1650 if (regm & 1) 1651 1651 return i; 1652 1652 regm >>= 1; 1653 1653 i++; 1654 1654 } 1655 1655 #ifdef DEBUG 1656 1656 printf("findreg(x%x, line=%d, file='%s')\n",regmsave,line,file); 1657 1657 fflush(stdout); 1658 1658 #endif 1659 *(char*)0=0; 1659 1660 assert(0); 1660 1661 return 0; 1661 1662 } 1662 1663 1663 1664 1664 1665 /*************** 1665 1666 * Free element (but not it's leaves! (assume they are already freed)) 1666 1667 * Don't decrement Ecount! This is so we can detect if the common subexp 1667 1668 * has already been evaluated. 1668 1669 * If common subexpression is not required anymore, eliminate 1669 1670 * references to it. 1670 1671 */ 1671 1672 1672 1673 void freenode(elem *e) 1673 1674 { unsigned i; 1674 1675 1675 1676 elem_debug(e); 1676 1677 //dbg_printf("freenode(%p) : comsub = %d, count = %d\n",e,e->Ecomsub,e->Ecount); 1677 1678 if (e->Ecomsub--) return; /* usage count */ 1678 1679 if (e->Ecount) /* if it was a CSE */ … … 1800 1801 */ 1801 1802 1802 1803 #undef allocreg 1803 1804 1804 1805 code *allocreg(regm_t *pretregs,unsigned *preg,tym_t tym 1805 1806 #ifdef DEBUG 1806 1807 ,int line,const char *file 1807 1808 #endif 1808 1809 ) 1809 1810 #ifdef DEBUG 1810 1811 #define allocreg(a,b,c) allocreg((a),(b),(c),__LINE__,__FILE__) 1811 1812 #endif 1812 1813 { regm_t r,s; 1813 1814 regm_t retregs; 1814 1815 unsigned reg; 1815 1816 unsigned msreg,lsreg; 1816 1817 int count; 1817 1818 unsigned size; 1818 1819 1819 1820 #if 0 1820 //if (pass == PASSfinal)1821 if (pass == PASSfinal) 1821 1822 { dbg_printf("allocreg %s,%d: regcon.mvar %s regcon.cse.mval %s msavereg %s *pretregs %s tym ", 1822 1823 file,line,regm_str(regcon.mvar),regm_str(regcon.cse.mval), 1823 1824 regm_str(msavereg),regm_str(*pretregs)); 1824 1825 WRTYxx(tym); 1825 1826 dbg_printf("\n"); 1826 1827 } 1827 1828 #endif 1828 1829 tym = tybasic(tym); 1829 1830 size = tysize[tym]; 1830 1831 *pretregs &= mES | allregs | XMMREGS; 1831 1832 retregs = *pretregs; 1832 1833 if ((retregs & regcon.mvar) == retregs) // if exactly in reg vars 1833 1834 { 1834 1835 if (size <= REGSIZE) 1835 1836 { *preg = findreg(retregs); 1836 1837 assert(retregs == mask[*preg]); /* no more bits are set */ 1837 1838 } 1838 1839 else if (size <= 2 * REGSIZE) 1839 1840 { *preg = findregmsw(retregs); 1840 1841 assert(retregs & mLSW); … … 1909 1910 { retregs &= ~mBP; 1910 1911 goto L3; 1911 1912 } 1912 1913 1913 1914 if (r & mMSW) 1914 1915 { 1915 1916 if (r & mDX) 1916 1917 msreg = DX; /* prefer to use DX over CX */ 1917 1918 else 1918 1919 msreg = findregmsw(r); 1919 1920 r &= mLSW; /* see if there's an LSW also */ 1920 1921 if (r) 1921 1922 lsreg = findreg(r); 1922 1923 else if (lsreg == -1) /* if don't have LSW yet */ 1923 1924 { retregs &= mLSW; 1924 1925 goto L3; 1925 1926 } 1926 1927 } 1927 1928 else 1928 1929 { 1930 if (I64 && !(r & mLSW)) 1931 { retregs = *pretregs & (mMSW | mLSW); 1932 assert(retregs); 1933 goto L1; 1934 } 1929 1935 lsreg = findreglsw(r); 1930 1936 if (msreg == -1) 1931 1937 { retregs &= mMSW; 1932 1938 goto L3; 1933 1939 } 1934 1940 } 1935 1941 reg = (msreg == ES) ? lsreg : msreg; 1936 1942 retregs = mask[msreg] | mask[lsreg]; 1937 1943 } 1938 1944 else if (I16 && (tym == TYdouble || tym == TYdouble_alias)) 1939 1945 { 1940 1946 #ifdef DEBUG 1941 1947 if (retregs != DOUBLEREGS) 1942 1948 printf("retregs = x%x, *pretregs = x%x\n",retregs,*pretregs); 1943 1949 #endif 1944 1950 assert(retregs == DOUBLEREGS); 1945 1951 reg = AX; 1946 1952 } 1947 1953 else 1948 1954 { branches/dmd-1.x/src/backend/cgelem.c
r767 r773 2988 2988 (e2->E1->Eoper == OPvar || e2->E1->Eoper == OPind)) 2989 2989 { elem *es; 2990 2990 tym_t ty; 2991 2991 2992 2992 es = el_calloc(); 2993 2993 es->Eoper = OPconst; 2994 2994 switch (tysize(e2->Ety)) 2995 2995 { 2996 2996 case FLOATSIZE: 2997 2997 ty = TYlong; 2998 2998 es->EV.Vlong = 0x80000000; 2999 2999 break; 3000 3000 case DOUBLESIZE: 3001 3001 #if LONGLONG 3002 3002 if (I32) 3003 3003 { ty = TYllong; 3004 3004 es->EV.Vllong = 0x8000000000000000LL; 3005 3005 break; 3006 3006 } 3007 3007 #endif 3008 case LNGDBLSIZE:3008 default: 3009 3009 el_free(es); 3010 3010 goto L8; 3011 3011 } 3012 3012 es->Ety = ty; 3013 3013 e1->Ety = ty; 3014 3014 e2->Ety = ty; 3015 3015 e2->E1->Ety = ty; 3016 3016 e2->E2 = es; 3017 3017 e2->Eoper = OPxor; 3018 3018 return optelem(e,TRUE); 3019 3019 } 3020 3020 L8: ; 3021 3021 } 3022 3022 3023 3023 if (e1->Eoper == OPcomma) 3024 3024 return cgel_lvalue(e); 3025 3025 #if MARS 3026 3026 // No bit fields to deal with 3027 3027 return e; 3028 3028 #else branches/dmd-1.x/src/backend/debug.c
r728 r773 193 193 { nest++; 194 194 ferr("("); 195 195 WReqn(e->E2); 196 196 ferr(")"); 197 197 nest--; 198 198 } 199 199 else 200 200 WReqn(e->E2); 201 201 } 202 202 else 203 203 { 204 204 switch (e->Eoper) 205 205 { case OPconst: 206 206 switch (tybasic(e->Ety)) 207 207 { 208 208 case TYfloat: 209 209 dbg_printf("%g <float> ",e->EV.Vfloat); 210 210 break; 211 211 case TYdouble: 212 212 dbg_printf("%g ",e->EV.Vdouble); 213 break; 214 case TYldouble: 215 dbg_printf("%Lg ",e->EV.Vldouble); 213 216 break; 214 217 case TYcent: 215 218 case TYucent: 216 219 dbg_printf("%lld+%lld ", e->EV.Vcent.msw, e->EV.Vcent.lsw); 217 220 break; 218 221 default: 219 222 dbg_printf("%lld ",el_tolong(e)); 220 223 break; 221 224 } 222 225 break; 223 226 case OPrelconst: 224 227 ferr("#"); 225 228 /* FALL-THROUGH */ 226 229 case OPvar: 227 230 dbg_printf("%s",e->EV.sp.Vsym->Sident); 228 231 if (e->EV.sp.Vsym->Ssymnum != -1) 229 232 dbg_printf("(%d)",e->EV.sp.Vsym->Ssymnum); 230 233 if (e->Eoffset != 0) 231 234 dbg_printf(".%ld",(long)e->Eoffset); 232 235 break; branches/dmd-1.x/src/backend/el.c
r771 r773 3350 3350 #if TARGET_MAC 3351 3351 #if (TARGET_POWERPC) 3352 3352 if (config.flags & CFGldblisdbl) 3353 3353 dbg_printf("%gL ",e->EV.Vdouble); 3354 3354 else 3355 3355 #endif 3356 3356 #if !DDRT 3357 3357 dbg_printf("%LgL ",e->EV.Vldouble); 3358 3358 #else /* DDRT */ 3359 3359 { 3360 3360 static char buffer[75]; 3361 3361 __g_fmt(buffer, (DD)e->EV.Vldouble); 3362 3362 dbg_printf("%sL", buffer); 3363 3363 } 3364 3364 #endif /* DDRT */ 3365 3365 break; 3366 3366 case TYvptr: 3367 3367 dbg_printf("%ldL ",e->EV.Vlong); 3368 3368 break; 3369 3369 #else 3370 dbg_printf("% gL ",(double)e->EV.Vldouble);3370 dbg_printf("%Lg ", e->EV.Vldouble); 3371 3371 #endif 3372 3372 break; 3373 3373 3374 3374 case TYifloat: 3375 3375 dbg_printf("%gfi ", (double)e->EV.Vfloat); 3376 3376 break; 3377 3377 3378 3378 case TYidouble: 3379 3379 dbg_printf("%gi ", (double)e->EV.Vdouble); 3380 3380 break; 3381 3381 3382 3382 case TYildouble: 3383 3383 dbg_printf("%gLi ", (double)e->EV.Vldouble); 3384 3384 break; 3385 3385 3386 3386 case TYcfloat: 3387 3387 dbg_printf("%gf+%gfi ", (double)e->EV.Vcfloat.re, (double)e->EV.Vcfloat.im); 3388 3388 break; 3389 3389 3390 3390 case TYcdouble: trunk/src/backend/cgcod.c
r768 r773 1639 1639 #endif 1640 1640 int i = 0; 1641 1641 while (1) 1642 1642 { 1643 1643 if (!(regm & 0xF)) 1644 1644 { 1645 1645 regm >>= 4; 1646 1646 i += 4; 1647 1647 if (!regm) 1648 1648 break; 1649 1649 } 1650 1650 if (regm & 1) 1651 1651 return i; 1652 1652 regm >>= 1; 1653 1653 i++; 1654 1654 } 1655 1655 #ifdef DEBUG 1656 1656 printf("findreg(x%x, line=%d, file='%s')\n",regmsave,line,file); 1657 1657 fflush(stdout); 1658 1658 #endif 1659 *(char*)0=0; 1659 1660 assert(0); 1660 1661 return 0; 1661 1662 } 1662 1663 1663 1664 1664 1665 /*************** 1665 1666 * Free element (but not it's leaves! (assume they are already freed)) 1666 1667 * Don't decrement Ecount! This is so we can detect if the common subexp 1667 1668 * has already been evaluated. 1668 1669 * If common subexpression is not required anymore, eliminate 1669 1670 * references to it. 1670 1671 */ 1671 1672 1672 1673 void freenode(elem *e) 1673 1674 { unsigned i; 1674 1675 1675 1676 elem_debug(e); 1676 1677 //dbg_printf("freenode(%p) : comsub = %d, count = %d\n",e,e->Ecomsub,e->Ecount); 1677 1678 if (e->Ecomsub--) return; /* usage count */ 1678 1679 if (e->Ecount) /* if it was a CSE */ … … 1800 1801 */ 1801 1802 1802 1803 #undef allocreg 1803 1804 1804 1805 code *allocreg(regm_t *pretregs,unsigned *preg,tym_t tym 1805 1806 #ifdef DEBUG 1806 1807 ,int line,const char *file 1807 1808 #endif 1808 1809 ) 1809 1810 #ifdef DEBUG 1810 1811 #define allocreg(a,b,c) allocreg((a),(b),(c),__LINE__,__FILE__) 1811 1812 #endif 1812 1813 { regm_t r,s; 1813 1814 regm_t retregs; 1814 1815 unsigned reg; 1815 1816 unsigned msreg,lsreg; 1816 1817 int count; 1817 1818 unsigned size; 1818 1819 1819 1820 #if 0 1820 //if (pass == PASSfinal)1821 if (pass == PASSfinal) 1821 1822 { dbg_printf("allocreg %s,%d: regcon.mvar %s regcon.cse.mval %s msavereg %s *pretregs %s tym ", 1822 1823 file,line,regm_str(regcon.mvar),regm_str(regcon.cse.mval), 1823 1824 regm_str(msavereg),regm_str(*pretregs)); 1824 1825 WRTYxx(tym); 1825 1826 dbg_printf("\n"); 1826 1827 } 1827 1828 #endif 1828 1829 tym = tybasic(tym); 1829 1830 size = tysize[tym]; 1830 1831 *pretregs &= mES | allregs | XMMREGS; 1831 1832 retregs = *pretregs; 1832 1833 if ((retregs & regcon.mvar) == retregs) // if exactly in reg vars 1833 1834 { 1834 1835 if (size <= REGSIZE) 1835 1836 { *preg = findreg(retregs); 1836 1837 assert(retregs == mask[*preg]); /* no more bits are set */ 1837 1838 } 1838 1839 else if (size <= 2 * REGSIZE) 1839 1840 { *preg = findregmsw(retregs); 1840 1841 assert(retregs & mLSW); … … 1909 1910 { retregs &= ~mBP; 1910 1911 goto L3; 1911 1912 } 1912 1913 1913 1914 if (r & mMSW) 1914 1915 { 1915 1916 if (r & mDX) 1916 1917 msreg = DX; /* prefer to use DX over CX */ 1917 1918 else 1918 1919 msreg = findregmsw(r); 1919 1920 r &= mLSW; /* see if there's an LSW also */ 1920 1921 if (r) 1921 1922 lsreg = findreg(r); 1922 1923 else if (lsreg == -1) /* if don't have LSW yet */ 1923 1924 { retregs &= mLSW; 1924 1925 goto L3; 1925 1926 } 1926 1927 } 1927 1928 else 1928 1929 { 1930 if (I64 && !(r & mLSW)) 1931 { retregs = *pretregs & (mMSW | mLSW); 1932 assert(retregs); 1933 goto L1; 1934 } 1929 1935 lsreg = findreglsw(r); 1930 1936 if (msreg == -1) 1931 1937 { retregs &= mMSW; 1932 1938 goto L3; 1933 1939 } 1934 1940 } 1935 1941 reg = (msreg == ES) ? lsreg : msreg; 1936 1942 retregs = mask[msreg] | mask[lsreg]; 1937 1943 } 1938 1944 else if (I16 && (tym == TYdouble || tym == TYdouble_alias)) 1939 1945 { 1940 1946 #ifdef DEBUG 1941 1947 if (retregs != DOUBLEREGS) 1942 1948 printf("retregs = x%x, *pretregs = x%x\n",retregs,*pretregs); 1943 1949 #endif 1944 1950 assert(retregs == DOUBLEREGS); 1945 1951 reg = AX; 1946 1952 } 1947 1953 else 1948 1954 { trunk/src/backend/cgelem.c
r767 r773 2988 2988 (e2->E1->Eoper == OPvar || e2->E1->Eoper == OPind)) 2989 2989 { elem *es; 2990 2990 tym_t ty; 2991 2991 2992 2992 es = el_calloc(); 2993 2993 es->Eoper = OPconst; 2994 2994 switch (tysize(e2->Ety)) 2995 2995 { 2996 2996 case FLOATSIZE: 2997 2997 ty = TYlong; 2998 2998 es->EV.Vlong = 0x80000000; 2999 2999 break; 3000 3000 case DOUBLESIZE: 3001 3001 #if LONGLONG 3002 3002 if (I32) 3003 3003 { ty = TYllong; 3004 3004 es->EV.Vllong = 0x8000000000000000LL; 3005 3005 break; 3006 3006 } 3007 3007 #endif 3008 case LNGDBLSIZE:3008 default: 3009 3009 el_free(es); 3010 3010 goto L8; 3011 3011 } 3012 3012 es->Ety = ty; 3013 3013 e1->Ety = ty; 3014 3014 e2->Ety = ty; 3015 3015 e2->E1->Ety = ty; 3016 3016 e2->E2 = es; 3017 3017 e2->Eoper = OPxor; 3018 3018 return optelem(e,TRUE); 3019 3019 } 3020 3020 L8: ; 3021 3021 } 3022 3022 3023 3023 if (e1->Eoper == OPcomma) 3024 3024 return cgel_lvalue(e); 3025 3025 #if MARS 3026 3026 // No bit fields to deal with 3027 3027 return e; 3028 3028 #else trunk/src/backend/debug.c
r728 r773 193 193 { nest++; 194 194 ferr("("); 195 195 WReqn(e->E2); 196 196 ferr(")"); 197 197 nest--; 198 198 } 199 199 else 200 200 WReqn(e->E2); 201 201 } 202 202 else 203 203 { 204 204 switch (e->Eoper) 205 205 { case OPconst: 206 206 switch (tybasic(e->Ety)) 207 207 { 208 208 case TYfloat: 209 209 dbg_printf("%g <float> ",e->EV.Vfloat); 210 210 break; 211 211 case TYdouble: 212 212 dbg_printf("%g ",e->EV.Vdouble); 213 break; 214 case TYldouble: 215 dbg_printf("%Lg ",e->EV.Vldouble); 213 216 break; 214 217 case TYcent: 215 218 case TYucent: 216 219 dbg_printf("%lld+%lld ", e->EV.Vcent.msw, e->EV.Vcent.lsw); 217 220 break; 218 221 default: 219 222 dbg_printf("%lld ",el_tolong(e)); 220 223 break; 221 224 } 222 225 break; 223 226 case OPrelconst: 224 227 ferr("#"); 225 228 /* FALL-THROUGH */ 226 229 case OPvar: 227 230 dbg_printf("%s",e->EV.sp.Vsym->Sident); 228 231 if (e->EV.sp.Vsym->Ssymnum != -1) 229 232 dbg_printf("(%d)",e->EV.sp.Vsym->Ssymnum); 230 233 if (e->Eoffset != 0) 231 234 dbg_printf(".%ld",(long)e->Eoffset); 232 235 break; trunk/src/backend/el.c
r771 r773 3350 3350 #if TARGET_MAC 3351 3351 #if (TARGET_POWERPC) 3352 3352 if (config.flags & CFGldblisdbl) 3353 3353 dbg_printf("%gL ",e->EV.Vdouble); 3354 3354 else 3355 3355 #endif 3356 3356 #if !DDRT 3357 3357 dbg_printf("%LgL ",e->EV.Vldouble); 3358 3358 #else /* DDRT */ 3359 3359 { 3360 3360 static char buffer[75]; 3361 3361 __g_fmt(buffer, (DD)e->EV.Vldouble); 3362 3362 dbg_printf("%sL", buffer); 3363 3363 } 3364 3364 #endif /* DDRT */ 3365 3365 break; 3366 3366 case TYvptr: 3367 3367 dbg_printf("%ldL ",e->EV.Vlong); 3368 3368 break; 3369 3369 #else 3370 dbg_printf("% gL ",(double)e->EV.Vldouble);3370 dbg_printf("%Lg ", e->EV.Vldouble); 3371 3371 #endif 3372 3372 break; 3373 3373 3374 3374 case TYifloat: 3375 3375 dbg_printf("%gfi ", (double)e->EV.Vfloat); 3376 3376 break; 3377 3377 3378 3378 case TYidouble: 3379 3379 dbg_printf("%gi ", (double)e->EV.Vdouble); 3380 3380 break; 3381 3381 3382 3382 case TYildouble: 3383 3383 dbg_printf("%gLi ", (double)e->EV.Vldouble); 3384 3384 break; 3385 3385 3386 3386 case TYcfloat: 3387 3387 dbg_printf("%gf+%gfi ", (double)e->EV.Vcfloat.re, (double)e->EV.Vcfloat.im); 3388 3388 break; 3389 3389 3390 3390 case TYcdouble:
