提交 decb015c 编写于 作者: 3 3dgen

添加! ^ 单目操作符

上级 f7145176
......@@ -68,10 +68,6 @@ func (g *functionGenerator) getValue(i ssa.Value) valueWrap {
return valueWrap{value: wir.NewConst("0", g.module.I32)}
}
case types.Int:
val, _ := constant.Int64Val(v.Value)
return valueWrap{value: wir.NewConst(strconv.Itoa(int(val)), g.module.I32)}
case types.Uint8:
val, _ := constant.Uint64Val(v.Value)
return valueWrap{value: wir.NewConst(strconv.Itoa(int(val)), g.module.U8)}
......@@ -88,11 +84,11 @@ func (g *functionGenerator) getValue(i ssa.Value) valueWrap {
// val, _ := constant.Int64Val(v.Value)
// return valueWrap{value: wir.NewConst(strconv.Itoa(int(val)), g.module.I16)}
case types.Uint32, types.Uintptr:
case types.Uint32, types.Uintptr, types.Uint:
val, _ := constant.Uint64Val(v.Value)
return valueWrap{value: wir.NewConst(strconv.Itoa(int(val)), g.module.U32)}
case types.Int32:
case types.Int32, types.Int:
val, _ := constant.Int64Val(v.Value)
if t.Name() == "rune" {
return valueWrap{value: wir.NewConst(strconv.Itoa(int(val)), g.module.RUNE)}
......@@ -343,7 +339,7 @@ func (g *functionGenerator) genInstruction(inst ssa.Instruction) (insts []wat.In
insts = append(insts, s...)
default:
logger.Fatal("Todo:", inst.String())
logger.Fatalf("Todo: %[1]v: %[1]T", inst)
}
insts = append(insts, wat.NewBlank())
return
......@@ -429,6 +425,14 @@ func (g *functionGenerator) genUnOp(inst *ssa.UnOp) (insts []wat.Inst, ret_type
x := g.getValue(inst.X)
return g.module.EmitUnOp(x.value, wat.OpCodeSub)
case token.XOR:
x := g.getValue(inst.X)
return g.module.EmitUnOp(x.value, wat.OpCodeXor)
case token.NOT:
x := g.getValue(inst.X)
return g.module.EmitUnOp(x.value, wat.OpCodeNot)
default:
logger.Fatalf("Todo: %[1]v: %[1]T", inst)
}
......
......@@ -36,9 +36,26 @@ func (m *Module) EmitUnOp(x Value, op wat.OpCode) (insts []wat.Inst, ret_type Va
logger.Fatal("Todo")
}
ret_type = x.Type()
insts = append(insts, NewConst("0", ret_type).EmitPush()...)
insts = append(insts, x.EmitPush()...)
insts = append(insts, wat.NewInstSub(toWatType(ret_type)))
switch op {
case wat.OpCodeSub:
insts = append(insts, NewConst("0", ret_type).EmitPush()...)
insts = append(insts, x.EmitPush()...)
insts = append(insts, wat.NewInstSub(toWatType(ret_type)))
case wat.OpCodeXor:
insts = append(insts, NewConst("-1", ret_type).EmitPush()...)
insts = append(insts, x.EmitPush()...)
insts = append(insts, wat.NewInstXor(toWatType(ret_type)))
case wat.OpCodeNot:
insts = append(insts, x.EmitPush()...)
insts = append(insts, wat.NewInstEqz(toWatType(ret_type)))
default:
logger.Fatal("Todo: %[1]v: %[1]T", op)
}
return
}
......
......@@ -92,6 +92,7 @@ const (
OpCodeAnd
OpCodeOr
OpCodeXor
OpCodeNot
OpCodeShl
OpCodeShr
OpCodeAndNot
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册