128 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
.In
 | 
						|
.SH
 | 
						|
B. IMPLEMENTATION
 | 
						|
.SH
 | 
						|
B.1. Excerpts from the non-optimized EM_table
 | 
						|
.PP
 | 
						|
Even though the non-optimized version of the EM_table is relatively
 | 
						|
straight-forward, examples have never hurt anybody.
 | 
						|
One of the simplest instructions is the \*(Siloc\*(So, which appears in
 | 
						|
our EM_table as follows:
 | 
						|
.DS
 | 
						|
\f6
 | 
						|
.TA 8 16 24 32 40 48 56 64
 | 
						|
C_loc	==>	"set	$1, T1";
 | 
						|
		"dec	4, SP";
 | 
						|
		"st	T1, [SP]".
 | 
						|
\f1
 | 
						|
.DE
 | 
						|
Just as \*(SiSP\*(So is an alias for \*(Si%l0\*(So, \*(SiT1\*(So is
 | 
						|
an alias for \*(Si%g1\*(So.
 | 
						|
A little more complex is the \*(Siadi\*(So which performs integer
 | 
						|
addition.
 | 
						|
.DS
 | 
						|
\f6
 | 
						|
C_adi	==>	"ld	[SP], T1";
 | 
						|
		"ld	[SP+4], T2";
 | 
						|
		"add	T1, T2, T3";
 | 
						|
		"st	T3, [SP+4];
 | 
						|
		"inc	4, SP".
 | 
						|
\f1
 | 
						|
.DE
 | 
						|
We could go on with even more complex instructions, but since that would
 | 
						|
not contribute to anything the reader is referred to the implementation
 | 
						|
for more details.
 | 
						|
.SH
 | 
						|
B.2. Excerpts from the optimized EM_table
 | 
						|
.PP
 | 
						|
The optimized EM_table uses the cache primitives mentioned in chapter 4.
 | 
						|
This means that the \*(Siloc\*(So this time appears as
 | 
						|
.DS
 | 
						|
\f6
 | 
						|
C_loc	==>	push_const($1).
 | 
						|
\f1
 | 
						|
.DE
 | 
						|
The \*(Silol\*(So can now be written as
 | 
						|
.DS
 | 
						|
\f6
 | 
						|
C_lol	==>	push_reg(LB);
 | 
						|
		inc_tos($1);
 | 
						|
		push_const(4);
 | 
						|
		C_los(4).
 | 
						|
\f1
 | 
						|
.DE
 | 
						|
Due to the law of conservation of misery somebody has to do the dirty work.
 | 
						|
In this case, it is the \*(Silos\*(So. To show just a small part of
 | 
						|
the implementation of the \*(Silos\*(So:
 | 
						|
.DS
 | 
						|
\f6
 | 
						|
C_los	$1 == 4	==>
 | 
						|
		if (type_of_tos() == T_cst) {
 | 
						|
			arith size;
 | 
						|
			const_str_t n;
 | 
						|
 | 
						|
			size= pop_const();
 | 
						|
			if (size <= 4) {
 | 
						|
				reg_t a;
 | 
						|
				reg_t a;
 | 
						|
				char *LD;
 | 
						|
 | 
						|
				switch (size) {
 | 
						|
				case 1:	LD = "ldub"; break;
 | 
						|
				case 2:	LD = "lduh"; break;
 | 
						|
				case 4:	LD = "ld"; break;
 | 
						|
				default:	arg_error("C_los", size);
 | 
						|
				}
 | 
						|
				a = pop_reg_c13(n);
 | 
						|
				b = alloc_reg();
 | 
						|
				"$LD	[$a+$n], $b";
 | 
						|
				push_reg(b);
 | 
						|
				free_reg(a);
 | 
						|
			} else ...
 | 
						|
\f1
 | 
						|
.DE
 | 
						|
For the full implementation, the reader is again referred to the actual
 | 
						|
implementation. Just to show how other instructions are affected
 | 
						|
by the optimization we will show that implementation of the \*(Sitge\*(So
 | 
						|
instruction:
 | 
						|
.DS
 | 
						|
\f6
 | 
						|
C_tge	==>	{
 | 
						|
			reg_t a;
 | 
						|
			reg_t b;
 | 
						|
 | 
						|
			a = pop_reg();
 | 
						|
			b = alloc_reg();
 | 
						|
			"	tst	$a";
 | 
						|
			"	bge,a	1f";
 | 
						|
			"	mov	1, $b";		/* delay slot */
 | 
						|
			"	set	0, $b";
 | 
						|
			"1:";
 | 
						|
			free_reg(a);
 | 
						|
			push_reg(b);
 | 
						|
		}.
 | 
						|
 | 
						|
\f1
 | 
						|
.DE
 | 
						|
.SH
 | 
						|
.bp
 | 
						|
CREDITS
 | 
						|
.PP
 | 
						|
In order of appearance:
 | 
						|
.TS
 | 
						|
center;
 | 
						|
r c l.
 | 
						|
Original idea	-	Dick Grune
 | 
						|
Design & implementation	-	Philip Homburg
 | 
						|
	-	Raymond Michiels
 | 
						|
Tutor	-	Dick Grune
 | 
						|
Assistant Tutor	-	Ceriel Jacobs
 | 
						|
Proofreading	-	Dick Grune
 | 
						|
	-	Hans van Eck
 | 
						|
.TE
 | 
						|
.SH
 | 
						|
REFERENCES
 | 
						|
.PP
 | 
						|
.[
 | 
						|
$LIST$
 | 
						|
.]
 |