ssa: builtin copy
This commit is contained in:
@@ -26,4 +26,9 @@ func main() {
|
|||||||
println(data)
|
println(data)
|
||||||
var i any = 100
|
var i any = 100
|
||||||
println(true, 100, -100, uint(255), int32(-100), 100.5, i, &i, uintptr(unsafe.Pointer(&i)))
|
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])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,6 +55,15 @@ source_filename = "main"
|
|||||||
@41 = private unnamed_addr constant [2 x i8] c" \00", align 1
|
@41 = private unnamed_addr constant [2 x i8] c" \00", align 1
|
||||||
@42 = 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
|
@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() {
|
define void @main.init() {
|
||||||
_llgo_0:
|
_llgo_0:
|
||||||
@@ -310,6 +319,58 @@ _llgo_0:
|
|||||||
call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %126)
|
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)
|
%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)
|
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
|
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.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface")
|
||||||
|
|
||||||
declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr)
|
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)
|
||||||
|
|||||||
@@ -63,6 +63,9 @@ func Malloc(size uintptr) Pointer
|
|||||||
//go:linkname Memcpy C.memcpy
|
//go:linkname Memcpy C.memcpy
|
||||||
func Memcpy(dst, src Pointer, n uintptr) Pointer
|
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
|
//go:linkname Memset C.memset
|
||||||
func Memset(s Pointer, c Int, n uintptr) Pointer
|
func Memset(s Pointer, c Int, n uintptr) Pointer
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -91,4 +91,16 @@ func SliceAppend(src Slice, data unsafe.Pointer, num, etSize int) Slice {
|
|||||||
return src
|
return src
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SliceCopy copy data to slice and returns a slice.
|
||||||
|
func SliceCopy(dst Slice, data unsafe.Pointer, num int, etSize int) int {
|
||||||
|
n := dst.len
|
||||||
|
if n > num {
|
||||||
|
n = num
|
||||||
|
}
|
||||||
|
if n > 0 {
|
||||||
|
c.Memmove(dst.data, data, uintptr(n*etSize))
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|||||||
15
ssa/expr.go
15
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"))
|
b.InlineCall(b.Pkg.rtFunc("PrintString"), b.Str("\n"))
|
||||||
}
|
}
|
||||||
return
|
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")
|
panic("todo")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user