[Oberon] Intermediate scopes in Oberon-07
Andreas Pirklbauer
andreas_pirklbauer at yahoo.com
Sun Feb 25 13:27:58 CET 2018
> 3) Procedure variables. In the compiler, this comes for free.
ADDENDUM: Actually, on RISC (used in PO2013), the run-time overhead
of calling a procedure VARIABLE p versus a procedure P is as follows:
Calling a procedure P directly (assume P declared local to module M):
BL -8 ; BL (i.e. branch using a 24bit offset as dest addr, modifier u = 0)
Calling a procedure variable p:
LDR SB R0 8 ; get static base (will be fixed up to 'LDR SB MT mno' by module loader)
LDR R0 SB 0 ; R0 := M[SB] = value stored in procedure variable p
BLEQ MT ; generate TRAP if it is zero
BL R0 ; BLR (i.e. branch using a REGISTER as dest addr, modifier u = 1)
For procedures whose body is large, this extra overhead may be
viewed as negligible, but for short procedures it may be significant
relative to the execution time of the (rest of the) procedure body.
This would suggest that KEEPING procedure forward references in the
language may have been worth considering (as their procedure calls
are of course compiled into the same single BL instruction as for P).
But they are inherently nasty to deal with in a compiler (which must
check equality of headers, etc) which is why they have been eliminated.
Andreas
Test program:
=============
MODULE M;
VAR p: PROCEDURE;
PROCEDURE P; BEGIN END P;
BEGIN P; p
END M.
ORP.Compile M.Mod ~
ORTool.DecObj M.rsc ~
# code for procedure P (generated by ORP.ProcedureDecl)
0 4EE90004 SUB SP SP 4
1 AFE00000 STR LNK SP 0
2 8FE00000 LDR LNK SP 0
3 4EE80004 ADD SP SP 4
4 C700000F B LNK
# module entry code (generated by ORG.Header)
5 4EE90004 SUB SP SP 4
6 AFE00000 STR LNK SP 0
# code for calling procedure P directly (offset -8, i.e. the BL branches to 0)
7 F7FFFFF8 BL -8 ; BL (i.e. branch using a 24bit offset as dest addr, modifier u = 0)
# code for calling procedure *variable* p
8 8D000008 LDR SB R0 8 ; get static base (will be fixed up to 'LDR SB MT mno' by module loader)
9 80D00000 LDR R0 SB 0 ; R0 := M[SB] = value stored in procedure variable p
10 D1004C5C BLEQ MT ; generate TRAP if it is zero
11 D7000000 BL R0 ; BLR (i.e. branch using a REGISTER as dest addr, modifier u = 1)
# module exit code (generated by ORG.Close)
12 8FE00000 LDR LNK SP 0
13 4EE80004 ADD SP SP 4
14 C700000F B LNK
More information about the Oberon
mailing list