Assembler typing , PTB 2011 % Try something like ...

2 downloads 177 Views 101KB Size Report
A register type layout (RT) is a list of 32 types for 32 registers ,. % in order . %. % ..... Register names can be used to stand in for numbers. %. %. Register = R ...
% Assembler t y p i n g , PTB 2011

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

Try s o m e t h i n g l i k e vn (T, p ( main ) ,RT1−>RT2 , 5 ) . = t h e t h e o r y t h a t i s d e v e l o p e d , and i s i n t e r e s t i n g − i t ’ s t h e t a b l e of the r e g i s t e r type l a y o u t s transform at every entry address RT1 = t h e i n i t i a l r e g i s t e r l a y o u t b e f o r e e x e c u t i o n o f t h e program RT2 = t h e f i n a l r e g i s t e r t y p e l a y o u t a f t e r e x e c u t i o n o f t h e program 5 = number o f t i m e s round t h e c o m p u t a t i o n l o o k i n g f o r f i x p o i n t , an i n p u t

T

For an even more e x c i t i n g time , t r y vn ( , p ( main ) , r t (RT1)−> r t (RT2) , 5 ) , nth0 (N, RT1,X) , nth0 (N, RT2,Y) , ( atom (X) ; n o t ( atom (X) ) , atom (Y) ; v a r (X) , v a r (Y) , n o t (X==Y) ) , e q u a l s R ( r (R) , n (N) ) . and p r e s s ’ n ’ f o r a w h i l e . Each p r e s s s h o u l d r e v e a l a r e g i s t e r R f o r which t h e e n t r y t y p e X and t h e e x i t t y p e Y d i f f e r . Looking a t i t i m p e r a t i v e l y , vn (T, a (A) ,RT1−>RT2,N) works t h r o u g h t h e program a t addr A i n t h e c o n t e x t o f t h e o r y T, p r o d u c i n g t h e r e g i s t e r t y p e l a y o u t RT2 a t r e t u r n from t h e program g i v e n RT1 a t e n t r y . I t ’ s when i t ’ s r e a d ‘ b a c k w a r d s ’ by p r o l o g t h a t t h e t h e o r y T becomes an e x t r a o u t p u t . The B a s i c Gumf : A t h e o r y (T) i s composed o f one RT1−>RT2 t y p e a d d r e s s . Thus one can l o o k up a program e n t r y r e g i s t e r type layout at e x i t according to the u n i f i c a t i o n with a given r e g i s t e r type layout

f o r each program a d d r e s s i n a t h e o r y and g e t t h e theory , a f t e r at the entry address .

Theory = [ ( Address , R e g i s t e r T y p e L a y o u t −>R e g i s t e r T y p e L a y o u t ) ] A r e g i s t e r t y p e l a y o u t (RT) i s a l i s t in order .

o f 32 t y p e s f o r 32 r e g i s t e r s ,

R e g i s t e r T y p e L a y o u t = RT ( R e g i s t e r [ 3 2 ] ) A t y p e i n d i c a t e s e i t h e r c i p h e r e d ( c ) d a t a or u n c i p h e r e d ( u ) d a t a : Type = C | U Wassamore , t h e r e a r e two s i n g l e t o n s u b t y p e s C SP U RA These r e p r e s e n t r e s p e c t i v e l y t h e e n c r y p t e d s t a c k p o i n t e r a d d r e s s and the unencrypted subroutine c a l l return address . Zat ’ s e e t . Below be t h e p r e d i c a t e d e f i n i t i o n s .

1

% % The e v a l u a t i o n o f a program t o d e l i v e r a t h e o r y , as w e l l as t h e f i n a l % r e g i s t e r t y p e l a y o u t , i s v i a vn / 4 : % % vn /4 : : Address −> I n t −> ( Theory , R e g i s t e r T y p e L a y o u t ) % % ( and h o p e f u l l y i n t h e o t h e r d i r e c t i o n s t o o ) . The INT i s an i t e r a t i o n l i m i t e r . % Every b i t o f work on a c a l l e d s u b r o u t i n e i s w i t h a −1 i n t h a t % i t e r a t i o n c o u n t . D i t t o e v e r y b i t o f work on t h e backward−g o i n g p a r t % o f a jump or branch . That s h o u l d s t o p runaway c o m p u t a t i o n from e v e r % happening . % % We p a s s t h e a r g s on t o vn /5 , which has t h e number o f r e g i s t e r s as an % e x t r a parameter . % vn (T, P , ( RT1−>RT2 ) ,N) :− vn (T, P , ( RT1−>RT2 ) ,N, 3 2 ) .

% % r e p l a c e program name w i t h a d d r e s s i n vn /5 % vn (T, p (P ) , ( RT1−>RT2 ) ,N, L) :− e qu a l sA ( p (P) , a (A) ) , !, vn (T, a (A) , ( RT1−>RT2 ) ,N, L ) , !. % % vn /5 u s e s vn /6 which t a k e s t h e i n s t r u c t i o n % c o n v e n i e n c e parameter . % vn (T, a (A) , ( RT1−>RT2 ) ,N, L) :− prog ( a (A) , I ) , !, l o o k u p (T, N, A, ( RT1−>RT2 ) ) , % lengthRT (RT1 , L ) , % vn (T, a (A) , ( RT1−>RT2 ) ,N, I , L ) , % !.

a t a d d r e s s A as an e x t r a

