diff --git a/lib/miniImp/CfgRISC.ml b/lib/miniImp/CfgRISC.ml index 7c6d42e..b6f9429 100644 --- a/lib/miniImp/CfgRISC.ml +++ b/lib/miniImp/CfgRISC.ml @@ -322,12 +322,29 @@ and c_ss_sa | SimpleInteger (i) -> (LoadI (register, i) :: convertedcode, m) | SimplePlus (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 (AddI, 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 (AddI, 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 (Add, 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 (Add, 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 @@ -338,11 +355,43 @@ and c_ss_sa ) | SimpleMinus (a1, a2) -> ( match (a1, a2) with + | (SimpleInteger (i), SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + (BRegOp (Sub, partialresreg, xreg, register) :: LoadI (partialresreg, i) :: convertedcode, m) + ) + | (SimpleVariable (x), SimpleInteger (i)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (SubI, xreg, i, register) :: convertedcode, m) + ) + | (SimpleInteger (i), a) -> ( + let partialresregi, m, _partialresvari = RegisterMap.get_fresh_register m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (Sub, partialresregi, partialresreg, register) :: LoadI (partialresregi, i) :: convertedcode, m) + ) | (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 (SubI, 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 (Sub, 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 (Sub, 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 (Sub, 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 @@ -353,12 +402,29 @@ and c_ss_sa ) | SimpleTimes (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 (MultI, 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 (MultI, 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 (Mult, 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 (Mult, 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 @@ -369,11 +435,43 @@ and c_ss_sa ) | SimpleDivision (a1, a2) -> ( match (a1, a2) with + | (SimpleInteger (i), SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + (BRegOp (Div, partialresreg, xreg, register) :: LoadI (partialresreg, i) :: convertedcode, m) + ) + | (SimpleVariable (x), SimpleInteger (i)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (DivI, xreg, i, register) :: convertedcode, m) + ) + | (SimpleInteger (i), a) -> ( + let partialresregi, m, _partialresvari = RegisterMap.get_fresh_register m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (Div, partialresregi, partialresreg, register) :: LoadI (partialresregi, i) :: convertedcode, m) + ) | (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 (DivI, 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 (Div, 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 (Div, 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 (Div, 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 @@ -384,11 +482,43 @@ and c_ss_sa ) | SimpleModulo (a1, a2) -> ( match (a1, a2) with + | (SimpleInteger (i), SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + (BRegOp (Mod, partialresreg, xreg, register) :: LoadI (partialresreg, i) :: convertedcode, m) + ) + | (SimpleVariable (x), SimpleInteger (i)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (ModI, xreg, i, register) :: convertedcode, m) + ) + | (SimpleInteger (i), a) -> ( + let partialresregi, m, _partialresvari = RegisterMap.get_fresh_register m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (Mod, partialresregi, partialresreg, register) :: LoadI (partialresregi, i) :: convertedcode, m) + ) | (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 (ModI, 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 (Mod, 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 (Mod, 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 (Mod, 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 @@ -399,11 +529,43 @@ and c_ss_sa ) | SimplePower (a1, a2) -> ( match (a1, a2) with + | (SimpleInteger (i), SimpleVariable (x)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + (BRegOp (Pow, partialresreg, xreg, register) :: LoadI (partialresreg, i) :: convertedcode, m) + ) + | (SimpleVariable (x), SimpleInteger (i)) -> ( + let xreg, m = RegisterMap.get_or_set_register x m in + (BImmOp (PowI, xreg, i, register) :: convertedcode, m) + ) + | (SimpleInteger (i), a) -> ( + let partialresregi, m, _partialresvari = RegisterMap.get_fresh_register m in + let partialresreg, m, _partialresvar = RegisterMap.get_fresh_register m in + let convertedcode, m = c_ss_sa a m convertedcode partialresreg in + (BRegOp (Pow, partialresregi, partialresreg, register) :: LoadI (partialresregi, i) :: convertedcode, m) + ) | (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 (PowI, 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 (Pow, 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 (Pow, 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 (Pow, 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