0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056 #include <linux/linkage.h>
0057
0058 #define DIGEST_PTR %rdi
0059 #define DATA_PTR %rsi
0060 #define NUM_BLKS %rdx
0061
0062
0063 #define FRAME_SIZE 32
0064
0065 #define ABCD %xmm0
0066 #define E0 %xmm1
0067 #define E1 %xmm2
0068 #define MSG0 %xmm3
0069 #define MSG1 %xmm4
0070 #define MSG2 %xmm5
0071 #define MSG3 %xmm6
0072 #define SHUF_MASK %xmm7
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094 .text
0095 .align 32
0096 SYM_FUNC_START(sha1_ni_transform)
0097 push %rbp
0098 mov %rsp, %rbp
0099 sub $FRAME_SIZE, %rsp
0100 and $~0xF, %rsp
0101
0102 shl $6, NUM_BLKS
0103 jz .Ldone_hash
0104 add DATA_PTR, NUM_BLKS
0105
0106
0107 pinsrd $3, 1*16(DIGEST_PTR), E0
0108 movdqu 0*16(DIGEST_PTR), ABCD
0109 pand UPPER_WORD_MASK(%rip), E0
0110 pshufd $0x1B, ABCD, ABCD
0111
0112 movdqa PSHUFFLE_BYTE_FLIP_MASK(%rip), SHUF_MASK
0113
0114 .Lloop0:
0115
0116 movdqa E0, (0*16)(%rsp)
0117 movdqa ABCD, (1*16)(%rsp)
0118
0119
0120 movdqu 0*16(DATA_PTR), MSG0
0121 pshufb SHUF_MASK, MSG0
0122 paddd MSG0, E0
0123 movdqa ABCD, E1
0124 sha1rnds4 $0, E0, ABCD
0125
0126
0127 movdqu 1*16(DATA_PTR), MSG1
0128 pshufb SHUF_MASK, MSG1
0129 sha1nexte MSG1, E1
0130 movdqa ABCD, E0
0131 sha1rnds4 $0, E1, ABCD
0132 sha1msg1 MSG1, MSG0
0133
0134
0135 movdqu 2*16(DATA_PTR), MSG2
0136 pshufb SHUF_MASK, MSG2
0137 sha1nexte MSG2, E0
0138 movdqa ABCD, E1
0139 sha1rnds4 $0, E0, ABCD
0140 sha1msg1 MSG2, MSG1
0141 pxor MSG2, MSG0
0142
0143
0144 movdqu 3*16(DATA_PTR), MSG3
0145 pshufb SHUF_MASK, MSG3
0146 sha1nexte MSG3, E1
0147 movdqa ABCD, E0
0148 sha1msg2 MSG3, MSG0
0149 sha1rnds4 $0, E1, ABCD
0150 sha1msg1 MSG3, MSG2
0151 pxor MSG3, MSG1
0152
0153
0154 sha1nexte MSG0, E0
0155 movdqa ABCD, E1
0156 sha1msg2 MSG0, MSG1
0157 sha1rnds4 $0, E0, ABCD
0158 sha1msg1 MSG0, MSG3
0159 pxor MSG0, MSG2
0160
0161
0162 sha1nexte MSG1, E1
0163 movdqa ABCD, E0
0164 sha1msg2 MSG1, MSG2
0165 sha1rnds4 $1, E1, ABCD
0166 sha1msg1 MSG1, MSG0
0167 pxor MSG1, MSG3
0168
0169
0170 sha1nexte MSG2, E0
0171 movdqa ABCD, E1
0172 sha1msg2 MSG2, MSG3
0173 sha1rnds4 $1, E0, ABCD
0174 sha1msg1 MSG2, MSG1
0175 pxor MSG2, MSG0
0176
0177
0178 sha1nexte MSG3, E1
0179 movdqa ABCD, E0
0180 sha1msg2 MSG3, MSG0
0181 sha1rnds4 $1, E1, ABCD
0182 sha1msg1 MSG3, MSG2
0183 pxor MSG3, MSG1
0184
0185
0186 sha1nexte MSG0, E0
0187 movdqa ABCD, E1
0188 sha1msg2 MSG0, MSG1
0189 sha1rnds4 $1, E0, ABCD
0190 sha1msg1 MSG0, MSG3
0191 pxor MSG0, MSG2
0192
0193
0194 sha1nexte MSG1, E1
0195 movdqa ABCD, E0
0196 sha1msg2 MSG1, MSG2
0197 sha1rnds4 $1, E1, ABCD
0198 sha1msg1 MSG1, MSG0
0199 pxor MSG1, MSG3
0200
0201
0202 sha1nexte MSG2, E0
0203 movdqa ABCD, E1
0204 sha1msg2 MSG2, MSG3
0205 sha1rnds4 $2, E0, ABCD
0206 sha1msg1 MSG2, MSG1
0207 pxor MSG2, MSG0
0208
0209
0210 sha1nexte MSG3, E1
0211 movdqa ABCD, E0
0212 sha1msg2 MSG3, MSG0
0213 sha1rnds4 $2, E1, ABCD
0214 sha1msg1 MSG3, MSG2
0215 pxor MSG3, MSG1
0216
0217
0218 sha1nexte MSG0, E0
0219 movdqa ABCD, E1
0220 sha1msg2 MSG0, MSG1
0221 sha1rnds4 $2, E0, ABCD
0222 sha1msg1 MSG0, MSG3
0223 pxor MSG0, MSG2
0224
0225
0226 sha1nexte MSG1, E1
0227 movdqa ABCD, E0
0228 sha1msg2 MSG1, MSG2
0229 sha1rnds4 $2, E1, ABCD
0230 sha1msg1 MSG1, MSG0
0231 pxor MSG1, MSG3
0232
0233
0234 sha1nexte MSG2, E0
0235 movdqa ABCD, E1
0236 sha1msg2 MSG2, MSG3
0237 sha1rnds4 $2, E0, ABCD
0238 sha1msg1 MSG2, MSG1
0239 pxor MSG2, MSG0
0240
0241
0242 sha1nexte MSG3, E1
0243 movdqa ABCD, E0
0244 sha1msg2 MSG3, MSG0
0245 sha1rnds4 $3, E1, ABCD
0246 sha1msg1 MSG3, MSG2
0247 pxor MSG3, MSG1
0248
0249
0250 sha1nexte MSG0, E0
0251 movdqa ABCD, E1
0252 sha1msg2 MSG0, MSG1
0253 sha1rnds4 $3, E0, ABCD
0254 sha1msg1 MSG0, MSG3
0255 pxor MSG0, MSG2
0256
0257
0258 sha1nexte MSG1, E1
0259 movdqa ABCD, E0
0260 sha1msg2 MSG1, MSG2
0261 sha1rnds4 $3, E1, ABCD
0262 pxor MSG1, MSG3
0263
0264
0265 sha1nexte MSG2, E0
0266 movdqa ABCD, E1
0267 sha1msg2 MSG2, MSG3
0268 sha1rnds4 $3, E0, ABCD
0269
0270
0271 sha1nexte MSG3, E1
0272 movdqa ABCD, E0
0273 sha1rnds4 $3, E1, ABCD
0274
0275
0276 sha1nexte (0*16)(%rsp), E0
0277 paddd (1*16)(%rsp), ABCD
0278
0279
0280 add $64, DATA_PTR
0281 cmp NUM_BLKS, DATA_PTR
0282 jne .Lloop0
0283
0284
0285 pshufd $0x1B, ABCD, ABCD
0286 movdqu ABCD, 0*16(DIGEST_PTR)
0287 pextrd $3, E0, 1*16(DIGEST_PTR)
0288
0289 .Ldone_hash:
0290 mov %rbp, %rsp
0291 pop %rbp
0292
0293 RET
0294 SYM_FUNC_END(sha1_ni_transform)
0295
0296 .section .rodata.cst16.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 16
0297 .align 16
0298 PSHUFFLE_BYTE_FLIP_MASK:
0299 .octa 0x000102030405060708090a0b0c0d0e0f
0300
0301 .section .rodata.cst16.UPPER_WORD_MASK, "aM", @progbits, 16
0302 .align 16
0303 UPPER_WORD_MASK:
0304 .octa 0xFFFFFFFF000000000000000000000000