memoise i t ( c o n s t r a i n #r e g s a t e n t r y ) and do t h e b u s i n e s s w i t h i t

% vn /6 i s t h e e v a l u a t i o n t h a t d o e s t h e major work , u s i n g t h e i n s t r u c t i o n p a t t e r n % d i r e c t l y i n s t e a d o f f i r s t l o o k i n g i t up from t h e a d d r e s s . Repeated a p p l i c a t i o n % o f vn /6 i t e r a t i v e l y r e f i n e s t h e i n i t i a l ( empty ) t h e o r y i n a 2−way c a l c u l a t i o n . % % vn /6 : : Theory−>Address −> Depth −> I n s t r u c t i o n −> FrameSize −> (RTL−>RTL) % % % vn ( , a ( ) , ( RT1−> ) , 0 , , L): − genericRT (RT1 , L) % don ’ t r e c u r s e f o r e v e r . This i s ‘ any ’ . vn (T, a (A) , ( RT1−>RT2 ) ,N, l u i ( n (R) , ) , L) :− B is A + 4 , t y p e ( ( [ ] − > [ ( n (R)=c ) ] ) , ( RT1−>RT) , L ) , vn (T, a (B ) , (RT−>RT2 ) ,N, L) .

2

vn (T, a (A) , ( RT1−>RT2 ) ,N, sb ( n (R1 ) , , n (R2 ) ) , L) :− B is A + 4 , t y p e ( ( [ ( n (R1)=c ) , ( n ( R2)=c )] − >[( n ( R1)=c ) , ( n (R2)=c ) ] ) , ( RT1−>RT) , L ) , vn (T, a (B ) , (RT−>RT2 ) ,N, L) . vn (T, a (A) , ( RT1−>RT2 ) ,N, l b ( n (R1 ) , , n (R2 ) ) , L) :− B is A + 4 , t y p e ( ( [ ( n (R2)=c )] − >[( n ( R2)=c ) , ( n (R1)=c ) ] ) , ( RT1−>RT) , L ) , vn (T, a (B ) , (RT−>RT2 ) ,N, L) . vn (T, a (A) , ( RT1−>RT2 ) ,N, sw ( n (R1 ) ,M, n ( R2 ) ) , L ) :− B is A + 4 , M >= 0 , M / 4 =< L , L minus M by 4 i s L − M / 4 , ( t y p e ( ( [ ( n (R1)=X) , ( n ( R2)= c s p )] − >[( n ( R1)=X) , ( n ( R2)= c s p ) , ( n ( L minus M by 4)=X ) ] ) , (RT1−>RT) , L) ; t y p e ( ( [ ( n (R1)= c s p ) , ( n (R2)= c s p )] − >[( n ( R1)=c ) , ( n (R2)= c s p ) , ( n ( L minus M by 4)= c s p ) ] ) , (RT1−>RT) , L) ; t y p e ( ( [ ( n (R1)= c s p ) , ( n (R2)= c s p )] − >[( n ( R1)= c s p ) , ( n (R2)= c s p ) , ( n ( L minus M by 4)=c ) ] ) , (RT1−>RT) , L) ; t y p e ( ( [ ( n (R1)= c s p ) , ( n (R2)= c s p )] − >[( n ( R1)=c ) , ( n (R2)= c s p ) , ( n ( L minus M by 4)=c ) ] ) , (RT1−>RT) , L) ; t y p e ( ( [ ( n (R1)= u r a ) , ( n ( R2)= c s p )] − >[( n ( R1)= u r a ) , ( n ( R2)= c s p ) , ( n ( L minus M by 4)= u r a ) ] ) , (RT1−>RT) , L) ; t y p e ( ( [ ( n (R1)= u r a ) , ( n ( R2)= c s p )] − >[( n ( R1)= u r a ) , ( n ( R2)= c s p ) , ( n ( L minus M by 4)=u ) ] ) , (RT1−>RT) , L) ; t y p e ( ( [ ( n (R1)= u r a ) , ( n ( R2)= c s p )] − >[( n ( R1)=u ) , ( n (R2)= c s p ) , ( n ( L minus M by 4)=u ) ] ) , (RT1−>RT) , L) ), vn (T, a (B ) , (RT−>RT2 ) ,N, L) . vn (T, a (A) , ( RT1−>RT2 ) ,N, sw ( n (R1 ) , , n (R2 ) ) , L) :− B is A + 4 , t y p e ( ( [ ( n (R1)=c ) , ( n ( R2)=c )] − >[( n ( R1)=c ) , ( n (R2)=c ) ] ) , ( RT1−>RT) , L ) , vn (T, a (B ) , (RT−>RT2 ) ,N, L) . vn (T, a (A) , ( RT1−>RT2 ) ,N, lw ( n (R1 ) ,M, n ( R2 ) ) , L ) :− B is A + 4 , M >= 0 , M / 4 =< L , L minus M by 4 i s L − M / 4 , ( t y p e ( ( [ ( n ( L minus M by 4)=X) , ( n (R2)= c s p )] − >[( n ( R1)=X) , ( n ( R2)= c s p ) , ( n ( L minus M by 4)=X ) ] ) , (RT1−>RT) , L) ; t y p e ( ( [ ( n ( L minus M by 4)= c s p ) , ( n (R2)= c s p )] − >[( n ( R1)=c ) , ( n (R2)= c s p ) , ( n ( L minus M by 4)= c s p ) ] ) , (RT1−>RT) , L)

3

;

vn (T, a (A)

vn (T, a (A)

vn (T, a (A)

vn (T, a (A)

vn (T, a (A)

vn (T, a (A)

vn (T, a (A)

t y p e ( ( [ ( n ( L minus M by 4)= u r a ) , ( n (R2)= c s p )] − >[( n ( R1)=u ) , ( n (R2)= c s p ) , ( n ( L minus M by 4)= u r a ) ] ) , (RT1−>RT) , L) ), vn (T, a (B ) , (RT−>RT2 ) ,N, L) . , ( RT1−>RT2 ) ,N, lw ( n (R1 ) , , n (R2 ) ) , L) :− B is A + 4 , t y p e ( ( [ ( n (R2)=c )] − >[( n ( R2)=c ) , ( n (R1)=c ) ] ) , ( RT1−>RT) , L ) , vn (T, a (B ) , (RT−>RT2 ) ,N, L) . , ( RT1−>RT2 ) ,N, j r ( n (R) ) , L) :− t y p e ( ( [ ( n (R)= u r a )] − >[( n (R)=u ) ] ) , ( RT1−>RT2 ) , L) ; B is A + 4 , t y p e ( ( [ ( n (R)=u )] − >[( n (R)=u ) ] ) , ( RT1−>RT) , L ) , % don ’ t know where t o go . vn (T, a (B ) , (RT−>RT2 ) ,N, L) . , ( RT1−>RT2 ) ,N, o r i ( n ( R1 ) , n (R2 ) , ) , L) :− B is A + 4 , t y p e ( ( [ ( n (R2)=c )] − >[( n ( R2)=c ) , ( n (R1)=c ) ] ) , ( RT1−>RT) , L ) , vn (T, a (B ) , (RT−>RT2 ) ,N, L) . , ( RT1−>RT2 ) ,N, a n d i ( n ( R1 ) , n (R2 ) , ) , L) :− B is A + 4 , t y p e ( ( [ ( n (R2)=c )] − >[( n ( R2)=c ) , ( n (R1)=c ) ] ) , ( RT1−>RT) , L ) , vn (T, a (B ) , (RT−>RT2 ) ,N, L) . , ( RT1−>RT2 ) ,N, addiu ( n ( R1 ) , n (R2 ) ,M) , L) :− B is A + 4 , ( t y p e ( ( [ ( n (R2)=c )] − >[( n ( R2)=c ) , ( n (R1)=c ) ] ) , ( RT1−>RT) , L ) , vn (T, a (B ) , (RT−>RT2 ) ,N, L) ; L minus M by 4 i s L − M / 4 , not (M = 0 ) , t y p e ( ( [ ( n (R2)= c s p )] − >[( n ( R2)=c ) , ( n (R1)= c s p ) ] ) , (RT1−>RT) , L , L minus M by 4 ) , vn (T, a (B ) , (RT−>RT2 ) ,N, L minus M by 4 ) ; L minus M by 4 i s L − M / 4 , M = 0, t y p e ( ( [ ( n (R2)= c s p )] − >[( n ( R2)= c s p ) , ( n (R1)= c s p ) ] ) , (RT1−>RT) , L , L minus M by 4 ) , vn (T, a (B ) , (RT−>RT2 ) ,N, L minus M by 4 ) ) . , ( RT1−>RT2 ) ,N, nop , L) :− B is A + 4 , vn (T, a (B ) , ( RT1−>RT2 ) ,N, L) . , ( RT1−>RT2 ) ,N, any , L) :− B is A + 4 , genericRT (RT1 , L ) , genericRT (RT, L ) ,

4

vn (T, a (A)

vn (T, a (A)

vn (T, a (A)

vn (T, a (A)

vn (T, a (A)

vn (T, a (B ) , (RT−>RT2 ) ,N, L) . , ( RT1−>RT2 ) ,N, move ( n (R1 ) , n (R2 ) ) , L) :− B is A + 4 , t y p e ( ( [ ( n (R2)=X)] − >[( n ( R2)=X) , ( n ( R1)=X ) ] ) , ( RT1−>RT) , L ) , vn (T, a (B ) , (RT−>RT2 ) ,N, L) . , ( RT1−>RT2 ) ,N, j ( a ( B1 ) ) , L) :− N > 0, B1 < A, % untested !, B2 i s A + 4 , N1 i s N − 1 , %l o o k u p (T, N, B1 , ( RT1−>RT2) ) , lengthRT (RT1, L ) , vn (T, a ( B1 ) , ( RT1−>RT2 ) , N1 , L ) , vn (T, a ( B2 ) , ( RT1−>RT2 ) ,N, L) ; B1 > A, % tested !, B2 i s A + 4 , vn (T, a ( B2 ) , ( −>RT2 ) ,N, L ) , vn (T, a ( B1 ) , ( RT1−>RT2 ) ,N, L) . , ( RT1−>RT2 ) ,N, j a l ( a ( B1 ) ) , L ) :− N > 0, !, B2 i s A + 4 , N1 i s N − 1 , t y p e ( ( [ ] − > [ ( r ( r a )= u r a ) ] ) , ( RT1−>RTa ) , L , 3 2 ) , vn ( , a ( B1 ) , ( RTa−>RTb) , N1 , 3 2 ) , % f o r g e t s t a c k t y p e ( ( [ ] − > [ ] ) , ( RTb−>RTc ) , 3 2 , L ) , %RT1, RTc same t y p e s on r e g s 32 t o L r e s t r i c t R T ( 3 2 , L , RT1 , RTd) , r e s t r i c t R T ( 3 2 , L , RTc , RTd) , vn (T, a ( B2 ) , ( RTc−>RT2 ) ,N, L) . , ( RT1−>RT2 ) ,N, bnez ( n (R) , a ( B1 ) ) , L) :− B2 i s A + 4 , ( N > 0, B1 < A, % tested !, N1 i s N − 1 , t y p e ( ( [ ( n (R)=c )] − >[( n (R)=c ) ] ) , ( RT1−>RT) , L ) , %l o o k u p (T, N, B1 , ( RT−>RT2) ) , lengthRT (RT, L ) , vn (T, a ( B1 ) , (RT−>RT2 ) , N1 , L ) , vn (T, a ( B2 ) , (RT−>RT2 ) ,N, L) ; B1 > A, !, % untested t y p e ( ( [ ( n (R)=c )] − >[( n (R)=c ) ] ) , ( RT1−>RT) , L ) , vn (T, a ( B1 ) , (RT−>RT2 ) ,N, L ) , vn (T, a ( B2 ) , (RT−>RT2 ) ,N, L) ). , ( RT1−>RT2 ) ,N, beqz ( n (R) , a ( B1 ) ) , L) :− B2 i s A + 4 , (

5

N > 0, B1 < A, % tested !, N1 i s N − 1 , t y p e ( ( [ ( n (R)=c )] − >[( n (R)=c ) ] ) , ( RT1−>RT) , L ) , %l o o k u p (T, N, B1 , ( RT−>RT2) ) , lengthRT (RT, L ) , vn (T, a ( B1 ) , (RT−>RT2 ) , N1 , L ) , vn (T, a ( B2 ) , (RT−>RT2 ) ,N, L) ; B1 > A, !, % untested t y p e ( ( [ ( n (R)=c )] − >[( n (R)=c ) ] ) , ( RT1−>RT) , L ) , vn (T, a ( B1 ) , (RT−>RT2 ) ,N, L ) , vn (T, a ( B2 ) , (RT−>RT2 ) ,N, L) ).

% −−−−−−−−−−−−−−−−−−−− what f o l l o w s i s

a l l s u p p o r t −−−−−−−−−−−−−−−−−−−−−

% R e g i s t e r names can be used t o s t a n d i n f o r numbers . % % Register = R String | N Int % % => : : R e g i s t e r −> R e g i s t e r % R ” z e r o ” => N 0 % ... % equalsR ( r ( z e r o ) , n ( 0 ) ) . equalsR ( r ( at ) , n ( 1 ) ) . e q u a l s R ( r ( v0 ) , n ( 2 ) ) . e q u a l s R ( r ( v1 ) , n ( 3 ) ) . e q u a l s R ( r ( a0 ) , n ( 4 ) ) . e q u a l s R ( r ( a1 ) , n ( 5 ) ) . e q u a l s R ( r ( a2 ) , n ( 6 ) ) . e q u a l s R ( r ( a3 ) , n ( 7 ) ) . equalsR ( r ( t0 ) , n ( 8 ) ) . equalsR ( r ( t1 ) , n ( 9 ) ) . equalsR ( r ( t2 ) , n ( 1 0 ) ) . equalsR ( r ( t3 ) , n ( 1 1 ) ) . equalsR ( r ( t4 ) , n ( 1 2 ) ) . equalsR ( r ( t5 ) , n ( 1 3 ) ) . equalsR ( r ( t6 ) , n ( 1 4 ) ) . equalsR ( r ( t7 ) , n ( 1 5 ) ) . equalsR ( r ( s0 ) , n ( 1 6 ) ) . equalsR ( r ( s1 ) , n ( 1 7 ) ) . equalsR ( r ( s2 ) , n ( 1 8 ) ) . equalsR ( r ( s3 ) , n ( 1 9 ) ) . equalsR ( r ( s4 ) , n ( 2 0 ) ) . equalsR ( r ( s5 ) , n ( 2 1 ) ) . equalsR ( r ( s6 ) , n ( 2 2 ) ) . equalsR ( r ( s7 ) , n ( 2 3 ) ) . equalsR ( r ( t8 ) , n ( 2 4 ) ) . equalsR ( r ( t9 ) , n ( 2 5 ) ) . e q u a l s R ( r ( k0 ) , n ( 2 6 ) ) . e q u a l s R ( r ( k1 ) , n ( 2 7 ) ) . e q u a l s R ( r ( gp ) , n ( 2 8 ) ) .

6

e q u a l s R ( r ( sp ) , equalsR ( r ( s8 ) , equalsR ( r ( fp ) , equalsR ( r ( ra ) ,

n(29) n(30) n(30) n(31)

). ). ). % also ).

% Program l a b e l s can be used t o s t a n d i n f o r raw a d d r e s s e s . % % Address = P S t r i n g | A I n t % % => : : Address −> Address % P ” p r i n t c h a r ” => A 0 x80030000 % ... % e q ua l sA ( p ( p r i n t c h a r ) , a ( 0 x80030000 ) ) . e q ua l sA ( p ( h a l t ) , a ( 0 x8003000c ) ) . e q ua l sA ( p ( p r i n t s t r ) , a ( 0 x8003001c ) ) . e q ua l sA ( p ( main ) , a ( 0 x80030080 ) ) . e q ua l sA ( p ( e x t r a ) , a ( 0 x800300c8 ) ) . e q ua l sA ( p ( t e s t ) , a (0 x800300f8 ) ) . e q ua l sA ( p ( main1 ) , a ( 0 x80043078 ) ) . e q ua l sA ( p ( p r i n t s t r 1 ) , a ( 0 x80043028 ) ) . e q ua l sA ( p ( h a l t 1 ) , a ( 0 x80043014 ) ) . e q ua l sA ( p ( p r i n t c h a r 1 ) , a ( 0 x80043000 ) ) .

% Reduce r e g i s t e r names t o numbers i n programs . % % Program = Prog Address Code % % => : : Program −> Program % Prog ( a , Lui (R r ) o ) => Prog ( a , Lui (N n ) o ) % where R r => N n % ... % prog (A, l u i ( n (N) ,O) ) :− prog (A, l u i ( r (R) ,O) ) , e q u a l s R ( r (R) , n (N) ) , prog (A, sb ( n (N) ,O, R2 ) ) :− prog (A, sb ( r (R1 ) ,O, R2 ) ) , e q u a l s R ( r (R1 ) , n (N) ) , prog (A, sb ( R1 , O, n (N) ) ) :− prog (A, sb ( R1 , O, r ( R2 ) ) ) , e q u a l s R ( r (R2 ) , n (N) ) , prog (A, l b ( n (N) ,O, R2 ) ) :− prog (A, l b ( r (R1 ) ,O, R2 ) ) , e q u a l s R ( r (R1 ) , n (N) ) , prog (A, l b ( R1 , O, n (N) ) ) :− prog (A, l b ( R1 , O, r ( R2 ) ) ) , e q u a l s R ( r (R2 ) , n (N) ) , prog (A, sw ( n (N) ,O, R2 ) ) :− prog (A, sw ( r (R1 ) ,O, R2 ) ) , e q u a l s R ( r (R1 ) , n (N) ) , prog (A, sw ( R1 , O, n (N) ) ) :− prog (A, sw ( R1 , O, r (R2 ) ) ) , e q u a l s R ( r (R2 ) , n (N) ) , prog (A, lw ( n (N) ,O, R2 ) ) :− prog (A, lw ( r (R1 ) ,O, R2 ) ) , e q u a l s R ( r (R1 ) , n (N) ) , prog (A, lw ( R1 , O, n (N) ) ) :− prog (A, lw ( R1 , O, r (R2 ) ) ) , e q u a l s R ( r (R2 ) , n (N) ) , prog (A, o r i ( n (N) , R2 , I ) ) :− prog (A, o r i ( r ( R1 ) , R2 , I ) ) , e q u a l s R ( r ( R1 ) , n (N) ) , prog (A, o r i ( R1 , n (N) , I ) ) :− prog (A, o r i ( R1 , r (R2 ) , I ) ) , e q u a l s R ( r ( R2 ) , n (N) ) , prog (A, a n d i ( n (N) , R2 , I ) ) :− prog (A, a n d i ( r ( R1 ) , R2 , I ) ) , e q u a l s R ( r ( R1 ) , n (N) ) , prog (A, a n d i ( R1 , n (N) , I ) ) :− prog (A, a n d i ( R1 , r (R2 ) , I ) ) , e q u a l s R ( r ( R2 ) , n (N) ) , prog (A, move ( n (N) , R2 ) ) :− prog (A, move ( r (R1 ) , R2 ) ) , e q u a l s R ( r (R1 ) , n (N) ) , prog (A, move ( R1 , n (N) ) ) :− prog (A, move ( R1 , r ( R2 ) ) ) , e q u a l s R ( r (R2 ) , n (N) ) , prog (A, addiu ( n (N) , R2 , I ) ) :− prog (A, addiu ( r (R1 ) , R2 , I ) ) , e q u a l s R ( r (R1 ) , n (N) ) prog (A, addiu ( R1 , n (N) , I ) ) :− prog (A, addiu ( R1 , r ( R2 ) , I ) ) , e q u a l s R ( r (R2 ) , n (N) ) prog (A, j r ( n (N) ) ) :− prog (A, j r ( r (R) ) ) , e q u a l s R ( r (R) , n (N) ) , prog (A, bnez ( n (N) , B1 ) ) :− prog (A, bnez ( r (R) , B1 ) ) , e q u a l s R ( r (R) , n (N) ) , prog (A, beqz ( n (N) , B1 ) ) :− prog (A, beqz ( r (R) , B1 ) ) , e q u a l s R ( r (R) , n (N) ) ,

7

!. !. !. !. !. !. !. !. !. !. !. !. !. !. !. , !. , !. !. !. !.

% Reduce program l a b e l s t o program a d d r e s s e s i n programs . % % => : : Program −> Program % Prog a ( J a l (P p ) b ) => Prog a ( J a l (A n ) B) % where P p == A n % prog (A, j a l ( a (N) ) ) :− prog (A, j a l ( p (P ) ) ) , e qu a ls A ( p (P) , a (N) ) prog (A, j ( a (N) ) ) :− prog (A, j ( p (P ) ) ) , e q ua l s A ( p (P) , a (N) ) prog (A, bnez (R, a (N) ) ) :− prog (A, bnez (R, p (P ) ) ) , e q ua l s A ( p (P) , a (N) ) prog (A, beqz (R, a (N) ) ) :− prog (A, beqz (R, p (P ) ) ) , eq u a ls A ( p (P) , a (N) )

, , , ,

!. !. !. !.

% l o o k u p /3 an a d d r e s s i n a t h e o r y and compare w i t h a r e g i s t e r t y p e l a y o u t . % % l o o k u p /3 : : Theory −> Address −> R e g i s t e r T y p e L a y o u t % % lookup (( a , r t ) : a rt s ) a ’ = rt , a == a ’ % = lookup arts a ’ , otherwise % l o o k u p ( [ ( A,RT) | ] , A,RT) . l o o k u p ( [ | ARTs ] , A,RT) :− l o o k u p (ARTs , A,RT) , ! . % l o o k u p /4 an a d d r e s s i n t h e N ’ t h t h e o r y i n a s e q u e n c e o f t h e o r i e s . % ( where i s ” ! ! ” when one n e e d s i t ? ) . % l o o k u p (T, N, A,RT) :− nth0 (N, T,TN) , ! , l o o k u p (TN, A,RT) , ! . % produce a g e n e r i c r e g i s t e r type l a y o u t with L r e g i s t e r s . % genericRT ( r t (RT) , L) :− length (RT, L ) . % c h e c k t h a t t h e #r e g s i n a r e g i s t e r t y p e l a y o u t i s L . % lengthRT ( r t (RT) , L) :− length (RT, L ) . % assignRT /3 o v e r w r i t e s a t y p e i n a r e g i s t e r t y p e l a y o u t . % % t h e f i r s t argument i s e i t h e r a f o o=b a r or a l i s t o f f o o=bar , where f o o % i s a r e g i s t e r i d e n t i f y r (R) or n (N) and b a r i s t h e newly a s s i g n e d t y p e . % % Mumble s o m e t h i n g a b o u t a s s i g n m e n t o r d e r . Don ’ t do t h a t t h e n ! % assignRT ( ( r (R)=Y) , r t (RT1 ) , r t (RT2 ) ) :− e q u a l s R ( r (R) , n (N) ) , assignRT ( ( n (N)=Y) , r t (RT1 ) , r t (RT2 ) ) , !.

assignRT ( [ ] , r t (RT) , r t (RT ) ) . assignRT ( [ ( X=Y ) | As ] , r t (RT1 ) , r t (RT2 ) ) :− assignRT ( (X=Y) , r t (RT1 ) , r t (RT) ) , assignRT ( As , r t (RT) , r t (RT2 ) ) , !.

8

assignRT ( ( n(0)=Y) , r t ( [ | Xs ] ) , r t ( [ Y| Xs ] ) ) . assignRT ( ( n (N)=Y) , r t ( [ X| Xs ] ) , r t ( [ X| Ys ] ) ) :− N > 0, !, N1 i s N − 1 , assignRT ( ( n (N1)=Y) , r t ( Xs ) , r t ( Ys ) ) , !. % t y p e /3 % % d e c l a r e RT1−>RT2 t o be t h e t y p e whose r e p r e s e n t a t i o n i s As−>Bs , w i t h % L ‘ r e g i s t e r s ’ a v a i l a b l e i n t o t a l . R e g i s t e r s n o t mentioned i n As−>Bs % a r e assumed t o be t a k e n s t r a i g h t a c r o s s as X−>X. So As−>Bs i s t h e % l i s t o f ‘ d i s t u r b e d ’ r e g i s t e r s and what happens t o them . E . g . % % [ n(1)=X, n(2)= c ]−>[n(1)=u , n(2)=X] % % The ’L ’ parameter a t t h e end c o u n t s t h e r e g i s t e r s . In t y p e /4 , t h e r e % i s a L1 , L2 parameter p a i r a t t h e end , meaning a change o f r e g i s t e r % c o u n t from L1 t o L2 . % t y p e ( ( As−>Bs ) , ( RT1−>RT2 ) , L) :− genericRT (RT, L ) , assignRT ( As , RT, RT1 ) , assignRT ( Bs , RT, RT2 ) , !. t y p e ( ( As−>Bs ) , ( RT1−>RT2 ) , L1 , L2 ) :− ( L2 >= L1 , !, genericRT (RT, L2 ) , assignRT ( As , RT, RT1a ) , assignRT ( Bs , RT, RT2 ) , r e s t r i c t R T ( L1 , RT1a , RT1 ) , ! ) ; ( L2 < L1 , !, genericRT (RT, L1 ) , assignRT ( As , RT, RT1 ) , assignRT ( Bs , RT, RT2a ) , r e s t r i c t R T ( L2 , RT2a , RT2 ) , ! ). % r e s t r i c t R T /3 % % r e d u c e t h e number o f r e g i s t e r s t o N i n t h e r e g i s t e r t y p e l a y o u t . % E x a c t l y , t h e f i r s t 0 t o N−1 a r e c o n s t r a i n e d t o be e q u a l t y p e s , % and t h e r e s t a r e c u t . % restrictRT (0 , rt ( ) , rt ( [ ] ) ) . r e s t r i c t R T (N, r t ( [ X| Xs ] ) , r t ( [ X| Ys ] ) ) :− N > 0, !, N1 i s N − 1 , r e s t r i c t R T (N1 , r t ( Xs ) , r t ( Ys ) ) ,

9

!. % r e s t r i c t R T /4 % % The f i r s t L t o N−1 r e g i s t e r s a r e c o n s t r a i n e d t o be e q u a l t y p e s , % and t h e f i r s t 0 t o L−1 a r e i g n o r e d , and t h e N t o . . ones a r e c u t . % r e s t r i c t R T ( 0 ,N, r t ( Xs ) , r t ( Ys ) ) :− r e s t r i c t R T (N, r t ( Xs ) , r t ( Ys ) ) . r e s t r i c t R T ( L , N, r t ( [ | Xs ] ) , r t ( [ | Ys ] ) ) :− L > 0, N > 0, !, L1 i s L − 1 , N1 i s N − 1 , r e s t r i c t R T ( L1 , N1 , r t ( Xs ) , r t ( Ys ) ) . r e s t r i c t R T ( L , 0 , r t ( ) , r t ( ) ) :− L > 0, !.

% p r i n t c h a r program % prog ( a ( 0 x80030000 ) , l u i ( r ( v1 ) , 0 xb000 ) ) . prog ( a ( 0 x80030004 ) , sb ( r ( a0 ) , 0 , r ( v1 ) ) ) . prog ( a ( 0 x80030008 ) , j r ( r ( r a ) ) ) .

% h a l t program % prog ( a ( 0 x8003000c ) , prog ( a ( 0 x80030010 ) , prog ( a ( 0 x80030014 ) , prog ( a ( 0 x80030018 ) ,

l u i ( r ( v1 ) , 0 xb000 ) ) . o r i ( r ( v1 ) , r ( v1 ) , 0 x10 ) ) . sb ( r ( v1 ) , 0 , r ( v1 ) ) ) . j r ( r ( ra ) ) ) .

% p r i n t s t r program prog ( a ( 0 x8003001c ) , prog ( a ( 0 x80030020 ) , prog ( a ( 0 x80030024 ) , prog ( a ( 0 x80030028 ) , prog ( a ( 0 x8003002c ) , prog ( a ( 0 x80030030 ) , prog ( a ( 0 x80030034 ) , prog ( a ( 0 x80030038 ) , prog ( a ( 0 x8003003c ) , prog ( a ( 0 x80030040 ) , prog ( a ( 0 x80030044 ) , prog ( a ( 0 x80030048 ) , prog ( a ( 0 x8003004c ) , prog ( a ( 0 x80030050 ) , prog ( a ( 0 x80030054 ) , prog ( a ( 0 x80030058 ) , prog ( a ( 0 x80030058 ) , prog ( a ( 0 x8003005c ) ,

addiu ( r ( sp ) , r ( sp ) , − 3 2 ) ) . sw ( r ( r a ) , 2 8 , r ( sp ) ) ) . sw ( r ( s 8 ) , 2 4 , r ( sp ) ) ) . move ( r ( s 8 ) , r ( sp ) ) ) . sw ( r ( gp ) , 1 6 , r ( sp ) ) ) . sw ( r ( a0 ) , 3 2 , r ( sp ) ) ) . j ( a ( 0 x80030060 ) ) ) . lw ( r ( v0 ) , 3 2 , r ( sp ) ) ) . nop ) . l b ( r ( v0 ) , 0 , r ( v0 ) ) ) . move ( r ( v1 ) , r ( v0 ) ) ) . lw ( r ( v0 ) , 3 2 , r ( sp ) ) ) . addiu ( r ( v0 ) , r ( v0 ) , 1 ) ) . sw ( r ( v0 ) , 3 2 , r ( sp ) ) ) . move ( r ( a0 ) , r ( v1 ) ) ) . nop ) . j a l (p( printchar ) ) ) . lw ( r ( gp ) , 1 6 , r ( sp ) ) ) .

10

prog ( a ( 0 x80030060 ) , prog ( a ( 0 x80030064 ) , prog ( a ( 0 x80030068 ) , prog ( a ( 0 x8003006c ) , prog ( a ( 0 x80030070 ) , prog ( a ( 0 x80030074 ) , prog ( a ( 0 x80030078 ) , prog ( a ( 0 x8003007c ) ,

lw ( r ( v0 ) , 3 2 , r ( sp ) ) ) . l b ( r ( v0 ) , 0 , r ( v0 ) ) ) . bnez ( r ( v0 ) , a ( 0 x80030038 ) ) ) . move ( r ( sp ) , r ( s 8 ) ) ) . lw ( r ( r a ) , 2 8 , r ( sp ) ) ) . lw ( r ( s 8 ) , 2 4 , r ( sp ) ) ) . addiu ( r ( sp ) , r ( sp ) , 3 2 ) ) . j r ( r ( ra ) ) ) .

% main program prog ( a ( 0 x80030080 ) , prog ( a ( 0 x80030084 ) , prog ( a ( 0 x80030088 ) , prog ( a ( 0 x8003008c ) , prog ( a ( 0 x80030090 ) , prog ( a ( 0 x80030094 ) , prog ( a ( 0 x80030098 ) , prog ( a ( 0 x8003009c ) , prog ( a ( 0 x800300a0 ) , prog ( a ( 0 x800300a4 ) , prog ( a ( 0 x800300a8 ) , prog ( a ( 0 x800300ac ) , prog ( a ( 0 x800300b0 ) , prog ( a ( 0 x800300b4 ) , prog ( a ( 0 x800300b8 ) , prog ( a ( 0 x800300bc ) , prog ( a ( 0 x800300c0 ) , prog ( a ( 0 x800300c4 ) ,

addiu ( r ( sp ) , r ( sp ) , − 3 2 ) ) . sw ( r ( r a ) , 2 8 , r ( sp ) ) ) . sw ( r ( s 8 ) , 2 4 , r ( sp ) ) ) . move ( r ( s 8 ) , r ( sp ) ) ) . sw ( r ( gp ) , 1 6 , r ( sp ) ) ) . l u i ( r ( v0 ) , 0 x8003 ) ) . addiu ( r ( a0 ) , r ( v0 ) , 2 0 8 ) ) . j a l (p( printstr ) ) ) . nop ) . lw ( r ( gp ) , 1 6 , r ( sp ) ) ) . j a l (p( halt ) ) ) . nop ) . lw ( r ( gp ) , 1 6 , r ( sp ) ) ) . move ( r ( sp ) , r ( s 8 ) ) ) . lw ( r ( r a ) , 2 8 , r ( sp ) ) ) . lw ( r ( s 8 ) , 2 4 , r ( sp ) ) ) . addiu ( r ( sp ) , r ( sp ) , 3 2 ) ) . j r ( r ( ra ) ) ) .

% e x t r a program prog ( a ( 0 x800300c8 ) , prog ( a ( 0 x 8 0 0 3 0 0 c c ) , prog ( a ( 0 x800300d0 ) , prog ( a ( 0 x800300d4 ) , prog ( a ( 0 x800300d8 ) , prog ( a ( 0 x800300dc ) , prog ( a ( 0 x800300e0 ) , prog ( a ( 0 x800300e4 ) ,

addiu ( r ( sp ) , r ( sp ) , − 3 2 ) ) . sw ( r ( a0 ) , 3 2 , r ( sp ) ) ) . lw ( r ( v0 ) , 3 2 , r ( sp ) ) ) . move ( r ( v1 ) , r ( v0 ) ) ) . lw ( r ( v0 ) , 3 2 , r ( sp ) ) ) . bnez ( r ( v0 ) , a ( 0 x 8 0 0 3 0 0 c c ) ) ) . addiu ( r ( sp ) , r ( sp ) , 3 2 ) ) . j r ( r ( ra ) ) ) .

% t e s t program prog ( a ( 0 x 8 0 0 3 0 0 f 8 ) , prog ( a ( 0 x 8 0 0 3 0 0 f c ) , prog ( a ( 0 x80030100 ) , prog ( a ( 0 x80030104 ) , prog ( a ( 0 x80030108 ) , prog ( a ( 0 x8003010c ) , prog ( a ( 0 x80030110 ) ,

j ( a ( 0 x80030100 ) ) ) . lw ( r ( a0 ) , 2 4 , r ( sp ) ) ) . lw ( r ( v1 ) , 2 0 , r ( sp ) ) ) . lw ( r ( v0 ) , 2 8 , r ( sp ) ) ) . bnez ( r ( v0 ) , a ( 0 x 8 0 0 3 0 0 f c ) ) ) . lw ( r ( v1 ) , 2 0 , r ( sp ) ) ) . j r ( r ( ra ) ) ) .

% −O1 o p t i m i z e d program p r i n t c h a r 1 prog ( a ( 0 x80043000 ) , a n d i ( r ( a0 ) , r ( a0 ) , 0 x f f ) ) . prog ( a ( 0 x80043004 ) , l u i ( r ( v0 ) , 0 xb000 ) ) . prog ( a ( 0 x80043008 ) , sb ( r ( a0 ) , 0 , r ( v0 ) ) ) . prog ( a ( 0 x8004300c ) , j r ( r ( r a ) ) ) .

% −O1 o p t i m i z e d program h a l t 1 prog ( a ( 0 x80043014 ) , l u i ( r ( v0 ) , 0 xb000 ) ) .

11

prog ( a ( 0 x80043018 ) , o r i ( r ( v0 ) , r ( v0 ) , 0 x10 ) ) . prog ( a ( 0 x8004301c ) , sb ( r ( z e r o ) , 0 , r ( v0 ) ) ) . prog ( a ( 0 x80043020 ) , j r ( r ( r a ) ) ) .

% −O1 o p t i m i z e d program p r i n t s t r 1 prog ( a ( 0 x80043028 ) , addiu ( r ( sp ) , r ( sp ) , − 3 2 ) ) . prog ( a ( 0 x8004302c ) , sw ( r ( r a ) , 2 8 , r ( sp ) ) ) . prog ( a ( 0 x80043030 ) , sw ( r ( s 0 ) , 2 4 , r ( sp ) ) ) . prog ( a ( 0 x80043034 ) , sw ( r ( gp ) , 1 6 , r ( sp ) ) ) . prog ( a ( 0 x80043038 ) , move ( r ( s 0 ) , r ( a0 ) ) ) . prog ( a ( 0 x8004303c ) , l b ( r ( a0 ) , 0 , r ( a0 ) ) ) . prog ( a ( 0 x80043040 ) , nop ) . prog ( a ( 0 x80043044 ) , beqz ( r ( a0 ) , a ( 0 x80043068 ) ) ) . prog ( a ( 0 x80043048 ) , nop ) . prog ( a ( 0 x8004304c ) , j a l ( p ( p r i n t c h a r 1 ) ) ) . prog ( a ( 0 x80043050 ) , addiu ( r ( s 0 ) , r ( s 0 ) , 1 ) ) . prog ( a ( 0 x80043054 ) , lw ( r ( gp ) , 1 6 , r ( sp ) ) ) . prog ( a ( 0 x80043058 ) , l b ( r ( a0 ) , 0 , r ( s 0 ) ) ) . prog ( a ( 0 x8004305c ) , nop ) . prog ( a ( 0 x80043060 ) , bnez ( r ( a0 ) , a ( 0 x8004304c ) ) ) . prog ( a ( 0 x80043064 ) , nop ) . prog ( a ( 0 x80043068 ) , lw ( r ( r a ) , 2 8 , r ( sp ) ) ) . prog ( a ( 0 x8004306c ) , lw ( r ( s 0 ) , 2 4 , r ( sp ) ) ) . prog ( a ( 0 x80043070 ) , addiu ( r ( sp ) , r ( sp ) , 3 2 ) ) . prog ( a ( 0 x80043074 ) , j r ( r ( r a ) ) ) . % −O1 o p t i m i z e d program main1 prog ( a ( 0 x80043078 ) , addiu ( r ( sp ) , r ( sp ) , − 3 2 ) ) . prog ( a ( 0 x8004307c ) , sw ( r ( r a ) , 2 8 , r ( sp ) ) ) . prog ( a ( 0 x80043080 ) , sw ( r ( gp ) , 1 6 , r ( sp ) ) ) . prog ( a ( 0 x80043084 ) , l u i ( r ( a0 ) , 0 x8004 ) ) . prog ( a ( 0 x80043088 ) , addiu ( r ( a0 ) , r ( a0 ) , 1 2 4 6 4 ) ) . prog ( a ( 0 x8004308c ) , j a l ( p ( p r i n t s t r 1 ) ) ) . prog ( a ( 0 x80043090 ) , nop ) . prog ( a ( 0 x80043094 ) , j a l ( p ( h a l t 1 ) ) ) . prog ( a ( 0 x80043098 ) , nop ) . prog ( a ( 0 x8004309c ) , lw ( r ( gp ) , 1 6 , r ( sp ) ) ) . prog ( a ( 0 x800430a0 ) , move ( r ( v0 ) , r ( z e r o ) ) ) . prog ( a ( 0 x800430a4 ) , lw ( r ( r a ) , 2 8 , r ( sp ) ) ) . prog ( a ( 0 x800430a8 ) , nop ) . prog ( a ( 0 x800430ac ) , addiu ( r ( sp ) , r ( sp ) , 3 2 ) ) . prog ( a ( 0 x800430b0 ) , j r ( r ( r a ) ) ) .

12