Subversion Repositories Kolibri OS

Rev

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 748... Line 748...
748
         IL.opEQSW .. IL.opGESW,
748
         IL.opEQSW .. IL.opGESW,
749
         IL.opCOPY, IL.opMOVE, IL.opCOPYA,
749
         IL.opCOPY, IL.opMOVE, IL.opCOPYA,
750
         IL.opCOPYS, IL.opROT,
750
         IL.opCOPYS, IL.opROT,
751
         IL.opNEW, IL.opDISP, IL.opISREC,
751
         IL.opNEW, IL.opDISP, IL.opISREC,
752
         IL.opIS, IL.opTYPEGR, IL.opTYPEGP,
752
         IL.opIS, IL.opTYPEGR, IL.opTYPEGP,
753
         IL.opCASET, IL.opDIV,
753
         IL.opTYPEGD, IL.opCASET, IL.opDIV,
754
         IL.opDIVL, IL.opMOD,
754
         IL.opDIVL, IL.opMOD,
755
         IL.opMODL, IL.opLENGTH, IL.opLENGTHW:
755
         IL.opMODL, IL.opLENGTH, IL.opLENGTHW:
756
            leaf := FALSE
756
            leaf := FALSE
Line 757... Line 757...
757
 
757
 
Line 1161... Line 1161...
1161
                OutByte(0C3H) // ret
1161
                OutByte(0C3H) // ret
1162
            END;
1162
            END;
1163
            REG.Reset(R)
1163
            REG.Reset(R)
Line 1164... Line 1164...
1164
 
1164
 
-
 
1165
        |IL.opSAVES:
1165
        |IL.opSAVES:
1166
            UnOp(reg1);
1166
            PushAll(1);
1167
            REG.PushAll_1(R);
-
 
1168
            pushDA(stroffs + param2);
-
 
1169
            push(reg1);
1167
            pushDA(stroffs + param2);
1170
            drop;
1168
            pushc(param1);
1171
            pushc(param1);
Line 1169... Line 1172...
1169
            CallRTL(IL._move)
1172
            CallRTL(IL._move)
1170
 
1173
 
Line 1325... Line 1328...
1325
            pushc(param2);
1328
            pushc(param2);
1326
            CallRTL(IL._set);
1329
            CallRTL(IL._set);
1327
            GetRegA
1330
            GetRegA
Line 1328... Line 1331...
1328
 
1331
 
-
 
1332
        |IL.opRSETL:
1329
        |IL.opRSETL:
1333
            UnOp(reg1);
1330
            PushAll(1);
1334
            REG.PushAll_1(R);
-
 
1335
            pushc(param2);
-
 
1336
            push(reg1);
1331
            pushc(param2);
1337
            drop;
1332
            CallRTL(IL._set2);
1338
            CallRTL(IL._set);
Line 1333... Line 1339...
1333
            GetRegA
1339
            GetRegA
1334
 
-
 
1335
        |IL.opRSET1:
1340
 
1336
            UnOp(reg1);
-
 
1337
            PushAll(1);
1341
        |IL.opRSET1:
1338
            push(reg1);
1342
            PushAll(1);
Line 1339... Line 1343...
1339
            CallRTL(IL._set);
1343
            CallRTL(IL._set1);
1340
            GetRegA
1344
            GetRegA
1341
 
1345
 
Line 1571... Line 1575...
1571
            not(reg1)
1575
            not(reg1)
Line 1572... Line 1576...
1572
 
1576
 
1573
        |IL.opCOPY:
1577
        |IL.opCOPY:
1574
            PushAll(2);
1578
            PushAll(2);
1575
            pushc(param2);
1579
            pushc(param2);
Line 1576... Line 1580...
1576
            CallRTL(IL._move2)
1580
            CallRTL(IL._move)
1577
 
1581
 
1578
        |IL.opMOVE:
1582
        |IL.opMOVE:
Line 1579... Line 1583...
1579
            PushAll(3);
1583
            PushAll(3);
1580
            CallRTL(IL._move2)
1584
            CallRTL(IL._move)
1581
 
1585
 
