aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorazidar2015-05-21 13:18:09 -0400
committerazidar2015-05-21 13:18:09 -0400
commiteb125225cb96875f31a9af0db187406782b75223 (patch)
treea37566e307424a277a3d2fe229f069cbbcca4ae4 /src
parent81905d9fdd0debe8f666658607c2a20728baa86d (diff)
Added pad pass, used for flo backend
Diffstat (limited to 'src')
-rw-r--r--src/main/stanza/flo.stanza22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/main/stanza/flo.stanza b/src/main/stanza/flo.stanza
index 2cea9757..e870d7ed 100644
--- a/src/main/stanza/flo.stanza
+++ b/src/main/stanza/flo.stanza
@@ -26,24 +26,30 @@ defn pad-widths-e (desired:Int,e:Expression) -> Expression :
match(e) :
(e:DoPrim) :
println(e)
- val e* = map(pad-widths-e{desired,_},e)
- val i = int-width!(type(e*))
- if i > desired : error("Cannot pad a larger width to a smaller width")
- else if i == desired : e*
- else : DoPrim(PAD-OP,list(e*),list(),set-width(desired,type(e*)))
+ if contains?([ADD-OP,SUB-OP,MUL-OP,DIV-OP,MOD-OP,QUO-OP,REM-OP,ADD-WRAP-OP,SUB-WRAP-OP,MUX-OP,AS-UINT-OP,AS-SINT-OP,DYN-SHIFT-LEFT-OP,DYN-SHIFT-RIGHT-OP,SHIFT-LEFT-OP,SHIFT-RIGHT-OP,NEG-OP,CONVERT-OP,BIT-NOT-OP,BIT-OR-OP,BIT-XOR-OP,BIT-AND-REDUCE-OP,BIT-OR-REDUCE-OP,BIT-XOR-REDUCE-OP],op(e)) :
+ val e* = map(pad-widths-e{desired,_},e)
+ val i = int-width!(type(e*))
+ if i > desired :
+ DoPrim(BITS-SELECT-OP,list(e),list(0,desired),set-width(desired,type(e)))
+ else if i == desired : e*
+ else : DoPrim(PAD-OP,list(e*),list(),set-width(desired,type(e*)))
+ else : e
(e:WRef|WSubfield|WIndex) :
println(e)
val i = int-width!(type(e))
- if i > desired : error("Cannot pad a larger width to a smaller width")
+ if i > desired :
+ DoPrim(BITS-SELECT-OP,list(e),list(0,desired),set-width(desired,type(e)))
else if i == desired : e
else : DoPrim(PAD-OP,list(e),list(),set-width(desired,type(e)))
(e:UIntValue) :
val i = int-width!(type(e))
- if i > desired : error("Cannot pad a larger width to a smaller width")
+ if i > desired :
+ DoPrim(BITS-SELECT-OP,list(e),list(0,desired),set-width(desired,type(e)))
else : UIntValue(value(e),IntWidth(desired))
(e:SIntValue) :
val i = int-width!(type(e))
- if i > desired : error("Cannot pad a larger width to a smaller width")
+ if i > desired :
+ DoPrim(BITS-SELECT-OP,list(e),list(0,desired),set-width(desired,type(e)))
else : SIntValue(value(e),IntWidth(desired))
(e) : error(to-string $ e)