Optimizing risc instructions for boolean expressions
This commit is contained in:
@ -199,7 +199,7 @@ and c_ss_sb
|
|||||||
)
|
)
|
||||||
| SimpleBNot (b) -> (
|
| SimpleBNot (b) -> (
|
||||||
match (b) with
|
match (b) with
|
||||||
| SimpleBoolean (b) ->(
|
| SimpleBoolean (b) -> (
|
||||||
if b then
|
if b then
|
||||||
(LoadI (register, 0) :: convertedcode, m)
|
(LoadI (register, 0) :: convertedcode, m)
|
||||||
else
|
else
|
||||||
@ -213,12 +213,29 @@ and c_ss_sb
|
|||||||
)
|
)
|
||||||
| SimpleBCmp (a1, a2) -> (
|
| SimpleBCmp (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 (EqI, 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 (EqI, partialresreg, i, register) :: convertedcode, m)
|
(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 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
|
||||||
@ -229,6 +246,14 @@ and c_ss_sb
|
|||||||
)
|
)
|
||||||
| SimpleBCmpLess (a1, a2) -> (
|
| SimpleBCmpLess (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
|
||||||
|
(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) -> (
|
| (SimpleInteger (i), a) -> (
|
||||||
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
|
||||||
@ -239,6 +264,23 @@ and c_ss_sb
|
|||||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||||
(BImmOp (LessI, partialresreg, i, register) :: convertedcode, m)
|
(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 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
|
||||||
@ -249,6 +291,14 @@ and c_ss_sb
|
|||||||
)
|
)
|
||||||
| SimpleBCmpLessEq (a1, a2) -> (
|
| SimpleBCmpLessEq (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
|
||||||
|
(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) -> (
|
| (SimpleInteger (i), a) -> (
|
||||||
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
|
||||||
@ -259,6 +309,23 @@ and c_ss_sb
|
|||||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||||
(BImmOp (LessEqI, partialresreg, i, register) :: convertedcode, m)
|
(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 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
|
||||||
@ -269,6 +336,14 @@ and c_ss_sb
|
|||||||
)
|
)
|
||||||
| SimpleBCmpGreater (a1, a2) -> (
|
| SimpleBCmpGreater (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
|
||||||
|
(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) -> (
|
| (SimpleInteger (i), a) -> (
|
||||||
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
|
||||||
@ -279,6 +354,23 @@ and c_ss_sb
|
|||||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||||
(BImmOp (MoreI, partialresreg, i, register) :: convertedcode, m)
|
(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 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
|
||||||
@ -289,6 +381,14 @@ and c_ss_sb
|
|||||||
)
|
)
|
||||||
| SimpleBCmpGreaterEq (a1, a2) -> (
|
| SimpleBCmpGreaterEq (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
|
||||||
|
(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) -> (
|
| (SimpleInteger (i), a) -> (
|
||||||
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
|
||||||
@ -299,6 +399,23 @@ and c_ss_sb
|
|||||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||||
(BImmOp (MoreEqI, partialresreg, i, register) :: convertedcode, m)
|
(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 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