Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * Fast MD5 implementation for PPC
0004  *
0005  * Copyright (c) 2015 Markus Stockhausen <stockhausen@collogia.de>
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)       /* push registers onto stack    */
0042 
0043 #define FINALIZE \
0044     REST_GPRS(14, 26, r1);      /* pop registers from stack */ \
0045     addi    r1,r1,INT_FRAME_SIZE
0046 
0047 #ifdef __BIG_ENDIAN__
0048 #define LOAD_DATA(reg, off) \
0049     lwbrx       reg,0,rWP;  /* load data            */
0050 #define INC_PTR \
0051     addi        rWP,rWP,4;  /* increment per word       */
0052 #define NEXT_BLOCK          /* nothing to do        */
0053 #else
0054 #define LOAD_DATA(reg, off) \
0055     lwz     reg,off(rWP);   /* load data            */
0056 #define INC_PTR             /* nothing to do        */
0057 #define NEXT_BLOCK \
0058     addi        rWP,rWP,64; /* increment per block      */
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)      /*    W             */ \
0063     and     rT0,b,c;    /* 1: f = b and c       */ \
0064     INC_PTR             /*    ptr++         */ \
0065     andc        rT1,d,b;    /* 1: f' = ~b and d     */ \
0066     LOAD_DATA(w1, off+4)        /*    W             */ \
0067     or      rT0,rT0,rT1;    /* 1: f = f or f'       */ \
0068     addi        w0,w0,k0l;  /* 1: wk = w + k        */ \
0069     add     a,a,rT0;    /* 1: a = a + f         */ \
0070     addis       w0,w0,k0h;  /* 1: wk = w + k'       */ \
0071     addis       w1,w1,k1h;  /* 2: wk = w + k        */ \
0072     add     a,a,w0;     /* 1: a = a + wk        */ \
0073     addi        w1,w1,k1l;  /* 2: wk = w + k'       */ \
0074     rotrwi      a,a,p;      /* 1: a = a rotl x      */ \
0075     add     d,d,w1;     /* 2: a = a + wk        */ \
0076     add     a,a,b;      /* 1: a = a + b         */ \
0077     and     rT0,a,b;    /* 2: f = b and c       */ \
0078     andc        rT1,c,a;    /* 2: f' = ~b and d     */ \
0079     or      rT0,rT0,rT1;    /* 2: f = f or f'       */ \
0080     add     d,d,rT0;    /* 2: a = a + f         */ \
0081     INC_PTR             /*    ptr++         */ \
0082     rotrwi      d,d,q;      /* 2: a = a rotl x      */ \
0083     add     d,d,a;      /* 2: a = a + b         */
0084 
0085 #define R_16_31(a, b, c, d, w0, w1, p, q, k0h, k0l, k1h, k1l) \
0086     andc        rT0,c,d;    /* 1: f = c and ~d      */ \
0087     and     rT1,b,d;    /* 1: f' = b and d      */ \
0088     addi        w0,w0,k0l;  /* 1: wk = w + k        */ \
0089     or      rT0,rT0,rT1;    /* 1: f = f or f'       */ \
0090     addis       w0,w0,k0h;  /* 1: wk = w + k'       */ \
0091     add     a,a,rT0;    /* 1: a = a + f         */ \
0092     addi        w1,w1,k1l;  /* 2: wk = w + k        */ \
0093     add     a,a,w0;     /* 1: a = a + wk        */ \
0094     addis       w1,w1,k1h;  /* 2: wk = w + k'       */ \
0095     andc        rT0,b,c;    /* 2: f = c and ~d      */ \
0096     rotrwi      a,a,p;      /* 1: a = a rotl x      */ \
0097     add     a,a,b;      /* 1: a = a + b         */ \
0098     add     d,d,w1;     /* 2: a = a + wk        */ \
0099     and     rT1,a,c;    /* 2: f' = b and d      */ \
0100     or      rT0,rT0,rT1;    /* 2: f = f or f'       */ \
0101     add     d,d,rT0;    /* 2: a = a + f         */ \
0102     rotrwi      d,d,q;      /* 2: a = a rotl x      */ \
0103     add     d,d,a;      /* 2: a = a +b          */
0104 
0105 #define R_32_47(a, b, c, d, w0, w1, p, q, k0h, k0l, k1h, k1l) \
0106     xor     rT0,b,c;    /* 1: f' = b xor c      */ \
0107     addi        w0,w0,k0l;  /* 1: wk = w + k        */ \
0108     xor     rT1,rT0,d;  /* 1: f = f xor f'      */ \
0109     addis       w0,w0,k0h;  /* 1: wk = w + k'       */ \
0110     add     a,a,rT1;    /* 1: a = a + f         */ \
0111     addi        w1,w1,k1l;  /* 2: wk = w + k        */ \
0112     add     a,a,w0;     /* 1: a = a + wk        */ \
0113     addis       w1,w1,k1h;  /* 2: wk = w + k'       */ \
0114     rotrwi      a,a,p;      /* 1: a = a rotl x      */ \
0115     add     d,d,w1;     /* 2: a = a + wk        */ \
0116     add     a,a,b;      /* 1: a = a + b         */ \
0117     xor     rT1,rT0,a;  /* 2: f = b xor f'      */ \
0118     add     d,d,rT1;    /* 2: a = a + f         */ \
0119     rotrwi      d,d,q;      /* 2: a = a rotl x      */ \
0120     add     d,d,a;      /* 2: a = a + b         */
0121 
0122 #define R_48_63(a, b, c, d, w0, w1, p, q, k0h, k0l, k1h, k1l) \
0123     addi        w0,w0,k0l;  /* 1: w = w + k         */ \
0124     orc     rT0,b,d;    /* 1: f = b or ~d       */ \
0125     addis       w0,w0,k0h;  /* 1: w = w + k'        */ \
0126     xor     rT0,rT0,c;  /* 1: f = f xor c       */ \
0127     add     a,a,w0;     /* 1: a = a + wk        */ \
0128     addi        w1,w1,k1l;  /* 2: w = w + k         */ \
0129     add     a,a,rT0;    /* 1: a = a + f         */ \
0130     addis       w1,w1,k1h;  /* 2: w = w + k'        */ \
0131     rotrwi      a,a,p;      /* 1: a = a rotl x      */ \
0132     add     a,a,b;      /* 1: a = a + b         */ \
0133     orc     rT0,a,c;    /* 2: f = b or ~d       */ \
0134     add     d,d,w1;     /* 2: a = a + wk        */ \
0135     xor     rT0,rT0,b;  /* 2: f = f xor c       */ \
0136     add     d,d,rT0;    /* 2: a = a + f         */ \
0137     rotrwi      d,d,q;      /* 2: a = a rotl x      */ \
0138     add     d,d,a;      /* 2: a = a + b         */
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