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 |