
 ttl Code generation - 3
 pag

*
* Code generation for binary operators (class 3)
*

binry lda moprtr,y get operator
 ldb #61 set default compare type
 stb comtyp (!=)
binrya cmpa #47 is it bitwise op?
 lbhs bitop
 cmpa #45 is it shift operator?
 lbhs shfop
 cmpa #42 is it mult op?
 lbhs mulop

*
* Process additive operator (add & subtract)
*

addop cmpa #41 is it subtract?
 lbeq subop
 lbsr addchk check valid operands
 beq addopr error?
 lbsr carng arrange operands
 lbsr ldfop load up first operand
 ldd #0 clear var name
 std crdvar
 ldx #addtb point to add table
 lbra dobop do it
addopr rts return

* add op table

addtb fdb add0
 fdb add1
 fdb add2
 fdb add3
 fdb add4
 fdb add5


*
* Add char to char
*

add0 pshs x save pointer
 lbsr otadb output "addb"
 puls x
 lbra gadr generate address

* add char to int

add1 pshs x
 lbsr otclra output "clra"
 puls x
 bra add3

* add int to char
*
* treats char constants here as integers!

add2 lda 0,x get location
 cmpa #CONLOC is it constant?
 beq add3
add24 bsr add0
 lbra otadc0 output "adca #0"

* add int to int

add3 pshs x
 lbsr otadd output "addd"
 puls x
 lbra gadr generate address

* add long to long

add4 rts

* add fp to fp

add5 rts


*
* Check for valid add operands
*

addchk lbsr pairs classify pairing
 beq addchr error?
 lda ptrref check ptr refs
 cmpa #2
addchr rts return

*
* Do binary code gen
*
dobop ldb oppair check types
 aslb
 ldx b,x point to correct routine
 pshs x
 tst revops reversed operands?
 bne dobop2
 ldx #op2loc point to op 2
 bra dobop4
dobop2 ldx #op1loc point to op 1
dobop4 jsr [0,s++] go to routine
 lbra gtcur type current

*
* Generate bit operator code
*

bitop suba #47 remove bias
 asla
 ldx #obitab point to name table
 ldx a,x get correct one (and, or, etc)
 stx ostptr save the pointer
 lbsr inchk check for integral types
 beq bitopr
 lbsr carng rearrange if necessary
 lbsr ldfop load up first operand
 ldx #bittb
 lbra dobop do generation
bitopr clra set error
 rts return

obitab fdb xand
 fdb xor
 fdb xeor

bittb fdb bit0
 fdb bit1
 fdb bit2
 fdb bit3
 fdb bit4

* bit char to char

bit0 pshs x
 ldx ostptr get type pointer
 lbsr probj output type
 lbsr otacb output "b "
 puls x
 lbra gadr generate address

* bit char to int

bit1 bra bit0 same as char-char

* bit int to char

bit2 bra bit0 same as char-char

* bit int to int

bit3 pshs x
 ldx ostptr point to type
 lbsr probj output it
 lbsr otaca output "a "
 ldx 0,s reset x
 inc btypo set bit type flag
 lbsr gadr generate address
 ldx ostptr get pointer
 lbsr probj output type
 lbsr otacb output "b "
 puls x
 inc plone set 'plus one' flag
 lbra gadr

* bit long to long

bit4 rts


*
* Check for integral operand pairs only
*

inchk lbsr pairs check pairing type
 beq inchkr error?
 lda oppair get pairing
 cmpa #5 is it fp?
 beq inchkr
 rts return true
inchkr clra set error
 rts return



 pag

subop rts

shfop rts

mulop rts


