From cda572fd596f22cbdd34d4a0b6c9c4ddc36559d9 Mon Sep 17 00:00:00 2001 From: visualfc Date: Sun, 19 May 2024 19:33:41 +0800 Subject: [PATCH] ssa: builtin copy --- cl/_testrt/builtin/in.go | 5 +++ cl/_testrt/builtin/out.ll | 63 ++++++++++++++++++++++++++++++ internal/runtime/c/c.go | 3 ++ internal/runtime/llgo_autogen.lla | Bin 6810 -> 6918 bytes internal/runtime/z_slice.go | 12 ++++++ ssa/expr.go | 15 +++++++ 6 files changed, 98 insertions(+) diff --git a/cl/_testrt/builtin/in.go b/cl/_testrt/builtin/in.go index cb936a02..25582553 100644 --- a/cl/_testrt/builtin/in.go +++ b/cl/_testrt/builtin/in.go @@ -26,4 +26,9 @@ func main() { println(data) var i any = 100 println(true, 100, -100, uint(255), int32(-100), 100.5, i, &i, uintptr(unsafe.Pointer(&i))) + var dst [3]byte + n := copy(dst[:], data) + println(n, dst[0], dst[1], dst[2]) + n = copy(dst[1:], "ABCD") + println(n, dst[0], dst[1], dst[2]) } diff --git a/cl/_testrt/builtin/out.ll b/cl/_testrt/builtin/out.ll index 493d2cb0..2af18d2b 100644 --- a/cl/_testrt/builtin/out.ll +++ b/cl/_testrt/builtin/out.ll @@ -55,6 +55,15 @@ source_filename = "main" @41 = private unnamed_addr constant [2 x i8] c" \00", align 1 @42 = private unnamed_addr constant [2 x i8] c" \00", align 1 @43 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@44 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@45 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@46 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@47 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@48 = private unnamed_addr constant [5 x i8] c"ABCD\00", align 1 +@49 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@50 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@51 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@52 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 define void @main.init() { _llgo_0: @@ -310,6 +319,58 @@ _llgo_0: call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %126) %135 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @43, i64 1) call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %135) + %136 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 3) + %137 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %136, i64 1, i64 3, i64 0, i64 3, i64 3) + %138 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %120, 0 + %139 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %120, 1 + %140 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/internal/runtime.Slice" %137, ptr %138, i64 %139, i64 1) + %141 = getelementptr inbounds i8, ptr %136, i64 0 + %142 = load i8, ptr %141, align 1 + %143 = getelementptr inbounds i8, ptr %136, i64 1 + %144 = load i8, ptr %143, align 1 + %145 = getelementptr inbounds i8, ptr %136, i64 2 + %146 = load i8, ptr %145, align 1 + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %140) + %147 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @44, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %147) + %148 = zext i8 %142 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %148) + %149 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @45, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %149) + %150 = zext i8 %144 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %150) + %151 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @46, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %151) + %152 = zext i8 %146 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %152) + %153 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @47, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %153) + %154 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %136, i64 1, i64 3, i64 1, i64 3, i64 3) + %155 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @48, i64 4) + %156 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %155, 0 + %157 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %155, 1 + %158 = call i64 @"github.com/goplus/llgo/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/internal/runtime.Slice" %154, ptr %156, i64 %157, i64 1) + %159 = getelementptr inbounds i8, ptr %136, i64 0 + %160 = load i8, ptr %159, align 1 + %161 = getelementptr inbounds i8, ptr %136, i64 1 + %162 = load i8, ptr %161, align 1 + %163 = getelementptr inbounds i8, ptr %136, i64 2 + %164 = load i8, ptr %163, align 1 + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %158) + %165 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @49, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %165) + %166 = zext i8 %160 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %166) + %167 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @50, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %167) + %168 = zext i8 %162 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %168) + %169 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @51, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %169) + %170 = zext i8 %164 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %170) + %171 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @52, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %171) ret i32 0 } @@ -344,3 +405,5 @@ declare void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double) declare void @"github.com/goplus/llgo/internal/runtime.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface") declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr) + +declare i64 @"github.com/goplus/llgo/internal/runtime.SliceCopy"(%"github.com/goplus/llgo/internal/runtime.Slice", ptr, i64, i64) diff --git a/internal/runtime/c/c.go b/internal/runtime/c/c.go index ac88b11a..c26c8748 100644 --- a/internal/runtime/c/c.go +++ b/internal/runtime/c/c.go @@ -63,6 +63,9 @@ func Malloc(size uintptr) Pointer //go:linkname Memcpy C.memcpy func Memcpy(dst, src Pointer, n uintptr) Pointer +//go:linkname Memmove C.memmove +func Memmove(dst, src Pointer, n uintptr) Pointer + //go:linkname Memset C.memset func Memset(s Pointer, c Int, n uintptr) Pointer diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index fe0aad96088e82ff5316f40108e1ada92fd9ab77..6257d02dcf6df798f320d4ec2621762c94edb2e5 100644 GIT binary patch literal 6918 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 num { + n = num + } + if n > 0 { + c.Memmove(dst.data, data, uintptr(n*etSize)) + } + return n +} + // ----------------------------------------------------------------------------- diff --git a/ssa/expr.go b/ssa/expr.go index 0ff74112..722060a7 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -1022,6 +1022,21 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) { b.InlineCall(b.Pkg.rtFunc("PrintString"), b.Str("\n")) } return + case "copy": + if len(args) == 2 { + dst := args[0] + if dst.kind == vkSlice { + src := args[1] + prog := b.Prog + etSize := prog.Val(int(prog.SizeOf(prog.Elem(dst.Type)))) + switch src.kind { + case vkSlice: + return b.InlineCall(b.Pkg.rtFunc("SliceCopy"), dst, b.SliceData(src), b.SliceLen(src), etSize) + case vkString: + return b.InlineCall(b.Pkg.rtFunc("SliceCopy"), dst, b.StringData(src), b.StringLen(src), etSize) + } + } + } } panic("todo") }