Subversion Repositories Kolibri OS

Rev

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