github.com/sandwichdev/go-internals@v0.0.0-20210605002614-12311ac6b2c5/bytealg/indexbyte_s390x.s (about) 1 // Copyright 2018 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include "go_asm.h" 6 #include "textflag.h" 7 8 TEXT ·IndexByte(SB),NOSPLIT|NOFRAME,$0-40 9 MOVD b_base+0(FP), R3// b_base => R3 10 MOVD b_len+8(FP), R4 // b_len => R4 11 MOVBZ c+24(FP), R5 // c => R5 12 MOVD $ret+32(FP), R2 // &ret => R9 13 BR indexbytebody<>(SB) 14 15 TEXT ·IndexByteString(SB),NOSPLIT|NOFRAME,$0-32 16 MOVD s_base+0(FP), R3// s_base => R3 17 MOVD s_len+8(FP), R4 // s_len => R4 18 MOVBZ c+16(FP), R5 // c => R5 19 MOVD $ret+24(FP), R2 // &ret => R9 20 BR indexbytebody<>(SB) 21 22 // input: 23 // R3: s 24 // R4: s_len 25 // R5: c -- byte sought 26 // R2: &ret -- address to put index into 27 TEXT indexbytebody<>(SB),NOSPLIT|NOFRAME,$0 28 CMPBEQ R4, $0, notfound 29 MOVD R3, R6 // store base for later 30 ADD R3, R4, R8 // the address after the end of the string 31 //if the length is small, use loop; otherwise, use vector or srst search 32 CMPBGE R4, $16, large 33 34 residual: 35 CMPBEQ R3, R8, notfound 36 MOVBZ 0(R3), R7 37 LA 1(R3), R3 38 CMPBNE R7, R5, residual 39 40 found: 41 SUB R6, R3 42 SUB $1, R3 43 MOVD R3, 0(R2) 44 RET 45 46 notfound: 47 MOVD $-1, 0(R2) 48 RET 49 50 large: 51 MOVBZ internal∕cpu·S390X+const_offsetS390xHasVX(SB), R1 52 CMPBNE R1, $0, vectorimpl 53 54 srstimpl: // no vector facility 55 MOVBZ R5, R0 // c needs to be in R0, leave until last minute as currently R0 is expected to be 0 56 srstloop: 57 WORD $0xB25E0083 // srst %r8, %r3 (search the range [R3, R8)) 58 BVS srstloop // interrupted - continue 59 BGT notfoundr0 60 foundr0: 61 XOR R0, R0 // reset R0 62 SUB R6, R8 // remove base 63 MOVD R8, 0(R2) 64 RET 65 notfoundr0: 66 XOR R0, R0 // reset R0 67 MOVD $-1, 0(R2) 68 RET 69 70 vectorimpl: 71 //if the address is not 16byte aligned, use loop for the header 72 MOVD R3, R8 73 AND $15, R8 74 CMPBGT R8, $0, notaligned 75 76 aligned: 77 ADD R6, R4, R8 78 MOVD R8, R7 79 AND $-16, R7 80 // replicate c across V17 81 VLVGB $0, R5, V19 82 VREPB $0, V19, V17 83 84 vectorloop: 85 CMPBGE R3, R7, residual 86 VL 0(R3), V16 // load string to be searched into V16 87 ADD $16, R3 88 VFEEBS V16, V17, V18 // search V17 in V16 and set conditional code accordingly 89 BVS vectorloop 90 91 // when vector search found c in the string 92 VLGVB $7, V18, R7 // load 7th element of V18 containing index into R7 93 SUB $16, R3 94 SUB R6, R3 95 ADD R3, R7 96 MOVD R7, 0(R2) 97 RET 98 99 notaligned: 100 MOVD R3, R8 101 AND $-16, R8 102 ADD $16, R8 103 notalignedloop: 104 CMPBEQ R3, R8, aligned 105 MOVBZ 0(R3), R7 106 LA 1(R3), R3 107 CMPBNE R7, R5, notalignedloop 108 BR found