Optimizing risc instructions for arithmetic expressions
This commit is contained in:
@ -322,12 +322,29 @@ and c_ss_sa
|
|||||||
| SimpleInteger (i) -> (LoadI (register, i) :: convertedcode, m)
|
| SimpleInteger (i) -> (LoadI (register, i) :: convertedcode, m)
|
||||||
| SimplePlus (a1, a2) -> (
|
| SimplePlus (a1, a2) -> (
|
||||||
match (a1, a2) with
|
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)
|
| (SimpleInteger (i), a)
|
||||||
| (a, SimpleInteger (i)) -> (
|
| (a, SimpleInteger (i)) -> (
|
||||||
let partialresreg, m, _partialresvar = 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
|
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||||
(BImmOp (AddI, partialresreg, i, register) :: convertedcode, m)
|
(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 partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||||
let partialresreg2, m, _partialresvar2 = 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) -> (
|
| SimpleMinus (a1, a2) -> (
|
||||||
match (a1, a2) with
|
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)) -> (
|
| (a, SimpleInteger (i)) -> (
|
||||||
let partialresreg, m, _partialresvar = 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
|
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||||
(BImmOp (SubI, partialresreg, i, register) :: convertedcode, m)
|
(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 partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||||
let partialresreg2, m, _partialresvar2 = 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) -> (
|
| SimpleTimes (a1, a2) -> (
|
||||||
match (a1, a2) with
|
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)
|
| (SimpleInteger (i), a)
|
||||||
| (a, SimpleInteger (i)) -> (
|
| (a, SimpleInteger (i)) -> (
|
||||||
let partialresreg, m, _partialresvar = 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
|
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||||
(BImmOp (MultI, partialresreg, i, register) :: convertedcode, m)
|
(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 partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||||
let partialresreg2, m, _partialresvar2 = 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) -> (
|
| SimpleDivision (a1, a2) -> (
|
||||||
match (a1, a2) with
|
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)) -> (
|
| (a, SimpleInteger (i)) -> (
|
||||||
let partialresreg, m, _partialresvar = 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
|
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||||
(BImmOp (DivI, partialresreg, i, register) :: convertedcode, m)
|
(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 partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||||
let partialresreg2, m, _partialresvar2 = 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) -> (
|
| SimpleModulo (a1, a2) -> (
|
||||||
match (a1, a2) with
|
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)) -> (
|
| (a, SimpleInteger (i)) -> (
|
||||||
let partialresreg, m, _partialresvar = 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
|
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||||
(BImmOp (ModI, partialresreg, i, register) :: convertedcode, m)
|
(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 partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||||
let partialresreg2, m, _partialresvar2 = 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) -> (
|
| SimplePower (a1, a2) -> (
|
||||||
match (a1, a2) with
|
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)) -> (
|
| (a, SimpleInteger (i)) -> (
|
||||||
let partialresreg, m, _partialresvar = 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
|
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||||
(BImmOp (PowI, partialresreg, i, register) :: convertedcode, m)
|
(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 partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||||
let partialresreg2, m, _partialresvar2 = RegisterMap.get_fresh_register m in
|
let partialresreg2, m, _partialresvar2 = RegisterMap.get_fresh_register m in
|
||||||
|
|||||||
Reference in New Issue
Block a user