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