• Keith Randall's avatar
    cmd/compile: make []byte("...") more efficient · ceb0c371
    Keith Randall authored
    Do []byte(string) conversions more efficiently when the string
    is a constant. Instead of calling stringtobyteslice, allocate
    just the space we need and encode the initialization directly.
    
    []byte("foo") rewrites to the following pseudocode:
    
    var s [3]byte // on heap or stack, depending on whether b escapes
    s = *(*[3]byte)(&"foo"[0]) // initialize s from the string
    b = s[:]
    
    which generates this assembly:
    
    	0x001d 00029 (tmp1.go:9)	LEAQ	type.[3]uint8(SB), AX
    	0x0024 00036 (tmp1.go:9)	MOVQ	AX, (SP)
    	0x0028 00040 (tmp1.go:9)	CALL	runtime.newobject(SB)
    	0x002d 00045 (tmp1.go:9)	MOVQ	8(SP), AX
    	0x0032 00050 (tmp1.go:9)	MOVBLZX	go.string."foo"+2(SB), CX
    	0x0039 00057 (tmp1.go:9)	MOVWLZX	go.string."foo"(SB), DX
    	0x0040 00064 (tmp1.go:9)	MOVW	DX, (AX)
    	0x0043 00067 (tmp1.go:9)	MOVB	CL, 2(AX)
    // Then the slice is b = {AX, 3, 3}
    
    The generated code is still not optimal, as it still does load/store
    from read-only memory instead of constant stores.  Next CL...
    
    Update #26498
    Fixes #10170
    
    Change-Id: I4b990b19f9a308f60c8f4f148934acffefe0a5bd
    Reviewed-on: https://go-review.googlesource.com/c/140698
    Run-TryBot: Keith Randall <khr@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    ceb0c371
go.go 7.05 KB