Better styling for miniImp
This commit is contained in:
@ -49,13 +49,21 @@ module RISCSimpleStatements = struct
|
||||
let pp (ppf: out_channel) (v: t) : unit =
|
||||
let rec pp_t (ppf: out_channel) (v: t) : unit =
|
||||
match v with
|
||||
Nop -> Printf.fprintf ppf "Nop"
|
||||
| BRegOp (b, r1, r2, r3) -> Printf.fprintf ppf "%a r%s r%s => r%s" pp_brop b r1.index r2.index r3.index
|
||||
| BImmOp (b, r1, i, r3) -> Printf.fprintf ppf "%a r%s %d => r%s" pp_biop b r1.index i r3.index
|
||||
| URegOp (u, r1, r2) -> Printf.fprintf ppf "%a r%s => r%s" pp_urop u r1.index r2.index
|
||||
| Load (r1, r2) -> Printf.fprintf ppf "Load r%s => r%s" r1.index r2.index
|
||||
| LoadI (i, r2) -> Printf.fprintf ppf "LoadI %d => r%s" i r2.index
|
||||
| Store (r1, r2) -> Printf.fprintf ppf "Store r%s => r%s" r1.index r2.index
|
||||
Nop ->
|
||||
Printf.fprintf ppf "Nop"
|
||||
| BRegOp (b, r1, r2, r3) ->
|
||||
Printf.fprintf ppf "%a r%s r%s => r%s"
|
||||
pp_brop b r1.index r2.index r3.index
|
||||
| BImmOp (b, r1, i, r3) ->
|
||||
Printf.fprintf ppf "%a r%s %d => r%s" pp_biop b r1.index i r3.index
|
||||
| URegOp (u, r1, r2) ->
|
||||
Printf.fprintf ppf "%a r%s => r%s" pp_urop u r1.index r2.index
|
||||
| Load (r1, r2) ->
|
||||
Printf.fprintf ppf "Load r%s => r%s" r1.index r2.index
|
||||
| LoadI (i, r2) ->
|
||||
Printf.fprintf ppf "LoadI %d => r%s" i r2.index
|
||||
| Store (r1, r2) ->
|
||||
Printf.fprintf ppf "Store r%s => r%s" r1.index r2.index
|
||||
and pp_brop (ppf: out_channel) (v: brop) : unit =
|
||||
match v with
|
||||
Add -> Printf.fprintf ppf "Add"
|
||||
@ -118,7 +126,8 @@ module RegisterMap = struct
|
||||
({index = string_of_int !globalcounter},
|
||||
{assignments =
|
||||
Types.VariableMap.add x
|
||||
({index = (string_of_int !globalcounter)}: RISCSimpleStatements.register)
|
||||
({index = (string_of_int !globalcounter)}
|
||||
: RISCSimpleStatements.register)
|
||||
m.assignments}))
|
||||
| Some i -> (i, m)
|
||||
|
||||
@ -129,7 +138,8 @@ module RegisterMap = struct
|
||||
({index = string_of_int !globalcounter},
|
||||
{assignments =
|
||||
Types.VariableMap.add freshvariable
|
||||
({index = string_of_int !globalcounter}: RISCSimpleStatements.register)
|
||||
({index = string_of_int !globalcounter}
|
||||
: RISCSimpleStatements.register)
|
||||
m.assignments},
|
||||
freshvariable)
|
||||
|
||||
@ -182,11 +192,16 @@ and c_ss_sb
|
||||
(convertedcode @ [LoadI (0, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sb b1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sb b2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (And, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (And, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| SimpleBOr (b1, b2) -> (
|
||||
@ -200,11 +215,16 @@ and c_ss_sb
|
||||
(LoadI (1, register) :: convertedcode, m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sb b1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sb b2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (Or, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (Or, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| SimpleBNot (b) -> (
|
||||
@ -216,7 +236,9 @@ and c_ss_sb
|
||||
(LoadI (1, register) :: convertedcode, m)
|
||||
)
|
||||
| _ -> (
|
||||
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_sb b m convertedcode partialresreg in
|
||||
(convertedcode @ [URegOp (Not, partialresreg, register)], m)
|
||||
)
|
||||
@ -230,7 +252,9 @@ and c_ss_sb
|
||||
)
|
||||
| (SimpleInteger (i), a)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (EqI, partialresreg, i, register)], m)
|
||||
)
|
||||
@ -241,17 +265,26 @@ and c_ss_sb
|
||||
)
|
||||
| (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 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
|
||||
(convertedcode @ [BRegOp (Eq, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sa a1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sa a2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (Eq, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (Eq, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| SimpleBCmpLess (a1, a2) -> (
|
||||
@ -265,12 +298,16 @@ and c_ss_sb
|
||||
(convertedcode @ [BImmOp (LessI, xreg, i, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (MoreI, partialresreg, i, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (LessI, partialresreg, i, register)], m)
|
||||
)
|
||||
@ -281,22 +318,31 @@ and c_ss_sb
|
||||
)
|
||||
| (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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Less, xreg, partialresreg, register)], 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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Less, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sa a1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sa a2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (Less, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (Less, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| SimpleBCmpLessEq (a1, a2) -> (
|
||||
@ -310,12 +356,16 @@ and c_ss_sb
|
||||
(convertedcode @ [BImmOp (LessEqI, xreg, i, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (MoreEqI, partialresreg, i, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (LessEqI, partialresreg, i, register)], m)
|
||||
)
|
||||
@ -326,22 +376,31 @@ and c_ss_sb
|
||||
)
|
||||
| (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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (LessEq, xreg, partialresreg, register)], 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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (LessEq, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sa a1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sa a2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (LessEq, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (LessEq, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| SimpleBCmpGreater (a1, a2) -> (
|
||||
@ -355,12 +414,16 @@ and c_ss_sb
|
||||
(convertedcode @ [BImmOp (MoreI, xreg, i, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (LessI, partialresreg, i, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (MoreI, partialresreg, i, register)], m)
|
||||
)
|
||||
@ -371,22 +434,31 @@ and c_ss_sb
|
||||
)
|
||||
| (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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (More, xreg, partialresreg, register)], 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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (More, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sa a1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sa a2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (More, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (More, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| SimpleBCmpGreaterEq (a1, a2) -> (
|
||||
@ -400,12 +472,16 @@ and c_ss_sb
|
||||
(convertedcode @ [BImmOp (MoreEqI, xreg, i, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (LessEqI, partialresreg, i, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (MoreEqI, partialresreg, i, register)], m)
|
||||
)
|
||||
@ -416,22 +492,31 @@ and c_ss_sb
|
||||
)
|
||||
| (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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (MoreEq, xreg, partialresreg, register)], 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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (MoreEq, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sa a1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sa a2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (MoreEq, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (MoreEq, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
|
||||
@ -461,7 +546,9 @@ and c_ss_sa
|
||||
)
|
||||
| (SimpleInteger (i), a)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (AddI, partialresreg, i, register)], m)
|
||||
)
|
||||
@ -473,37 +560,56 @@ and c_ss_sa
|
||||
| (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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Add, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sa a1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sa a2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (Add, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (Add, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| 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
|
||||
(convertedcode @ [LoadI (i, partialresreg); BRegOp (Sub, partialresreg, xreg, register)], m)
|
||||
let partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
(convertedcode @
|
||||
[LoadI (i, partialresreg);
|
||||
BRegOp (Sub, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (SimpleVariable (x), SimpleInteger (i)) -> (
|
||||
let xreg, m = RegisterMap.get_or_set_register x m in
|
||||
(convertedcode @ [BImmOp (SubI, xreg, i, register)], 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 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
|
||||
(convertedcode @ [LoadI (i, partialresregi); BRegOp (Sub, partialresregi, partialresreg, register)], m)
|
||||
(convertedcode @
|
||||
[LoadI (i, partialresregi);
|
||||
BRegOp (Sub, partialresregi, partialresreg, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (SubI, partialresreg, i, register)], m)
|
||||
)
|
||||
@ -514,22 +620,31 @@ and c_ss_sa
|
||||
)
|
||||
| (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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Sub, xreg, partialresreg, register)], 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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Sub, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sa a1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sa a2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (Sub, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (Sub, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| SimpleTimes (a1, a2) -> (
|
||||
@ -541,7 +656,9 @@ and c_ss_sa
|
||||
)
|
||||
| (SimpleInteger (i), a)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (MultI, partialresreg, i, register)], m)
|
||||
)
|
||||
@ -553,37 +670,56 @@ and c_ss_sa
|
||||
| (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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Mult, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sa a1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sa a2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (Mult, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (Mult, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| 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
|
||||
(convertedcode @ [LoadI (i, partialresreg); BRegOp (Div, partialresreg, xreg, register)], m)
|
||||
let partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
(convertedcode @
|
||||
[LoadI (i, partialresreg);
|
||||
BRegOp (Div, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (SimpleVariable (x), SimpleInteger (i)) -> (
|
||||
let xreg, m = RegisterMap.get_or_set_register x m in
|
||||
(convertedcode @ [BImmOp (DivI, xreg, i, register)], 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 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
|
||||
(convertedcode @ [LoadI (i, partialresregi); BRegOp (Div, partialresregi, partialresreg, register)], m)
|
||||
(convertedcode @
|
||||
[LoadI (i, partialresregi);
|
||||
BRegOp (Div, partialresregi, partialresreg, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (DivI, partialresreg, i, register)], m)
|
||||
)
|
||||
@ -594,43 +730,64 @@ and c_ss_sa
|
||||
)
|
||||
| (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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Div, xreg, partialresreg, register)], 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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Div, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sa a1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sa a2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (Div, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (Div, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| 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
|
||||
(convertedcode @ [LoadI (i, partialresreg); BRegOp (Mod, partialresreg, xreg, register)], m)
|
||||
let partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
(convertedcode @
|
||||
[LoadI (i, partialresreg);
|
||||
BRegOp (Mod, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (SimpleVariable (x), SimpleInteger (i)) -> (
|
||||
let xreg, m = RegisterMap.get_or_set_register x m in
|
||||
(convertedcode @ [BImmOp (ModI, xreg, i, register)], 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 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
|
||||
(convertedcode @ [LoadI (i, partialresregi); BRegOp (Mod, partialresregi, partialresreg, register)], m)
|
||||
(convertedcode @
|
||||
[LoadI (i, partialresregi);
|
||||
BRegOp (Mod, partialresregi, partialresreg, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (ModI, partialresreg, i, register)], m)
|
||||
)
|
||||
@ -641,43 +798,64 @@ and c_ss_sa
|
||||
)
|
||||
| (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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Mod, xreg, partialresreg, register)], 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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Mod, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sa a1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sa a2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (Mod, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (Mod, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| 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
|
||||
(convertedcode @ [LoadI (i, partialresreg); BRegOp (Pow, partialresreg, xreg, register)], m)
|
||||
let partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
(convertedcode @
|
||||
[LoadI (i, partialresreg);
|
||||
BRegOp (Pow, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (SimpleVariable (x), SimpleInteger (i)) -> (
|
||||
let xreg, m = RegisterMap.get_or_set_register x m in
|
||||
(convertedcode @ [BImmOp (PowI, xreg, i, register)], 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 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
|
||||
(convertedcode @ [LoadI (i, partialresregi); BRegOp (Pow, partialresregi, partialresreg, register)], m)
|
||||
(convertedcode @
|
||||
[LoadI (i, partialresregi);
|
||||
BRegOp (Pow, partialresregi, partialresreg, register)], m)
|
||||
)
|
||||
| (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
|
||||
(convertedcode @ [BImmOp (PowI, partialresreg, i, register)], m)
|
||||
)
|
||||
@ -688,22 +866,31 @@ and c_ss_sa
|
||||
)
|
||||
| (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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Pow, xreg, partialresreg, register)], 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 partialresreg, m, _partialresvar =
|
||||
RegisterMap.get_fresh_register m
|
||||
in
|
||||
let convertedcode, m = c_ss_sa a m convertedcode partialresreg in
|
||||
(convertedcode @ [BRegOp (Pow, partialresreg, xreg, register)], m)
|
||||
)
|
||||
| (_, _) -> (
|
||||
let partialresreg1, m, _partialresvar1 = RegisterMap.get_fresh_register m in
|
||||
let partialresreg2, m, _partialresvar2 = 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 convertedcode, m = c_ss_sa a1 m convertedcode partialresreg1 in
|
||||
let convertedcode, m = c_ss_sa a2 m convertedcode partialresreg2 in
|
||||
(convertedcode @ [BRegOp (Pow, partialresreg1, partialresreg2, register)], m)
|
||||
(convertedcode @
|
||||
[BRegOp (Pow, partialresreg1, partialresreg2, register)], m)
|
||||
)
|
||||
)
|
||||
| SimpleRand (a) -> (
|
||||
@ -742,17 +929,17 @@ let helper
|
||||
risccode
|
||||
|
||||
let convert (prg: CfgImp.SSCfg.t) : RISCCfg.t =
|
||||
match prg with
|
||||
{ empty: bool;
|
||||
nodes: Cfg.NodeSet.t;
|
||||
edges: (Cfg.Node.t * (Cfg.Node.t option)) Cfg.NodeMap.t;
|
||||
reverseEdges: (Cfg.Node.t list) Cfg.NodeMap.t;
|
||||
inputVal: int option;
|
||||
inputOutputVar: (string * string) option;
|
||||
initial: Cfg.Node.t option;
|
||||
terminal: Cfg.Node.t option;
|
||||
content: CfgImp.SimpleStatements.t list Cfg.NodeMap.t
|
||||
} ->
|
||||
let ({ empty: bool;
|
||||
nodes: Cfg.NodeSet.t;
|
||||
edges: (Cfg.Node.t * (Cfg.Node.t option)) Cfg.NodeMap.t;
|
||||
reverseEdges: (Cfg.Node.t list) Cfg.NodeMap.t;
|
||||
inputVal: int option;
|
||||
inputOutputVar: (string * string) option;
|
||||
initial: Cfg.Node.t option;
|
||||
terminal: Cfg.Node.t option;
|
||||
content: CfgImp.SimpleStatements.t list Cfg.NodeMap.t
|
||||
}: CfgImp.SSCfg.t) = prg
|
||||
in
|
||||
let initial_bindings =
|
||||
match inputOutputVar with
|
||||
| Some (i, o) -> (
|
||||
|
||||
Reference in New Issue
Block a user