Rev 7693 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7693 | Rev 7696 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | Copyright (c) 2018, 2019, Anton Krotov |
4 | Copyright (c) 2018-2019, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
Line 6... | Line 6... | ||
6 | *) |
6 | *) |
Line 571... | Line 571... | ||
571 | BEGIN |
571 | BEGIN |
572 | ASSERT(REG.GetReg(R, eax)) |
572 | ASSERT(REG.GetReg(R, eax)) |
573 | END GetRegA; |
573 | END GetRegA; |
Line 574... | Line 574... | ||
574 | 574 | ||
575 | 575 | ||
576 | PROCEDURE translate (code: IL.CODES; pic: BOOLEAN; stroffs: INTEGER); |
576 | PROCEDURE translate (pic: BOOLEAN; stroffs: INTEGER); |
Line 577... | Line 577... | ||
577 | VAR |
577 | VAR |
Line 584... | Line 584... | ||
584 | opcode, param1, param2: INTEGER; |
584 | opcode, param1, param2: INTEGER; |
Line 585... | Line 585... | ||
585 | 585 | ||
Line 586... | Line 586... | ||
586 | float: REAL; |
586 | float: REAL; |
587 | 587 | ||
Line 588... | Line 588... | ||
588 | BEGIN |
588 | BEGIN |
Line 589... | Line 589... | ||
589 | cmd := code.commands.first(COMMAND); |
589 | cmd := IL.codes.commands.first(COMMAND); |
590 | 590 | ||
Line 1184... | Line 1184... | ||
1184 | OutByte2(8BH, reg1 * 9); // mov reg1, dword[reg1] |
1184 | OutByte2(8BH, reg1 * 9); // mov reg1, dword[reg1] |
1185 | OutByte2(89H, reg1 * 8 + reg2) // mov dword[reg2], reg1 |
1185 | OutByte2(89H, reg1 * 8 + reg2) // mov dword[reg2], reg1 |
Line 1186... | Line 1186... | ||
1186 | 1186 | ||
1187 | |8: |
1187 | |8: |
1188 | PushAll(0); |
- | |
1189 | push(reg2); |
1188 | PushAll(0); |
- | 1189 | push(reg1); |
|
1190 | push(reg1); |
1190 | push(reg2); |
1191 | pushc(8); |
1191 | pushc(8); |
Line 1192... | Line 1192... | ||
1192 | CallRTL(pic, IL._move) |
1192 | CallRTL(pic, IL._move) |
Line 1193... | Line 1193... | ||
1193 | 1193 | ||
1194 | END |
1194 | END |
1195 | - | ||
1196 | |IL.opSAVES: |
1195 | |
1197 | UnOp(reg1); |
- | |
Line 1198... | Line 1196... | ||
1198 | drop; |
1196 | |IL.opSAVES: |
- | 1197 | UnOp(reg2); |
|
1199 | PushAll(0); |
1198 | REG.PushAll_1(R); |
1200 | push(reg1); |
1199 | |
- | 1200 | IF pic THEN |
|
1201 | 1201 | reg1 := GetAnyReg(); |
|
1202 | IF pic THEN |
1202 | Pic(reg1, BIN.PICDATA, stroffs + param2); |
1203 | Pic(reg1, BIN.PICDATA, stroffs + param2); |
1203 | push(reg1); |
1204 | push(reg1) |
1204 | drop |
Line -... | Line 1205... | ||
- | 1205 | ELSE |
|
- | 1206 | OutByte(068H); // push _data + stroffs + param2 |
|
1205 | ELSE |
1207 | Reloc(BIN.RDATA, stroffs + param2); |
1206 | OutByte(068H); // push _data + stroffs + param2 |
1208 | END; |
Line 1207... | Line 1209... | ||
1207 | Reloc(BIN.RDATA, stroffs + param2); |
1209 | |
1208 | END; |
1210 | push(reg2); |
Line 1456... | Line 1458... | ||
1456 | pushc(param2); |
1458 | pushc(param2); |
1457 | CallRTL(pic, IL._set); |
1459 | CallRTL(pic, IL._set); |
1458 | GetRegA |
1460 | GetRegA |
Line 1459... | Line 1461... | ||
1459 | 1461 | ||
- | 1462 | |IL.opRSETL: |
|
1460 | |IL.opRSETL: |
1463 | UnOp(reg1); |
1461 | PushAll(1); |
1464 | REG.PushAll_1(R); |
- | 1465 | pushc(param2); |
|
- | 1466 | push(reg1); |
|
1462 | pushc(param2); |
1467 | drop; |
1463 | CallRTL(pic, IL._set2); |
1468 | CallRTL(pic, IL._set); |
Line 1464... | Line 1469... | ||
1464 | GetRegA |
1469 | GetRegA |
1465 | - | ||
1466 | |IL.opRSET1: |
1470 | |
1467 | UnOp(reg1); |
- | |
1468 | PushAll(1); |
1471 | |IL.opRSET1: |
1469 | push(reg1); |
1472 | PushAll(1); |
Line 1470... | Line 1473... | ||
1470 | CallRTL(pic, IL._set); |
1473 | CallRTL(pic, IL._set1); |
1471 | GetRegA |
1474 | GetRegA |
1472 | 1475 | ||
Line 1495... | Line 1498... | ||
1495 | OutByte3(0FH, 0BAH, 30H + reg1); OutByte(param2); //btr dword[reg1],param2 |
1498 | OutByte3(0FH, 0BAH, 30H + reg1); OutByte(param2); //btr dword[reg1],param2 |
1496 | drop |
1499 | drop |
Line 1497... | Line 1500... | ||
1497 | 1500 | ||
1498 | |IL.opDIV: |
1501 | |IL.opDIV: |
1499 | PushAll(2); |
1502 | PushAll(2); |
1500 | CallRTL(pic, IL._div); |
1503 | CallRTL(pic, IL._divmod); |
Line 1501... | Line 1504... | ||
1501 | GetRegA |
1504 | GetRegA |
1502 | 1505 | ||
1503 | |IL.opDIVR: |
1506 | |IL.opDIVR: |
Line 1538... | Line 1541... | ||
1538 | END |
1541 | END |
Line 1539... | Line 1542... | ||
1539 | 1542 | ||
1540 | ELSE |
1543 | ELSE |
1541 | PushAll(1); |
1544 | PushAll(1); |
1542 | pushc(param2); |
1545 | pushc(param2); |
1543 | CallRTL(pic, IL._div); |
1546 | CallRTL(pic, IL._divmod); |
1544 | GetRegA |
1547 | GetRegA |
1545 | END |
1548 | END |
Line 1546... | Line 1549... | ||
1546 | END |
1549 | END |
- | 1550 | ||
1547 | 1551 | |IL.opDIVL: |
|
1548 | |IL.opDIVL: |
1552 | UnOp(reg1); |
- | 1553 | REG.PushAll_1(R); |
|
- | 1554 | pushc(param2); |
|
1549 | PushAll(1); |
1555 | push(reg1); |
1550 | pushc(param2); |
1556 | drop; |
Line 1551... | Line 1557... | ||
1551 | CallRTL(pic, IL._div2); |
1557 | CallRTL(pic, IL._divmod); |
1552 | GetRegA |
1558 | GetRegA |
1553 | 1559 | ||
- | 1560 | |IL.opMOD: |
|
1554 | |IL.opMOD: |
1561 | PushAll(2); |
Line 1555... | Line 1562... | ||
1555 | PushAll(2); |
1562 | CallRTL(pic, IL._divmod); |
1556 | CallRTL(pic, IL._mod); |
1563 | mov(eax, edx); |
1557 | GetRegA |
1564 | GetRegA |
Line 1587... | Line 1594... | ||
1587 | END |
1594 | END |
Line 1588... | Line 1595... | ||
1588 | 1595 | ||
1589 | ELSE |
1596 | ELSE |
1590 | PushAll(1); |
1597 | PushAll(1); |
1591 | pushc(param2); |
1598 | pushc(param2); |
- | 1599 | CallRTL(pic, IL._divmod); |
|
1592 | CallRTL(pic, IL._mod); |
1600 | mov(eax, edx); |
1593 | GetRegA |
1601 | GetRegA |
1594 | END |
1602 | END |
Line 1595... | Line 1603... | ||
1595 | END |
1603 | END |
- | 1604 | ||
1596 | 1605 | |IL.opMODL: |
|
1597 | |IL.opMODL: |
1606 | UnOp(reg1); |
- | 1607 | REG.PushAll_1(R); |
|
- | 1608 | pushc(param2); |
|
1598 | PushAll(1); |
1609 | push(reg1); |
- | 1610 | drop; |
|
1599 | pushc(param2); |
1611 | CallRTL(pic, IL._divmod); |
Line 1600... | Line 1612... | ||
1600 | CallRTL(pic, IL._mod2); |
1612 | mov(eax, edx); |
1601 | GetRegA |
1613 | GetRegA |
Line 1611... | Line 1623... | ||
1611 | // @@: |
1623 | // @@: |
Line 1612... | Line 1624... | ||
1612 | 1624 | ||
1613 | |IL.opCOPY: |
1625 | |IL.opCOPY: |
1614 | PushAll(2); |
1626 | PushAll(2); |
1615 | pushc(param2); |
1627 | pushc(param2); |
Line 1616... | Line 1628... | ||
1616 | CallRTL(pic, IL._move2) |
1628 | CallRTL(pic, IL._move) |
1617 | 1629 | ||
1618 | |IL.opMOVE: |
1630 | |IL.opMOVE: |
Line 1619... | Line 1631... | ||
1619 | PushAll(3); |
1631 | PushAll(3); |
1620 | CallRTL(pic, IL._move2) |
1632 | CallRTL(pic, IL._move) |
1621 | 1633 | ||
1622 | |IL.opCOPYA: |
1634 | |IL.opCOPYA: |
Line 2073... | Line 2085... | ||
2073 | ASSERT(R.top = -1) |
2085 | ASSERT(R.top = -1) |
Line 2074... | Line 2086... | ||
2074 | 2086 | ||
Line 2075... | Line 2087... | ||
2075 | END translate; |
2087 | END translate; |
2076 | 2088 | ||
2077 | 2089 | ||
Line 2078... | Line 2090... | ||
2078 | PROCEDURE prolog (code: IL.CODES; pic: BOOLEAN; target, stack, dllinit, dllret: INTEGER); |
2090 | PROCEDURE prolog (pic: BOOLEAN; target, stack, dllinit, dllret: INTEGER); |
Line 2079... | Line 2091... | ||
2079 | VAR |
2091 | VAR |
2080 | reg1, entry, dcount: INTEGER; |
2092 | reg1, entry, L, dcount: INTEGER; |
Line 2129... | Line 2141... | ||
2129 | ELSE |
2141 | ELSE |
2130 | OutByte(68H); // push _data |
2142 | OutByte(68H); // push _data |
2131 | Reloc(BIN.RDATA, 0) |
2143 | Reloc(BIN.RDATA, 0) |
2132 | END; |
2144 | END; |
Line 2133... | Line 2145... | ||
2133 | 2145 | ||
Line 2134... | Line 2146... | ||
2134 | dcount := CHL.Length(code.data); |
2146 | dcount := CHL.Length(IL.codes.data); |
Line 2135... | Line 2147... | ||
2135 | 2147 | ||
2136 | pushc(tcount); |
2148 | pushc(tcount); |
Line 2143... | Line 2155... | ||
2143 | ELSE |
2155 | ELSE |
2144 | OutByte(68H); // push _data |
2156 | OutByte(68H); // push _data |
2145 | Reloc(BIN.RDATA, tcount * 4 + dcount) |
2157 | Reloc(BIN.RDATA, tcount * 4 + dcount) |
2146 | END; |
2158 | END; |
Line 2147... | Line 2159... | ||
2147 | 2159 | ||
- | 2160 | CallRTL(pic, IL._init); |
|
- | 2161 | ||
- | 2162 | IF target = mConst.Target_iELF32 THEN |
|
- | 2163 | L := NewLabel(); |
|
- | 2164 | pushc(0); |
|
- | 2165 | push(esp); |
|
- | 2166 | pushc(1024 * 1024 * stack); |
|
- | 2167 | pushc(0); |
|
- | 2168 | CallRTL(pic, IL._new); |
|
- | 2169 | pop(eax); |
|
- | 2170 | test(eax); |
|
- | 2171 | jcc(je, L); |
|
- | 2172 | addrc(eax, 1024 * 1024 * stack - 4); |
|
- | 2173 | mov(esp, eax); |
|
- | 2174 | SetLabel(L) |
|
2148 | CallRTL(pic, IL._init) |
2175 | END |
Line 2149... | Line 2176... | ||
2149 | END prolog; |
2176 | END prolog; |
2150 | 2177 | ||
2151 | 2178 | ||
2152 | PROCEDURE epilog (code: IL.CODES; pic: BOOLEAN; modname: ARRAY OF CHAR; target, stack, ver, dllinit, dllret, sofinit: INTEGER); |
2179 | PROCEDURE epilog (pic: BOOLEAN; modname: ARRAY OF CHAR; target, stack, ver, dllinit, dllret, sofinit: INTEGER); |
Line 2153... | Line 2180... | ||
2153 | VAR |
2180 | VAR |
Line 2198... | Line 2225... | ||
2198 | OutByte(0C3H) // ret |
2225 | OutByte(0C3H) // ret |
2199 | END; |
2226 | END; |
Line 2200... | Line 2227... | ||
2200 | 2227 | ||
Line 2201... | Line 2228... | ||
2201 | fixup; |
2228 | fixup; |
Line 2202... | Line 2229... | ||
2202 | 2229 | ||
2203 | dcount := CHL.Length(code.data); |
2230 | dcount := CHL.Length(IL.codes.data); |
2204 | 2231 | ||
Line 2205... | Line 2232... | ||
2205 | FOR i := 0 TO tcount - 1 DO |
2232 | FOR i := 0 TO tcount - 1 DO |
2206 | BIN.PutData32LE(program, CHL.GetInt(code.types, i)) |
2233 | BIN.PutData32LE(program, CHL.GetInt(IL.codes.types, i)) |
2207 | END; |
2234 | END; |
Line 2208... | Line 2235... | ||
2208 | 2235 | ||
Line 2209... | Line 2236... | ||
2209 | FOR i := 0 TO dcount - 1 DO |
2236 | FOR i := 0 TO dcount - 1 DO |
Line 2219... | Line 2246... | ||
2219 | 2246 | ||
2220 | IF target = mConst.Target_iObject THEN |
2247 | IF target = mConst.Target_iObject THEN |
2221 | BIN.Export(program, "lib_init", dllinit); |
2248 | BIN.Export(program, "lib_init", dllinit); |
Line 2222... | Line 2249... | ||
2222 | END; |
2249 | END; |
2223 | 2250 | ||
2224 | exp := code.export.first(IL.EXPORT_PROC); |
2251 | exp := IL.codes.export.first(IL.EXPORT_PROC); |
2225 | WHILE exp # NIL DO |
2252 | WHILE exp # NIL DO |
2226 | BIN.Export(program, exp.name, exp.label); |
2253 | BIN.Export(program, exp.name, exp.label); |
Line 2227... | Line 2254... | ||
2227 | exp := exp.next(IL.EXPORT_PROC) |
2254 | exp := exp.next(IL.EXPORT_PROC) |
Line 2228... | Line 2255... | ||
2228 | END; |
2255 | END; |
Line 2229... | Line 2256... | ||
2229 | 2256 | ||
Line 2230... | Line 2257... | ||
2230 | import(code.import); |
2257 | import(IL.codes.import); |
Line 2231... | Line 2258... | ||
2231 | 2258 | ||
2232 | code.bss := MAX(code.bss, MAX(code.dmin - CHL.Length(code.data), 4)); |
2259 | IL.set_bss(MAX(IL.codes.bss, MAX(IL.codes.dmin - CHL.Length(IL.codes.data), 4))); |
2233 | 2260 | ||
2234 | BIN.SetParams(program, code.bss, stack * (1024 * 1024), WCHR(ver DIV 65536), WCHR(ver MOD 65536)); |
2261 | BIN.SetParams(program, IL.codes.bss, stack * (1024 * 1024), WCHR(ver DIV 65536), WCHR(ver MOD 65536)); |
Line 2235... | Line 2262... | ||
2235 | 2262 | ||
2236 | END epilog; |
2263 | END epilog; |
Line 2237... | Line 2264... | ||
2237 | 2264 | ||
2238 | 2265 | ||
Line 2239... | Line 2266... | ||
2239 | PROCEDURE CodeGen* (code: IL.CODES; outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS); |
2266 | PROCEDURE CodeGen* (outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS); |
Line 2240... | Line 2267... | ||
2240 | VAR |
2267 | VAR |
2241 | dllret, dllinit, sofinit: INTEGER; |
2268 | dllret, dllinit, sofinit: INTEGER; |
2242 | opt: PROG.OPTIONS; |
2269 | opt: PROG.OPTIONS; |
Line 2261... | Line 2288... | ||
2261 | opt.pic := TRUE |
2288 | opt.pic := TRUE |
2262 | END; |
2289 | END; |
Line 2263... | Line 2290... | ||
2263 | 2290 | ||
Line 2264... | Line 2291... | ||
2264 | REG.Init(R, push, pop, mov, xchg, NIL, NIL, {eax, ecx, edx}, {}); |
2291 | REG.Init(R, push, pop, mov, xchg, NIL, NIL, {eax, ecx, edx}, {}); |
2265 | 2292 | ||
2266 | prolog(code, opt.pic, target, opt.stack, dllinit, dllret); |
2293 | prolog(opt.pic, target, opt.stack, dllinit, dllret); |
Line 2267... | Line 2294... | ||
2267 | translate(code, opt.pic, tcount * 4); |
2294 | translate(opt.pic, tcount * 4); |
Line 2268... | Line 2295... | ||
2268 | epilog(code, opt.pic, outname, target, opt.stack, opt.version, dllinit, dllret, sofinit); |
2295 | epilog(opt.pic, outname, target, opt.stack, opt.version, dllinit, dllret, sofinit); |
2269 | 2296 | ||
2270 | BIN.fixup(program); |
2297 | BIN.fixup(program); |
2271 | 2298 | ||
2272 | IF target IN {mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL} THEN |
2299 | IF target IN {mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL} THEN |
2273 | PE32.write(program, outname, opt.base, target = mConst.Target_iConsole, target = mConst.Target_iDLL, FALSE) |
2300 | PE32.write(program, outname, target = mConst.Target_iConsole, target = mConst.Target_iDLL, FALSE) |
2274 | ELSIF target = mConst.Target_iKolibri THEN |
2301 | ELSIF target = mConst.Target_iKolibri THEN |