1582
        |IL.opCOPYA:
1586
        |IL.opCOPYA:
Line 1817... Line 1821...
1817
                END
1821
                END
1818
            END
1822
            END
Line 1819... Line 1823...
1819
 
1823
 
1820
        |IL.opDIV:
1824
        |IL.opDIV:
1821
            PushAll(2);
1825
            PushAll(2);
1822
            CallRTL(IL._div);
1826
            CallRTL(IL._divmod);
Line 1823... Line 1827...
1823
            GetRegA
1827
            GetRegA
1824
 
1828
 
1825
        |IL.opDIVR:
1829
        |IL.opDIVR:
Line 1852... Line 1856...
1852
                    END
1856
                    END
Line 1853... Line 1857...
1853
 
1857
 
1854
                ELSE
1858
                ELSE
1855
                    PushAll(1);
1859
                    PushAll(1);
1856
                    pushc(param2);
1860
                    pushc(param2);
1857
                    CallRTL(IL._div);
1861
                    CallRTL(IL._divmod);
1858
                    GetRegA
1862
                    GetRegA
1859
                END
1863
                END
Line 1860... Line 1864...
1860
            END
1864
            END
-
 
1865
 
1861
 
1866
        |IL.opDIVL:
1862
        |IL.opDIVL:
1867
            UnOp(reg1);
-
 
1868
            REG.PushAll_1(R);
-
 
1869
            pushc(param2);
1863
            PushAll(1);
1870
            push(reg1);
1864
            pushc(param2);
1871
            drop;
Line 1865... Line 1872...
1865
            CallRTL(IL._div2);
1872
            CallRTL(IL._divmod);
1866
            GetRegA
1873
            GetRegA
1867
 
1874
 
-
 
1875
        |IL.opMOD:
1868
        |IL.opMOD:
1876
            PushAll(2);
Line 1869... Line 1877...
1869
            PushAll(2);
1877
            CallRTL(IL._divmod);
1870
            CallRTL(IL._mod);
1878
            mov(rax, rdx);
1871
            GetRegA
1879
            GetRegA
Line 1897... Line 1905...
1897
                    END
1905
                    END
Line 1898... Line 1906...
1898
 
1906
 
1899
                ELSE
1907
                ELSE
1900
                    PushAll(1);
1908
                    PushAll(1);
1901
                    pushc(param2);
1909
                    pushc(param2);
-
 
1910
                    CallRTL(IL._divmod);
1902
                    CallRTL(IL._mod);
1911
                    mov(rax, rdx);
1903
                    GetRegA
1912
                    GetRegA
1904
                END
1913
                END
Line 1905... Line 1914...
1905
            END
1914
            END
-
 
1915
 
1906
 
1916
        |IL.opMODL:
1907
        |IL.opMODL:
1917
            UnOp(reg1);
-
 
1918
            REG.PushAll_1(R);
-
 
1919
            pushc(param2);
1908
            PushAll(1);
1920
            push(reg1);
-
 
1921
            drop;
1909
            pushc(param2);
1922
            CallRTL(IL._divmod);
Line 1910... Line 1923...
1910
            CallRTL(IL._mod2);
1923
            mov(rax, rdx);
1911
            GetRegA
1924
            GetRegA
1912
 
1925
 
Line 2559... Line 2572...
2559
    ASSERT(R.top = -1);
2572
    ASSERT(R.top = -1);
2560
    ASSERT(xmm = -1)
2573
    ASSERT(xmm = -1)
2561
END translate;
2574
END translate;
Line 2562... Line 2575...
2562
 
2575
 
2563
 
2576
 
2564
PROCEDURE prolog (code: IL.CODES; modname: ARRAY OF CHAR; target, stack_size: INTEGER);
2577
PROCEDURE prolog (modname: ARRAY OF CHAR; target, stack_size: INTEGER);
Line 2565... Line 2578...
2565
VAR
2578
VAR
2566
    ModName_Offs, entry, L: INTEGER;
2579
    ModName_Offs, entry, L: INTEGER;
2567
 
2580
 
