#define REGTMP3 R18
#define REGTMP4 R7
#define REGTMP5 R6
+#define REG_KT R19
// W[i] = M[i]; for 0 <= i <= 15
#define LOAD0(index) \
// Ch(x, y, z) = (x AND y) XOR (NOT x AND z)
// = ((y XOR z) AND x) XOR z
// Calculate T1 in REGTMP4
-#define SHA256T1(const, e, f, g, h) \
- ADDV $const, h; \
+#define SHA256T1(index, e, f, g, h) \
+ MOVW (index*4)(REG_KT), REGTMP5; \
+ ADDV REGTMP5, h; \
ADD REGTMP4, h; \
ROTR $6, e, REGTMP5; \
ROTR $11, e, REGTMP; \
// Calculate T1 and T2, then e = d + T1 and a = T1 + T2.
// The values for e and a are stored in d and h, ready for rotation.
-#define SHA256ROUND(const, a, b, c, d, e, f, g, h) \
- SHA256T1(const, e, f, g, h); \
+#define SHA256ROUND(index, a, b, c, d, e, f, g, h) \
+ SHA256T1(index, e, f, g, h); \
SHA256T2(a, b, c); \
ADD REGTMP4, d; \
ADD REGTMP1, REGTMP4, h
-#define SHA256ROUND0(index, const, a, b, c, d, e, f, g, h) \
+#define SHA256ROUND0(index, a, b, c, d, e, f, g, h) \
LOAD0(index); \
- SHA256ROUND(const, a, b, c, d, e, f, g, h)
+ SHA256ROUND(index, a, b, c, d, e, f, g, h)
-#define SHA256ROUND1(index, const, a, b, c, d, e, f, g, h) \
+#define SHA256ROUND1(index, a, b, c, d, e, f, g, h) \
LOAD1(index); \
- SHA256ROUND(const, a, b, c, d, e, f, g, h)
+ SHA256ROUND(index, a, b, c, d, e, f, g, h)
// A stack frame size of 64 bytes is required here, because
// the frame size used for data expansion is 64 bytes.
AND $~63, R6
BEQ R6, end
+ MOVV $·_K(SB), REG_KT // const table
+
// p_len >= 64
MOVV dig+0(FP), R4
ADDV R5, R6, R25
MOVW (7*4)(R4), R15 // h = H7
loop:
- SHA256ROUND0(0, 0x428a2f98, R8, R9, R10, R11, R12, R13, R14, R15)
- SHA256ROUND0(1, 0x71374491, R15, R8, R9, R10, R11, R12, R13, R14)
- SHA256ROUND0(2, 0xb5c0fbcf, R14, R15, R8, R9, R10, R11, R12, R13)
- SHA256ROUND0(3, 0xe9b5dba5, R13, R14, R15, R8, R9, R10, R11, R12)
- SHA256ROUND0(4, 0x3956c25b, R12, R13, R14, R15, R8, R9, R10, R11)
- SHA256ROUND0(5, 0x59f111f1, R11, R12, R13, R14, R15, R8, R9, R10)
- SHA256ROUND0(6, 0x923f82a4, R10, R11, R12, R13, R14, R15, R8, R9)
- SHA256ROUND0(7, 0xab1c5ed5, R9, R10, R11, R12, R13, R14, R15, R8)
- SHA256ROUND0(8, 0xd807aa98, R8, R9, R10, R11, R12, R13, R14, R15)
- SHA256ROUND0(9, 0x12835b01, R15, R8, R9, R10, R11, R12, R13, R14)
- SHA256ROUND0(10, 0x243185be, R14, R15, R8, R9, R10, R11, R12, R13)
- SHA256ROUND0(11, 0x550c7dc3, R13, R14, R15, R8, R9, R10, R11, R12)
- SHA256ROUND0(12, 0x72be5d74, R12, R13, R14, R15, R8, R9, R10, R11)
- SHA256ROUND0(13, 0x80deb1fe, R11, R12, R13, R14, R15, R8, R9, R10)
- SHA256ROUND0(14, 0x9bdc06a7, R10, R11, R12, R13, R14, R15, R8, R9)
- SHA256ROUND0(15, 0xc19bf174, R9, R10, R11, R12, R13, R14, R15, R8)
+ SHA256ROUND0(0, R8, R9, R10, R11, R12, R13, R14, R15)
+ SHA256ROUND0(1, R15, R8, R9, R10, R11, R12, R13, R14)
+ SHA256ROUND0(2, R14, R15, R8, R9, R10, R11, R12, R13)
+ SHA256ROUND0(3, R13, R14, R15, R8, R9, R10, R11, R12)
+ SHA256ROUND0(4, R12, R13, R14, R15, R8, R9, R10, R11)
+ SHA256ROUND0(5, R11, R12, R13, R14, R15, R8, R9, R10)
+ SHA256ROUND0(6, R10, R11, R12, R13, R14, R15, R8, R9)
+ SHA256ROUND0(7, R9, R10, R11, R12, R13, R14, R15, R8)
+ SHA256ROUND0(8, R8, R9, R10, R11, R12, R13, R14, R15)
+ SHA256ROUND0(9, R15, R8, R9, R10, R11, R12, R13, R14)
+ SHA256ROUND0(10, R14, R15, R8, R9, R10, R11, R12, R13)
+ SHA256ROUND0(11, R13, R14, R15, R8, R9, R10, R11, R12)
+ SHA256ROUND0(12, R12, R13, R14, R15, R8, R9, R10, R11)
+ SHA256ROUND0(13, R11, R12, R13, R14, R15, R8, R9, R10)
+ SHA256ROUND0(14, R10, R11, R12, R13, R14, R15, R8, R9)
+ SHA256ROUND0(15, R9, R10, R11, R12, R13, R14, R15, R8)
- SHA256ROUND1(16, 0xe49b69c1, R8, R9, R10, R11, R12, R13, R14, R15)
- SHA256ROUND1(17, 0xefbe4786, R15, R8, R9, R10, R11, R12, R13, R14)
- SHA256ROUND1(18, 0x0fc19dc6, R14, R15, R8, R9, R10, R11, R12, R13)
- SHA256ROUND1(19, 0x240ca1cc, R13, R14, R15, R8, R9, R10, R11, R12)
- SHA256ROUND1(20, 0x2de92c6f, R12, R13, R14, R15, R8, R9, R10, R11)
- SHA256ROUND1(21, 0x4a7484aa, R11, R12, R13, R14, R15, R8, R9, R10)
- SHA256ROUND1(22, 0x5cb0a9dc, R10, R11, R12, R13, R14, R15, R8, R9)
- SHA256ROUND1(23, 0x76f988da, R9, R10, R11, R12, R13, R14, R15, R8)
- SHA256ROUND1(24, 0x983e5152, R8, R9, R10, R11, R12, R13, R14, R15)
- SHA256ROUND1(25, 0xa831c66d, R15, R8, R9, R10, R11, R12, R13, R14)
- SHA256ROUND1(26, 0xb00327c8, R14, R15, R8, R9, R10, R11, R12, R13)
- SHA256ROUND1(27, 0xbf597fc7, R13, R14, R15, R8, R9, R10, R11, R12)
- SHA256ROUND1(28, 0xc6e00bf3, R12, R13, R14, R15, R8, R9, R10, R11)
- SHA256ROUND1(29, 0xd5a79147, R11, R12, R13, R14, R15, R8, R9, R10)
- SHA256ROUND1(30, 0x06ca6351, R10, R11, R12, R13, R14, R15, R8, R9)
- SHA256ROUND1(31, 0x14292967, R9, R10, R11, R12, R13, R14, R15, R8)
- SHA256ROUND1(32, 0x27b70a85, R8, R9, R10, R11, R12, R13, R14, R15)
- SHA256ROUND1(33, 0x2e1b2138, R15, R8, R9, R10, R11, R12, R13, R14)
- SHA256ROUND1(34, 0x4d2c6dfc, R14, R15, R8, R9, R10, R11, R12, R13)
- SHA256ROUND1(35, 0x53380d13, R13, R14, R15, R8, R9, R10, R11, R12)
- SHA256ROUND1(36, 0x650a7354, R12, R13, R14, R15, R8, R9, R10, R11)
- SHA256ROUND1(37, 0x766a0abb, R11, R12, R13, R14, R15, R8, R9, R10)
- SHA256ROUND1(38, 0x81c2c92e, R10, R11, R12, R13, R14, R15, R8, R9)
- SHA256ROUND1(39, 0x92722c85, R9, R10, R11, R12, R13, R14, R15, R8)
- SHA256ROUND1(40, 0xa2bfe8a1, R8, R9, R10, R11, R12, R13, R14, R15)
- SHA256ROUND1(41, 0xa81a664b, R15, R8, R9, R10, R11, R12, R13, R14)
- SHA256ROUND1(42, 0xc24b8b70, R14, R15, R8, R9, R10, R11, R12, R13)
- SHA256ROUND1(43, 0xc76c51a3, R13, R14, R15, R8, R9, R10, R11, R12)
- SHA256ROUND1(44, 0xd192e819, R12, R13, R14, R15, R8, R9, R10, R11)
- SHA256ROUND1(45, 0xd6990624, R11, R12, R13, R14, R15, R8, R9, R10)
- SHA256ROUND1(46, 0xf40e3585, R10, R11, R12, R13, R14, R15, R8, R9)
- SHA256ROUND1(47, 0x106aa070, R9, R10, R11, R12, R13, R14, R15, R8)
- SHA256ROUND1(48, 0x19a4c116, R8, R9, R10, R11, R12, R13, R14, R15)
- SHA256ROUND1(49, 0x1e376c08, R15, R8, R9, R10, R11, R12, R13, R14)
- SHA256ROUND1(50, 0x2748774c, R14, R15, R8, R9, R10, R11, R12, R13)
- SHA256ROUND1(51, 0x34b0bcb5, R13, R14, R15, R8, R9, R10, R11, R12)
- SHA256ROUND1(52, 0x391c0cb3, R12, R13, R14, R15, R8, R9, R10, R11)
- SHA256ROUND1(53, 0x4ed8aa4a, R11, R12, R13, R14, R15, R8, R9, R10)
- SHA256ROUND1(54, 0x5b9cca4f, R10, R11, R12, R13, R14, R15, R8, R9)
- SHA256ROUND1(55, 0x682e6ff3, R9, R10, R11, R12, R13, R14, R15, R8)
- SHA256ROUND1(56, 0x748f82ee, R8, R9, R10, R11, R12, R13, R14, R15)
- SHA256ROUND1(57, 0x78a5636f, R15, R8, R9, R10, R11, R12, R13, R14)
- SHA256ROUND1(58, 0x84c87814, R14, R15, R8, R9, R10, R11, R12, R13)
- SHA256ROUND1(59, 0x8cc70208, R13, R14, R15, R8, R9, R10, R11, R12)
- SHA256ROUND1(60, 0x90befffa, R12, R13, R14, R15, R8, R9, R10, R11)
- SHA256ROUND1(61, 0xa4506ceb, R11, R12, R13, R14, R15, R8, R9, R10)
- SHA256ROUND1(62, 0xbef9a3f7, R10, R11, R12, R13, R14, R15, R8, R9)
- SHA256ROUND1(63, 0xc67178f2, R9, R10, R11, R12, R13, R14, R15, R8)
+ SHA256ROUND1(16, R8, R9, R10, R11, R12, R13, R14, R15)
+ SHA256ROUND1(17, R15, R8, R9, R10, R11, R12, R13, R14)
+ SHA256ROUND1(18, R14, R15, R8, R9, R10, R11, R12, R13)
+ SHA256ROUND1(19, R13, R14, R15, R8, R9, R10, R11, R12)
+ SHA256ROUND1(20, R12, R13, R14, R15, R8, R9, R10, R11)
+ SHA256ROUND1(21, R11, R12, R13, R14, R15, R8, R9, R10)
+ SHA256ROUND1(22, R10, R11, R12, R13, R14, R15, R8, R9)
+ SHA256ROUND1(23, R9, R10, R11, R12, R13, R14, R15, R8)
+ SHA256ROUND1(24, R8, R9, R10, R11, R12, R13, R14, R15)
+ SHA256ROUND1(25, R15, R8, R9, R10, R11, R12, R13, R14)
+ SHA256ROUND1(26, R14, R15, R8, R9, R10, R11, R12, R13)
+ SHA256ROUND1(27, R13, R14, R15, R8, R9, R10, R11, R12)
+ SHA256ROUND1(28, R12, R13, R14, R15, R8, R9, R10, R11)
+ SHA256ROUND1(29, R11, R12, R13, R14, R15, R8, R9, R10)
+ SHA256ROUND1(30, R10, R11, R12, R13, R14, R15, R8, R9)
+ SHA256ROUND1(31, R9, R10, R11, R12, R13, R14, R15, R8)
+ SHA256ROUND1(32, R8, R9, R10, R11, R12, R13, R14, R15)
+ SHA256ROUND1(33, R15, R8, R9, R10, R11, R12, R13, R14)
+ SHA256ROUND1(34, R14, R15, R8, R9, R10, R11, R12, R13)
+ SHA256ROUND1(35, R13, R14, R15, R8, R9, R10, R11, R12)
+ SHA256ROUND1(36, R12, R13, R14, R15, R8, R9, R10, R11)
+ SHA256ROUND1(37, R11, R12, R13, R14, R15, R8, R9, R10)
+ SHA256ROUND1(38, R10, R11, R12, R13, R14, R15, R8, R9)
+ SHA256ROUND1(39, R9, R10, R11, R12, R13, R14, R15, R8)
+ SHA256ROUND1(40, R8, R9, R10, R11, R12, R13, R14, R15)
+ SHA256ROUND1(41, R15, R8, R9, R10, R11, R12, R13, R14)
+ SHA256ROUND1(42, R14, R15, R8, R9, R10, R11, R12, R13)
+ SHA256ROUND1(43, R13, R14, R15, R8, R9, R10, R11, R12)
+ SHA256ROUND1(44, R12, R13, R14, R15, R8, R9, R10, R11)
+ SHA256ROUND1(45, R11, R12, R13, R14, R15, R8, R9, R10)
+ SHA256ROUND1(46, R10, R11, R12, R13, R14, R15, R8, R9)
+ SHA256ROUND1(47, R9, R10, R11, R12, R13, R14, R15, R8)
+ SHA256ROUND1(48, R8, R9, R10, R11, R12, R13, R14, R15)
+ SHA256ROUND1(49, R15, R8, R9, R10, R11, R12, R13, R14)
+ SHA256ROUND1(50, R14, R15, R8, R9, R10, R11, R12, R13)
+ SHA256ROUND1(51, R13, R14, R15, R8, R9, R10, R11, R12)
+ SHA256ROUND1(52, R12, R13, R14, R15, R8, R9, R10, R11)
+ SHA256ROUND1(53, R11, R12, R13, R14, R15, R8, R9, R10)
+ SHA256ROUND1(54, R10, R11, R12, R13, R14, R15, R8, R9)
+ SHA256ROUND1(55, R9, R10, R11, R12, R13, R14, R15, R8)
+ SHA256ROUND1(56, R8, R9, R10, R11, R12, R13, R14, R15)
+ SHA256ROUND1(57, R15, R8, R9, R10, R11, R12, R13, R14)
+ SHA256ROUND1(58, R14, R15, R8, R9, R10, R11, R12, R13)
+ SHA256ROUND1(59, R13, R14, R15, R8, R9, R10, R11, R12)
+ SHA256ROUND1(60, R12, R13, R14, R15, R8, R9, R10, R11)
+ SHA256ROUND1(61, R11, R12, R13, R14, R15, R8, R9, R10)
+ SHA256ROUND1(62, R10, R11, R12, R13, R14, R15, R8, R9)
+ SHA256ROUND1(63, R9, R10, R11, R12, R13, R14, R15, R8)
MOVW (0*4)(R4), REGTMP
MOVW (1*4)(R4), REGTMP1