cubefs

Форк
0
126 строк · 2.7 Кб
1
//+build !noasm
2
//+build !appengine
3
//+build !gccgo
4

5
// Copyright 2015, Klaus Post, see LICENSE for details.
6
// Copyright 2017, Minio, Inc.
7

8
#define LOAD(LO1, LO2, HI1, HI2) \
9
	VLD1.P 32(R1), [LO1.B16, LO2.B16] \
10
	                                  \
11
	\ // Get low input and high input
12
	VUSHR  $4, LO1.B16, HI1.B16       \
13
	VUSHR  $4, LO2.B16, HI2.B16       \
14
	VAND   V8.B16, LO1.B16, LO1.B16   \
15
	VAND   V8.B16, LO2.B16, LO2.B16
16

17
#define GALOIS_MUL(MUL_LO, MUL_HI, OUT1, OUT2, TMP1, TMP2) \
18
	\ // Mul low part and mul high part
19
	VTBL V0.B16, [MUL_LO.B16], OUT1.B16  \
20
	VTBL V10.B16, [MUL_HI.B16], OUT2.B16 \
21
	VTBL V1.B16, [MUL_LO.B16], TMP1.B16  \
22
	VTBL V11.B16, [MUL_HI.B16], TMP2.B16 \
23
	                                     \
24
	\ // Combine results
25
	VEOR OUT2.B16, OUT1.B16, OUT1.B16    \
26
	VEOR TMP2.B16, TMP1.B16, OUT2.B16
27

28
// func galMulNEON(low, high, in, out []byte)
29
TEXT ·galMulNEON(SB), 7, $0
30
	MOVD in_base+48(FP), R1
31
	MOVD in_len+56(FP), R2   // length of message
32
	MOVD out_base+72(FP), R5
33
	SUBS $32, R2
34
	BMI  complete
35

36
	MOVD low+0(FP), R10   // R10: &low
37
	MOVD high+24(FP), R11 // R11: &high
38
	VLD1 (R10), [V6.B16]
39
	VLD1 (R11), [V7.B16]
40

41
	//
42
	// Use an extra instruction below since `VDUP R3, V8.B16` generates assembler error
43
	// WORD $0x4e010c68 // dup v8.16b, w3
44
	//
45
	MOVD $0x0f, R3
46
	VMOV R3, V8.B[0]
47
	VDUP V8.B[0], V8.B16
48

49
loop:
50
	// Main loop
51
	LOAD(V0, V1, V10, V11)
52
	GALOIS_MUL(V6, V7, V4, V5, V14, V15)
53

54
	// Store result
55
	VST1.P [V4.D2, V5.D2], 32(R5)
56

57
	SUBS $32, R2
58
	BPL  loop
59

60
complete:
61
	RET
62

63
// func galMulXorNEON(low, high, in, out []byte)
64
TEXT ·galMulXorNEON(SB), 7, $0
65
	MOVD in_base+48(FP), R1
66
	MOVD in_len+56(FP), R2   // length of message
67
	MOVD out_base+72(FP), R5
68
	SUBS $32, R2
69
	BMI  completeXor
70

71
	MOVD low+0(FP), R10   // R10: &low
72
	MOVD high+24(FP), R11 // R11: &high
73
	VLD1 (R10), [V6.B16]
74
	VLD1 (R11), [V7.B16]
75

76
	//
77
	// Use an extra instruction below since `VDUP R3, V8.B16` generates assembler error
78
	// WORD $0x4e010c68 // dup v8.16b, w3
79
	//
80
	MOVD $0x0f, R3
81
	VMOV R3, V8.B[0]
82
	VDUP V8.B[0], V8.B16
83

84
loopXor:
85
	// Main loop
86
	VLD1 (R5), [V20.B16, V21.B16]
87

88
	LOAD(V0, V1, V10, V11)
89
	GALOIS_MUL(V6, V7, V4, V5, V14, V15)
90

91
	VEOR V20.B16, V4.B16, V4.B16
92
	VEOR V21.B16, V5.B16, V5.B16
93

94
	// Store result
95
	VST1.P [V4.D2, V5.D2], 32(R5)
96

97
	SUBS $32, R2
98
	BPL  loopXor
99

100
completeXor:
101
	RET
102

103
// func galXorNEON(in, out []byte)
104
TEXT ·galXorNEON(SB), 7, $0
105
	MOVD in_base+0(FP), R1
106
	MOVD in_len+8(FP), R2    // length of message
107
	MOVD out_base+24(FP), R5
108
	SUBS $32, R2
109
	BMI  completeXor
110

111
loopXor:
112
	// Main loop
113
	VLD1.P 32(R1), [V0.B16, V1.B16]
114
	VLD1   (R5), [V20.B16, V21.B16]
115

116
	VEOR V20.B16, V0.B16, V4.B16
117
	VEOR V21.B16, V1.B16, V5.B16
118

119
	// Store result
120
	VST1.P [V4.D2, V5.D2], 32(R5)
121

122
	SUBS $32, R2
123
	BPL  loopXor
124

125
completeXor:
126
	RET
127

128

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.