Subversion Repositories Kolibri OS

Rev

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

Rev 7983 Rev 8097
Line 5... Line 5...
5
    All rights reserved.
5
    All rights reserved.
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 10... Line -...
10
IMPORT LISTS, SCAN, STRINGS, CHL := CHUNKLISTS, C := COLLECTIONS, TARGETS;
-
 
11
 
-
 
12
 
-
 
13
CONST
10
IMPORT LISTS, SCAN, STRINGS, CHL := CHUNKLISTS, C := COLLECTIONS, TARGETS, PATHS;
14
 
11
 
15
    little_endian* = 0;
12
 
Line 16... Line 13...
16
    big_endian* = 1;
13
CONST
17
 
14
 
18
    call_stack* = 0;
15
    call_stack* = 0;
19
    call_win64* = 1;
16
    call_win64* = 1;
20
    call_sysv*  = 2;
17
    call_sysv*  = 2;
21
 
18
 
Line 22... Line 19...
22
    opJMP* = 0; opLABEL* = 1; opCOPYS* = 2; opGADR* = 3; opCONST* = 4; opLLOAD32* = 5;
19
    opJMP* = 0; opLABEL* = 1; opCOPYS* = 2; opGADR* = 3; opCONST* = 4; opLLOAD32* = 5;
23
    opCOPYA* = 6; opCASET* = 7; opMULC* = 8; opMUL* = 9; opDIV* = 10; opMOD* = 11;
20
    opCOPYA* = 6; opCASET* = 7; opMULC* = 8; opMUL* = 9; opDIV* = 10; opMOD* = 11;
Line 32... Line 29...
32
    opEQS* = 48; opNES* = opEQS + 1; opLTS* = opEQS + 2; opLES* = opEQS + 3; opGTS* = opEQS + 4; opGES* = opEQS + 5; (* 53 *)
29
    opEQS* = 48; opNES* = opEQS + 1; opLTS* = opEQS + 2; opLES* = opEQS + 3; opGTS* = opEQS + 4; opGES* = opEQS + 5; (* 53 *)
33
    opEQSW* = 54; opNESW* = opEQSW + 1; opLTSW* = opEQSW + 2; opLESW* = opEQSW + 3; opGTSW* = opEQSW + 4; opGESW* = opEQSW + 5 (* 59 *);
30
    opEQSW* = 54; opNESW* = opEQSW + 1; opLTSW* = opEQSW + 2; opLESW* = opEQSW + 3; opGTSW* = opEQSW + 4; opGESW* = opEQSW + 5 (* 59 *);
Line 34... Line 31...
34
 
31
 
Line 35... Line 32...
35
    opVLOAD32* = 60; opGLOAD32* = 61;
32
    opVLOAD32* = 60; opGLOAD32* = 61;
Line 36... Line 33...
36
 
33
 
Line 37... Line 34...
37
    opJNE* = 62; opJE* = 63;
34
    opJZ* = 62; opJNZ* = 63;
38
 
35
 
Line 39... Line 36...
39
    opSAVE32* = 64; opLLOAD8* = 65;
36
    opSAVE32* = 64; opLLOAD8* = 65;
40
 
37
 
Line 41... Line 38...
41
    opCONSTF* = 66; opLOADF* = 67; opSAVEF* = 68; opMULF* = 69; opDIVF* = 70; opDIVFI* = 71;
38
    opCONSTF* = 66; opLOADF* = 67; opSAVEF* = 68; opMULF* = 69; opDIVF* = 70; opDIVFI* = 71;
Line 42... Line 39...
42
    opUMINF* = 72; opADDFI* = 73; opSUBFI* = 74; opADDF* = 75; opSUBF* = 76;
39
    opUMINF* = 72; opSAVEFI* = 73; opSUBFI* = 74; opADDF* = 75; opSUBF* = 76;
Line 53... Line 50...
53
    opPUSHC* = 98; opSWITCH* = 99;
50
    opPUSHC* = 98; opSWITCH* = 99;
Line 54... Line 51...
54
 
51
 
Line 55... Line 52...
55
    opSBOOL* = 100; opSBOOLC* = 101; opNOP* = 102;
52
    opSBOOL* = 100; opSBOOLC* = 101; opNOP* = 102;
56
 
53
 
