1 "$Id: table,v 2.7 1994/06/24 13:55:18 ceriel Exp $"
2 /********************************************************************
4 **** Z 8 0 B A C K E N D T A B L E S ****
6 ********************************************************************/
11 * INTEGER SIZE: 16 bits
12 * POINTER SIZE: 16 bits
16 /* We store LB in the iy index-register, because this results in the
17 * cheapest addressing schemes for instruction like lol and stl.
18 * For a lol with an argument that is too low (< 0-128) or too high
19 * (>= 127) there is an overhead, because the offset cannot be
20 * expressed in 8 bits. In these cases we copy the LB to the hl-register,
21 * compute the required address and use register indirect mode to do
22 * the load. These cases occur rarely (about 11.5 % in C and 5.5 %
31 /**************************
32 ** R E G I S T E R S **
33 **************************/
38 AA = ("a",1) REG1, AREG.
47 BC = ("bc",2,BB,CC) REG, GEN_REG, BC_REG, ANY_REG.
48 DE = ("de",2,DD,EE) REG, GEN_REG, DE_REG, ANY_REG.
49 HL = ("hl",2,HH,LL) GEN_REG, HL_REG, ANY_REG.
51 LB = ("iy",2) LOCALBASE.
52 IX = ("ix",2) INDEXREG, IX_REG, ANY_REG.
56 pseudo0 = ("",2,BC,DE).
57 pseudo1 = ("",2,HL,IX).
58 pseudo2 = ("",2,pseudo0,pseudo1).
59 pseudo3 = ("",2,pseudo2,AA) ALL_REG.
68 IMMEDIATE1 = {INT off;} 1 "%[off]"
69 IMMEDIATE = {INT off;} 2 "%[off]"
70 IREG1 = {REGISTER reg;} 1 "(%[reg])"
71 INDEXED = {REGISTER reg;
72 INT off; } 1 "(%[reg]+%[off])"
73 EXTENDED = {STRING off; } 2 "(%[off])"
74 LOCAL_ADDR = {INT off; } 2
75 EXTENDED_ADDR = {STRING off; } 2 "%[off]"
79 /*************************************
80 ** T O K E N E X P R E S S I O N S **
81 *************************************/
85 ANYTOK = IMMEDIATE + EXTENDED
86 ANY1 = REG1 + IMMEDIATE1 + IREG1 + INDEXED
87 ANY_ADDR = EXTENDED_ADDR + LOCAL_ADDR
88 ANY = ANYTOK + ANY_REG + ANY_ADDR
89 MEM_ALL = ANY - ANY_REG
90 REG_SCR = REG * SCRATCH
92 ANY_REG_SCR = ANY_REG * SCRATCH
93 GEN_REG_SCR = GEN_REG * SCRATCH
94 HL_REG_SCR = HL_REG * SCRATCH
95 BC_REG_SCR = BC_REG * SCRATCH
96 DE_REG_SCR = DE_REG * SCRATCH
97 IX_REG_SCR = IX_REG * SCRATCH
111 /* G R O U P I : L O A D S */
114 loc | | | {IMMEDIATE,$1} | |
115 ldc | | | {IMMEDIATE,highw(1)} {IMMEDIATE,loww(1)} | |
116 lol sfit($1,8) | | allocate(REG)
117 move({INDEXED,LB,$1} , %[a.2] )
118 move({INDEXED,LB,$1+1} , %[a.1] ) | %[a] | |
119 lol | | allocate(HL_REG,REG)
122 move({IMMEDIATE,$1} , %[a] )
128 erase(%[a]) | %[b] | |
129 ldl $1<126 && $1>0-128 | | allocate(REG,REG)
130 move({INDEXED,LB,$1} , %[a.2])
131 move({INDEXED,LB,$1+1},%[a.1])
132 move({INDEXED,LB,$1+2},%[b.2])
133 move({INDEXED,LB,$1+3},%[b.1]) | %[b] %[a] | |
136 allocate(BC_REG,DE_REG,HL_REG={IMMEDIATE,$1})
148 loe | | | {EXTENDED,$1} | |
149 lde | | | {EXTENDED,$1+"+2"} {EXTENDED,$1} | |
150 lil sfit($1,8) | | allocate(HL_REG,REG)
151 move({INDEXED,LB,$1} , %[a.2])
152 move({INDEXED,LB,$1+1} , %[a.1])
157 erase(%[a]) | %[b] | |
158 lil | | allocate(HL_REG = {IMMEDIATE,$1} , REG)
171 erase(%[a]) | %[b] | |
172 lof | HL_REG_SCR | allocate(REG = {IMMEDIATE,$1} )
178 erase(%[a]) | %[a] | |
179 ... | REG_SCR | allocate(HL_REG = {IMMEDIATE,$1} )
185 erase(%[1]) | %[1] | |
186 ldf | HL_REG_SCR | allocate(REG = {IMMEDIATE,$1} , REG)
196 erase(%[a]) | %[b] %[a] | |
197 ... | REG_SCR | allocate(HL_REG = {IMMEDIATE,$1} , REG)
207 erase(%[1]) | %[b] %[1] | |
209 allocate(HL_REG, REG = {IMMEDIATE,$1} )
213 erase(%[a]) | %[a] | |
214 lae | | | {EXTENDED_ADDR,$1} | |
215 lxl $1 == 0 | | remove(ALL)
219 allocate(AREG = {IMMEDIATE1,$1} ,
233 lxa $1 == 0 | | | | lxl $1 adp 4 |
234 lxa $1 == 1 | | remove(ALL)
235 allocate(HL_REG,BC_REG)
244 "add hl,%[b]" | HL | |
245 lxa $1 > 1 | | remove (ANY)
246 allocate(AREG = {IMMEDIATE1,$1},
263 loi $1 == 1 | HL_REG | allocate(REG = {IMMEDIATE,0} )
265 erase(%[a]) | %[a] | |
266 ... | REG | allocate(REG,AREG)
267 move({IREG1,%[1]} , AA)
269 move({IMMEDIATE1,0} , %[a.1])
271 loi $1 == 2 | HL_REG_SCR | remove(ALL) allocate(REG)
275 erase(%[1]) | %[a] | |
276 loi $1 == 4 | HL_REG_SCR | remove(ALL)
286 erase(HL) | HL %[b] | |
287 loi $1 <= 511 && $1 > 4 | HL_REG_SCR |
290 move({IMMEDIATE,$1-1} , %[b])
292 move({IMMEDIATE1,$1/2} , AA)
303 loi $1 > 511 | STACK | remove(ALL) allocate(ALL_REG)
304 move({IMMEDIATE,$1}, HL)
308 los $1 == 2 | STACK | remove(ALL) allocate(ALL_REG)
310 lpi | | | {EXTENDED_ADDR,$1} | |
314 /* G R O U P II : S T O R E S */
318 stl sfit($1,8) | REG + HL_REG |
320 move(%[1.2] , {INDEXED,LB,$1} )
321 move(%[1.1] , {INDEXED,LB,$1+1} )
325 allocate(HL_REG = {IMMEDIATE,$1} , REG)
333 ste | ANY_REG | remove(EXTENDED,%[off] == $1)
335 move(%[1] , {EXTENDED,$1} ) | | |
336 sil ($1 >= 0-128 && $1 < 127) | REG |
339 move({INDEXED,LB,$1} , %[a.2])
340 move({INDEXED,LB,$1+1} , %[a.1])
345 sil ($1 < 0-128 || $1 >= 127) | REG |
350 move({IMMEDIATE,$1} , %[a])
361 stf | HL_REG_SCR REG | remove(ALL)
362 allocate(REG = {IMMEDIATE,$1})
368 sti $1 == 1 | HL_REG REG | remove(ALL)
369 "ld (hl),%[2.2]" | | |
370 sti $1 == 2 | HL_REG_SCR REG | remove(ALL)
375 sti $1 == 4 | HL_REG_SCR REG REG |
385 sti $1 <= 511 && $1 > 4 | HL_REG_SCR |
388 move({IMMEDIATE1,$1/2} , AA)
399 sti $1 > 511 | STACK | remove(ALL) allocate(ALL_REG)
400 move({IMMEDIATE,$1}, HL)
404 sts $1 == 2 | STACK | remove(ALL) allocate(ALL_REG)
406 sdl ($1 >= 0-128 && $1 < 125) | REG REG |
408 move(%[1.2] , {INDEXED,LB,$1})
409 move(%[1.1] , {INDEXED,LB,$1+1})
410 move(%[2.2] , {INDEXED,LB,$1+2})
411 move(%[2.1] , {INDEXED,LB,$1+3}) | | |
412 sdl ($1 < 0-128 || $1 >= 125) | STACK |
414 allocate(HL_REG = {IMMEDIATE,$1} ,
415 BC_REG,DE_REG,IX_REG,AREG )
418 sde | ANY_REG ANY_REG |
420 move(%[1] , {EXTENDED,$1})
421 move(%[2] , {EXTENDED,$1+"+2"}) | | |
424 move({IMMEDIATE,$1},DE)
430 /* G R O U P III & IV : I N T E G E R A R I T H M E T I C */
434 adi $1 == 2 | HL_REG_SCR GEN_REG |
437 ... | GEN_REG HL_REG_SCR |
440 adi $1 == 4 | HL_REG_SCR DE_REG_SCR STACK | allocate(BC_REG)
447 erase(HL) | HL DE | |
448 sbi $1 == 2 | GEN_REG HL_REG_SCR |
452 sbi $1 == 4 | BC_REG_SCR DE_REG_SCR STACK |
456 "sbc hl,bc" /* least sign. */
461 erase(HL) | HL DE | |
462 mli $1 == 2 | DE_REG_SCR BC_REG STACK |
463 allocate(HL_REG,IX_REG,AREG)
466 mli $1 == 4 | STACK | allocate(ALL_REG)
468 dvi $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
469 allocate(HL_REG,IX_REG,AREG)
474 dvi $1 == 4 | STACK | allocate(ALL_REG)
476 dvu $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
477 allocate(HL_REG,IX_REG,AREG)
481 dvu $1 == 4 | STACK | allocate(ALL_REG)
483 rmi $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
484 allocate(HL_REG,IX_REG,AREG)
488 rmi $1 == 4 | STACK | allocate(ALL_REG)
494 rmu $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
495 allocate(HL_REG,IX_REG,AREG)
499 rmu $1 == 4 | STACK | allocate(ALL_REG)
500 "call .dvu4" | BC DE | |
501 ngi $1 == 2 | REG | allocate(HL_REG = {IMMEDIATE,0})
505 ngi $1 == 4 | DE_REG_SCR BC_REG_SCR |
506 allocate(HL_REG,AREG)
515 erase(DE) | HL DE | |
516 sli $1 == 2 | REG_SCR HL_REG_SCR |
517 "inc %[1.1]" /* see if count >> 15 */
529 sli $1 == 4 | REG_SCR IX_REG_SCR HL_REG_SCR |
543 erase(IX) | HL IX | |
544 sri $1 == 2 | GEN_REG_SCR GEN_REG_SCR |
557 erase(%[2]) | %[2] | |
558 sri $1 == 4 | GEN_REG_SCR GEN_REG_SCR GEN_REG_SCR |
574 erase(%[3]) | %[3] %[2] | |
576 sru $1 == 2 | GEN_REG_SCR GEN_REG_SCR |
589 erase(%[2]) | %[2] | |
590 sru $1 == 4 | GEN_REG_SCR GEN_REG_SCR GEN_REG_SCR |
606 erase(%[3]) | %[3] %[2] | |
613 /* G R O U P V : F L O A T I N G P O I N T */
617 "call .unimpld" | | |
619 "call .unimpld" | | |
621 "call .unimpld" | | |
623 "call .unimpld" | | |
625 "call .unimpld" | | |
627 "call .unimpld" | | |
629 "call .unimpld" | | |
633 /* G R O U P VI : P O I N T E R A R I T H M E T I C */
637 adp $1 == 0 | | | | |
638 adp $1 == 1 | ANY_REG_SCR | "inc %[1]"
639 erase(%[1]) | %[1] | |
640 adp $1 == 2 | ANY_REG_SCR | "inc %[1]"
642 erase(%[1]) | %[1] | |
643 adp $1 == 0-1 | ANY_REG_SCR | "dec %[1]"
644 erase(%[1]) | %[1] | |
645 adp $1 == 0-2 | ANY_REG_SCR | "dec %[1]"
647 erase(%[1]) | %[1] | |
648 adp $1 < 0-2 || $1 > 2 | HL_REG_SCR |
649 allocate(REG = {IMMEDIATE,$1} )
653 allocate(HL_REG = {IMMEDIATE,$1} )
656 ... | LOCAL_ADDR | remove(ALL) | {LOCAL_ADDR, %[1.off]+$1} | |
657 ads $1 == 2 | HL_REG_SCR REG | remove(ALL) "add hl,%[2]"
659 ... | REG HL_REG_SCR | "add hl,%[1]"
661 sbs $1 == 2 | REG HL_REG_SCR | "or a"
667 /* G R O U P VII : I N C R E M E N T / D E C R E M E N T */
671 inc | ANY_REG_SCR | "inc %[1]"
672 erase(%[1]) | %[1] | |
674 /* There is no efficient way on the Z80 to increment or decrement
675 * a local or external. We first fetch the variable into a register,
676 * increment/decrement it and then store it.
679 inl | | | | lol $1 inc stl $1 |
680 ine | | | | loe $1 inc ste $1 |
681 dec | ANY_REG_SCR | "dec %[1]"
682 erase(%[1]) | %[1] | |
683 del | | | | lol $1 dec stl $1 |
684 dee | | | | loe $1 dec ste $1 |
685 zrl ($1 >= 0-128 && $1 < 127) | |
689 move(AA , {INDEXED,LB,$1})
690 move(AA , {INDEXED,LB,$1+1}) | | |
691 zrl ($1 < 0-128 || $1 >= 127) | |
693 allocate(HL_REG = {IMMEDIATE,$1} , REG, AREG)
703 "call .unimpld" | | |
704 zre | | remove(EXTENDED,%[off] == $1)
706 allocate(ANY_REG = {IMMEDIATE,0} )
707 move(%[a] , {EXTENDED,$1}) | | |
708 zer $1 == 2 | | | {IMMEDIATE,0} | |
709 zer $1 == 4 | | | {IMMEDIATE,0} {IMMEDIATE,0} | |
710 zer $1 > 4 && $1 < 256 | STACK |
712 allocate(BC_REG , GEN_REG)
722 /* G R O U P VIII : C O N V E R T */
726 cii | STACK | remove(ALL) allocate(ALL_REG)
728 cuu | STACK | remove(ALL) allocate(ALL_REG)
733 "call .unimpld" | | |
735 "call .unimpld" | | |
737 "call .unimpld" | | |
739 "call .unimpld" | | |
741 "call .unimpld" | | |
743 "call .unimpld" | | |
747 /* G R O U P IX : L O G I C A L */
751 and $1 == 2 | GEN_REG GEN_REG_SCR |
759 erase(%[2]) | %[2] | |
760 and defined($1) && $1 > 2 | STACK |
761 allocate(DE_REG = {IMMEDIATE,$1},
762 BC_REG,HL_REG,IX_REG,AREG)
765 and ! defined($1) | DE_REG_SCR STACK |
766 allocate(BC_REG,HL_REG,IX_REG,AREG)
769 ior $1 == 2 | GEN_REG GEN_REG_SCR |
777 erase(%[2]) | %[2] | |
778 ior defined($1) && $1 > 2 | STACK |
779 allocate(DE_REG = {IMMEDIATE,$1},
780 BC_REG,HL_REG,IX_REG,AREG)
783 ior ! defined($1) | DE_REG_SCR STACK |
784 allocate(BC_REG,HL_REG,IX_REG,AREG)
787 xor $1 == 2 | GEN_REG GEN_REG_SCR |
795 erase(%[2]) | %[2] | |
796 xor defined($1) && $1 > 2 | STACK |
797 allocate(DE_REG = {IMMEDIATE,$1},
798 BC_REG,HL_REG,IX_REG,AREG)
801 xor ! defined($1) | DE_REG_SCR STACK |
802 allocate(BC_REG,HL_REG,IX_REG,AREG)
805 com $1 == 2 | GEN_REG_SCR | allocate(AREG)
812 erase(%[1]) | %[1] | |
813 com defined($1) && $1 > 2 | STACK |
815 HL_REG = {IMMEDIATE,$1} )
829 com ! defined($1) | HL_REG_SCR STACK |
844 rol $1 == 2 | REG_SCR HL_REG_SCR |
858 rol $1 == 4 | REG IX_REG_SCR HL_REG_SCR |
873 erase(IX) | HL IX | |
874 ror $1 == 2 | GEN_REG_SCR GEN_REG_SCR |
889 erase(%[2]) | %[2] | |
890 ror $1 == 4 | GEN_REG_SCR GEN_REG_SCR GEN_REG_SCR |
908 erase(%[3]) | %[3] %[2] | |
912 /* G R O U P X : S E T S */
915 inn defined($1) | STACK | allocate(HL_REG = {IMMEDIATE,$1},
916 BC_REG,DE_REG,IX_REG,AREG)
919 inn !defined($1) | HL_REG_SCR STACK |
920 allocate(BC_REG,DE_REG,IX_REG,AREG)
923 set defined($1) | STACK | allocate(HL_REG = {IMMEDIATE,$1},
924 BC_REG,DE_REG,IX_REG,AREG)
927 set !defined($1) | HL_REG_SCR STACK |
928 allocate(BC_REG,DE_REG,IX_REG,AREG)
934 /* G R O U P XI : A R R A Y S */
937 lae aar $2 == 2 && rom(1,3) == 2 | STACK |
939 move({EXTENDED_ADDR,$1},BC)
942 lae aar $2 == 2 && rom(1,3) != 2 | STACK |
944 move({EXTENDED_ADDR,$1},BC)
952 aar !defined($1) | | remove(ALL)
955 lae lar $2 == 2 && rom(1,3) == 2 | STACK |
956 remove(ALL) allocate(ALL_REG)
957 move({EXTENDED_ADDR,$1},BC)
960 lae lar $2 == 2 && rom(1,3) != 2 | STACK |
961 remove(ALL) allocate(ALL_REG)
962 move({EXTENDED_ADDR,$1},BC)
965 lar $1==2 | | remove(ALL)
968 lar !defined($1) | | remove(ALL)
971 lae sar $2 == 2 && rom(1,3) == 2 | STACK |
972 remove(ALL) allocate(ALL_REG)
973 move({EXTENDED_ADDR, $1},BC)
976 lae sar $2 == 2 && rom(1,3) != 2 | STACK |
977 remove(ALL) allocate(ALL_REG)
978 move({EXTENDED_ADDR, $1},BC)
981 sar $1==2 | | remove(ALL)
984 sar !defined($1) | | remove(ALL)
989 /* G R O U P XII : C O M P A R E */
993 cmi $1 == 2 | REG_SCR HL_REG_SCR |
994 remove(ALL) allocate(AREG)
1006 erase(%[2]) | HL | |
1007 cmi $1 == 4 | STACK | remove(ALL) allocate(AREG = {IMMEDIATE1,1},
1008 BC_REG,DE_REG,HL_REG,IX_REG)
1011 cmu $1 == 2 | REG_SCR HL_REG_SCR |
1012 remove(ALL) allocate(AREG)
1014 "xor %[1.1]" /* resets carry bit */
1024 erase(%[2]) | HL | |
1025 cmu $1 == 4 | STACK | remove(ALL) allocate(AREG = {IMMEDIATE1,0},
1026 BC_REG,DE_REG,HL_REG,IX_REG)
1030 cms $1 == 2 | GEN_REG GEN_REG_SCR |
1031 remove(ALL) allocate(AREG)
1037 "ld %[2.2],a" | %[2] | |
1039 cmu defined($1) | STACK | allocate(HL_REG = {IMMEDIATE,$1},
1040 BC_REG,DE_REG,IX_REG,AREG)
1043 cmu ! defined($1) | HL_REG_SCR STACK |
1044 allocate(BC_REG,DE_REG,IX_REG,AREG)
1048 cms defined($1) | STACK | remove(ALL) allocate(HL_REG = {IMMEDIATE,$1},
1049 BC_REG,DE_REG,IX_REG,AREG)
1052 cms ! defined($1) | HL_REG_SCR STACK |
1053 allocate(BC_REG,DE_REG,IX_REG,AREG)
1060 tlt | GEN_REG | remove(ALL)
1061 allocate(GEN_REG = {IMMEDIATE,0})
1066 erase(%[a]) | %[a] | |
1067 tle | GEN_REG | remove(ALL)
1068 allocate(AREG, GEN_REG = {IMMEDIATE,1})
1079 erase(%[b]) | %[b] | |
1080 teq | GEN_REG | remove(ALL)
1081 allocate(AREG,GEN_REG = {IMMEDIATE,0})
1089 erase(%[b]) | %[b] | |
1090 tne | GEN_REG | remove(ALL)
1091 allocate(AREG, GEN_REG = {IMMEDIATE,0})
1097 erase(%[b]) | %[b] | |
1098 tge | GEN_REG | remove(ALL)
1099 allocate(GEN_REG = {IMMEDIATE,0})
1104 erase(%[a]) | %[a] | |
1105 tgt | GEN_REG | remove(ALL)
1106 allocate(AREG, GEN_REG = {IMMEDIATE,0})
1117 erase(%[b]) | %[b] | |
1121 /* G R O U P XIII : B R A N C H */
1127 blt | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
1133 ble | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
1144 beq | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
1152 bne | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
1161 bge | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
1167 bgt | GEN_REG GEN_REG_SCR | remove(ALL) allocate(AREG)
1180 zlt | GEN_REG | remove(ALL) "bit 7,%[1.1]"
1182 zle | GEN_REG | remove(ALL) allocate(AREG)
1191 zeq | GEN_REG | remove(ALL) allocate(AREG)
1195 zne | GEN_REG | remove(ALL) allocate(AREG)
1199 zge | GEN_REG | remove(ALL) "bit 7,%[1.1]"
1201 zgt | GEN_REG | remove(ALL) allocate(AREG)
1213 /* G R O U P XIV : P R O C E D U R E C A L L S */
1217 cai | HL_REG | remove(ALL)
1228 lfr $1 == 2 | | remove(ALL)
1231 lfr $1 == 4 | STACK | "push de"
1234 move({IMMEDIATE,$1},DE)
1237 ret $1 == 0 | STACK |
1239 allocate(HL_REG,LOCALBASE)
1245 ret $1 == 2 | STACK | remove(ALL)
1246 allocate(HL_REG,DE_REG,LOCALBASE)
1253 ret $1 == 4 | STACK |
1255 allocate(BC_REG, DE_REG, HL_REG, LOCALBASE)
1264 move({IMMEDIATE,$1},DE)
1270 /* G R O U P XV : M I S C E L L A N E O U S */
1274 asp $1 == 0 | | | | |
1275 asp $1 != 0 | STACK | remove(ALL) allocate(HL_REG)
1276 move({IMMEDIATE,$1} , HL)
1280 ass $1 == 2 | HL_REG_SCR STACK |
1285 blm $1 == 0 | | | | |
1286 blm $1 > 0 |DE_REG_SCR HL_REG_SCR |
1288 allocate(BC_REG = {IMMEDIATE,$1} )
1293 bls $1 == 2 | BC_REG_SCR DE_REG_SCR HL_REG_SCR |
1299 csa $1 == 2 | STACK | allocate(ALL_REG)
1301 csb $1 == 2 | STACK | allocate(ALL_REG)
1303 dus $1 == 2 | BC_REG_SCR | remove(MEM_ALL) allocate(HL_REG,DE_REG)
1304 move({IMMEDIATE,0} , HL)
1307 "ld e,l" /* destination */
1308 "sbc hl,bc" /* source */
1314 dup $1 == 2 | ANY | | %[1] %[1] | |
1315 dup $1 == 4 | ANY ANY | | %[2] %[1] %[2] %[1] | |
1316 dup $1 == 6 | ANY ANY ANY | | %[3] %[2] %[1] %[3] %[2] %[1] | |
1317 dup $1 > 6 | STACK | allocate(HL_REG,BC_REG,DE_REG)
1318 move({IMMEDIATE,0} , HL)
1321 "ld e,l" /* destination */
1322 move ({IMMEDIATE,$1},BC) /* count */
1323 "sbc hl,bc" /* source */
1329 lor $1 == 0 | | "push iy" | | |
1330 fil | | allocate(HL_REG)
1331 move({EXTENDED_ADDR,$1},HL)
1334 lor $1 == 1 | STACK | allocate(HL_REG)
1335 move({IMMEDIATE,0} , HL)
1338 lor $1 == 2 | STACK | | {EXTENDED,".reghp"} | |
1339 exg $1 == 2 | ANY ANY | | %[1] %[2] | |
1340 exg | STACK | remove(MEM_ALL)
1342 move({IMMEDIATE,$1},HL)
1347 move({EXTENDED_ADDR,$1},HL)
1350 lim | | | {EXTENDED,"ignmask"} | |
1351 lin | | remove(ALL) allocate(HL_REG)
1352 move({IMMEDIATE,$1},HL)
1355 lni | | allocate(HL_REG)
1366 rck $1 == 2 | STACK | allocate(ALL_REG)
1375 sim | HL_REG | remove(MEM_ALL)
1377 "ld (ignmask),hl" | | |
1378 str $1 == 0 | | "pop iy" | | |
1379 str $1 == 1 | STACK | allocate(HL_REG)
1382 str $1 == 2 | STACK | allocate(ALL_REG)
1388 mon | | remove(MEM_ALL)
1393 /* C O E R C I O N S */
1397 /* from 4 bytes to 2 */
1401 | ANYTOK | allocate(ANY_REG)
1402 move(%[1],%[a]) | %[a] | |
1404 | STACK | allocate(ANY_REG)
1405 "pop %[a]" | %[a] | |
1406 | LOCAL_ADDR | allocate(ANY_REG)
1410 | IMMEDIATE | allocate(ANY_REG)
1415 /* between registers */
1417 | GEN_REG | allocate(GEN_REG)
1419 "ld %[a.2],%[1.2]" | %[a] | |
1420 | LOCALBASE | allocate(ANY_REG)
1422 "pop %[a]" | %[a] | |
1432 (ANY,ANY,"ld %[2],%[1]")
1433 (ANY1,ANY1,"ld %[2],%[1]")
1445 (ANY_REG, , "push %[1]" )
1446 (MEM_ALL, ANY_REG, move(%[1],%[a])
1448 (MEM_ALL, , "push hl"