Rev 9873 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 9873 | Rev 9893 | ||
---|---|---|---|
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-2022, Anton Krotov |
4 | Copyright (c) 2018-2023, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
Line 6... | Line 6... | ||
6 | *) |
6 | *) |
Line 952... | Line 952... | ||
952 | |IL.opONERR: |
952 | |IL.opONERR: |
953 | pushc(param2); |
953 | pushc(param2); |
954 | jmp(param1) |
954 | jmp(param1) |
Line 955... | Line 955... | ||
955 | 955 | ||
956 | |IL.opPARAM: |
- | |
957 | n := param2; |
956 | |IL.opPARAM: |
958 | IF n = 1 THEN |
957 | IF param2 = 1 THEN |
959 | UnOp(reg1); |
958 | UnOp(reg1); |
960 | push(reg1); |
959 | push(reg1); |
961 | drop |
960 | drop |
962 | ELSE |
961 | ELSE |
963 | ASSERT(R.top + 1 <= n); |
962 | ASSERT(R.top + 1 <= param2); |
964 | PushAll(n) |
963 | PushAll(param2) |
Line 965... | Line 964... | ||
965 | END |
964 | END |
966 | 965 | ||
967 | |IL.opCLEANUP: |
966 | |IL.opCLEANUP: |
Line 1436... | Line 1435... | ||
1436 | push(reg2); |
1435 | push(reg2); |
1437 | drop; |
1436 | drop; |
1438 | pushc(param1); |
1437 | pushc(param1); |
1439 | CallRTL(pic, IL._move) |
1438 | CallRTL(pic, IL._move) |
Line 1440... | Line -... | ||
1440 | - | ||
1441 | |IL.opCHKBYTE: |
- | |
1442 | BinOp(reg1, reg2); |
- | |
1443 | cmprc(reg1, 256); |
- | |
1444 | jcc(jb, param1) |
- | |
1445 | 1439 | ||
1446 | |IL.opCHKIDX: |
1440 | |IL.opCHKIDX: |
1447 | UnOp(reg1); |
1441 | UnOp(reg1); |
1448 | cmprc(reg1, param2); |
1442 | cmprc(reg1, param2); |
Line 1555... | Line 1549... | ||
1555 | |IL.opLENGTHW: |
1549 | |IL.opLENGTHW: |
1556 | PushAll(2); |
1550 | PushAll(2); |
1557 | CallRTL(pic, IL._lengthw); |
1551 | CallRTL(pic, IL._lengthw); |
1558 | GetRegA |
1552 | GetRegA |
Line 1559... | Line -... | ||
1559 | - | ||
1560 | |IL.opCHR: |
- | |
1561 | UnOp(reg1); |
- | |
1562 | andrc(reg1, 255) |
- | |
1563 | - | ||
1564 | |IL.opWCHR: |
- | |
1565 | UnOp(reg1); |
- | |
1566 | andrc(reg1, 65535) |
- | |
1567 | 1553 | ||
1568 | |IL.opASR, IL.opROR, IL.opLSL, IL.opLSR: |
1554 | |IL.opASR, IL.opROR, IL.opLSL, IL.opLSR: |
1569 | UnOp(reg1); |
1555 | UnOp(reg1); |
1570 | IF reg1 # ecx THEN |
1556 | IF reg1 # ecx THEN |
1571 | ASSERT(REG.GetReg(R, ecx)); |
1557 | ASSERT(REG.GetReg(R, ecx)); |
Line 1826... | Line 1812... | ||
1826 | pushc(param2); |
1812 | pushc(param2); |
1827 | CallRTL(pic, IL._rot) |
1813 | CallRTL(pic, IL._rot) |
Line 1828... | Line 1814... | ||
1828 | 1814 | ||
1829 | |IL.opNEW: |
1815 | |IL.opNEW: |
- | 1816 | PushAll(1); |
|
- | 1817 | CASE TARGETS.OS OF |
|
- | 1818 | |TARGETS.osWIN32: |
|
- | 1819 | n := param2 + 4; |
|
- | 1820 | ASSERT(UTILS.Align(n, 4)) |
|
- | 1821 | |TARGETS.osLINUX32: |
|
- | 1822 | n := param2 + 16; |
|
- | 1823 | ASSERT(UTILS.Align(n, 16)) |
|
1830 | PushAll(1); |
1824 | |TARGETS.osKOS: |
1831 | n := param2 + 8; |
1825 | n := param2 + 8; |
- | 1826 | ASSERT(UTILS.Align(n, 32)) |
|
1832 | ASSERT(UTILS.Align(n, 32)); |
1827 | END; |
1833 | pushc(n); |
1828 | pushc(n); |
1834 | pushc(param1); |
1829 | pushc(param1); |
Line 1835... | Line 1830... | ||
1835 | CallRTL(pic, IL._new) |
1830 | CallRTL(pic, IL._new) |
Line 2442... | Line 2437... | ||
2442 | 2437 | ||
2443 | BIN.SetParams(program, IL.codes.bss, stack * (1024 * 1024), WCHR(ver DIV 65536), WCHR(ver MOD 65536)) |
2438 | BIN.SetParams(program, IL.codes.bss, stack * (1024 * 1024), WCHR(ver DIV 65536), WCHR(ver MOD 65536)) |
Line -... | Line 2439... | ||
- | 2439 | END epilog; |
|
- | 2440 | ||
- | 2441 | ||
- | 2442 | PROCEDURE align16* (bit64: BOOLEAN); |
|
- | 2443 | BEGIN |
|
- | 2444 | IF TARGETS.WinLin THEN |
|
- | 2445 | WHILE CHL.Length(IL.codes.data) MOD 16 # 0 DO |
|
- | 2446 | CHL.PushByte(IL.codes.data, 0) |
|
- | 2447 | END; |
|
- | 2448 | WHILE CHL.Length(IL.codes.types) MOD (4 - 2*ORD(bit64)) # 0 DO |
|
- | 2449 | CHL.PushInt(IL.codes.types, 0) |
|
- | 2450 | END |
|
- | 2451 | END |
|
2444 | END epilog; |
2452 | END align16; |
2445 | 2453 | ||
2446 | 2454 | ||
2447 | PROCEDURE CodeGen* (outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS); |
2455 | PROCEDURE CodeGen* (outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS); |
Line 2448... | Line 2456... | ||
2448 | VAR |
2456 | VAR |
2449 | dllret, dllinit, sofinit: INTEGER; |
2457 | dllret, dllinit, sofinit: INTEGER; |
- | 2458 | opt: PROG.OPTIONS; |
|
2450 | opt: PROG.OPTIONS; |
2459 | |
Line 2451... | Line 2460... | ||
2451 | 2460 | BEGIN |
|
2452 | BEGIN |
2461 | FR[0] := 0; |
Line 2474... | Line 2483... | ||
2474 | dllinit := prolog(opt.pic, target, opt.stack, dllret); |
2483 | dllinit := prolog(opt.pic, target, opt.stack, dllret); |
2475 | translate(opt.pic, tcount * 4); |
2484 | translate(opt.pic, tcount * 4); |
2476 | epilog(opt.pic, outname, target, opt.stack, opt.version, dllinit, dllret, sofinit); |
2485 | epilog(opt.pic, outname, target, opt.stack, opt.version, dllinit, dllret, sofinit); |
Line 2477... | Line 2486... | ||
2477 | 2486 | ||
2478 | BIN.fixup(program); |
- | |
2479 | 2487 | BIN.fixup(program); |
|
2480 | IF TARGETS.OS = TARGETS.osWIN32 THEN |
2488 | IF TARGETS.OS = TARGETS.osWIN32 THEN |
2481 | PE32.write(program, outname, target = TARGETS.Win32C, target = TARGETS.Win32DLL, FALSE) |
2489 | PE32.write(program, outname, target = TARGETS.Win32C, target = TARGETS.Win32DLL, FALSE) |
2482 | ELSIF target = TARGETS.KolibriOS THEN |
2490 | ELSIF target = TARGETS.KolibriOS THEN |
2483 | KOS.write(program, outname) |
2491 | KOS.write(program, outname) |
2484 | ELSIF target = TARGETS.KolibriOSDLL THEN |
2492 | ELSIF target = TARGETS.KolibriOSDLL THEN |
2485 | MSCOFF.write(program, outname, opt.version) |
2493 | MSCOFF.write(program, outname, opt.version) |
2486 | ELSIF TARGETS.OS = TARGETS.osLINUX32 THEN |
2494 | ELSIF TARGETS.OS = TARGETS.osLINUX32 THEN |
2487 | ELF.write(program, outname, sofinit, target = TARGETS.Linux32SO, FALSE) |
2495 | ELF.write(program, outname, sofinit, target = TARGETS.Linux32SO, FALSE) |
2488 | END |
- | |
2489 | 2496 | END |
|
Line 2490... | Line 2497... | ||
2490 | END CodeGen; |
2497 | END CodeGen; |
2491 | 2498 |