57
    opMULS* = 103; opMULSC* = 104; opDIVS* = 105; opDIVSC* = 106;
54
    opMULS* = 103; opMULSC* = 104; opDIVS* = 105; opDIVSC* = 106;
58
    opADDS* = 107; opSUBS* = 108; opADDSL* = 109; opSUBSL* = 110; opADDSR* = 111; opSUBSR* = 112;
55
    opADDS* = 107; opSUBS* = 108; opERR* = 109; opSUBSL* = 110; opADDSC* = 111; opSUBSR* = 112;
Line 59... Line 56...
59
    opUMINS* = 113; opIN* = 114; opINL* = 115; opINR* = 116;
56
    opUMINS* = 113; opIN* = 114; opINL* = 115; opINR* = 116;
60
    opRSET* = 117; opRSETL* = 118; opRSETR* = 119; opRSET1* = 120; opLENGTH* = 121;
57
    opRSET* = 117; opRSETL* = 118; opRSETR* = 119; opRSET1* = 120; opLENGTH* = 121;
61
 
58
 
62
    opLEAVEC* = 122; opCODE* = 123; opALIGN16* = 124;
59
    opLEAVEC* = 122; opCODE* = 123; opALIGN16* = 124;
63
    opINCC* = 125; opINC* = 126; opDEC* = 127;
60
    opINCC* = 125; opINC* = 126; opDEC* = 127;
64
    opINCL* = 128; opEXCL* = 129; opINCLC* = 130; opEXCLC* = 131; opNEW* = 132; opDISP* = 133;
61
    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;
62
    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;
63
    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;
64
    opGET* = 146; opSAVE16* = 147; opABS* = 148; opFABS* = 149; opFLOOR* = 150; opFLT* = 151;
68
    opORD* = 153; opASR* = 154; opLSL* = 155; opROR* = 156;
65
    opGETC* = 152; opORD* = 153; opASR* = 154; opLSL* = 155; opROR* = 156;
69
    opASR1* = 157; opLSL1* = 158; opROR1* = 159; opASR2* = 160; opLSL2* = 161; opROR2* = 162;
66
    opASR1* = 157; opLSL1* = 158; opROR1* = 159; opASR2* = 160; opLSL2* = 161; opROR2* = 162;
Line 70... Line 67...
70
    opPUSHP* = 163; opLADR* = 164; opTYPEGP* = 165; opIS* = 166; opPUSHF* = 167; opVADR* = 168;
67
    opPUSHP* = 163; opLADR* = 164; opTYPEGP* = 165; opIS* = 166; opPUSHF* = 167; opVADR* = 168;
71
    opPUSHT* = 169; opTYPEGR* = 170; opISREC* = 171; opCHKIDX* = 172; opPARAM* = 173;
68
    opPUSHT* = 169; opTYPEGR* = 170; opISREC* = 171; opCHKIDX* = 172; opPARAM* = 173;
72
    opCHKIDX2* = 174; opLEN* = 175; opROT* = 176; opSAVES* = 177; opSADR* = 178; opERR* = 179;
69
    opCHKIDX2* = 174; opLEN* = 175; opROT* = 176; opSAVES* = 177; opSADR* = 178; opLENGTHW* = 179;
73
 
70
 
74
    opCHR* = 180; opENDSW* = 181; opLEAVEF* = 182; opCLEANUP* = 183; opMOVE* = 184;
71
    opCHR* = 180; opENDSW* = 181; opLEAVEF* = 182; opCLEANUP* = 183; opMOVE* = 184;
75
    opLSR* = 185; opLSR1* = 186; opLSR2* = 187;
72
    opLSR* = 185; opLSR1* = 186; opLSR2* = 187;
Line 76... Line 73...
76
    opMIN* = 188; opMINC* = 189; opMAX* = 190; opMAXC* = 191; opJNZ* = 192;
73
    opMIN* = 188; opMINC* = 189; opMAX* = 190; opMAXC* = 191; opSYSVALIGN16* = 192;
77
    opEQB* = 193; opNEB* = 194; opINF* = 195; opJZ* = 196; opVLOAD8* = 197; opGLOAD8* = 198;
74
    opEQB* = 193; opNEB* = 194; opINF* = 195; opWIN64ALIGN16* = 196; opVLOAD8* = 197; opGLOAD8* = 198;
