1*0a6a1f1dSLionel Sambuc! des_enc.m4 2*0a6a1f1dSLionel Sambuc! des_enc.S (generated from des_enc.m4) 3*0a6a1f1dSLionel Sambuc! 4*0a6a1f1dSLionel Sambuc! UltraSPARC assembler version of the LibDES/SSLeay/OpenSSL des_enc.c file. 5*0a6a1f1dSLionel Sambuc! 6*0a6a1f1dSLionel Sambuc! Version 1.0. 32-bit version. 7*0a6a1f1dSLionel Sambuc! 8*0a6a1f1dSLionel Sambuc! June 8, 2000. 9*0a6a1f1dSLionel Sambuc! 10*0a6a1f1dSLionel Sambuc! Version 2.0. 32/64-bit, PIC-ification, blended CPU adaptation 11*0a6a1f1dSLionel Sambuc! by Andy Polyakov. 12*0a6a1f1dSLionel Sambuc! 13*0a6a1f1dSLionel Sambuc! January 1, 2003. 14*0a6a1f1dSLionel Sambuc! 15*0a6a1f1dSLionel Sambuc! Assembler version: Copyright Svend Olaf Mikkelsen. 16*0a6a1f1dSLionel Sambuc! 17*0a6a1f1dSLionel Sambuc! Original C code: Copyright Eric A. Young. 18*0a6a1f1dSLionel Sambuc! 19*0a6a1f1dSLionel Sambuc! This code can be freely used by LibDES/SSLeay/OpenSSL users. 20*0a6a1f1dSLionel Sambuc! 21*0a6a1f1dSLionel Sambuc! The LibDES/SSLeay/OpenSSL copyright notices must be respected. 22*0a6a1f1dSLionel Sambuc! 23*0a6a1f1dSLionel Sambuc! This version can be redistributed. 24*0a6a1f1dSLionel Sambuc! 25*0a6a1f1dSLionel Sambuc! To expand the m4 macros: m4 -B 8192 des_enc.m4 > des_enc.S 26*0a6a1f1dSLionel Sambuc! 27*0a6a1f1dSLionel Sambuc! Global registers 1 to 5 are used. This is the same as done by the 28*0a6a1f1dSLionel Sambuc! cc compiler. The UltraSPARC load/store little endian feature is used. 29*0a6a1f1dSLionel Sambuc! 30*0a6a1f1dSLionel Sambuc! Instruction grouping often refers to one CPU cycle. 31*0a6a1f1dSLionel Sambuc! 32*0a6a1f1dSLionel Sambuc! Assemble through gcc: gcc -c -mcpu=ultrasparc -o des_enc.o des_enc.S 33*0a6a1f1dSLionel Sambuc! 34*0a6a1f1dSLionel Sambuc! Assemble through cc: cc -c -xarch=v8plusa -o des_enc.o des_enc.S 35*0a6a1f1dSLionel Sambuc! 36*0a6a1f1dSLionel Sambuc! Performance improvement according to './apps/openssl speed des' 37*0a6a1f1dSLionel Sambuc! 38*0a6a1f1dSLionel Sambuc! 32-bit build: 39*0a6a1f1dSLionel Sambuc! 23% faster than cc-5.2 -xarch=v8plus -xO5 40*0a6a1f1dSLionel Sambuc! 115% faster than gcc-3.2.1 -m32 -mcpu=ultrasparc -O5 41*0a6a1f1dSLionel Sambuc! 64-bit build: 42*0a6a1f1dSLionel Sambuc! 50% faster than cc-5.2 -xarch=v9 -xO5 43*0a6a1f1dSLionel Sambuc! 100% faster than gcc-3.2.1 -m64 -mcpu=ultrasparc -O5 44*0a6a1f1dSLionel Sambuc! 45*0a6a1f1dSLionel Sambuc 46*0a6a1f1dSLionel Sambuc.ident "des_enc.m4 2.1" 47*0a6a1f1dSLionel Sambuc.file "des_enc-sparc.S" 48*0a6a1f1dSLionel Sambuc 49*0a6a1f1dSLionel Sambuc#if defined(__SUNPRO_C) && defined(__sparcv9) 50*0a6a1f1dSLionel Sambuc# define ABI64 /* They've said -xarch=v9 at command line */ 51*0a6a1f1dSLionel Sambuc#elif defined(__GNUC__) && defined(__arch64__) 52*0a6a1f1dSLionel Sambuc# define ABI64 /* They've said -m64 at command line */ 53*0a6a1f1dSLionel Sambuc#endif 54*0a6a1f1dSLionel Sambuc 55*0a6a1f1dSLionel Sambuc#ifdef ABI64 56*0a6a1f1dSLionel Sambuc .register %g2,#scratch 57*0a6a1f1dSLionel Sambuc .register %g3,#scratch 58*0a6a1f1dSLionel Sambuc# define FRAME -192 59*0a6a1f1dSLionel Sambuc# define BIAS 2047 60*0a6a1f1dSLionel Sambuc# define LDPTR ldx 61*0a6a1f1dSLionel Sambuc# define STPTR stx 62*0a6a1f1dSLionel Sambuc# define ARG0 128 63*0a6a1f1dSLionel Sambuc# define ARGSZ 8 64*0a6a1f1dSLionel Sambuc# ifndef __sparc_v9__ 65*0a6a1f1dSLionel Sambuc# define __sparc_v9__ 66*0a6a1f1dSLionel Sambuc# endif 67*0a6a1f1dSLionel Sambuc#else 68*0a6a1f1dSLionel Sambuc# define FRAME -96 69*0a6a1f1dSLionel Sambuc# define BIAS 0 70*0a6a1f1dSLionel Sambuc# define LDPTR ld 71*0a6a1f1dSLionel Sambuc# define STPTR st 72*0a6a1f1dSLionel Sambuc# define ARG0 68 73*0a6a1f1dSLionel Sambuc# define ARGSZ 4 74*0a6a1f1dSLionel Sambuc#endif 75*0a6a1f1dSLionel Sambuc 76*0a6a1f1dSLionel Sambuc#define LOOPS 7 77*0a6a1f1dSLionel Sambuc 78*0a6a1f1dSLionel Sambuc#define global0 %g0 79*0a6a1f1dSLionel Sambuc#define global1 %g1 80*0a6a1f1dSLionel Sambuc#define global2 %g2 81*0a6a1f1dSLionel Sambuc#define global3 %g3 82*0a6a1f1dSLionel Sambuc#define global4 %g4 83*0a6a1f1dSLionel Sambuc#define global5 %g5 84*0a6a1f1dSLionel Sambuc 85*0a6a1f1dSLionel Sambuc#define local0 %l0 86*0a6a1f1dSLionel Sambuc#define local1 %l1 87*0a6a1f1dSLionel Sambuc#define local2 %l2 88*0a6a1f1dSLionel Sambuc#define local3 %l3 89*0a6a1f1dSLionel Sambuc#define local4 %l4 90*0a6a1f1dSLionel Sambuc#define local5 %l5 91*0a6a1f1dSLionel Sambuc#define local7 %l6 92*0a6a1f1dSLionel Sambuc#define local6 %l7 93*0a6a1f1dSLionel Sambuc 94*0a6a1f1dSLionel Sambuc#define in0 %i0 95*0a6a1f1dSLionel Sambuc#define in1 %i1 96*0a6a1f1dSLionel Sambuc#define in2 %i2 97*0a6a1f1dSLionel Sambuc#define in3 %i3 98*0a6a1f1dSLionel Sambuc#define in4 %i4 99*0a6a1f1dSLionel Sambuc#define in5 %i5 100*0a6a1f1dSLionel Sambuc#define in6 %i6 101*0a6a1f1dSLionel Sambuc#define in7 %i7 102*0a6a1f1dSLionel Sambuc 103*0a6a1f1dSLionel Sambuc#define out0 %o0 104*0a6a1f1dSLionel Sambuc#define out1 %o1 105*0a6a1f1dSLionel Sambuc#define out2 %o2 106*0a6a1f1dSLionel Sambuc#define out3 %o3 107*0a6a1f1dSLionel Sambuc#define out4 %o4 108*0a6a1f1dSLionel Sambuc#define out5 %o5 109*0a6a1f1dSLionel Sambuc#define out6 %o6 110*0a6a1f1dSLionel Sambuc#define out7 %o7 111*0a6a1f1dSLionel Sambuc 112*0a6a1f1dSLionel Sambuc#define stub stb 113*0a6a1f1dSLionel Sambuc 114*0a6a1f1dSLionel Sambuc 115*0a6a1f1dSLionel Sambuc 116*0a6a1f1dSLionel Sambuc 117*0a6a1f1dSLionel Sambuc! Macro definitions: 118*0a6a1f1dSLionel Sambuc 119*0a6a1f1dSLionel Sambuc 120*0a6a1f1dSLionel Sambuc! ip_macro 121*0a6a1f1dSLionel Sambuc! 122*0a6a1f1dSLionel Sambuc! The logic used in initial and final permutations is the same as in 123*0a6a1f1dSLionel Sambuc! the C code. The permutations are done with a clever , xor, and 124*0a6a1f1dSLionel Sambuc! technique. 125*0a6a1f1dSLionel Sambuc! 126*0a6a1f1dSLionel Sambuc! The macro also loads address sbox 1 to 5 to global 1 to 5, address 127*0a6a1f1dSLionel Sambuc! sbox 6 to local6, and addres sbox 8 to out3. 128*0a6a1f1dSLionel Sambuc! 129*0a6a1f1dSLionel Sambuc! Rotates the halfs 3 left to bring the sbox bits in convenient positions. 130*0a6a1f1dSLionel Sambuc! 131*0a6a1f1dSLionel Sambuc! Loads key first round from address in parameter 5 to out0, out1. 132*0a6a1f1dSLionel Sambuc! 133*0a6a1f1dSLionel Sambuc! After the the original LibDES initial permutation, the resulting left 134*0a6a1f1dSLionel Sambuc! is in the variable initially used for right and vice versa. The macro 135*0a6a1f1dSLionel Sambuc! implements the possibility to keep the halfs in the original registers. 136*0a6a1f1dSLionel Sambuc! 137*0a6a1f1dSLionel Sambuc! parameter 1 left 138*0a6a1f1dSLionel Sambuc! parameter 2 right 139*0a6a1f1dSLionel Sambuc! parameter 3 result left (modify in first round) 140*0a6a1f1dSLionel Sambuc! parameter 4 result right (use in first round) 141*0a6a1f1dSLionel Sambuc! parameter 5 key address 142*0a6a1f1dSLionel Sambuc! parameter 6 1/2 for include encryption/decryption 143*0a6a1f1dSLionel Sambuc! parameter 7 1 for move in1 to in3 144*0a6a1f1dSLionel Sambuc! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 145*0a6a1f1dSLionel Sambuc! parameter 9 1 for load ks3 and ks2 to in4 and in3 146*0a6a1f1dSLionel Sambuc 147*0a6a1f1dSLionel Sambuc 148*0a6a1f1dSLionel Sambuc 149*0a6a1f1dSLionel Sambuc 150*0a6a1f1dSLionel Sambuc! rounds_macro 151*0a6a1f1dSLionel Sambuc! 152*0a6a1f1dSLionel Sambuc! The logic used in the DES rounds is the same as in the C code, 153*0a6a1f1dSLionel Sambuc! except that calculations for sbox 1 and sbox 5 begin before 154*0a6a1f1dSLionel Sambuc! the previous round is finished. 155*0a6a1f1dSLionel Sambuc! 156*0a6a1f1dSLionel Sambuc! In each round one half (work) is modified based on key and the 157*0a6a1f1dSLionel Sambuc! other half (use). 158*0a6a1f1dSLionel Sambuc! 159*0a6a1f1dSLionel Sambuc! In this version we do two rounds in a loop repeated 7 times 160*0a6a1f1dSLionel Sambuc! and two rounds seperately. 161*0a6a1f1dSLionel Sambuc! 162*0a6a1f1dSLionel Sambuc! One half has the bits for the sboxes in the following positions: 163*0a6a1f1dSLionel Sambuc! 164*0a6a1f1dSLionel Sambuc! 777777xx555555xx333333xx111111xx 165*0a6a1f1dSLionel Sambuc! 166*0a6a1f1dSLionel Sambuc! 88xx666666xx444444xx222222xx8888 167*0a6a1f1dSLionel Sambuc! 168*0a6a1f1dSLionel Sambuc! The bits for each sbox are xor-ed with the key bits for that box. 169*0a6a1f1dSLionel Sambuc! The above xx bits are cleared, and the result used for lookup in 170*0a6a1f1dSLionel Sambuc! the sbox table. Each sbox entry contains the 4 output bits permuted 171*0a6a1f1dSLionel Sambuc! into 32 bits according to the P permutation. 172*0a6a1f1dSLionel Sambuc! 173*0a6a1f1dSLionel Sambuc! In the description of DES, left and right are switched after 174*0a6a1f1dSLionel Sambuc! each round, except after last round. In this code the original 175*0a6a1f1dSLionel Sambuc! left and right are kept in the same register in all rounds, meaning 176*0a6a1f1dSLionel Sambuc! that after the 16 rounds the result for right is in the register 177*0a6a1f1dSLionel Sambuc! originally used for left. 178*0a6a1f1dSLionel Sambuc! 179*0a6a1f1dSLionel Sambuc! parameter 1 first work (left in first round) 180*0a6a1f1dSLionel Sambuc! parameter 2 first use (right in first round) 181*0a6a1f1dSLionel Sambuc! parameter 3 enc/dec 1/-1 182*0a6a1f1dSLionel Sambuc! parameter 4 loop label 183*0a6a1f1dSLionel Sambuc! parameter 5 key address register 184*0a6a1f1dSLionel Sambuc! parameter 6 optional address for key next encryption/decryption 185*0a6a1f1dSLionel Sambuc! parameter 7 not empty for include retl 186*0a6a1f1dSLionel Sambuc! 187*0a6a1f1dSLionel Sambuc! also compares in2 to 8 188*0a6a1f1dSLionel Sambuc 189*0a6a1f1dSLionel Sambuc 190*0a6a1f1dSLionel Sambuc 191*0a6a1f1dSLionel Sambuc 192*0a6a1f1dSLionel Sambuc! fp_macro 193*0a6a1f1dSLionel Sambuc! 194*0a6a1f1dSLionel Sambuc! parameter 1 right (original left) 195*0a6a1f1dSLionel Sambuc! parameter 2 left (original right) 196*0a6a1f1dSLionel Sambuc! parameter 3 1 for optional store to [in0] 197*0a6a1f1dSLionel Sambuc! parameter 4 1 for load input/output address to local5/7 198*0a6a1f1dSLionel Sambuc! 199*0a6a1f1dSLionel Sambuc! The final permutation logic switches the halfes, meaning that 200*0a6a1f1dSLionel Sambuc! left and right ends up the the registers originally used. 201*0a6a1f1dSLionel Sambuc 202*0a6a1f1dSLionel Sambuc 203*0a6a1f1dSLionel Sambuc 204*0a6a1f1dSLionel Sambuc 205*0a6a1f1dSLionel Sambuc! fp_ip_macro 206*0a6a1f1dSLionel Sambuc! 207*0a6a1f1dSLionel Sambuc! Does initial permutation for next block mixed with 208*0a6a1f1dSLionel Sambuc! final permutation for current block. 209*0a6a1f1dSLionel Sambuc! 210*0a6a1f1dSLionel Sambuc! parameter 1 original left 211*0a6a1f1dSLionel Sambuc! parameter 2 original right 212*0a6a1f1dSLionel Sambuc! parameter 3 left ip 213*0a6a1f1dSLionel Sambuc! parameter 4 right ip 214*0a6a1f1dSLionel Sambuc! parameter 5 1: load ks1/ks2 to in3/in4, add 120 to in4 215*0a6a1f1dSLionel Sambuc! 2: mov in4 to in3 216*0a6a1f1dSLionel Sambuc! 217*0a6a1f1dSLionel Sambuc! also adds -8 to length in2 and loads loop counter to out4 218*0a6a1f1dSLionel Sambuc 219*0a6a1f1dSLionel Sambuc 220*0a6a1f1dSLionel Sambuc 221*0a6a1f1dSLionel Sambuc 222*0a6a1f1dSLionel Sambuc 223*0a6a1f1dSLionel Sambuc! load_little_endian 224*0a6a1f1dSLionel Sambuc! 225*0a6a1f1dSLionel Sambuc! parameter 1 address 226*0a6a1f1dSLionel Sambuc! parameter 2 destination left 227*0a6a1f1dSLionel Sambuc! parameter 3 destination right 228*0a6a1f1dSLionel Sambuc! parameter 4 temporar 229*0a6a1f1dSLionel Sambuc! parameter 5 label 230*0a6a1f1dSLionel Sambuc 231*0a6a1f1dSLionel Sambuc 232*0a6a1f1dSLionel Sambuc 233*0a6a1f1dSLionel Sambuc 234*0a6a1f1dSLionel Sambuc! load_little_endian_inc 235*0a6a1f1dSLionel Sambuc! 236*0a6a1f1dSLionel Sambuc! parameter 1 address 237*0a6a1f1dSLionel Sambuc! parameter 2 destination left 238*0a6a1f1dSLionel Sambuc! parameter 3 destination right 239*0a6a1f1dSLionel Sambuc! parameter 4 temporar 240*0a6a1f1dSLionel Sambuc! parameter 4 label 241*0a6a1f1dSLionel Sambuc! 242*0a6a1f1dSLionel Sambuc! adds 8 to address 243*0a6a1f1dSLionel Sambuc 244*0a6a1f1dSLionel Sambuc 245*0a6a1f1dSLionel Sambuc 246*0a6a1f1dSLionel Sambuc 247*0a6a1f1dSLionel Sambuc! load_n_bytes 248*0a6a1f1dSLionel Sambuc! 249*0a6a1f1dSLionel Sambuc! Loads 1 to 7 bytes little endian 250*0a6a1f1dSLionel Sambuc! Remaining bytes are zeroed. 251*0a6a1f1dSLionel Sambuc! 252*0a6a1f1dSLionel Sambuc! parameter 1 address 253*0a6a1f1dSLionel Sambuc! parameter 2 length 254*0a6a1f1dSLionel Sambuc! parameter 3 destination register left 255*0a6a1f1dSLionel Sambuc! parameter 4 destination register right 256*0a6a1f1dSLionel Sambuc! parameter 5 temp 257*0a6a1f1dSLionel Sambuc! parameter 6 temp2 258*0a6a1f1dSLionel Sambuc! parameter 7 label 259*0a6a1f1dSLionel Sambuc! parameter 8 return label 260*0a6a1f1dSLionel Sambuc 261*0a6a1f1dSLionel Sambuc 262*0a6a1f1dSLionel Sambuc 263*0a6a1f1dSLionel Sambuc 264*0a6a1f1dSLionel Sambuc! store_little_endian 265*0a6a1f1dSLionel Sambuc! 266*0a6a1f1dSLionel Sambuc! parameter 1 address 267*0a6a1f1dSLionel Sambuc! parameter 2 source left 268*0a6a1f1dSLionel Sambuc! parameter 3 source right 269*0a6a1f1dSLionel Sambuc! parameter 4 temporar 270*0a6a1f1dSLionel Sambuc 271*0a6a1f1dSLionel Sambuc 272*0a6a1f1dSLionel Sambuc 273*0a6a1f1dSLionel Sambuc 274*0a6a1f1dSLionel Sambuc! store_n_bytes 275*0a6a1f1dSLionel Sambuc! 276*0a6a1f1dSLionel Sambuc! Stores 1 to 7 bytes little endian 277*0a6a1f1dSLionel Sambuc! 278*0a6a1f1dSLionel Sambuc! parameter 1 address 279*0a6a1f1dSLionel Sambuc! parameter 2 length 280*0a6a1f1dSLionel Sambuc! parameter 3 source register left 281*0a6a1f1dSLionel Sambuc! parameter 4 source register right 282*0a6a1f1dSLionel Sambuc! parameter 5 temp 283*0a6a1f1dSLionel Sambuc! parameter 6 temp2 284*0a6a1f1dSLionel Sambuc! parameter 7 label 285*0a6a1f1dSLionel Sambuc! parameter 8 return label 286*0a6a1f1dSLionel Sambuc 287*0a6a1f1dSLionel Sambuc 288*0a6a1f1dSLionel Sambuc 289*0a6a1f1dSLionel Sambuc 290*0a6a1f1dSLionel Sambuc 291*0a6a1f1dSLionel Sambuc 292*0a6a1f1dSLionel Sambuc 293*0a6a1f1dSLionel Sambuc 294*0a6a1f1dSLionel Sambuc.section ".text" 295*0a6a1f1dSLionel Sambuc 296*0a6a1f1dSLionel Sambuc .align 32 297*0a6a1f1dSLionel Sambuc 298*0a6a1f1dSLionel Sambuc.des_enc: 299*0a6a1f1dSLionel Sambuc 300*0a6a1f1dSLionel Sambuc ! key address in3 301*0a6a1f1dSLionel Sambuc ! loads key next encryption/decryption first round from [in4] 302*0a6a1f1dSLionel Sambuc 303*0a6a1f1dSLionel Sambuc 304*0a6a1f1dSLionel Sambuc 305*0a6a1f1dSLionel Sambuc! rounds_macro 306*0a6a1f1dSLionel Sambuc! in5 out5 1 .des_enc.1 in3 in4 retl 307*0a6a1f1dSLionel Sambuc 308*0a6a1f1dSLionel Sambuc xor out5, out0, local1 309*0a6a1f1dSLionel Sambuc 310*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 311*0a6a1f1dSLionel Sambuc ba .des_enc.1 312*0a6a1f1dSLionel Sambuc and local1, 252, local1 313*0a6a1f1dSLionel Sambuc 314*0a6a1f1dSLionel Sambuc .align 32 315*0a6a1f1dSLionel Sambuc 316*0a6a1f1dSLionel Sambuc.des_enc.1: 317*0a6a1f1dSLionel Sambuc ! local6 is address sbox 6 318*0a6a1f1dSLionel Sambuc ! out3 is address sbox 8 319*0a6a1f1dSLionel Sambuc ! out4 is loop counter 320*0a6a1f1dSLionel Sambuc 321*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 322*0a6a1f1dSLionel Sambuc xor out5, out1, out1 ! 8642 323*0a6a1f1dSLionel Sambuc xor out5, out0, out0 ! 7531 324*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 ! fxor used for alignment 325*0a6a1f1dSLionel Sambuc 326*0a6a1f1dSLionel Sambuc srl out1, 4, local0 ! rotate 4 right 327*0a6a1f1dSLionel Sambuc and out0, local5, local3 ! 3 328*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 329*0a6a1f1dSLionel Sambuc 330*0a6a1f1dSLionel Sambuc ld [in3+1*8], local7 ! key 7531 next round 331*0a6a1f1dSLionel Sambuc srl local3, 8, local3 ! 3 332*0a6a1f1dSLionel Sambuc and local0, 252, local2 ! 2 333*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 334*0a6a1f1dSLionel Sambuc 335*0a6a1f1dSLionel Sambuc ld [global3+local3],local3 ! 3 336*0a6a1f1dSLionel Sambuc sll out1, 28, out1 ! rotate 337*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 1 finished, local1 now sbox 7 338*0a6a1f1dSLionel Sambuc 339*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 ! 2 340*0a6a1f1dSLionel Sambuc srl out0, 24, local1 ! 7 341*0a6a1f1dSLionel Sambuc or out1, local0, out1 ! rotate 342*0a6a1f1dSLionel Sambuc 343*0a6a1f1dSLionel Sambuc ldub [out2+local1], local1 ! 7 (and 0xFC) 344*0a6a1f1dSLionel Sambuc srl out1, 24, local0 ! 8 345*0a6a1f1dSLionel Sambuc and out1, local5, local4 ! 4 346*0a6a1f1dSLionel Sambuc 347*0a6a1f1dSLionel Sambuc ldub [out2+local0], local0 ! 8 (and 0xFC) 348*0a6a1f1dSLionel Sambuc srl local4, 8, local4 ! 4 349*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 2 finished local2 now sbox 6 350*0a6a1f1dSLionel Sambuc 351*0a6a1f1dSLionel Sambuc ld [global4+local4],local4 ! 4 352*0a6a1f1dSLionel Sambuc srl out1, 16, local2 ! 6 353*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 3 finished local3 now sbox 5 354*0a6a1f1dSLionel Sambuc 355*0a6a1f1dSLionel Sambuc ld [out3+local0],local0 ! 8 356*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! 6 357*0a6a1f1dSLionel Sambuc add global1, 1536, local5 ! address sbox 7 358*0a6a1f1dSLionel Sambuc 359*0a6a1f1dSLionel Sambuc ld [local6+local2], local2 ! 6 360*0a6a1f1dSLionel Sambuc srl out0, 16, local3 ! 5 361*0a6a1f1dSLionel Sambuc xor in5, local4, in5 ! 4 finished 362*0a6a1f1dSLionel Sambuc 363*0a6a1f1dSLionel Sambuc ld [local5+local1],local1 ! 7 364*0a6a1f1dSLionel Sambuc and local3, 252, local3 ! 5 365*0a6a1f1dSLionel Sambuc xor in5, local0, in5 ! 8 finished 366*0a6a1f1dSLionel Sambuc 367*0a6a1f1dSLionel Sambuc ld [global5+local3],local3 ! 5 368*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 6 finished 369*0a6a1f1dSLionel Sambuc subcc out4, 1, out4 370*0a6a1f1dSLionel Sambuc 371*0a6a1f1dSLionel Sambuc ld [in3+1*8+4], out0 ! key 8642 next round 372*0a6a1f1dSLionel Sambuc xor in5, local7, local2 ! sbox 5 next round 373*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 7 finished 374*0a6a1f1dSLionel Sambuc 375*0a6a1f1dSLionel Sambuc srl local2, 16, local2 ! sbox 5 next round 376*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 5 finished 377*0a6a1f1dSLionel Sambuc 378*0a6a1f1dSLionel Sambuc ld [in3+1*16+4], out1 ! key 8642 next round again 379*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! sbox5 next round 380*0a6a1f1dSLionel Sambuc! next round 381*0a6a1f1dSLionel Sambuc xor in5, local7, local7 ! 7531 382*0a6a1f1dSLionel Sambuc 383*0a6a1f1dSLionel Sambuc ld [global5+local2], local2 ! 5 384*0a6a1f1dSLionel Sambuc srl local7, 24, local3 ! 7 385*0a6a1f1dSLionel Sambuc xor in5, out0, out0 ! 8642 386*0a6a1f1dSLionel Sambuc 387*0a6a1f1dSLionel Sambuc ldub [out2+local3], local3 ! 7 (and 0xFC) 388*0a6a1f1dSLionel Sambuc srl out0, 4, local0 ! rotate 4 right 389*0a6a1f1dSLionel Sambuc and local7, 252, local1 ! 1 390*0a6a1f1dSLionel Sambuc 391*0a6a1f1dSLionel Sambuc sll out0, 28, out0 ! rotate 392*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 5 finished local2 used 393*0a6a1f1dSLionel Sambuc 394*0a6a1f1dSLionel Sambuc srl local0, 8, local4 ! 4 395*0a6a1f1dSLionel Sambuc and local0, 252, local2 ! 2 396*0a6a1f1dSLionel Sambuc ld [local5+local3], local3 ! 7 397*0a6a1f1dSLionel Sambuc 398*0a6a1f1dSLionel Sambuc srl local0, 16, local5 ! 6 399*0a6a1f1dSLionel Sambuc or out0, local0, out0 ! rotate 400*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 ! 2 401*0a6a1f1dSLionel Sambuc 402*0a6a1f1dSLionel Sambuc srl out0, 24, local0 403*0a6a1f1dSLionel Sambuc ld [in3+1*16], out0 ! key 7531 next round 404*0a6a1f1dSLionel Sambuc and local4, 252, local4 ! 4 405*0a6a1f1dSLionel Sambuc 406*0a6a1f1dSLionel Sambuc and local5, 252, local5 ! 6 407*0a6a1f1dSLionel Sambuc ld [global4+local4], local4 ! 4 408*0a6a1f1dSLionel Sambuc xor out5, local3, out5 ! 7 finished local3 used 409*0a6a1f1dSLionel Sambuc 410*0a6a1f1dSLionel Sambuc and local0, 252, local0 ! 8 411*0a6a1f1dSLionel Sambuc ld [local6+local5], local5 ! 6 412*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 2 finished local2 now sbox 3 413*0a6a1f1dSLionel Sambuc 414*0a6a1f1dSLionel Sambuc srl local7, 8, local2 ! 3 start 415*0a6a1f1dSLionel Sambuc ld [out3+local0], local0 ! 8 416*0a6a1f1dSLionel Sambuc xor out5, local4, out5 ! 4 finished 417*0a6a1f1dSLionel Sambuc 418*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! 3 419*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 ! 1 420*0a6a1f1dSLionel Sambuc xor out5, local5, out5 ! 6 finished local5 used 421*0a6a1f1dSLionel Sambuc 422*0a6a1f1dSLionel Sambuc ld [global3+local2], local2 ! 3 423*0a6a1f1dSLionel Sambuc xor out5, local0, out5 ! 8 finished 424*0a6a1f1dSLionel Sambuc add in3, 1*16, in3 ! enc add 8, dec add -8 to key pointer 425*0a6a1f1dSLionel Sambuc 426*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 427*0a6a1f1dSLionel Sambuc xor out5, out0, local4 ! sbox 1 next round 428*0a6a1f1dSLionel Sambuc xor out5, local1, out5 ! 1 finished 429*0a6a1f1dSLionel Sambuc 430*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 3 finished 431*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 432*0a6a1f1dSLionel Sambuc bne,pt %icc, .des_enc.1 433*0a6a1f1dSLionel Sambuc#else 434*0a6a1f1dSLionel Sambuc bne .des_enc.1 435*0a6a1f1dSLionel Sambuc#endif 436*0a6a1f1dSLionel Sambuc and local4, 252, local1 ! sbox 1 next round 437*0a6a1f1dSLionel Sambuc 438*0a6a1f1dSLionel Sambuc! two rounds more: 439*0a6a1f1dSLionel Sambuc 440*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 441*0a6a1f1dSLionel Sambuc xor out5, out1, out1 442*0a6a1f1dSLionel Sambuc xor out5, out0, out0 443*0a6a1f1dSLionel Sambuc 444*0a6a1f1dSLionel Sambuc srl out1, 4, local0 ! rotate 445*0a6a1f1dSLionel Sambuc and out0, local5, local3 446*0a6a1f1dSLionel Sambuc 447*0a6a1f1dSLionel Sambuc ld [in3+1*8], local7 ! key 7531 448*0a6a1f1dSLionel Sambuc srl local3, 8, local3 449*0a6a1f1dSLionel Sambuc and local0, 252, local2 450*0a6a1f1dSLionel Sambuc 451*0a6a1f1dSLionel Sambuc ld [global3+local3],local3 452*0a6a1f1dSLionel Sambuc sll out1, 28, out1 ! rotate 453*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 1 finished, local1 now sbox 7 454*0a6a1f1dSLionel Sambuc 455*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 456*0a6a1f1dSLionel Sambuc srl out0, 24, local1 457*0a6a1f1dSLionel Sambuc or out1, local0, out1 ! rotate 458*0a6a1f1dSLionel Sambuc 459*0a6a1f1dSLionel Sambuc ldub [out2+local1], local1 460*0a6a1f1dSLionel Sambuc srl out1, 24, local0 461*0a6a1f1dSLionel Sambuc and out1, local5, local4 462*0a6a1f1dSLionel Sambuc 463*0a6a1f1dSLionel Sambuc ldub [out2+local0], local0 464*0a6a1f1dSLionel Sambuc srl local4, 8, local4 465*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 2 finished local2 now sbox 6 466*0a6a1f1dSLionel Sambuc 467*0a6a1f1dSLionel Sambuc ld [global4+local4],local4 468*0a6a1f1dSLionel Sambuc srl out1, 16, local2 469*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 3 finished local3 now sbox 5 470*0a6a1f1dSLionel Sambuc 471*0a6a1f1dSLionel Sambuc ld [out3+local0],local0 472*0a6a1f1dSLionel Sambuc and local2, 252, local2 473*0a6a1f1dSLionel Sambuc add global1, 1536, local5 ! address sbox 7 474*0a6a1f1dSLionel Sambuc 475*0a6a1f1dSLionel Sambuc ld [local6+local2], local2 476*0a6a1f1dSLionel Sambuc srl out0, 16, local3 477*0a6a1f1dSLionel Sambuc xor in5, local4, in5 ! 4 finished 478*0a6a1f1dSLionel Sambuc 479*0a6a1f1dSLionel Sambuc ld [local5+local1],local1 480*0a6a1f1dSLionel Sambuc and local3, 252, local3 481*0a6a1f1dSLionel Sambuc xor in5, local0, in5 482*0a6a1f1dSLionel Sambuc 483*0a6a1f1dSLionel Sambuc ld [global5+local3],local3 484*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 6 finished 485*0a6a1f1dSLionel Sambuc cmp in2, 8 486*0a6a1f1dSLionel Sambuc 487*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 488*0a6a1f1dSLionel Sambuc xor in5, local7, local2 ! sbox 5 next round 489*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 7 finished 490*0a6a1f1dSLionel Sambuc 491*0a6a1f1dSLionel Sambuc ld [in3+1*8+4], out0 492*0a6a1f1dSLionel Sambuc srl local2, 16, local2 ! sbox 5 next round 493*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 5 finished 494*0a6a1f1dSLionel Sambuc 495*0a6a1f1dSLionel Sambuc and local2, 252, local2 496*0a6a1f1dSLionel Sambuc! next round (two rounds more) 497*0a6a1f1dSLionel Sambuc xor in5, local7, local7 ! 7531 498*0a6a1f1dSLionel Sambuc 499*0a6a1f1dSLionel Sambuc ld [global5+local2], local2 500*0a6a1f1dSLionel Sambuc srl local7, 24, local3 501*0a6a1f1dSLionel Sambuc xor in5, out0, out0 ! 8642 502*0a6a1f1dSLionel Sambuc 503*0a6a1f1dSLionel Sambuc ldub [out2+local3], local3 504*0a6a1f1dSLionel Sambuc srl out0, 4, local0 ! rotate 505*0a6a1f1dSLionel Sambuc and local7, 252, local1 506*0a6a1f1dSLionel Sambuc 507*0a6a1f1dSLionel Sambuc sll out0, 28, out0 ! rotate 508*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 5 finished local2 used 509*0a6a1f1dSLionel Sambuc 510*0a6a1f1dSLionel Sambuc srl local0, 8, local4 511*0a6a1f1dSLionel Sambuc and local0, 252, local2 512*0a6a1f1dSLionel Sambuc ld [local5+local3], local3 513*0a6a1f1dSLionel Sambuc 514*0a6a1f1dSLionel Sambuc srl local0, 16, local5 515*0a6a1f1dSLionel Sambuc or out0, local0, out0 ! rotate 516*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 517*0a6a1f1dSLionel Sambuc 518*0a6a1f1dSLionel Sambuc srl out0, 24, local0 519*0a6a1f1dSLionel Sambuc ld [in4], out0 ! key next encryption/decryption 520*0a6a1f1dSLionel Sambuc and local4, 252, local4 521*0a6a1f1dSLionel Sambuc 522*0a6a1f1dSLionel Sambuc and local5, 252, local5 523*0a6a1f1dSLionel Sambuc ld [global4+local4], local4 524*0a6a1f1dSLionel Sambuc xor out5, local3, out5 ! 7 finished local3 used 525*0a6a1f1dSLionel Sambuc 526*0a6a1f1dSLionel Sambuc and local0, 252, local0 527*0a6a1f1dSLionel Sambuc ld [local6+local5], local5 528*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 2 finished local2 now sbox 3 529*0a6a1f1dSLionel Sambuc 530*0a6a1f1dSLionel Sambuc srl local7, 8, local2 ! 3 start 531*0a6a1f1dSLionel Sambuc ld [out3+local0], local0 532*0a6a1f1dSLionel Sambuc xor out5, local4, out5 533*0a6a1f1dSLionel Sambuc 534*0a6a1f1dSLionel Sambuc and local2, 252, local2 535*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 536*0a6a1f1dSLionel Sambuc xor out5, local5, out5 ! 6 finished local5 used 537*0a6a1f1dSLionel Sambuc 538*0a6a1f1dSLionel Sambuc ld [global3+local2], local2 539*0a6a1f1dSLionel Sambuc srl in5, 3, local3 540*0a6a1f1dSLionel Sambuc xor out5, local0, out5 541*0a6a1f1dSLionel Sambuc 542*0a6a1f1dSLionel Sambuc ld [in4+4], out1 ! key next encryption/decryption 543*0a6a1f1dSLionel Sambuc sll in5, 29, local4 544*0a6a1f1dSLionel Sambuc xor out5, local1, out5 545*0a6a1f1dSLionel Sambuc 546*0a6a1f1dSLionel Sambuc retl 547*0a6a1f1dSLionel Sambuc xor out5, local2, out5 548*0a6a1f1dSLionel Sambuc 549*0a6a1f1dSLionel Sambuc 550*0a6a1f1dSLionel Sambuc 551*0a6a1f1dSLionel Sambuc .align 32 552*0a6a1f1dSLionel Sambuc 553*0a6a1f1dSLionel Sambuc.des_dec: 554*0a6a1f1dSLionel Sambuc 555*0a6a1f1dSLionel Sambuc ! implemented with out5 as first parameter to avoid 556*0a6a1f1dSLionel Sambuc ! register exchange in ede modes 557*0a6a1f1dSLionel Sambuc 558*0a6a1f1dSLionel Sambuc ! key address in4 559*0a6a1f1dSLionel Sambuc ! loads key next encryption/decryption first round from [in3] 560*0a6a1f1dSLionel Sambuc 561*0a6a1f1dSLionel Sambuc 562*0a6a1f1dSLionel Sambuc 563*0a6a1f1dSLionel Sambuc! rounds_macro 564*0a6a1f1dSLionel Sambuc! out5 in5 -1 .des_dec.1 in4 in3 retl 565*0a6a1f1dSLionel Sambuc 566*0a6a1f1dSLionel Sambuc xor in5, out0, local1 567*0a6a1f1dSLionel Sambuc 568*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 569*0a6a1f1dSLionel Sambuc ba .des_dec.1 570*0a6a1f1dSLionel Sambuc and local1, 252, local1 571*0a6a1f1dSLionel Sambuc 572*0a6a1f1dSLionel Sambuc .align 32 573*0a6a1f1dSLionel Sambuc 574*0a6a1f1dSLionel Sambuc.des_dec.1: 575*0a6a1f1dSLionel Sambuc ! local6 is address sbox 6 576*0a6a1f1dSLionel Sambuc ! out3 is address sbox 8 577*0a6a1f1dSLionel Sambuc ! out4 is loop counter 578*0a6a1f1dSLionel Sambuc 579*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 580*0a6a1f1dSLionel Sambuc xor in5, out1, out1 ! 8642 581*0a6a1f1dSLionel Sambuc xor in5, out0, out0 ! 7531 582*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 ! fxor used for alignment 583*0a6a1f1dSLionel Sambuc 584*0a6a1f1dSLionel Sambuc srl out1, 4, local0 ! rotate 4 right 585*0a6a1f1dSLionel Sambuc and out0, local5, local3 ! 3 586*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 587*0a6a1f1dSLionel Sambuc 588*0a6a1f1dSLionel Sambuc ld [in4+-1*8], local7 ! key 7531 next round 589*0a6a1f1dSLionel Sambuc srl local3, 8, local3 ! 3 590*0a6a1f1dSLionel Sambuc and local0, 252, local2 ! 2 591*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 592*0a6a1f1dSLionel Sambuc 593*0a6a1f1dSLionel Sambuc ld [global3+local3],local3 ! 3 594*0a6a1f1dSLionel Sambuc sll out1, 28, out1 ! rotate 595*0a6a1f1dSLionel Sambuc xor out5, local1, out5 ! 1 finished, local1 now sbox 7 596*0a6a1f1dSLionel Sambuc 597*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 ! 2 598*0a6a1f1dSLionel Sambuc srl out0, 24, local1 ! 7 599*0a6a1f1dSLionel Sambuc or out1, local0, out1 ! rotate 600*0a6a1f1dSLionel Sambuc 601*0a6a1f1dSLionel Sambuc ldub [out2+local1], local1 ! 7 (and 0xFC) 602*0a6a1f1dSLionel Sambuc srl out1, 24, local0 ! 8 603*0a6a1f1dSLionel Sambuc and out1, local5, local4 ! 4 604*0a6a1f1dSLionel Sambuc 605*0a6a1f1dSLionel Sambuc ldub [out2+local0], local0 ! 8 (and 0xFC) 606*0a6a1f1dSLionel Sambuc srl local4, 8, local4 ! 4 607*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 2 finished local2 now sbox 6 608*0a6a1f1dSLionel Sambuc 609*0a6a1f1dSLionel Sambuc ld [global4+local4],local4 ! 4 610*0a6a1f1dSLionel Sambuc srl out1, 16, local2 ! 6 611*0a6a1f1dSLionel Sambuc xor out5, local3, out5 ! 3 finished local3 now sbox 5 612*0a6a1f1dSLionel Sambuc 613*0a6a1f1dSLionel Sambuc ld [out3+local0],local0 ! 8 614*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! 6 615*0a6a1f1dSLionel Sambuc add global1, 1536, local5 ! address sbox 7 616*0a6a1f1dSLionel Sambuc 617*0a6a1f1dSLionel Sambuc ld [local6+local2], local2 ! 6 618*0a6a1f1dSLionel Sambuc srl out0, 16, local3 ! 5 619*0a6a1f1dSLionel Sambuc xor out5, local4, out5 ! 4 finished 620*0a6a1f1dSLionel Sambuc 621*0a6a1f1dSLionel Sambuc ld [local5+local1],local1 ! 7 622*0a6a1f1dSLionel Sambuc and local3, 252, local3 ! 5 623*0a6a1f1dSLionel Sambuc xor out5, local0, out5 ! 8 finished 624*0a6a1f1dSLionel Sambuc 625*0a6a1f1dSLionel Sambuc ld [global5+local3],local3 ! 5 626*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 6 finished 627*0a6a1f1dSLionel Sambuc subcc out4, 1, out4 628*0a6a1f1dSLionel Sambuc 629*0a6a1f1dSLionel Sambuc ld [in4+-1*8+4], out0 ! key 8642 next round 630*0a6a1f1dSLionel Sambuc xor out5, local7, local2 ! sbox 5 next round 631*0a6a1f1dSLionel Sambuc xor out5, local1, out5 ! 7 finished 632*0a6a1f1dSLionel Sambuc 633*0a6a1f1dSLionel Sambuc srl local2, 16, local2 ! sbox 5 next round 634*0a6a1f1dSLionel Sambuc xor out5, local3, out5 ! 5 finished 635*0a6a1f1dSLionel Sambuc 636*0a6a1f1dSLionel Sambuc ld [in4+-1*16+4], out1 ! key 8642 next round again 637*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! sbox5 next round 638*0a6a1f1dSLionel Sambuc! next round 639*0a6a1f1dSLionel Sambuc xor out5, local7, local7 ! 7531 640*0a6a1f1dSLionel Sambuc 641*0a6a1f1dSLionel Sambuc ld [global5+local2], local2 ! 5 642*0a6a1f1dSLionel Sambuc srl local7, 24, local3 ! 7 643*0a6a1f1dSLionel Sambuc xor out5, out0, out0 ! 8642 644*0a6a1f1dSLionel Sambuc 645*0a6a1f1dSLionel Sambuc ldub [out2+local3], local3 ! 7 (and 0xFC) 646*0a6a1f1dSLionel Sambuc srl out0, 4, local0 ! rotate 4 right 647*0a6a1f1dSLionel Sambuc and local7, 252, local1 ! 1 648*0a6a1f1dSLionel Sambuc 649*0a6a1f1dSLionel Sambuc sll out0, 28, out0 ! rotate 650*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 5 finished local2 used 651*0a6a1f1dSLionel Sambuc 652*0a6a1f1dSLionel Sambuc srl local0, 8, local4 ! 4 653*0a6a1f1dSLionel Sambuc and local0, 252, local2 ! 2 654*0a6a1f1dSLionel Sambuc ld [local5+local3], local3 ! 7 655*0a6a1f1dSLionel Sambuc 656*0a6a1f1dSLionel Sambuc srl local0, 16, local5 ! 6 657*0a6a1f1dSLionel Sambuc or out0, local0, out0 ! rotate 658*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 ! 2 659*0a6a1f1dSLionel Sambuc 660*0a6a1f1dSLionel Sambuc srl out0, 24, local0 661*0a6a1f1dSLionel Sambuc ld [in4+-1*16], out0 ! key 7531 next round 662*0a6a1f1dSLionel Sambuc and local4, 252, local4 ! 4 663*0a6a1f1dSLionel Sambuc 664*0a6a1f1dSLionel Sambuc and local5, 252, local5 ! 6 665*0a6a1f1dSLionel Sambuc ld [global4+local4], local4 ! 4 666*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 7 finished local3 used 667*0a6a1f1dSLionel Sambuc 668*0a6a1f1dSLionel Sambuc and local0, 252, local0 ! 8 669*0a6a1f1dSLionel Sambuc ld [local6+local5], local5 ! 6 670*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 2 finished local2 now sbox 3 671*0a6a1f1dSLionel Sambuc 672*0a6a1f1dSLionel Sambuc srl local7, 8, local2 ! 3 start 673*0a6a1f1dSLionel Sambuc ld [out3+local0], local0 ! 8 674*0a6a1f1dSLionel Sambuc xor in5, local4, in5 ! 4 finished 675*0a6a1f1dSLionel Sambuc 676*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! 3 677*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 ! 1 678*0a6a1f1dSLionel Sambuc xor in5, local5, in5 ! 6 finished local5 used 679*0a6a1f1dSLionel Sambuc 680*0a6a1f1dSLionel Sambuc ld [global3+local2], local2 ! 3 681*0a6a1f1dSLionel Sambuc xor in5, local0, in5 ! 8 finished 682*0a6a1f1dSLionel Sambuc add in4, -1*16, in4 ! enc add 8, dec add -8 to key pointer 683*0a6a1f1dSLionel Sambuc 684*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 685*0a6a1f1dSLionel Sambuc xor in5, out0, local4 ! sbox 1 next round 686*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 1 finished 687*0a6a1f1dSLionel Sambuc 688*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 3 finished 689*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 690*0a6a1f1dSLionel Sambuc bne,pt %icc, .des_dec.1 691*0a6a1f1dSLionel Sambuc#else 692*0a6a1f1dSLionel Sambuc bne .des_dec.1 693*0a6a1f1dSLionel Sambuc#endif 694*0a6a1f1dSLionel Sambuc and local4, 252, local1 ! sbox 1 next round 695*0a6a1f1dSLionel Sambuc 696*0a6a1f1dSLionel Sambuc! two rounds more: 697*0a6a1f1dSLionel Sambuc 698*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 699*0a6a1f1dSLionel Sambuc xor in5, out1, out1 700*0a6a1f1dSLionel Sambuc xor in5, out0, out0 701*0a6a1f1dSLionel Sambuc 702*0a6a1f1dSLionel Sambuc srl out1, 4, local0 ! rotate 703*0a6a1f1dSLionel Sambuc and out0, local5, local3 704*0a6a1f1dSLionel Sambuc 705*0a6a1f1dSLionel Sambuc ld [in4+-1*8], local7 ! key 7531 706*0a6a1f1dSLionel Sambuc srl local3, 8, local3 707*0a6a1f1dSLionel Sambuc and local0, 252, local2 708*0a6a1f1dSLionel Sambuc 709*0a6a1f1dSLionel Sambuc ld [global3+local3],local3 710*0a6a1f1dSLionel Sambuc sll out1, 28, out1 ! rotate 711*0a6a1f1dSLionel Sambuc xor out5, local1, out5 ! 1 finished, local1 now sbox 7 712*0a6a1f1dSLionel Sambuc 713*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 714*0a6a1f1dSLionel Sambuc srl out0, 24, local1 715*0a6a1f1dSLionel Sambuc or out1, local0, out1 ! rotate 716*0a6a1f1dSLionel Sambuc 717*0a6a1f1dSLionel Sambuc ldub [out2+local1], local1 718*0a6a1f1dSLionel Sambuc srl out1, 24, local0 719*0a6a1f1dSLionel Sambuc and out1, local5, local4 720*0a6a1f1dSLionel Sambuc 721*0a6a1f1dSLionel Sambuc ldub [out2+local0], local0 722*0a6a1f1dSLionel Sambuc srl local4, 8, local4 723*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 2 finished local2 now sbox 6 724*0a6a1f1dSLionel Sambuc 725*0a6a1f1dSLionel Sambuc ld [global4+local4],local4 726*0a6a1f1dSLionel Sambuc srl out1, 16, local2 727*0a6a1f1dSLionel Sambuc xor out5, local3, out5 ! 3 finished local3 now sbox 5 728*0a6a1f1dSLionel Sambuc 729*0a6a1f1dSLionel Sambuc ld [out3+local0],local0 730*0a6a1f1dSLionel Sambuc and local2, 252, local2 731*0a6a1f1dSLionel Sambuc add global1, 1536, local5 ! address sbox 7 732*0a6a1f1dSLionel Sambuc 733*0a6a1f1dSLionel Sambuc ld [local6+local2], local2 734*0a6a1f1dSLionel Sambuc srl out0, 16, local3 735*0a6a1f1dSLionel Sambuc xor out5, local4, out5 ! 4 finished 736*0a6a1f1dSLionel Sambuc 737*0a6a1f1dSLionel Sambuc ld [local5+local1],local1 738*0a6a1f1dSLionel Sambuc and local3, 252, local3 739*0a6a1f1dSLionel Sambuc xor out5, local0, out5 740*0a6a1f1dSLionel Sambuc 741*0a6a1f1dSLionel Sambuc ld [global5+local3],local3 742*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 6 finished 743*0a6a1f1dSLionel Sambuc cmp in2, 8 744*0a6a1f1dSLionel Sambuc 745*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 746*0a6a1f1dSLionel Sambuc xor out5, local7, local2 ! sbox 5 next round 747*0a6a1f1dSLionel Sambuc xor out5, local1, out5 ! 7 finished 748*0a6a1f1dSLionel Sambuc 749*0a6a1f1dSLionel Sambuc ld [in4+-1*8+4], out0 750*0a6a1f1dSLionel Sambuc srl local2, 16, local2 ! sbox 5 next round 751*0a6a1f1dSLionel Sambuc xor out5, local3, out5 ! 5 finished 752*0a6a1f1dSLionel Sambuc 753*0a6a1f1dSLionel Sambuc and local2, 252, local2 754*0a6a1f1dSLionel Sambuc! next round (two rounds more) 755*0a6a1f1dSLionel Sambuc xor out5, local7, local7 ! 7531 756*0a6a1f1dSLionel Sambuc 757*0a6a1f1dSLionel Sambuc ld [global5+local2], local2 758*0a6a1f1dSLionel Sambuc srl local7, 24, local3 759*0a6a1f1dSLionel Sambuc xor out5, out0, out0 ! 8642 760*0a6a1f1dSLionel Sambuc 761*0a6a1f1dSLionel Sambuc ldub [out2+local3], local3 762*0a6a1f1dSLionel Sambuc srl out0, 4, local0 ! rotate 763*0a6a1f1dSLionel Sambuc and local7, 252, local1 764*0a6a1f1dSLionel Sambuc 765*0a6a1f1dSLionel Sambuc sll out0, 28, out0 ! rotate 766*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 5 finished local2 used 767*0a6a1f1dSLionel Sambuc 768*0a6a1f1dSLionel Sambuc srl local0, 8, local4 769*0a6a1f1dSLionel Sambuc and local0, 252, local2 770*0a6a1f1dSLionel Sambuc ld [local5+local3], local3 771*0a6a1f1dSLionel Sambuc 772*0a6a1f1dSLionel Sambuc srl local0, 16, local5 773*0a6a1f1dSLionel Sambuc or out0, local0, out0 ! rotate 774*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 775*0a6a1f1dSLionel Sambuc 776*0a6a1f1dSLionel Sambuc srl out0, 24, local0 777*0a6a1f1dSLionel Sambuc ld [in3], out0 ! key next encryption/decryption 778*0a6a1f1dSLionel Sambuc and local4, 252, local4 779*0a6a1f1dSLionel Sambuc 780*0a6a1f1dSLionel Sambuc and local5, 252, local5 781*0a6a1f1dSLionel Sambuc ld [global4+local4], local4 782*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 7 finished local3 used 783*0a6a1f1dSLionel Sambuc 784*0a6a1f1dSLionel Sambuc and local0, 252, local0 785*0a6a1f1dSLionel Sambuc ld [local6+local5], local5 786*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 2 finished local2 now sbox 3 787*0a6a1f1dSLionel Sambuc 788*0a6a1f1dSLionel Sambuc srl local7, 8, local2 ! 3 start 789*0a6a1f1dSLionel Sambuc ld [out3+local0], local0 790*0a6a1f1dSLionel Sambuc xor in5, local4, in5 791*0a6a1f1dSLionel Sambuc 792*0a6a1f1dSLionel Sambuc and local2, 252, local2 793*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 794*0a6a1f1dSLionel Sambuc xor in5, local5, in5 ! 6 finished local5 used 795*0a6a1f1dSLionel Sambuc 796*0a6a1f1dSLionel Sambuc ld [global3+local2], local2 797*0a6a1f1dSLionel Sambuc srl out5, 3, local3 798*0a6a1f1dSLionel Sambuc xor in5, local0, in5 799*0a6a1f1dSLionel Sambuc 800*0a6a1f1dSLionel Sambuc ld [in3+4], out1 ! key next encryption/decryption 801*0a6a1f1dSLionel Sambuc sll out5, 29, local4 802*0a6a1f1dSLionel Sambuc xor in5, local1, in5 803*0a6a1f1dSLionel Sambuc 804*0a6a1f1dSLionel Sambuc retl 805*0a6a1f1dSLionel Sambuc xor in5, local2, in5 806*0a6a1f1dSLionel Sambuc 807*0a6a1f1dSLionel Sambuc 808*0a6a1f1dSLionel Sambuc 809*0a6a1f1dSLionel Sambuc 810*0a6a1f1dSLionel Sambuc! void DES_encrypt1(data, ks, enc) 811*0a6a1f1dSLionel Sambuc! ******************************* 812*0a6a1f1dSLionel Sambuc 813*0a6a1f1dSLionel Sambuc .align 32 814*0a6a1f1dSLionel Sambuc .global DES_encrypt1 815*0a6a1f1dSLionel Sambuc .type DES_encrypt1,#function 816*0a6a1f1dSLionel Sambuc 817*0a6a1f1dSLionel SambucDES_encrypt1: 818*0a6a1f1dSLionel Sambuc 819*0a6a1f1dSLionel Sambuc save %sp, FRAME, %sp 820*0a6a1f1dSLionel Sambuc 821*0a6a1f1dSLionel Sambuc sethi %hi(_PIC_DES_SPtrans-1f),global1 822*0a6a1f1dSLionel Sambuc or global1,%lo(_PIC_DES_SPtrans-1f),global1 823*0a6a1f1dSLionel Sambuc1: call .+8 824*0a6a1f1dSLionel Sambuc add %o7,global1,global1 825*0a6a1f1dSLionel Sambuc sub global1,_PIC_DES_SPtrans-.des_and,out2 826*0a6a1f1dSLionel Sambuc 827*0a6a1f1dSLionel Sambuc ld [in0], in5 ! left 828*0a6a1f1dSLionel Sambuc cmp in2, 0 ! enc 829*0a6a1f1dSLionel Sambuc 830*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 831*0a6a1f1dSLionel Sambuc be,pn %icc, .encrypt.dec ! enc/dec 832*0a6a1f1dSLionel Sambuc#else 833*0a6a1f1dSLionel Sambuc be .encrypt.dec 834*0a6a1f1dSLionel Sambuc#endif 835*0a6a1f1dSLionel Sambuc ld [in0+4], out5 ! right 836*0a6a1f1dSLionel Sambuc 837*0a6a1f1dSLionel Sambuc ! parameter 6 1/2 for include encryption/decryption 838*0a6a1f1dSLionel Sambuc ! parameter 7 1 for move in1 to in3 839*0a6a1f1dSLionel Sambuc ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 840*0a6a1f1dSLionel Sambuc 841*0a6a1f1dSLionel Sambuc 842*0a6a1f1dSLionel Sambuc 843*0a6a1f1dSLionel Sambuc! ip_macro 844*0a6a1f1dSLionel Sambuc! in5 out5 out5 in5 in3 0 1 1 845*0a6a1f1dSLionel Sambuc 846*0a6a1f1dSLionel Sambuc ld [out2+256], local1 847*0a6a1f1dSLionel Sambuc srl out5, 4, local4 848*0a6a1f1dSLionel Sambuc 849*0a6a1f1dSLionel Sambuc xor local4, in5, local4 850*0a6a1f1dSLionel Sambuc mov in1, in3 851*0a6a1f1dSLionel Sambuc 852*0a6a1f1dSLionel Sambuc ld [out2+260], local2 853*0a6a1f1dSLionel Sambuc and local4, local1, local4 854*0a6a1f1dSLionel Sambuc mov in3, in4 855*0a6a1f1dSLionel Sambuc 856*0a6a1f1dSLionel Sambuc 857*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 858*0a6a1f1dSLionel Sambuc sll local4, 4, local1 859*0a6a1f1dSLionel Sambuc xor in5, local4, in5 860*0a6a1f1dSLionel Sambuc 861*0a6a1f1dSLionel Sambuc ld [out2+264], local3 862*0a6a1f1dSLionel Sambuc srl in5, 16, local4 863*0a6a1f1dSLionel Sambuc xor out5, local1, out5 864*0a6a1f1dSLionel Sambuc 865*0a6a1f1dSLionel Sambuc 866*0a6a1f1dSLionel Sambuc xor local4, out5, local4 867*0a6a1f1dSLionel Sambuc nop !sethi %hi(DES_SPtrans), global1 ! sbox addr 868*0a6a1f1dSLionel Sambuc 869*0a6a1f1dSLionel Sambuc 870*0a6a1f1dSLionel Sambuc and local4, local2, local4 871*0a6a1f1dSLionel Sambuc nop !or global1, %lo(DES_SPtrans), global1 ! sbox addr 872*0a6a1f1dSLionel Sambuc 873*0a6a1f1dSLionel Sambuc sll local4, 16, local1 874*0a6a1f1dSLionel Sambuc xor out5, local4, out5 875*0a6a1f1dSLionel Sambuc 876*0a6a1f1dSLionel Sambuc srl out5, 2, local4 877*0a6a1f1dSLionel Sambuc xor in5, local1, in5 878*0a6a1f1dSLionel Sambuc 879*0a6a1f1dSLionel Sambuc sethi %hi(16711680), local5 880*0a6a1f1dSLionel Sambuc xor local4, in5, local4 881*0a6a1f1dSLionel Sambuc 882*0a6a1f1dSLionel Sambuc and local4, local3, local4 883*0a6a1f1dSLionel Sambuc or local5, 255, local5 884*0a6a1f1dSLionel Sambuc 885*0a6a1f1dSLionel Sambuc sll local4, 2, local2 886*0a6a1f1dSLionel Sambuc xor in5, local4, in5 887*0a6a1f1dSLionel Sambuc 888*0a6a1f1dSLionel Sambuc srl in5, 8, local4 889*0a6a1f1dSLionel Sambuc xor out5, local2, out5 890*0a6a1f1dSLionel Sambuc 891*0a6a1f1dSLionel Sambuc xor local4, out5, local4 892*0a6a1f1dSLionel Sambuc add global1, 768, global4 893*0a6a1f1dSLionel Sambuc 894*0a6a1f1dSLionel Sambuc and local4, local5, local4 895*0a6a1f1dSLionel Sambuc add global1, 1024, global5 896*0a6a1f1dSLionel Sambuc 897*0a6a1f1dSLionel Sambuc ld [out2+272], local7 898*0a6a1f1dSLionel Sambuc sll local4, 8, local1 899*0a6a1f1dSLionel Sambuc xor out5, local4, out5 900*0a6a1f1dSLionel Sambuc 901*0a6a1f1dSLionel Sambuc srl out5, 1, local4 902*0a6a1f1dSLionel Sambuc xor in5, local1, in5 903*0a6a1f1dSLionel Sambuc 904*0a6a1f1dSLionel Sambuc ld [in3], out0 ! key 7531 905*0a6a1f1dSLionel Sambuc xor local4, in5, local4 906*0a6a1f1dSLionel Sambuc add global1, 256, global2 907*0a6a1f1dSLionel Sambuc 908*0a6a1f1dSLionel Sambuc ld [in3+4], out1 ! key 8642 909*0a6a1f1dSLionel Sambuc and local4, local7, local4 910*0a6a1f1dSLionel Sambuc add global1, 512, global3 911*0a6a1f1dSLionel Sambuc 912*0a6a1f1dSLionel Sambuc sll local4, 1, local1 913*0a6a1f1dSLionel Sambuc xor in5, local4, in5 914*0a6a1f1dSLionel Sambuc 915*0a6a1f1dSLionel Sambuc sll in5, 3, local3 916*0a6a1f1dSLionel Sambuc xor out5, local1, out5 917*0a6a1f1dSLionel Sambuc 918*0a6a1f1dSLionel Sambuc sll out5, 3, local2 919*0a6a1f1dSLionel Sambuc add global1, 1280, local6 ! address sbox 8 920*0a6a1f1dSLionel Sambuc 921*0a6a1f1dSLionel Sambuc srl in5, 29, local4 922*0a6a1f1dSLionel Sambuc add global1, 1792, out3 ! address sbox 8 923*0a6a1f1dSLionel Sambuc 924*0a6a1f1dSLionel Sambuc srl out5, 29, local1 925*0a6a1f1dSLionel Sambuc or local4, local3, out5 926*0a6a1f1dSLionel Sambuc 927*0a6a1f1dSLionel Sambuc or local2, local1, in5 928*0a6a1f1dSLionel Sambuc 929*0a6a1f1dSLionel Sambuc 930*0a6a1f1dSLionel Sambuc 931*0a6a1f1dSLionel Sambuc 932*0a6a1f1dSLionel Sambuc 933*0a6a1f1dSLionel Sambuc 934*0a6a1f1dSLionel Sambuc 935*0a6a1f1dSLionel Sambuc 936*0a6a1f1dSLionel Sambuc! rounds_macro 937*0a6a1f1dSLionel Sambuc! in5 out5 1 .des_encrypt1.1 in3 in4 938*0a6a1f1dSLionel Sambuc 939*0a6a1f1dSLionel Sambuc xor out5, out0, local1 940*0a6a1f1dSLionel Sambuc 941*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 942*0a6a1f1dSLionel Sambuc ba .des_encrypt1.1 943*0a6a1f1dSLionel Sambuc and local1, 252, local1 944*0a6a1f1dSLionel Sambuc 945*0a6a1f1dSLionel Sambuc .align 32 946*0a6a1f1dSLionel Sambuc 947*0a6a1f1dSLionel Sambuc.des_encrypt1.1: 948*0a6a1f1dSLionel Sambuc ! local6 is address sbox 6 949*0a6a1f1dSLionel Sambuc ! out3 is address sbox 8 950*0a6a1f1dSLionel Sambuc ! out4 is loop counter 951*0a6a1f1dSLionel Sambuc 952*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 953*0a6a1f1dSLionel Sambuc xor out5, out1, out1 ! 8642 954*0a6a1f1dSLionel Sambuc xor out5, out0, out0 ! 7531 955*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 ! fxor used for alignment 956*0a6a1f1dSLionel Sambuc 957*0a6a1f1dSLionel Sambuc srl out1, 4, local0 ! rotate 4 right 958*0a6a1f1dSLionel Sambuc and out0, local5, local3 ! 3 959*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 960*0a6a1f1dSLionel Sambuc 961*0a6a1f1dSLionel Sambuc ld [in3+1*8], local7 ! key 7531 next round 962*0a6a1f1dSLionel Sambuc srl local3, 8, local3 ! 3 963*0a6a1f1dSLionel Sambuc and local0, 252, local2 ! 2 964*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 965*0a6a1f1dSLionel Sambuc 966*0a6a1f1dSLionel Sambuc ld [global3+local3],local3 ! 3 967*0a6a1f1dSLionel Sambuc sll out1, 28, out1 ! rotate 968*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 1 finished, local1 now sbox 7 969*0a6a1f1dSLionel Sambuc 970*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 ! 2 971*0a6a1f1dSLionel Sambuc srl out0, 24, local1 ! 7 972*0a6a1f1dSLionel Sambuc or out1, local0, out1 ! rotate 973*0a6a1f1dSLionel Sambuc 974*0a6a1f1dSLionel Sambuc ldub [out2+local1], local1 ! 7 (and 0xFC) 975*0a6a1f1dSLionel Sambuc srl out1, 24, local0 ! 8 976*0a6a1f1dSLionel Sambuc and out1, local5, local4 ! 4 977*0a6a1f1dSLionel Sambuc 978*0a6a1f1dSLionel Sambuc ldub [out2+local0], local0 ! 8 (and 0xFC) 979*0a6a1f1dSLionel Sambuc srl local4, 8, local4 ! 4 980*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 2 finished local2 now sbox 6 981*0a6a1f1dSLionel Sambuc 982*0a6a1f1dSLionel Sambuc ld [global4+local4],local4 ! 4 983*0a6a1f1dSLionel Sambuc srl out1, 16, local2 ! 6 984*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 3 finished local3 now sbox 5 985*0a6a1f1dSLionel Sambuc 986*0a6a1f1dSLionel Sambuc ld [out3+local0],local0 ! 8 987*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! 6 988*0a6a1f1dSLionel Sambuc add global1, 1536, local5 ! address sbox 7 989*0a6a1f1dSLionel Sambuc 990*0a6a1f1dSLionel Sambuc ld [local6+local2], local2 ! 6 991*0a6a1f1dSLionel Sambuc srl out0, 16, local3 ! 5 992*0a6a1f1dSLionel Sambuc xor in5, local4, in5 ! 4 finished 993*0a6a1f1dSLionel Sambuc 994*0a6a1f1dSLionel Sambuc ld [local5+local1],local1 ! 7 995*0a6a1f1dSLionel Sambuc and local3, 252, local3 ! 5 996*0a6a1f1dSLionel Sambuc xor in5, local0, in5 ! 8 finished 997*0a6a1f1dSLionel Sambuc 998*0a6a1f1dSLionel Sambuc ld [global5+local3],local3 ! 5 999*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 6 finished 1000*0a6a1f1dSLionel Sambuc subcc out4, 1, out4 1001*0a6a1f1dSLionel Sambuc 1002*0a6a1f1dSLionel Sambuc ld [in3+1*8+4], out0 ! key 8642 next round 1003*0a6a1f1dSLionel Sambuc xor in5, local7, local2 ! sbox 5 next round 1004*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 7 finished 1005*0a6a1f1dSLionel Sambuc 1006*0a6a1f1dSLionel Sambuc srl local2, 16, local2 ! sbox 5 next round 1007*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 5 finished 1008*0a6a1f1dSLionel Sambuc 1009*0a6a1f1dSLionel Sambuc ld [in3+1*16+4], out1 ! key 8642 next round again 1010*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! sbox5 next round 1011*0a6a1f1dSLionel Sambuc! next round 1012*0a6a1f1dSLionel Sambuc xor in5, local7, local7 ! 7531 1013*0a6a1f1dSLionel Sambuc 1014*0a6a1f1dSLionel Sambuc ld [global5+local2], local2 ! 5 1015*0a6a1f1dSLionel Sambuc srl local7, 24, local3 ! 7 1016*0a6a1f1dSLionel Sambuc xor in5, out0, out0 ! 8642 1017*0a6a1f1dSLionel Sambuc 1018*0a6a1f1dSLionel Sambuc ldub [out2+local3], local3 ! 7 (and 0xFC) 1019*0a6a1f1dSLionel Sambuc srl out0, 4, local0 ! rotate 4 right 1020*0a6a1f1dSLionel Sambuc and local7, 252, local1 ! 1 1021*0a6a1f1dSLionel Sambuc 1022*0a6a1f1dSLionel Sambuc sll out0, 28, out0 ! rotate 1023*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 5 finished local2 used 1024*0a6a1f1dSLionel Sambuc 1025*0a6a1f1dSLionel Sambuc srl local0, 8, local4 ! 4 1026*0a6a1f1dSLionel Sambuc and local0, 252, local2 ! 2 1027*0a6a1f1dSLionel Sambuc ld [local5+local3], local3 ! 7 1028*0a6a1f1dSLionel Sambuc 1029*0a6a1f1dSLionel Sambuc srl local0, 16, local5 ! 6 1030*0a6a1f1dSLionel Sambuc or out0, local0, out0 ! rotate 1031*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 ! 2 1032*0a6a1f1dSLionel Sambuc 1033*0a6a1f1dSLionel Sambuc srl out0, 24, local0 1034*0a6a1f1dSLionel Sambuc ld [in3+1*16], out0 ! key 7531 next round 1035*0a6a1f1dSLionel Sambuc and local4, 252, local4 ! 4 1036*0a6a1f1dSLionel Sambuc 1037*0a6a1f1dSLionel Sambuc and local5, 252, local5 ! 6 1038*0a6a1f1dSLionel Sambuc ld [global4+local4], local4 ! 4 1039*0a6a1f1dSLionel Sambuc xor out5, local3, out5 ! 7 finished local3 used 1040*0a6a1f1dSLionel Sambuc 1041*0a6a1f1dSLionel Sambuc and local0, 252, local0 ! 8 1042*0a6a1f1dSLionel Sambuc ld [local6+local5], local5 ! 6 1043*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 2 finished local2 now sbox 3 1044*0a6a1f1dSLionel Sambuc 1045*0a6a1f1dSLionel Sambuc srl local7, 8, local2 ! 3 start 1046*0a6a1f1dSLionel Sambuc ld [out3+local0], local0 ! 8 1047*0a6a1f1dSLionel Sambuc xor out5, local4, out5 ! 4 finished 1048*0a6a1f1dSLionel Sambuc 1049*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! 3 1050*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 ! 1 1051*0a6a1f1dSLionel Sambuc xor out5, local5, out5 ! 6 finished local5 used 1052*0a6a1f1dSLionel Sambuc 1053*0a6a1f1dSLionel Sambuc ld [global3+local2], local2 ! 3 1054*0a6a1f1dSLionel Sambuc xor out5, local0, out5 ! 8 finished 1055*0a6a1f1dSLionel Sambuc add in3, 1*16, in3 ! enc add 8, dec add -8 to key pointer 1056*0a6a1f1dSLionel Sambuc 1057*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 1058*0a6a1f1dSLionel Sambuc xor out5, out0, local4 ! sbox 1 next round 1059*0a6a1f1dSLionel Sambuc xor out5, local1, out5 ! 1 finished 1060*0a6a1f1dSLionel Sambuc 1061*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 3 finished 1062*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 1063*0a6a1f1dSLionel Sambuc bne,pt %icc, .des_encrypt1.1 1064*0a6a1f1dSLionel Sambuc#else 1065*0a6a1f1dSLionel Sambuc bne .des_encrypt1.1 1066*0a6a1f1dSLionel Sambuc#endif 1067*0a6a1f1dSLionel Sambuc and local4, 252, local1 ! sbox 1 next round 1068*0a6a1f1dSLionel Sambuc 1069*0a6a1f1dSLionel Sambuc! two rounds more: 1070*0a6a1f1dSLionel Sambuc 1071*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 1072*0a6a1f1dSLionel Sambuc xor out5, out1, out1 1073*0a6a1f1dSLionel Sambuc xor out5, out0, out0 1074*0a6a1f1dSLionel Sambuc 1075*0a6a1f1dSLionel Sambuc srl out1, 4, local0 ! rotate 1076*0a6a1f1dSLionel Sambuc and out0, local5, local3 1077*0a6a1f1dSLionel Sambuc 1078*0a6a1f1dSLionel Sambuc ld [in3+1*8], local7 ! key 7531 1079*0a6a1f1dSLionel Sambuc srl local3, 8, local3 1080*0a6a1f1dSLionel Sambuc and local0, 252, local2 1081*0a6a1f1dSLionel Sambuc 1082*0a6a1f1dSLionel Sambuc ld [global3+local3],local3 1083*0a6a1f1dSLionel Sambuc sll out1, 28, out1 ! rotate 1084*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 1 finished, local1 now sbox 7 1085*0a6a1f1dSLionel Sambuc 1086*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 1087*0a6a1f1dSLionel Sambuc srl out0, 24, local1 1088*0a6a1f1dSLionel Sambuc or out1, local0, out1 ! rotate 1089*0a6a1f1dSLionel Sambuc 1090*0a6a1f1dSLionel Sambuc ldub [out2+local1], local1 1091*0a6a1f1dSLionel Sambuc srl out1, 24, local0 1092*0a6a1f1dSLionel Sambuc and out1, local5, local4 1093*0a6a1f1dSLionel Sambuc 1094*0a6a1f1dSLionel Sambuc ldub [out2+local0], local0 1095*0a6a1f1dSLionel Sambuc srl local4, 8, local4 1096*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 2 finished local2 now sbox 6 1097*0a6a1f1dSLionel Sambuc 1098*0a6a1f1dSLionel Sambuc ld [global4+local4],local4 1099*0a6a1f1dSLionel Sambuc srl out1, 16, local2 1100*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 3 finished local3 now sbox 5 1101*0a6a1f1dSLionel Sambuc 1102*0a6a1f1dSLionel Sambuc ld [out3+local0],local0 1103*0a6a1f1dSLionel Sambuc and local2, 252, local2 1104*0a6a1f1dSLionel Sambuc add global1, 1536, local5 ! address sbox 7 1105*0a6a1f1dSLionel Sambuc 1106*0a6a1f1dSLionel Sambuc ld [local6+local2], local2 1107*0a6a1f1dSLionel Sambuc srl out0, 16, local3 1108*0a6a1f1dSLionel Sambuc xor in5, local4, in5 ! 4 finished 1109*0a6a1f1dSLionel Sambuc 1110*0a6a1f1dSLionel Sambuc ld [local5+local1],local1 1111*0a6a1f1dSLionel Sambuc and local3, 252, local3 1112*0a6a1f1dSLionel Sambuc xor in5, local0, in5 1113*0a6a1f1dSLionel Sambuc 1114*0a6a1f1dSLionel Sambuc ld [global5+local3],local3 1115*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 6 finished 1116*0a6a1f1dSLionel Sambuc cmp in2, 8 1117*0a6a1f1dSLionel Sambuc 1118*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 1119*0a6a1f1dSLionel Sambuc xor in5, local7, local2 ! sbox 5 next round 1120*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 7 finished 1121*0a6a1f1dSLionel Sambuc 1122*0a6a1f1dSLionel Sambuc ld [in3+1*8+4], out0 1123*0a6a1f1dSLionel Sambuc srl local2, 16, local2 ! sbox 5 next round 1124*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 5 finished 1125*0a6a1f1dSLionel Sambuc 1126*0a6a1f1dSLionel Sambuc and local2, 252, local2 1127*0a6a1f1dSLionel Sambuc! next round (two rounds more) 1128*0a6a1f1dSLionel Sambuc xor in5, local7, local7 ! 7531 1129*0a6a1f1dSLionel Sambuc 1130*0a6a1f1dSLionel Sambuc ld [global5+local2], local2 1131*0a6a1f1dSLionel Sambuc srl local7, 24, local3 1132*0a6a1f1dSLionel Sambuc xor in5, out0, out0 ! 8642 1133*0a6a1f1dSLionel Sambuc 1134*0a6a1f1dSLionel Sambuc ldub [out2+local3], local3 1135*0a6a1f1dSLionel Sambuc srl out0, 4, local0 ! rotate 1136*0a6a1f1dSLionel Sambuc and local7, 252, local1 1137*0a6a1f1dSLionel Sambuc 1138*0a6a1f1dSLionel Sambuc sll out0, 28, out0 ! rotate 1139*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 5 finished local2 used 1140*0a6a1f1dSLionel Sambuc 1141*0a6a1f1dSLionel Sambuc srl local0, 8, local4 1142*0a6a1f1dSLionel Sambuc and local0, 252, local2 1143*0a6a1f1dSLionel Sambuc ld [local5+local3], local3 1144*0a6a1f1dSLionel Sambuc 1145*0a6a1f1dSLionel Sambuc srl local0, 16, local5 1146*0a6a1f1dSLionel Sambuc or out0, local0, out0 ! rotate 1147*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 1148*0a6a1f1dSLionel Sambuc 1149*0a6a1f1dSLionel Sambuc srl out0, 24, local0 1150*0a6a1f1dSLionel Sambuc ld [in4], out0 ! key next encryption/decryption 1151*0a6a1f1dSLionel Sambuc and local4, 252, local4 1152*0a6a1f1dSLionel Sambuc 1153*0a6a1f1dSLionel Sambuc and local5, 252, local5 1154*0a6a1f1dSLionel Sambuc ld [global4+local4], local4 1155*0a6a1f1dSLionel Sambuc xor out5, local3, out5 ! 7 finished local3 used 1156*0a6a1f1dSLionel Sambuc 1157*0a6a1f1dSLionel Sambuc and local0, 252, local0 1158*0a6a1f1dSLionel Sambuc ld [local6+local5], local5 1159*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 2 finished local2 now sbox 3 1160*0a6a1f1dSLionel Sambuc 1161*0a6a1f1dSLionel Sambuc srl local7, 8, local2 ! 3 start 1162*0a6a1f1dSLionel Sambuc ld [out3+local0], local0 1163*0a6a1f1dSLionel Sambuc xor out5, local4, out5 1164*0a6a1f1dSLionel Sambuc 1165*0a6a1f1dSLionel Sambuc and local2, 252, local2 1166*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 1167*0a6a1f1dSLionel Sambuc xor out5, local5, out5 ! 6 finished local5 used 1168*0a6a1f1dSLionel Sambuc 1169*0a6a1f1dSLionel Sambuc ld [global3+local2], local2 1170*0a6a1f1dSLionel Sambuc srl in5, 3, local3 1171*0a6a1f1dSLionel Sambuc xor out5, local0, out5 1172*0a6a1f1dSLionel Sambuc 1173*0a6a1f1dSLionel Sambuc ld [in4+4], out1 ! key next encryption/decryption 1174*0a6a1f1dSLionel Sambuc sll in5, 29, local4 1175*0a6a1f1dSLionel Sambuc xor out5, local1, out5 1176*0a6a1f1dSLionel Sambuc 1177*0a6a1f1dSLionel Sambuc 1178*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1179*0a6a1f1dSLionel Sambuc ! in4 not used 1180*0a6a1f1dSLionel Sambuc 1181*0a6a1f1dSLionel Sambuc 1182*0a6a1f1dSLionel Sambuc 1183*0a6a1f1dSLionel Sambuc! fp_macro 1184*0a6a1f1dSLionel Sambuc! in5 out5 1 1185*0a6a1f1dSLionel Sambuc 1186*0a6a1f1dSLionel Sambuc ! initially undo the rotate 3 left done after initial permutation 1187*0a6a1f1dSLionel Sambuc ! original left is received shifted 3 right and 29 left in local3/4 1188*0a6a1f1dSLionel Sambuc 1189*0a6a1f1dSLionel Sambuc sll out5, 29, local1 1190*0a6a1f1dSLionel Sambuc or local3, local4, in5 1191*0a6a1f1dSLionel Sambuc 1192*0a6a1f1dSLionel Sambuc srl out5, 3, out5 1193*0a6a1f1dSLionel Sambuc sethi %hi(0x55555555), local2 1194*0a6a1f1dSLionel Sambuc 1195*0a6a1f1dSLionel Sambuc or out5, local1, out5 1196*0a6a1f1dSLionel Sambuc or local2, %lo(0x55555555), local2 1197*0a6a1f1dSLionel Sambuc 1198*0a6a1f1dSLionel Sambuc srl out5, 1, local3 1199*0a6a1f1dSLionel Sambuc sethi %hi(0x00ff00ff), local1 1200*0a6a1f1dSLionel Sambuc xor local3, in5, local3 1201*0a6a1f1dSLionel Sambuc or local1, %lo(0x00ff00ff), local1 1202*0a6a1f1dSLionel Sambuc and local3, local2, local3 1203*0a6a1f1dSLionel Sambuc sethi %hi(0x33333333), local4 1204*0a6a1f1dSLionel Sambuc sll local3, 1, local2 1205*0a6a1f1dSLionel Sambuc 1206*0a6a1f1dSLionel Sambuc xor in5, local3, in5 1207*0a6a1f1dSLionel Sambuc 1208*0a6a1f1dSLionel Sambuc srl in5, 8, local3 1209*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1210*0a6a1f1dSLionel Sambuc xor local3, out5, local3 1211*0a6a1f1dSLionel Sambuc or local4, %lo(0x33333333), local4 1212*0a6a1f1dSLionel Sambuc and local3, local1, local3 1213*0a6a1f1dSLionel Sambuc sethi %hi(0x0000ffff), local1 1214*0a6a1f1dSLionel Sambuc sll local3, 8, local2 1215*0a6a1f1dSLionel Sambuc 1216*0a6a1f1dSLionel Sambuc xor out5, local3, out5 1217*0a6a1f1dSLionel Sambuc 1218*0a6a1f1dSLionel Sambuc srl out5, 2, local3 1219*0a6a1f1dSLionel Sambuc xor in5, local2, in5 1220*0a6a1f1dSLionel Sambuc xor local3, in5, local3 1221*0a6a1f1dSLionel Sambuc or local1, %lo(0x0000ffff), local1 1222*0a6a1f1dSLionel Sambuc and local3, local4, local3 1223*0a6a1f1dSLionel Sambuc sethi %hi(0x0f0f0f0f), local4 1224*0a6a1f1dSLionel Sambuc sll local3, 2, local2 1225*0a6a1f1dSLionel Sambuc 1226*0a6a1f1dSLionel Sambuc 1227*0a6a1f1dSLionel Sambuc xor in5, local3, in5 1228*0a6a1f1dSLionel Sambuc 1229*0a6a1f1dSLionel Sambuc 1230*0a6a1f1dSLionel Sambuc srl in5, 16, local3 1231*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1232*0a6a1f1dSLionel Sambuc xor local3, out5, local3 1233*0a6a1f1dSLionel Sambuc or local4, %lo(0x0f0f0f0f), local4 1234*0a6a1f1dSLionel Sambuc and local3, local1, local3 1235*0a6a1f1dSLionel Sambuc sll local3, 16, local2 1236*0a6a1f1dSLionel Sambuc 1237*0a6a1f1dSLionel Sambuc xor out5, local3, local1 1238*0a6a1f1dSLionel Sambuc 1239*0a6a1f1dSLionel Sambuc srl local1, 4, local3 1240*0a6a1f1dSLionel Sambuc xor in5, local2, in5 1241*0a6a1f1dSLionel Sambuc xor local3, in5, local3 1242*0a6a1f1dSLionel Sambuc and local3, local4, local3 1243*0a6a1f1dSLionel Sambuc sll local3, 4, local2 1244*0a6a1f1dSLionel Sambuc 1245*0a6a1f1dSLionel Sambuc xor in5, local3, in5 1246*0a6a1f1dSLionel Sambuc 1247*0a6a1f1dSLionel Sambuc ! optional store: 1248*0a6a1f1dSLionel Sambuc 1249*0a6a1f1dSLionel Sambuc st in5, [in0] 1250*0a6a1f1dSLionel Sambuc 1251*0a6a1f1dSLionel Sambuc xor local1, local2, out5 1252*0a6a1f1dSLionel Sambuc 1253*0a6a1f1dSLionel Sambuc st out5, [in0+4] 1254*0a6a1f1dSLionel Sambuc 1255*0a6a1f1dSLionel Sambuc ! 1 for store to [in0] 1256*0a6a1f1dSLionel Sambuc 1257*0a6a1f1dSLionel Sambuc ret 1258*0a6a1f1dSLionel Sambuc restore 1259*0a6a1f1dSLionel Sambuc 1260*0a6a1f1dSLionel Sambuc.encrypt.dec: 1261*0a6a1f1dSLionel Sambuc 1262*0a6a1f1dSLionel Sambuc add in1, 120, in3 ! use last subkey for first round 1263*0a6a1f1dSLionel Sambuc 1264*0a6a1f1dSLionel Sambuc ! parameter 6 1/2 for include encryption/decryption 1265*0a6a1f1dSLionel Sambuc ! parameter 7 1 for move in1 to in3 1266*0a6a1f1dSLionel Sambuc ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 1267*0a6a1f1dSLionel Sambuc 1268*0a6a1f1dSLionel Sambuc 1269*0a6a1f1dSLionel Sambuc 1270*0a6a1f1dSLionel Sambuc! ip_macro 1271*0a6a1f1dSLionel Sambuc! in5 out5 in5 out5 in4 2 0 1 1272*0a6a1f1dSLionel Sambuc 1273*0a6a1f1dSLionel Sambuc ld [out2+256], local1 1274*0a6a1f1dSLionel Sambuc srl out5, 4, local4 1275*0a6a1f1dSLionel Sambuc 1276*0a6a1f1dSLionel Sambuc xor local4, in5, local4 1277*0a6a1f1dSLionel Sambuc nop 1278*0a6a1f1dSLionel Sambuc 1279*0a6a1f1dSLionel Sambuc ld [out2+260], local2 1280*0a6a1f1dSLionel Sambuc and local4, local1, local4 1281*0a6a1f1dSLionel Sambuc mov in3, in4 1282*0a6a1f1dSLionel Sambuc 1283*0a6a1f1dSLionel Sambuc 1284*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 1285*0a6a1f1dSLionel Sambuc sll local4, 4, local1 1286*0a6a1f1dSLionel Sambuc xor in5, local4, in5 1287*0a6a1f1dSLionel Sambuc 1288*0a6a1f1dSLionel Sambuc ld [out2+264], local3 1289*0a6a1f1dSLionel Sambuc srl in5, 16, local4 1290*0a6a1f1dSLionel Sambuc xor out5, local1, out5 1291*0a6a1f1dSLionel Sambuc 1292*0a6a1f1dSLionel Sambuc 1293*0a6a1f1dSLionel Sambuc xor local4, out5, local4 1294*0a6a1f1dSLionel Sambuc nop !sethi %hi(DES_SPtrans), global1 ! sbox addr 1295*0a6a1f1dSLionel Sambuc 1296*0a6a1f1dSLionel Sambuc 1297*0a6a1f1dSLionel Sambuc and local4, local2, local4 1298*0a6a1f1dSLionel Sambuc nop !or global1, %lo(DES_SPtrans), global1 ! sbox addr 1299*0a6a1f1dSLionel Sambuc 1300*0a6a1f1dSLionel Sambuc sll local4, 16, local1 1301*0a6a1f1dSLionel Sambuc xor out5, local4, out5 1302*0a6a1f1dSLionel Sambuc 1303*0a6a1f1dSLionel Sambuc srl out5, 2, local4 1304*0a6a1f1dSLionel Sambuc xor in5, local1, in5 1305*0a6a1f1dSLionel Sambuc 1306*0a6a1f1dSLionel Sambuc sethi %hi(16711680), local5 1307*0a6a1f1dSLionel Sambuc xor local4, in5, local4 1308*0a6a1f1dSLionel Sambuc 1309*0a6a1f1dSLionel Sambuc and local4, local3, local4 1310*0a6a1f1dSLionel Sambuc or local5, 255, local5 1311*0a6a1f1dSLionel Sambuc 1312*0a6a1f1dSLionel Sambuc sll local4, 2, local2 1313*0a6a1f1dSLionel Sambuc xor in5, local4, in5 1314*0a6a1f1dSLionel Sambuc 1315*0a6a1f1dSLionel Sambuc srl in5, 8, local4 1316*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1317*0a6a1f1dSLionel Sambuc 1318*0a6a1f1dSLionel Sambuc xor local4, out5, local4 1319*0a6a1f1dSLionel Sambuc add global1, 768, global4 1320*0a6a1f1dSLionel Sambuc 1321*0a6a1f1dSLionel Sambuc and local4, local5, local4 1322*0a6a1f1dSLionel Sambuc add global1, 1024, global5 1323*0a6a1f1dSLionel Sambuc 1324*0a6a1f1dSLionel Sambuc ld [out2+272], local7 1325*0a6a1f1dSLionel Sambuc sll local4, 8, local1 1326*0a6a1f1dSLionel Sambuc xor out5, local4, out5 1327*0a6a1f1dSLionel Sambuc 1328*0a6a1f1dSLionel Sambuc srl out5, 1, local4 1329*0a6a1f1dSLionel Sambuc xor in5, local1, in5 1330*0a6a1f1dSLionel Sambuc 1331*0a6a1f1dSLionel Sambuc ld [in4], out0 ! key 7531 1332*0a6a1f1dSLionel Sambuc xor local4, in5, local4 1333*0a6a1f1dSLionel Sambuc add global1, 256, global2 1334*0a6a1f1dSLionel Sambuc 1335*0a6a1f1dSLionel Sambuc ld [in4+4], out1 ! key 8642 1336*0a6a1f1dSLionel Sambuc and local4, local7, local4 1337*0a6a1f1dSLionel Sambuc add global1, 512, global3 1338*0a6a1f1dSLionel Sambuc 1339*0a6a1f1dSLionel Sambuc sll local4, 1, local1 1340*0a6a1f1dSLionel Sambuc xor in5, local4, in5 1341*0a6a1f1dSLionel Sambuc 1342*0a6a1f1dSLionel Sambuc sll in5, 3, local3 1343*0a6a1f1dSLionel Sambuc xor out5, local1, out5 1344*0a6a1f1dSLionel Sambuc 1345*0a6a1f1dSLionel Sambuc sll out5, 3, local2 1346*0a6a1f1dSLionel Sambuc add global1, 1280, local6 ! address sbox 8 1347*0a6a1f1dSLionel Sambuc 1348*0a6a1f1dSLionel Sambuc srl in5, 29, local4 1349*0a6a1f1dSLionel Sambuc add global1, 1792, out3 ! address sbox 8 1350*0a6a1f1dSLionel Sambuc 1351*0a6a1f1dSLionel Sambuc srl out5, 29, local1 1352*0a6a1f1dSLionel Sambuc or local4, local3, in5 1353*0a6a1f1dSLionel Sambuc 1354*0a6a1f1dSLionel Sambuc or local2, local1, out5 1355*0a6a1f1dSLionel Sambuc 1356*0a6a1f1dSLionel Sambuc 1357*0a6a1f1dSLionel Sambuc 1358*0a6a1f1dSLionel Sambuc 1359*0a6a1f1dSLionel Sambuc 1360*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 used in the rounds 1361*0a6a1f1dSLionel Sambuc or local2, local1, out5 1362*0a6a1f1dSLionel Sambuc xor in5, out0, local1 1363*0a6a1f1dSLionel Sambuc 1364*0a6a1f1dSLionel Sambuc call .des_dec.1 1365*0a6a1f1dSLionel Sambuc and local1, 252, local1 1366*0a6a1f1dSLionel Sambuc 1367*0a6a1f1dSLionel Sambuc 1368*0a6a1f1dSLionel Sambuc ! include dec, ks in4 1369*0a6a1f1dSLionel Sambuc 1370*0a6a1f1dSLionel Sambuc 1371*0a6a1f1dSLionel Sambuc 1372*0a6a1f1dSLionel Sambuc! fp_macro 1373*0a6a1f1dSLionel Sambuc! out5 in5 1 1374*0a6a1f1dSLionel Sambuc 1375*0a6a1f1dSLionel Sambuc ! initially undo the rotate 3 left done after initial permutation 1376*0a6a1f1dSLionel Sambuc ! original left is received shifted 3 right and 29 left in local3/4 1377*0a6a1f1dSLionel Sambuc 1378*0a6a1f1dSLionel Sambuc sll in5, 29, local1 1379*0a6a1f1dSLionel Sambuc or local3, local4, out5 1380*0a6a1f1dSLionel Sambuc 1381*0a6a1f1dSLionel Sambuc srl in5, 3, in5 1382*0a6a1f1dSLionel Sambuc sethi %hi(0x55555555), local2 1383*0a6a1f1dSLionel Sambuc 1384*0a6a1f1dSLionel Sambuc or in5, local1, in5 1385*0a6a1f1dSLionel Sambuc or local2, %lo(0x55555555), local2 1386*0a6a1f1dSLionel Sambuc 1387*0a6a1f1dSLionel Sambuc srl in5, 1, local3 1388*0a6a1f1dSLionel Sambuc sethi %hi(0x00ff00ff), local1 1389*0a6a1f1dSLionel Sambuc xor local3, out5, local3 1390*0a6a1f1dSLionel Sambuc or local1, %lo(0x00ff00ff), local1 1391*0a6a1f1dSLionel Sambuc and local3, local2, local3 1392*0a6a1f1dSLionel Sambuc sethi %hi(0x33333333), local4 1393*0a6a1f1dSLionel Sambuc sll local3, 1, local2 1394*0a6a1f1dSLionel Sambuc 1395*0a6a1f1dSLionel Sambuc xor out5, local3, out5 1396*0a6a1f1dSLionel Sambuc 1397*0a6a1f1dSLionel Sambuc srl out5, 8, local3 1398*0a6a1f1dSLionel Sambuc xor in5, local2, in5 1399*0a6a1f1dSLionel Sambuc xor local3, in5, local3 1400*0a6a1f1dSLionel Sambuc or local4, %lo(0x33333333), local4 1401*0a6a1f1dSLionel Sambuc and local3, local1, local3 1402*0a6a1f1dSLionel Sambuc sethi %hi(0x0000ffff), local1 1403*0a6a1f1dSLionel Sambuc sll local3, 8, local2 1404*0a6a1f1dSLionel Sambuc 1405*0a6a1f1dSLionel Sambuc xor in5, local3, in5 1406*0a6a1f1dSLionel Sambuc 1407*0a6a1f1dSLionel Sambuc srl in5, 2, local3 1408*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1409*0a6a1f1dSLionel Sambuc xor local3, out5, local3 1410*0a6a1f1dSLionel Sambuc or local1, %lo(0x0000ffff), local1 1411*0a6a1f1dSLionel Sambuc and local3, local4, local3 1412*0a6a1f1dSLionel Sambuc sethi %hi(0x0f0f0f0f), local4 1413*0a6a1f1dSLionel Sambuc sll local3, 2, local2 1414*0a6a1f1dSLionel Sambuc 1415*0a6a1f1dSLionel Sambuc 1416*0a6a1f1dSLionel Sambuc xor out5, local3, out5 1417*0a6a1f1dSLionel Sambuc 1418*0a6a1f1dSLionel Sambuc 1419*0a6a1f1dSLionel Sambuc srl out5, 16, local3 1420*0a6a1f1dSLionel Sambuc xor in5, local2, in5 1421*0a6a1f1dSLionel Sambuc xor local3, in5, local3 1422*0a6a1f1dSLionel Sambuc or local4, %lo(0x0f0f0f0f), local4 1423*0a6a1f1dSLionel Sambuc and local3, local1, local3 1424*0a6a1f1dSLionel Sambuc sll local3, 16, local2 1425*0a6a1f1dSLionel Sambuc 1426*0a6a1f1dSLionel Sambuc xor in5, local3, local1 1427*0a6a1f1dSLionel Sambuc 1428*0a6a1f1dSLionel Sambuc srl local1, 4, local3 1429*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1430*0a6a1f1dSLionel Sambuc xor local3, out5, local3 1431*0a6a1f1dSLionel Sambuc and local3, local4, local3 1432*0a6a1f1dSLionel Sambuc sll local3, 4, local2 1433*0a6a1f1dSLionel Sambuc 1434*0a6a1f1dSLionel Sambuc xor out5, local3, out5 1435*0a6a1f1dSLionel Sambuc 1436*0a6a1f1dSLionel Sambuc ! optional store: 1437*0a6a1f1dSLionel Sambuc 1438*0a6a1f1dSLionel Sambuc st out5, [in0] 1439*0a6a1f1dSLionel Sambuc 1440*0a6a1f1dSLionel Sambuc xor local1, local2, in5 1441*0a6a1f1dSLionel Sambuc 1442*0a6a1f1dSLionel Sambuc st in5, [in0+4] 1443*0a6a1f1dSLionel Sambuc 1444*0a6a1f1dSLionel Sambuc ! 1 for store to [in0] 1445*0a6a1f1dSLionel Sambuc 1446*0a6a1f1dSLionel Sambuc ret 1447*0a6a1f1dSLionel Sambuc restore 1448*0a6a1f1dSLionel Sambuc 1449*0a6a1f1dSLionel Sambuc.DES_encrypt1.end: 1450*0a6a1f1dSLionel Sambuc .size DES_encrypt1,.DES_encrypt1.end-DES_encrypt1 1451*0a6a1f1dSLionel Sambuc 1452*0a6a1f1dSLionel Sambuc 1453*0a6a1f1dSLionel Sambuc! void DES_encrypt2(data, ks, enc) 1454*0a6a1f1dSLionel Sambuc!********************************* 1455*0a6a1f1dSLionel Sambuc 1456*0a6a1f1dSLionel Sambuc ! encrypts/decrypts without initial/final permutation 1457*0a6a1f1dSLionel Sambuc 1458*0a6a1f1dSLionel Sambuc .align 32 1459*0a6a1f1dSLionel Sambuc .global DES_encrypt2 1460*0a6a1f1dSLionel Sambuc .type DES_encrypt2,#function 1461*0a6a1f1dSLionel Sambuc 1462*0a6a1f1dSLionel SambucDES_encrypt2: 1463*0a6a1f1dSLionel Sambuc 1464*0a6a1f1dSLionel Sambuc save %sp, FRAME, %sp 1465*0a6a1f1dSLionel Sambuc 1466*0a6a1f1dSLionel Sambuc sethi %hi(_PIC_DES_SPtrans-1f),global1 1467*0a6a1f1dSLionel Sambuc or global1,%lo(_PIC_DES_SPtrans-1f),global1 1468*0a6a1f1dSLionel Sambuc1: call .+8 1469*0a6a1f1dSLionel Sambuc add %o7,global1,global1 1470*0a6a1f1dSLionel Sambuc sub global1,_PIC_DES_SPtrans-.des_and,out2 1471*0a6a1f1dSLionel Sambuc 1472*0a6a1f1dSLionel Sambuc ! Set sbox address 1 to 6 and rotate halfs 3 left 1473*0a6a1f1dSLionel Sambuc ! Errors caught by destest? Yes. Still? *NO* 1474*0a6a1f1dSLionel Sambuc 1475*0a6a1f1dSLionel Sambuc !sethi %hi(DES_SPtrans), global1 ! address sbox 1 1476*0a6a1f1dSLionel Sambuc 1477*0a6a1f1dSLionel Sambuc !or global1, %lo(DES_SPtrans), global1 ! sbox 1 1478*0a6a1f1dSLionel Sambuc 1479*0a6a1f1dSLionel Sambuc add global1, 256, global2 ! sbox 2 1480*0a6a1f1dSLionel Sambuc add global1, 512, global3 ! sbox 3 1481*0a6a1f1dSLionel Sambuc 1482*0a6a1f1dSLionel Sambuc ld [in0], out5 ! right 1483*0a6a1f1dSLionel Sambuc add global1, 768, global4 ! sbox 4 1484*0a6a1f1dSLionel Sambuc add global1, 1024, global5 ! sbox 5 1485*0a6a1f1dSLionel Sambuc 1486*0a6a1f1dSLionel Sambuc ld [in0+4], in5 ! left 1487*0a6a1f1dSLionel Sambuc add global1, 1280, local6 ! sbox 6 1488*0a6a1f1dSLionel Sambuc add global1, 1792, out3 ! sbox 8 1489*0a6a1f1dSLionel Sambuc 1490*0a6a1f1dSLionel Sambuc ! rotate 1491*0a6a1f1dSLionel Sambuc 1492*0a6a1f1dSLionel Sambuc sll in5, 3, local5 1493*0a6a1f1dSLionel Sambuc mov in1, in3 ! key address to in3 1494*0a6a1f1dSLionel Sambuc 1495*0a6a1f1dSLionel Sambuc sll out5, 3, local7 1496*0a6a1f1dSLionel Sambuc srl in5, 29, in5 1497*0a6a1f1dSLionel Sambuc 1498*0a6a1f1dSLionel Sambuc srl out5, 29, out5 1499*0a6a1f1dSLionel Sambuc add in5, local5, in5 1500*0a6a1f1dSLionel Sambuc 1501*0a6a1f1dSLionel Sambuc add out5, local7, out5 1502*0a6a1f1dSLionel Sambuc cmp in2, 0 1503*0a6a1f1dSLionel Sambuc 1504*0a6a1f1dSLionel Sambuc ! we use our own stackframe 1505*0a6a1f1dSLionel Sambuc 1506*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 1507*0a6a1f1dSLionel Sambuc be,pn %icc, .encrypt2.dec ! decryption 1508*0a6a1f1dSLionel Sambuc#else 1509*0a6a1f1dSLionel Sambuc be .encrypt2.dec 1510*0a6a1f1dSLionel Sambuc#endif 1511*0a6a1f1dSLionel Sambuc STPTR in0, [%sp+BIAS+ARG0+0*ARGSZ] 1512*0a6a1f1dSLionel Sambuc 1513*0a6a1f1dSLionel Sambuc ld [in3], out0 ! key 7531 first round 1514*0a6a1f1dSLionel Sambuc mov LOOPS, out4 ! loop counter 1515*0a6a1f1dSLionel Sambuc 1516*0a6a1f1dSLionel Sambuc ld [in3+4], out1 ! key 8642 first round 1517*0a6a1f1dSLionel Sambuc sethi %hi(0x0000FC00), local5 1518*0a6a1f1dSLionel Sambuc 1519*0a6a1f1dSLionel Sambuc call .des_enc 1520*0a6a1f1dSLionel Sambuc mov in3, in4 1521*0a6a1f1dSLionel Sambuc 1522*0a6a1f1dSLionel Sambuc ! rotate 1523*0a6a1f1dSLionel Sambuc sll in5, 29, in0 1524*0a6a1f1dSLionel Sambuc srl in5, 3, in5 1525*0a6a1f1dSLionel Sambuc sll out5, 29, in1 1526*0a6a1f1dSLionel Sambuc add in5, in0, in5 1527*0a6a1f1dSLionel Sambuc srl out5, 3, out5 1528*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+0*ARGSZ], in0 1529*0a6a1f1dSLionel Sambuc add out5, in1, out5 1530*0a6a1f1dSLionel Sambuc st in5, [in0] 1531*0a6a1f1dSLionel Sambuc st out5, [in0+4] 1532*0a6a1f1dSLionel Sambuc 1533*0a6a1f1dSLionel Sambuc ret 1534*0a6a1f1dSLionel Sambuc restore 1535*0a6a1f1dSLionel Sambuc 1536*0a6a1f1dSLionel Sambuc 1537*0a6a1f1dSLionel Sambuc.encrypt2.dec: 1538*0a6a1f1dSLionel Sambuc 1539*0a6a1f1dSLionel Sambuc add in3, 120, in4 1540*0a6a1f1dSLionel Sambuc 1541*0a6a1f1dSLionel Sambuc ld [in4], out0 ! key 7531 first round 1542*0a6a1f1dSLionel Sambuc mov LOOPS, out4 ! loop counter 1543*0a6a1f1dSLionel Sambuc 1544*0a6a1f1dSLionel Sambuc ld [in4+4], out1 ! key 8642 first round 1545*0a6a1f1dSLionel Sambuc sethi %hi(0x0000FC00), local5 1546*0a6a1f1dSLionel Sambuc 1547*0a6a1f1dSLionel Sambuc mov in5, local1 ! left expected in out5 1548*0a6a1f1dSLionel Sambuc mov out5, in5 1549*0a6a1f1dSLionel Sambuc 1550*0a6a1f1dSLionel Sambuc call .des_dec 1551*0a6a1f1dSLionel Sambuc mov local1, out5 1552*0a6a1f1dSLionel Sambuc 1553*0a6a1f1dSLionel Sambuc.encrypt2.finish: 1554*0a6a1f1dSLionel Sambuc 1555*0a6a1f1dSLionel Sambuc ! rotate 1556*0a6a1f1dSLionel Sambuc sll in5, 29, in0 1557*0a6a1f1dSLionel Sambuc srl in5, 3, in5 1558*0a6a1f1dSLionel Sambuc sll out5, 29, in1 1559*0a6a1f1dSLionel Sambuc add in5, in0, in5 1560*0a6a1f1dSLionel Sambuc srl out5, 3, out5 1561*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+0*ARGSZ], in0 1562*0a6a1f1dSLionel Sambuc add out5, in1, out5 1563*0a6a1f1dSLionel Sambuc st out5, [in0] 1564*0a6a1f1dSLionel Sambuc st in5, [in0+4] 1565*0a6a1f1dSLionel Sambuc 1566*0a6a1f1dSLionel Sambuc ret 1567*0a6a1f1dSLionel Sambuc restore 1568*0a6a1f1dSLionel Sambuc 1569*0a6a1f1dSLionel Sambuc.DES_encrypt2.end: 1570*0a6a1f1dSLionel Sambuc .size DES_encrypt2, .DES_encrypt2.end-DES_encrypt2 1571*0a6a1f1dSLionel Sambuc 1572*0a6a1f1dSLionel Sambuc 1573*0a6a1f1dSLionel Sambuc! void DES_encrypt3(data, ks1, ks2, ks3) 1574*0a6a1f1dSLionel Sambuc! ************************************** 1575*0a6a1f1dSLionel Sambuc 1576*0a6a1f1dSLionel Sambuc .align 32 1577*0a6a1f1dSLionel Sambuc .global DES_encrypt3 1578*0a6a1f1dSLionel Sambuc .type DES_encrypt3,#function 1579*0a6a1f1dSLionel Sambuc 1580*0a6a1f1dSLionel SambucDES_encrypt3: 1581*0a6a1f1dSLionel Sambuc 1582*0a6a1f1dSLionel Sambuc save %sp, FRAME, %sp 1583*0a6a1f1dSLionel Sambuc 1584*0a6a1f1dSLionel Sambuc sethi %hi(_PIC_DES_SPtrans-1f),global1 1585*0a6a1f1dSLionel Sambuc or global1,%lo(_PIC_DES_SPtrans-1f),global1 1586*0a6a1f1dSLionel Sambuc1: call .+8 1587*0a6a1f1dSLionel Sambuc add %o7,global1,global1 1588*0a6a1f1dSLionel Sambuc sub global1,_PIC_DES_SPtrans-.des_and,out2 1589*0a6a1f1dSLionel Sambuc 1590*0a6a1f1dSLionel Sambuc ld [in0], in5 ! left 1591*0a6a1f1dSLionel Sambuc add in2, 120, in4 ! ks2 1592*0a6a1f1dSLionel Sambuc 1593*0a6a1f1dSLionel Sambuc ld [in0+4], out5 ! right 1594*0a6a1f1dSLionel Sambuc mov in3, in2 ! save ks3 1595*0a6a1f1dSLionel Sambuc 1596*0a6a1f1dSLionel Sambuc ! parameter 6 1/2 for include encryption/decryption 1597*0a6a1f1dSLionel Sambuc ! parameter 7 1 for mov in1 to in3 1598*0a6a1f1dSLionel Sambuc ! parameter 8 1 for mov in3 to in4 1599*0a6a1f1dSLionel Sambuc ! parameter 9 1 for load ks3 and ks2 to in4 and in3 1600*0a6a1f1dSLionel Sambuc 1601*0a6a1f1dSLionel Sambuc 1602*0a6a1f1dSLionel Sambuc 1603*0a6a1f1dSLionel Sambuc! ip_macro 1604*0a6a1f1dSLionel Sambuc! in5 out5 out5 in5 in3 1 1 0 0 1605*0a6a1f1dSLionel Sambuc 1606*0a6a1f1dSLionel Sambuc ld [out2+256], local1 1607*0a6a1f1dSLionel Sambuc srl out5, 4, local4 1608*0a6a1f1dSLionel Sambuc 1609*0a6a1f1dSLionel Sambuc xor local4, in5, local4 1610*0a6a1f1dSLionel Sambuc mov in1, in3 1611*0a6a1f1dSLionel Sambuc 1612*0a6a1f1dSLionel Sambuc ld [out2+260], local2 1613*0a6a1f1dSLionel Sambuc and local4, local1, local4 1614*0a6a1f1dSLionel Sambuc 1615*0a6a1f1dSLionel Sambuc 1616*0a6a1f1dSLionel Sambuc 1617*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 1618*0a6a1f1dSLionel Sambuc sll local4, 4, local1 1619*0a6a1f1dSLionel Sambuc xor in5, local4, in5 1620*0a6a1f1dSLionel Sambuc 1621*0a6a1f1dSLionel Sambuc ld [out2+264], local3 1622*0a6a1f1dSLionel Sambuc srl in5, 16, local4 1623*0a6a1f1dSLionel Sambuc xor out5, local1, out5 1624*0a6a1f1dSLionel Sambuc 1625*0a6a1f1dSLionel Sambuc 1626*0a6a1f1dSLionel Sambuc xor local4, out5, local4 1627*0a6a1f1dSLionel Sambuc nop !sethi %hi(DES_SPtrans), global1 ! sbox addr 1628*0a6a1f1dSLionel Sambuc 1629*0a6a1f1dSLionel Sambuc 1630*0a6a1f1dSLionel Sambuc and local4, local2, local4 1631*0a6a1f1dSLionel Sambuc nop !or global1, %lo(DES_SPtrans), global1 ! sbox addr 1632*0a6a1f1dSLionel Sambuc 1633*0a6a1f1dSLionel Sambuc sll local4, 16, local1 1634*0a6a1f1dSLionel Sambuc xor out5, local4, out5 1635*0a6a1f1dSLionel Sambuc 1636*0a6a1f1dSLionel Sambuc srl out5, 2, local4 1637*0a6a1f1dSLionel Sambuc xor in5, local1, in5 1638*0a6a1f1dSLionel Sambuc 1639*0a6a1f1dSLionel Sambuc sethi %hi(16711680), local5 1640*0a6a1f1dSLionel Sambuc xor local4, in5, local4 1641*0a6a1f1dSLionel Sambuc 1642*0a6a1f1dSLionel Sambuc and local4, local3, local4 1643*0a6a1f1dSLionel Sambuc or local5, 255, local5 1644*0a6a1f1dSLionel Sambuc 1645*0a6a1f1dSLionel Sambuc sll local4, 2, local2 1646*0a6a1f1dSLionel Sambuc xor in5, local4, in5 1647*0a6a1f1dSLionel Sambuc 1648*0a6a1f1dSLionel Sambuc srl in5, 8, local4 1649*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1650*0a6a1f1dSLionel Sambuc 1651*0a6a1f1dSLionel Sambuc xor local4, out5, local4 1652*0a6a1f1dSLionel Sambuc add global1, 768, global4 1653*0a6a1f1dSLionel Sambuc 1654*0a6a1f1dSLionel Sambuc and local4, local5, local4 1655*0a6a1f1dSLionel Sambuc add global1, 1024, global5 1656*0a6a1f1dSLionel Sambuc 1657*0a6a1f1dSLionel Sambuc ld [out2+272], local7 1658*0a6a1f1dSLionel Sambuc sll local4, 8, local1 1659*0a6a1f1dSLionel Sambuc xor out5, local4, out5 1660*0a6a1f1dSLionel Sambuc 1661*0a6a1f1dSLionel Sambuc srl out5, 1, local4 1662*0a6a1f1dSLionel Sambuc xor in5, local1, in5 1663*0a6a1f1dSLionel Sambuc 1664*0a6a1f1dSLionel Sambuc ld [in3], out0 ! key 7531 1665*0a6a1f1dSLionel Sambuc xor local4, in5, local4 1666*0a6a1f1dSLionel Sambuc add global1, 256, global2 1667*0a6a1f1dSLionel Sambuc 1668*0a6a1f1dSLionel Sambuc ld [in3+4], out1 ! key 8642 1669*0a6a1f1dSLionel Sambuc and local4, local7, local4 1670*0a6a1f1dSLionel Sambuc add global1, 512, global3 1671*0a6a1f1dSLionel Sambuc 1672*0a6a1f1dSLionel Sambuc sll local4, 1, local1 1673*0a6a1f1dSLionel Sambuc xor in5, local4, in5 1674*0a6a1f1dSLionel Sambuc 1675*0a6a1f1dSLionel Sambuc sll in5, 3, local3 1676*0a6a1f1dSLionel Sambuc xor out5, local1, out5 1677*0a6a1f1dSLionel Sambuc 1678*0a6a1f1dSLionel Sambuc sll out5, 3, local2 1679*0a6a1f1dSLionel Sambuc add global1, 1280, local6 ! address sbox 8 1680*0a6a1f1dSLionel Sambuc 1681*0a6a1f1dSLionel Sambuc srl in5, 29, local4 1682*0a6a1f1dSLionel Sambuc add global1, 1792, out3 ! address sbox 8 1683*0a6a1f1dSLionel Sambuc 1684*0a6a1f1dSLionel Sambuc srl out5, 29, local1 1685*0a6a1f1dSLionel Sambuc or local4, local3, out5 1686*0a6a1f1dSLionel Sambuc 1687*0a6a1f1dSLionel Sambuc or local2, local1, in5 1688*0a6a1f1dSLionel Sambuc 1689*0a6a1f1dSLionel Sambuc 1690*0a6a1f1dSLionel Sambuc 1691*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 used in the rounds 1692*0a6a1f1dSLionel Sambuc or local2, local1, in5 1693*0a6a1f1dSLionel Sambuc xor out5, out0, local1 1694*0a6a1f1dSLionel Sambuc 1695*0a6a1f1dSLionel Sambuc call .des_enc.1 1696*0a6a1f1dSLionel Sambuc and local1, 252, local1 1697*0a6a1f1dSLionel Sambuc 1698*0a6a1f1dSLionel Sambuc 1699*0a6a1f1dSLionel Sambuc 1700*0a6a1f1dSLionel Sambuc 1701*0a6a1f1dSLionel Sambuc 1702*0a6a1f1dSLionel Sambuc 1703*0a6a1f1dSLionel Sambuc call .des_dec 1704*0a6a1f1dSLionel Sambuc mov in2, in3 ! preload ks3 1705*0a6a1f1dSLionel Sambuc 1706*0a6a1f1dSLionel Sambuc call .des_enc 1707*0a6a1f1dSLionel Sambuc nop 1708*0a6a1f1dSLionel Sambuc 1709*0a6a1f1dSLionel Sambuc 1710*0a6a1f1dSLionel Sambuc 1711*0a6a1f1dSLionel Sambuc! fp_macro 1712*0a6a1f1dSLionel Sambuc! in5 out5 1 1713*0a6a1f1dSLionel Sambuc 1714*0a6a1f1dSLionel Sambuc ! initially undo the rotate 3 left done after initial permutation 1715*0a6a1f1dSLionel Sambuc ! original left is received shifted 3 right and 29 left in local3/4 1716*0a6a1f1dSLionel Sambuc 1717*0a6a1f1dSLionel Sambuc sll out5, 29, local1 1718*0a6a1f1dSLionel Sambuc or local3, local4, in5 1719*0a6a1f1dSLionel Sambuc 1720*0a6a1f1dSLionel Sambuc srl out5, 3, out5 1721*0a6a1f1dSLionel Sambuc sethi %hi(0x55555555), local2 1722*0a6a1f1dSLionel Sambuc 1723*0a6a1f1dSLionel Sambuc or out5, local1, out5 1724*0a6a1f1dSLionel Sambuc or local2, %lo(0x55555555), local2 1725*0a6a1f1dSLionel Sambuc 1726*0a6a1f1dSLionel Sambuc srl out5, 1, local3 1727*0a6a1f1dSLionel Sambuc sethi %hi(0x00ff00ff), local1 1728*0a6a1f1dSLionel Sambuc xor local3, in5, local3 1729*0a6a1f1dSLionel Sambuc or local1, %lo(0x00ff00ff), local1 1730*0a6a1f1dSLionel Sambuc and local3, local2, local3 1731*0a6a1f1dSLionel Sambuc sethi %hi(0x33333333), local4 1732*0a6a1f1dSLionel Sambuc sll local3, 1, local2 1733*0a6a1f1dSLionel Sambuc 1734*0a6a1f1dSLionel Sambuc xor in5, local3, in5 1735*0a6a1f1dSLionel Sambuc 1736*0a6a1f1dSLionel Sambuc srl in5, 8, local3 1737*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1738*0a6a1f1dSLionel Sambuc xor local3, out5, local3 1739*0a6a1f1dSLionel Sambuc or local4, %lo(0x33333333), local4 1740*0a6a1f1dSLionel Sambuc and local3, local1, local3 1741*0a6a1f1dSLionel Sambuc sethi %hi(0x0000ffff), local1 1742*0a6a1f1dSLionel Sambuc sll local3, 8, local2 1743*0a6a1f1dSLionel Sambuc 1744*0a6a1f1dSLionel Sambuc xor out5, local3, out5 1745*0a6a1f1dSLionel Sambuc 1746*0a6a1f1dSLionel Sambuc srl out5, 2, local3 1747*0a6a1f1dSLionel Sambuc xor in5, local2, in5 1748*0a6a1f1dSLionel Sambuc xor local3, in5, local3 1749*0a6a1f1dSLionel Sambuc or local1, %lo(0x0000ffff), local1 1750*0a6a1f1dSLionel Sambuc and local3, local4, local3 1751*0a6a1f1dSLionel Sambuc sethi %hi(0x0f0f0f0f), local4 1752*0a6a1f1dSLionel Sambuc sll local3, 2, local2 1753*0a6a1f1dSLionel Sambuc 1754*0a6a1f1dSLionel Sambuc 1755*0a6a1f1dSLionel Sambuc xor in5, local3, in5 1756*0a6a1f1dSLionel Sambuc 1757*0a6a1f1dSLionel Sambuc 1758*0a6a1f1dSLionel Sambuc srl in5, 16, local3 1759*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1760*0a6a1f1dSLionel Sambuc xor local3, out5, local3 1761*0a6a1f1dSLionel Sambuc or local4, %lo(0x0f0f0f0f), local4 1762*0a6a1f1dSLionel Sambuc and local3, local1, local3 1763*0a6a1f1dSLionel Sambuc sll local3, 16, local2 1764*0a6a1f1dSLionel Sambuc 1765*0a6a1f1dSLionel Sambuc xor out5, local3, local1 1766*0a6a1f1dSLionel Sambuc 1767*0a6a1f1dSLionel Sambuc srl local1, 4, local3 1768*0a6a1f1dSLionel Sambuc xor in5, local2, in5 1769*0a6a1f1dSLionel Sambuc xor local3, in5, local3 1770*0a6a1f1dSLionel Sambuc and local3, local4, local3 1771*0a6a1f1dSLionel Sambuc sll local3, 4, local2 1772*0a6a1f1dSLionel Sambuc 1773*0a6a1f1dSLionel Sambuc xor in5, local3, in5 1774*0a6a1f1dSLionel Sambuc 1775*0a6a1f1dSLionel Sambuc ! optional store: 1776*0a6a1f1dSLionel Sambuc 1777*0a6a1f1dSLionel Sambuc st in5, [in0] 1778*0a6a1f1dSLionel Sambuc 1779*0a6a1f1dSLionel Sambuc xor local1, local2, out5 1780*0a6a1f1dSLionel Sambuc 1781*0a6a1f1dSLionel Sambuc st out5, [in0+4] 1782*0a6a1f1dSLionel Sambuc 1783*0a6a1f1dSLionel Sambuc 1784*0a6a1f1dSLionel Sambuc 1785*0a6a1f1dSLionel Sambuc ret 1786*0a6a1f1dSLionel Sambuc restore 1787*0a6a1f1dSLionel Sambuc 1788*0a6a1f1dSLionel Sambuc.DES_encrypt3.end: 1789*0a6a1f1dSLionel Sambuc .size DES_encrypt3,.DES_encrypt3.end-DES_encrypt3 1790*0a6a1f1dSLionel Sambuc 1791*0a6a1f1dSLionel Sambuc 1792*0a6a1f1dSLionel Sambuc! void DES_decrypt3(data, ks1, ks2, ks3) 1793*0a6a1f1dSLionel Sambuc! ************************************** 1794*0a6a1f1dSLionel Sambuc 1795*0a6a1f1dSLionel Sambuc .align 32 1796*0a6a1f1dSLionel Sambuc .global DES_decrypt3 1797*0a6a1f1dSLionel Sambuc .type DES_decrypt3,#function 1798*0a6a1f1dSLionel Sambuc 1799*0a6a1f1dSLionel SambucDES_decrypt3: 1800*0a6a1f1dSLionel Sambuc 1801*0a6a1f1dSLionel Sambuc save %sp, FRAME, %sp 1802*0a6a1f1dSLionel Sambuc 1803*0a6a1f1dSLionel Sambuc sethi %hi(_PIC_DES_SPtrans-1f),global1 1804*0a6a1f1dSLionel Sambuc or global1,%lo(_PIC_DES_SPtrans-1f),global1 1805*0a6a1f1dSLionel Sambuc1: call .+8 1806*0a6a1f1dSLionel Sambuc add %o7,global1,global1 1807*0a6a1f1dSLionel Sambuc sub global1,_PIC_DES_SPtrans-.des_and,out2 1808*0a6a1f1dSLionel Sambuc 1809*0a6a1f1dSLionel Sambuc ld [in0], in5 ! left 1810*0a6a1f1dSLionel Sambuc add in3, 120, in4 ! ks3 1811*0a6a1f1dSLionel Sambuc 1812*0a6a1f1dSLionel Sambuc ld [in0+4], out5 ! right 1813*0a6a1f1dSLionel Sambuc mov in2, in3 ! ks2 1814*0a6a1f1dSLionel Sambuc 1815*0a6a1f1dSLionel Sambuc ! parameter 6 1/2 for include encryption/decryption 1816*0a6a1f1dSLionel Sambuc ! parameter 7 1 for mov in1 to in3 1817*0a6a1f1dSLionel Sambuc ! parameter 8 1 for mov in3 to in4 1818*0a6a1f1dSLionel Sambuc ! parameter 9 1 for load ks3 and ks2 to in4 and in3 1819*0a6a1f1dSLionel Sambuc 1820*0a6a1f1dSLionel Sambuc 1821*0a6a1f1dSLionel Sambuc 1822*0a6a1f1dSLionel Sambuc! ip_macro 1823*0a6a1f1dSLionel Sambuc! in5 out5 in5 out5 in4 2 0 0 0 1824*0a6a1f1dSLionel Sambuc 1825*0a6a1f1dSLionel Sambuc ld [out2+256], local1 1826*0a6a1f1dSLionel Sambuc srl out5, 4, local4 1827*0a6a1f1dSLionel Sambuc 1828*0a6a1f1dSLionel Sambuc xor local4, in5, local4 1829*0a6a1f1dSLionel Sambuc nop 1830*0a6a1f1dSLionel Sambuc 1831*0a6a1f1dSLionel Sambuc ld [out2+260], local2 1832*0a6a1f1dSLionel Sambuc and local4, local1, local4 1833*0a6a1f1dSLionel Sambuc 1834*0a6a1f1dSLionel Sambuc 1835*0a6a1f1dSLionel Sambuc 1836*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 1837*0a6a1f1dSLionel Sambuc sll local4, 4, local1 1838*0a6a1f1dSLionel Sambuc xor in5, local4, in5 1839*0a6a1f1dSLionel Sambuc 1840*0a6a1f1dSLionel Sambuc ld [out2+264], local3 1841*0a6a1f1dSLionel Sambuc srl in5, 16, local4 1842*0a6a1f1dSLionel Sambuc xor out5, local1, out5 1843*0a6a1f1dSLionel Sambuc 1844*0a6a1f1dSLionel Sambuc 1845*0a6a1f1dSLionel Sambuc xor local4, out5, local4 1846*0a6a1f1dSLionel Sambuc nop !sethi %hi(DES_SPtrans), global1 ! sbox addr 1847*0a6a1f1dSLionel Sambuc 1848*0a6a1f1dSLionel Sambuc 1849*0a6a1f1dSLionel Sambuc and local4, local2, local4 1850*0a6a1f1dSLionel Sambuc nop !or global1, %lo(DES_SPtrans), global1 ! sbox addr 1851*0a6a1f1dSLionel Sambuc 1852*0a6a1f1dSLionel Sambuc sll local4, 16, local1 1853*0a6a1f1dSLionel Sambuc xor out5, local4, out5 1854*0a6a1f1dSLionel Sambuc 1855*0a6a1f1dSLionel Sambuc srl out5, 2, local4 1856*0a6a1f1dSLionel Sambuc xor in5, local1, in5 1857*0a6a1f1dSLionel Sambuc 1858*0a6a1f1dSLionel Sambuc sethi %hi(16711680), local5 1859*0a6a1f1dSLionel Sambuc xor local4, in5, local4 1860*0a6a1f1dSLionel Sambuc 1861*0a6a1f1dSLionel Sambuc and local4, local3, local4 1862*0a6a1f1dSLionel Sambuc or local5, 255, local5 1863*0a6a1f1dSLionel Sambuc 1864*0a6a1f1dSLionel Sambuc sll local4, 2, local2 1865*0a6a1f1dSLionel Sambuc xor in5, local4, in5 1866*0a6a1f1dSLionel Sambuc 1867*0a6a1f1dSLionel Sambuc srl in5, 8, local4 1868*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1869*0a6a1f1dSLionel Sambuc 1870*0a6a1f1dSLionel Sambuc xor local4, out5, local4 1871*0a6a1f1dSLionel Sambuc add global1, 768, global4 1872*0a6a1f1dSLionel Sambuc 1873*0a6a1f1dSLionel Sambuc and local4, local5, local4 1874*0a6a1f1dSLionel Sambuc add global1, 1024, global5 1875*0a6a1f1dSLionel Sambuc 1876*0a6a1f1dSLionel Sambuc ld [out2+272], local7 1877*0a6a1f1dSLionel Sambuc sll local4, 8, local1 1878*0a6a1f1dSLionel Sambuc xor out5, local4, out5 1879*0a6a1f1dSLionel Sambuc 1880*0a6a1f1dSLionel Sambuc srl out5, 1, local4 1881*0a6a1f1dSLionel Sambuc xor in5, local1, in5 1882*0a6a1f1dSLionel Sambuc 1883*0a6a1f1dSLionel Sambuc ld [in4], out0 ! key 7531 1884*0a6a1f1dSLionel Sambuc xor local4, in5, local4 1885*0a6a1f1dSLionel Sambuc add global1, 256, global2 1886*0a6a1f1dSLionel Sambuc 1887*0a6a1f1dSLionel Sambuc ld [in4+4], out1 ! key 8642 1888*0a6a1f1dSLionel Sambuc and local4, local7, local4 1889*0a6a1f1dSLionel Sambuc add global1, 512, global3 1890*0a6a1f1dSLionel Sambuc 1891*0a6a1f1dSLionel Sambuc sll local4, 1, local1 1892*0a6a1f1dSLionel Sambuc xor in5, local4, in5 1893*0a6a1f1dSLionel Sambuc 1894*0a6a1f1dSLionel Sambuc sll in5, 3, local3 1895*0a6a1f1dSLionel Sambuc xor out5, local1, out5 1896*0a6a1f1dSLionel Sambuc 1897*0a6a1f1dSLionel Sambuc sll out5, 3, local2 1898*0a6a1f1dSLionel Sambuc add global1, 1280, local6 ! address sbox 8 1899*0a6a1f1dSLionel Sambuc 1900*0a6a1f1dSLionel Sambuc srl in5, 29, local4 1901*0a6a1f1dSLionel Sambuc add global1, 1792, out3 ! address sbox 8 1902*0a6a1f1dSLionel Sambuc 1903*0a6a1f1dSLionel Sambuc srl out5, 29, local1 1904*0a6a1f1dSLionel Sambuc or local4, local3, in5 1905*0a6a1f1dSLionel Sambuc 1906*0a6a1f1dSLionel Sambuc or local2, local1, out5 1907*0a6a1f1dSLionel Sambuc 1908*0a6a1f1dSLionel Sambuc 1909*0a6a1f1dSLionel Sambuc 1910*0a6a1f1dSLionel Sambuc 1911*0a6a1f1dSLionel Sambuc 1912*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 used in the rounds 1913*0a6a1f1dSLionel Sambuc or local2, local1, out5 1914*0a6a1f1dSLionel Sambuc xor in5, out0, local1 1915*0a6a1f1dSLionel Sambuc 1916*0a6a1f1dSLionel Sambuc call .des_dec.1 1917*0a6a1f1dSLionel Sambuc and local1, 252, local1 1918*0a6a1f1dSLionel Sambuc 1919*0a6a1f1dSLionel Sambuc 1920*0a6a1f1dSLionel Sambuc 1921*0a6a1f1dSLionel Sambuc 1922*0a6a1f1dSLionel Sambuc call .des_enc 1923*0a6a1f1dSLionel Sambuc add in1, 120, in4 ! preload ks1 1924*0a6a1f1dSLionel Sambuc 1925*0a6a1f1dSLionel Sambuc call .des_dec 1926*0a6a1f1dSLionel Sambuc nop 1927*0a6a1f1dSLionel Sambuc 1928*0a6a1f1dSLionel Sambuc 1929*0a6a1f1dSLionel Sambuc 1930*0a6a1f1dSLionel Sambuc! fp_macro 1931*0a6a1f1dSLionel Sambuc! out5 in5 1 1932*0a6a1f1dSLionel Sambuc 1933*0a6a1f1dSLionel Sambuc ! initially undo the rotate 3 left done after initial permutation 1934*0a6a1f1dSLionel Sambuc ! original left is received shifted 3 right and 29 left in local3/4 1935*0a6a1f1dSLionel Sambuc 1936*0a6a1f1dSLionel Sambuc sll in5, 29, local1 1937*0a6a1f1dSLionel Sambuc or local3, local4, out5 1938*0a6a1f1dSLionel Sambuc 1939*0a6a1f1dSLionel Sambuc srl in5, 3, in5 1940*0a6a1f1dSLionel Sambuc sethi %hi(0x55555555), local2 1941*0a6a1f1dSLionel Sambuc 1942*0a6a1f1dSLionel Sambuc or in5, local1, in5 1943*0a6a1f1dSLionel Sambuc or local2, %lo(0x55555555), local2 1944*0a6a1f1dSLionel Sambuc 1945*0a6a1f1dSLionel Sambuc srl in5, 1, local3 1946*0a6a1f1dSLionel Sambuc sethi %hi(0x00ff00ff), local1 1947*0a6a1f1dSLionel Sambuc xor local3, out5, local3 1948*0a6a1f1dSLionel Sambuc or local1, %lo(0x00ff00ff), local1 1949*0a6a1f1dSLionel Sambuc and local3, local2, local3 1950*0a6a1f1dSLionel Sambuc sethi %hi(0x33333333), local4 1951*0a6a1f1dSLionel Sambuc sll local3, 1, local2 1952*0a6a1f1dSLionel Sambuc 1953*0a6a1f1dSLionel Sambuc xor out5, local3, out5 1954*0a6a1f1dSLionel Sambuc 1955*0a6a1f1dSLionel Sambuc srl out5, 8, local3 1956*0a6a1f1dSLionel Sambuc xor in5, local2, in5 1957*0a6a1f1dSLionel Sambuc xor local3, in5, local3 1958*0a6a1f1dSLionel Sambuc or local4, %lo(0x33333333), local4 1959*0a6a1f1dSLionel Sambuc and local3, local1, local3 1960*0a6a1f1dSLionel Sambuc sethi %hi(0x0000ffff), local1 1961*0a6a1f1dSLionel Sambuc sll local3, 8, local2 1962*0a6a1f1dSLionel Sambuc 1963*0a6a1f1dSLionel Sambuc xor in5, local3, in5 1964*0a6a1f1dSLionel Sambuc 1965*0a6a1f1dSLionel Sambuc srl in5, 2, local3 1966*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1967*0a6a1f1dSLionel Sambuc xor local3, out5, local3 1968*0a6a1f1dSLionel Sambuc or local1, %lo(0x0000ffff), local1 1969*0a6a1f1dSLionel Sambuc and local3, local4, local3 1970*0a6a1f1dSLionel Sambuc sethi %hi(0x0f0f0f0f), local4 1971*0a6a1f1dSLionel Sambuc sll local3, 2, local2 1972*0a6a1f1dSLionel Sambuc 1973*0a6a1f1dSLionel Sambuc 1974*0a6a1f1dSLionel Sambuc xor out5, local3, out5 1975*0a6a1f1dSLionel Sambuc 1976*0a6a1f1dSLionel Sambuc 1977*0a6a1f1dSLionel Sambuc srl out5, 16, local3 1978*0a6a1f1dSLionel Sambuc xor in5, local2, in5 1979*0a6a1f1dSLionel Sambuc xor local3, in5, local3 1980*0a6a1f1dSLionel Sambuc or local4, %lo(0x0f0f0f0f), local4 1981*0a6a1f1dSLionel Sambuc and local3, local1, local3 1982*0a6a1f1dSLionel Sambuc sll local3, 16, local2 1983*0a6a1f1dSLionel Sambuc 1984*0a6a1f1dSLionel Sambuc xor in5, local3, local1 1985*0a6a1f1dSLionel Sambuc 1986*0a6a1f1dSLionel Sambuc srl local1, 4, local3 1987*0a6a1f1dSLionel Sambuc xor out5, local2, out5 1988*0a6a1f1dSLionel Sambuc xor local3, out5, local3 1989*0a6a1f1dSLionel Sambuc and local3, local4, local3 1990*0a6a1f1dSLionel Sambuc sll local3, 4, local2 1991*0a6a1f1dSLionel Sambuc 1992*0a6a1f1dSLionel Sambuc xor out5, local3, out5 1993*0a6a1f1dSLionel Sambuc 1994*0a6a1f1dSLionel Sambuc ! optional store: 1995*0a6a1f1dSLionel Sambuc 1996*0a6a1f1dSLionel Sambuc st out5, [in0] 1997*0a6a1f1dSLionel Sambuc 1998*0a6a1f1dSLionel Sambuc xor local1, local2, in5 1999*0a6a1f1dSLionel Sambuc 2000*0a6a1f1dSLionel Sambuc st in5, [in0+4] 2001*0a6a1f1dSLionel Sambuc 2002*0a6a1f1dSLionel Sambuc 2003*0a6a1f1dSLionel Sambuc 2004*0a6a1f1dSLionel Sambuc ret 2005*0a6a1f1dSLionel Sambuc restore 2006*0a6a1f1dSLionel Sambuc 2007*0a6a1f1dSLionel Sambuc.DES_decrypt3.end: 2008*0a6a1f1dSLionel Sambuc .size DES_decrypt3,.DES_decrypt3.end-DES_decrypt3 2009*0a6a1f1dSLionel Sambuc 2010*0a6a1f1dSLionel Sambuc! void DES_ncbc_encrypt(input, output, length, schedule, ivec, enc) 2011*0a6a1f1dSLionel Sambuc! ***************************************************************** 2012*0a6a1f1dSLionel Sambuc 2013*0a6a1f1dSLionel Sambuc 2014*0a6a1f1dSLionel Sambuc .align 32 2015*0a6a1f1dSLionel Sambuc .global DES_ncbc_encrypt 2016*0a6a1f1dSLionel Sambuc .type DES_ncbc_encrypt,#function 2017*0a6a1f1dSLionel Sambuc 2018*0a6a1f1dSLionel SambucDES_ncbc_encrypt: 2019*0a6a1f1dSLionel Sambuc 2020*0a6a1f1dSLionel Sambuc save %sp, FRAME, %sp 2021*0a6a1f1dSLionel Sambuc 2022*0a6a1f1dSLionel Sambuc 2023*0a6a1f1dSLionel Sambuc 2024*0a6a1f1dSLionel Sambuc 2025*0a6a1f1dSLionel Sambuc 2026*0a6a1f1dSLionel Sambuc sethi %hi(_PIC_DES_SPtrans-1f),global1 2027*0a6a1f1dSLionel Sambuc or global1,%lo(_PIC_DES_SPtrans-1f),global1 2028*0a6a1f1dSLionel Sambuc1: call .+8 2029*0a6a1f1dSLionel Sambuc add %o7,global1,global1 2030*0a6a1f1dSLionel Sambuc sub global1,_PIC_DES_SPtrans-.des_and,out2 2031*0a6a1f1dSLionel Sambuc 2032*0a6a1f1dSLionel Sambuc cmp in5, 0 ! enc 2033*0a6a1f1dSLionel Sambuc 2034*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2035*0a6a1f1dSLionel Sambuc be,pn %icc, .ncbc.dec 2036*0a6a1f1dSLionel Sambuc#else 2037*0a6a1f1dSLionel Sambuc be .ncbc.dec 2038*0a6a1f1dSLionel Sambuc#endif 2039*0a6a1f1dSLionel Sambuc STPTR in4, [%sp+BIAS+ARG0+4*ARGSZ] 2040*0a6a1f1dSLionel Sambuc 2041*0a6a1f1dSLionel Sambuc ! addr left right temp label 2042*0a6a1f1dSLionel Sambuc 2043*0a6a1f1dSLionel Sambuc 2044*0a6a1f1dSLionel Sambuc! load_little_endian 2045*0a6a1f1dSLionel Sambuc! in4 in5 out5 local3 .LLE1 2046*0a6a1f1dSLionel Sambuc 2047*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 2048*0a6a1f1dSLionel Sambuc 2049*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2050*0a6a1f1dSLionel Sambuc andcc in4, 3, global0 2051*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE1 2052*0a6a1f1dSLionel Sambuc nop 2053*0a6a1f1dSLionel Sambuc 2054*0a6a1f1dSLionel Sambuc lda [in4] 0x88, in5 2055*0a6a1f1dSLionel Sambuc add in4, 4, local3 2056*0a6a1f1dSLionel Sambuc 2057*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE1a 2058*0a6a1f1dSLionel Sambuc lda [local3] 0x88, out5 2059*0a6a1f1dSLionel Sambuc#endif 2060*0a6a1f1dSLionel Sambuc 2061*0a6a1f1dSLionel Sambuc.LLE1: 2062*0a6a1f1dSLionel Sambuc ldub [in4+3], in5 2063*0a6a1f1dSLionel Sambuc 2064*0a6a1f1dSLionel Sambuc ldub [in4+2], local3 2065*0a6a1f1dSLionel Sambuc sll in5, 8, in5 2066*0a6a1f1dSLionel Sambuc or in5, local3, in5 2067*0a6a1f1dSLionel Sambuc 2068*0a6a1f1dSLionel Sambuc ldub [in4+1], local3 2069*0a6a1f1dSLionel Sambuc sll in5, 8, in5 2070*0a6a1f1dSLionel Sambuc or in5, local3, in5 2071*0a6a1f1dSLionel Sambuc 2072*0a6a1f1dSLionel Sambuc ldub [in4+0], local3 2073*0a6a1f1dSLionel Sambuc sll in5, 8, in5 2074*0a6a1f1dSLionel Sambuc or in5, local3, in5 2075*0a6a1f1dSLionel Sambuc 2076*0a6a1f1dSLionel Sambuc 2077*0a6a1f1dSLionel Sambuc ldub [in4+3+4], out5 2078*0a6a1f1dSLionel Sambuc 2079*0a6a1f1dSLionel Sambuc ldub [in4+2+4], local3 2080*0a6a1f1dSLionel Sambuc sll out5, 8, out5 2081*0a6a1f1dSLionel Sambuc or out5, local3, out5 2082*0a6a1f1dSLionel Sambuc 2083*0a6a1f1dSLionel Sambuc ldub [in4+1+4], local3 2084*0a6a1f1dSLionel Sambuc sll out5, 8, out5 2085*0a6a1f1dSLionel Sambuc or out5, local3, out5 2086*0a6a1f1dSLionel Sambuc 2087*0a6a1f1dSLionel Sambuc ldub [in4+0+4], local3 2088*0a6a1f1dSLionel Sambuc sll out5, 8, out5 2089*0a6a1f1dSLionel Sambuc or out5, local3, out5 2090*0a6a1f1dSLionel Sambuc.LLE1a: 2091*0a6a1f1dSLionel Sambuc 2092*0a6a1f1dSLionel Sambuc ! iv 2093*0a6a1f1dSLionel Sambuc 2094*0a6a1f1dSLionel Sambuc addcc in2, -8, in2 ! bytes missing when first block done 2095*0a6a1f1dSLionel Sambuc 2096*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2097*0a6a1f1dSLionel Sambuc bl,pn %icc, .ncbc.enc.seven.or.less 2098*0a6a1f1dSLionel Sambuc#else 2099*0a6a1f1dSLionel Sambuc bl .ncbc.enc.seven.or.less 2100*0a6a1f1dSLionel Sambuc#endif 2101*0a6a1f1dSLionel Sambuc mov in3, in4 ! schedule 2102*0a6a1f1dSLionel Sambuc 2103*0a6a1f1dSLionel Sambuc.ncbc.enc.next.block: 2104*0a6a1f1dSLionel Sambuc 2105*0a6a1f1dSLionel Sambuc 2106*0a6a1f1dSLionel Sambuc 2107*0a6a1f1dSLionel Sambuc! load_little_endian 2108*0a6a1f1dSLionel Sambuc! in0 out4 global4 local3 .LLE2 2109*0a6a1f1dSLionel Sambuc 2110*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 2111*0a6a1f1dSLionel Sambuc 2112*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2113*0a6a1f1dSLionel Sambuc andcc in0, 3, global0 2114*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE2 2115*0a6a1f1dSLionel Sambuc nop 2116*0a6a1f1dSLionel Sambuc 2117*0a6a1f1dSLionel Sambuc lda [in0] 0x88, out4 2118*0a6a1f1dSLionel Sambuc add in0, 4, local3 2119*0a6a1f1dSLionel Sambuc 2120*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE2a 2121*0a6a1f1dSLionel Sambuc lda [local3] 0x88, global4 2122*0a6a1f1dSLionel Sambuc#endif 2123*0a6a1f1dSLionel Sambuc 2124*0a6a1f1dSLionel Sambuc.LLE2: 2125*0a6a1f1dSLionel Sambuc ldub [in0+3], out4 2126*0a6a1f1dSLionel Sambuc 2127*0a6a1f1dSLionel Sambuc ldub [in0+2], local3 2128*0a6a1f1dSLionel Sambuc sll out4, 8, out4 2129*0a6a1f1dSLionel Sambuc or out4, local3, out4 2130*0a6a1f1dSLionel Sambuc 2131*0a6a1f1dSLionel Sambuc ldub [in0+1], local3 2132*0a6a1f1dSLionel Sambuc sll out4, 8, out4 2133*0a6a1f1dSLionel Sambuc or out4, local3, out4 2134*0a6a1f1dSLionel Sambuc 2135*0a6a1f1dSLionel Sambuc ldub [in0+0], local3 2136*0a6a1f1dSLionel Sambuc sll out4, 8, out4 2137*0a6a1f1dSLionel Sambuc or out4, local3, out4 2138*0a6a1f1dSLionel Sambuc 2139*0a6a1f1dSLionel Sambuc 2140*0a6a1f1dSLionel Sambuc ldub [in0+3+4], global4 2141*0a6a1f1dSLionel Sambuc 2142*0a6a1f1dSLionel Sambuc ldub [in0+2+4], local3 2143*0a6a1f1dSLionel Sambuc sll global4, 8, global4 2144*0a6a1f1dSLionel Sambuc or global4, local3, global4 2145*0a6a1f1dSLionel Sambuc 2146*0a6a1f1dSLionel Sambuc ldub [in0+1+4], local3 2147*0a6a1f1dSLionel Sambuc sll global4, 8, global4 2148*0a6a1f1dSLionel Sambuc or global4, local3, global4 2149*0a6a1f1dSLionel Sambuc 2150*0a6a1f1dSLionel Sambuc ldub [in0+0+4], local3 2151*0a6a1f1dSLionel Sambuc sll global4, 8, global4 2152*0a6a1f1dSLionel Sambuc or global4, local3, global4 2153*0a6a1f1dSLionel Sambuc.LLE2a: 2154*0a6a1f1dSLionel Sambuc 2155*0a6a1f1dSLionel Sambuc ! block 2156*0a6a1f1dSLionel Sambuc 2157*0a6a1f1dSLionel Sambuc.ncbc.enc.next.block_1: 2158*0a6a1f1dSLionel Sambuc 2159*0a6a1f1dSLionel Sambuc xor in5, out4, in5 ! iv xor 2160*0a6a1f1dSLionel Sambuc xor out5, global4, out5 ! iv xor 2161*0a6a1f1dSLionel Sambuc 2162*0a6a1f1dSLionel Sambuc ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 2163*0a6a1f1dSLionel Sambuc 2164*0a6a1f1dSLionel Sambuc 2165*0a6a1f1dSLionel Sambuc! ip_macro 2166*0a6a1f1dSLionel Sambuc! in5 out5 out5 in5 in3 0 0 2 2167*0a6a1f1dSLionel Sambuc 2168*0a6a1f1dSLionel Sambuc ld [out2+256], local1 2169*0a6a1f1dSLionel Sambuc srl out5, 4, local4 2170*0a6a1f1dSLionel Sambuc 2171*0a6a1f1dSLionel Sambuc xor local4, in5, local4 2172*0a6a1f1dSLionel Sambuc nop 2173*0a6a1f1dSLionel Sambuc 2174*0a6a1f1dSLionel Sambuc ld [out2+260], local2 2175*0a6a1f1dSLionel Sambuc and local4, local1, local4 2176*0a6a1f1dSLionel Sambuc 2177*0a6a1f1dSLionel Sambuc mov in4, in3 2178*0a6a1f1dSLionel Sambuc 2179*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 2180*0a6a1f1dSLionel Sambuc sll local4, 4, local1 2181*0a6a1f1dSLionel Sambuc xor in5, local4, in5 2182*0a6a1f1dSLionel Sambuc 2183*0a6a1f1dSLionel Sambuc ld [out2+264], local3 2184*0a6a1f1dSLionel Sambuc srl in5, 16, local4 2185*0a6a1f1dSLionel Sambuc xor out5, local1, out5 2186*0a6a1f1dSLionel Sambuc 2187*0a6a1f1dSLionel Sambuc 2188*0a6a1f1dSLionel Sambuc xor local4, out5, local4 2189*0a6a1f1dSLionel Sambuc nop !sethi %hi(DES_SPtrans), global1 ! sbox addr 2190*0a6a1f1dSLionel Sambuc 2191*0a6a1f1dSLionel Sambuc 2192*0a6a1f1dSLionel Sambuc and local4, local2, local4 2193*0a6a1f1dSLionel Sambuc nop !or global1, %lo(DES_SPtrans), global1 ! sbox addr 2194*0a6a1f1dSLionel Sambuc 2195*0a6a1f1dSLionel Sambuc sll local4, 16, local1 2196*0a6a1f1dSLionel Sambuc xor out5, local4, out5 2197*0a6a1f1dSLionel Sambuc 2198*0a6a1f1dSLionel Sambuc srl out5, 2, local4 2199*0a6a1f1dSLionel Sambuc xor in5, local1, in5 2200*0a6a1f1dSLionel Sambuc 2201*0a6a1f1dSLionel Sambuc sethi %hi(16711680), local5 2202*0a6a1f1dSLionel Sambuc xor local4, in5, local4 2203*0a6a1f1dSLionel Sambuc 2204*0a6a1f1dSLionel Sambuc and local4, local3, local4 2205*0a6a1f1dSLionel Sambuc or local5, 255, local5 2206*0a6a1f1dSLionel Sambuc 2207*0a6a1f1dSLionel Sambuc sll local4, 2, local2 2208*0a6a1f1dSLionel Sambuc xor in5, local4, in5 2209*0a6a1f1dSLionel Sambuc 2210*0a6a1f1dSLionel Sambuc srl in5, 8, local4 2211*0a6a1f1dSLionel Sambuc xor out5, local2, out5 2212*0a6a1f1dSLionel Sambuc 2213*0a6a1f1dSLionel Sambuc xor local4, out5, local4 2214*0a6a1f1dSLionel Sambuc add global1, 768, global4 2215*0a6a1f1dSLionel Sambuc 2216*0a6a1f1dSLionel Sambuc and local4, local5, local4 2217*0a6a1f1dSLionel Sambuc add global1, 1024, global5 2218*0a6a1f1dSLionel Sambuc 2219*0a6a1f1dSLionel Sambuc ld [out2+272], local7 2220*0a6a1f1dSLionel Sambuc sll local4, 8, local1 2221*0a6a1f1dSLionel Sambuc xor out5, local4, out5 2222*0a6a1f1dSLionel Sambuc 2223*0a6a1f1dSLionel Sambuc srl out5, 1, local4 2224*0a6a1f1dSLionel Sambuc xor in5, local1, in5 2225*0a6a1f1dSLionel Sambuc 2226*0a6a1f1dSLionel Sambuc ld [in3], out0 ! key 7531 2227*0a6a1f1dSLionel Sambuc xor local4, in5, local4 2228*0a6a1f1dSLionel Sambuc add global1, 256, global2 2229*0a6a1f1dSLionel Sambuc 2230*0a6a1f1dSLionel Sambuc ld [in3+4], out1 ! key 8642 2231*0a6a1f1dSLionel Sambuc and local4, local7, local4 2232*0a6a1f1dSLionel Sambuc add global1, 512, global3 2233*0a6a1f1dSLionel Sambuc 2234*0a6a1f1dSLionel Sambuc sll local4, 1, local1 2235*0a6a1f1dSLionel Sambuc xor in5, local4, in5 2236*0a6a1f1dSLionel Sambuc 2237*0a6a1f1dSLionel Sambuc sll in5, 3, local3 2238*0a6a1f1dSLionel Sambuc xor out5, local1, out5 2239*0a6a1f1dSLionel Sambuc 2240*0a6a1f1dSLionel Sambuc sll out5, 3, local2 2241*0a6a1f1dSLionel Sambuc add global1, 1280, local6 ! address sbox 8 2242*0a6a1f1dSLionel Sambuc 2243*0a6a1f1dSLionel Sambuc srl in5, 29, local4 2244*0a6a1f1dSLionel Sambuc add global1, 1792, out3 ! address sbox 8 2245*0a6a1f1dSLionel Sambuc 2246*0a6a1f1dSLionel Sambuc srl out5, 29, local1 2247*0a6a1f1dSLionel Sambuc or local4, local3, out5 2248*0a6a1f1dSLionel Sambuc 2249*0a6a1f1dSLionel Sambuc or local2, local1, in5 2250*0a6a1f1dSLionel Sambuc 2251*0a6a1f1dSLionel Sambuc 2252*0a6a1f1dSLionel Sambuc 2253*0a6a1f1dSLionel Sambuc 2254*0a6a1f1dSLionel Sambuc 2255*0a6a1f1dSLionel Sambuc 2256*0a6a1f1dSLionel Sambuc.ncbc.enc.next.block_2: 2257*0a6a1f1dSLionel Sambuc 2258*0a6a1f1dSLionel Sambuc!// call .des_enc ! compares in2 to 8 2259*0a6a1f1dSLionel Sambuc! rounds inlined for alignment purposes 2260*0a6a1f1dSLionel Sambuc 2261*0a6a1f1dSLionel Sambuc add global1, 768, global4 ! address sbox 4 since register used below 2262*0a6a1f1dSLionel Sambuc 2263*0a6a1f1dSLionel Sambuc 2264*0a6a1f1dSLionel Sambuc 2265*0a6a1f1dSLionel Sambuc! rounds_macro 2266*0a6a1f1dSLionel Sambuc! in5 out5 1 .ncbc.enc.1 in3 in4 2267*0a6a1f1dSLionel Sambuc 2268*0a6a1f1dSLionel Sambuc xor out5, out0, local1 2269*0a6a1f1dSLionel Sambuc 2270*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 2271*0a6a1f1dSLionel Sambuc ba .ncbc.enc.1 2272*0a6a1f1dSLionel Sambuc and local1, 252, local1 2273*0a6a1f1dSLionel Sambuc 2274*0a6a1f1dSLionel Sambuc .align 32 2275*0a6a1f1dSLionel Sambuc 2276*0a6a1f1dSLionel Sambuc.ncbc.enc.1: 2277*0a6a1f1dSLionel Sambuc ! local6 is address sbox 6 2278*0a6a1f1dSLionel Sambuc ! out3 is address sbox 8 2279*0a6a1f1dSLionel Sambuc ! out4 is loop counter 2280*0a6a1f1dSLionel Sambuc 2281*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 2282*0a6a1f1dSLionel Sambuc xor out5, out1, out1 ! 8642 2283*0a6a1f1dSLionel Sambuc xor out5, out0, out0 ! 7531 2284*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 ! fxor used for alignment 2285*0a6a1f1dSLionel Sambuc 2286*0a6a1f1dSLionel Sambuc srl out1, 4, local0 ! rotate 4 right 2287*0a6a1f1dSLionel Sambuc and out0, local5, local3 ! 3 2288*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 2289*0a6a1f1dSLionel Sambuc 2290*0a6a1f1dSLionel Sambuc ld [in3+1*8], local7 ! key 7531 next round 2291*0a6a1f1dSLionel Sambuc srl local3, 8, local3 ! 3 2292*0a6a1f1dSLionel Sambuc and local0, 252, local2 ! 2 2293*0a6a1f1dSLionel Sambuc ! fmovs %f0, %f0 2294*0a6a1f1dSLionel Sambuc 2295*0a6a1f1dSLionel Sambuc ld [global3+local3],local3 ! 3 2296*0a6a1f1dSLionel Sambuc sll out1, 28, out1 ! rotate 2297*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 1 finished, local1 now sbox 7 2298*0a6a1f1dSLionel Sambuc 2299*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 ! 2 2300*0a6a1f1dSLionel Sambuc srl out0, 24, local1 ! 7 2301*0a6a1f1dSLionel Sambuc or out1, local0, out1 ! rotate 2302*0a6a1f1dSLionel Sambuc 2303*0a6a1f1dSLionel Sambuc ldub [out2+local1], local1 ! 7 (and 0xFC) 2304*0a6a1f1dSLionel Sambuc srl out1, 24, local0 ! 8 2305*0a6a1f1dSLionel Sambuc and out1, local5, local4 ! 4 2306*0a6a1f1dSLionel Sambuc 2307*0a6a1f1dSLionel Sambuc ldub [out2+local0], local0 ! 8 (and 0xFC) 2308*0a6a1f1dSLionel Sambuc srl local4, 8, local4 ! 4 2309*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 2 finished local2 now sbox 6 2310*0a6a1f1dSLionel Sambuc 2311*0a6a1f1dSLionel Sambuc ld [global4+local4],local4 ! 4 2312*0a6a1f1dSLionel Sambuc srl out1, 16, local2 ! 6 2313*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 3 finished local3 now sbox 5 2314*0a6a1f1dSLionel Sambuc 2315*0a6a1f1dSLionel Sambuc ld [out3+local0],local0 ! 8 2316*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! 6 2317*0a6a1f1dSLionel Sambuc add global1, 1536, local5 ! address sbox 7 2318*0a6a1f1dSLionel Sambuc 2319*0a6a1f1dSLionel Sambuc ld [local6+local2], local2 ! 6 2320*0a6a1f1dSLionel Sambuc srl out0, 16, local3 ! 5 2321*0a6a1f1dSLionel Sambuc xor in5, local4, in5 ! 4 finished 2322*0a6a1f1dSLionel Sambuc 2323*0a6a1f1dSLionel Sambuc ld [local5+local1],local1 ! 7 2324*0a6a1f1dSLionel Sambuc and local3, 252, local3 ! 5 2325*0a6a1f1dSLionel Sambuc xor in5, local0, in5 ! 8 finished 2326*0a6a1f1dSLionel Sambuc 2327*0a6a1f1dSLionel Sambuc ld [global5+local3],local3 ! 5 2328*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 6 finished 2329*0a6a1f1dSLionel Sambuc subcc out4, 1, out4 2330*0a6a1f1dSLionel Sambuc 2331*0a6a1f1dSLionel Sambuc ld [in3+1*8+4], out0 ! key 8642 next round 2332*0a6a1f1dSLionel Sambuc xor in5, local7, local2 ! sbox 5 next round 2333*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 7 finished 2334*0a6a1f1dSLionel Sambuc 2335*0a6a1f1dSLionel Sambuc srl local2, 16, local2 ! sbox 5 next round 2336*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 5 finished 2337*0a6a1f1dSLionel Sambuc 2338*0a6a1f1dSLionel Sambuc ld [in3+1*16+4], out1 ! key 8642 next round again 2339*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! sbox5 next round 2340*0a6a1f1dSLionel Sambuc! next round 2341*0a6a1f1dSLionel Sambuc xor in5, local7, local7 ! 7531 2342*0a6a1f1dSLionel Sambuc 2343*0a6a1f1dSLionel Sambuc ld [global5+local2], local2 ! 5 2344*0a6a1f1dSLionel Sambuc srl local7, 24, local3 ! 7 2345*0a6a1f1dSLionel Sambuc xor in5, out0, out0 ! 8642 2346*0a6a1f1dSLionel Sambuc 2347*0a6a1f1dSLionel Sambuc ldub [out2+local3], local3 ! 7 (and 0xFC) 2348*0a6a1f1dSLionel Sambuc srl out0, 4, local0 ! rotate 4 right 2349*0a6a1f1dSLionel Sambuc and local7, 252, local1 ! 1 2350*0a6a1f1dSLionel Sambuc 2351*0a6a1f1dSLionel Sambuc sll out0, 28, out0 ! rotate 2352*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 5 finished local2 used 2353*0a6a1f1dSLionel Sambuc 2354*0a6a1f1dSLionel Sambuc srl local0, 8, local4 ! 4 2355*0a6a1f1dSLionel Sambuc and local0, 252, local2 ! 2 2356*0a6a1f1dSLionel Sambuc ld [local5+local3], local3 ! 7 2357*0a6a1f1dSLionel Sambuc 2358*0a6a1f1dSLionel Sambuc srl local0, 16, local5 ! 6 2359*0a6a1f1dSLionel Sambuc or out0, local0, out0 ! rotate 2360*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 ! 2 2361*0a6a1f1dSLionel Sambuc 2362*0a6a1f1dSLionel Sambuc srl out0, 24, local0 2363*0a6a1f1dSLionel Sambuc ld [in3+1*16], out0 ! key 7531 next round 2364*0a6a1f1dSLionel Sambuc and local4, 252, local4 ! 4 2365*0a6a1f1dSLionel Sambuc 2366*0a6a1f1dSLionel Sambuc and local5, 252, local5 ! 6 2367*0a6a1f1dSLionel Sambuc ld [global4+local4], local4 ! 4 2368*0a6a1f1dSLionel Sambuc xor out5, local3, out5 ! 7 finished local3 used 2369*0a6a1f1dSLionel Sambuc 2370*0a6a1f1dSLionel Sambuc and local0, 252, local0 ! 8 2371*0a6a1f1dSLionel Sambuc ld [local6+local5], local5 ! 6 2372*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 2 finished local2 now sbox 3 2373*0a6a1f1dSLionel Sambuc 2374*0a6a1f1dSLionel Sambuc srl local7, 8, local2 ! 3 start 2375*0a6a1f1dSLionel Sambuc ld [out3+local0], local0 ! 8 2376*0a6a1f1dSLionel Sambuc xor out5, local4, out5 ! 4 finished 2377*0a6a1f1dSLionel Sambuc 2378*0a6a1f1dSLionel Sambuc and local2, 252, local2 ! 3 2379*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 ! 1 2380*0a6a1f1dSLionel Sambuc xor out5, local5, out5 ! 6 finished local5 used 2381*0a6a1f1dSLionel Sambuc 2382*0a6a1f1dSLionel Sambuc ld [global3+local2], local2 ! 3 2383*0a6a1f1dSLionel Sambuc xor out5, local0, out5 ! 8 finished 2384*0a6a1f1dSLionel Sambuc add in3, 1*16, in3 ! enc add 8, dec add -8 to key pointer 2385*0a6a1f1dSLionel Sambuc 2386*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 2387*0a6a1f1dSLionel Sambuc xor out5, out0, local4 ! sbox 1 next round 2388*0a6a1f1dSLionel Sambuc xor out5, local1, out5 ! 1 finished 2389*0a6a1f1dSLionel Sambuc 2390*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 3 finished 2391*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2392*0a6a1f1dSLionel Sambuc bne,pt %icc, .ncbc.enc.1 2393*0a6a1f1dSLionel Sambuc#else 2394*0a6a1f1dSLionel Sambuc bne .ncbc.enc.1 2395*0a6a1f1dSLionel Sambuc#endif 2396*0a6a1f1dSLionel Sambuc and local4, 252, local1 ! sbox 1 next round 2397*0a6a1f1dSLionel Sambuc 2398*0a6a1f1dSLionel Sambuc! two rounds more: 2399*0a6a1f1dSLionel Sambuc 2400*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 2401*0a6a1f1dSLionel Sambuc xor out5, out1, out1 2402*0a6a1f1dSLionel Sambuc xor out5, out0, out0 2403*0a6a1f1dSLionel Sambuc 2404*0a6a1f1dSLionel Sambuc srl out1, 4, local0 ! rotate 2405*0a6a1f1dSLionel Sambuc and out0, local5, local3 2406*0a6a1f1dSLionel Sambuc 2407*0a6a1f1dSLionel Sambuc ld [in3+1*8], local7 ! key 7531 2408*0a6a1f1dSLionel Sambuc srl local3, 8, local3 2409*0a6a1f1dSLionel Sambuc and local0, 252, local2 2410*0a6a1f1dSLionel Sambuc 2411*0a6a1f1dSLionel Sambuc ld [global3+local3],local3 2412*0a6a1f1dSLionel Sambuc sll out1, 28, out1 ! rotate 2413*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 1 finished, local1 now sbox 7 2414*0a6a1f1dSLionel Sambuc 2415*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 2416*0a6a1f1dSLionel Sambuc srl out0, 24, local1 2417*0a6a1f1dSLionel Sambuc or out1, local0, out1 ! rotate 2418*0a6a1f1dSLionel Sambuc 2419*0a6a1f1dSLionel Sambuc ldub [out2+local1], local1 2420*0a6a1f1dSLionel Sambuc srl out1, 24, local0 2421*0a6a1f1dSLionel Sambuc and out1, local5, local4 2422*0a6a1f1dSLionel Sambuc 2423*0a6a1f1dSLionel Sambuc ldub [out2+local0], local0 2424*0a6a1f1dSLionel Sambuc srl local4, 8, local4 2425*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 2 finished local2 now sbox 6 2426*0a6a1f1dSLionel Sambuc 2427*0a6a1f1dSLionel Sambuc ld [global4+local4],local4 2428*0a6a1f1dSLionel Sambuc srl out1, 16, local2 2429*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 3 finished local3 now sbox 5 2430*0a6a1f1dSLionel Sambuc 2431*0a6a1f1dSLionel Sambuc ld [out3+local0],local0 2432*0a6a1f1dSLionel Sambuc and local2, 252, local2 2433*0a6a1f1dSLionel Sambuc add global1, 1536, local5 ! address sbox 7 2434*0a6a1f1dSLionel Sambuc 2435*0a6a1f1dSLionel Sambuc ld [local6+local2], local2 2436*0a6a1f1dSLionel Sambuc srl out0, 16, local3 2437*0a6a1f1dSLionel Sambuc xor in5, local4, in5 ! 4 finished 2438*0a6a1f1dSLionel Sambuc 2439*0a6a1f1dSLionel Sambuc ld [local5+local1],local1 2440*0a6a1f1dSLionel Sambuc and local3, 252, local3 2441*0a6a1f1dSLionel Sambuc xor in5, local0, in5 2442*0a6a1f1dSLionel Sambuc 2443*0a6a1f1dSLionel Sambuc ld [global5+local3],local3 2444*0a6a1f1dSLionel Sambuc xor in5, local2, in5 ! 6 finished 2445*0a6a1f1dSLionel Sambuc cmp in2, 8 2446*0a6a1f1dSLionel Sambuc 2447*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 2448*0a6a1f1dSLionel Sambuc xor in5, local7, local2 ! sbox 5 next round 2449*0a6a1f1dSLionel Sambuc xor in5, local1, in5 ! 7 finished 2450*0a6a1f1dSLionel Sambuc 2451*0a6a1f1dSLionel Sambuc ld [in3+1*8+4], out0 2452*0a6a1f1dSLionel Sambuc srl local2, 16, local2 ! sbox 5 next round 2453*0a6a1f1dSLionel Sambuc xor in5, local3, in5 ! 5 finished 2454*0a6a1f1dSLionel Sambuc 2455*0a6a1f1dSLionel Sambuc and local2, 252, local2 2456*0a6a1f1dSLionel Sambuc! next round (two rounds more) 2457*0a6a1f1dSLionel Sambuc xor in5, local7, local7 ! 7531 2458*0a6a1f1dSLionel Sambuc 2459*0a6a1f1dSLionel Sambuc ld [global5+local2], local2 2460*0a6a1f1dSLionel Sambuc srl local7, 24, local3 2461*0a6a1f1dSLionel Sambuc xor in5, out0, out0 ! 8642 2462*0a6a1f1dSLionel Sambuc 2463*0a6a1f1dSLionel Sambuc ldub [out2+local3], local3 2464*0a6a1f1dSLionel Sambuc srl out0, 4, local0 ! rotate 2465*0a6a1f1dSLionel Sambuc and local7, 252, local1 2466*0a6a1f1dSLionel Sambuc 2467*0a6a1f1dSLionel Sambuc sll out0, 28, out0 ! rotate 2468*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 5 finished local2 used 2469*0a6a1f1dSLionel Sambuc 2470*0a6a1f1dSLionel Sambuc srl local0, 8, local4 2471*0a6a1f1dSLionel Sambuc and local0, 252, local2 2472*0a6a1f1dSLionel Sambuc ld [local5+local3], local3 2473*0a6a1f1dSLionel Sambuc 2474*0a6a1f1dSLionel Sambuc srl local0, 16, local5 2475*0a6a1f1dSLionel Sambuc or out0, local0, out0 ! rotate 2476*0a6a1f1dSLionel Sambuc ld [global2+local2], local2 2477*0a6a1f1dSLionel Sambuc 2478*0a6a1f1dSLionel Sambuc srl out0, 24, local0 2479*0a6a1f1dSLionel Sambuc ld [in4], out0 ! key next encryption/decryption 2480*0a6a1f1dSLionel Sambuc and local4, 252, local4 2481*0a6a1f1dSLionel Sambuc 2482*0a6a1f1dSLionel Sambuc and local5, 252, local5 2483*0a6a1f1dSLionel Sambuc ld [global4+local4], local4 2484*0a6a1f1dSLionel Sambuc xor out5, local3, out5 ! 7 finished local3 used 2485*0a6a1f1dSLionel Sambuc 2486*0a6a1f1dSLionel Sambuc and local0, 252, local0 2487*0a6a1f1dSLionel Sambuc ld [local6+local5], local5 2488*0a6a1f1dSLionel Sambuc xor out5, local2, out5 ! 2 finished local2 now sbox 3 2489*0a6a1f1dSLionel Sambuc 2490*0a6a1f1dSLionel Sambuc srl local7, 8, local2 ! 3 start 2491*0a6a1f1dSLionel Sambuc ld [out3+local0], local0 2492*0a6a1f1dSLionel Sambuc xor out5, local4, out5 2493*0a6a1f1dSLionel Sambuc 2494*0a6a1f1dSLionel Sambuc and local2, 252, local2 2495*0a6a1f1dSLionel Sambuc ld [global1+local1], local1 2496*0a6a1f1dSLionel Sambuc xor out5, local5, out5 ! 6 finished local5 used 2497*0a6a1f1dSLionel Sambuc 2498*0a6a1f1dSLionel Sambuc ld [global3+local2], local2 2499*0a6a1f1dSLionel Sambuc srl in5, 3, local3 2500*0a6a1f1dSLionel Sambuc xor out5, local0, out5 2501*0a6a1f1dSLionel Sambuc 2502*0a6a1f1dSLionel Sambuc ld [in4+4], out1 ! key next encryption/decryption 2503*0a6a1f1dSLionel Sambuc sll in5, 29, local4 2504*0a6a1f1dSLionel Sambuc xor out5, local1, out5 2505*0a6a1f1dSLionel Sambuc 2506*0a6a1f1dSLionel Sambuc 2507*0a6a1f1dSLionel Sambuc xor out5, local2, out5 2508*0a6a1f1dSLionel Sambuc ! include encryption ks in3 2509*0a6a1f1dSLionel Sambuc 2510*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2511*0a6a1f1dSLionel Sambuc bl,pn %icc, .ncbc.enc.next.block_fp 2512*0a6a1f1dSLionel Sambuc#else 2513*0a6a1f1dSLionel Sambuc bl .ncbc.enc.next.block_fp 2514*0a6a1f1dSLionel Sambuc#endif 2515*0a6a1f1dSLionel Sambuc add in0, 8, in0 ! input address 2516*0a6a1f1dSLionel Sambuc 2517*0a6a1f1dSLionel Sambuc ! If 8 or more bytes are to be encrypted after this block, 2518*0a6a1f1dSLionel Sambuc ! we combine final permutation for this block with initial 2519*0a6a1f1dSLionel Sambuc ! permutation for next block. Load next block: 2520*0a6a1f1dSLionel Sambuc 2521*0a6a1f1dSLionel Sambuc 2522*0a6a1f1dSLionel Sambuc 2523*0a6a1f1dSLionel Sambuc! load_little_endian 2524*0a6a1f1dSLionel Sambuc! in0 global3 global4 local5 .LLE12 2525*0a6a1f1dSLionel Sambuc 2526*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 2527*0a6a1f1dSLionel Sambuc 2528*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2529*0a6a1f1dSLionel Sambuc andcc in0, 3, global0 2530*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE12 2531*0a6a1f1dSLionel Sambuc nop 2532*0a6a1f1dSLionel Sambuc 2533*0a6a1f1dSLionel Sambuc lda [in0] 0x88, global3 2534*0a6a1f1dSLionel Sambuc add in0, 4, local5 2535*0a6a1f1dSLionel Sambuc 2536*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE12a 2537*0a6a1f1dSLionel Sambuc lda [local5] 0x88, global4 2538*0a6a1f1dSLionel Sambuc#endif 2539*0a6a1f1dSLionel Sambuc 2540*0a6a1f1dSLionel Sambuc.LLE12: 2541*0a6a1f1dSLionel Sambuc ldub [in0+3], global3 2542*0a6a1f1dSLionel Sambuc 2543*0a6a1f1dSLionel Sambuc ldub [in0+2], local5 2544*0a6a1f1dSLionel Sambuc sll global3, 8, global3 2545*0a6a1f1dSLionel Sambuc or global3, local5, global3 2546*0a6a1f1dSLionel Sambuc 2547*0a6a1f1dSLionel Sambuc ldub [in0+1], local5 2548*0a6a1f1dSLionel Sambuc sll global3, 8, global3 2549*0a6a1f1dSLionel Sambuc or global3, local5, global3 2550*0a6a1f1dSLionel Sambuc 2551*0a6a1f1dSLionel Sambuc ldub [in0+0], local5 2552*0a6a1f1dSLionel Sambuc sll global3, 8, global3 2553*0a6a1f1dSLionel Sambuc or global3, local5, global3 2554*0a6a1f1dSLionel Sambuc 2555*0a6a1f1dSLionel Sambuc 2556*0a6a1f1dSLionel Sambuc ldub [in0+3+4], global4 2557*0a6a1f1dSLionel Sambuc 2558*0a6a1f1dSLionel Sambuc ldub [in0+2+4], local5 2559*0a6a1f1dSLionel Sambuc sll global4, 8, global4 2560*0a6a1f1dSLionel Sambuc or global4, local5, global4 2561*0a6a1f1dSLionel Sambuc 2562*0a6a1f1dSLionel Sambuc ldub [in0+1+4], local5 2563*0a6a1f1dSLionel Sambuc sll global4, 8, global4 2564*0a6a1f1dSLionel Sambuc or global4, local5, global4 2565*0a6a1f1dSLionel Sambuc 2566*0a6a1f1dSLionel Sambuc ldub [in0+0+4], local5 2567*0a6a1f1dSLionel Sambuc sll global4, 8, global4 2568*0a6a1f1dSLionel Sambuc or global4, local5, global4 2569*0a6a1f1dSLionel Sambuc.LLE12a: 2570*0a6a1f1dSLionel Sambuc 2571*0a6a1f1dSLionel Sambuc 2572*0a6a1f1dSLionel Sambuc 2573*0a6a1f1dSLionel Sambuc ! parameter 1 original left 2574*0a6a1f1dSLionel Sambuc ! parameter 2 original right 2575*0a6a1f1dSLionel Sambuc ! parameter 3 left ip 2576*0a6a1f1dSLionel Sambuc ! parameter 4 right ip 2577*0a6a1f1dSLionel Sambuc ! parameter 5 1: load ks1/ks2 to in3/in4, add 120 to in4 2578*0a6a1f1dSLionel Sambuc ! 2: mov in4 to in3 2579*0a6a1f1dSLionel Sambuc ! 2580*0a6a1f1dSLionel Sambuc ! also adds -8 to length in2 and loads loop counter to out4 2581*0a6a1f1dSLionel Sambuc 2582*0a6a1f1dSLionel Sambuc 2583*0a6a1f1dSLionel Sambuc 2584*0a6a1f1dSLionel Sambuc! fp_ip_macro 2585*0a6a1f1dSLionel Sambuc! out0 out1 global3 global4 2 2586*0a6a1f1dSLionel Sambuc 2587*0a6a1f1dSLionel Sambuc 2588*0a6a1f1dSLionel Sambuc 2589*0a6a1f1dSLionel Sambuc 2590*0a6a1f1dSLionel Sambuc 2591*0a6a1f1dSLionel Sambuc 2592*0a6a1f1dSLionel Sambuc 2593*0a6a1f1dSLionel Sambuc 2594*0a6a1f1dSLionel Sambuc 2595*0a6a1f1dSLionel Sambuc ! out0 in local3, local4 2596*0a6a1f1dSLionel Sambuc 2597*0a6a1f1dSLionel Sambuc ld [out2+256], local1 2598*0a6a1f1dSLionel Sambuc sll out5, 29, out4 2599*0a6a1f1dSLionel Sambuc or local3, local4, out0 2600*0a6a1f1dSLionel Sambuc 2601*0a6a1f1dSLionel Sambuc srl out5, 3, out1 2602*0a6a1f1dSLionel Sambuc mov in4, in3 2603*0a6a1f1dSLionel Sambuc 2604*0a6a1f1dSLionel Sambuc ld [out2+272], local5 2605*0a6a1f1dSLionel Sambuc srl global4, 4, local0 2606*0a6a1f1dSLionel Sambuc or out1, out4, out1 2607*0a6a1f1dSLionel Sambuc 2608*0a6a1f1dSLionel Sambuc srl out1, 1, out4 2609*0a6a1f1dSLionel Sambuc xor out4, out0, out4 2610*0a6a1f1dSLionel Sambuc 2611*0a6a1f1dSLionel Sambuc and out4, local5, out4 2612*0a6a1f1dSLionel Sambuc xor local0, global3, local0 2613*0a6a1f1dSLionel Sambuc 2614*0a6a1f1dSLionel Sambuc sll out4, 1, local3 2615*0a6a1f1dSLionel Sambuc xor out0, out4, out0 2616*0a6a1f1dSLionel Sambuc 2617*0a6a1f1dSLionel Sambuc and local0, local1, local0 2618*0a6a1f1dSLionel Sambuc add in2, -8, in2 2619*0a6a1f1dSLionel Sambuc 2620*0a6a1f1dSLionel Sambuc sll local0, 4, local7 2621*0a6a1f1dSLionel Sambuc xor global3, local0, global3 2622*0a6a1f1dSLionel Sambuc 2623*0a6a1f1dSLionel Sambuc ld [out2+268], local4 2624*0a6a1f1dSLionel Sambuc srl out0, 8, out4 2625*0a6a1f1dSLionel Sambuc xor out1, local3, out1 2626*0a6a1f1dSLionel Sambuc ld [out2+260], local2 2627*0a6a1f1dSLionel Sambuc srl global3, 16, local0 2628*0a6a1f1dSLionel Sambuc xor global4, local7, global4 2629*0a6a1f1dSLionel Sambuc xor out4, out1, out4 2630*0a6a1f1dSLionel Sambuc xor local0, global4, local0 2631*0a6a1f1dSLionel Sambuc and out4, local4, out4 2632*0a6a1f1dSLionel Sambuc and local0, local2, local0 2633*0a6a1f1dSLionel Sambuc sll out4, 8, local3 2634*0a6a1f1dSLionel Sambuc xor out1, out4, out1 2635*0a6a1f1dSLionel Sambuc sll local0, 16, local7 2636*0a6a1f1dSLionel Sambuc xor global4, local0, global4 2637*0a6a1f1dSLionel Sambuc 2638*0a6a1f1dSLionel Sambuc srl out1, 2, out4 2639*0a6a1f1dSLionel Sambuc xor out0, local3, out0 2640*0a6a1f1dSLionel Sambuc 2641*0a6a1f1dSLionel Sambuc ld [out2+264], local3 ! ip3 2642*0a6a1f1dSLionel Sambuc srl global4, 2, local0 2643*0a6a1f1dSLionel Sambuc xor global3, local7, global3 2644*0a6a1f1dSLionel Sambuc xor out4, out0, out4 2645*0a6a1f1dSLionel Sambuc xor local0, global3, local0 2646*0a6a1f1dSLionel Sambuc and out4, local3, out4 2647*0a6a1f1dSLionel Sambuc and local0, local3, local0 2648*0a6a1f1dSLionel Sambuc sll out4, 2, local3 2649*0a6a1f1dSLionel Sambuc xor out0, out4, out0 2650*0a6a1f1dSLionel Sambuc sll local0, 2, local7 2651*0a6a1f1dSLionel Sambuc xor global3, local0, global3 2652*0a6a1f1dSLionel Sambuc 2653*0a6a1f1dSLionel Sambuc srl out0, 16, out4 2654*0a6a1f1dSLionel Sambuc xor out1, local3, out1 2655*0a6a1f1dSLionel Sambuc srl global3, 8, local0 2656*0a6a1f1dSLionel Sambuc xor global4, local7, global4 2657*0a6a1f1dSLionel Sambuc xor out4, out1, out4 2658*0a6a1f1dSLionel Sambuc xor local0, global4, local0 2659*0a6a1f1dSLionel Sambuc and out4, local2, out4 2660*0a6a1f1dSLionel Sambuc and local0, local4, local0 2661*0a6a1f1dSLionel Sambuc sll out4, 16, local3 2662*0a6a1f1dSLionel Sambuc xor out1, out4, local4 2663*0a6a1f1dSLionel Sambuc sll local0, 8, local7 2664*0a6a1f1dSLionel Sambuc xor global4, local0, global4 2665*0a6a1f1dSLionel Sambuc 2666*0a6a1f1dSLionel Sambuc srl global4, 1, local0 2667*0a6a1f1dSLionel Sambuc xor global3, local7, global3 2668*0a6a1f1dSLionel Sambuc 2669*0a6a1f1dSLionel Sambuc srl local4, 4, out4 2670*0a6a1f1dSLionel Sambuc xor local0, global3, local0 2671*0a6a1f1dSLionel Sambuc 2672*0a6a1f1dSLionel Sambuc xor out0, local3, out0 2673*0a6a1f1dSLionel Sambuc and local0, local5, local0 2674*0a6a1f1dSLionel Sambuc 2675*0a6a1f1dSLionel Sambuc sll local0, 1, local7 2676*0a6a1f1dSLionel Sambuc xor out4, out0, out4 2677*0a6a1f1dSLionel Sambuc 2678*0a6a1f1dSLionel Sambuc xor global3, local0, global3 2679*0a6a1f1dSLionel Sambuc xor global4, local7, global4 2680*0a6a1f1dSLionel Sambuc 2681*0a6a1f1dSLionel Sambuc sll global3, 3, local5 2682*0a6a1f1dSLionel Sambuc and out4, local1, out4 2683*0a6a1f1dSLionel Sambuc 2684*0a6a1f1dSLionel Sambuc sll out4, 4, local3 2685*0a6a1f1dSLionel Sambuc xor out0, out4, out0 2686*0a6a1f1dSLionel Sambuc 2687*0a6a1f1dSLionel Sambuc 2688*0a6a1f1dSLionel Sambuc sll global4, 3, local2 2689*0a6a1f1dSLionel Sambuc xor local4, local3, out1 2690*0a6a1f1dSLionel Sambuc 2691*0a6a1f1dSLionel Sambuc ! reload since used as temporar: 2692*0a6a1f1dSLionel Sambuc 2693*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 2694*0a6a1f1dSLionel Sambuc 2695*0a6a1f1dSLionel Sambuc srl global3, 29, local0 2696*0a6a1f1dSLionel Sambuc 2697*0a6a1f1dSLionel Sambuc 2698*0a6a1f1dSLionel Sambuc 2699*0a6a1f1dSLionel Sambuc srl global4, 29, local7 2700*0a6a1f1dSLionel Sambuc 2701*0a6a1f1dSLionel Sambuc or local0, local5, global4 2702*0a6a1f1dSLionel Sambuc or local2, local7, global3 2703*0a6a1f1dSLionel Sambuc 2704*0a6a1f1dSLionel Sambuc 2705*0a6a1f1dSLionel Sambuc 2706*0a6a1f1dSLionel Sambuc 2707*0a6a1f1dSLionel Sambuc 2708*0a6a1f1dSLionel Sambuc! store_little_endian 2709*0a6a1f1dSLionel Sambuc! in1 out0 out1 local3 .SLE10 2710*0a6a1f1dSLionel Sambuc 2711*0a6a1f1dSLionel Sambuc ! rightmost in register to first in memory 2712*0a6a1f1dSLionel Sambuc 2713*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2714*0a6a1f1dSLionel Sambuc andcc in1, 3, global0 2715*0a6a1f1dSLionel Sambuc bne,pn %icc, .SLE10 2716*0a6a1f1dSLionel Sambuc nop 2717*0a6a1f1dSLionel Sambuc 2718*0a6a1f1dSLionel Sambuc sta out0, [in1] 0x88 2719*0a6a1f1dSLionel Sambuc add in1, 4, local3 2720*0a6a1f1dSLionel Sambuc 2721*0a6a1f1dSLionel Sambuc ba,pt %icc, .SLE10a 2722*0a6a1f1dSLionel Sambuc sta out1, [local3] 0x88 2723*0a6a1f1dSLionel Sambuc#endif 2724*0a6a1f1dSLionel Sambuc 2725*0a6a1f1dSLionel Sambuc.SLE10: 2726*0a6a1f1dSLionel Sambuc and out0, 255, local3 2727*0a6a1f1dSLionel Sambuc stub local3, [in1+0] 2728*0a6a1f1dSLionel Sambuc 2729*0a6a1f1dSLionel Sambuc srl out0, 8, local3 2730*0a6a1f1dSLionel Sambuc and local3, 255, local3 2731*0a6a1f1dSLionel Sambuc stub local3, [in1+1] 2732*0a6a1f1dSLionel Sambuc 2733*0a6a1f1dSLionel Sambuc srl out0, 16, local3 2734*0a6a1f1dSLionel Sambuc and local3, 255, local3 2735*0a6a1f1dSLionel Sambuc stub local3, [in1+2] 2736*0a6a1f1dSLionel Sambuc 2737*0a6a1f1dSLionel Sambuc srl out0, 24, local3 2738*0a6a1f1dSLionel Sambuc stub local3, [in1+3] 2739*0a6a1f1dSLionel Sambuc 2740*0a6a1f1dSLionel Sambuc 2741*0a6a1f1dSLionel Sambuc and out1, 255, local3 2742*0a6a1f1dSLionel Sambuc stub local3, [in1+0+4] 2743*0a6a1f1dSLionel Sambuc 2744*0a6a1f1dSLionel Sambuc srl out1, 8, local3 2745*0a6a1f1dSLionel Sambuc and local3, 255, local3 2746*0a6a1f1dSLionel Sambuc stub local3, [in1+1+4] 2747*0a6a1f1dSLionel Sambuc 2748*0a6a1f1dSLionel Sambuc srl out1, 16, local3 2749*0a6a1f1dSLionel Sambuc and local3, 255, local3 2750*0a6a1f1dSLionel Sambuc stub local3, [in1+2+4] 2751*0a6a1f1dSLionel Sambuc 2752*0a6a1f1dSLionel Sambuc srl out1, 24, local3 2753*0a6a1f1dSLionel Sambuc stub local3, [in1+3+4] 2754*0a6a1f1dSLionel Sambuc 2755*0a6a1f1dSLionel Sambuc.SLE10a: 2756*0a6a1f1dSLionel Sambuc 2757*0a6a1f1dSLionel Sambuc ! block 2758*0a6a1f1dSLionel Sambuc 2759*0a6a1f1dSLionel Sambuc ld [in3], out0 ! key 7531 first round next block 2760*0a6a1f1dSLionel Sambuc mov in5, local1 2761*0a6a1f1dSLionel Sambuc xor global3, out5, in5 ! iv xor next block 2762*0a6a1f1dSLionel Sambuc 2763*0a6a1f1dSLionel Sambuc ld [in3+4], out1 ! key 8642 2764*0a6a1f1dSLionel Sambuc add global1, 512, global3 ! address sbox 3 since register used 2765*0a6a1f1dSLionel Sambuc xor global4, local1, out5 ! iv xor next block 2766*0a6a1f1dSLionel Sambuc 2767*0a6a1f1dSLionel Sambuc ba .ncbc.enc.next.block_2 2768*0a6a1f1dSLionel Sambuc add in1, 8, in1 ! output adress 2769*0a6a1f1dSLionel Sambuc 2770*0a6a1f1dSLionel Sambuc.ncbc.enc.next.block_fp: 2771*0a6a1f1dSLionel Sambuc 2772*0a6a1f1dSLionel Sambuc 2773*0a6a1f1dSLionel Sambuc 2774*0a6a1f1dSLionel Sambuc! fp_macro 2775*0a6a1f1dSLionel Sambuc! in5 out5 2776*0a6a1f1dSLionel Sambuc 2777*0a6a1f1dSLionel Sambuc ! initially undo the rotate 3 left done after initial permutation 2778*0a6a1f1dSLionel Sambuc ! original left is received shifted 3 right and 29 left in local3/4 2779*0a6a1f1dSLionel Sambuc 2780*0a6a1f1dSLionel Sambuc sll out5, 29, local1 2781*0a6a1f1dSLionel Sambuc or local3, local4, in5 2782*0a6a1f1dSLionel Sambuc 2783*0a6a1f1dSLionel Sambuc srl out5, 3, out5 2784*0a6a1f1dSLionel Sambuc sethi %hi(0x55555555), local2 2785*0a6a1f1dSLionel Sambuc 2786*0a6a1f1dSLionel Sambuc or out5, local1, out5 2787*0a6a1f1dSLionel Sambuc or local2, %lo(0x55555555), local2 2788*0a6a1f1dSLionel Sambuc 2789*0a6a1f1dSLionel Sambuc srl out5, 1, local3 2790*0a6a1f1dSLionel Sambuc sethi %hi(0x00ff00ff), local1 2791*0a6a1f1dSLionel Sambuc xor local3, in5, local3 2792*0a6a1f1dSLionel Sambuc or local1, %lo(0x00ff00ff), local1 2793*0a6a1f1dSLionel Sambuc and local3, local2, local3 2794*0a6a1f1dSLionel Sambuc sethi %hi(0x33333333), local4 2795*0a6a1f1dSLionel Sambuc sll local3, 1, local2 2796*0a6a1f1dSLionel Sambuc 2797*0a6a1f1dSLionel Sambuc xor in5, local3, in5 2798*0a6a1f1dSLionel Sambuc 2799*0a6a1f1dSLionel Sambuc srl in5, 8, local3 2800*0a6a1f1dSLionel Sambuc xor out5, local2, out5 2801*0a6a1f1dSLionel Sambuc xor local3, out5, local3 2802*0a6a1f1dSLionel Sambuc or local4, %lo(0x33333333), local4 2803*0a6a1f1dSLionel Sambuc and local3, local1, local3 2804*0a6a1f1dSLionel Sambuc sethi %hi(0x0000ffff), local1 2805*0a6a1f1dSLionel Sambuc sll local3, 8, local2 2806*0a6a1f1dSLionel Sambuc 2807*0a6a1f1dSLionel Sambuc xor out5, local3, out5 2808*0a6a1f1dSLionel Sambuc 2809*0a6a1f1dSLionel Sambuc srl out5, 2, local3 2810*0a6a1f1dSLionel Sambuc xor in5, local2, in5 2811*0a6a1f1dSLionel Sambuc xor local3, in5, local3 2812*0a6a1f1dSLionel Sambuc or local1, %lo(0x0000ffff), local1 2813*0a6a1f1dSLionel Sambuc and local3, local4, local3 2814*0a6a1f1dSLionel Sambuc sethi %hi(0x0f0f0f0f), local4 2815*0a6a1f1dSLionel Sambuc sll local3, 2, local2 2816*0a6a1f1dSLionel Sambuc 2817*0a6a1f1dSLionel Sambuc 2818*0a6a1f1dSLionel Sambuc xor in5, local3, in5 2819*0a6a1f1dSLionel Sambuc 2820*0a6a1f1dSLionel Sambuc 2821*0a6a1f1dSLionel Sambuc srl in5, 16, local3 2822*0a6a1f1dSLionel Sambuc xor out5, local2, out5 2823*0a6a1f1dSLionel Sambuc xor local3, out5, local3 2824*0a6a1f1dSLionel Sambuc or local4, %lo(0x0f0f0f0f), local4 2825*0a6a1f1dSLionel Sambuc and local3, local1, local3 2826*0a6a1f1dSLionel Sambuc sll local3, 16, local2 2827*0a6a1f1dSLionel Sambuc 2828*0a6a1f1dSLionel Sambuc xor out5, local3, local1 2829*0a6a1f1dSLionel Sambuc 2830*0a6a1f1dSLionel Sambuc srl local1, 4, local3 2831*0a6a1f1dSLionel Sambuc xor in5, local2, in5 2832*0a6a1f1dSLionel Sambuc xor local3, in5, local3 2833*0a6a1f1dSLionel Sambuc and local3, local4, local3 2834*0a6a1f1dSLionel Sambuc sll local3, 4, local2 2835*0a6a1f1dSLionel Sambuc 2836*0a6a1f1dSLionel Sambuc xor in5, local3, in5 2837*0a6a1f1dSLionel Sambuc 2838*0a6a1f1dSLionel Sambuc ! optional store: 2839*0a6a1f1dSLionel Sambuc 2840*0a6a1f1dSLionel Sambuc 2841*0a6a1f1dSLionel Sambuc 2842*0a6a1f1dSLionel Sambuc xor local1, local2, out5 2843*0a6a1f1dSLionel Sambuc 2844*0a6a1f1dSLionel Sambuc 2845*0a6a1f1dSLionel Sambuc 2846*0a6a1f1dSLionel Sambuc 2847*0a6a1f1dSLionel Sambuc 2848*0a6a1f1dSLionel Sambuc 2849*0a6a1f1dSLionel Sambuc 2850*0a6a1f1dSLionel Sambuc! store_little_endian 2851*0a6a1f1dSLionel Sambuc! in1 in5 out5 local3 .SLE1 2852*0a6a1f1dSLionel Sambuc 2853*0a6a1f1dSLionel Sambuc ! rightmost in register to first in memory 2854*0a6a1f1dSLionel Sambuc 2855*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2856*0a6a1f1dSLionel Sambuc andcc in1, 3, global0 2857*0a6a1f1dSLionel Sambuc bne,pn %icc, .SLE1 2858*0a6a1f1dSLionel Sambuc nop 2859*0a6a1f1dSLionel Sambuc 2860*0a6a1f1dSLionel Sambuc sta in5, [in1] 0x88 2861*0a6a1f1dSLionel Sambuc add in1, 4, local3 2862*0a6a1f1dSLionel Sambuc 2863*0a6a1f1dSLionel Sambuc ba,pt %icc, .SLE1a 2864*0a6a1f1dSLionel Sambuc sta out5, [local3] 0x88 2865*0a6a1f1dSLionel Sambuc#endif 2866*0a6a1f1dSLionel Sambuc 2867*0a6a1f1dSLionel Sambuc.SLE1: 2868*0a6a1f1dSLionel Sambuc and in5, 255, local3 2869*0a6a1f1dSLionel Sambuc stub local3, [in1+0] 2870*0a6a1f1dSLionel Sambuc 2871*0a6a1f1dSLionel Sambuc srl in5, 8, local3 2872*0a6a1f1dSLionel Sambuc and local3, 255, local3 2873*0a6a1f1dSLionel Sambuc stub local3, [in1+1] 2874*0a6a1f1dSLionel Sambuc 2875*0a6a1f1dSLionel Sambuc srl in5, 16, local3 2876*0a6a1f1dSLionel Sambuc and local3, 255, local3 2877*0a6a1f1dSLionel Sambuc stub local3, [in1+2] 2878*0a6a1f1dSLionel Sambuc 2879*0a6a1f1dSLionel Sambuc srl in5, 24, local3 2880*0a6a1f1dSLionel Sambuc stub local3, [in1+3] 2881*0a6a1f1dSLionel Sambuc 2882*0a6a1f1dSLionel Sambuc 2883*0a6a1f1dSLionel Sambuc and out5, 255, local3 2884*0a6a1f1dSLionel Sambuc stub local3, [in1+0+4] 2885*0a6a1f1dSLionel Sambuc 2886*0a6a1f1dSLionel Sambuc srl out5, 8, local3 2887*0a6a1f1dSLionel Sambuc and local3, 255, local3 2888*0a6a1f1dSLionel Sambuc stub local3, [in1+1+4] 2889*0a6a1f1dSLionel Sambuc 2890*0a6a1f1dSLionel Sambuc srl out5, 16, local3 2891*0a6a1f1dSLionel Sambuc and local3, 255, local3 2892*0a6a1f1dSLionel Sambuc stub local3, [in1+2+4] 2893*0a6a1f1dSLionel Sambuc 2894*0a6a1f1dSLionel Sambuc srl out5, 24, local3 2895*0a6a1f1dSLionel Sambuc stub local3, [in1+3+4] 2896*0a6a1f1dSLionel Sambuc 2897*0a6a1f1dSLionel Sambuc.SLE1a: 2898*0a6a1f1dSLionel Sambuc 2899*0a6a1f1dSLionel Sambuc ! block 2900*0a6a1f1dSLionel Sambuc 2901*0a6a1f1dSLionel Sambuc addcc in2, -8, in2 ! bytes missing when next block done 2902*0a6a1f1dSLionel Sambuc 2903*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2904*0a6a1f1dSLionel Sambuc bpos,pt %icc, .ncbc.enc.next.block ! also jumps if 0 2905*0a6a1f1dSLionel Sambuc#else 2906*0a6a1f1dSLionel Sambuc bpos .ncbc.enc.next.block 2907*0a6a1f1dSLionel Sambuc#endif 2908*0a6a1f1dSLionel Sambuc add in1, 8, in1 2909*0a6a1f1dSLionel Sambuc 2910*0a6a1f1dSLionel Sambuc.ncbc.enc.seven.or.less: 2911*0a6a1f1dSLionel Sambuc 2912*0a6a1f1dSLionel Sambuc cmp in2, -8 2913*0a6a1f1dSLionel Sambuc 2914*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2915*0a6a1f1dSLionel Sambuc ble,pt %icc, .ncbc.enc.finish 2916*0a6a1f1dSLionel Sambuc#else 2917*0a6a1f1dSLionel Sambuc ble .ncbc.enc.finish 2918*0a6a1f1dSLionel Sambuc#endif 2919*0a6a1f1dSLionel Sambuc nop 2920*0a6a1f1dSLionel Sambuc 2921*0a6a1f1dSLionel Sambuc add in2, 8, local1 ! bytes to load 2922*0a6a1f1dSLionel Sambuc 2923*0a6a1f1dSLionel Sambuc ! addr, length, dest left, dest right, temp, local3, label, ret label 2924*0a6a1f1dSLionel Sambuc 2925*0a6a1f1dSLionel Sambuc 2926*0a6a1f1dSLionel Sambuc! load_n_bytes 2927*0a6a1f1dSLionel Sambuc! in0 local1 local2 local3 .LNB1 .ncbc.enc.next.block_1 .LNB1 .ncbc.enc.next.block_1 2928*0a6a1f1dSLionel Sambuc 2929*0a6a1f1dSLionel Sambuc.LNB1.0: call .+8 2930*0a6a1f1dSLionel Sambuc sll local1, 2, local3 2931*0a6a1f1dSLionel Sambuc 2932*0a6a1f1dSLionel Sambuc add %o7,.LNB1.jmp.table-.LNB1.0,local2 2933*0a6a1f1dSLionel Sambuc 2934*0a6a1f1dSLionel Sambuc add local2, local3, local2 2935*0a6a1f1dSLionel Sambuc mov 0, out4 2936*0a6a1f1dSLionel Sambuc 2937*0a6a1f1dSLionel Sambuc ld [local2], local2 2938*0a6a1f1dSLionel Sambuc 2939*0a6a1f1dSLionel Sambuc jmp %o7+local2 2940*0a6a1f1dSLionel Sambuc mov 0, global4 2941*0a6a1f1dSLionel Sambuc 2942*0a6a1f1dSLionel Sambuc.LNB1.7: 2943*0a6a1f1dSLionel Sambuc ldub [in0+6], local2 2944*0a6a1f1dSLionel Sambuc sll local2, 16, local2 2945*0a6a1f1dSLionel Sambuc or global4, local2, global4 2946*0a6a1f1dSLionel Sambuc.LNB1.6: 2947*0a6a1f1dSLionel Sambuc ldub [in0+5], local2 2948*0a6a1f1dSLionel Sambuc sll local2, 8, local2 2949*0a6a1f1dSLionel Sambuc or global4, local2, global4 2950*0a6a1f1dSLionel Sambuc.LNB1.5: 2951*0a6a1f1dSLionel Sambuc ldub [in0+4], local2 2952*0a6a1f1dSLionel Sambuc or global4, local2, global4 2953*0a6a1f1dSLionel Sambuc.LNB1.4: 2954*0a6a1f1dSLionel Sambuc ldub [in0+3], local2 2955*0a6a1f1dSLionel Sambuc sll local2, 24, local2 2956*0a6a1f1dSLionel Sambuc or out4, local2, out4 2957*0a6a1f1dSLionel Sambuc.LNB1.3: 2958*0a6a1f1dSLionel Sambuc ldub [in0+2], local2 2959*0a6a1f1dSLionel Sambuc sll local2, 16, local2 2960*0a6a1f1dSLionel Sambuc or out4, local2, out4 2961*0a6a1f1dSLionel Sambuc.LNB1.2: 2962*0a6a1f1dSLionel Sambuc ldub [in0+1], local2 2963*0a6a1f1dSLionel Sambuc sll local2, 8, local2 2964*0a6a1f1dSLionel Sambuc or out4, local2, out4 2965*0a6a1f1dSLionel Sambuc.LNB1.1: 2966*0a6a1f1dSLionel Sambuc ldub [in0+0], local2 2967*0a6a1f1dSLionel Sambuc ba .ncbc.enc.next.block_1 2968*0a6a1f1dSLionel Sambuc or out4, local2, out4 2969*0a6a1f1dSLionel Sambuc 2970*0a6a1f1dSLionel Sambuc .align 4 2971*0a6a1f1dSLionel Sambuc 2972*0a6a1f1dSLionel Sambuc.LNB1.jmp.table: 2973*0a6a1f1dSLionel Sambuc .word 0 2974*0a6a1f1dSLionel Sambuc .word .LNB1.1-.LNB1.0 2975*0a6a1f1dSLionel Sambuc .word .LNB1.2-.LNB1.0 2976*0a6a1f1dSLionel Sambuc .word .LNB1.3-.LNB1.0 2977*0a6a1f1dSLionel Sambuc .word .LNB1.4-.LNB1.0 2978*0a6a1f1dSLionel Sambuc .word .LNB1.5-.LNB1.0 2979*0a6a1f1dSLionel Sambuc .word .LNB1.6-.LNB1.0 2980*0a6a1f1dSLionel Sambuc .word .LNB1.7-.LNB1.0 2981*0a6a1f1dSLionel Sambuc 2982*0a6a1f1dSLionel Sambuc 2983*0a6a1f1dSLionel Sambuc ! Loads 1 to 7 bytes little endian to global4, out4 2984*0a6a1f1dSLionel Sambuc 2985*0a6a1f1dSLionel Sambuc 2986*0a6a1f1dSLionel Sambuc.ncbc.enc.finish: 2987*0a6a1f1dSLionel Sambuc 2988*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+4*ARGSZ] , local4 2989*0a6a1f1dSLionel Sambuc 2990*0a6a1f1dSLionel Sambuc 2991*0a6a1f1dSLionel Sambuc! store_little_endian 2992*0a6a1f1dSLionel Sambuc! local4 in5 out5 local5 .SLE2 2993*0a6a1f1dSLionel Sambuc 2994*0a6a1f1dSLionel Sambuc ! rightmost in register to first in memory 2995*0a6a1f1dSLionel Sambuc 2996*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 2997*0a6a1f1dSLionel Sambuc andcc local4, 3, global0 2998*0a6a1f1dSLionel Sambuc bne,pn %icc, .SLE2 2999*0a6a1f1dSLionel Sambuc nop 3000*0a6a1f1dSLionel Sambuc 3001*0a6a1f1dSLionel Sambuc sta in5, [local4] 0x88 3002*0a6a1f1dSLionel Sambuc add local4, 4, local5 3003*0a6a1f1dSLionel Sambuc 3004*0a6a1f1dSLionel Sambuc ba,pt %icc, .SLE2a 3005*0a6a1f1dSLionel Sambuc sta out5, [local5] 0x88 3006*0a6a1f1dSLionel Sambuc#endif 3007*0a6a1f1dSLionel Sambuc 3008*0a6a1f1dSLionel Sambuc.SLE2: 3009*0a6a1f1dSLionel Sambuc and in5, 255, local5 3010*0a6a1f1dSLionel Sambuc stub local5, [local4+0] 3011*0a6a1f1dSLionel Sambuc 3012*0a6a1f1dSLionel Sambuc srl in5, 8, local5 3013*0a6a1f1dSLionel Sambuc and local5, 255, local5 3014*0a6a1f1dSLionel Sambuc stub local5, [local4+1] 3015*0a6a1f1dSLionel Sambuc 3016*0a6a1f1dSLionel Sambuc srl in5, 16, local5 3017*0a6a1f1dSLionel Sambuc and local5, 255, local5 3018*0a6a1f1dSLionel Sambuc stub local5, [local4+2] 3019*0a6a1f1dSLionel Sambuc 3020*0a6a1f1dSLionel Sambuc srl in5, 24, local5 3021*0a6a1f1dSLionel Sambuc stub local5, [local4+3] 3022*0a6a1f1dSLionel Sambuc 3023*0a6a1f1dSLionel Sambuc 3024*0a6a1f1dSLionel Sambuc and out5, 255, local5 3025*0a6a1f1dSLionel Sambuc stub local5, [local4+0+4] 3026*0a6a1f1dSLionel Sambuc 3027*0a6a1f1dSLionel Sambuc srl out5, 8, local5 3028*0a6a1f1dSLionel Sambuc and local5, 255, local5 3029*0a6a1f1dSLionel Sambuc stub local5, [local4+1+4] 3030*0a6a1f1dSLionel Sambuc 3031*0a6a1f1dSLionel Sambuc srl out5, 16, local5 3032*0a6a1f1dSLionel Sambuc and local5, 255, local5 3033*0a6a1f1dSLionel Sambuc stub local5, [local4+2+4] 3034*0a6a1f1dSLionel Sambuc 3035*0a6a1f1dSLionel Sambuc srl out5, 24, local5 3036*0a6a1f1dSLionel Sambuc stub local5, [local4+3+4] 3037*0a6a1f1dSLionel Sambuc 3038*0a6a1f1dSLionel Sambuc.SLE2a: 3039*0a6a1f1dSLionel Sambuc 3040*0a6a1f1dSLionel Sambuc ! ivec 3041*0a6a1f1dSLionel Sambuc 3042*0a6a1f1dSLionel Sambuc ret 3043*0a6a1f1dSLionel Sambuc restore 3044*0a6a1f1dSLionel Sambuc 3045*0a6a1f1dSLionel Sambuc 3046*0a6a1f1dSLionel Sambuc.ncbc.dec: 3047*0a6a1f1dSLionel Sambuc 3048*0a6a1f1dSLionel Sambuc STPTR in0, [%sp+BIAS+ARG0+0*ARGSZ] 3049*0a6a1f1dSLionel Sambuc cmp in2, 0 ! length 3050*0a6a1f1dSLionel Sambuc add in3, 120, in3 3051*0a6a1f1dSLionel Sambuc 3052*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+4*ARGSZ] , local7 ! ivec 3053*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3054*0a6a1f1dSLionel Sambuc ble,pn %icc, .ncbc.dec.finish 3055*0a6a1f1dSLionel Sambuc#else 3056*0a6a1f1dSLionel Sambuc ble .ncbc.dec.finish 3057*0a6a1f1dSLionel Sambuc#endif 3058*0a6a1f1dSLionel Sambuc mov in3, in4 ! schedule 3059*0a6a1f1dSLionel Sambuc 3060*0a6a1f1dSLionel Sambuc STPTR in1, [%sp+BIAS+ARG0+1*ARGSZ] 3061*0a6a1f1dSLionel Sambuc mov in0, local5 ! input 3062*0a6a1f1dSLionel Sambuc 3063*0a6a1f1dSLionel Sambuc 3064*0a6a1f1dSLionel Sambuc 3065*0a6a1f1dSLionel Sambuc! load_little_endian 3066*0a6a1f1dSLionel Sambuc! local7 in0 in1 local3 .LLE3 3067*0a6a1f1dSLionel Sambuc 3068*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 3069*0a6a1f1dSLionel Sambuc 3070*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3071*0a6a1f1dSLionel Sambuc andcc local7, 3, global0 3072*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE3 3073*0a6a1f1dSLionel Sambuc nop 3074*0a6a1f1dSLionel Sambuc 3075*0a6a1f1dSLionel Sambuc lda [local7] 0x88, in0 3076*0a6a1f1dSLionel Sambuc add local7, 4, local3 3077*0a6a1f1dSLionel Sambuc 3078*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE3a 3079*0a6a1f1dSLionel Sambuc lda [local3] 0x88, in1 3080*0a6a1f1dSLionel Sambuc#endif 3081*0a6a1f1dSLionel Sambuc 3082*0a6a1f1dSLionel Sambuc.LLE3: 3083*0a6a1f1dSLionel Sambuc ldub [local7+3], in0 3084*0a6a1f1dSLionel Sambuc 3085*0a6a1f1dSLionel Sambuc ldub [local7+2], local3 3086*0a6a1f1dSLionel Sambuc sll in0, 8, in0 3087*0a6a1f1dSLionel Sambuc or in0, local3, in0 3088*0a6a1f1dSLionel Sambuc 3089*0a6a1f1dSLionel Sambuc ldub [local7+1], local3 3090*0a6a1f1dSLionel Sambuc sll in0, 8, in0 3091*0a6a1f1dSLionel Sambuc or in0, local3, in0 3092*0a6a1f1dSLionel Sambuc 3093*0a6a1f1dSLionel Sambuc ldub [local7+0], local3 3094*0a6a1f1dSLionel Sambuc sll in0, 8, in0 3095*0a6a1f1dSLionel Sambuc or in0, local3, in0 3096*0a6a1f1dSLionel Sambuc 3097*0a6a1f1dSLionel Sambuc 3098*0a6a1f1dSLionel Sambuc ldub [local7+3+4], in1 3099*0a6a1f1dSLionel Sambuc 3100*0a6a1f1dSLionel Sambuc ldub [local7+2+4], local3 3101*0a6a1f1dSLionel Sambuc sll in1, 8, in1 3102*0a6a1f1dSLionel Sambuc or in1, local3, in1 3103*0a6a1f1dSLionel Sambuc 3104*0a6a1f1dSLionel Sambuc ldub [local7+1+4], local3 3105*0a6a1f1dSLionel Sambuc sll in1, 8, in1 3106*0a6a1f1dSLionel Sambuc or in1, local3, in1 3107*0a6a1f1dSLionel Sambuc 3108*0a6a1f1dSLionel Sambuc ldub [local7+0+4], local3 3109*0a6a1f1dSLionel Sambuc sll in1, 8, in1 3110*0a6a1f1dSLionel Sambuc or in1, local3, in1 3111*0a6a1f1dSLionel Sambuc.LLE3a: 3112*0a6a1f1dSLionel Sambuc 3113*0a6a1f1dSLionel Sambuc ! ivec 3114*0a6a1f1dSLionel Sambuc 3115*0a6a1f1dSLionel Sambuc.ncbc.dec.next.block: 3116*0a6a1f1dSLionel Sambuc 3117*0a6a1f1dSLionel Sambuc 3118*0a6a1f1dSLionel Sambuc 3119*0a6a1f1dSLionel Sambuc! load_little_endian 3120*0a6a1f1dSLionel Sambuc! local5 in5 out5 local3 .LLE4 3121*0a6a1f1dSLionel Sambuc 3122*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 3123*0a6a1f1dSLionel Sambuc 3124*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3125*0a6a1f1dSLionel Sambuc andcc local5, 3, global0 3126*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE4 3127*0a6a1f1dSLionel Sambuc nop 3128*0a6a1f1dSLionel Sambuc 3129*0a6a1f1dSLionel Sambuc lda [local5] 0x88, in5 3130*0a6a1f1dSLionel Sambuc add local5, 4, local3 3131*0a6a1f1dSLionel Sambuc 3132*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE4a 3133*0a6a1f1dSLionel Sambuc lda [local3] 0x88, out5 3134*0a6a1f1dSLionel Sambuc#endif 3135*0a6a1f1dSLionel Sambuc 3136*0a6a1f1dSLionel Sambuc.LLE4: 3137*0a6a1f1dSLionel Sambuc ldub [local5+3], in5 3138*0a6a1f1dSLionel Sambuc 3139*0a6a1f1dSLionel Sambuc ldub [local5+2], local3 3140*0a6a1f1dSLionel Sambuc sll in5, 8, in5 3141*0a6a1f1dSLionel Sambuc or in5, local3, in5 3142*0a6a1f1dSLionel Sambuc 3143*0a6a1f1dSLionel Sambuc ldub [local5+1], local3 3144*0a6a1f1dSLionel Sambuc sll in5, 8, in5 3145*0a6a1f1dSLionel Sambuc or in5, local3, in5 3146*0a6a1f1dSLionel Sambuc 3147*0a6a1f1dSLionel Sambuc ldub [local5+0], local3 3148*0a6a1f1dSLionel Sambuc sll in5, 8, in5 3149*0a6a1f1dSLionel Sambuc or in5, local3, in5 3150*0a6a1f1dSLionel Sambuc 3151*0a6a1f1dSLionel Sambuc 3152*0a6a1f1dSLionel Sambuc ldub [local5+3+4], out5 3153*0a6a1f1dSLionel Sambuc 3154*0a6a1f1dSLionel Sambuc ldub [local5+2+4], local3 3155*0a6a1f1dSLionel Sambuc sll out5, 8, out5 3156*0a6a1f1dSLionel Sambuc or out5, local3, out5 3157*0a6a1f1dSLionel Sambuc 3158*0a6a1f1dSLionel Sambuc ldub [local5+1+4], local3 3159*0a6a1f1dSLionel Sambuc sll out5, 8, out5 3160*0a6a1f1dSLionel Sambuc or out5, local3, out5 3161*0a6a1f1dSLionel Sambuc 3162*0a6a1f1dSLionel Sambuc ldub [local5+0+4], local3 3163*0a6a1f1dSLionel Sambuc sll out5, 8, out5 3164*0a6a1f1dSLionel Sambuc or out5, local3, out5 3165*0a6a1f1dSLionel Sambuc.LLE4a: 3166*0a6a1f1dSLionel Sambuc 3167*0a6a1f1dSLionel Sambuc ! block 3168*0a6a1f1dSLionel Sambuc 3169*0a6a1f1dSLionel Sambuc ! parameter 6 1/2 for include encryption/decryption 3170*0a6a1f1dSLionel Sambuc ! parameter 7 1 for mov in1 to in3 3171*0a6a1f1dSLionel Sambuc ! parameter 8 1 for mov in3 to in4 3172*0a6a1f1dSLionel Sambuc 3173*0a6a1f1dSLionel Sambuc 3174*0a6a1f1dSLionel Sambuc 3175*0a6a1f1dSLionel Sambuc! ip_macro 3176*0a6a1f1dSLionel Sambuc! in5 out5 in5 out5 in4 2 0 1 3177*0a6a1f1dSLionel Sambuc 3178*0a6a1f1dSLionel Sambuc ld [out2+256], local1 3179*0a6a1f1dSLionel Sambuc srl out5, 4, local4 3180*0a6a1f1dSLionel Sambuc 3181*0a6a1f1dSLionel Sambuc xor local4, in5, local4 3182*0a6a1f1dSLionel Sambuc nop 3183*0a6a1f1dSLionel Sambuc 3184*0a6a1f1dSLionel Sambuc ld [out2+260], local2 3185*0a6a1f1dSLionel Sambuc and local4, local1, local4 3186*0a6a1f1dSLionel Sambuc mov in3, in4 3187*0a6a1f1dSLionel Sambuc 3188*0a6a1f1dSLionel Sambuc 3189*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 3190*0a6a1f1dSLionel Sambuc sll local4, 4, local1 3191*0a6a1f1dSLionel Sambuc xor in5, local4, in5 3192*0a6a1f1dSLionel Sambuc 3193*0a6a1f1dSLionel Sambuc ld [out2+264], local3 3194*0a6a1f1dSLionel Sambuc srl in5, 16, local4 3195*0a6a1f1dSLionel Sambuc xor out5, local1, out5 3196*0a6a1f1dSLionel Sambuc 3197*0a6a1f1dSLionel Sambuc 3198*0a6a1f1dSLionel Sambuc xor local4, out5, local4 3199*0a6a1f1dSLionel Sambuc nop !sethi %hi(DES_SPtrans), global1 ! sbox addr 3200*0a6a1f1dSLionel Sambuc 3201*0a6a1f1dSLionel Sambuc 3202*0a6a1f1dSLionel Sambuc and local4, local2, local4 3203*0a6a1f1dSLionel Sambuc nop !or global1, %lo(DES_SPtrans), global1 ! sbox addr 3204*0a6a1f1dSLionel Sambuc 3205*0a6a1f1dSLionel Sambuc sll local4, 16, local1 3206*0a6a1f1dSLionel Sambuc xor out5, local4, out5 3207*0a6a1f1dSLionel Sambuc 3208*0a6a1f1dSLionel Sambuc srl out5, 2, local4 3209*0a6a1f1dSLionel Sambuc xor in5, local1, in5 3210*0a6a1f1dSLionel Sambuc 3211*0a6a1f1dSLionel Sambuc sethi %hi(16711680), local5 3212*0a6a1f1dSLionel Sambuc xor local4, in5, local4 3213*0a6a1f1dSLionel Sambuc 3214*0a6a1f1dSLionel Sambuc and local4, local3, local4 3215*0a6a1f1dSLionel Sambuc or local5, 255, local5 3216*0a6a1f1dSLionel Sambuc 3217*0a6a1f1dSLionel Sambuc sll local4, 2, local2 3218*0a6a1f1dSLionel Sambuc xor in5, local4, in5 3219*0a6a1f1dSLionel Sambuc 3220*0a6a1f1dSLionel Sambuc srl in5, 8, local4 3221*0a6a1f1dSLionel Sambuc xor out5, local2, out5 3222*0a6a1f1dSLionel Sambuc 3223*0a6a1f1dSLionel Sambuc xor local4, out5, local4 3224*0a6a1f1dSLionel Sambuc add global1, 768, global4 3225*0a6a1f1dSLionel Sambuc 3226*0a6a1f1dSLionel Sambuc and local4, local5, local4 3227*0a6a1f1dSLionel Sambuc add global1, 1024, global5 3228*0a6a1f1dSLionel Sambuc 3229*0a6a1f1dSLionel Sambuc ld [out2+272], local7 3230*0a6a1f1dSLionel Sambuc sll local4, 8, local1 3231*0a6a1f1dSLionel Sambuc xor out5, local4, out5 3232*0a6a1f1dSLionel Sambuc 3233*0a6a1f1dSLionel Sambuc srl out5, 1, local4 3234*0a6a1f1dSLionel Sambuc xor in5, local1, in5 3235*0a6a1f1dSLionel Sambuc 3236*0a6a1f1dSLionel Sambuc ld [in4], out0 ! key 7531 3237*0a6a1f1dSLionel Sambuc xor local4, in5, local4 3238*0a6a1f1dSLionel Sambuc add global1, 256, global2 3239*0a6a1f1dSLionel Sambuc 3240*0a6a1f1dSLionel Sambuc ld [in4+4], out1 ! key 8642 3241*0a6a1f1dSLionel Sambuc and local4, local7, local4 3242*0a6a1f1dSLionel Sambuc add global1, 512, global3 3243*0a6a1f1dSLionel Sambuc 3244*0a6a1f1dSLionel Sambuc sll local4, 1, local1 3245*0a6a1f1dSLionel Sambuc xor in5, local4, in5 3246*0a6a1f1dSLionel Sambuc 3247*0a6a1f1dSLionel Sambuc sll in5, 3, local3 3248*0a6a1f1dSLionel Sambuc xor out5, local1, out5 3249*0a6a1f1dSLionel Sambuc 3250*0a6a1f1dSLionel Sambuc sll out5, 3, local2 3251*0a6a1f1dSLionel Sambuc add global1, 1280, local6 ! address sbox 8 3252*0a6a1f1dSLionel Sambuc 3253*0a6a1f1dSLionel Sambuc srl in5, 29, local4 3254*0a6a1f1dSLionel Sambuc add global1, 1792, out3 ! address sbox 8 3255*0a6a1f1dSLionel Sambuc 3256*0a6a1f1dSLionel Sambuc srl out5, 29, local1 3257*0a6a1f1dSLionel Sambuc or local4, local3, in5 3258*0a6a1f1dSLionel Sambuc 3259*0a6a1f1dSLionel Sambuc or local2, local1, out5 3260*0a6a1f1dSLionel Sambuc 3261*0a6a1f1dSLionel Sambuc 3262*0a6a1f1dSLionel Sambuc 3263*0a6a1f1dSLionel Sambuc 3264*0a6a1f1dSLionel Sambuc 3265*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 used in the rounds 3266*0a6a1f1dSLionel Sambuc or local2, local1, out5 3267*0a6a1f1dSLionel Sambuc xor in5, out0, local1 3268*0a6a1f1dSLionel Sambuc 3269*0a6a1f1dSLionel Sambuc call .des_dec.1 3270*0a6a1f1dSLionel Sambuc and local1, 252, local1 3271*0a6a1f1dSLionel Sambuc 3272*0a6a1f1dSLionel Sambuc 3273*0a6a1f1dSLionel Sambuc ! include decryprion ks in4 3274*0a6a1f1dSLionel Sambuc 3275*0a6a1f1dSLionel Sambuc 3276*0a6a1f1dSLionel Sambuc 3277*0a6a1f1dSLionel Sambuc! fp_macro 3278*0a6a1f1dSLionel Sambuc! out5 in5 0 1 3279*0a6a1f1dSLionel Sambuc 3280*0a6a1f1dSLionel Sambuc ! initially undo the rotate 3 left done after initial permutation 3281*0a6a1f1dSLionel Sambuc ! original left is received shifted 3 right and 29 left in local3/4 3282*0a6a1f1dSLionel Sambuc 3283*0a6a1f1dSLionel Sambuc sll in5, 29, local1 3284*0a6a1f1dSLionel Sambuc or local3, local4, out5 3285*0a6a1f1dSLionel Sambuc 3286*0a6a1f1dSLionel Sambuc srl in5, 3, in5 3287*0a6a1f1dSLionel Sambuc sethi %hi(0x55555555), local2 3288*0a6a1f1dSLionel Sambuc 3289*0a6a1f1dSLionel Sambuc or in5, local1, in5 3290*0a6a1f1dSLionel Sambuc or local2, %lo(0x55555555), local2 3291*0a6a1f1dSLionel Sambuc 3292*0a6a1f1dSLionel Sambuc srl in5, 1, local3 3293*0a6a1f1dSLionel Sambuc sethi %hi(0x00ff00ff), local1 3294*0a6a1f1dSLionel Sambuc xor local3, out5, local3 3295*0a6a1f1dSLionel Sambuc or local1, %lo(0x00ff00ff), local1 3296*0a6a1f1dSLionel Sambuc and local3, local2, local3 3297*0a6a1f1dSLionel Sambuc sethi %hi(0x33333333), local4 3298*0a6a1f1dSLionel Sambuc sll local3, 1, local2 3299*0a6a1f1dSLionel Sambuc 3300*0a6a1f1dSLionel Sambuc xor out5, local3, out5 3301*0a6a1f1dSLionel Sambuc 3302*0a6a1f1dSLionel Sambuc srl out5, 8, local3 3303*0a6a1f1dSLionel Sambuc xor in5, local2, in5 3304*0a6a1f1dSLionel Sambuc xor local3, in5, local3 3305*0a6a1f1dSLionel Sambuc or local4, %lo(0x33333333), local4 3306*0a6a1f1dSLionel Sambuc and local3, local1, local3 3307*0a6a1f1dSLionel Sambuc sethi %hi(0x0000ffff), local1 3308*0a6a1f1dSLionel Sambuc sll local3, 8, local2 3309*0a6a1f1dSLionel Sambuc 3310*0a6a1f1dSLionel Sambuc xor in5, local3, in5 3311*0a6a1f1dSLionel Sambuc 3312*0a6a1f1dSLionel Sambuc srl in5, 2, local3 3313*0a6a1f1dSLionel Sambuc xor out5, local2, out5 3314*0a6a1f1dSLionel Sambuc xor local3, out5, local3 3315*0a6a1f1dSLionel Sambuc or local1, %lo(0x0000ffff), local1 3316*0a6a1f1dSLionel Sambuc and local3, local4, local3 3317*0a6a1f1dSLionel Sambuc sethi %hi(0x0f0f0f0f), local4 3318*0a6a1f1dSLionel Sambuc sll local3, 2, local2 3319*0a6a1f1dSLionel Sambuc 3320*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+0*ARGSZ] , local5 3321*0a6a1f1dSLionel Sambuc xor out5, local3, out5 3322*0a6a1f1dSLionel Sambuc 3323*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+1*ARGSZ] , local7 3324*0a6a1f1dSLionel Sambuc srl out5, 16, local3 3325*0a6a1f1dSLionel Sambuc xor in5, local2, in5 3326*0a6a1f1dSLionel Sambuc xor local3, in5, local3 3327*0a6a1f1dSLionel Sambuc or local4, %lo(0x0f0f0f0f), local4 3328*0a6a1f1dSLionel Sambuc and local3, local1, local3 3329*0a6a1f1dSLionel Sambuc sll local3, 16, local2 3330*0a6a1f1dSLionel Sambuc 3331*0a6a1f1dSLionel Sambuc xor in5, local3, local1 3332*0a6a1f1dSLionel Sambuc 3333*0a6a1f1dSLionel Sambuc srl local1, 4, local3 3334*0a6a1f1dSLionel Sambuc xor out5, local2, out5 3335*0a6a1f1dSLionel Sambuc xor local3, out5, local3 3336*0a6a1f1dSLionel Sambuc and local3, local4, local3 3337*0a6a1f1dSLionel Sambuc sll local3, 4, local2 3338*0a6a1f1dSLionel Sambuc 3339*0a6a1f1dSLionel Sambuc xor out5, local3, out5 3340*0a6a1f1dSLionel Sambuc 3341*0a6a1f1dSLionel Sambuc ! optional store: 3342*0a6a1f1dSLionel Sambuc 3343*0a6a1f1dSLionel Sambuc 3344*0a6a1f1dSLionel Sambuc 3345*0a6a1f1dSLionel Sambuc xor local1, local2, in5 3346*0a6a1f1dSLionel Sambuc 3347*0a6a1f1dSLionel Sambuc 3348*0a6a1f1dSLionel Sambuc 3349*0a6a1f1dSLionel Sambuc ! 1 for input and output address to local5/7 3350*0a6a1f1dSLionel Sambuc 3351*0a6a1f1dSLionel Sambuc ! in2 is bytes left to be stored 3352*0a6a1f1dSLionel Sambuc ! in2 is compared to 8 in the rounds 3353*0a6a1f1dSLionel Sambuc 3354*0a6a1f1dSLionel Sambuc xor out5, in0, out4 ! iv xor 3355*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3356*0a6a1f1dSLionel Sambuc bl,pn %icc, .ncbc.dec.seven.or.less 3357*0a6a1f1dSLionel Sambuc#else 3358*0a6a1f1dSLionel Sambuc bl .ncbc.dec.seven.or.less 3359*0a6a1f1dSLionel Sambuc#endif 3360*0a6a1f1dSLionel Sambuc xor in5, in1, global4 ! iv xor 3361*0a6a1f1dSLionel Sambuc 3362*0a6a1f1dSLionel Sambuc ! Load ivec next block now, since input and output address might be the same. 3363*0a6a1f1dSLionel Sambuc 3364*0a6a1f1dSLionel Sambuc 3365*0a6a1f1dSLionel Sambuc 3366*0a6a1f1dSLionel Sambuc! load_little_endian_inc 3367*0a6a1f1dSLionel Sambuc! local5 in0 in1 local3 .LLE5 3368*0a6a1f1dSLionel Sambuc 3369*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 3370*0a6a1f1dSLionel Sambuc 3371*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3372*0a6a1f1dSLionel Sambuc andcc local5, 3, global0 3373*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE5 3374*0a6a1f1dSLionel Sambuc nop 3375*0a6a1f1dSLionel Sambuc 3376*0a6a1f1dSLionel Sambuc lda [local5] 0x88, in0 3377*0a6a1f1dSLionel Sambuc add local5, 4, local5 3378*0a6a1f1dSLionel Sambuc 3379*0a6a1f1dSLionel Sambuc lda [local5] 0x88, in1 3380*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE5a 3381*0a6a1f1dSLionel Sambuc add local5, 4, local5 3382*0a6a1f1dSLionel Sambuc#endif 3383*0a6a1f1dSLionel Sambuc 3384*0a6a1f1dSLionel Sambuc.LLE5: 3385*0a6a1f1dSLionel Sambuc ldub [local5+3], in0 3386*0a6a1f1dSLionel Sambuc 3387*0a6a1f1dSLionel Sambuc ldub [local5+2], local3 3388*0a6a1f1dSLionel Sambuc sll in0, 8, in0 3389*0a6a1f1dSLionel Sambuc or in0, local3, in0 3390*0a6a1f1dSLionel Sambuc 3391*0a6a1f1dSLionel Sambuc ldub [local5+1], local3 3392*0a6a1f1dSLionel Sambuc sll in0, 8, in0 3393*0a6a1f1dSLionel Sambuc or in0, local3, in0 3394*0a6a1f1dSLionel Sambuc 3395*0a6a1f1dSLionel Sambuc ldub [local5+0], local3 3396*0a6a1f1dSLionel Sambuc sll in0, 8, in0 3397*0a6a1f1dSLionel Sambuc or in0, local3, in0 3398*0a6a1f1dSLionel Sambuc 3399*0a6a1f1dSLionel Sambuc ldub [local5+3+4], in1 3400*0a6a1f1dSLionel Sambuc add local5, 8, local5 3401*0a6a1f1dSLionel Sambuc 3402*0a6a1f1dSLionel Sambuc ldub [local5+2+4-8], local3 3403*0a6a1f1dSLionel Sambuc sll in1, 8, in1 3404*0a6a1f1dSLionel Sambuc or in1, local3, in1 3405*0a6a1f1dSLionel Sambuc 3406*0a6a1f1dSLionel Sambuc ldub [local5+1+4-8], local3 3407*0a6a1f1dSLionel Sambuc sll in1, 8, in1 3408*0a6a1f1dSLionel Sambuc or in1, local3, in1 3409*0a6a1f1dSLionel Sambuc 3410*0a6a1f1dSLionel Sambuc ldub [local5+0+4-8], local3 3411*0a6a1f1dSLionel Sambuc sll in1, 8, in1 3412*0a6a1f1dSLionel Sambuc or in1, local3, in1 3413*0a6a1f1dSLionel Sambuc.LLE5a: 3414*0a6a1f1dSLionel Sambuc 3415*0a6a1f1dSLionel Sambuc ! iv 3416*0a6a1f1dSLionel Sambuc 3417*0a6a1f1dSLionel Sambuc 3418*0a6a1f1dSLionel Sambuc 3419*0a6a1f1dSLionel Sambuc! store_little_endian 3420*0a6a1f1dSLionel Sambuc! local7 out4 global4 local3 .SLE3 3421*0a6a1f1dSLionel Sambuc 3422*0a6a1f1dSLionel Sambuc ! rightmost in register to first in memory 3423*0a6a1f1dSLionel Sambuc 3424*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3425*0a6a1f1dSLionel Sambuc andcc local7, 3, global0 3426*0a6a1f1dSLionel Sambuc bne,pn %icc, .SLE3 3427*0a6a1f1dSLionel Sambuc nop 3428*0a6a1f1dSLionel Sambuc 3429*0a6a1f1dSLionel Sambuc sta out4, [local7] 0x88 3430*0a6a1f1dSLionel Sambuc add local7, 4, local3 3431*0a6a1f1dSLionel Sambuc 3432*0a6a1f1dSLionel Sambuc ba,pt %icc, .SLE3a 3433*0a6a1f1dSLionel Sambuc sta global4, [local3] 0x88 3434*0a6a1f1dSLionel Sambuc#endif 3435*0a6a1f1dSLionel Sambuc 3436*0a6a1f1dSLionel Sambuc.SLE3: 3437*0a6a1f1dSLionel Sambuc and out4, 255, local3 3438*0a6a1f1dSLionel Sambuc stub local3, [local7+0] 3439*0a6a1f1dSLionel Sambuc 3440*0a6a1f1dSLionel Sambuc srl out4, 8, local3 3441*0a6a1f1dSLionel Sambuc and local3, 255, local3 3442*0a6a1f1dSLionel Sambuc stub local3, [local7+1] 3443*0a6a1f1dSLionel Sambuc 3444*0a6a1f1dSLionel Sambuc srl out4, 16, local3 3445*0a6a1f1dSLionel Sambuc and local3, 255, local3 3446*0a6a1f1dSLionel Sambuc stub local3, [local7+2] 3447*0a6a1f1dSLionel Sambuc 3448*0a6a1f1dSLionel Sambuc srl out4, 24, local3 3449*0a6a1f1dSLionel Sambuc stub local3, [local7+3] 3450*0a6a1f1dSLionel Sambuc 3451*0a6a1f1dSLionel Sambuc 3452*0a6a1f1dSLionel Sambuc and global4, 255, local3 3453*0a6a1f1dSLionel Sambuc stub local3, [local7+0+4] 3454*0a6a1f1dSLionel Sambuc 3455*0a6a1f1dSLionel Sambuc srl global4, 8, local3 3456*0a6a1f1dSLionel Sambuc and local3, 255, local3 3457*0a6a1f1dSLionel Sambuc stub local3, [local7+1+4] 3458*0a6a1f1dSLionel Sambuc 3459*0a6a1f1dSLionel Sambuc srl global4, 16, local3 3460*0a6a1f1dSLionel Sambuc and local3, 255, local3 3461*0a6a1f1dSLionel Sambuc stub local3, [local7+2+4] 3462*0a6a1f1dSLionel Sambuc 3463*0a6a1f1dSLionel Sambuc srl global4, 24, local3 3464*0a6a1f1dSLionel Sambuc stub local3, [local7+3+4] 3465*0a6a1f1dSLionel Sambuc 3466*0a6a1f1dSLionel Sambuc.SLE3a: 3467*0a6a1f1dSLionel Sambuc 3468*0a6a1f1dSLionel Sambuc 3469*0a6a1f1dSLionel Sambuc 3470*0a6a1f1dSLionel Sambuc STPTR local5, [%sp+BIAS+ARG0+0*ARGSZ] 3471*0a6a1f1dSLionel Sambuc add local7, 8, local7 3472*0a6a1f1dSLionel Sambuc addcc in2, -8, in2 3473*0a6a1f1dSLionel Sambuc 3474*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3475*0a6a1f1dSLionel Sambuc bg,pt %icc, .ncbc.dec.next.block 3476*0a6a1f1dSLionel Sambuc#else 3477*0a6a1f1dSLionel Sambuc bg .ncbc.dec.next.block 3478*0a6a1f1dSLionel Sambuc#endif 3479*0a6a1f1dSLionel Sambuc STPTR local7, [%sp+BIAS+ARG0+1*ARGSZ] 3480*0a6a1f1dSLionel Sambuc 3481*0a6a1f1dSLionel Sambuc 3482*0a6a1f1dSLionel Sambuc.ncbc.dec.store.iv: 3483*0a6a1f1dSLionel Sambuc 3484*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+4*ARGSZ] , local4 ! ivec 3485*0a6a1f1dSLionel Sambuc 3486*0a6a1f1dSLionel Sambuc 3487*0a6a1f1dSLionel Sambuc! store_little_endian 3488*0a6a1f1dSLionel Sambuc! local4 in0 in1 local5 .SLE4 3489*0a6a1f1dSLionel Sambuc 3490*0a6a1f1dSLionel Sambuc ! rightmost in register to first in memory 3491*0a6a1f1dSLionel Sambuc 3492*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3493*0a6a1f1dSLionel Sambuc andcc local4, 3, global0 3494*0a6a1f1dSLionel Sambuc bne,pn %icc, .SLE4 3495*0a6a1f1dSLionel Sambuc nop 3496*0a6a1f1dSLionel Sambuc 3497*0a6a1f1dSLionel Sambuc sta in0, [local4] 0x88 3498*0a6a1f1dSLionel Sambuc add local4, 4, local5 3499*0a6a1f1dSLionel Sambuc 3500*0a6a1f1dSLionel Sambuc ba,pt %icc, .SLE4a 3501*0a6a1f1dSLionel Sambuc sta in1, [local5] 0x88 3502*0a6a1f1dSLionel Sambuc#endif 3503*0a6a1f1dSLionel Sambuc 3504*0a6a1f1dSLionel Sambuc.SLE4: 3505*0a6a1f1dSLionel Sambuc and in0, 255, local5 3506*0a6a1f1dSLionel Sambuc stub local5, [local4+0] 3507*0a6a1f1dSLionel Sambuc 3508*0a6a1f1dSLionel Sambuc srl in0, 8, local5 3509*0a6a1f1dSLionel Sambuc and local5, 255, local5 3510*0a6a1f1dSLionel Sambuc stub local5, [local4+1] 3511*0a6a1f1dSLionel Sambuc 3512*0a6a1f1dSLionel Sambuc srl in0, 16, local5 3513*0a6a1f1dSLionel Sambuc and local5, 255, local5 3514*0a6a1f1dSLionel Sambuc stub local5, [local4+2] 3515*0a6a1f1dSLionel Sambuc 3516*0a6a1f1dSLionel Sambuc srl in0, 24, local5 3517*0a6a1f1dSLionel Sambuc stub local5, [local4+3] 3518*0a6a1f1dSLionel Sambuc 3519*0a6a1f1dSLionel Sambuc 3520*0a6a1f1dSLionel Sambuc and in1, 255, local5 3521*0a6a1f1dSLionel Sambuc stub local5, [local4+0+4] 3522*0a6a1f1dSLionel Sambuc 3523*0a6a1f1dSLionel Sambuc srl in1, 8, local5 3524*0a6a1f1dSLionel Sambuc and local5, 255, local5 3525*0a6a1f1dSLionel Sambuc stub local5, [local4+1+4] 3526*0a6a1f1dSLionel Sambuc 3527*0a6a1f1dSLionel Sambuc srl in1, 16, local5 3528*0a6a1f1dSLionel Sambuc and local5, 255, local5 3529*0a6a1f1dSLionel Sambuc stub local5, [local4+2+4] 3530*0a6a1f1dSLionel Sambuc 3531*0a6a1f1dSLionel Sambuc srl in1, 24, local5 3532*0a6a1f1dSLionel Sambuc stub local5, [local4+3+4] 3533*0a6a1f1dSLionel Sambuc 3534*0a6a1f1dSLionel Sambuc.SLE4a: 3535*0a6a1f1dSLionel Sambuc 3536*0a6a1f1dSLionel Sambuc 3537*0a6a1f1dSLionel Sambuc 3538*0a6a1f1dSLionel Sambuc.ncbc.dec.finish: 3539*0a6a1f1dSLionel Sambuc 3540*0a6a1f1dSLionel Sambuc ret 3541*0a6a1f1dSLionel Sambuc restore 3542*0a6a1f1dSLionel Sambuc 3543*0a6a1f1dSLionel Sambuc.ncbc.dec.seven.or.less: 3544*0a6a1f1dSLionel Sambuc 3545*0a6a1f1dSLionel Sambuc 3546*0a6a1f1dSLionel Sambuc 3547*0a6a1f1dSLionel Sambuc! load_little_endian_inc 3548*0a6a1f1dSLionel Sambuc! local5 in0 in1 local3 .LLE13 3549*0a6a1f1dSLionel Sambuc 3550*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 3551*0a6a1f1dSLionel Sambuc 3552*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3553*0a6a1f1dSLionel Sambuc andcc local5, 3, global0 3554*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE13 3555*0a6a1f1dSLionel Sambuc nop 3556*0a6a1f1dSLionel Sambuc 3557*0a6a1f1dSLionel Sambuc lda [local5] 0x88, in0 3558*0a6a1f1dSLionel Sambuc add local5, 4, local5 3559*0a6a1f1dSLionel Sambuc 3560*0a6a1f1dSLionel Sambuc lda [local5] 0x88, in1 3561*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE13a 3562*0a6a1f1dSLionel Sambuc add local5, 4, local5 3563*0a6a1f1dSLionel Sambuc#endif 3564*0a6a1f1dSLionel Sambuc 3565*0a6a1f1dSLionel Sambuc.LLE13: 3566*0a6a1f1dSLionel Sambuc ldub [local5+3], in0 3567*0a6a1f1dSLionel Sambuc 3568*0a6a1f1dSLionel Sambuc ldub [local5+2], local3 3569*0a6a1f1dSLionel Sambuc sll in0, 8, in0 3570*0a6a1f1dSLionel Sambuc or in0, local3, in0 3571*0a6a1f1dSLionel Sambuc 3572*0a6a1f1dSLionel Sambuc ldub [local5+1], local3 3573*0a6a1f1dSLionel Sambuc sll in0, 8, in0 3574*0a6a1f1dSLionel Sambuc or in0, local3, in0 3575*0a6a1f1dSLionel Sambuc 3576*0a6a1f1dSLionel Sambuc ldub [local5+0], local3 3577*0a6a1f1dSLionel Sambuc sll in0, 8, in0 3578*0a6a1f1dSLionel Sambuc or in0, local3, in0 3579*0a6a1f1dSLionel Sambuc 3580*0a6a1f1dSLionel Sambuc ldub [local5+3+4], in1 3581*0a6a1f1dSLionel Sambuc add local5, 8, local5 3582*0a6a1f1dSLionel Sambuc 3583*0a6a1f1dSLionel Sambuc ldub [local5+2+4-8], local3 3584*0a6a1f1dSLionel Sambuc sll in1, 8, in1 3585*0a6a1f1dSLionel Sambuc or in1, local3, in1 3586*0a6a1f1dSLionel Sambuc 3587*0a6a1f1dSLionel Sambuc ldub [local5+1+4-8], local3 3588*0a6a1f1dSLionel Sambuc sll in1, 8, in1 3589*0a6a1f1dSLionel Sambuc or in1, local3, in1 3590*0a6a1f1dSLionel Sambuc 3591*0a6a1f1dSLionel Sambuc ldub [local5+0+4-8], local3 3592*0a6a1f1dSLionel Sambuc sll in1, 8, in1 3593*0a6a1f1dSLionel Sambuc or in1, local3, in1 3594*0a6a1f1dSLionel Sambuc.LLE13a: 3595*0a6a1f1dSLionel Sambuc 3596*0a6a1f1dSLionel Sambuc ! ivec 3597*0a6a1f1dSLionel Sambuc 3598*0a6a1f1dSLionel Sambuc 3599*0a6a1f1dSLionel Sambuc 3600*0a6a1f1dSLionel Sambuc! store_n_bytes 3601*0a6a1f1dSLionel Sambuc! local7 in2 local3 local4 .SNB1 .ncbc.dec.store.iv .SNB1 .ncbc.dec.store.iv 3602*0a6a1f1dSLionel Sambuc 3603*0a6a1f1dSLionel Sambuc.SNB1.0: call .+8 3604*0a6a1f1dSLionel Sambuc sll in2, 2, local4 3605*0a6a1f1dSLionel Sambuc 3606*0a6a1f1dSLionel Sambuc add %o7,.SNB1.jmp.table-.SNB1.0,local3 3607*0a6a1f1dSLionel Sambuc 3608*0a6a1f1dSLionel Sambuc add local3, local4, local3 3609*0a6a1f1dSLionel Sambuc 3610*0a6a1f1dSLionel Sambuc ld [local3], local3 3611*0a6a1f1dSLionel Sambuc 3612*0a6a1f1dSLionel Sambuc jmp %o7+local3 3613*0a6a1f1dSLionel Sambuc nop 3614*0a6a1f1dSLionel Sambuc 3615*0a6a1f1dSLionel Sambuc.SNB1.7: 3616*0a6a1f1dSLionel Sambuc srl global4, 16, local3 3617*0a6a1f1dSLionel Sambuc and local3, 0xff, local3 3618*0a6a1f1dSLionel Sambuc stub local3, [local7+6] 3619*0a6a1f1dSLionel Sambuc.SNB1.6: 3620*0a6a1f1dSLionel Sambuc srl global4, 8, local3 3621*0a6a1f1dSLionel Sambuc and local3, 0xff, local3 3622*0a6a1f1dSLionel Sambuc stub local3, [local7+5] 3623*0a6a1f1dSLionel Sambuc.SNB1.5: 3624*0a6a1f1dSLionel Sambuc and global4, 0xff, local3 3625*0a6a1f1dSLionel Sambuc stub local3, [local7+4] 3626*0a6a1f1dSLionel Sambuc.SNB1.4: 3627*0a6a1f1dSLionel Sambuc srl out4, 24, local3 3628*0a6a1f1dSLionel Sambuc stub local3, [local7+3] 3629*0a6a1f1dSLionel Sambuc.SNB1.3: 3630*0a6a1f1dSLionel Sambuc srl out4, 16, local3 3631*0a6a1f1dSLionel Sambuc and local3, 0xff, local3 3632*0a6a1f1dSLionel Sambuc stub local3, [local7+2] 3633*0a6a1f1dSLionel Sambuc.SNB1.2: 3634*0a6a1f1dSLionel Sambuc srl out4, 8, local3 3635*0a6a1f1dSLionel Sambuc and local3, 0xff, local3 3636*0a6a1f1dSLionel Sambuc stub local3, [local7+1] 3637*0a6a1f1dSLionel Sambuc.SNB1.1: 3638*0a6a1f1dSLionel Sambuc and out4, 0xff, local3 3639*0a6a1f1dSLionel Sambuc 3640*0a6a1f1dSLionel Sambuc 3641*0a6a1f1dSLionel Sambuc ba .ncbc.dec.store.iv 3642*0a6a1f1dSLionel Sambuc stub local3, [local7] 3643*0a6a1f1dSLionel Sambuc 3644*0a6a1f1dSLionel Sambuc .align 4 3645*0a6a1f1dSLionel Sambuc 3646*0a6a1f1dSLionel Sambuc.SNB1.jmp.table: 3647*0a6a1f1dSLionel Sambuc 3648*0a6a1f1dSLionel Sambuc .word 0 3649*0a6a1f1dSLionel Sambuc .word .SNB1.1-.SNB1.0 3650*0a6a1f1dSLionel Sambuc .word .SNB1.2-.SNB1.0 3651*0a6a1f1dSLionel Sambuc .word .SNB1.3-.SNB1.0 3652*0a6a1f1dSLionel Sambuc .word .SNB1.4-.SNB1.0 3653*0a6a1f1dSLionel Sambuc .word .SNB1.5-.SNB1.0 3654*0a6a1f1dSLionel Sambuc .word .SNB1.6-.SNB1.0 3655*0a6a1f1dSLionel Sambuc .word .SNB1.7-.SNB1.0 3656*0a6a1f1dSLionel Sambuc 3657*0a6a1f1dSLionel Sambuc 3658*0a6a1f1dSLionel Sambuc 3659*0a6a1f1dSLionel Sambuc.DES_ncbc_encrypt.end: 3660*0a6a1f1dSLionel Sambuc .size DES_ncbc_encrypt, .DES_ncbc_encrypt.end-DES_ncbc_encrypt 3661*0a6a1f1dSLionel Sambuc 3662*0a6a1f1dSLionel Sambuc 3663*0a6a1f1dSLionel Sambuc! void DES_ede3_cbc_encrypt(input, output, lenght, ks1, ks2, ks3, ivec, enc) 3664*0a6a1f1dSLionel Sambuc! ************************************************************************** 3665*0a6a1f1dSLionel Sambuc 3666*0a6a1f1dSLionel Sambuc 3667*0a6a1f1dSLionel Sambuc .align 32 3668*0a6a1f1dSLionel Sambuc .global DES_ede3_cbc_encrypt 3669*0a6a1f1dSLionel Sambuc .type DES_ede3_cbc_encrypt,#function 3670*0a6a1f1dSLionel Sambuc 3671*0a6a1f1dSLionel SambucDES_ede3_cbc_encrypt: 3672*0a6a1f1dSLionel Sambuc 3673*0a6a1f1dSLionel Sambuc save %sp, FRAME, %sp 3674*0a6a1f1dSLionel Sambuc 3675*0a6a1f1dSLionel Sambuc 3676*0a6a1f1dSLionel Sambuc 3677*0a6a1f1dSLionel Sambuc 3678*0a6a1f1dSLionel Sambuc 3679*0a6a1f1dSLionel Sambuc sethi %hi(_PIC_DES_SPtrans-1f),global1 3680*0a6a1f1dSLionel Sambuc or global1,%lo(_PIC_DES_SPtrans-1f),global1 3681*0a6a1f1dSLionel Sambuc1: call .+8 3682*0a6a1f1dSLionel Sambuc add %o7,global1,global1 3683*0a6a1f1dSLionel Sambuc sub global1,_PIC_DES_SPtrans-.des_and,out2 3684*0a6a1f1dSLionel Sambuc 3685*0a6a1f1dSLionel Sambuc LDPTR [%fp+BIAS+ARG0+7*ARGSZ], local3 ! enc 3686*0a6a1f1dSLionel Sambuc LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local4 ! ivec 3687*0a6a1f1dSLionel Sambuc cmp local3, 0 ! enc 3688*0a6a1f1dSLionel Sambuc 3689*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3690*0a6a1f1dSLionel Sambuc be,pn %icc, .ede3.dec 3691*0a6a1f1dSLionel Sambuc#else 3692*0a6a1f1dSLionel Sambuc be .ede3.dec 3693*0a6a1f1dSLionel Sambuc#endif 3694*0a6a1f1dSLionel Sambuc STPTR in4, [%sp+BIAS+ARG0+4*ARGSZ] 3695*0a6a1f1dSLionel Sambuc 3696*0a6a1f1dSLionel Sambuc STPTR in5, [%sp+BIAS+ARG0+5*ARGSZ] 3697*0a6a1f1dSLionel Sambuc 3698*0a6a1f1dSLionel Sambuc 3699*0a6a1f1dSLionel Sambuc 3700*0a6a1f1dSLionel Sambuc! load_little_endian 3701*0a6a1f1dSLionel Sambuc! local4 in5 out5 local3 .LLE6 3702*0a6a1f1dSLionel Sambuc 3703*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 3704*0a6a1f1dSLionel Sambuc 3705*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3706*0a6a1f1dSLionel Sambuc andcc local4, 3, global0 3707*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE6 3708*0a6a1f1dSLionel Sambuc nop 3709*0a6a1f1dSLionel Sambuc 3710*0a6a1f1dSLionel Sambuc lda [local4] 0x88, in5 3711*0a6a1f1dSLionel Sambuc add local4, 4, local3 3712*0a6a1f1dSLionel Sambuc 3713*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE6a 3714*0a6a1f1dSLionel Sambuc lda [local3] 0x88, out5 3715*0a6a1f1dSLionel Sambuc#endif 3716*0a6a1f1dSLionel Sambuc 3717*0a6a1f1dSLionel Sambuc.LLE6: 3718*0a6a1f1dSLionel Sambuc ldub [local4+3], in5 3719*0a6a1f1dSLionel Sambuc 3720*0a6a1f1dSLionel Sambuc ldub [local4+2], local3 3721*0a6a1f1dSLionel Sambuc sll in5, 8, in5 3722*0a6a1f1dSLionel Sambuc or in5, local3, in5 3723*0a6a1f1dSLionel Sambuc 3724*0a6a1f1dSLionel Sambuc ldub [local4+1], local3 3725*0a6a1f1dSLionel Sambuc sll in5, 8, in5 3726*0a6a1f1dSLionel Sambuc or in5, local3, in5 3727*0a6a1f1dSLionel Sambuc 3728*0a6a1f1dSLionel Sambuc ldub [local4+0], local3 3729*0a6a1f1dSLionel Sambuc sll in5, 8, in5 3730*0a6a1f1dSLionel Sambuc or in5, local3, in5 3731*0a6a1f1dSLionel Sambuc 3732*0a6a1f1dSLionel Sambuc 3733*0a6a1f1dSLionel Sambuc ldub [local4+3+4], out5 3734*0a6a1f1dSLionel Sambuc 3735*0a6a1f1dSLionel Sambuc ldub [local4+2+4], local3 3736*0a6a1f1dSLionel Sambuc sll out5, 8, out5 3737*0a6a1f1dSLionel Sambuc or out5, local3, out5 3738*0a6a1f1dSLionel Sambuc 3739*0a6a1f1dSLionel Sambuc ldub [local4+1+4], local3 3740*0a6a1f1dSLionel Sambuc sll out5, 8, out5 3741*0a6a1f1dSLionel Sambuc or out5, local3, out5 3742*0a6a1f1dSLionel Sambuc 3743*0a6a1f1dSLionel Sambuc ldub [local4+0+4], local3 3744*0a6a1f1dSLionel Sambuc sll out5, 8, out5 3745*0a6a1f1dSLionel Sambuc or out5, local3, out5 3746*0a6a1f1dSLionel Sambuc.LLE6a: 3747*0a6a1f1dSLionel Sambuc 3748*0a6a1f1dSLionel Sambuc ! ivec 3749*0a6a1f1dSLionel Sambuc 3750*0a6a1f1dSLionel Sambuc addcc in2, -8, in2 ! bytes missing after next block 3751*0a6a1f1dSLionel Sambuc 3752*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3753*0a6a1f1dSLionel Sambuc bl,pn %icc, .ede3.enc.seven.or.less 3754*0a6a1f1dSLionel Sambuc#else 3755*0a6a1f1dSLionel Sambuc bl .ede3.enc.seven.or.less 3756*0a6a1f1dSLionel Sambuc#endif 3757*0a6a1f1dSLionel Sambuc STPTR in3, [%sp+BIAS+ARG0+3*ARGSZ] 3758*0a6a1f1dSLionel Sambuc 3759*0a6a1f1dSLionel Sambuc.ede3.enc.next.block: 3760*0a6a1f1dSLionel Sambuc 3761*0a6a1f1dSLionel Sambuc 3762*0a6a1f1dSLionel Sambuc 3763*0a6a1f1dSLionel Sambuc! load_little_endian 3764*0a6a1f1dSLionel Sambuc! in0 out4 global4 local3 .LLE7 3765*0a6a1f1dSLionel Sambuc 3766*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 3767*0a6a1f1dSLionel Sambuc 3768*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3769*0a6a1f1dSLionel Sambuc andcc in0, 3, global0 3770*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE7 3771*0a6a1f1dSLionel Sambuc nop 3772*0a6a1f1dSLionel Sambuc 3773*0a6a1f1dSLionel Sambuc lda [in0] 0x88, out4 3774*0a6a1f1dSLionel Sambuc add in0, 4, local3 3775*0a6a1f1dSLionel Sambuc 3776*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE7a 3777*0a6a1f1dSLionel Sambuc lda [local3] 0x88, global4 3778*0a6a1f1dSLionel Sambuc#endif 3779*0a6a1f1dSLionel Sambuc 3780*0a6a1f1dSLionel Sambuc.LLE7: 3781*0a6a1f1dSLionel Sambuc ldub [in0+3], out4 3782*0a6a1f1dSLionel Sambuc 3783*0a6a1f1dSLionel Sambuc ldub [in0+2], local3 3784*0a6a1f1dSLionel Sambuc sll out4, 8, out4 3785*0a6a1f1dSLionel Sambuc or out4, local3, out4 3786*0a6a1f1dSLionel Sambuc 3787*0a6a1f1dSLionel Sambuc ldub [in0+1], local3 3788*0a6a1f1dSLionel Sambuc sll out4, 8, out4 3789*0a6a1f1dSLionel Sambuc or out4, local3, out4 3790*0a6a1f1dSLionel Sambuc 3791*0a6a1f1dSLionel Sambuc ldub [in0+0], local3 3792*0a6a1f1dSLionel Sambuc sll out4, 8, out4 3793*0a6a1f1dSLionel Sambuc or out4, local3, out4 3794*0a6a1f1dSLionel Sambuc 3795*0a6a1f1dSLionel Sambuc 3796*0a6a1f1dSLionel Sambuc ldub [in0+3+4], global4 3797*0a6a1f1dSLionel Sambuc 3798*0a6a1f1dSLionel Sambuc ldub [in0+2+4], local3 3799*0a6a1f1dSLionel Sambuc sll global4, 8, global4 3800*0a6a1f1dSLionel Sambuc or global4, local3, global4 3801*0a6a1f1dSLionel Sambuc 3802*0a6a1f1dSLionel Sambuc ldub [in0+1+4], local3 3803*0a6a1f1dSLionel Sambuc sll global4, 8, global4 3804*0a6a1f1dSLionel Sambuc or global4, local3, global4 3805*0a6a1f1dSLionel Sambuc 3806*0a6a1f1dSLionel Sambuc ldub [in0+0+4], local3 3807*0a6a1f1dSLionel Sambuc sll global4, 8, global4 3808*0a6a1f1dSLionel Sambuc or global4, local3, global4 3809*0a6a1f1dSLionel Sambuc.LLE7a: 3810*0a6a1f1dSLionel Sambuc 3811*0a6a1f1dSLionel Sambuc 3812*0a6a1f1dSLionel Sambuc 3813*0a6a1f1dSLionel Sambuc.ede3.enc.next.block_1: 3814*0a6a1f1dSLionel Sambuc 3815*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+4*ARGSZ] , in4 3816*0a6a1f1dSLionel Sambuc xor in5, out4, in5 ! iv xor 3817*0a6a1f1dSLionel Sambuc xor out5, global4, out5 ! iv xor 3818*0a6a1f1dSLionel Sambuc 3819*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+3*ARGSZ] , in3 3820*0a6a1f1dSLionel Sambuc add in4, 120, in4 ! for decryption we use last subkey first 3821*0a6a1f1dSLionel Sambuc nop 3822*0a6a1f1dSLionel Sambuc 3823*0a6a1f1dSLionel Sambuc 3824*0a6a1f1dSLionel Sambuc 3825*0a6a1f1dSLionel Sambuc! ip_macro 3826*0a6a1f1dSLionel Sambuc! in5 out5 out5 in5 in3 3827*0a6a1f1dSLionel Sambuc 3828*0a6a1f1dSLionel Sambuc ld [out2+256], local1 3829*0a6a1f1dSLionel Sambuc srl out5, 4, local4 3830*0a6a1f1dSLionel Sambuc 3831*0a6a1f1dSLionel Sambuc xor local4, in5, local4 3832*0a6a1f1dSLionel Sambuc nop 3833*0a6a1f1dSLionel Sambuc 3834*0a6a1f1dSLionel Sambuc ld [out2+260], local2 3835*0a6a1f1dSLionel Sambuc and local4, local1, local4 3836*0a6a1f1dSLionel Sambuc 3837*0a6a1f1dSLionel Sambuc 3838*0a6a1f1dSLionel Sambuc 3839*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 3840*0a6a1f1dSLionel Sambuc sll local4, 4, local1 3841*0a6a1f1dSLionel Sambuc xor in5, local4, in5 3842*0a6a1f1dSLionel Sambuc 3843*0a6a1f1dSLionel Sambuc ld [out2+264], local3 3844*0a6a1f1dSLionel Sambuc srl in5, 16, local4 3845*0a6a1f1dSLionel Sambuc xor out5, local1, out5 3846*0a6a1f1dSLionel Sambuc 3847*0a6a1f1dSLionel Sambuc 3848*0a6a1f1dSLionel Sambuc xor local4, out5, local4 3849*0a6a1f1dSLionel Sambuc nop !sethi %hi(DES_SPtrans), global1 ! sbox addr 3850*0a6a1f1dSLionel Sambuc 3851*0a6a1f1dSLionel Sambuc 3852*0a6a1f1dSLionel Sambuc and local4, local2, local4 3853*0a6a1f1dSLionel Sambuc nop !or global1, %lo(DES_SPtrans), global1 ! sbox addr 3854*0a6a1f1dSLionel Sambuc 3855*0a6a1f1dSLionel Sambuc sll local4, 16, local1 3856*0a6a1f1dSLionel Sambuc xor out5, local4, out5 3857*0a6a1f1dSLionel Sambuc 3858*0a6a1f1dSLionel Sambuc srl out5, 2, local4 3859*0a6a1f1dSLionel Sambuc xor in5, local1, in5 3860*0a6a1f1dSLionel Sambuc 3861*0a6a1f1dSLionel Sambuc sethi %hi(16711680), local5 3862*0a6a1f1dSLionel Sambuc xor local4, in5, local4 3863*0a6a1f1dSLionel Sambuc 3864*0a6a1f1dSLionel Sambuc and local4, local3, local4 3865*0a6a1f1dSLionel Sambuc or local5, 255, local5 3866*0a6a1f1dSLionel Sambuc 3867*0a6a1f1dSLionel Sambuc sll local4, 2, local2 3868*0a6a1f1dSLionel Sambuc xor in5, local4, in5 3869*0a6a1f1dSLionel Sambuc 3870*0a6a1f1dSLionel Sambuc srl in5, 8, local4 3871*0a6a1f1dSLionel Sambuc xor out5, local2, out5 3872*0a6a1f1dSLionel Sambuc 3873*0a6a1f1dSLionel Sambuc xor local4, out5, local4 3874*0a6a1f1dSLionel Sambuc add global1, 768, global4 3875*0a6a1f1dSLionel Sambuc 3876*0a6a1f1dSLionel Sambuc and local4, local5, local4 3877*0a6a1f1dSLionel Sambuc add global1, 1024, global5 3878*0a6a1f1dSLionel Sambuc 3879*0a6a1f1dSLionel Sambuc ld [out2+272], local7 3880*0a6a1f1dSLionel Sambuc sll local4, 8, local1 3881*0a6a1f1dSLionel Sambuc xor out5, local4, out5 3882*0a6a1f1dSLionel Sambuc 3883*0a6a1f1dSLionel Sambuc srl out5, 1, local4 3884*0a6a1f1dSLionel Sambuc xor in5, local1, in5 3885*0a6a1f1dSLionel Sambuc 3886*0a6a1f1dSLionel Sambuc ld [in3], out0 ! key 7531 3887*0a6a1f1dSLionel Sambuc xor local4, in5, local4 3888*0a6a1f1dSLionel Sambuc add global1, 256, global2 3889*0a6a1f1dSLionel Sambuc 3890*0a6a1f1dSLionel Sambuc ld [in3+4], out1 ! key 8642 3891*0a6a1f1dSLionel Sambuc and local4, local7, local4 3892*0a6a1f1dSLionel Sambuc add global1, 512, global3 3893*0a6a1f1dSLionel Sambuc 3894*0a6a1f1dSLionel Sambuc sll local4, 1, local1 3895*0a6a1f1dSLionel Sambuc xor in5, local4, in5 3896*0a6a1f1dSLionel Sambuc 3897*0a6a1f1dSLionel Sambuc sll in5, 3, local3 3898*0a6a1f1dSLionel Sambuc xor out5, local1, out5 3899*0a6a1f1dSLionel Sambuc 3900*0a6a1f1dSLionel Sambuc sll out5, 3, local2 3901*0a6a1f1dSLionel Sambuc add global1, 1280, local6 ! address sbox 8 3902*0a6a1f1dSLionel Sambuc 3903*0a6a1f1dSLionel Sambuc srl in5, 29, local4 3904*0a6a1f1dSLionel Sambuc add global1, 1792, out3 ! address sbox 8 3905*0a6a1f1dSLionel Sambuc 3906*0a6a1f1dSLionel Sambuc srl out5, 29, local1 3907*0a6a1f1dSLionel Sambuc or local4, local3, out5 3908*0a6a1f1dSLionel Sambuc 3909*0a6a1f1dSLionel Sambuc or local2, local1, in5 3910*0a6a1f1dSLionel Sambuc 3911*0a6a1f1dSLionel Sambuc 3912*0a6a1f1dSLionel Sambuc 3913*0a6a1f1dSLionel Sambuc 3914*0a6a1f1dSLionel Sambuc 3915*0a6a1f1dSLionel Sambuc 3916*0a6a1f1dSLionel Sambuc.ede3.enc.next.block_2: 3917*0a6a1f1dSLionel Sambuc 3918*0a6a1f1dSLionel Sambuc call .des_enc ! ks1 in3 3919*0a6a1f1dSLionel Sambuc nop 3920*0a6a1f1dSLionel Sambuc 3921*0a6a1f1dSLionel Sambuc call .des_dec ! ks2 in4 3922*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+5*ARGSZ] , in3 3923*0a6a1f1dSLionel Sambuc 3924*0a6a1f1dSLionel Sambuc call .des_enc ! ks3 in3 compares in2 to 8 3925*0a6a1f1dSLionel Sambuc nop 3926*0a6a1f1dSLionel Sambuc 3927*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3928*0a6a1f1dSLionel Sambuc bl,pn %icc, .ede3.enc.next.block_fp 3929*0a6a1f1dSLionel Sambuc#else 3930*0a6a1f1dSLionel Sambuc bl .ede3.enc.next.block_fp 3931*0a6a1f1dSLionel Sambuc#endif 3932*0a6a1f1dSLionel Sambuc add in0, 8, in0 3933*0a6a1f1dSLionel Sambuc 3934*0a6a1f1dSLionel Sambuc ! If 8 or more bytes are to be encrypted after this block, 3935*0a6a1f1dSLionel Sambuc ! we combine final permutation for this block with initial 3936*0a6a1f1dSLionel Sambuc ! permutation for next block. Load next block: 3937*0a6a1f1dSLionel Sambuc 3938*0a6a1f1dSLionel Sambuc 3939*0a6a1f1dSLionel Sambuc 3940*0a6a1f1dSLionel Sambuc! load_little_endian 3941*0a6a1f1dSLionel Sambuc! in0 global3 global4 local5 .LLE11 3942*0a6a1f1dSLionel Sambuc 3943*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 3944*0a6a1f1dSLionel Sambuc 3945*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 3946*0a6a1f1dSLionel Sambuc andcc in0, 3, global0 3947*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE11 3948*0a6a1f1dSLionel Sambuc nop 3949*0a6a1f1dSLionel Sambuc 3950*0a6a1f1dSLionel Sambuc lda [in0] 0x88, global3 3951*0a6a1f1dSLionel Sambuc add in0, 4, local5 3952*0a6a1f1dSLionel Sambuc 3953*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE11a 3954*0a6a1f1dSLionel Sambuc lda [local5] 0x88, global4 3955*0a6a1f1dSLionel Sambuc#endif 3956*0a6a1f1dSLionel Sambuc 3957*0a6a1f1dSLionel Sambuc.LLE11: 3958*0a6a1f1dSLionel Sambuc ldub [in0+3], global3 3959*0a6a1f1dSLionel Sambuc 3960*0a6a1f1dSLionel Sambuc ldub [in0+2], local5 3961*0a6a1f1dSLionel Sambuc sll global3, 8, global3 3962*0a6a1f1dSLionel Sambuc or global3, local5, global3 3963*0a6a1f1dSLionel Sambuc 3964*0a6a1f1dSLionel Sambuc ldub [in0+1], local5 3965*0a6a1f1dSLionel Sambuc sll global3, 8, global3 3966*0a6a1f1dSLionel Sambuc or global3, local5, global3 3967*0a6a1f1dSLionel Sambuc 3968*0a6a1f1dSLionel Sambuc ldub [in0+0], local5 3969*0a6a1f1dSLionel Sambuc sll global3, 8, global3 3970*0a6a1f1dSLionel Sambuc or global3, local5, global3 3971*0a6a1f1dSLionel Sambuc 3972*0a6a1f1dSLionel Sambuc 3973*0a6a1f1dSLionel Sambuc ldub [in0+3+4], global4 3974*0a6a1f1dSLionel Sambuc 3975*0a6a1f1dSLionel Sambuc ldub [in0+2+4], local5 3976*0a6a1f1dSLionel Sambuc sll global4, 8, global4 3977*0a6a1f1dSLionel Sambuc or global4, local5, global4 3978*0a6a1f1dSLionel Sambuc 3979*0a6a1f1dSLionel Sambuc ldub [in0+1+4], local5 3980*0a6a1f1dSLionel Sambuc sll global4, 8, global4 3981*0a6a1f1dSLionel Sambuc or global4, local5, global4 3982*0a6a1f1dSLionel Sambuc 3983*0a6a1f1dSLionel Sambuc ldub [in0+0+4], local5 3984*0a6a1f1dSLionel Sambuc sll global4, 8, global4 3985*0a6a1f1dSLionel Sambuc or global4, local5, global4 3986*0a6a1f1dSLionel Sambuc.LLE11a: 3987*0a6a1f1dSLionel Sambuc 3988*0a6a1f1dSLionel Sambuc 3989*0a6a1f1dSLionel Sambuc 3990*0a6a1f1dSLionel Sambuc ! parameter 1 original left 3991*0a6a1f1dSLionel Sambuc ! parameter 2 original right 3992*0a6a1f1dSLionel Sambuc ! parameter 3 left ip 3993*0a6a1f1dSLionel Sambuc ! parameter 4 right ip 3994*0a6a1f1dSLionel Sambuc ! parameter 5 1: load ks1/ks2 to in3/in4, add 120 to in4 3995*0a6a1f1dSLionel Sambuc ! 2: mov in4 to in3 3996*0a6a1f1dSLionel Sambuc ! 3997*0a6a1f1dSLionel Sambuc ! also adds -8 to length in2 and loads loop counter to out4 3998*0a6a1f1dSLionel Sambuc 3999*0a6a1f1dSLionel Sambuc 4000*0a6a1f1dSLionel Sambuc 4001*0a6a1f1dSLionel Sambuc! fp_ip_macro 4002*0a6a1f1dSLionel Sambuc! out0 out1 global3 global4 1 4003*0a6a1f1dSLionel Sambuc 4004*0a6a1f1dSLionel Sambuc 4005*0a6a1f1dSLionel Sambuc 4006*0a6a1f1dSLionel Sambuc 4007*0a6a1f1dSLionel Sambuc 4008*0a6a1f1dSLionel Sambuc 4009*0a6a1f1dSLionel Sambuc 4010*0a6a1f1dSLionel Sambuc 4011*0a6a1f1dSLionel Sambuc 4012*0a6a1f1dSLionel Sambuc ! out0 in local3, local4 4013*0a6a1f1dSLionel Sambuc 4014*0a6a1f1dSLionel Sambuc ld [out2+256], local1 4015*0a6a1f1dSLionel Sambuc sll out5, 29, out4 4016*0a6a1f1dSLionel Sambuc or local3, local4, out0 4017*0a6a1f1dSLionel Sambuc 4018*0a6a1f1dSLionel Sambuc srl out5, 3, out1 4019*0a6a1f1dSLionel Sambuc 4020*0a6a1f1dSLionel Sambuc 4021*0a6a1f1dSLionel Sambuc ld [out2+272], local5 4022*0a6a1f1dSLionel Sambuc srl global4, 4, local0 4023*0a6a1f1dSLionel Sambuc or out1, out4, out1 4024*0a6a1f1dSLionel Sambuc 4025*0a6a1f1dSLionel Sambuc srl out1, 1, out4 4026*0a6a1f1dSLionel Sambuc xor out4, out0, out4 4027*0a6a1f1dSLionel Sambuc 4028*0a6a1f1dSLionel Sambuc and out4, local5, out4 4029*0a6a1f1dSLionel Sambuc xor local0, global3, local0 4030*0a6a1f1dSLionel Sambuc 4031*0a6a1f1dSLionel Sambuc sll out4, 1, local3 4032*0a6a1f1dSLionel Sambuc xor out0, out4, out0 4033*0a6a1f1dSLionel Sambuc 4034*0a6a1f1dSLionel Sambuc and local0, local1, local0 4035*0a6a1f1dSLionel Sambuc add in2, -8, in2 4036*0a6a1f1dSLionel Sambuc 4037*0a6a1f1dSLionel Sambuc sll local0, 4, local7 4038*0a6a1f1dSLionel Sambuc xor global3, local0, global3 4039*0a6a1f1dSLionel Sambuc 4040*0a6a1f1dSLionel Sambuc ld [out2+268], local4 4041*0a6a1f1dSLionel Sambuc srl out0, 8, out4 4042*0a6a1f1dSLionel Sambuc xor out1, local3, out1 4043*0a6a1f1dSLionel Sambuc ld [out2+260], local2 4044*0a6a1f1dSLionel Sambuc srl global3, 16, local0 4045*0a6a1f1dSLionel Sambuc xor global4, local7, global4 4046*0a6a1f1dSLionel Sambuc xor out4, out1, out4 4047*0a6a1f1dSLionel Sambuc xor local0, global4, local0 4048*0a6a1f1dSLionel Sambuc and out4, local4, out4 4049*0a6a1f1dSLionel Sambuc and local0, local2, local0 4050*0a6a1f1dSLionel Sambuc sll out4, 8, local3 4051*0a6a1f1dSLionel Sambuc xor out1, out4, out1 4052*0a6a1f1dSLionel Sambuc sll local0, 16, local7 4053*0a6a1f1dSLionel Sambuc xor global4, local0, global4 4054*0a6a1f1dSLionel Sambuc 4055*0a6a1f1dSLionel Sambuc srl out1, 2, out4 4056*0a6a1f1dSLionel Sambuc xor out0, local3, out0 4057*0a6a1f1dSLionel Sambuc 4058*0a6a1f1dSLionel Sambuc ld [out2+264], local3 ! ip3 4059*0a6a1f1dSLionel Sambuc srl global4, 2, local0 4060*0a6a1f1dSLionel Sambuc xor global3, local7, global3 4061*0a6a1f1dSLionel Sambuc xor out4, out0, out4 4062*0a6a1f1dSLionel Sambuc xor local0, global3, local0 4063*0a6a1f1dSLionel Sambuc and out4, local3, out4 4064*0a6a1f1dSLionel Sambuc and local0, local3, local0 4065*0a6a1f1dSLionel Sambuc sll out4, 2, local3 4066*0a6a1f1dSLionel Sambuc xor out0, out4, out0 4067*0a6a1f1dSLionel Sambuc sll local0, 2, local7 4068*0a6a1f1dSLionel Sambuc xor global3, local0, global3 4069*0a6a1f1dSLionel Sambuc 4070*0a6a1f1dSLionel Sambuc srl out0, 16, out4 4071*0a6a1f1dSLionel Sambuc xor out1, local3, out1 4072*0a6a1f1dSLionel Sambuc srl global3, 8, local0 4073*0a6a1f1dSLionel Sambuc xor global4, local7, global4 4074*0a6a1f1dSLionel Sambuc xor out4, out1, out4 4075*0a6a1f1dSLionel Sambuc xor local0, global4, local0 4076*0a6a1f1dSLionel Sambuc and out4, local2, out4 4077*0a6a1f1dSLionel Sambuc and local0, local4, local0 4078*0a6a1f1dSLionel Sambuc sll out4, 16, local3 4079*0a6a1f1dSLionel Sambuc xor out1, out4, local4 4080*0a6a1f1dSLionel Sambuc sll local0, 8, local7 4081*0a6a1f1dSLionel Sambuc xor global4, local0, global4 4082*0a6a1f1dSLionel Sambuc 4083*0a6a1f1dSLionel Sambuc srl global4, 1, local0 4084*0a6a1f1dSLionel Sambuc xor global3, local7, global3 4085*0a6a1f1dSLionel Sambuc 4086*0a6a1f1dSLionel Sambuc srl local4, 4, out4 4087*0a6a1f1dSLionel Sambuc xor local0, global3, local0 4088*0a6a1f1dSLionel Sambuc 4089*0a6a1f1dSLionel Sambuc xor out0, local3, out0 4090*0a6a1f1dSLionel Sambuc and local0, local5, local0 4091*0a6a1f1dSLionel Sambuc 4092*0a6a1f1dSLionel Sambuc sll local0, 1, local7 4093*0a6a1f1dSLionel Sambuc xor out4, out0, out4 4094*0a6a1f1dSLionel Sambuc 4095*0a6a1f1dSLionel Sambuc xor global3, local0, global3 4096*0a6a1f1dSLionel Sambuc xor global4, local7, global4 4097*0a6a1f1dSLionel Sambuc 4098*0a6a1f1dSLionel Sambuc sll global3, 3, local5 4099*0a6a1f1dSLionel Sambuc and out4, local1, out4 4100*0a6a1f1dSLionel Sambuc 4101*0a6a1f1dSLionel Sambuc sll out4, 4, local3 4102*0a6a1f1dSLionel Sambuc xor out0, out4, out0 4103*0a6a1f1dSLionel Sambuc 4104*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+4*ARGSZ] , in4 4105*0a6a1f1dSLionel Sambuc sll global4, 3, local2 4106*0a6a1f1dSLionel Sambuc xor local4, local3, out1 4107*0a6a1f1dSLionel Sambuc 4108*0a6a1f1dSLionel Sambuc ! reload since used as temporar: 4109*0a6a1f1dSLionel Sambuc 4110*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 4111*0a6a1f1dSLionel Sambuc 4112*0a6a1f1dSLionel Sambuc srl global3, 29, local0 4113*0a6a1f1dSLionel Sambuc add in4, 120, in4 4114*0a6a1f1dSLionel Sambuc 4115*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+3*ARGSZ] , in3 4116*0a6a1f1dSLionel Sambuc srl global4, 29, local7 4117*0a6a1f1dSLionel Sambuc 4118*0a6a1f1dSLionel Sambuc or local0, local5, global4 4119*0a6a1f1dSLionel Sambuc or local2, local7, global3 4120*0a6a1f1dSLionel Sambuc 4121*0a6a1f1dSLionel Sambuc 4122*0a6a1f1dSLionel Sambuc 4123*0a6a1f1dSLionel Sambuc 4124*0a6a1f1dSLionel Sambuc 4125*0a6a1f1dSLionel Sambuc! store_little_endian 4126*0a6a1f1dSLionel Sambuc! in1 out0 out1 local3 .SLE9 4127*0a6a1f1dSLionel Sambuc 4128*0a6a1f1dSLionel Sambuc ! rightmost in register to first in memory 4129*0a6a1f1dSLionel Sambuc 4130*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4131*0a6a1f1dSLionel Sambuc andcc in1, 3, global0 4132*0a6a1f1dSLionel Sambuc bne,pn %icc, .SLE9 4133*0a6a1f1dSLionel Sambuc nop 4134*0a6a1f1dSLionel Sambuc 4135*0a6a1f1dSLionel Sambuc sta out0, [in1] 0x88 4136*0a6a1f1dSLionel Sambuc add in1, 4, local3 4137*0a6a1f1dSLionel Sambuc 4138*0a6a1f1dSLionel Sambuc ba,pt %icc, .SLE9a 4139*0a6a1f1dSLionel Sambuc sta out1, [local3] 0x88 4140*0a6a1f1dSLionel Sambuc#endif 4141*0a6a1f1dSLionel Sambuc 4142*0a6a1f1dSLionel Sambuc.SLE9: 4143*0a6a1f1dSLionel Sambuc and out0, 255, local3 4144*0a6a1f1dSLionel Sambuc stub local3, [in1+0] 4145*0a6a1f1dSLionel Sambuc 4146*0a6a1f1dSLionel Sambuc srl out0, 8, local3 4147*0a6a1f1dSLionel Sambuc and local3, 255, local3 4148*0a6a1f1dSLionel Sambuc stub local3, [in1+1] 4149*0a6a1f1dSLionel Sambuc 4150*0a6a1f1dSLionel Sambuc srl out0, 16, local3 4151*0a6a1f1dSLionel Sambuc and local3, 255, local3 4152*0a6a1f1dSLionel Sambuc stub local3, [in1+2] 4153*0a6a1f1dSLionel Sambuc 4154*0a6a1f1dSLionel Sambuc srl out0, 24, local3 4155*0a6a1f1dSLionel Sambuc stub local3, [in1+3] 4156*0a6a1f1dSLionel Sambuc 4157*0a6a1f1dSLionel Sambuc 4158*0a6a1f1dSLionel Sambuc and out1, 255, local3 4159*0a6a1f1dSLionel Sambuc stub local3, [in1+0+4] 4160*0a6a1f1dSLionel Sambuc 4161*0a6a1f1dSLionel Sambuc srl out1, 8, local3 4162*0a6a1f1dSLionel Sambuc and local3, 255, local3 4163*0a6a1f1dSLionel Sambuc stub local3, [in1+1+4] 4164*0a6a1f1dSLionel Sambuc 4165*0a6a1f1dSLionel Sambuc srl out1, 16, local3 4166*0a6a1f1dSLionel Sambuc and local3, 255, local3 4167*0a6a1f1dSLionel Sambuc stub local3, [in1+2+4] 4168*0a6a1f1dSLionel Sambuc 4169*0a6a1f1dSLionel Sambuc srl out1, 24, local3 4170*0a6a1f1dSLionel Sambuc stub local3, [in1+3+4] 4171*0a6a1f1dSLionel Sambuc 4172*0a6a1f1dSLionel Sambuc.SLE9a: 4173*0a6a1f1dSLionel Sambuc 4174*0a6a1f1dSLionel Sambuc ! block 4175*0a6a1f1dSLionel Sambuc 4176*0a6a1f1dSLionel Sambuc mov in5, local1 4177*0a6a1f1dSLionel Sambuc xor global3, out5, in5 ! iv xor next block 4178*0a6a1f1dSLionel Sambuc 4179*0a6a1f1dSLionel Sambuc ld [in3], out0 ! key 7531 4180*0a6a1f1dSLionel Sambuc add global1, 512, global3 ! address sbox 3 4181*0a6a1f1dSLionel Sambuc xor global4, local1, out5 ! iv xor next block 4182*0a6a1f1dSLionel Sambuc 4183*0a6a1f1dSLionel Sambuc ld [in3+4], out1 ! key 8642 4184*0a6a1f1dSLionel Sambuc add global1, 768, global4 ! address sbox 4 4185*0a6a1f1dSLionel Sambuc ba .ede3.enc.next.block_2 4186*0a6a1f1dSLionel Sambuc add in1, 8, in1 4187*0a6a1f1dSLionel Sambuc 4188*0a6a1f1dSLionel Sambuc.ede3.enc.next.block_fp: 4189*0a6a1f1dSLionel Sambuc 4190*0a6a1f1dSLionel Sambuc 4191*0a6a1f1dSLionel Sambuc 4192*0a6a1f1dSLionel Sambuc! fp_macro 4193*0a6a1f1dSLionel Sambuc! in5 out5 4194*0a6a1f1dSLionel Sambuc 4195*0a6a1f1dSLionel Sambuc ! initially undo the rotate 3 left done after initial permutation 4196*0a6a1f1dSLionel Sambuc ! original left is received shifted 3 right and 29 left in local3/4 4197*0a6a1f1dSLionel Sambuc 4198*0a6a1f1dSLionel Sambuc sll out5, 29, local1 4199*0a6a1f1dSLionel Sambuc or local3, local4, in5 4200*0a6a1f1dSLionel Sambuc 4201*0a6a1f1dSLionel Sambuc srl out5, 3, out5 4202*0a6a1f1dSLionel Sambuc sethi %hi(0x55555555), local2 4203*0a6a1f1dSLionel Sambuc 4204*0a6a1f1dSLionel Sambuc or out5, local1, out5 4205*0a6a1f1dSLionel Sambuc or local2, %lo(0x55555555), local2 4206*0a6a1f1dSLionel Sambuc 4207*0a6a1f1dSLionel Sambuc srl out5, 1, local3 4208*0a6a1f1dSLionel Sambuc sethi %hi(0x00ff00ff), local1 4209*0a6a1f1dSLionel Sambuc xor local3, in5, local3 4210*0a6a1f1dSLionel Sambuc or local1, %lo(0x00ff00ff), local1 4211*0a6a1f1dSLionel Sambuc and local3, local2, local3 4212*0a6a1f1dSLionel Sambuc sethi %hi(0x33333333), local4 4213*0a6a1f1dSLionel Sambuc sll local3, 1, local2 4214*0a6a1f1dSLionel Sambuc 4215*0a6a1f1dSLionel Sambuc xor in5, local3, in5 4216*0a6a1f1dSLionel Sambuc 4217*0a6a1f1dSLionel Sambuc srl in5, 8, local3 4218*0a6a1f1dSLionel Sambuc xor out5, local2, out5 4219*0a6a1f1dSLionel Sambuc xor local3, out5, local3 4220*0a6a1f1dSLionel Sambuc or local4, %lo(0x33333333), local4 4221*0a6a1f1dSLionel Sambuc and local3, local1, local3 4222*0a6a1f1dSLionel Sambuc sethi %hi(0x0000ffff), local1 4223*0a6a1f1dSLionel Sambuc sll local3, 8, local2 4224*0a6a1f1dSLionel Sambuc 4225*0a6a1f1dSLionel Sambuc xor out5, local3, out5 4226*0a6a1f1dSLionel Sambuc 4227*0a6a1f1dSLionel Sambuc srl out5, 2, local3 4228*0a6a1f1dSLionel Sambuc xor in5, local2, in5 4229*0a6a1f1dSLionel Sambuc xor local3, in5, local3 4230*0a6a1f1dSLionel Sambuc or local1, %lo(0x0000ffff), local1 4231*0a6a1f1dSLionel Sambuc and local3, local4, local3 4232*0a6a1f1dSLionel Sambuc sethi %hi(0x0f0f0f0f), local4 4233*0a6a1f1dSLionel Sambuc sll local3, 2, local2 4234*0a6a1f1dSLionel Sambuc 4235*0a6a1f1dSLionel Sambuc 4236*0a6a1f1dSLionel Sambuc xor in5, local3, in5 4237*0a6a1f1dSLionel Sambuc 4238*0a6a1f1dSLionel Sambuc 4239*0a6a1f1dSLionel Sambuc srl in5, 16, local3 4240*0a6a1f1dSLionel Sambuc xor out5, local2, out5 4241*0a6a1f1dSLionel Sambuc xor local3, out5, local3 4242*0a6a1f1dSLionel Sambuc or local4, %lo(0x0f0f0f0f), local4 4243*0a6a1f1dSLionel Sambuc and local3, local1, local3 4244*0a6a1f1dSLionel Sambuc sll local3, 16, local2 4245*0a6a1f1dSLionel Sambuc 4246*0a6a1f1dSLionel Sambuc xor out5, local3, local1 4247*0a6a1f1dSLionel Sambuc 4248*0a6a1f1dSLionel Sambuc srl local1, 4, local3 4249*0a6a1f1dSLionel Sambuc xor in5, local2, in5 4250*0a6a1f1dSLionel Sambuc xor local3, in5, local3 4251*0a6a1f1dSLionel Sambuc and local3, local4, local3 4252*0a6a1f1dSLionel Sambuc sll local3, 4, local2 4253*0a6a1f1dSLionel Sambuc 4254*0a6a1f1dSLionel Sambuc xor in5, local3, in5 4255*0a6a1f1dSLionel Sambuc 4256*0a6a1f1dSLionel Sambuc ! optional store: 4257*0a6a1f1dSLionel Sambuc 4258*0a6a1f1dSLionel Sambuc 4259*0a6a1f1dSLionel Sambuc 4260*0a6a1f1dSLionel Sambuc xor local1, local2, out5 4261*0a6a1f1dSLionel Sambuc 4262*0a6a1f1dSLionel Sambuc 4263*0a6a1f1dSLionel Sambuc 4264*0a6a1f1dSLionel Sambuc 4265*0a6a1f1dSLionel Sambuc 4266*0a6a1f1dSLionel Sambuc 4267*0a6a1f1dSLionel Sambuc 4268*0a6a1f1dSLionel Sambuc! store_little_endian 4269*0a6a1f1dSLionel Sambuc! in1 in5 out5 local3 .SLE5 4270*0a6a1f1dSLionel Sambuc 4271*0a6a1f1dSLionel Sambuc ! rightmost in register to first in memory 4272*0a6a1f1dSLionel Sambuc 4273*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4274*0a6a1f1dSLionel Sambuc andcc in1, 3, global0 4275*0a6a1f1dSLionel Sambuc bne,pn %icc, .SLE5 4276*0a6a1f1dSLionel Sambuc nop 4277*0a6a1f1dSLionel Sambuc 4278*0a6a1f1dSLionel Sambuc sta in5, [in1] 0x88 4279*0a6a1f1dSLionel Sambuc add in1, 4, local3 4280*0a6a1f1dSLionel Sambuc 4281*0a6a1f1dSLionel Sambuc ba,pt %icc, .SLE5a 4282*0a6a1f1dSLionel Sambuc sta out5, [local3] 0x88 4283*0a6a1f1dSLionel Sambuc#endif 4284*0a6a1f1dSLionel Sambuc 4285*0a6a1f1dSLionel Sambuc.SLE5: 4286*0a6a1f1dSLionel Sambuc and in5, 255, local3 4287*0a6a1f1dSLionel Sambuc stub local3, [in1+0] 4288*0a6a1f1dSLionel Sambuc 4289*0a6a1f1dSLionel Sambuc srl in5, 8, local3 4290*0a6a1f1dSLionel Sambuc and local3, 255, local3 4291*0a6a1f1dSLionel Sambuc stub local3, [in1+1] 4292*0a6a1f1dSLionel Sambuc 4293*0a6a1f1dSLionel Sambuc srl in5, 16, local3 4294*0a6a1f1dSLionel Sambuc and local3, 255, local3 4295*0a6a1f1dSLionel Sambuc stub local3, [in1+2] 4296*0a6a1f1dSLionel Sambuc 4297*0a6a1f1dSLionel Sambuc srl in5, 24, local3 4298*0a6a1f1dSLionel Sambuc stub local3, [in1+3] 4299*0a6a1f1dSLionel Sambuc 4300*0a6a1f1dSLionel Sambuc 4301*0a6a1f1dSLionel Sambuc and out5, 255, local3 4302*0a6a1f1dSLionel Sambuc stub local3, [in1+0+4] 4303*0a6a1f1dSLionel Sambuc 4304*0a6a1f1dSLionel Sambuc srl out5, 8, local3 4305*0a6a1f1dSLionel Sambuc and local3, 255, local3 4306*0a6a1f1dSLionel Sambuc stub local3, [in1+1+4] 4307*0a6a1f1dSLionel Sambuc 4308*0a6a1f1dSLionel Sambuc srl out5, 16, local3 4309*0a6a1f1dSLionel Sambuc and local3, 255, local3 4310*0a6a1f1dSLionel Sambuc stub local3, [in1+2+4] 4311*0a6a1f1dSLionel Sambuc 4312*0a6a1f1dSLionel Sambuc srl out5, 24, local3 4313*0a6a1f1dSLionel Sambuc stub local3, [in1+3+4] 4314*0a6a1f1dSLionel Sambuc 4315*0a6a1f1dSLionel Sambuc.SLE5a: 4316*0a6a1f1dSLionel Sambuc 4317*0a6a1f1dSLionel Sambuc ! block 4318*0a6a1f1dSLionel Sambuc 4319*0a6a1f1dSLionel Sambuc addcc in2, -8, in2 ! bytes missing when next block done 4320*0a6a1f1dSLionel Sambuc 4321*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4322*0a6a1f1dSLionel Sambuc bpos,pt %icc, .ede3.enc.next.block 4323*0a6a1f1dSLionel Sambuc#else 4324*0a6a1f1dSLionel Sambuc bpos .ede3.enc.next.block 4325*0a6a1f1dSLionel Sambuc#endif 4326*0a6a1f1dSLionel Sambuc add in1, 8, in1 4327*0a6a1f1dSLionel Sambuc 4328*0a6a1f1dSLionel Sambuc.ede3.enc.seven.or.less: 4329*0a6a1f1dSLionel Sambuc 4330*0a6a1f1dSLionel Sambuc cmp in2, -8 4331*0a6a1f1dSLionel Sambuc 4332*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4333*0a6a1f1dSLionel Sambuc ble,pt %icc, .ede3.enc.finish 4334*0a6a1f1dSLionel Sambuc#else 4335*0a6a1f1dSLionel Sambuc ble .ede3.enc.finish 4336*0a6a1f1dSLionel Sambuc#endif 4337*0a6a1f1dSLionel Sambuc nop 4338*0a6a1f1dSLionel Sambuc 4339*0a6a1f1dSLionel Sambuc add in2, 8, local1 ! bytes to load 4340*0a6a1f1dSLionel Sambuc 4341*0a6a1f1dSLionel Sambuc ! addr, length, dest left, dest right, temp, local3, label, ret label 4342*0a6a1f1dSLionel Sambuc 4343*0a6a1f1dSLionel Sambuc 4344*0a6a1f1dSLionel Sambuc! load_n_bytes 4345*0a6a1f1dSLionel Sambuc! in0 local1 local2 local3 .LNB2 .ede3.enc.next.block_1 .LNB2 .ede3.enc.next.block_1 4346*0a6a1f1dSLionel Sambuc 4347*0a6a1f1dSLionel Sambuc.LNB2.0: call .+8 4348*0a6a1f1dSLionel Sambuc sll local1, 2, local3 4349*0a6a1f1dSLionel Sambuc 4350*0a6a1f1dSLionel Sambuc add %o7,.LNB2.jmp.table-.LNB2.0,local2 4351*0a6a1f1dSLionel Sambuc 4352*0a6a1f1dSLionel Sambuc add local2, local3, local2 4353*0a6a1f1dSLionel Sambuc mov 0, out4 4354*0a6a1f1dSLionel Sambuc 4355*0a6a1f1dSLionel Sambuc ld [local2], local2 4356*0a6a1f1dSLionel Sambuc 4357*0a6a1f1dSLionel Sambuc jmp %o7+local2 4358*0a6a1f1dSLionel Sambuc mov 0, global4 4359*0a6a1f1dSLionel Sambuc 4360*0a6a1f1dSLionel Sambuc.LNB2.7: 4361*0a6a1f1dSLionel Sambuc ldub [in0+6], local2 4362*0a6a1f1dSLionel Sambuc sll local2, 16, local2 4363*0a6a1f1dSLionel Sambuc or global4, local2, global4 4364*0a6a1f1dSLionel Sambuc.LNB2.6: 4365*0a6a1f1dSLionel Sambuc ldub [in0+5], local2 4366*0a6a1f1dSLionel Sambuc sll local2, 8, local2 4367*0a6a1f1dSLionel Sambuc or global4, local2, global4 4368*0a6a1f1dSLionel Sambuc.LNB2.5: 4369*0a6a1f1dSLionel Sambuc ldub [in0+4], local2 4370*0a6a1f1dSLionel Sambuc or global4, local2, global4 4371*0a6a1f1dSLionel Sambuc.LNB2.4: 4372*0a6a1f1dSLionel Sambuc ldub [in0+3], local2 4373*0a6a1f1dSLionel Sambuc sll local2, 24, local2 4374*0a6a1f1dSLionel Sambuc or out4, local2, out4 4375*0a6a1f1dSLionel Sambuc.LNB2.3: 4376*0a6a1f1dSLionel Sambuc ldub [in0+2], local2 4377*0a6a1f1dSLionel Sambuc sll local2, 16, local2 4378*0a6a1f1dSLionel Sambuc or out4, local2, out4 4379*0a6a1f1dSLionel Sambuc.LNB2.2: 4380*0a6a1f1dSLionel Sambuc ldub [in0+1], local2 4381*0a6a1f1dSLionel Sambuc sll local2, 8, local2 4382*0a6a1f1dSLionel Sambuc or out4, local2, out4 4383*0a6a1f1dSLionel Sambuc.LNB2.1: 4384*0a6a1f1dSLionel Sambuc ldub [in0+0], local2 4385*0a6a1f1dSLionel Sambuc ba .ede3.enc.next.block_1 4386*0a6a1f1dSLionel Sambuc or out4, local2, out4 4387*0a6a1f1dSLionel Sambuc 4388*0a6a1f1dSLionel Sambuc .align 4 4389*0a6a1f1dSLionel Sambuc 4390*0a6a1f1dSLionel Sambuc.LNB2.jmp.table: 4391*0a6a1f1dSLionel Sambuc .word 0 4392*0a6a1f1dSLionel Sambuc .word .LNB2.1-.LNB2.0 4393*0a6a1f1dSLionel Sambuc .word .LNB2.2-.LNB2.0 4394*0a6a1f1dSLionel Sambuc .word .LNB2.3-.LNB2.0 4395*0a6a1f1dSLionel Sambuc .word .LNB2.4-.LNB2.0 4396*0a6a1f1dSLionel Sambuc .word .LNB2.5-.LNB2.0 4397*0a6a1f1dSLionel Sambuc .word .LNB2.6-.LNB2.0 4398*0a6a1f1dSLionel Sambuc .word .LNB2.7-.LNB2.0 4399*0a6a1f1dSLionel Sambuc 4400*0a6a1f1dSLionel Sambuc 4401*0a6a1f1dSLionel Sambuc.ede3.enc.finish: 4402*0a6a1f1dSLionel Sambuc 4403*0a6a1f1dSLionel Sambuc LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local4 ! ivec 4404*0a6a1f1dSLionel Sambuc 4405*0a6a1f1dSLionel Sambuc 4406*0a6a1f1dSLionel Sambuc! store_little_endian 4407*0a6a1f1dSLionel Sambuc! local4 in5 out5 local5 .SLE6 4408*0a6a1f1dSLionel Sambuc 4409*0a6a1f1dSLionel Sambuc ! rightmost in register to first in memory 4410*0a6a1f1dSLionel Sambuc 4411*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4412*0a6a1f1dSLionel Sambuc andcc local4, 3, global0 4413*0a6a1f1dSLionel Sambuc bne,pn %icc, .SLE6 4414*0a6a1f1dSLionel Sambuc nop 4415*0a6a1f1dSLionel Sambuc 4416*0a6a1f1dSLionel Sambuc sta in5, [local4] 0x88 4417*0a6a1f1dSLionel Sambuc add local4, 4, local5 4418*0a6a1f1dSLionel Sambuc 4419*0a6a1f1dSLionel Sambuc ba,pt %icc, .SLE6a 4420*0a6a1f1dSLionel Sambuc sta out5, [local5] 0x88 4421*0a6a1f1dSLionel Sambuc#endif 4422*0a6a1f1dSLionel Sambuc 4423*0a6a1f1dSLionel Sambuc.SLE6: 4424*0a6a1f1dSLionel Sambuc and in5, 255, local5 4425*0a6a1f1dSLionel Sambuc stub local5, [local4+0] 4426*0a6a1f1dSLionel Sambuc 4427*0a6a1f1dSLionel Sambuc srl in5, 8, local5 4428*0a6a1f1dSLionel Sambuc and local5, 255, local5 4429*0a6a1f1dSLionel Sambuc stub local5, [local4+1] 4430*0a6a1f1dSLionel Sambuc 4431*0a6a1f1dSLionel Sambuc srl in5, 16, local5 4432*0a6a1f1dSLionel Sambuc and local5, 255, local5 4433*0a6a1f1dSLionel Sambuc stub local5, [local4+2] 4434*0a6a1f1dSLionel Sambuc 4435*0a6a1f1dSLionel Sambuc srl in5, 24, local5 4436*0a6a1f1dSLionel Sambuc stub local5, [local4+3] 4437*0a6a1f1dSLionel Sambuc 4438*0a6a1f1dSLionel Sambuc 4439*0a6a1f1dSLionel Sambuc and out5, 255, local5 4440*0a6a1f1dSLionel Sambuc stub local5, [local4+0+4] 4441*0a6a1f1dSLionel Sambuc 4442*0a6a1f1dSLionel Sambuc srl out5, 8, local5 4443*0a6a1f1dSLionel Sambuc and local5, 255, local5 4444*0a6a1f1dSLionel Sambuc stub local5, [local4+1+4] 4445*0a6a1f1dSLionel Sambuc 4446*0a6a1f1dSLionel Sambuc srl out5, 16, local5 4447*0a6a1f1dSLionel Sambuc and local5, 255, local5 4448*0a6a1f1dSLionel Sambuc stub local5, [local4+2+4] 4449*0a6a1f1dSLionel Sambuc 4450*0a6a1f1dSLionel Sambuc srl out5, 24, local5 4451*0a6a1f1dSLionel Sambuc stub local5, [local4+3+4] 4452*0a6a1f1dSLionel Sambuc 4453*0a6a1f1dSLionel Sambuc.SLE6a: 4454*0a6a1f1dSLionel Sambuc 4455*0a6a1f1dSLionel Sambuc ! ivec 4456*0a6a1f1dSLionel Sambuc 4457*0a6a1f1dSLionel Sambuc ret 4458*0a6a1f1dSLionel Sambuc restore 4459*0a6a1f1dSLionel Sambuc 4460*0a6a1f1dSLionel Sambuc.ede3.dec: 4461*0a6a1f1dSLionel Sambuc 4462*0a6a1f1dSLionel Sambuc STPTR in0, [%sp+BIAS+ARG0+0*ARGSZ] 4463*0a6a1f1dSLionel Sambuc add in5, 120, in5 4464*0a6a1f1dSLionel Sambuc 4465*0a6a1f1dSLionel Sambuc STPTR in1, [%sp+BIAS+ARG0+1*ARGSZ] 4466*0a6a1f1dSLionel Sambuc mov in0, local5 4467*0a6a1f1dSLionel Sambuc add in3, 120, in3 4468*0a6a1f1dSLionel Sambuc 4469*0a6a1f1dSLionel Sambuc STPTR in3, [%sp+BIAS+ARG0+3*ARGSZ] 4470*0a6a1f1dSLionel Sambuc cmp in2, 0 4471*0a6a1f1dSLionel Sambuc 4472*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4473*0a6a1f1dSLionel Sambuc ble %icc, .ede3.dec.finish 4474*0a6a1f1dSLionel Sambuc#else 4475*0a6a1f1dSLionel Sambuc ble .ede3.dec.finish 4476*0a6a1f1dSLionel Sambuc#endif 4477*0a6a1f1dSLionel Sambuc STPTR in5, [%sp+BIAS+ARG0+5*ARGSZ] 4478*0a6a1f1dSLionel Sambuc 4479*0a6a1f1dSLionel Sambuc LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local7 ! iv 4480*0a6a1f1dSLionel Sambuc 4481*0a6a1f1dSLionel Sambuc 4482*0a6a1f1dSLionel Sambuc! load_little_endian 4483*0a6a1f1dSLionel Sambuc! local7 in0 in1 local3 .LLE8 4484*0a6a1f1dSLionel Sambuc 4485*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 4486*0a6a1f1dSLionel Sambuc 4487*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4488*0a6a1f1dSLionel Sambuc andcc local7, 3, global0 4489*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE8 4490*0a6a1f1dSLionel Sambuc nop 4491*0a6a1f1dSLionel Sambuc 4492*0a6a1f1dSLionel Sambuc lda [local7] 0x88, in0 4493*0a6a1f1dSLionel Sambuc add local7, 4, local3 4494*0a6a1f1dSLionel Sambuc 4495*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE8a 4496*0a6a1f1dSLionel Sambuc lda [local3] 0x88, in1 4497*0a6a1f1dSLionel Sambuc#endif 4498*0a6a1f1dSLionel Sambuc 4499*0a6a1f1dSLionel Sambuc.LLE8: 4500*0a6a1f1dSLionel Sambuc ldub [local7+3], in0 4501*0a6a1f1dSLionel Sambuc 4502*0a6a1f1dSLionel Sambuc ldub [local7+2], local3 4503*0a6a1f1dSLionel Sambuc sll in0, 8, in0 4504*0a6a1f1dSLionel Sambuc or in0, local3, in0 4505*0a6a1f1dSLionel Sambuc 4506*0a6a1f1dSLionel Sambuc ldub [local7+1], local3 4507*0a6a1f1dSLionel Sambuc sll in0, 8, in0 4508*0a6a1f1dSLionel Sambuc or in0, local3, in0 4509*0a6a1f1dSLionel Sambuc 4510*0a6a1f1dSLionel Sambuc ldub [local7+0], local3 4511*0a6a1f1dSLionel Sambuc sll in0, 8, in0 4512*0a6a1f1dSLionel Sambuc or in0, local3, in0 4513*0a6a1f1dSLionel Sambuc 4514*0a6a1f1dSLionel Sambuc 4515*0a6a1f1dSLionel Sambuc ldub [local7+3+4], in1 4516*0a6a1f1dSLionel Sambuc 4517*0a6a1f1dSLionel Sambuc ldub [local7+2+4], local3 4518*0a6a1f1dSLionel Sambuc sll in1, 8, in1 4519*0a6a1f1dSLionel Sambuc or in1, local3, in1 4520*0a6a1f1dSLionel Sambuc 4521*0a6a1f1dSLionel Sambuc ldub [local7+1+4], local3 4522*0a6a1f1dSLionel Sambuc sll in1, 8, in1 4523*0a6a1f1dSLionel Sambuc or in1, local3, in1 4524*0a6a1f1dSLionel Sambuc 4525*0a6a1f1dSLionel Sambuc ldub [local7+0+4], local3 4526*0a6a1f1dSLionel Sambuc sll in1, 8, in1 4527*0a6a1f1dSLionel Sambuc or in1, local3, in1 4528*0a6a1f1dSLionel Sambuc.LLE8a: 4529*0a6a1f1dSLionel Sambuc 4530*0a6a1f1dSLionel Sambuc 4531*0a6a1f1dSLionel Sambuc 4532*0a6a1f1dSLionel Sambuc.ede3.dec.next.block: 4533*0a6a1f1dSLionel Sambuc 4534*0a6a1f1dSLionel Sambuc 4535*0a6a1f1dSLionel Sambuc 4536*0a6a1f1dSLionel Sambuc! load_little_endian 4537*0a6a1f1dSLionel Sambuc! local5 in5 out5 local3 .LLE9 4538*0a6a1f1dSLionel Sambuc 4539*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 4540*0a6a1f1dSLionel Sambuc 4541*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4542*0a6a1f1dSLionel Sambuc andcc local5, 3, global0 4543*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE9 4544*0a6a1f1dSLionel Sambuc nop 4545*0a6a1f1dSLionel Sambuc 4546*0a6a1f1dSLionel Sambuc lda [local5] 0x88, in5 4547*0a6a1f1dSLionel Sambuc add local5, 4, local3 4548*0a6a1f1dSLionel Sambuc 4549*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE9a 4550*0a6a1f1dSLionel Sambuc lda [local3] 0x88, out5 4551*0a6a1f1dSLionel Sambuc#endif 4552*0a6a1f1dSLionel Sambuc 4553*0a6a1f1dSLionel Sambuc.LLE9: 4554*0a6a1f1dSLionel Sambuc ldub [local5+3], in5 4555*0a6a1f1dSLionel Sambuc 4556*0a6a1f1dSLionel Sambuc ldub [local5+2], local3 4557*0a6a1f1dSLionel Sambuc sll in5, 8, in5 4558*0a6a1f1dSLionel Sambuc or in5, local3, in5 4559*0a6a1f1dSLionel Sambuc 4560*0a6a1f1dSLionel Sambuc ldub [local5+1], local3 4561*0a6a1f1dSLionel Sambuc sll in5, 8, in5 4562*0a6a1f1dSLionel Sambuc or in5, local3, in5 4563*0a6a1f1dSLionel Sambuc 4564*0a6a1f1dSLionel Sambuc ldub [local5+0], local3 4565*0a6a1f1dSLionel Sambuc sll in5, 8, in5 4566*0a6a1f1dSLionel Sambuc or in5, local3, in5 4567*0a6a1f1dSLionel Sambuc 4568*0a6a1f1dSLionel Sambuc 4569*0a6a1f1dSLionel Sambuc ldub [local5+3+4], out5 4570*0a6a1f1dSLionel Sambuc 4571*0a6a1f1dSLionel Sambuc ldub [local5+2+4], local3 4572*0a6a1f1dSLionel Sambuc sll out5, 8, out5 4573*0a6a1f1dSLionel Sambuc or out5, local3, out5 4574*0a6a1f1dSLionel Sambuc 4575*0a6a1f1dSLionel Sambuc ldub [local5+1+4], local3 4576*0a6a1f1dSLionel Sambuc sll out5, 8, out5 4577*0a6a1f1dSLionel Sambuc or out5, local3, out5 4578*0a6a1f1dSLionel Sambuc 4579*0a6a1f1dSLionel Sambuc ldub [local5+0+4], local3 4580*0a6a1f1dSLionel Sambuc sll out5, 8, out5 4581*0a6a1f1dSLionel Sambuc or out5, local3, out5 4582*0a6a1f1dSLionel Sambuc.LLE9a: 4583*0a6a1f1dSLionel Sambuc 4584*0a6a1f1dSLionel Sambuc 4585*0a6a1f1dSLionel Sambuc 4586*0a6a1f1dSLionel Sambuc ! parameter 6 1/2 for include encryption/decryption 4587*0a6a1f1dSLionel Sambuc ! parameter 7 1 for mov in1 to in3 4588*0a6a1f1dSLionel Sambuc ! parameter 8 1 for mov in3 to in4 4589*0a6a1f1dSLionel Sambuc ! parameter 9 1 for load ks3 and ks2 to in4 and in3 4590*0a6a1f1dSLionel Sambuc 4591*0a6a1f1dSLionel Sambuc 4592*0a6a1f1dSLionel Sambuc 4593*0a6a1f1dSLionel Sambuc! ip_macro 4594*0a6a1f1dSLionel Sambuc! in5 out5 in5 out5 in4 2 0 0 1 4595*0a6a1f1dSLionel Sambuc 4596*0a6a1f1dSLionel Sambuc ld [out2+256], local1 4597*0a6a1f1dSLionel Sambuc srl out5, 4, local4 4598*0a6a1f1dSLionel Sambuc 4599*0a6a1f1dSLionel Sambuc xor local4, in5, local4 4600*0a6a1f1dSLionel Sambuc nop 4601*0a6a1f1dSLionel Sambuc 4602*0a6a1f1dSLionel Sambuc ld [out2+260], local2 4603*0a6a1f1dSLionel Sambuc and local4, local1, local4 4604*0a6a1f1dSLionel Sambuc 4605*0a6a1f1dSLionel Sambuc 4606*0a6a1f1dSLionel Sambuc 4607*0a6a1f1dSLionel Sambuc ld [out2+280], out4 ! loop counter 4608*0a6a1f1dSLionel Sambuc sll local4, 4, local1 4609*0a6a1f1dSLionel Sambuc xor in5, local4, in5 4610*0a6a1f1dSLionel Sambuc 4611*0a6a1f1dSLionel Sambuc ld [out2+264], local3 4612*0a6a1f1dSLionel Sambuc srl in5, 16, local4 4613*0a6a1f1dSLionel Sambuc xor out5, local1, out5 4614*0a6a1f1dSLionel Sambuc 4615*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+5*ARGSZ] , in4 4616*0a6a1f1dSLionel Sambuc xor local4, out5, local4 4617*0a6a1f1dSLionel Sambuc nop !sethi %hi(DES_SPtrans), global1 ! sbox addr 4618*0a6a1f1dSLionel Sambuc 4619*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+4*ARGSZ] , in3 4620*0a6a1f1dSLionel Sambuc and local4, local2, local4 4621*0a6a1f1dSLionel Sambuc nop !or global1, %lo(DES_SPtrans), global1 ! sbox addr 4622*0a6a1f1dSLionel Sambuc 4623*0a6a1f1dSLionel Sambuc sll local4, 16, local1 4624*0a6a1f1dSLionel Sambuc xor out5, local4, out5 4625*0a6a1f1dSLionel Sambuc 4626*0a6a1f1dSLionel Sambuc srl out5, 2, local4 4627*0a6a1f1dSLionel Sambuc xor in5, local1, in5 4628*0a6a1f1dSLionel Sambuc 4629*0a6a1f1dSLionel Sambuc sethi %hi(16711680), local5 4630*0a6a1f1dSLionel Sambuc xor local4, in5, local4 4631*0a6a1f1dSLionel Sambuc 4632*0a6a1f1dSLionel Sambuc and local4, local3, local4 4633*0a6a1f1dSLionel Sambuc or local5, 255, local5 4634*0a6a1f1dSLionel Sambuc 4635*0a6a1f1dSLionel Sambuc sll local4, 2, local2 4636*0a6a1f1dSLionel Sambuc xor in5, local4, in5 4637*0a6a1f1dSLionel Sambuc 4638*0a6a1f1dSLionel Sambuc srl in5, 8, local4 4639*0a6a1f1dSLionel Sambuc xor out5, local2, out5 4640*0a6a1f1dSLionel Sambuc 4641*0a6a1f1dSLionel Sambuc xor local4, out5, local4 4642*0a6a1f1dSLionel Sambuc add global1, 768, global4 4643*0a6a1f1dSLionel Sambuc 4644*0a6a1f1dSLionel Sambuc and local4, local5, local4 4645*0a6a1f1dSLionel Sambuc add global1, 1024, global5 4646*0a6a1f1dSLionel Sambuc 4647*0a6a1f1dSLionel Sambuc ld [out2+272], local7 4648*0a6a1f1dSLionel Sambuc sll local4, 8, local1 4649*0a6a1f1dSLionel Sambuc xor out5, local4, out5 4650*0a6a1f1dSLionel Sambuc 4651*0a6a1f1dSLionel Sambuc srl out5, 1, local4 4652*0a6a1f1dSLionel Sambuc xor in5, local1, in5 4653*0a6a1f1dSLionel Sambuc 4654*0a6a1f1dSLionel Sambuc ld [in4], out0 ! key 7531 4655*0a6a1f1dSLionel Sambuc xor local4, in5, local4 4656*0a6a1f1dSLionel Sambuc add global1, 256, global2 4657*0a6a1f1dSLionel Sambuc 4658*0a6a1f1dSLionel Sambuc ld [in4+4], out1 ! key 8642 4659*0a6a1f1dSLionel Sambuc and local4, local7, local4 4660*0a6a1f1dSLionel Sambuc add global1, 512, global3 4661*0a6a1f1dSLionel Sambuc 4662*0a6a1f1dSLionel Sambuc sll local4, 1, local1 4663*0a6a1f1dSLionel Sambuc xor in5, local4, in5 4664*0a6a1f1dSLionel Sambuc 4665*0a6a1f1dSLionel Sambuc sll in5, 3, local3 4666*0a6a1f1dSLionel Sambuc xor out5, local1, out5 4667*0a6a1f1dSLionel Sambuc 4668*0a6a1f1dSLionel Sambuc sll out5, 3, local2 4669*0a6a1f1dSLionel Sambuc add global1, 1280, local6 ! address sbox 8 4670*0a6a1f1dSLionel Sambuc 4671*0a6a1f1dSLionel Sambuc srl in5, 29, local4 4672*0a6a1f1dSLionel Sambuc add global1, 1792, out3 ! address sbox 8 4673*0a6a1f1dSLionel Sambuc 4674*0a6a1f1dSLionel Sambuc srl out5, 29, local1 4675*0a6a1f1dSLionel Sambuc or local4, local3, in5 4676*0a6a1f1dSLionel Sambuc 4677*0a6a1f1dSLionel Sambuc or local2, local1, out5 4678*0a6a1f1dSLionel Sambuc 4679*0a6a1f1dSLionel Sambuc 4680*0a6a1f1dSLionel Sambuc 4681*0a6a1f1dSLionel Sambuc 4682*0a6a1f1dSLionel Sambuc 4683*0a6a1f1dSLionel Sambuc ld [out2+284], local5 ! 0x0000FC00 used in the rounds 4684*0a6a1f1dSLionel Sambuc or local2, local1, out5 4685*0a6a1f1dSLionel Sambuc xor in5, out0, local1 4686*0a6a1f1dSLionel Sambuc 4687*0a6a1f1dSLionel Sambuc call .des_dec.1 4688*0a6a1f1dSLionel Sambuc and local1, 252, local1 4689*0a6a1f1dSLionel Sambuc 4690*0a6a1f1dSLionel Sambuc 4691*0a6a1f1dSLionel Sambuc ! inc .des_dec ks3 in4 4692*0a6a1f1dSLionel Sambuc 4693*0a6a1f1dSLionel Sambuc call .des_enc ! ks2 in3 4694*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+3*ARGSZ] , in4 4695*0a6a1f1dSLionel Sambuc 4696*0a6a1f1dSLionel Sambuc call .des_dec ! ks1 in4 4697*0a6a1f1dSLionel Sambuc nop 4698*0a6a1f1dSLionel Sambuc 4699*0a6a1f1dSLionel Sambuc 4700*0a6a1f1dSLionel Sambuc 4701*0a6a1f1dSLionel Sambuc! fp_macro 4702*0a6a1f1dSLionel Sambuc! out5 in5 0 1 4703*0a6a1f1dSLionel Sambuc 4704*0a6a1f1dSLionel Sambuc ! initially undo the rotate 3 left done after initial permutation 4705*0a6a1f1dSLionel Sambuc ! original left is received shifted 3 right and 29 left in local3/4 4706*0a6a1f1dSLionel Sambuc 4707*0a6a1f1dSLionel Sambuc sll in5, 29, local1 4708*0a6a1f1dSLionel Sambuc or local3, local4, out5 4709*0a6a1f1dSLionel Sambuc 4710*0a6a1f1dSLionel Sambuc srl in5, 3, in5 4711*0a6a1f1dSLionel Sambuc sethi %hi(0x55555555), local2 4712*0a6a1f1dSLionel Sambuc 4713*0a6a1f1dSLionel Sambuc or in5, local1, in5 4714*0a6a1f1dSLionel Sambuc or local2, %lo(0x55555555), local2 4715*0a6a1f1dSLionel Sambuc 4716*0a6a1f1dSLionel Sambuc srl in5, 1, local3 4717*0a6a1f1dSLionel Sambuc sethi %hi(0x00ff00ff), local1 4718*0a6a1f1dSLionel Sambuc xor local3, out5, local3 4719*0a6a1f1dSLionel Sambuc or local1, %lo(0x00ff00ff), local1 4720*0a6a1f1dSLionel Sambuc and local3, local2, local3 4721*0a6a1f1dSLionel Sambuc sethi %hi(0x33333333), local4 4722*0a6a1f1dSLionel Sambuc sll local3, 1, local2 4723*0a6a1f1dSLionel Sambuc 4724*0a6a1f1dSLionel Sambuc xor out5, local3, out5 4725*0a6a1f1dSLionel Sambuc 4726*0a6a1f1dSLionel Sambuc srl out5, 8, local3 4727*0a6a1f1dSLionel Sambuc xor in5, local2, in5 4728*0a6a1f1dSLionel Sambuc xor local3, in5, local3 4729*0a6a1f1dSLionel Sambuc or local4, %lo(0x33333333), local4 4730*0a6a1f1dSLionel Sambuc and local3, local1, local3 4731*0a6a1f1dSLionel Sambuc sethi %hi(0x0000ffff), local1 4732*0a6a1f1dSLionel Sambuc sll local3, 8, local2 4733*0a6a1f1dSLionel Sambuc 4734*0a6a1f1dSLionel Sambuc xor in5, local3, in5 4735*0a6a1f1dSLionel Sambuc 4736*0a6a1f1dSLionel Sambuc srl in5, 2, local3 4737*0a6a1f1dSLionel Sambuc xor out5, local2, out5 4738*0a6a1f1dSLionel Sambuc xor local3, out5, local3 4739*0a6a1f1dSLionel Sambuc or local1, %lo(0x0000ffff), local1 4740*0a6a1f1dSLionel Sambuc and local3, local4, local3 4741*0a6a1f1dSLionel Sambuc sethi %hi(0x0f0f0f0f), local4 4742*0a6a1f1dSLionel Sambuc sll local3, 2, local2 4743*0a6a1f1dSLionel Sambuc 4744*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+0*ARGSZ] , local5 4745*0a6a1f1dSLionel Sambuc xor out5, local3, out5 4746*0a6a1f1dSLionel Sambuc 4747*0a6a1f1dSLionel Sambuc LDPTR [%sp+BIAS+ARG0+1*ARGSZ] , local7 4748*0a6a1f1dSLionel Sambuc srl out5, 16, local3 4749*0a6a1f1dSLionel Sambuc xor in5, local2, in5 4750*0a6a1f1dSLionel Sambuc xor local3, in5, local3 4751*0a6a1f1dSLionel Sambuc or local4, %lo(0x0f0f0f0f), local4 4752*0a6a1f1dSLionel Sambuc and local3, local1, local3 4753*0a6a1f1dSLionel Sambuc sll local3, 16, local2 4754*0a6a1f1dSLionel Sambuc 4755*0a6a1f1dSLionel Sambuc xor in5, local3, local1 4756*0a6a1f1dSLionel Sambuc 4757*0a6a1f1dSLionel Sambuc srl local1, 4, local3 4758*0a6a1f1dSLionel Sambuc xor out5, local2, out5 4759*0a6a1f1dSLionel Sambuc xor local3, out5, local3 4760*0a6a1f1dSLionel Sambuc and local3, local4, local3 4761*0a6a1f1dSLionel Sambuc sll local3, 4, local2 4762*0a6a1f1dSLionel Sambuc 4763*0a6a1f1dSLionel Sambuc xor out5, local3, out5 4764*0a6a1f1dSLionel Sambuc 4765*0a6a1f1dSLionel Sambuc ! optional store: 4766*0a6a1f1dSLionel Sambuc 4767*0a6a1f1dSLionel Sambuc 4768*0a6a1f1dSLionel Sambuc 4769*0a6a1f1dSLionel Sambuc xor local1, local2, in5 4770*0a6a1f1dSLionel Sambuc 4771*0a6a1f1dSLionel Sambuc 4772*0a6a1f1dSLionel Sambuc 4773*0a6a1f1dSLionel Sambuc ! 1 for input and output address local5/7 4774*0a6a1f1dSLionel Sambuc 4775*0a6a1f1dSLionel Sambuc ! in2 is bytes left to be stored 4776*0a6a1f1dSLionel Sambuc ! in2 is compared to 8 in the rounds 4777*0a6a1f1dSLionel Sambuc 4778*0a6a1f1dSLionel Sambuc xor out5, in0, out4 4779*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4780*0a6a1f1dSLionel Sambuc bl,pn %icc, .ede3.dec.seven.or.less 4781*0a6a1f1dSLionel Sambuc#else 4782*0a6a1f1dSLionel Sambuc bl .ede3.dec.seven.or.less 4783*0a6a1f1dSLionel Sambuc#endif 4784*0a6a1f1dSLionel Sambuc xor in5, in1, global4 4785*0a6a1f1dSLionel Sambuc 4786*0a6a1f1dSLionel Sambuc 4787*0a6a1f1dSLionel Sambuc 4788*0a6a1f1dSLionel Sambuc! load_little_endian_inc 4789*0a6a1f1dSLionel Sambuc! local5 in0 in1 local3 .LLE10 4790*0a6a1f1dSLionel Sambuc 4791*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 4792*0a6a1f1dSLionel Sambuc 4793*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4794*0a6a1f1dSLionel Sambuc andcc local5, 3, global0 4795*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE10 4796*0a6a1f1dSLionel Sambuc nop 4797*0a6a1f1dSLionel Sambuc 4798*0a6a1f1dSLionel Sambuc lda [local5] 0x88, in0 4799*0a6a1f1dSLionel Sambuc add local5, 4, local5 4800*0a6a1f1dSLionel Sambuc 4801*0a6a1f1dSLionel Sambuc lda [local5] 0x88, in1 4802*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE10a 4803*0a6a1f1dSLionel Sambuc add local5, 4, local5 4804*0a6a1f1dSLionel Sambuc#endif 4805*0a6a1f1dSLionel Sambuc 4806*0a6a1f1dSLionel Sambuc.LLE10: 4807*0a6a1f1dSLionel Sambuc ldub [local5+3], in0 4808*0a6a1f1dSLionel Sambuc 4809*0a6a1f1dSLionel Sambuc ldub [local5+2], local3 4810*0a6a1f1dSLionel Sambuc sll in0, 8, in0 4811*0a6a1f1dSLionel Sambuc or in0, local3, in0 4812*0a6a1f1dSLionel Sambuc 4813*0a6a1f1dSLionel Sambuc ldub [local5+1], local3 4814*0a6a1f1dSLionel Sambuc sll in0, 8, in0 4815*0a6a1f1dSLionel Sambuc or in0, local3, in0 4816*0a6a1f1dSLionel Sambuc 4817*0a6a1f1dSLionel Sambuc ldub [local5+0], local3 4818*0a6a1f1dSLionel Sambuc sll in0, 8, in0 4819*0a6a1f1dSLionel Sambuc or in0, local3, in0 4820*0a6a1f1dSLionel Sambuc 4821*0a6a1f1dSLionel Sambuc ldub [local5+3+4], in1 4822*0a6a1f1dSLionel Sambuc add local5, 8, local5 4823*0a6a1f1dSLionel Sambuc 4824*0a6a1f1dSLionel Sambuc ldub [local5+2+4-8], local3 4825*0a6a1f1dSLionel Sambuc sll in1, 8, in1 4826*0a6a1f1dSLionel Sambuc or in1, local3, in1 4827*0a6a1f1dSLionel Sambuc 4828*0a6a1f1dSLionel Sambuc ldub [local5+1+4-8], local3 4829*0a6a1f1dSLionel Sambuc sll in1, 8, in1 4830*0a6a1f1dSLionel Sambuc or in1, local3, in1 4831*0a6a1f1dSLionel Sambuc 4832*0a6a1f1dSLionel Sambuc ldub [local5+0+4-8], local3 4833*0a6a1f1dSLionel Sambuc sll in1, 8, in1 4834*0a6a1f1dSLionel Sambuc or in1, local3, in1 4835*0a6a1f1dSLionel Sambuc.LLE10a: 4836*0a6a1f1dSLionel Sambuc 4837*0a6a1f1dSLionel Sambuc ! iv next block 4838*0a6a1f1dSLionel Sambuc 4839*0a6a1f1dSLionel Sambuc 4840*0a6a1f1dSLionel Sambuc 4841*0a6a1f1dSLionel Sambuc! store_little_endian 4842*0a6a1f1dSLionel Sambuc! local7 out4 global4 local3 .SLE7 4843*0a6a1f1dSLionel Sambuc 4844*0a6a1f1dSLionel Sambuc ! rightmost in register to first in memory 4845*0a6a1f1dSLionel Sambuc 4846*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4847*0a6a1f1dSLionel Sambuc andcc local7, 3, global0 4848*0a6a1f1dSLionel Sambuc bne,pn %icc, .SLE7 4849*0a6a1f1dSLionel Sambuc nop 4850*0a6a1f1dSLionel Sambuc 4851*0a6a1f1dSLionel Sambuc sta out4, [local7] 0x88 4852*0a6a1f1dSLionel Sambuc add local7, 4, local3 4853*0a6a1f1dSLionel Sambuc 4854*0a6a1f1dSLionel Sambuc ba,pt %icc, .SLE7a 4855*0a6a1f1dSLionel Sambuc sta global4, [local3] 0x88 4856*0a6a1f1dSLionel Sambuc#endif 4857*0a6a1f1dSLionel Sambuc 4858*0a6a1f1dSLionel Sambuc.SLE7: 4859*0a6a1f1dSLionel Sambuc and out4, 255, local3 4860*0a6a1f1dSLionel Sambuc stub local3, [local7+0] 4861*0a6a1f1dSLionel Sambuc 4862*0a6a1f1dSLionel Sambuc srl out4, 8, local3 4863*0a6a1f1dSLionel Sambuc and local3, 255, local3 4864*0a6a1f1dSLionel Sambuc stub local3, [local7+1] 4865*0a6a1f1dSLionel Sambuc 4866*0a6a1f1dSLionel Sambuc srl out4, 16, local3 4867*0a6a1f1dSLionel Sambuc and local3, 255, local3 4868*0a6a1f1dSLionel Sambuc stub local3, [local7+2] 4869*0a6a1f1dSLionel Sambuc 4870*0a6a1f1dSLionel Sambuc srl out4, 24, local3 4871*0a6a1f1dSLionel Sambuc stub local3, [local7+3] 4872*0a6a1f1dSLionel Sambuc 4873*0a6a1f1dSLionel Sambuc 4874*0a6a1f1dSLionel Sambuc and global4, 255, local3 4875*0a6a1f1dSLionel Sambuc stub local3, [local7+0+4] 4876*0a6a1f1dSLionel Sambuc 4877*0a6a1f1dSLionel Sambuc srl global4, 8, local3 4878*0a6a1f1dSLionel Sambuc and local3, 255, local3 4879*0a6a1f1dSLionel Sambuc stub local3, [local7+1+4] 4880*0a6a1f1dSLionel Sambuc 4881*0a6a1f1dSLionel Sambuc srl global4, 16, local3 4882*0a6a1f1dSLionel Sambuc and local3, 255, local3 4883*0a6a1f1dSLionel Sambuc stub local3, [local7+2+4] 4884*0a6a1f1dSLionel Sambuc 4885*0a6a1f1dSLionel Sambuc srl global4, 24, local3 4886*0a6a1f1dSLionel Sambuc stub local3, [local7+3+4] 4887*0a6a1f1dSLionel Sambuc 4888*0a6a1f1dSLionel Sambuc.SLE7a: 4889*0a6a1f1dSLionel Sambuc 4890*0a6a1f1dSLionel Sambuc ! block 4891*0a6a1f1dSLionel Sambuc 4892*0a6a1f1dSLionel Sambuc STPTR local5, [%sp+BIAS+ARG0+0*ARGSZ] 4893*0a6a1f1dSLionel Sambuc addcc in2, -8, in2 4894*0a6a1f1dSLionel Sambuc add local7, 8, local7 4895*0a6a1f1dSLionel Sambuc 4896*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4897*0a6a1f1dSLionel Sambuc bg,pt %icc, .ede3.dec.next.block 4898*0a6a1f1dSLionel Sambuc#else 4899*0a6a1f1dSLionel Sambuc bg .ede3.dec.next.block 4900*0a6a1f1dSLionel Sambuc#endif 4901*0a6a1f1dSLionel Sambuc STPTR local7, [%sp+BIAS+ARG0+1*ARGSZ] 4902*0a6a1f1dSLionel Sambuc 4903*0a6a1f1dSLionel Sambuc.ede3.dec.store.iv: 4904*0a6a1f1dSLionel Sambuc 4905*0a6a1f1dSLionel Sambuc LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local4 ! ivec 4906*0a6a1f1dSLionel Sambuc 4907*0a6a1f1dSLionel Sambuc 4908*0a6a1f1dSLionel Sambuc! store_little_endian 4909*0a6a1f1dSLionel Sambuc! local4 in0 in1 local5 .SLE8 4910*0a6a1f1dSLionel Sambuc 4911*0a6a1f1dSLionel Sambuc ! rightmost in register to first in memory 4912*0a6a1f1dSLionel Sambuc 4913*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4914*0a6a1f1dSLionel Sambuc andcc local4, 3, global0 4915*0a6a1f1dSLionel Sambuc bne,pn %icc, .SLE8 4916*0a6a1f1dSLionel Sambuc nop 4917*0a6a1f1dSLionel Sambuc 4918*0a6a1f1dSLionel Sambuc sta in0, [local4] 0x88 4919*0a6a1f1dSLionel Sambuc add local4, 4, local5 4920*0a6a1f1dSLionel Sambuc 4921*0a6a1f1dSLionel Sambuc ba,pt %icc, .SLE8a 4922*0a6a1f1dSLionel Sambuc sta in1, [local5] 0x88 4923*0a6a1f1dSLionel Sambuc#endif 4924*0a6a1f1dSLionel Sambuc 4925*0a6a1f1dSLionel Sambuc.SLE8: 4926*0a6a1f1dSLionel Sambuc and in0, 255, local5 4927*0a6a1f1dSLionel Sambuc stub local5, [local4+0] 4928*0a6a1f1dSLionel Sambuc 4929*0a6a1f1dSLionel Sambuc srl in0, 8, local5 4930*0a6a1f1dSLionel Sambuc and local5, 255, local5 4931*0a6a1f1dSLionel Sambuc stub local5, [local4+1] 4932*0a6a1f1dSLionel Sambuc 4933*0a6a1f1dSLionel Sambuc srl in0, 16, local5 4934*0a6a1f1dSLionel Sambuc and local5, 255, local5 4935*0a6a1f1dSLionel Sambuc stub local5, [local4+2] 4936*0a6a1f1dSLionel Sambuc 4937*0a6a1f1dSLionel Sambuc srl in0, 24, local5 4938*0a6a1f1dSLionel Sambuc stub local5, [local4+3] 4939*0a6a1f1dSLionel Sambuc 4940*0a6a1f1dSLionel Sambuc 4941*0a6a1f1dSLionel Sambuc and in1, 255, local5 4942*0a6a1f1dSLionel Sambuc stub local5, [local4+0+4] 4943*0a6a1f1dSLionel Sambuc 4944*0a6a1f1dSLionel Sambuc srl in1, 8, local5 4945*0a6a1f1dSLionel Sambuc and local5, 255, local5 4946*0a6a1f1dSLionel Sambuc stub local5, [local4+1+4] 4947*0a6a1f1dSLionel Sambuc 4948*0a6a1f1dSLionel Sambuc srl in1, 16, local5 4949*0a6a1f1dSLionel Sambuc and local5, 255, local5 4950*0a6a1f1dSLionel Sambuc stub local5, [local4+2+4] 4951*0a6a1f1dSLionel Sambuc 4952*0a6a1f1dSLionel Sambuc srl in1, 24, local5 4953*0a6a1f1dSLionel Sambuc stub local5, [local4+3+4] 4954*0a6a1f1dSLionel Sambuc 4955*0a6a1f1dSLionel Sambuc.SLE8a: 4956*0a6a1f1dSLionel Sambuc 4957*0a6a1f1dSLionel Sambuc ! ivec 4958*0a6a1f1dSLionel Sambuc 4959*0a6a1f1dSLionel Sambuc.ede3.dec.finish: 4960*0a6a1f1dSLionel Sambuc 4961*0a6a1f1dSLionel Sambuc ret 4962*0a6a1f1dSLionel Sambuc restore 4963*0a6a1f1dSLionel Sambuc 4964*0a6a1f1dSLionel Sambuc.ede3.dec.seven.or.less: 4965*0a6a1f1dSLionel Sambuc 4966*0a6a1f1dSLionel Sambuc 4967*0a6a1f1dSLionel Sambuc 4968*0a6a1f1dSLionel Sambuc! load_little_endian_inc 4969*0a6a1f1dSLionel Sambuc! local5 in0 in1 local3 .LLE14 4970*0a6a1f1dSLionel Sambuc 4971*0a6a1f1dSLionel Sambuc ! first in memory to rightmost in register 4972*0a6a1f1dSLionel Sambuc 4973*0a6a1f1dSLionel Sambuc#ifdef __sparc_v9__ 4974*0a6a1f1dSLionel Sambuc andcc local5, 3, global0 4975*0a6a1f1dSLionel Sambuc bne,pn %icc, .LLE14 4976*0a6a1f1dSLionel Sambuc nop 4977*0a6a1f1dSLionel Sambuc 4978*0a6a1f1dSLionel Sambuc lda [local5] 0x88, in0 4979*0a6a1f1dSLionel Sambuc add local5, 4, local5 4980*0a6a1f1dSLionel Sambuc 4981*0a6a1f1dSLionel Sambuc lda [local5] 0x88, in1 4982*0a6a1f1dSLionel Sambuc ba,pt %icc, .LLE14a 4983*0a6a1f1dSLionel Sambuc add local5, 4, local5 4984*0a6a1f1dSLionel Sambuc#endif 4985*0a6a1f1dSLionel Sambuc 4986*0a6a1f1dSLionel Sambuc.LLE14: 4987*0a6a1f1dSLionel Sambuc ldub [local5+3], in0 4988*0a6a1f1dSLionel Sambuc 4989*0a6a1f1dSLionel Sambuc ldub [local5+2], local3 4990*0a6a1f1dSLionel Sambuc sll in0, 8, in0 4991*0a6a1f1dSLionel Sambuc or in0, local3, in0 4992*0a6a1f1dSLionel Sambuc 4993*0a6a1f1dSLionel Sambuc ldub [local5+1], local3 4994*0a6a1f1dSLionel Sambuc sll in0, 8, in0 4995*0a6a1f1dSLionel Sambuc or in0, local3, in0 4996*0a6a1f1dSLionel Sambuc 4997*0a6a1f1dSLionel Sambuc ldub [local5+0], local3 4998*0a6a1f1dSLionel Sambuc sll in0, 8, in0 4999*0a6a1f1dSLionel Sambuc or in0, local3, in0 5000*0a6a1f1dSLionel Sambuc 5001*0a6a1f1dSLionel Sambuc ldub [local5+3+4], in1 5002*0a6a1f1dSLionel Sambuc add local5, 8, local5 5003*0a6a1f1dSLionel Sambuc 5004*0a6a1f1dSLionel Sambuc ldub [local5+2+4-8], local3 5005*0a6a1f1dSLionel Sambuc sll in1, 8, in1 5006*0a6a1f1dSLionel Sambuc or in1, local3, in1 5007*0a6a1f1dSLionel Sambuc 5008*0a6a1f1dSLionel Sambuc ldub [local5+1+4-8], local3 5009*0a6a1f1dSLionel Sambuc sll in1, 8, in1 5010*0a6a1f1dSLionel Sambuc or in1, local3, in1 5011*0a6a1f1dSLionel Sambuc 5012*0a6a1f1dSLionel Sambuc ldub [local5+0+4-8], local3 5013*0a6a1f1dSLionel Sambuc sll in1, 8, in1 5014*0a6a1f1dSLionel Sambuc or in1, local3, in1 5015*0a6a1f1dSLionel Sambuc.LLE14a: 5016*0a6a1f1dSLionel Sambuc 5017*0a6a1f1dSLionel Sambuc ! iv 5018*0a6a1f1dSLionel Sambuc 5019*0a6a1f1dSLionel Sambuc 5020*0a6a1f1dSLionel Sambuc 5021*0a6a1f1dSLionel Sambuc! store_n_bytes 5022*0a6a1f1dSLionel Sambuc! local7 in2 local3 local4 .SNB2 .ede3.dec.store.iv .SNB2 .ede3.dec.store.iv 5023*0a6a1f1dSLionel Sambuc 5024*0a6a1f1dSLionel Sambuc.SNB2.0: call .+8 5025*0a6a1f1dSLionel Sambuc sll in2, 2, local4 5026*0a6a1f1dSLionel Sambuc 5027*0a6a1f1dSLionel Sambuc add %o7,.SNB2.jmp.table-.SNB2.0,local3 5028*0a6a1f1dSLionel Sambuc 5029*0a6a1f1dSLionel Sambuc add local3, local4, local3 5030*0a6a1f1dSLionel Sambuc 5031*0a6a1f1dSLionel Sambuc ld [local3], local3 5032*0a6a1f1dSLionel Sambuc 5033*0a6a1f1dSLionel Sambuc jmp %o7+local3 5034*0a6a1f1dSLionel Sambuc nop 5035*0a6a1f1dSLionel Sambuc 5036*0a6a1f1dSLionel Sambuc.SNB2.7: 5037*0a6a1f1dSLionel Sambuc srl global4, 16, local3 5038*0a6a1f1dSLionel Sambuc and local3, 0xff, local3 5039*0a6a1f1dSLionel Sambuc stub local3, [local7+6] 5040*0a6a1f1dSLionel Sambuc.SNB2.6: 5041*0a6a1f1dSLionel Sambuc srl global4, 8, local3 5042*0a6a1f1dSLionel Sambuc and local3, 0xff, local3 5043*0a6a1f1dSLionel Sambuc stub local3, [local7+5] 5044*0a6a1f1dSLionel Sambuc.SNB2.5: 5045*0a6a1f1dSLionel Sambuc and global4, 0xff, local3 5046*0a6a1f1dSLionel Sambuc stub local3, [local7+4] 5047*0a6a1f1dSLionel Sambuc.SNB2.4: 5048*0a6a1f1dSLionel Sambuc srl out4, 24, local3 5049*0a6a1f1dSLionel Sambuc stub local3, [local7+3] 5050*0a6a1f1dSLionel Sambuc.SNB2.3: 5051*0a6a1f1dSLionel Sambuc srl out4, 16, local3 5052*0a6a1f1dSLionel Sambuc and local3, 0xff, local3 5053*0a6a1f1dSLionel Sambuc stub local3, [local7+2] 5054*0a6a1f1dSLionel Sambuc.SNB2.2: 5055*0a6a1f1dSLionel Sambuc srl out4, 8, local3 5056*0a6a1f1dSLionel Sambuc and local3, 0xff, local3 5057*0a6a1f1dSLionel Sambuc stub local3, [local7+1] 5058*0a6a1f1dSLionel Sambuc.SNB2.1: 5059*0a6a1f1dSLionel Sambuc and out4, 0xff, local3 5060*0a6a1f1dSLionel Sambuc 5061*0a6a1f1dSLionel Sambuc 5062*0a6a1f1dSLionel Sambuc ba .ede3.dec.store.iv 5063*0a6a1f1dSLionel Sambuc stub local3, [local7] 5064*0a6a1f1dSLionel Sambuc 5065*0a6a1f1dSLionel Sambuc .align 4 5066*0a6a1f1dSLionel Sambuc 5067*0a6a1f1dSLionel Sambuc.SNB2.jmp.table: 5068*0a6a1f1dSLionel Sambuc 5069*0a6a1f1dSLionel Sambuc .word 0 5070*0a6a1f1dSLionel Sambuc .word .SNB2.1-.SNB2.0 5071*0a6a1f1dSLionel Sambuc .word .SNB2.2-.SNB2.0 5072*0a6a1f1dSLionel Sambuc .word .SNB2.3-.SNB2.0 5073*0a6a1f1dSLionel Sambuc .word .SNB2.4-.SNB2.0 5074*0a6a1f1dSLionel Sambuc .word .SNB2.5-.SNB2.0 5075*0a6a1f1dSLionel Sambuc .word .SNB2.6-.SNB2.0 5076*0a6a1f1dSLionel Sambuc .word .SNB2.7-.SNB2.0 5077*0a6a1f1dSLionel Sambuc 5078*0a6a1f1dSLionel Sambuc 5079*0a6a1f1dSLionel Sambuc 5080*0a6a1f1dSLionel Sambuc.DES_ede3_cbc_encrypt.end: 5081*0a6a1f1dSLionel Sambuc .size DES_ede3_cbc_encrypt,.DES_ede3_cbc_encrypt.end-DES_ede3_cbc_encrypt 5082*0a6a1f1dSLionel Sambuc 5083*0a6a1f1dSLionel Sambuc .align 256 5084*0a6a1f1dSLionel Sambuc .type .des_and,#object 5085*0a6a1f1dSLionel Sambuc .size .des_and,284 5086*0a6a1f1dSLionel Sambuc 5087*0a6a1f1dSLionel Sambuc.des_and: 5088*0a6a1f1dSLionel Sambuc 5089*0a6a1f1dSLionel Sambuc! This table is used for AND 0xFC when it is known that register 5090*0a6a1f1dSLionel Sambuc! bits 8-31 are zero. Makes it possible to do three arithmetic 5091*0a6a1f1dSLionel Sambuc! operations in one cycle. 5092*0a6a1f1dSLionel Sambuc 5093*0a6a1f1dSLionel Sambuc .byte 0, 0, 0, 0, 4, 4, 4, 4 5094*0a6a1f1dSLionel Sambuc .byte 8, 8, 8, 8, 12, 12, 12, 12 5095*0a6a1f1dSLionel Sambuc .byte 16, 16, 16, 16, 20, 20, 20, 20 5096*0a6a1f1dSLionel Sambuc .byte 24, 24, 24, 24, 28, 28, 28, 28 5097*0a6a1f1dSLionel Sambuc .byte 32, 32, 32, 32, 36, 36, 36, 36 5098*0a6a1f1dSLionel Sambuc .byte 40, 40, 40, 40, 44, 44, 44, 44 5099*0a6a1f1dSLionel Sambuc .byte 48, 48, 48, 48, 52, 52, 52, 52 5100*0a6a1f1dSLionel Sambuc .byte 56, 56, 56, 56, 60, 60, 60, 60 5101*0a6a1f1dSLionel Sambuc .byte 64, 64, 64, 64, 68, 68, 68, 68 5102*0a6a1f1dSLionel Sambuc .byte 72, 72, 72, 72, 76, 76, 76, 76 5103*0a6a1f1dSLionel Sambuc .byte 80, 80, 80, 80, 84, 84, 84, 84 5104*0a6a1f1dSLionel Sambuc .byte 88, 88, 88, 88, 92, 92, 92, 92 5105*0a6a1f1dSLionel Sambuc .byte 96, 96, 96, 96, 100, 100, 100, 100 5106*0a6a1f1dSLionel Sambuc .byte 104, 104, 104, 104, 108, 108, 108, 108 5107*0a6a1f1dSLionel Sambuc .byte 112, 112, 112, 112, 116, 116, 116, 116 5108*0a6a1f1dSLionel Sambuc .byte 120, 120, 120, 120, 124, 124, 124, 124 5109*0a6a1f1dSLionel Sambuc .byte 128, 128, 128, 128, 132, 132, 132, 132 5110*0a6a1f1dSLionel Sambuc .byte 136, 136, 136, 136, 140, 140, 140, 140 5111*0a6a1f1dSLionel Sambuc .byte 144, 144, 144, 144, 148, 148, 148, 148 5112*0a6a1f1dSLionel Sambuc .byte 152, 152, 152, 152, 156, 156, 156, 156 5113*0a6a1f1dSLionel Sambuc .byte 160, 160, 160, 160, 164, 164, 164, 164 5114*0a6a1f1dSLionel Sambuc .byte 168, 168, 168, 168, 172, 172, 172, 172 5115*0a6a1f1dSLionel Sambuc .byte 176, 176, 176, 176, 180, 180, 180, 180 5116*0a6a1f1dSLionel Sambuc .byte 184, 184, 184, 184, 188, 188, 188, 188 5117*0a6a1f1dSLionel Sambuc .byte 192, 192, 192, 192, 196, 196, 196, 196 5118*0a6a1f1dSLionel Sambuc .byte 200, 200, 200, 200, 204, 204, 204, 204 5119*0a6a1f1dSLionel Sambuc .byte 208, 208, 208, 208, 212, 212, 212, 212 5120*0a6a1f1dSLionel Sambuc .byte 216, 216, 216, 216, 220, 220, 220, 220 5121*0a6a1f1dSLionel Sambuc .byte 224, 224, 224, 224, 228, 228, 228, 228 5122*0a6a1f1dSLionel Sambuc .byte 232, 232, 232, 232, 236, 236, 236, 236 5123*0a6a1f1dSLionel Sambuc .byte 240, 240, 240, 240, 244, 244, 244, 244 5124*0a6a1f1dSLionel Sambuc .byte 248, 248, 248, 248, 252, 252, 252, 252 5125*0a6a1f1dSLionel Sambuc 5126*0a6a1f1dSLionel Sambuc ! 5 numbers for initil/final permutation 5127*0a6a1f1dSLionel Sambuc 5128*0a6a1f1dSLionel Sambuc .word 0x0f0f0f0f ! offset 256 5129*0a6a1f1dSLionel Sambuc .word 0x0000ffff ! 260 5130*0a6a1f1dSLionel Sambuc .word 0x33333333 ! 264 5131*0a6a1f1dSLionel Sambuc .word 0x00ff00ff ! 268 5132*0a6a1f1dSLionel Sambuc .word 0x55555555 ! 272 5133*0a6a1f1dSLionel Sambuc 5134*0a6a1f1dSLionel Sambuc .word 0 ! 276 5135*0a6a1f1dSLionel Sambuc .word LOOPS ! 280 5136*0a6a1f1dSLionel Sambuc .word 0x0000FC00 ! 284 5137*0a6a1f1dSLionel Sambuc 5138*0a6a1f1dSLionel Sambuc .global DES_SPtrans 5139*0a6a1f1dSLionel Sambuc .type DES_SPtrans,#object 5140*0a6a1f1dSLionel Sambuc .size DES_SPtrans,2048 5141*0a6a1f1dSLionel Sambuc.align 64 5142*0a6a1f1dSLionel SambucDES_SPtrans: 5143*0a6a1f1dSLionel Sambuc_PIC_DES_SPtrans: 5144*0a6a1f1dSLionel Sambuc ! nibble 0 5145*0a6a1f1dSLionel Sambuc .word 0x02080800, 0x00080000, 0x02000002, 0x02080802 5146*0a6a1f1dSLionel Sambuc .word 0x02000000, 0x00080802, 0x00080002, 0x02000002 5147*0a6a1f1dSLionel Sambuc .word 0x00080802, 0x02080800, 0x02080000, 0x00000802 5148*0a6a1f1dSLionel Sambuc .word 0x02000802, 0x02000000, 0x00000000, 0x00080002 5149*0a6a1f1dSLionel Sambuc .word 0x00080000, 0x00000002, 0x02000800, 0x00080800 5150*0a6a1f1dSLionel Sambuc .word 0x02080802, 0x02080000, 0x00000802, 0x02000800 5151*0a6a1f1dSLionel Sambuc .word 0x00000002, 0x00000800, 0x00080800, 0x02080002 5152*0a6a1f1dSLionel Sambuc .word 0x00000800, 0x02000802, 0x02080002, 0x00000000 5153*0a6a1f1dSLionel Sambuc .word 0x00000000, 0x02080802, 0x02000800, 0x00080002 5154*0a6a1f1dSLionel Sambuc .word 0x02080800, 0x00080000, 0x00000802, 0x02000800 5155*0a6a1f1dSLionel Sambuc .word 0x02080002, 0x00000800, 0x00080800, 0x02000002 5156*0a6a1f1dSLionel Sambuc .word 0x00080802, 0x00000002, 0x02000002, 0x02080000 5157*0a6a1f1dSLionel Sambuc .word 0x02080802, 0x00080800, 0x02080000, 0x02000802 5158*0a6a1f1dSLionel Sambuc .word 0x02000000, 0x00000802, 0x00080002, 0x00000000 5159*0a6a1f1dSLionel Sambuc .word 0x00080000, 0x02000000, 0x02000802, 0x02080800 5160*0a6a1f1dSLionel Sambuc .word 0x00000002, 0x02080002, 0x00000800, 0x00080802 5161*0a6a1f1dSLionel Sambuc ! nibble 1 5162*0a6a1f1dSLionel Sambuc .word 0x40108010, 0x00000000, 0x00108000, 0x40100000 5163*0a6a1f1dSLionel Sambuc .word 0x40000010, 0x00008010, 0x40008000, 0x00108000 5164*0a6a1f1dSLionel Sambuc .word 0x00008000, 0x40100010, 0x00000010, 0x40008000 5165*0a6a1f1dSLionel Sambuc .word 0x00100010, 0x40108000, 0x40100000, 0x00000010 5166*0a6a1f1dSLionel Sambuc .word 0x00100000, 0x40008010, 0x40100010, 0x00008000 5167*0a6a1f1dSLionel Sambuc .word 0x00108010, 0x40000000, 0x00000000, 0x00100010 5168*0a6a1f1dSLionel Sambuc .word 0x40008010, 0x00108010, 0x40108000, 0x40000010 5169*0a6a1f1dSLionel Sambuc .word 0x40000000, 0x00100000, 0x00008010, 0x40108010 5170*0a6a1f1dSLionel Sambuc .word 0x00100010, 0x40108000, 0x40008000, 0x00108010 5171*0a6a1f1dSLionel Sambuc .word 0x40108010, 0x00100010, 0x40000010, 0x00000000 5172*0a6a1f1dSLionel Sambuc .word 0x40000000, 0x00008010, 0x00100000, 0x40100010 5173*0a6a1f1dSLionel Sambuc .word 0x00008000, 0x40000000, 0x00108010, 0x40008010 5174*0a6a1f1dSLionel Sambuc .word 0x40108000, 0x00008000, 0x00000000, 0x40000010 5175*0a6a1f1dSLionel Sambuc .word 0x00000010, 0x40108010, 0x00108000, 0x40100000 5176*0a6a1f1dSLionel Sambuc .word 0x40100010, 0x00100000, 0x00008010, 0x40008000 5177*0a6a1f1dSLionel Sambuc .word 0x40008010, 0x00000010, 0x40100000, 0x00108000 5178*0a6a1f1dSLionel Sambuc ! nibble 2 5179*0a6a1f1dSLionel Sambuc .word 0x04000001, 0x04040100, 0x00000100, 0x04000101 5180*0a6a1f1dSLionel Sambuc .word 0x00040001, 0x04000000, 0x04000101, 0x00040100 5181*0a6a1f1dSLionel Sambuc .word 0x04000100, 0x00040000, 0x04040000, 0x00000001 5182*0a6a1f1dSLionel Sambuc .word 0x04040101, 0x00000101, 0x00000001, 0x04040001 5183*0a6a1f1dSLionel Sambuc .word 0x00000000, 0x00040001, 0x04040100, 0x00000100 5184*0a6a1f1dSLionel Sambuc .word 0x00000101, 0x04040101, 0x00040000, 0x04000001 5185*0a6a1f1dSLionel Sambuc .word 0x04040001, 0x04000100, 0x00040101, 0x04040000 5186*0a6a1f1dSLionel Sambuc .word 0x00040100, 0x00000000, 0x04000000, 0x00040101 5187*0a6a1f1dSLionel Sambuc .word 0x04040100, 0x00000100, 0x00000001, 0x00040000 5188*0a6a1f1dSLionel Sambuc .word 0x00000101, 0x00040001, 0x04040000, 0x04000101 5189*0a6a1f1dSLionel Sambuc .word 0x00000000, 0x04040100, 0x00040100, 0x04040001 5190*0a6a1f1dSLionel Sambuc .word 0x00040001, 0x04000000, 0x04040101, 0x00000001 5191*0a6a1f1dSLionel Sambuc .word 0x00040101, 0x04000001, 0x04000000, 0x04040101 5192*0a6a1f1dSLionel Sambuc .word 0x00040000, 0x04000100, 0x04000101, 0x00040100 5193*0a6a1f1dSLionel Sambuc .word 0x04000100, 0x00000000, 0x04040001, 0x00000101 5194*0a6a1f1dSLionel Sambuc .word 0x04000001, 0x00040101, 0x00000100, 0x04040000 5195*0a6a1f1dSLionel Sambuc ! nibble 3 5196*0a6a1f1dSLionel Sambuc .word 0x00401008, 0x10001000, 0x00000008, 0x10401008 5197*0a6a1f1dSLionel Sambuc .word 0x00000000, 0x10400000, 0x10001008, 0x00400008 5198*0a6a1f1dSLionel Sambuc .word 0x10401000, 0x10000008, 0x10000000, 0x00001008 5199*0a6a1f1dSLionel Sambuc .word 0x10000008, 0x00401008, 0x00400000, 0x10000000 5200*0a6a1f1dSLionel Sambuc .word 0x10400008, 0x00401000, 0x00001000, 0x00000008 5201*0a6a1f1dSLionel Sambuc .word 0x00401000, 0x10001008, 0x10400000, 0x00001000 5202*0a6a1f1dSLionel Sambuc .word 0x00001008, 0x00000000, 0x00400008, 0x10401000 5203*0a6a1f1dSLionel Sambuc .word 0x10001000, 0x10400008, 0x10401008, 0x00400000 5204*0a6a1f1dSLionel Sambuc .word 0x10400008, 0x00001008, 0x00400000, 0x10000008 5205*0a6a1f1dSLionel Sambuc .word 0x00401000, 0x10001000, 0x00000008, 0x10400000 5206*0a6a1f1dSLionel Sambuc .word 0x10001008, 0x00000000, 0x00001000, 0x00400008 5207*0a6a1f1dSLionel Sambuc .word 0x00000000, 0x10400008, 0x10401000, 0x00001000 5208*0a6a1f1dSLionel Sambuc .word 0x10000000, 0x10401008, 0x00401008, 0x00400000 5209*0a6a1f1dSLionel Sambuc .word 0x10401008, 0x00000008, 0x10001000, 0x00401008 5210*0a6a1f1dSLionel Sambuc .word 0x00400008, 0x00401000, 0x10400000, 0x10001008 5211*0a6a1f1dSLionel Sambuc .word 0x00001008, 0x10000000, 0x10000008, 0x10401000 5212*0a6a1f1dSLionel Sambuc ! nibble 4 5213*0a6a1f1dSLionel Sambuc .word 0x08000000, 0x00010000, 0x00000400, 0x08010420 5214*0a6a1f1dSLionel Sambuc .word 0x08010020, 0x08000400, 0x00010420, 0x08010000 5215*0a6a1f1dSLionel Sambuc .word 0x00010000, 0x00000020, 0x08000020, 0x00010400 5216*0a6a1f1dSLionel Sambuc .word 0x08000420, 0x08010020, 0x08010400, 0x00000000 5217*0a6a1f1dSLionel Sambuc .word 0x00010400, 0x08000000, 0x00010020, 0x00000420 5218*0a6a1f1dSLionel Sambuc .word 0x08000400, 0x00010420, 0x00000000, 0x08000020 5219*0a6a1f1dSLionel Sambuc .word 0x00000020, 0x08000420, 0x08010420, 0x00010020 5220*0a6a1f1dSLionel Sambuc .word 0x08010000, 0x00000400, 0x00000420, 0x08010400 5221*0a6a1f1dSLionel Sambuc .word 0x08010400, 0x08000420, 0x00010020, 0x08010000 5222*0a6a1f1dSLionel Sambuc .word 0x00010000, 0x00000020, 0x08000020, 0x08000400 5223*0a6a1f1dSLionel Sambuc .word 0x08000000, 0x00010400, 0x08010420, 0x00000000 5224*0a6a1f1dSLionel Sambuc .word 0x00010420, 0x08000000, 0x00000400, 0x00010020 5225*0a6a1f1dSLionel Sambuc .word 0x08000420, 0x00000400, 0x00000000, 0x08010420 5226*0a6a1f1dSLionel Sambuc .word 0x08010020, 0x08010400, 0x00000420, 0x00010000 5227*0a6a1f1dSLionel Sambuc .word 0x00010400, 0x08010020, 0x08000400, 0x00000420 5228*0a6a1f1dSLionel Sambuc .word 0x00000020, 0x00010420, 0x08010000, 0x08000020 5229*0a6a1f1dSLionel Sambuc ! nibble 5 5230*0a6a1f1dSLionel Sambuc .word 0x80000040, 0x00200040, 0x00000000, 0x80202000 5231*0a6a1f1dSLionel Sambuc .word 0x00200040, 0x00002000, 0x80002040, 0x00200000 5232*0a6a1f1dSLionel Sambuc .word 0x00002040, 0x80202040, 0x00202000, 0x80000000 5233*0a6a1f1dSLionel Sambuc .word 0x80002000, 0x80000040, 0x80200000, 0x00202040 5234*0a6a1f1dSLionel Sambuc .word 0x00200000, 0x80002040, 0x80200040, 0x00000000 5235*0a6a1f1dSLionel Sambuc .word 0x00002000, 0x00000040, 0x80202000, 0x80200040 5236*0a6a1f1dSLionel Sambuc .word 0x80202040, 0x80200000, 0x80000000, 0x00002040 5237*0a6a1f1dSLionel Sambuc .word 0x00000040, 0x00202000, 0x00202040, 0x80002000 5238*0a6a1f1dSLionel Sambuc .word 0x00002040, 0x80000000, 0x80002000, 0x00202040 5239*0a6a1f1dSLionel Sambuc .word 0x80202000, 0x00200040, 0x00000000, 0x80002000 5240*0a6a1f1dSLionel Sambuc .word 0x80000000, 0x00002000, 0x80200040, 0x00200000 5241*0a6a1f1dSLionel Sambuc .word 0x00200040, 0x80202040, 0x00202000, 0x00000040 5242*0a6a1f1dSLionel Sambuc .word 0x80202040, 0x00202000, 0x00200000, 0x80002040 5243*0a6a1f1dSLionel Sambuc .word 0x80000040, 0x80200000, 0x00202040, 0x00000000 5244*0a6a1f1dSLionel Sambuc .word 0x00002000, 0x80000040, 0x80002040, 0x80202000 5245*0a6a1f1dSLionel Sambuc .word 0x80200000, 0x00002040, 0x00000040, 0x80200040 5246*0a6a1f1dSLionel Sambuc ! nibble 6 5247*0a6a1f1dSLionel Sambuc .word 0x00004000, 0x00000200, 0x01000200, 0x01000004 5248*0a6a1f1dSLionel Sambuc .word 0x01004204, 0x00004004, 0x00004200, 0x00000000 5249*0a6a1f1dSLionel Sambuc .word 0x01000000, 0x01000204, 0x00000204, 0x01004000 5250*0a6a1f1dSLionel Sambuc .word 0x00000004, 0x01004200, 0x01004000, 0x00000204 5251*0a6a1f1dSLionel Sambuc .word 0x01000204, 0x00004000, 0x00004004, 0x01004204 5252*0a6a1f1dSLionel Sambuc .word 0x00000000, 0x01000200, 0x01000004, 0x00004200 5253*0a6a1f1dSLionel Sambuc .word 0x01004004, 0x00004204, 0x01004200, 0x00000004 5254*0a6a1f1dSLionel Sambuc .word 0x00004204, 0x01004004, 0x00000200, 0x01000000 5255*0a6a1f1dSLionel Sambuc .word 0x00004204, 0x01004000, 0x01004004, 0x00000204 5256*0a6a1f1dSLionel Sambuc .word 0x00004000, 0x00000200, 0x01000000, 0x01004004 5257*0a6a1f1dSLionel Sambuc .word 0x01000204, 0x00004204, 0x00004200, 0x00000000 5258*0a6a1f1dSLionel Sambuc .word 0x00000200, 0x01000004, 0x00000004, 0x01000200 5259*0a6a1f1dSLionel Sambuc .word 0x00000000, 0x01000204, 0x01000200, 0x00004200 5260*0a6a1f1dSLionel Sambuc .word 0x00000204, 0x00004000, 0x01004204, 0x01000000 5261*0a6a1f1dSLionel Sambuc .word 0x01004200, 0x00000004, 0x00004004, 0x01004204 5262*0a6a1f1dSLionel Sambuc .word 0x01000004, 0x01004200, 0x01004000, 0x00004004 5263*0a6a1f1dSLionel Sambuc ! nibble 7 5264*0a6a1f1dSLionel Sambuc .word 0x20800080, 0x20820000, 0x00020080, 0x00000000 5265*0a6a1f1dSLionel Sambuc .word 0x20020000, 0x00800080, 0x20800000, 0x20820080 5266*0a6a1f1dSLionel Sambuc .word 0x00000080, 0x20000000, 0x00820000, 0x00020080 5267*0a6a1f1dSLionel Sambuc .word 0x00820080, 0x20020080, 0x20000080, 0x20800000 5268*0a6a1f1dSLionel Sambuc .word 0x00020000, 0x00820080, 0x00800080, 0x20020000 5269*0a6a1f1dSLionel Sambuc .word 0x20820080, 0x20000080, 0x00000000, 0x00820000 5270*0a6a1f1dSLionel Sambuc .word 0x20000000, 0x00800000, 0x20020080, 0x20800080 5271*0a6a1f1dSLionel Sambuc .word 0x00800000, 0x00020000, 0x20820000, 0x00000080 5272*0a6a1f1dSLionel Sambuc .word 0x00800000, 0x00020000, 0x20000080, 0x20820080 5273*0a6a1f1dSLionel Sambuc .word 0x00020080, 0x20000000, 0x00000000, 0x00820000 5274*0a6a1f1dSLionel Sambuc .word 0x20800080, 0x20020080, 0x20020000, 0x00800080 5275*0a6a1f1dSLionel Sambuc .word 0x20820000, 0x00000080, 0x00800080, 0x20020000 5276*0a6a1f1dSLionel Sambuc .word 0x20820080, 0x00800000, 0x20800000, 0x20000080 5277*0a6a1f1dSLionel Sambuc .word 0x00820000, 0x00020080, 0x20020080, 0x20800000 5278*0a6a1f1dSLionel Sambuc .word 0x00000080, 0x20820000, 0x00820080, 0x00000000 5279*0a6a1f1dSLionel Sambuc .word 0x20000000, 0x20800080, 0x00020000, 0x00820080 5280*0a6a1f1dSLionel Sambuc 5281