xor_mips64x.s raw

   1  // Copyright 2025 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  //go:build (mips64 || mips64le) && !purego
   6  
   7  #include "textflag.h"
   8  
   9  // func xorBytes(dst, a, b *byte, n int)
  10  TEXT ·xorBytes(SB), NOSPLIT|NOFRAME, $0
  11  	MOVV	dst+0(FP), R1
  12  	MOVV	a+8(FP), R2
  13  	MOVV	b+16(FP), R3
  14  	MOVV	n+24(FP), R4
  15  
  16  xor_64_check:
  17  	SGTU	$64, R4, R5 // R5 = 1 if (64 > R4)
  18  	BNE	R5, xor_32_check
  19  xor_64:
  20  	MOVV	(R2), R6
  21  	MOVV	8(R2), R7
  22  	MOVV	16(R2), R8
  23  	MOVV	24(R2), R9
  24  	MOVV	(R3), R10
  25  	MOVV	8(R3), R11
  26  	MOVV	16(R3), R12
  27  	MOVV	24(R3), R13
  28  	XOR	R6, R10
  29  	XOR	R7, R11
  30  	XOR	R8, R12
  31  	XOR	R9, R13
  32  	MOVV	R10, (R1)
  33  	MOVV	R11, 8(R1)
  34  	MOVV	R12, 16(R1)
  35  	MOVV	R13, 24(R1)
  36  	MOVV	32(R2), R6
  37  	MOVV	40(R2), R7
  38  	MOVV	48(R2), R8
  39  	MOVV	56(R2), R9
  40  	MOVV	32(R3), R10
  41  	MOVV	40(R3), R11
  42  	MOVV	48(R3), R12
  43  	MOVV	56(R3), R13
  44  	XOR	R6, R10
  45  	XOR	R7, R11
  46  	XOR	R8, R12
  47  	XOR	R9, R13
  48  	MOVV	R10, 32(R1)
  49  	MOVV	R11, 40(R1)
  50  	MOVV	R12, 48(R1)
  51  	MOVV	R13, 56(R1)
  52  	ADDV	$64, R2
  53  	ADDV	$64, R3
  54  	ADDV	$64, R1
  55  	SUBV	$64, R4
  56  	SGTU	$64, R4, R5
  57  	BEQ	R0, R5, xor_64
  58  	BEQ	R0, R4, end
  59  
  60  xor_32_check:
  61  	SGTU	$32, R4, R5
  62  	BNE	R5, xor_16_check
  63  xor_32:
  64  	MOVV	(R2), R6
  65  	MOVV	8(R2), R7
  66  	MOVV	16(R2), R8
  67  	MOVV	24(R2), R9
  68  	MOVV	(R3), R10
  69  	MOVV	8(R3), R11
  70  	MOVV	16(R3), R12
  71  	MOVV	24(R3), R13
  72  	XOR	R6, R10
  73  	XOR	R7, R11
  74  	XOR	R8, R12
  75  	XOR	R9, R13
  76  	MOVV	R10, (R1)
  77  	MOVV	R11, 8(R1)
  78  	MOVV	R12, 16(R1)
  79  	MOVV	R13, 24(R1)
  80  	ADDV	$32, R2
  81  	ADDV	$32, R3
  82  	ADDV	$32, R1
  83  	SUBV	$32, R4
  84  	BEQ	R0, R4, end
  85  
  86  xor_16_check:
  87  	SGTU	$16, R4, R5
  88  	BNE	R5, xor_8_check
  89  xor_16:
  90  	MOVV	(R2), R6
  91  	MOVV	8(R2), R7
  92  	MOVV	(R3), R8
  93  	MOVV	8(R3), R9
  94  	XOR	R6, R8
  95  	XOR	R7, R9
  96  	MOVV	R8, (R1)
  97  	MOVV	R9, 8(R1)
  98  	ADDV	$16, R2
  99  	ADDV	$16, R3
 100  	ADDV	$16, R1
 101  	SUBV	$16, R4
 102  	BEQ	R0, R4, end
 103  
 104  xor_8_check:
 105  	SGTU	$8, R4, R5
 106  	BNE	R5, xor_4_check
 107  xor_8:
 108  	MOVV	(R2), R6
 109  	MOVV	(R3), R7
 110  	XOR	R6, R7
 111  	MOVV	R7, (R1)
 112  	ADDV	$8, R1
 113  	ADDV	$8, R2
 114  	ADDV	$8, R3
 115  	SUBV	$8, R4
 116  	BEQ	R0, R4, end
 117  
 118  xor_4_check:
 119  	SGTU	$4, R4, R5
 120  	BNE	R5, xor_2_check
 121  xor_4:
 122  	MOVW	(R2), R6
 123  	MOVW	(R3), R7
 124  	XOR	R6, R7
 125  	MOVW	R7, (R1)
 126  	ADDV	$4, R2
 127  	ADDV	$4, R3
 128  	ADDV	$4, R1
 129  	SUBV	$4, R4
 130  	BEQ	R0, R4, end
 131  
 132  xor_2_check:
 133  	SGTU	$2, R4, R5
 134  	BNE	R5, xor_1
 135  xor_2:
 136  	MOVH	(R2), R6
 137  	MOVH	(R3), R7
 138  	XOR	R6, R7
 139  	MOVH	R7, (R1)
 140  	ADDV	$2, R2
 141  	ADDV	$2, R3
 142  	ADDV	$2, R1
 143  	SUBV	$2, R4
 144  	BEQ	R0, R4, end
 145  
 146  xor_1:
 147  	MOVB	(R2), R6
 148  	MOVB	(R3), R7
 149  	XOR	R6, R7
 150  	MOVB	R7, (R1)
 151  
 152  end:
 153  	RET
 154