78
    opLLOAD16* = 199; opVLOAD16* = 200; opGLOAD16* = 201;
-
 
79
    opLOAD64* = 202; opLLOAD64* = 203; opVLOAD64* = 204; opGLOAD64* = 205; opSAVE64* = 206;
-
 
Line 80... Line 75...
80
 
75
    opLLOAD16* = 199; opVLOAD16* = 200; opGLOAD16* = 201;
-
 
76
    opLOAD64* = 202; opLLOAD64* = 203; opVLOAD64* = 204; opGLOAD64* = 205; opSAVE64* = 206;
Line 81... Line 77...
81
    opTYPEGD* = 207; opCALLI* = 208; opPUSHIP* = 209; opSAVEIP* = 210; opEQIP* = 211; opNEIP* = 212;
77
 
82
    opSAVE16C* = 213; opWCHR* = 214; opGETC* = 215; opLENGTHW* = 216;
78
    opTYPEGD* = 207; opCALLI* = 208; opPUSHIP* = 209; opSAVEIP* = 210; opEQIP* = 211; opNEIP* = 212;
83
 
79
    opSAVE16C* = 213; opWCHR* = 214; opHANDLER* = 215;
Line 152... Line 148...
152
        variables*: LISTS.LIST;
148
        variables*: LISTS.LIST;
153
        allocReg*:  BOOLEAN
149
        allocReg*:  BOOLEAN
Line 154... Line 150...
154
 
150
 
Line -... Line 151...
-
 
151
    END;
-
 
152
 
-
 
153
    FNAMECMD* = POINTER TO RECORD (COMMAND)
-
 
154
 
-
 
155
        fname*: PATHS.PATH
-
 
156
 
155
    END;
157
    END;
Line 156... Line 158...
156
 
158
 
157
    CMDSTACK = POINTER TO RECORD
159
    CMDSTACK = POINTER TO RECORD
Line 190... Line 192...
190
        last:       COMMAND;
192
        last:       COMMAND;
191
        begcall:    CMDSTACK;
193
        begcall:    CMDSTACK;
192
        endcall:    CMDSTACK;
194
        endcall:    CMDSTACK;
193
        commands*:  LISTS.LIST;
195
        commands*:  LISTS.LIST;
194
        export*:    LISTS.LIST;
196
        export*:    LISTS.LIST;
195
        import*:    LISTS.LIST;
197
        _import*:   LISTS.LIST;
196
        types*:     CHL.INTLIST;
198
        types*:     CHL.INTLIST;
197
        data*:      CHL.BYTELIST;
199
        data*:      CHL.BYTELIST;
198
        dmin*:      INTEGER;
200
        dmin*:      INTEGER;
199
        lcount*:    INTEGER;
201
        lcount*:    INTEGER;
200
        bss*:       INTEGER;
202
        bss*:       INTEGER;
Line 202... Line 204...
202
        errlabels*: ARRAY 12 OF INTEGER;
204
        errlabels*: ARRAY 12 OF INTEGER;
Line 203... Line 205...
203
 
205
 
204
        charoffs:   ARRAY 256 OF INTEGER;
206
        charoffs:   ARRAY 256 OF INTEGER;
Line 205... Line -...
205
        wcharoffs:  ARRAY 65536 OF INTEGER;
-
 
206
 
207
        wcharoffs:  ARRAY 65536 OF INTEGER;
207
        fregs:      INTEGER;
208
 
Line 208... Line 209...
208
        wstr:       ARRAY 4*1024 OF WCHAR
209
        wstr:       ARRAY 4*1024 OF WCHAR
Line 209... Line 210...
209
    END;
210
    END;
210
 
211
 
Line 211... Line 212...
211
 
212
 
Line 212... Line 213...
212
VAR
213
VAR
Line 341... Line 342...
341
 
342
 
Line 342... Line 343...
342
    n := STRINGS.Utf8To16(s, codes.wstr);
343
    n := STRINGS.Utf8To16(s, codes.wstr);
343
 
344
 
344
    i := 0;
345
    i := 0;
345
    WHILE i < n DO
346
    WHILE i < n DO
346
        IF endianness = little_endian THEN
347
        IF TARGETS.LittleEndian THEN
