Add print() for 64-bit integers

Этот коммит содержится в:
Ayke van Laethem 2018-04-26 23:46:34 +02:00
родитель d17c21681b
коммит 4491a63fe8
2 изменённых файлов: 36 добавлений и 12 удалений

Просмотреть файл

@ -7,24 +7,40 @@ func printstring(s string) {
} }
} }
func printuint(n uint) { func printuint32(n uint32) {
// TODO: don't recurse, but still be compact (and don't divide/mod // TODO: don't recurse, but still be compact (and don't divide/mod
// more than necessary). // more than necessary).
prevdigits := n / 10 prevdigits := n / 10
if prevdigits != 0 { if prevdigits != 0 {
printuint(prevdigits) printuint32(prevdigits)
} }
putchar(byte((n % 10) + '0')) putchar(byte((n % 10) + '0'))
} }
func printint(n int) { func printint32(n int32) {
// Print integer in signed big-endian base-10 notation, for humans to // Print integer in signed big-endian base-10 notation, for humans to
// read. // read.
if n < 0 { if n < 0 {
putchar('-') putchar('-')
n = -n n = -n
} }
printuint(uint(n)) printuint32(uint32(n))
}
func printuint64(n uint64) {
prevdigits := n / 10
if prevdigits != 0 {
printuint64(prevdigits)
}
putchar(byte((n % 10) + '0'))
}
func printint64(n int64) {
if n < 0 {
putchar('-')
n = -n
}
printuint64(uint64(n))
} }
func printbyte(c uint8) { func printbyte(c uint8) {

24
tgo.go
Просмотреть файл

@ -47,8 +47,10 @@ type Compiler struct {
panicFunc llvm.Value panicFunc llvm.Value
boundsCheckFunc llvm.Value boundsCheckFunc llvm.Value
printstringFunc llvm.Value printstringFunc llvm.Value
printintFunc llvm.Value printint32Func llvm.Value
printuintFunc llvm.Value printuint32Func llvm.Value
printint64Func llvm.Value
printuint64Func llvm.Value
printbyteFunc llvm.Value printbyteFunc llvm.Value
printspaceFunc llvm.Value printspaceFunc llvm.Value
printnlFunc llvm.Value printnlFunc llvm.Value
@ -117,10 +119,12 @@ func NewCompiler(pkgName, triple string) (*Compiler, error) {
printstringType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{c.stringType}, false) printstringType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{c.stringType}, false)
c.printstringFunc = llvm.AddFunction(c.mod, "runtime.printstring", printstringType) c.printstringFunc = llvm.AddFunction(c.mod, "runtime.printstring", printstringType)
printintType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{c.intType}, false) printi32Type := llvm.FunctionType(llvm.VoidType(), []llvm.Type{llvm.Int32Type()}, false)
c.printintFunc = llvm.AddFunction(c.mod, "runtime.printint", printintType) c.printint32Func = llvm.AddFunction(c.mod, "runtime.printint32", printi32Type)
printuintType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{c.intType}, false) c.printuint32Func = llvm.AddFunction(c.mod, "runtime.printuint32", printi32Type)
c.printuintFunc = llvm.AddFunction(c.mod, "runtime.printuint", printuintType) printi64Type := llvm.FunctionType(llvm.VoidType(), []llvm.Type{llvm.Int64Type()}, false)
c.printint64Func = llvm.AddFunction(c.mod, "runtime.printint64", printi64Type)
c.printuint64Func = llvm.AddFunction(c.mod, "runtime.printuint64", printi64Type)
printbyteType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{llvm.Int8Type()}, false) printbyteType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{llvm.Int8Type()}, false)
c.printbyteFunc = llvm.AddFunction(c.mod, "runtime.printbyte", printbyteType) c.printbyteFunc = llvm.AddFunction(c.mod, "runtime.printbyte", printbyteType)
printspaceType := llvm.FunctionType(llvm.VoidType(), nil, false) printspaceType := llvm.FunctionType(llvm.VoidType(), nil, false)
@ -579,9 +583,13 @@ func (c *Compiler) parseBuiltin(frame *Frame, args []ssa.Value, callName string)
case types.Uint8: case types.Uint8:
c.builder.CreateCall(c.printbyteFunc, []llvm.Value{value}, "") c.builder.CreateCall(c.printbyteFunc, []llvm.Value{value}, "")
case types.Int, types.Int32: // TODO: assumes a 32-bit int type case types.Int, types.Int32: // TODO: assumes a 32-bit int type
c.builder.CreateCall(c.printintFunc, []llvm.Value{value}, "") c.builder.CreateCall(c.printint32Func, []llvm.Value{value}, "")
case types.Uint, types.Uint32: case types.Uint, types.Uint32:
c.builder.CreateCall(c.printuintFunc, []llvm.Value{value}, "") c.builder.CreateCall(c.printuint32Func, []llvm.Value{value}, "")
case types.Int64:
c.builder.CreateCall(c.printint64Func, []llvm.Value{value}, "")
case types.Uint64:
c.builder.CreateCall(c.printuint64Func, []llvm.Value{value}, "")
case types.String: case types.String:
c.builder.CreateCall(c.printstringFunc, []llvm.Value{value}, "") c.builder.CreateCall(c.printstringFunc, []llvm.Value{value}, "")
default: default: