JMP cmpbody<>(SB)
TEXT bytes·Compare(SB),NOSPLIT,$0-28
+ FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVL a_base+0(FP), SI
MOVL a_len+4(FP), BX
MOVL b_base+12(FP), DI
JMP cmpbody<>(SB)
TEXT bytes·Compare(SB),NOSPLIT,$0-56
+ FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVQ a_base+0(FP), SI
MOVQ a_len+8(FP), BX
MOVQ b_base+24(FP), DI
RET
TEXT bytes·Compare(SB),NOSPLIT,$0-28
+ FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVL a_base+0(FP), SI
MOVL a_len+4(FP), BX
MOVL b_base+12(FP), DI
B cmpbody<>(SB)
TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-28
+ FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVW a_base+0(FP), R2
MOVW a_len+4(FP), R0
MOVW b_base+12(FP), R3
B cmpbody<>(SB)
TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56
+ FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVD a_base+0(FP), R2
MOVD a_len+8(FP), R0
MOVD b_base+24(FP), R3
RET
TEXT bytes·Compare(SB),NOSPLIT,$0-28
+ FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVW a_base+0(FP), R3
MOVW b_base+12(FP), R4
MOVW a_len+4(FP), R1
RET
TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56
+ FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVD a_base+0(FP), R5
MOVD b_base+24(FP), R6
MOVD a_len+8(FP), R3
BR cmpbody<>(SB)
TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56
+ FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVD a_base+0(FP), R3
MOVD a_len+8(FP), R4
MOVD b_base+24(FP), R5
RET
TEXT bytes·Compare(SB), NOSPLIT, $0-56
+ FUNCDATA $0, ·Compare·args_stackmap(SB)
Get SP
I64Load a_base+0(FP)
I64Load a_len+8(FP)
RET
TEXT bytes·Equal(SB),NOSPLIT,$0-25
+ FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVL a_len+4(FP), BX
MOVL b_len+16(FP), CX
CMPL BX, CX
RET
TEXT bytes·Equal(SB),NOSPLIT,$0-49
+ FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVQ a_len+8(FP), BX
MOVQ b_len+32(FP), CX
CMPQ BX, CX
RET
TEXT bytes·Equal(SB),NOSPLIT,$0-25
+ FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVL a_len+4(FP), BX
MOVL b_len+16(FP), CX
CMPL BX, CX
RET
TEXT bytes·Equal(SB),NOSPLIT,$0-25
+ FUNCDATA $0, ·Equal·args_stackmap(SB)
JMP ·Equal(SB)
// memequal(a, b unsafe.Pointer, size uintptr) bool
RET
TEXT bytes·Equal(SB),NOSPLIT,$0-49
+ FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVD a_len+8(FP), R1
MOVD b_len+32(FP), R3
CMP R1, R3
RET
TEXT bytes·Equal(SB),NOSPLIT,$0-49
+ FUNCDATA $0, ·Equal·args_stackmap(SB)
JMP ·Equal(SB)
// memequal(a, b unsafe.Pointer, size uintptr) bool
RET
TEXT bytes·Equal(SB),NOSPLIT,$0-25
+ FUNCDATA $0, ·Equal·args_stackmap(SB)
JMP ·Equal(SB)
// memequal(a, b unsafe.Pointer, size uintptr) bool
RET
TEXT bytes·Equal(SB),NOSPLIT,$0-49
+ FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVD a_len+8(FP), R4
MOVD b_len+32(FP), R5
CMP R5, R4 // unequal lengths are not equal
RET
TEXT bytes·Equal(SB),NOSPLIT|NOFRAME,$0-49
+ FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVD a_len+8(FP), R2
MOVD b_len+32(FP), R6
MOVD a_base+0(FP), R3
RET
TEXT bytes·Equal(SB), NOSPLIT, $0-49
+ FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVD a_len+8(FP), R0
MOVD b_len+32(FP), R1
Get R0
RET
TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
+ FUNCDATA $0, ·IndexByte·args_stackmap(SB)
JMP ·IndexByte(SB)
TEXT strings·IndexByte(SB),NOSPLIT,$0-16
+ FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
JMP ·IndexByteString(SB)
// but involves no call overhead.
// TODO: remove this hack when midstack inlining is enabled?
TEXT bytes·IndexByte(SB), NOSPLIT, $0-40
+ FUNCDATA $0, ·IndexByte·args_stackmap(SB)
MOVQ b_base+0(FP), SI
MOVQ b_len+8(FP), BX
MOVB c+24(FP), AL
JMP indexbytebody<>(SB)
TEXT strings·IndexByte(SB), NOSPLIT, $0-32
+ FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
MOVQ s_base+0(FP), SI
MOVQ s_len+8(FP), BX
MOVB c+16(FP), AL
RET
TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
+ FUNCDATA $0, ·IndexByte·args_stackmap(SB)
MOVL b_base+0(FP), SI
MOVL b_len+4(FP), BX
MOVB c+12(FP), AL
RET
TEXT strings·IndexByte(SB),NOSPLIT,$0-20
+ FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
MOVL s_base+0(FP), SI
MOVL s_len+4(FP), BX
MOVB c+8(FP), AL
RET
TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
+ FUNCDATA $0, ·IndexByte·args_stackmap(SB)
JMP ·IndexByte(SB)
TEXT strings·IndexByte(SB),NOSPLIT,$0-16
+ FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
JMP ·IndexByteString(SB)
B indexbytebody<>(SB)
TEXT bytes·IndexByte(SB),NOSPLIT,$0-40
+ FUNCDATA $0, ·IndexByte·args_stackmap(SB)
MOVD b_base+0(FP), R0
MOVD b_len+8(FP), R2
MOVBU c+24(FP), R1
B indexbytebody<>(SB)
TEXT strings·IndexByte(SB),NOSPLIT,$0-32
+ FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
MOVD s_base+0(FP), R0
MOVD s_len+8(FP), R2
MOVBU c+16(FP), R1
RET
TEXT bytes·IndexByte(SB),NOSPLIT,$0-40
+ FUNCDATA $0, ·IndexByte·args_stackmap(SB)
JMP ·IndexByte(SB)
TEXT strings·IndexByte(SB),NOSPLIT,$0-32
+ FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
JMP ·IndexByteString(SB)
RET
TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
+ FUNCDATA $0, ·IndexByte·args_stackmap(SB)
JMP ·IndexByte(SB)
TEXT strings·IndexByte(SB),NOSPLIT,$0-16
+ FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
JMP ·IndexByteString(SB)
BR indexbytebody<>(SB)
TEXT bytes·IndexByte(SB),NOSPLIT|NOFRAME,$0-40
+ FUNCDATA $0, ·IndexByte·args_stackmap(SB)
MOVD b_base+0(FP), R3 // R3 = byte array pointer
MOVD b_len+8(FP), R4 // R4 = length
MOVBZ c+24(FP), R5 // R5 = byte
BR indexbytebody<>(SB)
TEXT strings·IndexByte(SB),NOSPLIT|NOFRAME,$0-32
+ FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
MOVD s_base+0(FP), R3 // R3 = string
MOVD s_len+8(FP), R4 // R4 = length
MOVBZ c+16(FP), R5 // R5 = byte
BR indexbytebody<>(SB)
TEXT bytes·IndexByte(SB),NOSPLIT|NOFRAME,$0-40
+ FUNCDATA $0, ·IndexByte·args_stackmap(SB)
MOVD b_base+0(FP), R3// b_base => R3
MOVD b_len+8(FP), R4 // b_len => R4
MOVBZ c+24(FP), R5 // c => R5
BR indexbytebody<>(SB)
TEXT strings·IndexByte(SB),NOSPLIT|NOFRAME,$0-32
+ FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
MOVD s_base+0(FP), R3// s_base => R3
MOVD s_len+8(FP), R4 // s_len => R4
MOVBZ c+16(FP), R5 // c => R5
RET
TEXT bytes·IndexByte(SB), NOSPLIT, $0-40
+ FUNCDATA $0, ·IndexByte·args_stackmap(SB)
Get SP
I64Load b_base+0(FP)
I32WrapI64
RET
TEXT strings·IndexByte(SB), NOSPLIT, $0-32
+ FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
Get SP
I64Load s_base+0(FP)
I32WrapI64
--- /dev/null
+// run
+
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+ "bytes"
+ "strings"
+)
+
+func growstack(n int) {
+ if n > 0 {
+ growstack(n - 1)
+ }
+}
+
+func main() {
+ c := make(chan struct{})
+ go compare(c)
+ go equal(c)
+ go indexByte(c)
+ go indexByteString(c)
+ <-c
+ <-c
+ <-c
+ <-c
+}
+
+func compare(c chan struct{}) {
+ defer bytes.Compare(nil, nil)
+ growstack(10000)
+ c <- struct{}{}
+}
+func equal(c chan struct{}) {
+ defer bytes.Equal(nil, nil)
+ growstack(10000)
+ c <- struct{}{}
+}
+func indexByte(c chan struct{}) {
+ defer bytes.IndexByte(nil, 0)
+ growstack(10000)
+ c <- struct{}{}
+}
+func indexByteString(c chan struct{}) {
+ defer strings.IndexByte("", 0)
+ growstack(10000)
+ c <- struct{}{}
+}