2568
BEGIN
2581
BEGIN
Line 2569... Line 2582...
2569
    ModName_Offs := tcount * 8 + CHL.Length(code.data);
2582
    ModName_Offs := tcount * 8 + CHL.Length(IL.codes.data);
2570
    Numbers_Offs := ModName_Offs + LENGTH(modname) + 1;
2583
    Numbers_Offs := ModName_Offs + LENGTH(modname) + 1;
Line 2594... Line 2607...
2594
    pushDA(0); //TYPES
2607
    pushDA(0); //TYPES
2595
    pushc(tcount);
2608
    pushc(tcount);
2596
    pushDA(ModName_Offs); //MODNAME
2609
    pushDA(ModName_Offs); //MODNAME
2597
    CallRTL(IL._init);
2610
    CallRTL(IL._init);
Line 2598... Line 2611...
2598
 
2611
 
2599
    IF target IN {mConst.Target_iConsole64, mConst.Target_iGUI64} THEN
2612
    IF target IN {mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iELF64} THEN
2600
        L := NewLabel();
2613
        L := NewLabel();
2601
        pushc(0);
2614
        pushc(0);
2602
        push(rsp);
2615
        push(rsp);
2603
        pushc(1024 * 1024 * stack_size);
2616
        pushc(1024 * 1024 * stack_size);
Line 2611... Line 2624...
2611
        X86.SetLabel(L)
2624
        X86.SetLabel(L)
2612
    END
2625
    END
2613
END prolog;
2626
END prolog;
Line 2614... Line 2627...
2614
 
2627
 
2615
 
2628
 
2616
PROCEDURE epilog (code: IL.CODES; modname: ARRAY OF CHAR; target: INTEGER);
2629
PROCEDURE epilog (modname: ARRAY OF CHAR; target: INTEGER);
2617
VAR
2630
VAR
2618
    i, n: INTEGER;
2631
    i, n: INTEGER;
Line 2658... Line 2671...
2658
 
2671
 
Line 2659... Line 2672...
2659
    X86.fixup;
2672
    X86.fixup;
2660
 
2673
 
2661
    i := 0;
2674
    i := 0;
2662
    WHILE i < tcount DO
2675
    WHILE i < tcount DO
2663
        BIN.PutData64LE(prog, CHL.GetInt(code.types, i));
2676
        BIN.PutData64LE(prog, CHL.GetInt(IL.codes.types, i));
Line 2664... Line 2677...
2664
        INC(i)
2677
        INC(i)
2665
    END;
2678
    END;
2666
 
2679
 
2667
    i := 0;
2680
    i := 0;
2668
    WHILE i < CHL.Length(code.data) DO
2681
    WHILE i < CHL.Length(IL.codes.data) DO
Line 2669... Line 2682...
2669
        BIN.PutData(prog, CHL.GetByte(code.data, i));
2682
        BIN.PutData(prog, CHL.GetByte(IL.codes.data, i));
2670
        INC(i)
2683
        INC(i)
Line 2683... Line 2696...
2683
    FOR i := 0 TO Numbers_Count - 1 DO
2696
    FOR i := 0 TO Numbers_Count - 1 DO
2684
        BIN.PutData64LE(prog, number.value);
2697
        BIN.PutData64LE(prog, number.value);
2685
        number := number.next(Number)
2698
        number := number.next(Number)
2686
    END;
2699
    END;
Line 2687... Line 2700...
2687
 
2700
 
2688
    exp := code.export.first(IL.EXPORT_PROC);
2701
    exp := IL.codes.export.first(IL.EXPORT_PROC);
2689
    WHILE exp # NIL DO
2702
    WHILE exp # NIL DO
2690
        BIN.Export(prog, exp.name, exp.label);
2703
        BIN.Export(prog, exp.name, exp.label);
2691
        exp := exp.next(IL.EXPORT_PROC)
2704
        exp := exp.next(IL.EXPORT_PROC)
Line 2692... Line 2705...
2692
    END;
2705
    END;
2693
 
2706
 
Line 2694... Line 2707...
2694
    import(code.import)
2707
    import(IL.codes.import)
