crc32_arm64.s raw

   1  // Copyright 2017 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 "textflag.h"
   6  
   7  // castagnoliUpdate updates the non-inverted crc with the given data.
   8  
   9  // func castagnoliUpdate(crc uint32, p []byte) uint32
  10  TEXT ·castagnoliUpdate(SB),NOSPLIT,$0-36
  11  	MOVWU	crc+0(FP), R9  // CRC value
  12  	MOVD	p+8(FP), R13  // data pointer
  13  	MOVD	p_len+16(FP), R11  // len(p)
  14  
  15  update:
  16  	CMP	$16, R11
  17  	BLT	less_than_16
  18  	LDP.P	16(R13), (R8, R10)
  19  	CRC32CX	R8, R9
  20  	CRC32CX	R10, R9
  21  	SUB	$16, R11
  22  
  23  	JMP	update
  24  
  25  less_than_16:
  26  	TBZ	$3, R11, less_than_8
  27  
  28  	MOVD.P	8(R13), R10
  29  	CRC32CX	R10, R9
  30  
  31  less_than_8:
  32  	TBZ	$2, R11, less_than_4
  33  
  34  	MOVWU.P	4(R13), R10
  35  	CRC32CW	R10, R9
  36  
  37  less_than_4:
  38  	TBZ	$1, R11, less_than_2
  39  
  40  	MOVHU.P	2(R13), R10
  41  	CRC32CH	R10, R9
  42  
  43  less_than_2:
  44  	TBZ	$0, R11, done
  45  
  46  	MOVBU	(R13), R10
  47  	CRC32CB	R10, R9
  48  
  49  done:
  50  	MOVWU	R9, ret+32(FP)
  51  	RET
  52  
  53  // ieeeUpdate updates the non-inverted crc with the given data.
  54  
  55  // func ieeeUpdate(crc uint32, p []byte) uint32
  56  TEXT ·ieeeUpdate(SB),NOSPLIT,$0-36
  57  	MOVWU	crc+0(FP), R9  // CRC value
  58  	MOVD	p+8(FP), R13  // data pointer
  59  	MOVD	p_len+16(FP), R11  // len(p)
  60  
  61  update:
  62  	CMP	$16, R11
  63  	BLT	less_than_16
  64  	LDP.P	16(R13), (R8, R10)
  65  	CRC32X	R8, R9
  66  	CRC32X	R10, R9
  67  	SUB	$16, R11
  68  
  69  	JMP	update
  70  
  71  less_than_16:
  72  	TBZ $3, R11, less_than_8
  73  
  74  	MOVD.P	8(R13), R10
  75  	CRC32X	R10, R9
  76  
  77  less_than_8:
  78  	TBZ	$2, R11, less_than_4
  79  
  80  	MOVWU.P	4(R13), R10
  81  	CRC32W	R10, R9
  82  
  83  less_than_4:
  84  	TBZ	$1, R11, less_than_2
  85  
  86  	MOVHU.P	2(R13), R10
  87  	CRC32H	R10, R9
  88  
  89  less_than_2:
  90  	TBZ	$0, R11, done
  91  
  92  	MOVBU	(R13), R10
  93  	CRC32B	R10, R9
  94  
  95  done:
  96  	MOVWU	R9, ret+32(FP)
  97  	RET
  98