Add a load of binops
Этот коммит содержится в:
родитель
6607cff14e
коммит
cc5a29d759
1 изменённых файлов: 25 добавлений и 7 удалений
32
tgo.go
32
tgo.go
|
@ -199,8 +199,6 @@ func (c *Compiler) parseFuncDecl(pkgName string, f *ssa.Function) (*Frame, error
|
|||
}
|
||||
|
||||
func (c *Compiler) parseFunc(frame *Frame, f *ssa.Function) error {
|
||||
fmt.Println("func:", f.Name())
|
||||
|
||||
llvmFn := c.mod.NamedFunction(frame.name)
|
||||
start := c.ctx.AddBasicBlock(llvmFn, "start")
|
||||
c.builder.SetInsertPointAtEnd(start)
|
||||
|
@ -324,12 +322,32 @@ func (c *Compiler) parseBinOp(frame *Frame, binop *ssa.BinOp) (llvm.Value, error
|
|||
return llvm.Value{}, err
|
||||
}
|
||||
switch binop.Op {
|
||||
case token.ADD:
|
||||
return c.builder.CreateBinOp(llvm.Add, x, y, ""), nil
|
||||
case token.MUL:
|
||||
return c.builder.CreateBinOp(llvm.Mul, x, y, ""), nil
|
||||
case token.ADD: // +
|
||||
return c.builder.CreateAdd(x, y, ""), nil
|
||||
case token.SUB: // -
|
||||
return c.builder.CreateSub(x, y, ""), nil
|
||||
case token.MUL: // *
|
||||
return c.builder.CreateMul(x, y, ""), nil
|
||||
case token.QUO: // /
|
||||
return c.builder.CreateSDiv(x, y, ""), nil // TODO: UDiv (unsigned)
|
||||
case token.REM: // %
|
||||
return c.builder.CreateSRem(x, y, ""), nil // TODO: URem (unsigned)
|
||||
case token.AND: // &
|
||||
return c.builder.CreateAnd(x, y, ""), nil
|
||||
case token.OR: // |
|
||||
return c.builder.CreateOr(x, y, ""), nil
|
||||
case token.XOR: // ^
|
||||
return c.builder.CreateXor(x, y, ""), nil
|
||||
case token.SHL: // <<
|
||||
return c.builder.CreateShl(x, y, ""), nil
|
||||
case token.SHR: // >>
|
||||
return c.builder.CreateAShr(x, y, ""), nil // TODO: LShr (unsigned)
|
||||
case token.AND_NOT: // &^
|
||||
// Go specific. Calculate "and not" with x & (~y)
|
||||
inv := c.builder.CreateNot(y, "") // ~y
|
||||
return c.builder.CreateAnd(x, inv, ""), nil
|
||||
default:
|
||||
return llvm.Value{}, errors.New("todo: unknown binop")
|
||||
return llvm.Value{}, errors.New("todo: unknown binop: " + fmt.Sprintf("%#v", binop))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче