Improve casts (WIP)
This commit is contained in:
parent
a7ec08b379
commit
fc8e2acb71
@ -5,14 +5,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
func getWATType(t Type) string {
|
func getPrimitiveWATType(primitive PrimitiveType) string {
|
||||||
// TODO: tuples?
|
|
||||||
|
|
||||||
if t.Type != Type_Primitive {
|
|
||||||
panic("not implemented") // TODO: non-primitive types
|
|
||||||
}
|
|
||||||
|
|
||||||
primitive := t.Value.(PrimitiveType)
|
|
||||||
switch primitive {
|
switch primitive {
|
||||||
case Primitive_I8, Primitive_I16, Primitive_I32, Primitive_U8, Primitive_U16, Primitive_U32:
|
case Primitive_I8, Primitive_I16, Primitive_I32, Primitive_U8, Primitive_U16, Primitive_U32:
|
||||||
return "i32"
|
return "i32"
|
||||||
@ -29,6 +22,17 @@ func getWATType(t Type) string {
|
|||||||
panic("unhandled type")
|
panic("unhandled type")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getWATType(t Type) string {
|
||||||
|
// TODO: tuples?
|
||||||
|
|
||||||
|
if t.Type != Type_Primitive {
|
||||||
|
panic("not implemented") // TODO: non-primitive types
|
||||||
|
}
|
||||||
|
|
||||||
|
primitive := t.Value.(PrimitiveType)
|
||||||
|
return getPrimitiveWATType(primitive)
|
||||||
|
}
|
||||||
|
|
||||||
func getTypeCast(primitive PrimitiveType) string {
|
func getTypeCast(primitive PrimitiveType) string {
|
||||||
switch primitive {
|
switch primitive {
|
||||||
case Primitive_I8:
|
case Primitive_I8:
|
||||||
@ -76,38 +80,61 @@ func upcastTypeWAT(from PrimitiveType, to PrimitiveType) (string, error) {
|
|||||||
return "", errors.New("cannot upcast from or to bool")
|
return "", errors.New("cannot upcast from or to bool")
|
||||||
}
|
}
|
||||||
|
|
||||||
if from == Primitive_F32 && to == Primitive_F64 {
|
fromFloat := isFloatingPoint(from)
|
||||||
return "f64.promote_f32\n", nil
|
toFloat := isFloatingPoint(to)
|
||||||
}
|
if fromFloat && toFloat {
|
||||||
|
if to == Primitive_F32 {
|
||||||
if from == Primitive_F64 && to == Primitive_F32 {
|
return "f32.demote_f64\n", nil
|
||||||
return "f32.demote_f64\n", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if isFloatingPoint(from) || isFloatingPoint(to) {
|
|
||||||
return "", errors.New("cannot upcast int from/to float")
|
|
||||||
}
|
|
||||||
|
|
||||||
wat := ""
|
|
||||||
|
|
||||||
if getBits(from) == 64 && getBits(to) < 64 {
|
|
||||||
wat += "i32.wrap_i64\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
if getBits(from) < 64 && getBits(to) == 64 {
|
|
||||||
if to == Primitive_I64 {
|
|
||||||
wat += "i64.extend_i32_s\n"
|
|
||||||
} else {
|
} else {
|
||||||
wat += "i64.extend_i32_u\n"
|
return "f64.promote_f32\n", nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch to {
|
if toFloat {
|
||||||
case Primitive_I8, Primitive_I16, Primitive_I32, Primitive_U8, Primitive_U16, Primitive_U32:
|
suffix := ""
|
||||||
wat += getTypeCast(to)
|
if isUnsignedInt(to) {
|
||||||
|
suffix = "u"
|
||||||
|
} else {
|
||||||
|
suffix = "s"
|
||||||
|
}
|
||||||
|
|
||||||
|
return getPrimitiveWATType(to) + ".convert_" + getPrimitiveWATType(from) + "_" + suffix + "\n", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return wat, nil
|
if fromFloat {
|
||||||
|
suffix := ""
|
||||||
|
|
||||||
|
if isUnsignedInt(to) {
|
||||||
|
suffix = "u"
|
||||||
|
} else {
|
||||||
|
suffix = "s"
|
||||||
|
}
|
||||||
|
|
||||||
|
return getPrimitiveWATType(to) + ".trunc_" + getPrimitiveWATType(from) + "_" + suffix + "\n", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if getBits(from) == getBits(to) {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if getPrimitiveWATType(from) == getPrimitiveWATType(to) {
|
||||||
|
// TODO: cast if to is smaller than from
|
||||||
|
}
|
||||||
|
|
||||||
|
if getBits(from) < 64 && getBits(to) == 64 {
|
||||||
|
suffix := ""
|
||||||
|
if isUnsignedInt(from) {
|
||||||
|
suffix = "u"
|
||||||
|
} else {
|
||||||
|
suffix = "s"
|
||||||
|
}
|
||||||
|
|
||||||
|
return "i64.extend_i32_" + suffix + "\n", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: cast down from 64 to 32
|
||||||
|
|
||||||
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func compileExpressionWAT(expr Expression, block Block) (string, error) {
|
func compileExpressionWAT(expr Expression, block Block) (string, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user