home *** CD-ROM | disk | FTP | other *** search
- /
- /
-
- / f36 -- expression code generation
-
- .globl lvalue
- .globl rvalue
- .globl convrt
- .globl type
- .globl funcappl
- .globl name
-
- .globl error
- .globl lookup
- .globl code
- .globl iserror
- .globl genop
- .globl typ
- .globl newline
- .globl functn
- .globl size
-
- lvalue:
- jsr r5,iserror
- rts r5
- tst (r2)
- bne 1f
- mov 2(r2),r3
- jsr r5,code
- < lval>; .even
- br name
- 1:
- mov r2,-(sp)
- cmp (r2),$32. / array appl
- bne 1f
- jsr r5,aryappl
- dec r0
- bne 2f / dim =| 1
- tstb symtab(r3)
- blt 2f / p-bit, not simple
- mov $"al,r0
- br simpary
- 2:
- jsr r5,code
- < alval\0>; .even
-
- arydope:
- jsr r5,pbit
- mov symtab+2(r3),r2
- mov (r2)+,r0
- asl r0
- add r0,r2
- mov (r2),r0
- jsr r5,code
- <; d%d\0>; .even
- r0
- br 2f
- 1:
- jsr r5,error; 54.
- mov (sp)+,r2
- rts r5
-
- simpary:
- mov r3,-(sp)
- mov symtab(r3),r3
- bis $7,r3
- jsr r5,genop
- mov (sp)+,r3
- jsr r5,size
- jsr r5,code
- <; %d.\0>; .even
- r0
- br 2f
-
- name:
- mov r2,-(sp)
- jsr r5,pbit
- 2:
- jsr r5,code
- <; \0>; .even
- bit $100,symtab(r3) / common
- beq 1f
- mov symtab+4(r3),r2
- jsr r5,code
- <%n+\0>; .even
- r2
- 1:
- movb symtab(r3),r2
- bic $!70,r2
- cmp r2,$30 / external
- bne 1f
- jsr r5,code
- <%n.\n\0>; .even
- r3
- br 2f
- 1:
- jsr r5,code
- <%n_\n\0>; .even
- r3
- 2:
- mov symtab(r3),r3
- mov (sp)+,r2
- rts r5
-
- rvalue:
- jsr r5,iserror
- rts r5
- mov r2,-(sp)
- tst (r2)
- bne 1f
- mov 2(r2),r3
- movb symtab+1(r3),r2
- jsr r5,code
- < rval%d>; .even
- r2
- mov (sp)+,r2
- br name
- 1:
- cmp (r2),$32.
- bne 1f
- jsr r5,aryappl
- dec r0
- bne 3f
- tstb symtab(r3)
- blt 3f
- mov $"ar,r0
- br simpary
- 3:
- jsr r5,code
- < arval\0>; .even
- br arydope
- 1:
- cmp (r2),$34. / array appl
- bne 1f
- jsr r5,funcappl
- mov (sp)+,r2
- mov 2(r2),r3
- movb symtab+1(r3),r0
- jsr r5,code
- <%d.\n\0>; .even
- r0
- mov symtab(r3),r3
- rts r5
- 1:
- cmp (r2),$2
- bne 1f
- movb 3(r2),r3
- mov 4(r2),r2
- jsr r5,code
- < rval%d; c%d\n\0>; .even
- r3
- r2
- mov (sp)+,r2
- mov 2(r2),r3
- rts r5
- 1:
- cmp (r2),$24. / arith or relat
- bhi 1f
- mov 2(r2),r2
- bne 3f
- mov (sp),r2
- sub $10.,(r2) / - bin -> - unary
- mov 4(r2),r2
- jsr r5,rvalue
- br 2f
- 3:
- jsr r5,rvalue
- mov (sp),r2
- mov r3,-(sp)
- mov 4(r2),r2
- jsr r5,type
- cmp *2(sp),$4 / **
- bne 3f
- mov r3,r2
- bic $!7,r2
- cmp r2,$1 / ** integer
- bne 3f
- mov 2(sp),r2
- sub $2,(r2) / pr -> pi
- mov 4(r2),r2
- jsr r5,rvalue
- mov $intcon,r2
- jsr r5,convrt
- mov (sp)+,r3
- br 2f
- 3:
- mov (sp),r2
- jsr pc,maxtyp
- mov (sp)+,r3
- mov r2,-(sp)
- jsr r5,convrt
- mov 2(sp),r2
- mov 4(r2),r2
- jsr r5,rvalue
- mov (sp)+,r2
- jsr r5,convrt
- mov r2,r3
- br 2f
- 1:
- cmp (r2),$30. / and or not
- bhi 1f
- mov 2(r2),r2
- beq 3f
- jsr r5,rvalue
- mov $logcon,r2
- jsr r5,convrt
- 3:
- mov (sp),r2
- mov 4(r2),r2
- jsr r5,rvalue
- mov $logcon,r2
- jsr r5,convrt
- 2:
- mov (sp)+,r2
- mov (r2),r0
- cmp r0,$4
- bhis 2f
- add $10.,(r2) / back to binary
- tst r0
- beq 2f
- sub $8,(r2) / back to pr
- 2:
- mov optab(r0),r0
- jsr r5,genop
- jsr r5,newline
- cmp (r2),$14. / relat
- blo 2f
- mov $logcon,r3
- 2:
- rts r5
- 1:
- jsr r5,error; 54.
- mov (sp)+,r2
- rts r5
-
- pbit:
- tstb symtab(r3)
- bge 1f
- jsr r5,code
- <p\0>
- 1:
- rts r5
-
- funcappl:
- mov r2,-(sp)
- mov functn,r3
- jsr r5,code
- < stsp; ft+%d.\n\0>; .even
- r3
- mov r3,-(sp)
- add $2,r3
- mov r3,functn
- clr -(sp) / nargs
- 1:
- mov 4(r2),r2
- beq 2f
- inc (sp)
- cmp (r2),$36. / ,
- bne 1f
- mov r2,-(sp)
- mov 2(r2),r2
- mov 6(sp),r3
- jsr r5,fapp1
- mov (sp)+,r2
- br 1b
- 1:
- mov 4(sp),r3
- jsr r5,fapp1
- 2:
- mov (sp)+,r0 / nargs
- mov (sp)+,r2
- mov (sp)+,r3
- mov 2(r3),r3
- jsr r5,code
- < call\0>; .even
- jsr r5,pbit
- jsr r5,code
- <; %n.; ft+%d.; %d.; \0>; .even
- r3
- r2
- r0
- cmp functn,functm
- ble 1f
- mov functn,functm
- 1:
- mov r2,functn
- rts r5
-
- fapp1:
- mov 2(r3),r3 / fetch out function name
- mov symtab+2(r3),r3 / arg conversion
- bne 2f
- tst (r2)
- beq 1f
- cmp (r2),$32.
- beq 4f
- cmp (r2),$42. / lv if funct or name or arry app
- beq 1f
- cmp (r2),$2 / lv if const
- bne 2f
- mov 4(r2),r3
- jsr r5,code
- < lval; c%d\n\0>
- r3
- br 3f
- 2:
- mov r3,-(sp)
- jsr r5,rvalue
- mov (sp)+,r2
- beq 2f
- jsr r5,convrt
- 2:
- mov functn,r3
- jsr r5,code
- < stsp; ft+%d.\n\0>; .even
- r3
- add $2,functn
- rts r5
- 1:
- clr (r2) / turn func/array names into lvs
- 4:
- jsr r5,lvalue
- 3:
- mov functn,r3
- jsr r5,code
- < stst; ft+%d.\n\0>; .even
- r3
- add $2,functn
- rts r5
-
- aryappl:
- mov r2,-(sp)
- clr -(sp) / arg count
- 2:
- inc (sp)
- mov 4(r2),r2
- cmp (r2),$36. / ,
- bne 2f
- mov r2,-(sp)
- mov 2(r2),r2
- jsr r5,rvalue
- mov $intcon,r2
- jsr r5,convrt
- mov (sp)+,r2
- br 2b
- 2:
- jsr r5,rvalue
- mov $intcon,r2
- jsr r5,convrt
- mov (sp)+,r0
- mov (sp)+,r2
- mov 2(r2),r3
- cmp r0,*symtab+2(r3)
- beq 1f
- jsr r5,error; 53. / dimension mismatch
- 1:
- rts r5
-
- / converts stack from type in r3 to type in r2
- convrt:
- mov r2,-(sp)
- mov r3,-(sp)
- bic $![377\<8+7],r2
- bic $![377\<8+7],r3
- cmp r2,r3
- beq 1f
- jsr r5,code
- < \0>; .even
- jsr pc,2f
- mov r2,r3
- jsr pc,2f
- jsr r5,code
- <\n\0>; .even
- 1:
- mov (sp)+,r3
- mov (sp)+,r2
- rts r5
- 2:
- mov r2,-(sp)
- mov r3,r2
- clrb r3
- swab r3
- bic $!7,r2
- movb typ(r2),r2
- jsr r5,code
- <%c%d\0>; .even
- r2
- r3
- mov (sp)+,r2
- rts pc
-
- type:
- cmp (r2),$32.
- beq 2f
- cmp (r2),$34.
- beq 2f
- tst (r2)
- bne 1f
- 2:
- mov 2(r2),r3
- mov symtab(r3),r3
- rts r5
- 1:
- cmp (r2),$2
- bne 1f
- mov 2(r2),r3
- rts r5
- 1:
- cmp (r2),$14.
- blo 1f
- mov $logcon,r3
- rts r5
- 1:
- mov r2,-(sp)
- mov 2(r2),r2
- bne 1f
- mov (sp),r2
- mov 4(r2),r2
- jsr r5,type
- br 2f
- 1:
- jsr r5,type
- mov (sp),r2
- mov r3,-(sp)
- mov 4(r2),r2
- jsr r5,type
- mov (sp)+,r2
- jsr pc,maxtyp
- mov r2,r3
- 2:
- mov (sp)+,r2
- rts r5
-
- maxtyp:
- mov r2,r0
- cmp r2,r3
- bhis 2f
- mov r3,r2
- 2:
- clrb r2
- bic $!7,r0
- bic $!7,r3
- cmp r0,r3
- bhis 2f
- mov r3,r0
- 2:
- bis r0,r2
- rts pc
-
- optab:
- <ng>
- <pi>
- <pr>
- <dv>
- <mp>
- <sb>
- <ad>
- <lt>
- <le>
- <eq>
- <ne>
- <gt>
- <ge>
- <nt>
- <an>
- <or>
-
-