Subversion Repositories Kolibri OS

Rev

Rev 7696 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7696 Rev 7983
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-2020, Anton Krotov
5
    All rights reserved.
5
    All rights reserved.
Line 6... Line 6...
6
*)
6
*)
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
MODULE IL;
8
MODULE IL;
Line 9... Line 9...
9
 
9
 
Line 63... Line 63...
63
    opINCC* = 125; opINC* = 126; opDEC* = 127;
63
    opINCC* = 125; opINC* = 126; opDEC* = 127;
64
    opINCL* = 128; opEXCL* = 129; opINCLC* = 130; opEXCLC* = 131; opNEW* = 132; opDISP* = 133;
64
    opINCL* = 128; opEXCL* = 129; opINCLC* = 130; opEXCLC* = 131; opNEW* = 132; opDISP* = 133;
65
    opPACK* = 134; opPACKC* = 135; opUNPK* = 136; opCOPY* = 137; opENTER* = 138; opLEAVE* = 139;
65
    opPACK* = 134; opPACKC* = 135; opUNPK* = 136; opCOPY* = 137; opENTER* = 138; opLEAVE* = 139;
66
    opCALL* = 140; opSAVEP* = 141; opCALLP* = 142; opEQP* = 143; opNEP* = 144; opLEAVER* = 145;
66
    opCALL* = 140; opSAVEP* = 141; opCALLP* = 142; opEQP* = 143; opNEP* = 144; opLEAVER* = 145;
67
    opGET* = 146; opSAVE16* = 147; opABS* = 148; opFABS* = 149; opFLOOR* = 150; opFLT* = 151;
67
    opGET* = 146; opSAVE16* = 147; opABS* = 148; opFABS* = 149; opFLOOR* = 150; opFLT* = 151;
68
    opODD* = 152; opORD* = 153; opASR* = 154; opLSL* = 155; opROR* = 156;
68
    opORD* = 153; opASR* = 154; opLSL* = 155; opROR* = 156;
69
    opASR1* = 157; opLSL1* = 158; opROR1* = 159; opASR2* = 160; opLSL2* = 161; opROR2* = 162;
69
    opASR1* = 157; opLSL1* = 158; opROR1* = 159; opASR2* = 160; opLSL2* = 161; opROR2* = 162;
70
    opPUSHP* = 163; opLADR* = 164; opTYPEGP* = 165; opIS* = 166; opPUSHF* = 167; opVADR* = 168;
70
    opPUSHP* = 163; opLADR* = 164; opTYPEGP* = 165; opIS* = 166; opPUSHF* = 167; opVADR* = 168;
71
    opPUSHT* = 169; opTYPEGR* = 170; opISREC* = 171; opCHKIDX* = 172; opPARAM* = 173;
71
    opPUSHT* = 169; opTYPEGR* = 170; opISREC* = 171; opCHKIDX* = 172; opPARAM* = 173;
72
    opCHKIDX2* = 174; opLEN* = 175; opROT* = 176; opSAVES* = 177; opSADR* = 178; opERR* = 179;
72
    opCHKIDX2* = 174; opLEN* = 175; opROT* = 176; opSAVES* = 177; opSADR* = 178; opERR* = 179;
Line 81... Line 81...
81
    opTYPEGD* = 207; opCALLI* = 208; opPUSHIP* = 209; opSAVEIP* = 210; opEQIP* = 211; opNEIP* = 212;
81
    opTYPEGD* = 207; opCALLI* = 208; opPUSHIP* = 209; opSAVEIP* = 210; opEQIP* = 211; opNEIP* = 212;
82
    opSAVE16C* = 213; opWCHR* = 214; opGETC* = 215; opLENGTHW* = 216;
82
    opSAVE16C* = 213; opWCHR* = 214; opGETC* = 215; opLENGTHW* = 216;
Line 83... Line 83...
83
 
83
 
Line -... Line 84...
-
 
84
    opSYSVCALL* = 217; opSYSVCALLI* = 218; opSYSVCALLP* = 219; opSYSVALIGN16* = 220; opWIN64ALIGN16* = 221;
-
 
85
 
Line 84... Line 86...
84
    opSYSVCALL* = 217; opSYSVCALLI* = 218; opSYSVCALLP* = 219; opSYSVALIGN16* = 220; opWIN64ALIGN16* = 221;
86
    opONERR* = 222; opSAVEFI* = 223; opHANDLER* = 224;
85
 
87
 
86
 
88
 
Line 117... Line 119...
117
    _is        *=  18;
119
    _is        *=  18;
118
    _isrec     *=  19;
120
    _isrec     *=  19;
119
    _guard     *=  20;
121
    _guard     *=  20;
120
    _guardrec  *=  21;
122
    _guardrec  *=  21;
Line -... Line 123...
-
 
123
 
-
 
124
    _fmul      *=  22;
-
 
125
    _fdiv      *=  23;
-
 
126
    _fdivi     *=  24;
-
 
127
    _fadd      *=  25;
-
 
128
    _fsub      *=  26;
-
 
129
    _fsubi     *=  27;
-
 
130
    _fcmp      *=  28;
-
 
131
    _floor     *=  29;
-
 
132
    _flt       *=  30;
-
 
133
    _pack      *=  31;
-
 
134
    _unpk      *=  32;
