...

Text file src/pkg/internal/bytealg/equal_ppc64x.s

     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	// +build ppc64 ppc64le
     6	
     7	#include "go_asm.h"
     8	#include "textflag.h"
     9	
    10	// memequal(a, b unsafe.Pointer, size uintptr) bool
    11	TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-25
    12		MOVD    a+0(FP), R3
    13		MOVD    b+8(FP), R4
    14		MOVD    size+16(FP), R5
    15		MOVD    $ret+24(FP), R10
    16	
    17		BR	memeqbody<>(SB)
    18	
    19	// memequal_varlen(a, b unsafe.Pointer) bool
    20	TEXT runtime·memequal_varlen(SB),NOSPLIT|NOFRAME,$0-17
    21		MOVD	a+0(FP), R3
    22		MOVD	b+8(FP), R4
    23		CMP	R3, R4
    24		BEQ	eq
    25		MOVD	8(R11), R5    // compiler stores size at offset 8 in the closure
    26		MOVD    $ret+16(FP), R10
    27		BR	memeqbody<>(SB)
    28	eq:
    29		MOVD	$1, R3
    30		MOVB	R3, ret+16(FP)
    31		RET
    32	
    33	// Do an efficient memequal for ppc64
    34	// R3 = s1
    35	// R4 = s2
    36	// R5 = len
    37	// R10 = addr of return value (byte)
    38	TEXT memeqbody<>(SB),NOSPLIT|NOFRAME,$0-0
    39		MOVD    R5,CTR
    40		CMP     R5,$8		// only optimize >=8
    41		BLT     simplecheck
    42		DCBT	(R3)		// cache hint
    43		DCBT	(R4)
    44		CMP	R5,$32		// optimize >= 32
    45		MOVD	R5,R6		// needed if setup8a branch
    46		BLT	setup8a		// 8 byte moves only
    47	setup32a:                       // 8 byte aligned, >= 32 bytes
    48		SRADCC  $5,R5,R6        // number of 32 byte chunks to compare
    49		MOVD	R6,CTR
    50		MOVD	$16,R14		// index for VSX loads and stores
    51	loop32a:
    52		LXVD2X  (R3+R0), VS32	// VS32 = V0
    53		LXVD2X  (R4+R0), VS33	// VS33 = V1
    54		VCMPEQUBCC V0, V1, V2	// compare, setting CR6
    55		BGE     CR6, noteq
    56		LXVD2X  (R3+R14), VS32
    57		LXVD2X  (R4+R14), VS33
    58		VCMPEQUBCC V0, V1, V2
    59		BGE     CR6, noteq
    60		ADD     $32,R3		// bump up to next 32
    61		ADD     $32,R4
    62		BC      16, 0, loop32a  // br ctr and cr
    63		ANDCC	$24,R5,R6       // Any 8 byte chunks?
    64		BEQ	leftover	// and result is 0
    65	setup8a:
    66		SRADCC  $3,R6,R6        // get the 8 byte count
    67		BEQ	leftover	// shifted value is 0
    68		MOVD    R6,CTR
    69	loop8:
    70		MOVD    0(R3),R6        // doublewords to compare
    71		ADD	$8,R3
    72		MOVD    0(R4),R7
    73		ADD     $8,R4
    74		CMP     R6,R7           // match?
    75		BC	8,2,loop8	// bt ctr <> 0 && cr
    76		BNE     noteq
    77	leftover:
    78		ANDCC   $7,R5,R6        // check for leftover bytes
    79		BEQ     equal
    80		MOVD    R6,CTR
    81		BR	simple
    82	simplecheck:
    83		CMP	R5,$0
    84		BEQ	equal
    85	simple:
    86		MOVBZ   0(R3), R6
    87		ADD	$1,R3
    88		MOVBZ   0(R4), R7
    89		ADD     $1,R4
    90		CMP     R6, R7
    91		BNE     noteq
    92		BC      8,2,simple
    93		BNE	noteq
    94		BR	equal
    95	noteq:
    96		MOVB    $0, (R10)
    97		RET
    98	equal:
    99		MOVD	$1, R3
   100		MOVB	R3, (R10)
   101		RET
   102	

View as plain text