summaryrefslogtreecommitdiff
path: root/vendor/github.com/klauspost/reedsolomon/galois_ppc64le.s
blob: 8838f0c9de88c419c9f7c904273745f8d27a4cda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//+build !noasm !appengine !gccgo

// Copyright 2015, Klaus Post, see LICENSE for details.
// Copyright 2018, Minio, Inc.

#include "textflag.h"

#define LOW       R3
#define HIGH      R4
#define IN        R5
#define LEN       R6
#define OUT       R7
#define CONSTANTS R8
#define OFFSET    R9
#define OFFSET1   R10
#define OFFSET2   R11

#define X6        VS34
#define X6_       V2
#define X7        VS35
#define X7_       V3
#define MSG       VS36
#define MSG_      V4
#define MSG_HI    VS37
#define MSG_HI_   V5
#define RESULT    VS38
#define RESULT_   V6
#define ROTATE    VS39
#define ROTATE_   V7
#define MASK      VS40
#define MASK_     V8
#define FLIP      VS41
#define FLIP_     V9

// func galMulPpc(low, high, in, out []byte)
TEXT ·galMulPpc(SB), NOFRAME|NOSPLIT, $0-96
	MOVD low+0(FP), LOW
	MOVD high+24(FP), HIGH
	MOVD in+48(FP), IN
	MOVD in_len+56(FP), LEN
	MOVD out+72(FP), OUT

	MOVD $16, OFFSET1
	MOVD $32, OFFSET2

	MOVD   $·constants(SB), CONSTANTS
	LXVD2X (CONSTANTS)(R0), ROTATE
	LXVD2X (CONSTANTS)(OFFSET1), MASK
	LXVD2X (CONSTANTS)(OFFSET2), FLIP

	LXVD2X (LOW)(R0), X6
	LXVD2X (HIGH)(R0), X7
	VPERM  X6_, V31, FLIP_, X6_
	VPERM  X7_, V31, FLIP_, X7_

	MOVD $0, OFFSET

loop:
	LXVD2X (IN)(OFFSET), MSG

	VSRB  MSG_, ROTATE_, MSG_HI_
	VAND  MSG_, MASK_, MSG_
	VPERM X6_, V31, MSG_, MSG_
	VPERM X7_, V31, MSG_HI_, MSG_HI_

	VXOR MSG_, MSG_HI_, MSG_

	STXVD2X MSG, (OUT)(OFFSET)

	ADD $16, OFFSET, OFFSET
	CMP LEN, OFFSET
	BGT loop
	RET

// func galMulPpcXorlow, high, in, out []byte)
TEXT ·galMulPpcXor(SB), NOFRAME|NOSPLIT, $0-96
	MOVD low+0(FP), LOW
	MOVD high+24(FP), HIGH
	MOVD in+48(FP), IN
	MOVD in_len+56(FP), LEN
	MOVD out+72(FP), OUT

	MOVD $16, OFFSET1
	MOVD $32, OFFSET2

	MOVD   $·constants(SB), CONSTANTS
	LXVD2X (CONSTANTS)(R0), ROTATE
	LXVD2X (CONSTANTS)(OFFSET1), MASK
	LXVD2X (CONSTANTS)(OFFSET2), FLIP

	LXVD2X (LOW)(R0), X6
	LXVD2X (HIGH)(R0), X7
	VPERM  X6_, V31, FLIP_, X6_
	VPERM  X7_, V31, FLIP_, X7_

	MOVD $0, OFFSET

loopXor:
	LXVD2X (IN)(OFFSET), MSG
	LXVD2X (OUT)(OFFSET), RESULT

	VSRB  MSG_, ROTATE_, MSG_HI_
	VAND  MSG_, MASK_, MSG_
	VPERM X6_, V31, MSG_, MSG_
	VPERM X7_, V31, MSG_HI_, MSG_HI_

	VXOR MSG_, MSG_HI_, MSG_
	VXOR MSG_, RESULT_, RESULT_

	STXVD2X RESULT, (OUT)(OFFSET)

	ADD $16, OFFSET, OFFSET
	CMP LEN, OFFSET
	BGT loopXor
	RET

DATA ·constants+0x0(SB)/8, $0x0404040404040404
DATA ·constants+0x8(SB)/8, $0x0404040404040404
DATA ·constants+0x10(SB)/8, $0x0f0f0f0f0f0f0f0f
DATA ·constants+0x18(SB)/8, $0x0f0f0f0f0f0f0f0f
DATA ·constants+0x20(SB)/8, $0x0706050403020100
DATA ·constants+0x28(SB)/8, $0x0f0e0d0c0b0a0908

GLOBL ·constants(SB), 8, $48