negative 16-bit argument divided by the wordsize
.PT .s<num>
shortie with <num> as high order argument byte
-.PT .sw<num>
+.PT .w<num>
shortie with argument divided by the wordsize
.PT .<num>
mini with <num> as argument
.VS 1 1
.IE
The dispatch table for the 256 primary opcodes:
-.DS B
-.ta 7n 16n 25n 34n 43n 52n 61n 70n
- 0 loc.0 loc.1 loc.2 loc.3 loc.4 loc.5 loc.6 loc.7
- 8 loc.8 loc.9 loc.10 loc.11 loc.12 loc.13 loc.14 loc.15
- 16 loc.16 loc.17 loc.18 loc.19 loc.20 loc.21 loc.22 loc.23
- 24 loc.24 loc.25 loc.26 loc.27 loc.28 loc.29 loc.30 loc.31
- 32 loc.32 loc.33 aar.1W adf.s0 adi.1W adi.2W adp.l adp.1
- 40 adp.2 adp.s0 adp.s\-1 ads.1W and.1W asp.1W asp.2W asp.3W
- 48 asp.4W asp.5W asp.w0 beq.l beq.s0 bge.s0 bgt.s0 ble.s0
- 56 blm.s0 blt.s0 bne.s0 bra.l bra.s\-1 bra.s\-2 bra.s0 bra.s1
- 64 cal.1 cal.2 cal.3 cal.4 cal.5 cal.6 cal.7 cal.8
- 72 cal.9 cal.10 cal.11 cal.12 cal.13 cal.14 cal.15 cal.16
- 80 cal.17 cal.18 cal.19 cal.20 cal.21 cal.22 cal.23 cal.24
- 88 cal.25 cal.26 cal.27 cal.28 cal.s0 cff.z cif.z cii.z
- 96 cmf.s0 cmi.1W cmi.2W cmp.z cms.s0 csa.1W csb.1W dec.z
- 104 dee.w0 del.w\-1 dup.1W dvf.s0 dvi.1W fil.l inc.z ine.lw
- 112 ine.w0 inl.\-1W inl.\-2W inl.\-3W inl.w\-1 inn.s0 ior.1W ior.s0
- 120 lae.l lae.w0 lae.w1 lae.w2 lae.w3 lae.w4 lae.w5 lae.w6
- 128 lal.p lal.n lal.0 lal.\-1 lal.w0 lal.w\-1 lal.w\-2 lar.W
- 136 ldc.0 lde.lw lde.w0 ldl.0 ldl.w\-1 lfr.1W lfr.2W lfr.s0
- 144 lil.w\-1 lil.w0 lil.0 lil.1W lin.l lin.s0 lni.z loc.l
- 152 loc.\-1 loc.s0 loc.s\-1 loe.lw loe.w0 loe.w1 loe.w2 loe.w3
- 160 loe.w4 lof.l lof.1W lof.2W lof.3W lof.4W lof.s0 loi.l
- 168 loi.1 loi.1W loi.2W loi.3W loi.4W loi.s0 lol.pw lol.nw
- 176 lol.0 lol.1W lol.2W lol.3W lol.\-1W lol.\-2W lol.\-3W lol.\-4W
- 184 lol.\-5W lol.\-6W lol.\-7W lol.\-8W lol.w0 lol.w\-1 lxa.1 lxl.1
- 192 lxl.2 mlf.s0 mli.1W mli.2W rck.1W ret.0 ret.1W ret.s0
- 200 rmi.1W sar.1W sbf.s0 sbi.1W sbi.2W sdl.w\-1 set.s0 sil.w\-1
- 208 sil.w0 sli.1W ste.lw ste.w0 ste.w1 ste.w2 stf.l stf.W
- 216 stf.2W stf.s0 sti.1 sti.1W sti.2W sti.3W sti.4W sti.s0
- 224 stl.pw stl.nw stl.0 stl.1W stl.\-1W stl.\-2W stl.\-3W stl.\-4W
- 232 stl.\-5W stl.w\-1 teq.z tgt.z tlt.z tne.z zeq.l zeq.s0
- 240 zeq.s1 zer.s0 zge.s0 zgt.s0 zle.s0 zlt.s0 zne.s0 zne.s\-1
- 248 zre.lw zre.w0 zrl.\-1W zrl.\-2W zrl.w\-1 zrl.nw escape1 escape2
-.DE 2
+.N 1
+.so dispat1
+.N 2
The list of secondary opcodes (escape1):
-.N 1
-.DS B
-.ta 7n 16n 25n 34n 43n 52n 61n 70n
- 0 aar.l aar.z adf.l adf.z adi.l adi.z ads.l ads.z
- 8 adu.l adu.z and.l and.z asp.lw ass.l ass.z bge.l
- 16 bgt.l ble.l blm.l bls.l bls.z blt.l bne.l cai.z
- 24 cal.l cfi.z cfu.z ciu.z cmf.l cmf.z cmi.l cmi.z
- 32 cms.l cms.z cmu.l cmu.z com.l com.z csa.l csa.z
- 40 csb.l csb.z cuf.z cui.z cuu.z dee.lw del.pw del.nw
- 48 dup.l dus.l dus.z dvf.l dvf.z dvi.l dvi.z dvu.l
- 56 dvu.z fef.l fef.z fif.l fif.z inl.pw inl.nw inn.l
- 64 inn.z ior.l ior.z lar.l lar.z ldc.l ldf.l ldl.pw
- 72 ldl.nw lfr.l lil.pw lil.nw lim.z los.l los.z lor.s0
- 80 lpi.l lxa.l lxl.l mlf.l mlf.z mli.l mli.z mlu.l
- 88 mlu.z mon.z ngf.l ngf.z ngi.l ngi.z nop.z rck.l
- 96 rck.z ret.l rmi.l rmi.z rmu.l rmu.z rol.l rol.z
- 104 ror.l ror.z rtt.z sar.l sar.z sbf.l sbf.z sbi.l
- 112 sbi.z sbs.l sbs.z sbu.l sbu.z sde.l sdf.l sdl.pw
- 120 sdl.nw set.l set.z sig.z sil.pw sil.nw sim.z sli.l
- 128 sli.z slu.l slu.z sri.l sri.z sru.l sru.z sti.l
- 136 sts.l sts.z str.s0 tge.z tle.z trp.z xor.l xor.z
- 144 zer.l zer.z zge.l zgt.l zle.l zlt.l zne.l zrf.l
- 152 zrf.z zrl.pw dch.z exg.s0 exg.l exg.z lpb.z gto.l
-.DE 2
+.N 1
+.so dispat2
+.N 2
Finally, the list of opcodes with four byte arguments (escape2).
-.DS
-.ta 7n 16n 25n 34n 43n 52n 61n 70n
- 0 loc
-.DE 0
+.N 1
+.so dispat3
.BP
.AP "AN EXAMPLE PROGRAM"
-.DS B
+.A 1 0
+.NA
.ta 4n 8n 12n 16n 20n
+.nf
1 program example(output);
2 {This program just demonstrates typical EM code.}
3 type rec = record r1: integer; r2:real; r3: boolean end;
38 mi := 99;
39 test(r)
40 end.
-.DE 0
+.fi
+.AD
.BP
The EM code as produced by the Pascal-VU compiler is given below. Comments
have been added manually. Note that this code has already been optimized.
-.DS B
+.A 1 0
+.NA
+.nf
.ta 1n 24n
mes 2,2,2 ; wordsize 2, pointersize 2
-.1
+\&.1
rom 't.p\e000' ; the name of the source file
hol 552,\-32768,0 ; externals and buf occupy 552 bytes
exp $sum ; sum can be called from other modules
adi 2 ; add them
ret 2 ; return the result
end 2 ; end of procedure ( still two bytes local storage )
-.2
+\&.2
rom 1,99,2 ; descriptor of array a[]
exp $test ; the compiler exports all level 0 procedures
pro $test,226 ; procedure test, 226 bytes local storage
-.3
+\&.3
rom 4.8F8 ; assemble Floating point 4.8 (8 bytes) in
-.4 ; global storage
+\&.4 ; global storage
rom 0.5F8 ; same for 0.5
mes 3,\-226,2,2 ; compiler temporary not referenced by address
mes 3,\-24,2,0 ; the same is true for i, j, b and c in test
lni ; lin 26 prior to optimization
loc 1
stl \-2 ; for i:= 1
- 2
+2
lol \-2
dup 2
mli 2 ; i*i
beq *3 ; to 100 do
inl \-2 ; increment i and loop
bra *2
- 3
+3
lin 27
lol \-4
loc 27
asp 4 ; remove parameters from stack
lfr 2 ; get function result
stl \-2 ; i :=
- 4
+4
lin 31
lol \-2
zle *5 ; while i > 0 do
stl \-4 ; j := j + r.r1
del \-2 ; i := i - 1
bra *4 ; loop
- 5
+5
lin 32
lol 0
stl \-226 ; make copy of address of r
end 226
exp $_main
pro $_main,0 ; main program
-.6
+\&.6
con 2,\-1,22 ; description of external files
-.5
+\&.5
rom 15.96F8
fil .1 ; maintain source file name
lae .6 ; description of external files
asp 2
end 0
mes 5 ; reals were used
-.DE 0
+.fi
+.AD
+.A 1 0
The compact code corresponding to the above program is listed below.
Read it horizontally, line by line, not column by column.
Each number represents a byte of compact code, printed in decimal.
procedures greatly reduces the value of registers to hold local variables
because the large number of procedure calls implies a large overhead in
saving and restoring the registers at every call.
-.BP
.P
Although there are no general purpose registers, there are a
few internal registers with specific functions as follows:
.N 1
.TS
tab(:);
-l 1 l l.
+l 1 l l l.
PC:\-:Program Counter:Pointer to next instruction
-LB:\-:Local Base:Points to base of the local variables \
-in the current procedure.
+LB:\-:Local Base:Points to base of the local variables
+:::in the current procedure.
SP:\-:Stack Pointer:Points to the highest occupied word on the stack.
HP:\-:Heap Pointer:Points to the top of the heap area.
.TE 1