347
            PutByte(ORD(codes.wstr[i]) MOD 256);
348
            PutByte(ORD(codes.wstr[i]) MOD 256);
348
            PutByte(ORD(codes.wstr[i]) DIV 256)
349
            PutByte(ORD(codes.wstr[i]) DIV 256)
349
        ELSIF endianness = big_endian THEN
350
        ELSE
350
            PutByte(ORD(codes.wstr[i]) DIV 256);
351
            PutByte(ORD(codes.wstr[i]) DIV 256);
351
            PutByte(ORD(codes.wstr[i]) MOD 256)
352
            PutByte(ORD(codes.wstr[i]) MOD 256)
352
        END;
353
        END;
Line 371... Line 372...
371
        IF ODD(res) THEN
372
        IF ODD(res) THEN
372
            PutByte(0);
373
            PutByte(0);
373
            INC(res)
374
            INC(res)
374
        END;
375
        END;
Line 375... Line 376...
375
 
376
 
376
        IF endianness = little_endian THEN
377
        IF TARGETS.LittleEndian THEN
377
            PutByte(c MOD 256);
378
            PutByte(c MOD 256);
378
            PutByte(c DIV 256)
379
            PutByte(c DIV 256)
379
        ELSIF endianness = big_endian THEN
380
        ELSE
380
            PutByte(c DIV 256);
381
            PutByte(c DIV 256);
381
            PutByte(c MOD 256)
382
            PutByte(c MOD 256)
Line 382... Line 383...
382
        END;
383
        END;
Line 408... Line 409...
408
    DEC(stk.top)
409
    DEC(stk.top)
409
    RETURN res
410
    RETURN res
410
END pop;
411
END pop;
Line 411... Line 412...
411
 
412
 
412
 
413
 
413
PROCEDURE pushBegEnd* (VAR beg, end: COMMAND);
414
PROCEDURE pushBegEnd* (VAR beg, _end: COMMAND);
414
BEGIN
415
BEGIN
415
    push(codes.begcall, beg);
416
    push(codes.begcall, beg);
416
    push(codes.endcall, end);
417
    push(codes.endcall, _end);
417
    beg := codes.last;
418
    beg := codes.last;
Line 418... Line 419...
418
    end := beg.next(COMMAND)
419
    _end := beg.next(COMMAND)
419
END pushBegEnd;
420
END pushBegEnd;
420
 
421
 
421
 
422
 
422
PROCEDURE popBegEnd* (VAR beg, end: COMMAND);
423
PROCEDURE popBegEnd* (VAR beg, _end: COMMAND);
Line 423... Line 424...
423
BEGIN
424
BEGIN
424
    beg := pop(codes.begcall);
425
    beg := pop(codes.begcall);
Line 492... Line 493...
492
            set(cur, opGADR_SAVEC, param2)
493
            set(cur, opGADR_SAVEC, param2)
Line 493... Line 494...
493
 
494
 
494
        ELSIF (nov.opcode = opMULC) & (old_opcode = opMULC) THEN
495
        ELSIF (nov.opcode = opMULC) & (old_opcode = opMULC) THEN
Line -... Line 496...
-
 
496
            cur.param2 := param2 * cur.param2
-
 
497
 
-
 
498
        ELSIF (nov.opcode = opADDC) & (old_opcode = opADDC) THEN
495
            cur.param2 := param2 * cur.param2
499
            cur.param2 := param2 + cur.param2
496
 
500
 
497
        ELSE
501
        ELSE
498
            old_opcode := -1
502
            old_opcode := -1
499
        END
503
        END
Line 629... Line 633...
629
 
633
 
630
BEGIN
634
BEGIN
631
    prev := codes.last;
635
    prev := codes.last;
632
    not := prev.opcode = opNOT;
636
    not := prev.opcode = opNOT;
633
    IF not THEN
637
    IF not THEN
634
        IF opcode = opJE THEN
638
        IF opcode = opJNZ THEN
635
            opcode := opJNE
639
            opcode := opJZ
636
        ELSIF opcode = opJNE THEN
640
        ELSIF opcode = opJZ THEN
637
            opcode := opJE
641
            opcode := opJNZ
638
        ELSE
642
        ELSE
639
            not := FALSE
643
            not := FALSE
640
        END
