1
1
/* SPDX-License-Identifier: GPL-2.0 */
2
2
3
+ #include <linux/stringify.h>
3
4
#include <linux/linkage.h>
4
5
#include <asm/alternative.h>
5
6
#include <asm/fpu-insn.h>
12
13
#define COPY1 %v5
13
14
#define COPY2 %v6
14
15
#define COPY3 %v7
15
- #define PERM4 %v16
16
- #define PERM8 %v17
17
- #define PERM12 %v18
18
16
#define BEPERM %v19
19
17
#define TMP0 %v20
20
18
#define TMP1 %v21
23
21
24
22
.section .rodata
25
23
26
- .balign 128
24
+ .balign 32
27
25
.Lconstants:
28
26
.long 0x61707865 ,0x3320646e ,0x79622d32 ,0x6b206574 # endian-neutral
29
- .long 0x04050607 ,0x08090a0b ,0x0c0d0e0f ,0x00010203 # rotl 4 bytes
30
- .long 0x08090a0b ,0x0c0d0e0f ,0x00010203 ,0x04050607 # rotl 8 bytes
31
- .long 0x0c0d0e0f ,0x00010203 ,0x04050607 ,0x08090a0b # rotl 12 bytes
32
27
.long 0x03020100 ,0x07060504 ,0x0b0a0908 ,0x0f0e0d0c # byte swap
33
28
34
29
.text
@@ -48,8 +43,8 @@ SYM_FUNC_START(__arch_chacha20_blocks_nostack)
48
43
/* COPY0 = "expand 32-byte k" */
49
44
VL COPY0,0 ,,%r1
50
45
51
- /* PERM4-PERM12, BEPERM = byte selectors for VPERM */
52
- VLM PERM4, BEPERM,16 ,%r1
46
+ /* BEPERM = byte selectors for VPERM */
47
+ ALTERNATIVE __stringify(VL BEPERM,16 ,, %r1), "brcl 0,0" , ALT_FACILITY( 148 )
53
48
54
49
/* COPY1,COPY2 = key */
55
50
VLM COPY1,COPY2,0 ,%r3
@@ -89,11 +84,11 @@ SYM_FUNC_START(__arch_chacha20_blocks_nostack)
89
84
VERLLF STATE1,STATE1,7
90
85
91
86
/* STATE1[0,1,2,3] = STATE1[1,2,3,0] */
92
- VPERM STATE1,STATE1,STATE1,PERM4
87
+ VSLDB STATE1,STATE1,STATE1,4
93
88
/* STATE2[0,1,2,3] = STATE2[2,3,0,1] */
94
- VPERM STATE2,STATE2,STATE2,PERM8
89
+ VSLDB STATE2,STATE2,STATE2,8
95
90
/* STATE3[0,1,2,3] = STATE3[3,0,1,2] */
96
- VPERM STATE3,STATE3,STATE3,PERM12
91
+ VSLDB STATE3,STATE3,STATE3,12
97
92
98
93
/* STATE0 += STATE1, STATE3 = rotl32(STATE3 ^ STATE0, 16) */
99
94
VAF STATE0,STATE0,STATE1
@@ -116,11 +111,11 @@ SYM_FUNC_START(__arch_chacha20_blocks_nostack)
116
111
VERLLF STATE1,STATE1,7
117
112
118
113
/* STATE1[0,1,2,3] = STATE1[3,0,1,2] */
119
- VPERM STATE1,STATE1,STATE1,PERM12
114
+ VSLDB STATE1,STATE1,STATE1,12
120
115
/* STATE2[0,1,2,3] = STATE2[2,3,0,1] */
121
- VPERM STATE2,STATE2,STATE2,PERM8
116
+ VSLDB STATE2,STATE2,STATE2,8
122
117
/* STATE3[0,1,2,3] = STATE3[1,2,3,0] */
123
- VPERM STATE3,STATE3,STATE3,PERM4
118
+ VSLDB STATE3,STATE3,STATE3,4
124
119
brctg %r0,.Ldoubleround
125
120
126
121
/* OUTPUT0 = STATE0 + STATE0 */
0 commit comments