0001
0002
0003
0004
0005
0006
0007 #include <asm/ppc_asm.h>
0008 #include <asm/asm-offsets.h>
0009 #include <asm/asm-compat.h>
0010
0011 #define rHP r3
0012 #define rWP r4
0013
0014 #define rH0 r0
0015 #define rH1 r6
0016 #define rH2 r7
0017 #define rH3 r5
0018
0019 #define rW00 r8
0020 #define rW01 r9
0021 #define rW02 r10
0022 #define rW03 r11
0023 #define rW04 r12
0024 #define rW05 r14
0025 #define rW06 r15
0026 #define rW07 r16
0027 #define rW08 r17
0028 #define rW09 r18
0029 #define rW10 r19
0030 #define rW11 r20
0031 #define rW12 r21
0032 #define rW13 r22
0033 #define rW14 r23
0034 #define rW15 r24
0035
0036 #define rT0 r25
0037 #define rT1 r26
0038
0039 #define INITIALIZE \
0040 PPC_STLU r1,-INT_FRAME_SIZE(r1); \
0041 SAVE_GPRS(14, 26, r1)
0042
0043 #define FINALIZE \
0044 REST_GPRS(14, 26, r1); \
0045 addi r1,r1,INT_FRAME_SIZE
0046
0047 #ifdef __BIG_ENDIAN__
0048 #define LOAD_DATA(reg, off) \
0049 lwbrx reg,0,rWP;
0050 #define INC_PTR \
0051 addi rWP,rWP,4;
0052 #define NEXT_BLOCK
0053 #else
0054 #define LOAD_DATA(reg, off) \
0055 lwz reg,off(rWP);
0056 #define INC_PTR
0057 #define NEXT_BLOCK \
0058 addi rWP,rWP,64;
0059 #endif
0060
0061 #define R_00_15(a, b, c, d, w0, w1, p, q, off, k0h, k0l, k1h, k1l) \
0062 LOAD_DATA(w0, off) \
0063 and rT0,b,c; \
0064 INC_PTR \
0065 andc rT1,d,b; \
0066 LOAD_DATA(w1, off+4) \
0067 or rT0,rT0,rT1; \
0068 addi w0,w0,k0l; \
0069 add a,a,rT0; \
0070 addis w0,w0,k0h; \
0071 addis w1,w1,k1h; \
0072 add a,a,w0; \
0073 addi w1,w1,k1l; \
0074 rotrwi a,a,p; \
0075 add d,d,w1; \
0076 add a,a,b; \
0077 and rT0,a,b; \
0078 andc rT1,c,a; \
0079 or rT0,rT0,rT1; \
0080 add d,d,rT0; \
0081 INC_PTR \
0082 rotrwi d,d,q; \
0083 add d,d,a;
0084
0085 #define R_16_31(a, b, c, d, w0, w1, p, q, k0h, k0l, k1h, k1l) \
0086 andc rT0,c,d; \
0087 and rT1,b,d; \
0088 addi w0,w0,k0l; \
0089 or rT0,rT0,rT1; \
0090 addis w0,w0,k0h; \
0091 add a,a,rT0; \
0092 addi w1,w1,k1l; \
0093 add a,a,w0; \
0094 addis w1,w1,k1h; \
0095 andc rT0,b,c; \
0096 rotrwi a,a,p; \
0097 add a,a,b; \
0098 add d,d,w1; \
0099 and rT1,a,c; \
0100 or rT0,rT0,rT1; \
0101 add d,d,rT0; \
0102 rotrwi d,d,q; \
0103 add d,d,a;
0104
0105 #define R_32_47(a, b, c, d, w0, w1, p, q, k0h, k0l, k1h, k1l) \
0106 xor rT0,b,c; \
0107 addi w0,w0,k0l; \
0108 xor rT1,rT0,d; \
0109 addis w0,w0,k0h; \
0110 add a,a,rT1; \
0111 addi w1,w1,k1l; \
0112 add a,a,w0; \
0113 addis w1,w1,k1h; \
0114 rotrwi a,a,p; \
0115 add d,d,w1; \
0116 add a,a,b; \
0117 xor rT1,rT0,a; \
0118 add d,d,rT1; \
0119 rotrwi d,d,q; \
0120 add d,d,a;
0121
0122 #define R_48_63(a, b, c, d, w0, w1, p, q, k0h, k0l, k1h, k1l) \
0123 addi w0,w0,k0l; \
0124 orc rT0,b,d; \
0125 addis w0,w0,k0h; \
0126 xor rT0,rT0,c; \
0127 add a,a,w0; \
0128 addi w1,w1,k1l; \
0129 add a,a,rT0; \
0130 addis w1,w1,k1h; \
0131 rotrwi a,a,p; \
0132 add a,a,b; \
0133 orc rT0,a,c; \
0134 add d,d,w1; \
0135 xor rT0,rT0,b; \
0136 add d,d,rT0; \
0137 rotrwi d,d,q; \
0138 add d,d,a;
0139
0140 _GLOBAL(ppc_md5_transform)
0141 INITIALIZE
0142
0143 mtctr r5
0144 lwz rH0,0(rHP)
0145 lwz rH1,4(rHP)
0146 lwz rH2,8(rHP)
0147 lwz rH3,12(rHP)
0148
0149 ppc_md5_main:
0150 R_00_15(rH0, rH1, rH2, rH3, rW00, rW01, 25, 20, 0,
0151 0xd76b, -23432, 0xe8c8, -18602)
0152 R_00_15(rH2, rH3, rH0, rH1, rW02, rW03, 15, 10, 8,
0153 0x2420, 0x70db, 0xc1be, -12562)
0154 R_00_15(rH0, rH1, rH2, rH3, rW04, rW05, 25, 20, 16,
0155 0xf57c, 0x0faf, 0x4788, -14806)
0156 R_00_15(rH2, rH3, rH0, rH1, rW06, rW07, 15, 10, 24,
0157 0xa830, 0x4613, 0xfd47, -27391)
0158 R_00_15(rH0, rH1, rH2, rH3, rW08, rW09, 25, 20, 32,
0159 0x6981, -26408, 0x8b45, -2129)
0160 R_00_15(rH2, rH3, rH0, rH1, rW10, rW11, 15, 10, 40,
0161 0xffff, 0x5bb1, 0x895d, -10306)
0162 R_00_15(rH0, rH1, rH2, rH3, rW12, rW13, 25, 20, 48,
0163 0x6b90, 0x1122, 0xfd98, 0x7193)
0164 R_00_15(rH2, rH3, rH0, rH1, rW14, rW15, 15, 10, 56,
0165 0xa679, 0x438e, 0x49b4, 0x0821)
0166
0167 R_16_31(rH0, rH1, rH2, rH3, rW01, rW06, 27, 23,
0168 0x0d56, 0x6e0c, 0x1810, 0x6d2d)
0169 R_16_31(rH2, rH3, rH0, rH1, rW11, rW00, 18, 12,
0170 0x9d02, -32109, 0x124c, 0x2332)
0171 R_16_31(rH0, rH1, rH2, rH3, rW05, rW10, 27, 23,
0172 0x8ea7, 0x4a33, 0x0245, -18270)
0173 R_16_31(rH2, rH3, rH0, rH1, rW15, rW04, 18, 12,
0174 0x8eee, -8608, 0xf258, -5095)
0175 R_16_31(rH0, rH1, rH2, rH3, rW09, rW14, 27, 23,
0176 0x969d, -10697, 0x1cbe, -15288)
0177 R_16_31(rH2, rH3, rH0, rH1, rW03, rW08, 18, 12,
0178 0x3317, 0x3e99, 0xdbd9, 0x7c15)
0179 R_16_31(rH0, rH1, rH2, rH3, rW13, rW02, 27, 23,
0180 0xac4b, 0x7772, 0xd8cf, 0x331d)
0181 R_16_31(rH2, rH3, rH0, rH1, rW07, rW12, 18, 12,
0182 0x6a28, 0x6dd8, 0x219a, 0x3b68)
0183
0184 R_32_47(rH0, rH1, rH2, rH3, rW05, rW08, 28, 21,
0185 0x29cb, 0x28e5, 0x4218, -7788)
0186 R_32_47(rH2, rH3, rH0, rH1, rW11, rW14, 16, 9,
0187 0x473f, 0x06d1, 0x3aae, 0x3036)
0188 R_32_47(rH0, rH1, rH2, rH3, rW01, rW04, 28, 21,
0189 0xaea1, -15134, 0x640b, -11295)
0190 R_32_47(rH2, rH3, rH0, rH1, rW07, rW10, 16, 9,
0191 0x8f4c, 0x4887, 0xbc7c, -22499)
0192 R_32_47(rH0, rH1, rH2, rH3, rW13, rW00, 28, 21,
0193 0x7eb8, -27199, 0x00ea, 0x6050)
0194 R_32_47(rH2, rH3, rH0, rH1, rW03, rW06, 16, 9,
0195 0xe01a, 0x22fe, 0x4447, 0x69c5)
0196 R_32_47(rH0, rH1, rH2, rH3, rW09, rW12, 28, 21,
0197 0xb7f3, 0x0253, 0x59b1, 0x4d5b)
0198 R_32_47(rH2, rH3, rH0, rH1, rW15, rW02, 16, 9,
0199 0x4701, -27017, 0xc7bd, -19859)
0200
0201 R_48_63(rH0, rH1, rH2, rH3, rW00, rW07, 26, 22,
0202 0x0988, -1462, 0x4c70, -19401)
0203 R_48_63(rH2, rH3, rH0, rH1, rW14, rW05, 17, 11,
0204 0xadaf, -5221, 0xfc99, 0x66f7)
0205 R_48_63(rH0, rH1, rH2, rH3, rW12, rW03, 26, 22,
0206 0x7e80, -16418, 0xba1e, -25587)
0207 R_48_63(rH2, rH3, rH0, rH1, rW10, rW01, 17, 11,
0208 0x4130, 0x380d, 0xe0c5, 0x738d)
0209 lwz rW00,0(rHP)
0210 R_48_63(rH0, rH1, rH2, rH3, rW08, rW15, 26, 22,
0211 0xe837, -30770, 0xde8a, 0x69e8)
0212 lwz rW14,4(rHP)
0213 R_48_63(rH2, rH3, rH0, rH1, rW06, rW13, 17, 11,
0214 0x9e79, 0x260f, 0x256d, -27941)
0215 lwz rW12,8(rHP)
0216 R_48_63(rH0, rH1, rH2, rH3, rW04, rW11, 26, 22,
0217 0xab75, -20775, 0x4f9e, -28397)
0218 lwz rW10,12(rHP)
0219 R_48_63(rH2, rH3, rH0, rH1, rW02, rW09, 17, 11,
0220 0x662b, 0x7c56, 0x11b2, 0x0358)
0221
0222 add rH0,rH0,rW00
0223 stw rH0,0(rHP)
0224 add rH1,rH1,rW14
0225 stw rH1,4(rHP)
0226 add rH2,rH2,rW12
0227 stw rH2,8(rHP)
0228 add rH3,rH3,rW10
0229 stw rH3,12(rHP)
0230 NEXT_BLOCK
0231
0232 bdnz ppc_md5_main
0233
0234 FINALIZE
0235 blr