644
        END
Line 641... Line 645...
641
    END;
645
    END;
Line 642... Line 646...
642
 
646
 
643
    AddCmd2(opcode, label, label);
647
    AddCmd2(opcode, label, label);
644
 
648
 
645
    IF not THEN
-
 
646
        delete(prev)
649
    IF not THEN
Line -... Line 650...
-
 
650
        delete(prev)
-
 
651
    END
-
 
652
END AddJmpCmd;
-
 
653
 
-
 
654
 
-
 
655
PROCEDURE AndOrOpt* (VAR label: INTEGER);
-
 
656
VAR
-
 
657
    cur, prev: COMMAND;
-
 
658
    i, op, l: INTEGER;
-
 
659
    jz, not: BOOLEAN;
-
 
660
 
-
 
661
BEGIN
-
 
662
    cur := codes.last;
-
 
663
    not := cur.opcode = opNOT;
-
 
664
    IF not THEN
-
 
665
        cur := cur.prev(COMMAND)
-
 
666
    END;
-
 
667
 
-
 
668
    IF cur.opcode = opAND THEN
-
 
669
        op := opAND
-
 
670
    ELSIF cur.opcode = opOR THEN
-
 
671
        op := opOR
-
 
672
    ELSE
-
 
673
        op := -1
-
 
674
    END;
-
 
675
 
-
 
676
    cur := codes.last;
-
 
677
 
-
 
678
    IF op # -1 THEN
-
 
679
        IF not THEN
-
 
680
            IF op = opAND THEN
-
 
681
                op := opOR
-
 
682
            ELSE (* op = opOR *)
-
 
683
                op := opAND
-
 
684
            END;
-
 
685
            prev := cur.prev(COMMAND);
-
 
686
            delete(cur);
-
 
687
            cur := prev
-
 
688
        END;
-
 
689
 
-
 
690
        FOR i := 1 TO 9 DO
-
 
691
            IF i = 8 THEN
-
 
692
                l := cur.param1
-
 
693
            ELSIF i = 9 THEN
-
 
694
                jz := cur.opcode = opJZ
-
 
695
            END;
-
 
696
            prev := cur.prev(COMMAND);
-
 
697
            delete(cur);
-
 
698
            cur := prev
-
 
699
        END;
-
 
700
 
-
 
701
        setlast(cur);
-
 
702
 
-
 
703
        IF op = opAND THEN
-
 
704
            label := l;
-
 
705
            jz := ~jz
-
 
706
        END;
-
 
707
 
-
 
708
        IF jz THEN
-
 
709
            AddJmpCmd(opJZ, label)
-
 
710
        ELSE
-
 
711
            AddJmpCmd(opJNZ, label)
-
 
712
        END;
-
 
713
 
-
 
714
        IF op = opOR THEN
-
 
715
            SetLabel(l)
-
 
716
        END
-
 
717
    ELSE
-
 
718
        AddJmpCmd(opJZ, label)
-
 
719
    END;
647
    END
720
 
648
 
721
    setlast(codes.last)
649
END AddJmpCmd;
722
END AndOrOpt;
650
 
723
 
Line 659... Line 732...
659
VAR
732
VAR
660
    label: INTEGER;
733
    label: INTEGER;
661
BEGIN
734
BEGIN
662
    AddCmd(op, t);
735
    AddCmd(op, t);
663
    label := NewLabel();
736
    label := NewLabel();
664
    AddJmpCmd(opJE, label);
737
    AddJmpCmd(opJNZ, label);
665
    OnError(line, error);
738
    OnError(line, error);
666
    SetLabel(label)
739
    SetLabel(label)
667
END TypeGuard;
740
END TypeGuard;
Line 683... Line 756...
683
BEGIN
756
BEGIN
684
    AddCmd2(opNEW, typenum, size)
757
    AddCmd2(opNEW, typenum, size)
685
END New;
758
END New;
Line 686... Line -...
686
 
-
 
687
 
-
 
688
PROCEDURE fcmp* (opcode: INTEGER);
-
 
689
BEGIN
-
 
690
    AddCmd(opcode, 0);
-
 
691
    DEC(codes.fregs, 2);
-
 
692
    ASSERT(codes.fregs >= 0)
-
 
693
END fcmp;
-
 
694
 