2695
END epilog;
2708
END epilog;
Line 2717... Line 2730...
2717
    |8: movmr(rbp, offs, reg)
2730
    |8: movmr(rbp, offs, reg)
2718
    END
2731
    END
2719
END rsave;
2732
END rsave;
Line 2720... Line 2733...
2720
 
2733
 
2721
 
2734
 
2722
PROCEDURE CodeGen* (code: IL.CODES; outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS);
2735
PROCEDURE CodeGen* (outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS);
Line 2723... Line 2736...
2723
VAR
2736
VAR
2724
    path, modname, ext: PATHS.PATH;
2737
    path, modname, ext: PATHS.PATH;
Line 2725... Line 2738...
2725
 
2738
 
2726
BEGIN
2739
BEGIN
2727
    tcount := CHL.Length(code.types);
2740
    tcount := CHL.Length(IL.codes.types);
2728
 
2741
 
Line 2741... Line 2754...
2741
    PATHS.split(outname, path, modname, ext);
2754
    PATHS.split(outname, path, modname, ext);
2742
    S.append(modname, ext);
2755
    S.append(modname, ext);
Line 2743... Line 2756...
2743
 
2756
 
Line 2744... Line 2757...
2744
    REG.Init(R, push, pop, mov, xchg, rload, rsave, {rax, r10, r11}, {rcx, rdx, r8, r9});
2757
    REG.Init(R, push, pop, mov, xchg, rload, rsave, {rax, r10, r11}, {rcx, rdx, r8, r9});
Line 2745... Line 2758...
2745
 
2758
 
2746
    code.bss := MAX(code.bss, MAX(code.dmin - CHL.Length(code.data), 8));
2759
    IL.set_bss(MAX(IL.codes.bss, MAX(IL.codes.dmin - CHL.Length(IL.codes.data), 8)));
2747
 
2760
 
2748
    Numbers := LISTS.create(NIL);
2761
    Numbers := LISTS.create(NIL);
Line 2753... Line 2766...
2753
    NewNumber(-1);
2766
    NewNumber(-1);
2754
    NewNumber(ROR(7FFH, 12));  (* +Infinity *)
2767
    NewNumber(ROR(7FFH, 12));  (* +Infinity *)
2755
    NewNumber(ORD(-BITS(LSR(ASR(ROR(1, 1), 10), 1))));  (* {0..51, 63} *)
2768
    NewNumber(ORD(-BITS(LSR(ASR(ROR(1, 1), 10), 1))));  (* {0..51, 63} *)
2756
    NewNumber(LSR(ASR(ROR(1, 1), 9), 2));  (* {52..61} *)
2769
    NewNumber(LSR(ASR(ROR(1, 1), 9), 2));  (* {52..61} *)
Line 2757... Line 2770...
2757
 
2770
 
2758
    prog := BIN.create(code.lcount);
2771
    prog := BIN.create(IL.codes.lcount);
Line 2759... Line 2772...
2759
    BIN.SetParams(prog, code.bss, 1, WCHR(1), WCHR(0));
2772
    BIN.SetParams(prog, IL.codes.bss, 1, WCHR(1), WCHR(0));
Line 2760... Line 2773...
2760
 
2773
 
2761
    X86.SetProgram(prog);
2774
    X86.SetProgram(prog);
2762
 
2775
 
Line 2763... Line 2776...
2763
    prolog(code, modname, target, options.stack);
2776
    prolog(modname, target, options.stack);
2764
    translate(code.commands, tcount * 8);
2777
    translate(IL.codes.commands, tcount * 8);
2765
    epilog(code, modname, target);
2778
    epilog(modname, target);
2766
 
2779
 
2767
    BIN.fixup(prog);
2780
    BIN.fixup(prog);
2768
    IF target IN {mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iDLL64} THEN
2781
    IF target IN {mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iDLL64} THEN
2769
        PE32.write(prog, outname, options.base, target = mConst.Target_iConsole64, target = mConst.Target_iDLL64, TRUE)
2782
        PE32.write(prog, outname, target = mConst.Target_iConsole64, target = mConst.Target_iDLL64, TRUE)