bop code generator  for u2-code

bop( e1 op e2 )

enumerate all cases

e = v, c, g, ex

v1-v2 = get v1, bop v2
v-c   = get v, bopi c
v-g   = ld g, bop v                   commute
      = ld g, put v2, get v, bop v2   otherwise
v-ex  = ex, bop v                     commute
      = ex, put v2, get v, bop v2     otherwise

c-v   = lit c, bop v
c1-c2 = lit c1, bopi c2
c-g   = ld g, bopi c                  commute
      = lit c, put v, ld g, bop v     otherwise
c-ex  = ex, bopi c                    commute
      = ex, put v, lit c, bop v       otherwise

g-v   = ld g, bop v
g-c   = ld g, bopi c
g1-g2 = ld g2, put v, ld g1, bop v
g-ex  = ex, put v, ld g, bop v

ex-v  = ex, bop v
ex-c  = ex, bopi c
ex-g  = ld g, put v, ex, bop v
ex1-ex2 = ex2, put v, ex1, bop v

rule

gen e 
  e is v = get v
  e is c = lit c
  e is g = ld g
  e is ex = gen ex

if      e2 is v = gen e2, bop v
else if e2 is c = gen e2, bopi c
else  (e2 is g, ex) 
  if op iscommute
    if      e1 is v = gen e2, bop v
    else if e1 is c = gen e2, bopi c
    else (e1 is g,ex) = gen e2, put v, gen e1, bop v
  else  (op isnotcommute)
    =  gen e2, put v, gen e1, bop v

expanded rule

if      e2 is v = gen e1, bop v
else if e2 is c = gen e1, bopi c
else if op iscommute && e1 is v = gen e2, bop v
else if op iscommute && e1 is c = gen e2, bopi c
else (catch all)
  = gen e2, put v, gen e1, bop v

immediate op

not complete: 
  addi, subi, bandi, bori, eqi, lti, lei, shli, shri

if e2 is c
  if bopi = gen e1, bopi c
  else    = lit c, put v, gen e1, bop v

for c && logic: eq, ne, lt, le, gt, ge
  available op: eqi, lti, lei

e eq c = gen e, eqi c
e ne c = gen e, eqi c, not
e lt c = gen e, lti c
e le c = gen e, lei c
e gt c = gen e, lei c, not
e ge c = gen e, lti c, not

"not" can be saved if logic is used in "if", as "not" can be combined with "jt/jf". For example

if e != 0  =>  get e, eqi 0, not, jf
           =>  get e, eqi 0, jt

in fact for lit 0, it can be further optimised
           =>  get e, jf

23 July 2008

modify bopi

in case  e1 is v and e2 is c and op iscommute there is a shorter sequence:
  lit c, bop v

reorder the sequence of rules

if      e2 is v = gen e1, bop v
else if op iscommute && e1 is v = gen e2, bop v
else if e2 is c = gen e1, bopi c
else if op iscommute && e1 is c = gen e2, bopi c
else (catch all)
  = gen e2, put v, gen e1, bop v


27 July 2008