Line 121... Line 135...
121
 
135
 
Line 122... Line 136...
122
 
136
 
Line 182... Line 196...
182
        types*:     CHL.INTLIST;
196
        types*:     CHL.INTLIST;
183
        data*:      CHL.BYTELIST;
197
        data*:      CHL.BYTELIST;
184
        dmin*:      INTEGER;
198
        dmin*:      INTEGER;
185
        lcount*:    INTEGER;
199
        lcount*:    INTEGER;
186
        bss*:       INTEGER;
200
        bss*:       INTEGER;
187
        rtl*:       ARRAY 22 OF INTEGER;
201
        rtl*:       ARRAY 33 OF INTEGER;
188
        errlabels*: ARRAY 12 OF INTEGER;
202
        errlabels*: ARRAY 12 OF INTEGER;
Line 189... Line 203...
189
 
203
 
190
        charoffs:   ARRAY 256 OF INTEGER;
204
        charoffs:   ARRAY 256 OF INTEGER;
Line 196... Line 210...
196
 
210
 
Line 197... Line 211...
197
 
211
 
198
VAR
-
 
199
 
212
VAR
Line 200... Line 213...
200
    codes*: CODES;
213
 
Line 201... Line 214...
201
    endianness: INTEGER;
214
    codes*: CODES;
Line 431... Line 444...
431
        cur.param2 := param2
444
        cur.param2 := param2
432
    END set;
445
    END set;
Line 433... Line 446...
433
 
446
 
-
 
447
 
-
 
448
BEGIN
434
 
449
    IF CPU IN {TARGETS.cpuX86, TARGETS.cpuAMD64, TARGETS.cpuMSP430} THEN
435
BEGIN
450
 
Line 436... Line 451...
436
    old_opcode := cur.opcode;
451
        old_opcode := cur.opcode;
Line 479... Line 494...
479
    ELSIF (nov.opcode = opMULC) & (old_opcode = opMULC) THEN
494
        ELSIF (nov.opcode = opMULC) & (old_opcode = opMULC) THEN
480
        cur.param2 := param2 * cur.param2
495
            cur.param2 := param2 * cur.param2
Line 481... Line 496...
481
 
496
 
482
    ELSE
497
        ELSE
-
 
498
            old_opcode := -1
-
 
499
        END
-
 
500
    ELSE
483
        old_opcode := -1
501
        old_opcode := -1
Line 484... Line 502...
484
    END;
502
    END;
485
 
503
 
486
    IF old_opcode = -1 THEN
504
    IF old_opcode = -1 THEN
Line 631... Line 649...
631
END AddJmpCmd;
649
END AddJmpCmd;
Line 632... Line 650...
632
 
650
 
633
 
651
 
634
PROCEDURE OnError* (line, error: INTEGER);
-
 
635
BEGIN
652
PROCEDURE OnError* (line, error: INTEGER);
636
    AddCmd(opPUSHC, line);
653
BEGIN
Line 637... Line 654...
637
    AddJmpCmd(opJMP, codes.errlabels[error])
654
    AddCmd2(opONERR, codes.errlabels[error], line)
638
END OnError;
655
END OnError;
Line 875... Line 892...
875
    |8: AddCmd0(opSAVE64)
892
    |8: AddCmd0(opSAVE64)
876
    END
893
    END
877
END SysPut;
894
END SysPut;
Line 878... Line 895...
878
 
895
 
879
 
896
 
-
 
897
PROCEDURE savef* (inv: BOOLEAN);
-
 
898
BEGIN
-
 
899
    IF inv THEN
880
PROCEDURE savef*;
900
        AddCmd0(opSAVEFI)
-
 
901
    ELSE
881
BEGIN
902
        AddCmd0(opSAVEF)
882
    AddCmd0(opSAVEF);
903
    END;
883
    DEC(codes.fregs);
904
    DEC(codes.fregs);
Line 1136... Line 1157...
1136
        END
1157
        END
1137
    END
1158
    END
1138
END DelImport;
1159
END DelImport;
Line 1139... Line 1160...
1139
 
1160
 
1140
 
1161
 
1141
PROCEDURE init* (pNumRegsFloat, pEndianness: INTEGER);
1162
PROCEDURE init* (pCPU: INTEGER);
1142
VAR
1163
VAR
Line 1143... Line 1164...
1143
    cmd:    COMMAND;
1164
    cmd:    COMMAND;
1144
    i:      INTEGER;
1165
    i:      INTEGER;
1145
 
1166
 
-
 
1167
BEGIN
1146
BEGIN
1168
    commands := C.create();
1147
    commands := C.create();
1169
    variables := C.create();
-
 
1170
 
-
 
1171
    CPU := pCPU;
-
 
1172
    endianness := little_endian;
-
 
1173
    CASE CPU OF
-
 
1174
    |TARGETS.cpuAMD64:  numRegsFloat := 6
-
 
1175
    |TARGETS.cpuX86:    numRegsFloat := 8
Line 1148... Line 1176...
1148
    variables := C.create();
1176
    |TARGETS.cpuMSP430: numRegsFloat := 0
1149
    numRegsFloat := pNumRegsFloat;
1177
    |TARGETS.cpuTHUMB:  numRegsFloat := 256
1150
    endianness := pEndianness;
1178
    END;
1151
 
1179