759
 
695
 
760
 
696
PROCEDURE not*;
761
PROCEDURE not*;
697
VAR
762
VAR
698
    prev: COMMAND;
763
    prev: COMMAND;
Line 705... Line 770...
705
        AddCmd0(opNOT)
770
        AddCmd0(opNOT)
706
    END
771
    END
707
END not;
772
END not;
Line -... Line 773...
-
 
773
 
-
 
774
 
-
 
775
PROCEDURE _ord*;
-
 
776
BEGIN
-
 
777
    IF (codes.last.opcode # opAND) & (codes.last.opcode # opOR) THEN
-
 
778
        AddCmd0(opORD)
-
 
779
    END
-
 
780
END _ord;
708
 
781
 
709
 
782
 
710
PROCEDURE Enter* (label, params: INTEGER): COMMAND;
783
PROCEDURE Enter* (label, params: INTEGER): COMMAND;
Line 711... Line 784...
711
VAR
784
VAR
Line 898... Line 971...
898
BEGIN
971
BEGIN
899
    IF inv THEN
972
    IF inv THEN
900
        AddCmd0(opSAVEFI)
973
        AddCmd0(opSAVEFI)
901
    ELSE
974
    ELSE
902
        AddCmd0(opSAVEF)
975
        AddCmd0(opSAVEF)
903
    END;
976
    END
904
    DEC(codes.fregs);
-
 
905
    ASSERT(codes.fregs >= 0)
-
 
906
END savef;
977
END savef;
Line 907... Line -...
907
 
-
 
908
 
-
 
909
PROCEDURE pushf*;
-
 
910
BEGIN
-
 
911
    AddCmd0(opPUSHF);
-
 
912
    DEC(codes.fregs);
-
 
913
    ASSERT(codes.fregs >= 0)
-
 
914
END pushf;
-
 
915
 
-
 
916
 
-
 
917
PROCEDURE loadf* (): BOOLEAN;
-
 
918
BEGIN
-
 
919
    AddCmd0(opLOADF);
-
 
920
    INC(codes.fregs)
-
 
921
    RETURN codes.fregs < numRegsFloat
-
 
922
END loadf;
-
 
923
 
-
 
924
 
-
 
925
PROCEDURE inf* (): BOOLEAN;
-
 
926
BEGIN
-
 
927
    AddCmd0(opINF);
-
 
928
    INC(codes.fregs)
-
 
929
    RETURN codes.fregs < numRegsFloat
-
 
930
END inf;
-
 
931
 
-
 
932
 
-
 
933
PROCEDURE fbinop* (opcode: INTEGER);
-
 
934
BEGIN
-
 
935
    AddCmd0(opcode);
-
 
936
    DEC(codes.fregs);
-
 
937
    ASSERT(codes.fregs > 0)
-
 
938
END fbinop;
-
 
939
 
978
 
940
 
979
 
941
PROCEDURE saves* (offset, length: INTEGER);
980
PROCEDURE saves* (offset, length: INTEGER);
942
BEGIN
981
BEGIN
Line 952... Line 991...
952
        AddCmd0(opABS)
991
        AddCmd0(opABS)
953
    END
992
    END
954
END abs;
993
END abs;
Line 955... Line -...
955
 
-
 
956
 
-
 
957
PROCEDURE floor*;
-
 
958
BEGIN
-
 
959
    AddCmd0(opFLOOR);
-
 
960
    DEC(codes.fregs);
-
 
961
    ASSERT(codes.fregs >= 0)
-
 
962
END floor;
-
 
963
 
-
 
964
 
-
 
965
PROCEDURE flt* (): BOOLEAN;
-
 
966
BEGIN
-
 
967
    AddCmd0(opFLT);
-
 
968
    INC(codes.fregs)
-
 
969
    RETURN codes.fregs < numRegsFloat
-
 
970
END flt;
-
 
971
 
994
 
972
 
995
 
973
PROCEDURE shift_minmax* (op: CHAR);
996
PROCEDURE shift_minmax* (op: CHAR);
974
BEGIN
997
BEGIN
975
    CASE op OF
998
    CASE op OF
Line 1013... Line 1036...
1013
BEGIN
1036
BEGIN
1014
    AddCmd(opLEN, dim)
1037
    AddCmd(opLEN, dim)
1015
END len;
1038
END len;
Line 1016... Line 1039...
1016
 
1039
 
1017
 
1040
 
1018
PROCEDURE Float* (r: REAL);
1041
PROCEDURE Float* (r: REAL; line, col: INTEGER);
Line 1019... Line 1042...
1019
VAR
1042
VAR
1020
    cmd: COMMAND;
1043
    cmd: COMMAND;
1021
 
1044
 
1022
BEGIN
1045
BEGIN
1023
    cmd := NewCmd();
1046
    cmd := NewCmd();
1024
    cmd.opcode := opCONSTF;
1047
    cmd.opcode := opCONSTF;
1025
    cmd.float := r;
1048
    cmd.float := r;
1026
    insert(codes.last, cmd);
1049
    cmd.param1 := line;
Line 1027... Line -...
1027
    INC(codes.fregs);
-
 
1028
    ASSERT(codes.fregs <= numRegsFloat)
-
 
1029
END Float;
-
 
1030
 
-
 
1031
 
-
 
1032
PROCEDURE precall* (flt: BOOLEAN): INTEGER;
-
 
1033
VAR
-
 
1034
    res: INTEGER;
-
 
1035
BEGIN
-
 
1036
    res := codes.fregs;
-
 
1037
    AddCmd2(opPRECALL, ORD(flt), res);
-
 
1038
    codes.fregs := 0
-
 
1039
    RETURN res
-
 
1040
END precall;
-
 
1041
 
-
 
1042
 
-
 
1043
PROCEDURE resf* (fregs: INTEGER): BOOLEAN;
-
 
1044
BEGIN
-
 
1045
    AddCmd(opRESF, fregs);
-
 
1046
    codes.fregs := fregs + 1
-
 
1047
    RETURN codes.fregs < numRegsFloat
-
 
1048
END resf;
-
 
1049
 
-
 
1050
 
-
 
1051
PROCEDURE res* (fregs: INTEGER);
-
 
1052
BEGIN
-
 
1053
    AddCmd(opRES, fregs);
-
 
1054
    codes.fregs := fregs
-
 
1055
END res;
-
 
1056
 
-
 
1057
 
-
 
1058
PROCEDURE retf*;
-
 
1059
BEGIN
-
 
1060
    DEC(codes.fregs);
1050
    cmd.param2 := col;
1061
    ASSERT(codes.fregs = 0)
1051
    insert(codes.last, cmd)
1062
END retf;
1052
END Float;
1063
 
1053
 
Line 1064... Line 1054...
1064
 
1054
 
1065
PROCEDURE drop*;
1055
PROCEDURE drop*;
1066
BEGIN
1056
BEGIN
Line 1067... Line 1057...
1067
    AddCmd0(opDROP)
1057
    AddCmd0(opDROP)
1068
END drop;
1058
END drop;
Line 1082... Line 1072...
1082
        insert(codes.last, cmd)
1072
        insert(codes.last, cmd)
1083
    ELSE
1073
    ELSE
1084
        AddCmd2(opCASEL, a, L);
1074
        AddCmd2(opCASEL, a, L);
1085
        AddCmd2(opCASER, b, R)
1075
        AddCmd2(opCASER, b, R)
1086
    END
1076
    END
1087
END case;
1077
END _case;
Line 1088... Line 1078...
1088
 
1078
 
-
 
1079
 
-
 
1080
PROCEDURE fname* (name: PATHS.PATH);
-
 
1081
VAR
1089
 
1082
    cmd: FNAMECMD;
-
 
1083
 
-
 
1084
BEGIN
-
 
1085
    NEW(cmd);
1090
PROCEDURE caset* (a, label: INTEGER);
1086
    cmd.opcode := opFNAME;
1091
BEGIN
1087
    cmd.fname := name;
Line 1092... Line 1088...
1092
    AddCmd2(opCASET, label, a)
1088
    insert(codes.last, cmd)
1093
END caset;
1089
END fname;
1094
 
1090
 
Line 1109... Line 1105...
1109
VAR
1105
VAR
1110
    lib: IMPORT_LIB;
1106
    lib: IMPORT_LIB;
1111
    p:   IMPORT_PROC;
1107
    p:   IMPORT_PROC;
Line 1112... Line 1108...
1112
 
1108
 
1113
BEGIN
1109
BEGIN
1114
    lib := codes.import.first(IMPORT_LIB);
1110
    lib := codes._import.first(IMPORT_LIB);
1115
    WHILE (lib # NIL) & (lib.name # dll) DO
1111
    WHILE (lib # NIL) & (lib.name # dll) DO
1116
        lib := lib.next(IMPORT_LIB)
1112
        lib := lib.next(IMPORT_LIB)
Line 1117... Line 1113...
1117
    END;
1113
    END;
1118
 
1114
 
1119
    IF lib = NIL THEN
1115
    IF lib = NIL THEN
1120
        NEW(lib);
1116
        NEW(lib);
1121
        lib.name := dll;
1117
        lib.name := dll;
1122
        lib.procs := LISTS.create(NIL);
1118
        lib.procs := LISTS.create(NIL);
Line 1123... Line 1119...
1123
        LISTS.push(codes.import, lib)
1119
        LISTS.push(codes._import, lib)
1124
    END;
1120
    END;
1125
 
1121
 
Line 1151... Line 1147...
1151
    DEC(imp(IMPORT_PROC).count);
1147
    DEC(imp(IMPORT_PROC).count);
1152
    IF imp(IMPORT_PROC).count = 0 THEN
1148
    IF imp(IMPORT_PROC).count = 0 THEN
1153
        lib := imp(IMPORT_PROC).lib;
1149
        lib := imp(IMPORT_PROC).lib;
1154
        LISTS.delete(lib.procs, imp);
1150
        LISTS.delete(lib.procs, imp);
1155
        IF lib.procs.first = NIL THEN
1151
        IF lib.procs.first = NIL THEN
1156
            LISTS.delete(codes.import, lib)
1152
            LISTS.delete(codes._import, lib)
1157
        END
1153
        END
1158
    END
1154
    END
1159
END DelImport;
1155
END DelImport;
Line 1167... Line 1163...
1167
BEGIN
1163
BEGIN
1168
    commands := C.create();
1164
    commands := C.create();
1169
    variables := C.create();
1165
    variables := C.create();
Line 1170... Line 1166...
1170
 
1166
 
1171
    CPU := pCPU;
-
 
1172
    endianness := little_endian;
-
 
1173
    CASE CPU OF
-
 
1174
    |TARGETS.cpuAMD64:  numRegsFloat := 6
-
 
1175
    |TARGETS.cpuX86:    numRegsFloat := 8
-
 
1176
    |TARGETS.cpuMSP430: numRegsFloat := 0
-
 
1177
    |TARGETS.cpuTHUMB:  numRegsFloat := 256
-
 
Line 1178... Line 1167...
1178
    END;
1167
    CPU := pCPU;
1179
 
1168
 
1180
    NEW(codes.begcall);
1169
    NEW(codes.begcall);
1181
    codes.begcall.top := -1;
1170
    codes.begcall.top := -1;
1182
    NEW(codes.endcall);
1171
    NEW(codes.endcall);
1183
    codes.endcall.top := -1;
1172
    codes.endcall.top := -1;
1184
    codes.commands := LISTS.create(NIL);
1173
    codes.commands := LISTS.create(NIL);
1185
    codes.export   := LISTS.create(NIL);
1174
    codes.export   := LISTS.create(NIL);
1186
    codes.import   := LISTS.create(NIL);
1175
    codes._import  := LISTS.create(NIL);
Line 1187... Line 1176...
1187
    codes.types    := CHL.CreateIntList();
1176
    codes.types    := CHL.CreateIntList();
1188
    codes.data     := CHL.CreateByteList();
1177
    codes.data     := CHL.CreateByteList();
Line 1193... Line 1182...
1193
 
1182
 
Line 1194... Line 1183...
1194
    AddRec(0);
1183
    AddRec(0);
Line 1195... Line -...
1195
 
-
 
1196
    codes.lcount := 0;
-
 
1197
 
1184
 
1198
    codes.fregs := 0;
1185
    codes.lcount := 0;
1199
 
1186
 
Line 1200... Line 1187...
1200
    FOR i := 0 TO LEN(codes.charoffs) - 1 DO
1187
    FOR i := 0 TO LEN(codes.charoffs) - 1 DO