improve jumps

notation (a)  address,  op.c.a.b  field 

1. jmp to ret => ret

  (a) jmp.- to (a1) ret.x  =>  (a) ret.x

  if (opAt a) == jmp  &&  (opAt a1) == ret
    copy a1 to a

2. jx to jmp.y => jx.y

  (a) jx.- to (a1) jmp.y  =>  (a) jx.y.-

  if (opAt a1) == jmp
    patchA a (dispAt a1)

3. for macro and  (and (and x y) z)
   jx to lit 0, jf.y => jx.y

   (a) jx.- to (a1) mov.v.0, (a1+2) jf.y.v.-  => (a) jx.y.- 

  if isLit0 a1
    if (opAt a1+2) == jf  &&  (argAt a1) == (destAt a1+2)
      patchA a (dispAt a1+2)

4. for macro and  (and (and x y) z) 
   jx to lit 0, jt.y, $z => jx.z

   (a) jx.- to (a1) mov.v.0, (a1+2) jt.y.v.-, (z) => (a) jx.z.-

  if isLit0 a1
    if (opAt a1+2) == jt  &&  (argAt a1) == (destAt a1+2)
      patchA a a1+4

5. logic jmp to jf.y $ -> jinvlog.y jmp.$

   (a-2) lop.v.s.t, (a) jmp.- to (a1) jf.y.v.-, (z) =>
        (a-2) jinv.y.s.t, (a) jmp.z

  if (opAt a) == jmp  &&  (opAt a1) == jf
    if islogic (opAt a-2)  &&  (destAt a-2) == (destAt a1)
      patch a-2 (enc3 jinv (dispAt a-2) (dispAt a1))
      patchA a a1+2

6. macro or
   rule5: mov.v.1, jmp to jf.y.v,$ => jmp.$

   (a-2) mov.v.1, (a) jmp.- to (a1) jf.y.v, (z) => (a-2) jmp.z

  if (isLit1 a-2) && (argAt a-2) == (destAt a1)
    patch a-2 (enc3 jmp 0 a1+2)

7. macro or
   rule6: mov rv x, jmp to jf.y,$ -> jf.y x, jmp.$

   (a-2) mov.v.x, (a) jmp.- to (a1) jf.y.v, (z) =>
      (a-2) jf.y.x, (a) jmp.z

  if (opAt a-2) == mov && (argAt a-2) == (destAt a1)
    patch a-2 (enc3 jf CS[a-1] (dispAt a1))
    CS[a-1] = 0
    patchA a a1+2

End

19 Dec 2010
