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 |