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) |