From 75aea37cedaa6b31dd26668f820eb5631644385b Mon Sep 17 00:00:00 2001 From: visualfc Date: Thu, 9 May 2024 13:45:29 +0800 Subject: [PATCH] ssa: bitcast float => iface.data --- cl/_testdata/print/in.go | 35 +++++++ cl/_testdata/print/out.ll | 168 ++++++++++++++++++++++++++++++ cl/compile.go | 8 ++ cl/import.go | 16 +-- internal/runtime/llgo_autogen.lla | Bin 3604 -> 3862 bytes internal/runtime/z_iface.go | 34 ++++++ ssa/expr.go | 39 ++++++- 7 files changed, 292 insertions(+), 8 deletions(-) diff --git a/cl/_testdata/print/in.go b/cl/_testdata/print/in.go index aa623c27..7b44b61b 100644 --- a/cl/_testdata/print/in.go +++ b/cl/_testdata/print/in.go @@ -177,6 +177,41 @@ func main() { printnl() prinfsub(100.1) printnl() + printnum(float32(1e9)) + printnl() + printnum(float64(2e9)) + printnl() +} + +func printnum(v any) { + switch v := v.(type) { + case int: + printint(int64(v)) + case int8: + printint(int64(v)) + case int16: + printint(int64(v)) + case int32: + printint(int64(v)) + case int64: + printint(int64(v)) + case uint: + printuint(uint64(v)) + case uint8: + printuint(uint64(v)) + case uint16: + printuint(uint64(v)) + case uint32: + printuint(uint64(v)) + case uint64: + printuint(uint64(v)) + case uintptr: + printuint(uint64(v)) + case float32: + printfloat(float64(v)) + case float64: + printfloat(float64(v)) + } } func prinxor(n int64) { diff --git a/cl/_testdata/print/out.ll b/cl/_testdata/print/out.ll index d47b639f..73ea91b5 100644 --- a/cl/_testdata/print/out.ll +++ b/cl/_testdata/print/out.ll @@ -5,6 +5,7 @@ source_filename = "main" %"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } %main.stringStruct = type { ptr, i64 } %main.slice = type { ptr, i64, i64 } +%"github.com/goplus/llgo/internal/runtime.iface" = type { ptr, ptr } @"main.init$guard" = global ptr null @main.minhexdigits = global ptr null @@ -91,6 +92,14 @@ _llgo_0: call void @main.printnl() call void @main.prinfsub(double 1.001000e+02) call void @main.printnl() + %3 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + %4 = call %"github.com/goplus/llgo/internal/runtime.iface" @"github.com/goplus/llgo/internal/runtime.MakeAnyInt"(ptr %3, i64 1315859240) + call void @main.printnum(%"github.com/goplus/llgo/internal/runtime.iface" %4) + call void @main.printnl() + %5 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 14) + %6 = call %"github.com/goplus/llgo/internal/runtime.iface" @"github.com/goplus/llgo/internal/runtime.MakeAnyInt"(ptr %5, i64 4746175415993761792) + call void @main.printnum(%"github.com/goplus/llgo/internal/runtime.iface" %6) + call void @main.printnl() ret void } @@ -363,6 +372,155 @@ _llgo_0: ret void } +define void @main.printnum(%"github.com/goplus/llgo/internal/runtime.iface" %0) { +_llgo_0: + %1 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %2 = call { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %1) + %3 = extractvalue { i64, i1 } %2, 0 + %4 = extractvalue { i64, i1 } %2, 1 + br i1 %4, label %_llgo_2, label %_llgo_3 + +_llgo_1: ; preds = %_llgo_26, %_llgo_25, %_llgo_24, %_llgo_22, %_llgo_20, %_llgo_18, %_llgo_16, %_llgo_14, %_llgo_12, %_llgo_10, %_llgo_8, %_llgo_6, %_llgo_4, %_llgo_2 + ret void + +_llgo_2: ; preds = %_llgo_0 + call void @main.printint(i64 %3) + br label %_llgo_1 + +_llgo_3: ; preds = %_llgo_0 + %5 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 3) + %6 = call { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %5) + %7 = extractvalue { i64, i1 } %6, 0 + %8 = extractvalue { i64, i1 } %6, 1 + br i1 %8, label %_llgo_4, label %_llgo_5 + +_llgo_4: ; preds = %_llgo_3 + call void @main.printint(i64 %7) + br label %_llgo_1 + +_llgo_5: ; preds = %_llgo_3 + %9 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 4) + %10 = call { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %9) + %11 = extractvalue { i64, i1 } %10, 0 + %12 = extractvalue { i64, i1 } %10, 1 + br i1 %12, label %_llgo_6, label %_llgo_7 + +_llgo_6: ; preds = %_llgo_5 + call void @main.printint(i64 %11) + br label %_llgo_1 + +_llgo_7: ; preds = %_llgo_5 + %13 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 5) + %14 = call { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %13) + %15 = extractvalue { i64, i1 } %14, 0 + %16 = extractvalue { i64, i1 } %14, 1 + br i1 %16, label %_llgo_8, label %_llgo_9 + +_llgo_8: ; preds = %_llgo_7 + call void @main.printint(i64 %15) + br label %_llgo_1 + +_llgo_9: ; preds = %_llgo_7 + %17 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 6) + %18 = call { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %17) + %19 = extractvalue { i64, i1 } %18, 0 + %20 = extractvalue { i64, i1 } %18, 1 + br i1 %20, label %_llgo_10, label %_llgo_11 + +_llgo_10: ; preds = %_llgo_9 + call void @main.printint(i64 %19) + br label %_llgo_1 + +_llgo_11: ; preds = %_llgo_9 + %21 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 7) + %22 = call { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %21) + %23 = extractvalue { i64, i1 } %22, 0 + %24 = extractvalue { i64, i1 } %22, 1 + br i1 %24, label %_llgo_12, label %_llgo_13 + +_llgo_12: ; preds = %_llgo_11 + call void @main.printuint(i64 %23) + br label %_llgo_1 + +_llgo_13: ; preds = %_llgo_11 + %25 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 8) + %26 = call { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %25) + %27 = extractvalue { i64, i1 } %26, 0 + %28 = extractvalue { i64, i1 } %26, 1 + br i1 %28, label %_llgo_14, label %_llgo_15 + +_llgo_14: ; preds = %_llgo_13 + call void @main.printuint(i64 %27) + br label %_llgo_1 + +_llgo_15: ; preds = %_llgo_13 + %29 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 9) + %30 = call { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %29) + %31 = extractvalue { i64, i1 } %30, 0 + %32 = extractvalue { i64, i1 } %30, 1 + br i1 %32, label %_llgo_16, label %_llgo_17 + +_llgo_16: ; preds = %_llgo_15 + call void @main.printuint(i64 %31) + br label %_llgo_1 + +_llgo_17: ; preds = %_llgo_15 + %33 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 10) + %34 = call { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %33) + %35 = extractvalue { i64, i1 } %34, 0 + %36 = extractvalue { i64, i1 } %34, 1 + br i1 %36, label %_llgo_18, label %_llgo_19 + +_llgo_18: ; preds = %_llgo_17 + call void @main.printuint(i64 %35) + br label %_llgo_1 + +_llgo_19: ; preds = %_llgo_17 + %37 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 11) + %38 = call { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %37) + %39 = extractvalue { i64, i1 } %38, 0 + %40 = extractvalue { i64, i1 } %38, 1 + br i1 %40, label %_llgo_20, label %_llgo_21 + +_llgo_20: ; preds = %_llgo_19 + call void @main.printuint(i64 %39) + br label %_llgo_1 + +_llgo_21: ; preds = %_llgo_19 + %41 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 12) + %42 = call { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %41) + %43 = extractvalue { i64, i1 } %42, 0 + %44 = extractvalue { i64, i1 } %42, 1 + br i1 %44, label %_llgo_22, label %_llgo_23 + +_llgo_22: ; preds = %_llgo_21 + call void @main.printuint(i64 %43) + br label %_llgo_1 + +_llgo_23: ; preds = %_llgo_21 + %45 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + %46 = call { float, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Float32"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %45) + %47 = extractvalue { float, i1 } %46, 0 + %48 = extractvalue { float, i1 } %46, 1 + br i1 %48, label %_llgo_24, label %_llgo_25 + +_llgo_24: ; preds = %_llgo_23 + %49 = fpext float %47 to double + call void @main.printfloat(double %49) + br label %_llgo_1 + +_llgo_25: ; preds = %_llgo_23 + %50 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 14) + %51 = call { double, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Float64"(%"github.com/goplus/llgo/internal/runtime.iface" %0, ptr %50) + %52 = extractvalue { double, i1 } %51, 0 + %53 = extractvalue { double, i1 } %51, 1 + br i1 %53, label %_llgo_26, label %_llgo_1 + +_llgo_26: ; preds = %_llgo_25 + call void @main.printfloat(double %52) + br label %_llgo_1 +} + define void @main.printsp() { _llgo_0: %0 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @8, i64 1) @@ -437,6 +595,16 @@ declare void @"github.com/goplus/llgo/internal/runtime.init"() declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr, i64) +declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) + +declare %"github.com/goplus/llgo/internal/runtime.iface" @"github.com/goplus/llgo/internal/runtime.MakeAnyInt"(ptr, i64) + declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr, i64, i64, i64, i64, i64) declare ptr @"github.com/goplus/llgo/internal/runtime.StringData"(%"github.com/goplus/llgo/internal/runtime.String") + +declare { i64, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Int"(%"github.com/goplus/llgo/internal/runtime.iface", ptr) + +declare { float, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Float32"(%"github.com/goplus/llgo/internal/runtime.iface", ptr) + +declare { double, i1 } @"github.com/goplus/llgo/internal/runtime.CheckI2Float64"(%"github.com/goplus/llgo/internal/runtime.iface", ptr) diff --git a/cl/compile.go b/cl/compile.go index 354f27ed..b3ae1cb3 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -289,6 +289,10 @@ func (p *context) funcOf(fn *ssa.Function) (ret llssa.Function, ftype int) { ftype = llgoAllocaCStr case "unreachable": ftype = llgoUnreachable + case "bitCastTo64F": + ftype = llgoBitCastTo64F + case "bitCastTo32F": + ftype = llgoBitCastTo32F default: panic("unknown llgo instruction: " + name) } @@ -522,6 +526,10 @@ func (p *context) compileInstrOrValue(b llssa.Builder, iv instrOrValue, asValue ret = p.allocaCStr(b, args) case llgoUnreachable: // func unreachable() b.Unreachable() + case llgoBitCastTo32F: + ret = b.BitCast(p.compileValue(b, args[0]), b.Prog.Type(types.Typ[types.Float32], llssa.InGo)) + case llgoBitCastTo64F: + ret = b.BitCast(p.compileValue(b, args[0]), b.Prog.Float64()) default: panic("todo") } diff --git a/cl/import.go b/cl/import.go index a298eb6e..f01d58dc 100644 --- a/cl/import.go +++ b/cl/import.go @@ -301,13 +301,15 @@ const ( cFunc = int(llssa.InC) llgoInstr = -1 - llgoInstrBase = 0x80 - llgoUnreachable = llgoInstrBase + 0 - llgoCstr = llgoInstrBase + 1 - llgoAlloca = llgoInstrBase + 2 - llgoAllocaCStr = llgoInstrBase + 3 - llgoAdvance = llgoInstrBase + 4 - llgoIndex = llgoInstrBase + 5 + llgoInstrBase = 0x80 + llgoUnreachable = llgoInstrBase + 0 + llgoCstr = llgoInstrBase + 1 + llgoAlloca = llgoInstrBase + 2 + llgoAllocaCStr = llgoInstrBase + 3 + llgoAdvance = llgoInstrBase + 4 + llgoIndex = llgoInstrBase + 5 + llgoBitCastTo32F = llgoInstrBase + 6 + llgoBitCastTo64F = llgoInstrBase + 7 ) func (p *context) funcName(fn *ssa.Function, ignore bool) (*types.Package, string, int) { diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index 88a6bf6944390d5cb4c65f48854298b53dfe1bd3..1bb3e9d8214b7618268901704b9c95ed1f7ebba4 100644 GIT binary patch delta 3810 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 YFQk*h4JZTMe>{`!4Il=q4gdfE0G%y!pa1{> delta 3550 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 Y*^QIM4k!cp^f{C84j=}p4FCWD09B{