0001
0002
0003
0004
0005
0006
0007
0008 #include <asm/ppc_asm.h>
0009 #include <asm/asm-offsets.h>
0010 #include <asm/asm-compat.h>
0011
0012 #ifdef __BIG_ENDIAN__
0013 #define LWZ(rt, d, ra) \
0014 lwz rt,d(ra)
0015 #else
0016 #define LWZ(rt, d, ra) \
0017 li rt,d; \
0018 lwbrx rt,rt,ra
0019 #endif
0020
0021
0022
0023
0024
0025
0026 #define RT(t) ((((t)+5)%6)+7)
0027 #define RA(t) ((((t)+4)%6)+7)
0028 #define RB(t) ((((t)+3)%6)+7)
0029 #define RC(t) ((((t)+2)%6)+7)
0030 #define RD(t) ((((t)+1)%6)+7)
0031 #define RE(t) ((((t)+0)%6)+7)
0032
0033
0034 #define W(t) (((t)%16)+16)
0035
0036 #define LOADW(t) \
0037 LWZ(W(t),(t)*4,r4)
0038
0039 #define STEPD0_LOAD(t) \
0040 andc r0,RD(t),RB(t); \
0041 and r6,RB(t),RC(t); \
0042 rotlwi RT(t),RA(t),5; \
0043 or r6,r6,r0; \
0044 add r0,RE(t),r15; \
0045 add RT(t),RT(t),r6; \
0046 add r14,r0,W(t); \
0047 LWZ(W((t)+4),((t)+4)*4,r4); \
0048 rotlwi RB(t),RB(t),30; \
0049 add RT(t),RT(t),r14
0050
0051 #define STEPD0_UPDATE(t) \
0052 and r6,RB(t),RC(t); \
0053 andc r0,RD(t),RB(t); \
0054 rotlwi RT(t),RA(t),5; \
0055 rotlwi RB(t),RB(t),30; \
0056 or r6,r6,r0; \
0057 add r0,RE(t),r15; \
0058 xor r5,W((t)+4-3),W((t)+4-8); \
0059 add RT(t),RT(t),r6; \
0060 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
0061 add r0,r0,W(t); \
0062 xor W((t)+4),W((t)+4),r5; \
0063 add RT(t),RT(t),r0; \
0064 rotlwi W((t)+4),W((t)+4),1
0065
0066 #define STEPD1(t) \
0067 xor r6,RB(t),RC(t); \
0068 rotlwi RT(t),RA(t),5; \
0069 rotlwi RB(t),RB(t),30; \
0070 xor r6,r6,RD(t); \
0071 add r0,RE(t),r15; \
0072 add RT(t),RT(t),r6; \
0073 add r0,r0,W(t); \
0074 add RT(t),RT(t),r0
0075
0076 #define STEPD1_UPDATE(t) \
0077 xor r6,RB(t),RC(t); \
0078 rotlwi RT(t),RA(t),5; \
0079 rotlwi RB(t),RB(t),30; \
0080 xor r6,r6,RD(t); \
0081 add r0,RE(t),r15; \
0082 xor r5,W((t)+4-3),W((t)+4-8); \
0083 add RT(t),RT(t),r6; \
0084 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
0085 add r0,r0,W(t); \
0086 xor W((t)+4),W((t)+4),r5; \
0087 add RT(t),RT(t),r0; \
0088 rotlwi W((t)+4),W((t)+4),1
0089
0090 #define STEPD2_UPDATE(t) \
0091 and r6,RB(t),RC(t); \
0092 and r0,RB(t),RD(t); \
0093 rotlwi RT(t),RA(t),5; \
0094 or r6,r6,r0; \
0095 rotlwi RB(t),RB(t),30; \
0096 and r0,RC(t),RD(t); \
0097 xor r5,W((t)+4-3),W((t)+4-8); \
0098 or r6,r6,r0; \
0099 xor W((t)+4),W((t)+4-16),W((t)+4-14); \
0100 add r0,RE(t),r15; \
0101 add RT(t),RT(t),r6; \
0102 add r0,r0,W(t); \
0103 xor W((t)+4),W((t)+4),r5; \
0104 add RT(t),RT(t),r0; \
0105 rotlwi W((t)+4),W((t)+4),1
0106
0107 #define STEP0LD4(t) \
0108 STEPD0_LOAD(t); \
0109 STEPD0_LOAD((t)+1); \
0110 STEPD0_LOAD((t)+2); \
0111 STEPD0_LOAD((t)+3)
0112
0113 #define STEPUP4(t, fn) \
0114 STEP##fn##_UPDATE(t); \
0115 STEP##fn##_UPDATE((t)+1); \
0116 STEP##fn##_UPDATE((t)+2); \
0117 STEP##fn##_UPDATE((t)+3)
0118
0119 #define STEPUP20(t, fn) \
0120 STEPUP4(t, fn); \
0121 STEPUP4((t)+4, fn); \
0122 STEPUP4((t)+8, fn); \
0123 STEPUP4((t)+12, fn); \
0124 STEPUP4((t)+16, fn)
0125
0126 _GLOBAL(powerpc_sha_transform)
0127 PPC_STLU r1,-INT_FRAME_SIZE(r1)
0128 SAVE_GPRS(14, 31, r1)
0129
0130
0131 lwz RA(0),0(r3)
0132 lwz RB(0),4(r3)
0133 lwz RC(0),8(r3)
0134 lwz RD(0),12(r3)
0135 lwz RE(0),16(r3)
0136
0137 LOADW(0)
0138 LOADW(1)
0139 LOADW(2)
0140 LOADW(3)
0141
0142 lis r15,0x5a82
0143 ori r15,r15,0x7999
0144 STEP0LD4(0)
0145 STEP0LD4(4)
0146 STEP0LD4(8)
0147 STEPUP4(12, D0)
0148 STEPUP4(16, D0)
0149
0150 lis r15,0x6ed9
0151 ori r15,r15,0xeba1
0152 STEPUP20(20, D1)
0153
0154 lis r15,0x8f1b
0155 ori r15,r15,0xbcdc
0156 STEPUP20(40, D2)
0157
0158 lis r15,0xca62
0159 ori r15,r15,0xc1d6
0160 STEPUP4(60, D1)
0161 STEPUP4(64, D1)
0162 STEPUP4(68, D1)
0163 STEPUP4(72, D1)
0164 lwz r20,16(r3)
0165 STEPD1(76)
0166 lwz r19,12(r3)
0167 STEPD1(77)
0168 lwz r18,8(r3)
0169 STEPD1(78)
0170 lwz r17,4(r3)
0171 STEPD1(79)
0172
0173 lwz r16,0(r3)
0174 add r20,RE(80),r20
0175 add RD(0),RD(80),r19
0176 add RC(0),RC(80),r18
0177 add RB(0),RB(80),r17
0178 add RA(0),RA(80),r16
0179 mr RE(0),r20
0180 stw RA(0),0(r3)
0181 stw RB(0),4(r3)
0182 stw RC(0),8(r3)
0183 stw RD(0),12(r3)
0184 stw RE(0),16(r3)
0185
0186 REST_GPRS(14, 31, r1)
0187 addi r1,r1,INT_FRAME_SIZE
0188 blr