diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 13:14:23 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 13:14:23 +0000 |
commit | 73df946d56c74384511a194dd01dbe099584fd1a (patch) | |
tree | fd0bcea490dd81327ddfbb31e215439672c9a068 /src/runtime/memclr_s390x.s | |
parent | Initial commit. (diff) | |
download | golang-1.16-73df946d56c74384511a194dd01dbe099584fd1a.tar.xz golang-1.16-73df946d56c74384511a194dd01dbe099584fd1a.zip |
Adding upstream version 1.16.10.upstream/1.16.10upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/runtime/memclr_s390x.s')
-rw-r--r-- | src/runtime/memclr_s390x.s | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/runtime/memclr_s390x.s b/src/runtime/memclr_s390x.s new file mode 100644 index 0000000..fa657ef --- /dev/null +++ b/src/runtime/memclr_s390x.s @@ -0,0 +1,124 @@ +// Copyright 2016 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. + +#include "textflag.h" + +// See memclrNoHeapPointers Go doc for important implementation constraints. + +// func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) +TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT|NOFRAME,$0-16 + MOVD ptr+0(FP), R4 + MOVD n+8(FP), R5 + +start: + CMPBLE R5, $3, clear0to3 + CMPBLE R5, $7, clear4to7 + CMPBLE R5, $11, clear8to11 + CMPBLE R5, $15, clear12to15 + CMP R5, $32 + BGE clearmt32 + MOVD $0, 0(R4) + MOVD $0, 8(R4) + ADD $16, R4 + SUB $16, R5 + BR start + +clear0to3: + CMPBEQ R5, $0, done + CMPBNE R5, $1, clear2 + MOVB $0, 0(R4) + RET +clear2: + CMPBNE R5, $2, clear3 + MOVH $0, 0(R4) + RET +clear3: + MOVH $0, 0(R4) + MOVB $0, 2(R4) + RET + +clear4to7: + CMPBNE R5, $4, clear5 + MOVW $0, 0(R4) + RET +clear5: + CMPBNE R5, $5, clear6 + MOVW $0, 0(R4) + MOVB $0, 4(R4) + RET +clear6: + CMPBNE R5, $6, clear7 + MOVW $0, 0(R4) + MOVH $0, 4(R4) + RET +clear7: + MOVW $0, 0(R4) + MOVH $0, 4(R4) + MOVB $0, 6(R4) + RET + +clear8to11: + CMPBNE R5, $8, clear9 + MOVD $0, 0(R4) + RET +clear9: + CMPBNE R5, $9, clear10 + MOVD $0, 0(R4) + MOVB $0, 8(R4) + RET +clear10: + CMPBNE R5, $10, clear11 + MOVD $0, 0(R4) + MOVH $0, 8(R4) + RET +clear11: + MOVD $0, 0(R4) + MOVH $0, 8(R4) + MOVB $0, 10(R4) + RET + +clear12to15: + CMPBNE R5, $12, clear13 + MOVD $0, 0(R4) + MOVW $0, 8(R4) + RET +clear13: + CMPBNE R5, $13, clear14 + MOVD $0, 0(R4) + MOVW $0, 8(R4) + MOVB $0, 12(R4) + RET +clear14: + CMPBNE R5, $14, clear15 + MOVD $0, 0(R4) + MOVW $0, 8(R4) + MOVH $0, 12(R4) + RET +clear15: + MOVD $0, 0(R4) + MOVW $0, 8(R4) + MOVH $0, 12(R4) + MOVB $0, 14(R4) + RET + +clearmt32: + CMP R5, $256 + BLT clearlt256 + XC $256, 0(R4), 0(R4) + ADD $256, R4 + ADD $-256, R5 + BR clearmt32 +clearlt256: + CMPBEQ R5, $0, done + ADD $-1, R5 + EXRL $memclr_exrl_xc<>(SB), R5 +done: + RET + +// DO NOT CALL - target for exrl (execute relative long) instruction. +TEXT memclr_exrl_xc<>(SB),NOSPLIT|NOFRAME,$0-0 + XC $1, 0(R4), 0(R4) + MOVD $0, 0(R0) + RET + |