diff --git a/lib/miniImp/CfgRISC.ml b/lib/miniImp/CfgRISC.ml index b6f9429..1642220 100644 --- a/lib/miniImp/CfgRISC.ml +++ b/lib/miniImp/CfgRISC.ml @@ -199,7 +199,7 @@ and c_ss_sb ) | SimpleBNot (b) -> ( match (b) with - | SimpleBoolean (b) ->( + | SimpleBoolean (b) -> ( if b then (LoadI (register, 0) :: convertedcode, m) else @@ -213,12 +213,29 @@ and c_ss_sb ) | SimpleBCmp (a1, a2) -> ( match (a1, a2) with + | (SimpleInteger (i), SimpleVariable (x)) + | (SimpleVariable (x), SimpleInteger (i)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (EqI, xreg, i, register) :: convertedcode, m) + ) | (SimpleInteger (i), a) | (a, SimpleInteger (i)) -> ( let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in let convertedcode, m = c_ss_sa a m convertedcode partialresreg in (BImmOp (EqI, partialresreg, i, register) :: convertedcode, m) ) + | (SimpleVariable (x), SimpleVariable (y)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let yreg, m = RegisterMap.get_or_set_register y m in + (BRegOp (Eq, xreg, yreg, register) :: convertedcode, m) + ) + | (SimpleVariable (x), a) + | (a, SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (Eq, partialresreg, xreg, register) :: convertedcode, m) + ) | (_, _) -> ( let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in let partialresreg2, m, _partialresvar2 = RegisterMap.get_fresh_register m in @@ -229,6 +246,14 @@ and c_ss_sb ) | SimpleBCmpLess (a1, a2) -> ( match (a1, a2) with + | (SimpleInteger (i), SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (MoreI, xreg, i, register) :: convertedcode, m) + ) + | (SimpleVariable (x), SimpleInteger (i)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (LessI, xreg, i, register) :: convertedcode, m) + ) | (SimpleInteger (i), a) -> ( let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in let convertedcode, m = c_ss_sa a m convertedcode partialresreg in @@ -239,6 +264,23 @@ and c_ss_sb let convertedcode, m = c_ss_sa a m convertedcode partialresreg in (BImmOp (LessI, partialresreg, i, register) :: convertedcode, m) ) + | (SimpleVariable (x), SimpleVariable (y)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let yreg, m = RegisterMap.get_or_set_register y m in + (BRegOp (Less, xreg, yreg, register) :: convertedcode, m) + ) + | (SimpleVariable (x), a) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (Less, xreg, partialresreg, register) :: convertedcode, m) + ) + | (a, SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (Less, partialresreg, xreg, register) :: convertedcode, m) + ) | (_, _) -> ( let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in let partialresreg2, m, _partialresvar2 = RegisterMap.get_fresh_register m in @@ -249,6 +291,14 @@ and c_ss_sb ) | SimpleBCmpLessEq (a1, a2) -> ( match (a1, a2) with + | (SimpleInteger (i), SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (MoreEqI, xreg, i, register) :: convertedcode, m) + ) + | (SimpleVariable (x), SimpleInteger (i)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (LessEqI, xreg, i, register) :: convertedcode, m) + ) | (SimpleInteger (i), a) -> ( let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in let convertedcode, m = c_ss_sa a m convertedcode partialresreg in @@ -259,6 +309,23 @@ and c_ss_sb let convertedcode, m = c_ss_sa a m convertedcode partialresreg in (BImmOp (LessEqI, partialresreg, i, register) :: convertedcode, m) ) + | (SimpleVariable (x), SimpleVariable (y)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let yreg, m = RegisterMap.get_or_set_register y m in + (BRegOp (LessEq, xreg, yreg, register) :: convertedcode, m) + ) + | (SimpleVariable (x), a) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (LessEq, xreg, partialresreg, register) :: convertedcode, m) + ) + | (a, SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (LessEq, partialresreg, xreg, register) :: convertedcode, m) + ) | (_, _) -> ( let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in let partialresreg2, m, _partialresvar2 = RegisterMap.get_fresh_register m in @@ -269,6 +336,14 @@ and c_ss_sb ) | SimpleBCmpGreater (a1, a2) -> ( match (a1, a2) with + | (SimpleInteger (i), SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (LessI, xreg, i, register) :: convertedcode, m) + ) + | (SimpleVariable (x), SimpleInteger (i)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (MoreI, xreg, i, register) :: convertedcode, m) + ) | (SimpleInteger (i), a) -> ( let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in let convertedcode, m = c_ss_sa a m convertedcode partialresreg in @@ -279,6 +354,23 @@ and c_ss_sb let convertedcode, m = c_ss_sa a m convertedcode partialresreg in (BImmOp (MoreI, partialresreg, i, register) :: convertedcode, m) ) + | (SimpleVariable (x), SimpleVariable (y)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let yreg, m = RegisterMap.get_or_set_register y m in + (BRegOp (More, xreg, yreg, register) :: convertedcode, m) + ) + | (SimpleVariable (x), a) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (More, xreg, partialresreg, register) :: convertedcode, m) + ) + | (a, SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (More, partialresreg, xreg, register) :: convertedcode, m) + ) | (_, _) -> ( let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in let partialresreg2, m, _partialresvar2 = RegisterMap.get_fresh_register m in @@ -289,6 +381,14 @@ and c_ss_sb ) | SimpleBCmpGreaterEq (a1, a2) -> ( match (a1, a2) with + | (SimpleInteger (i), SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (LessEqI, xreg, i, register) :: convertedcode, m) + ) + | (SimpleVariable (x), SimpleInteger (i)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (MoreEqI, xreg, i, register) :: convertedcode, m) + ) | (SimpleInteger (i), a) -> ( let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in let convertedcode, m = c_ss_sa a m convertedcode partialresreg in @@ -299,6 +399,23 @@ and c_ss_sb let convertedcode, m = c_ss_sa a m convertedcode partialresreg in (BImmOp (MoreEqI, partialresreg, i, register) :: convertedcode, m) ) + | (SimpleVariable (x), SimpleVariable (y)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let yreg, m = RegisterMap.get_or_set_register y m in + (BRegOp (MoreEq, xreg, yreg, register) :: convertedcode, m) + ) + | (SimpleVariable (x), a) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (MoreEq, xreg, partialresreg, register) :: convertedcode, m) + ) + | (a, SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (MoreEq, partialresreg, xreg, register) :: convertedcode, m) + ) | (_, _) -> ( let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in let partialresreg2, m, _partialresvar2 = RegisterMap.get_fresh_register m in