11a59d1b8SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */ 2251496dbSJussi Kivilinna/* 3251496dbSJussi Kivilinna * Serpent Cipher 4-way parallel algorithm (i586/SSE2) 4251496dbSJussi Kivilinna * 5251496dbSJussi Kivilinna * Copyright (C) 2011 Jussi Kivilinna <jussi.kivilinna@mbnet.fi> 6251496dbSJussi Kivilinna * 7251496dbSJussi Kivilinna * Based on crypto/serpent.c by 8251496dbSJussi Kivilinna * Copyright (C) 2002 Dag Arne Osvik <osvik@ii.uib.no> 9251496dbSJussi Kivilinna * 2003 Herbert Valerio Riedel <hvr@gnu.org> 10251496dbSJussi Kivilinna */ 11251496dbSJussi Kivilinna 122dcfd44dSJussi Kivilinna#include <linux/linkage.h> 132dcfd44dSJussi Kivilinna 14251496dbSJussi Kivilinna.file "serpent-sse2-i586-asm_32.S" 15251496dbSJussi Kivilinna.text 16251496dbSJussi Kivilinna 17251496dbSJussi Kivilinna#define arg_ctx 4 18251496dbSJussi Kivilinna#define arg_dst 8 19251496dbSJussi Kivilinna#define arg_src 12 20251496dbSJussi Kivilinna#define arg_xor 16 21251496dbSJussi Kivilinna 22251496dbSJussi Kivilinna/********************************************************************** 23251496dbSJussi Kivilinna 4-way SSE2 serpent 24251496dbSJussi Kivilinna **********************************************************************/ 25251496dbSJussi Kivilinna#define CTX %edx 26251496dbSJussi Kivilinna 27251496dbSJussi Kivilinna#define RA %xmm0 28251496dbSJussi Kivilinna#define RB %xmm1 29251496dbSJussi Kivilinna#define RC %xmm2 30251496dbSJussi Kivilinna#define RD %xmm3 31251496dbSJussi Kivilinna#define RE %xmm4 32251496dbSJussi Kivilinna 33251496dbSJussi Kivilinna#define RT0 %xmm5 34251496dbSJussi Kivilinna#define RT1 %xmm6 35251496dbSJussi Kivilinna 36251496dbSJussi Kivilinna#define RNOT %xmm7 37251496dbSJussi Kivilinna 38251496dbSJussi Kivilinna#define get_key(i, j, t) \ 39251496dbSJussi Kivilinna movd (4*(i)+(j))*4(CTX), t; \ 40251496dbSJussi Kivilinna pshufd $0, t, t; 41251496dbSJussi Kivilinna 42251496dbSJussi Kivilinna#define K(x0, x1, x2, x3, x4, i) \ 43251496dbSJussi Kivilinna get_key(i, 0, x4); \ 44251496dbSJussi Kivilinna get_key(i, 1, RT0); \ 45251496dbSJussi Kivilinna get_key(i, 2, RT1); \ 46251496dbSJussi Kivilinna pxor x4, x0; \ 47251496dbSJussi Kivilinna pxor RT0, x1; \ 48251496dbSJussi Kivilinna pxor RT1, x2; \ 49251496dbSJussi Kivilinna get_key(i, 3, x4); \ 50251496dbSJussi Kivilinna pxor x4, x3; 51251496dbSJussi Kivilinna 52251496dbSJussi Kivilinna#define LK(x0, x1, x2, x3, x4, i) \ 53251496dbSJussi Kivilinna movdqa x0, x4; \ 54251496dbSJussi Kivilinna pslld $13, x0; \ 55251496dbSJussi Kivilinna psrld $(32 - 13), x4; \ 56251496dbSJussi Kivilinna por x4, x0; \ 57251496dbSJussi Kivilinna pxor x0, x1; \ 58251496dbSJussi Kivilinna movdqa x2, x4; \ 59251496dbSJussi Kivilinna pslld $3, x2; \ 60251496dbSJussi Kivilinna psrld $(32 - 3), x4; \ 61251496dbSJussi Kivilinna por x4, x2; \ 62251496dbSJussi Kivilinna pxor x2, x1; \ 63251496dbSJussi Kivilinna movdqa x1, x4; \ 64251496dbSJussi Kivilinna pslld $1, x1; \ 65251496dbSJussi Kivilinna psrld $(32 - 1), x4; \ 66251496dbSJussi Kivilinna por x4, x1; \ 67251496dbSJussi Kivilinna movdqa x0, x4; \ 68251496dbSJussi Kivilinna pslld $3, x4; \ 69251496dbSJussi Kivilinna pxor x2, x3; \ 70251496dbSJussi Kivilinna pxor x4, x3; \ 71251496dbSJussi Kivilinna movdqa x3, x4; \ 72251496dbSJussi Kivilinna pslld $7, x3; \ 73251496dbSJussi Kivilinna psrld $(32 - 7), x4; \ 74251496dbSJussi Kivilinna por x4, x3; \ 75251496dbSJussi Kivilinna movdqa x1, x4; \ 76251496dbSJussi Kivilinna pslld $7, x4; \ 77251496dbSJussi Kivilinna pxor x1, x0; \ 78251496dbSJussi Kivilinna pxor x3, x0; \ 79251496dbSJussi Kivilinna pxor x3, x2; \ 80251496dbSJussi Kivilinna pxor x4, x2; \ 81251496dbSJussi Kivilinna movdqa x0, x4; \ 82251496dbSJussi Kivilinna get_key(i, 1, RT0); \ 83251496dbSJussi Kivilinna pxor RT0, x1; \ 84251496dbSJussi Kivilinna get_key(i, 3, RT0); \ 85251496dbSJussi Kivilinna pxor RT0, x3; \ 86251496dbSJussi Kivilinna pslld $5, x0; \ 87251496dbSJussi Kivilinna psrld $(32 - 5), x4; \ 88251496dbSJussi Kivilinna por x4, x0; \ 89251496dbSJussi Kivilinna movdqa x2, x4; \ 90251496dbSJussi Kivilinna pslld $22, x2; \ 91251496dbSJussi Kivilinna psrld $(32 - 22), x4; \ 92251496dbSJussi Kivilinna por x4, x2; \ 93251496dbSJussi Kivilinna get_key(i, 0, RT0); \ 94251496dbSJussi Kivilinna pxor RT0, x0; \ 95251496dbSJussi Kivilinna get_key(i, 2, RT0); \ 96251496dbSJussi Kivilinna pxor RT0, x2; 97251496dbSJussi Kivilinna 98251496dbSJussi Kivilinna#define KL(x0, x1, x2, x3, x4, i) \ 99251496dbSJussi Kivilinna K(x0, x1, x2, x3, x4, i); \ 100251496dbSJussi Kivilinna movdqa x0, x4; \ 101251496dbSJussi Kivilinna psrld $5, x0; \ 102251496dbSJussi Kivilinna pslld $(32 - 5), x4; \ 103251496dbSJussi Kivilinna por x4, x0; \ 104251496dbSJussi Kivilinna movdqa x2, x4; \ 105251496dbSJussi Kivilinna psrld $22, x2; \ 106251496dbSJussi Kivilinna pslld $(32 - 22), x4; \ 107251496dbSJussi Kivilinna por x4, x2; \ 108251496dbSJussi Kivilinna pxor x3, x2; \ 109251496dbSJussi Kivilinna pxor x3, x0; \ 110251496dbSJussi Kivilinna movdqa x1, x4; \ 111251496dbSJussi Kivilinna pslld $7, x4; \ 112251496dbSJussi Kivilinna pxor x1, x0; \ 113251496dbSJussi Kivilinna pxor x4, x2; \ 114251496dbSJussi Kivilinna movdqa x1, x4; \ 115251496dbSJussi Kivilinna psrld $1, x1; \ 116251496dbSJussi Kivilinna pslld $(32 - 1), x4; \ 117251496dbSJussi Kivilinna por x4, x1; \ 118251496dbSJussi Kivilinna movdqa x3, x4; \ 119251496dbSJussi Kivilinna psrld $7, x3; \ 120251496dbSJussi Kivilinna pslld $(32 - 7), x4; \ 121251496dbSJussi Kivilinna por x4, x3; \ 122251496dbSJussi Kivilinna pxor x0, x1; \ 123251496dbSJussi Kivilinna movdqa x0, x4; \ 124251496dbSJussi Kivilinna pslld $3, x4; \ 125251496dbSJussi Kivilinna pxor x4, x3; \ 126251496dbSJussi Kivilinna movdqa x0, x4; \ 127251496dbSJussi Kivilinna psrld $13, x0; \ 128251496dbSJussi Kivilinna pslld $(32 - 13), x4; \ 129251496dbSJussi Kivilinna por x4, x0; \ 130251496dbSJussi Kivilinna pxor x2, x1; \ 131251496dbSJussi Kivilinna pxor x2, x3; \ 132251496dbSJussi Kivilinna movdqa x2, x4; \ 133251496dbSJussi Kivilinna psrld $3, x2; \ 134251496dbSJussi Kivilinna pslld $(32 - 3), x4; \ 135251496dbSJussi Kivilinna por x4, x2; 136251496dbSJussi Kivilinna 137251496dbSJussi Kivilinna#define S0(x0, x1, x2, x3, x4) \ 138251496dbSJussi Kivilinna movdqa x3, x4; \ 139251496dbSJussi Kivilinna por x0, x3; \ 140251496dbSJussi Kivilinna pxor x4, x0; \ 141251496dbSJussi Kivilinna pxor x2, x4; \ 142251496dbSJussi Kivilinna pxor RNOT, x4; \ 143251496dbSJussi Kivilinna pxor x1, x3; \ 144251496dbSJussi Kivilinna pand x0, x1; \ 145251496dbSJussi Kivilinna pxor x4, x1; \ 146251496dbSJussi Kivilinna pxor x0, x2; \ 147251496dbSJussi Kivilinna pxor x3, x0; \ 148251496dbSJussi Kivilinna por x0, x4; \ 149251496dbSJussi Kivilinna pxor x2, x0; \ 150251496dbSJussi Kivilinna pand x1, x2; \ 151251496dbSJussi Kivilinna pxor x2, x3; \ 152251496dbSJussi Kivilinna pxor RNOT, x1; \ 153251496dbSJussi Kivilinna pxor x4, x2; \ 154251496dbSJussi Kivilinna pxor x2, x1; 155251496dbSJussi Kivilinna 156251496dbSJussi Kivilinna#define S1(x0, x1, x2, x3, x4) \ 157251496dbSJussi Kivilinna movdqa x1, x4; \ 158251496dbSJussi Kivilinna pxor x0, x1; \ 159251496dbSJussi Kivilinna pxor x3, x0; \ 160251496dbSJussi Kivilinna pxor RNOT, x3; \ 161251496dbSJussi Kivilinna pand x1, x4; \ 162251496dbSJussi Kivilinna por x1, x0; \ 163251496dbSJussi Kivilinna pxor x2, x3; \ 164251496dbSJussi Kivilinna pxor x3, x0; \ 165251496dbSJussi Kivilinna pxor x3, x1; \ 166251496dbSJussi Kivilinna pxor x4, x3; \ 167251496dbSJussi Kivilinna por x4, x1; \ 168251496dbSJussi Kivilinna pxor x2, x4; \ 169251496dbSJussi Kivilinna pand x0, x2; \ 170251496dbSJussi Kivilinna pxor x1, x2; \ 171251496dbSJussi Kivilinna por x0, x1; \ 172251496dbSJussi Kivilinna pxor RNOT, x0; \ 173251496dbSJussi Kivilinna pxor x2, x0; \ 174251496dbSJussi Kivilinna pxor x1, x4; 175251496dbSJussi Kivilinna 176251496dbSJussi Kivilinna#define S2(x0, x1, x2, x3, x4) \ 177251496dbSJussi Kivilinna pxor RNOT, x3; \ 178251496dbSJussi Kivilinna pxor x0, x1; \ 179251496dbSJussi Kivilinna movdqa x0, x4; \ 180251496dbSJussi Kivilinna pand x2, x0; \ 181251496dbSJussi Kivilinna pxor x3, x0; \ 182251496dbSJussi Kivilinna por x4, x3; \ 183251496dbSJussi Kivilinna pxor x1, x2; \ 184251496dbSJussi Kivilinna pxor x1, x3; \ 185251496dbSJussi Kivilinna pand x0, x1; \ 186251496dbSJussi Kivilinna pxor x2, x0; \ 187251496dbSJussi Kivilinna pand x3, x2; \ 188251496dbSJussi Kivilinna por x1, x3; \ 189251496dbSJussi Kivilinna pxor RNOT, x0; \ 190251496dbSJussi Kivilinna pxor x0, x3; \ 191251496dbSJussi Kivilinna pxor x0, x4; \ 192251496dbSJussi Kivilinna pxor x2, x0; \ 193251496dbSJussi Kivilinna por x2, x1; 194251496dbSJussi Kivilinna 195251496dbSJussi Kivilinna#define S3(x0, x1, x2, x3, x4) \ 196251496dbSJussi Kivilinna movdqa x1, x4; \ 197251496dbSJussi Kivilinna pxor x3, x1; \ 198251496dbSJussi Kivilinna por x0, x3; \ 199251496dbSJussi Kivilinna pand x0, x4; \ 200251496dbSJussi Kivilinna pxor x2, x0; \ 201251496dbSJussi Kivilinna pxor x1, x2; \ 202251496dbSJussi Kivilinna pand x3, x1; \ 203251496dbSJussi Kivilinna pxor x3, x2; \ 204251496dbSJussi Kivilinna por x4, x0; \ 205251496dbSJussi Kivilinna pxor x3, x4; \ 206251496dbSJussi Kivilinna pxor x0, x1; \ 207251496dbSJussi Kivilinna pand x3, x0; \ 208251496dbSJussi Kivilinna pand x4, x3; \ 209251496dbSJussi Kivilinna pxor x2, x3; \ 210251496dbSJussi Kivilinna por x1, x4; \ 211251496dbSJussi Kivilinna pand x1, x2; \ 212251496dbSJussi Kivilinna pxor x3, x4; \ 213251496dbSJussi Kivilinna pxor x3, x0; \ 214251496dbSJussi Kivilinna pxor x2, x3; 215251496dbSJussi Kivilinna 216251496dbSJussi Kivilinna#define S4(x0, x1, x2, x3, x4) \ 217251496dbSJussi Kivilinna movdqa x3, x4; \ 218251496dbSJussi Kivilinna pand x0, x3; \ 219251496dbSJussi Kivilinna pxor x4, x0; \ 220251496dbSJussi Kivilinna pxor x2, x3; \ 221251496dbSJussi Kivilinna por x4, x2; \ 222251496dbSJussi Kivilinna pxor x1, x0; \ 223251496dbSJussi Kivilinna pxor x3, x4; \ 224251496dbSJussi Kivilinna por x0, x2; \ 225251496dbSJussi Kivilinna pxor x1, x2; \ 226251496dbSJussi Kivilinna pand x0, x1; \ 227251496dbSJussi Kivilinna pxor x4, x1; \ 228251496dbSJussi Kivilinna pand x2, x4; \ 229251496dbSJussi Kivilinna pxor x3, x2; \ 230251496dbSJussi Kivilinna pxor x0, x4; \ 231251496dbSJussi Kivilinna por x1, x3; \ 232251496dbSJussi Kivilinna pxor RNOT, x1; \ 233251496dbSJussi Kivilinna pxor x0, x3; 234251496dbSJussi Kivilinna 235251496dbSJussi Kivilinna#define S5(x0, x1, x2, x3, x4) \ 236251496dbSJussi Kivilinna movdqa x1, x4; \ 237251496dbSJussi Kivilinna por x0, x1; \ 238251496dbSJussi Kivilinna pxor x1, x2; \ 239251496dbSJussi Kivilinna pxor RNOT, x3; \ 240251496dbSJussi Kivilinna pxor x0, x4; \ 241251496dbSJussi Kivilinna pxor x2, x0; \ 242251496dbSJussi Kivilinna pand x4, x1; \ 243251496dbSJussi Kivilinna por x3, x4; \ 244251496dbSJussi Kivilinna pxor x0, x4; \ 245251496dbSJussi Kivilinna pand x3, x0; \ 246251496dbSJussi Kivilinna pxor x3, x1; \ 247251496dbSJussi Kivilinna pxor x2, x3; \ 248251496dbSJussi Kivilinna pxor x1, x0; \ 249251496dbSJussi Kivilinna pand x4, x2; \ 250251496dbSJussi Kivilinna pxor x2, x1; \ 251251496dbSJussi Kivilinna pand x0, x2; \ 252251496dbSJussi Kivilinna pxor x2, x3; 253251496dbSJussi Kivilinna 254251496dbSJussi Kivilinna#define S6(x0, x1, x2, x3, x4) \ 255251496dbSJussi Kivilinna movdqa x1, x4; \ 256251496dbSJussi Kivilinna pxor x0, x3; \ 257251496dbSJussi Kivilinna pxor x2, x1; \ 258251496dbSJussi Kivilinna pxor x0, x2; \ 259251496dbSJussi Kivilinna pand x3, x0; \ 260251496dbSJussi Kivilinna por x3, x1; \ 261251496dbSJussi Kivilinna pxor RNOT, x4; \ 262251496dbSJussi Kivilinna pxor x1, x0; \ 263251496dbSJussi Kivilinna pxor x2, x1; \ 264251496dbSJussi Kivilinna pxor x4, x3; \ 265251496dbSJussi Kivilinna pxor x0, x4; \ 266251496dbSJussi Kivilinna pand x0, x2; \ 267251496dbSJussi Kivilinna pxor x1, x4; \ 268251496dbSJussi Kivilinna pxor x3, x2; \ 269251496dbSJussi Kivilinna pand x1, x3; \ 270251496dbSJussi Kivilinna pxor x0, x3; \ 271251496dbSJussi Kivilinna pxor x2, x1; 272251496dbSJussi Kivilinna 273251496dbSJussi Kivilinna#define S7(x0, x1, x2, x3, x4) \ 274251496dbSJussi Kivilinna pxor RNOT, x1; \ 275251496dbSJussi Kivilinna movdqa x1, x4; \ 276251496dbSJussi Kivilinna pxor RNOT, x0; \ 277251496dbSJussi Kivilinna pand x2, x1; \ 278251496dbSJussi Kivilinna pxor x3, x1; \ 279251496dbSJussi Kivilinna por x4, x3; \ 280251496dbSJussi Kivilinna pxor x2, x4; \ 281251496dbSJussi Kivilinna pxor x3, x2; \ 282251496dbSJussi Kivilinna pxor x0, x3; \ 283251496dbSJussi Kivilinna por x1, x0; \ 284251496dbSJussi Kivilinna pand x0, x2; \ 285251496dbSJussi Kivilinna pxor x4, x0; \ 286251496dbSJussi Kivilinna pxor x3, x4; \ 287251496dbSJussi Kivilinna pand x0, x3; \ 288251496dbSJussi Kivilinna pxor x1, x4; \ 289251496dbSJussi Kivilinna pxor x4, x2; \ 290251496dbSJussi Kivilinna pxor x1, x3; \ 291251496dbSJussi Kivilinna por x0, x4; \ 292251496dbSJussi Kivilinna pxor x1, x4; 293251496dbSJussi Kivilinna 294251496dbSJussi Kivilinna#define SI0(x0, x1, x2, x3, x4) \ 295251496dbSJussi Kivilinna movdqa x3, x4; \ 296251496dbSJussi Kivilinna pxor x0, x1; \ 297251496dbSJussi Kivilinna por x1, x3; \ 298251496dbSJussi Kivilinna pxor x1, x4; \ 299251496dbSJussi Kivilinna pxor RNOT, x0; \ 300251496dbSJussi Kivilinna pxor x3, x2; \ 301251496dbSJussi Kivilinna pxor x0, x3; \ 302251496dbSJussi Kivilinna pand x1, x0; \ 303251496dbSJussi Kivilinna pxor x2, x0; \ 304251496dbSJussi Kivilinna pand x3, x2; \ 305251496dbSJussi Kivilinna pxor x4, x3; \ 306251496dbSJussi Kivilinna pxor x3, x2; \ 307251496dbSJussi Kivilinna pxor x3, x1; \ 308251496dbSJussi Kivilinna pand x0, x3; \ 309251496dbSJussi Kivilinna pxor x0, x1; \ 310251496dbSJussi Kivilinna pxor x2, x0; \ 311251496dbSJussi Kivilinna pxor x3, x4; 312251496dbSJussi Kivilinna 313251496dbSJussi Kivilinna#define SI1(x0, x1, x2, x3, x4) \ 314251496dbSJussi Kivilinna pxor x3, x1; \ 315251496dbSJussi Kivilinna movdqa x0, x4; \ 316251496dbSJussi Kivilinna pxor x2, x0; \ 317251496dbSJussi Kivilinna pxor RNOT, x2; \ 318251496dbSJussi Kivilinna por x1, x4; \ 319251496dbSJussi Kivilinna pxor x3, x4; \ 320251496dbSJussi Kivilinna pand x1, x3; \ 321251496dbSJussi Kivilinna pxor x2, x1; \ 322251496dbSJussi Kivilinna pand x4, x2; \ 323251496dbSJussi Kivilinna pxor x1, x4; \ 324251496dbSJussi Kivilinna por x3, x1; \ 325251496dbSJussi Kivilinna pxor x0, x3; \ 326251496dbSJussi Kivilinna pxor x0, x2; \ 327251496dbSJussi Kivilinna por x4, x0; \ 328251496dbSJussi Kivilinna pxor x4, x2; \ 329251496dbSJussi Kivilinna pxor x0, x1; \ 330251496dbSJussi Kivilinna pxor x1, x4; 331251496dbSJussi Kivilinna 332251496dbSJussi Kivilinna#define SI2(x0, x1, x2, x3, x4) \ 333251496dbSJussi Kivilinna pxor x1, x2; \ 334251496dbSJussi Kivilinna movdqa x3, x4; \ 335251496dbSJussi Kivilinna pxor RNOT, x3; \ 336251496dbSJussi Kivilinna por x2, x3; \ 337251496dbSJussi Kivilinna pxor x4, x2; \ 338251496dbSJussi Kivilinna pxor x0, x4; \ 339251496dbSJussi Kivilinna pxor x1, x3; \ 340251496dbSJussi Kivilinna por x2, x1; \ 341251496dbSJussi Kivilinna pxor x0, x2; \ 342251496dbSJussi Kivilinna pxor x4, x1; \ 343251496dbSJussi Kivilinna por x3, x4; \ 344251496dbSJussi Kivilinna pxor x3, x2; \ 345251496dbSJussi Kivilinna pxor x2, x4; \ 346251496dbSJussi Kivilinna pand x1, x2; \ 347251496dbSJussi Kivilinna pxor x3, x2; \ 348251496dbSJussi Kivilinna pxor x4, x3; \ 349251496dbSJussi Kivilinna pxor x0, x4; 350251496dbSJussi Kivilinna 351251496dbSJussi Kivilinna#define SI3(x0, x1, x2, x3, x4) \ 352251496dbSJussi Kivilinna pxor x1, x2; \ 353251496dbSJussi Kivilinna movdqa x1, x4; \ 354251496dbSJussi Kivilinna pand x2, x1; \ 355251496dbSJussi Kivilinna pxor x0, x1; \ 356251496dbSJussi Kivilinna por x4, x0; \ 357251496dbSJussi Kivilinna pxor x3, x4; \ 358251496dbSJussi Kivilinna pxor x3, x0; \ 359251496dbSJussi Kivilinna por x1, x3; \ 360251496dbSJussi Kivilinna pxor x2, x1; \ 361251496dbSJussi Kivilinna pxor x3, x1; \ 362251496dbSJussi Kivilinna pxor x2, x0; \ 363251496dbSJussi Kivilinna pxor x3, x2; \ 364251496dbSJussi Kivilinna pand x1, x3; \ 365251496dbSJussi Kivilinna pxor x0, x1; \ 366251496dbSJussi Kivilinna pand x2, x0; \ 367251496dbSJussi Kivilinna pxor x3, x4; \ 368251496dbSJussi Kivilinna pxor x0, x3; \ 369251496dbSJussi Kivilinna pxor x1, x0; 370251496dbSJussi Kivilinna 371251496dbSJussi Kivilinna#define SI4(x0, x1, x2, x3, x4) \ 372251496dbSJussi Kivilinna pxor x3, x2; \ 373251496dbSJussi Kivilinna movdqa x0, x4; \ 374251496dbSJussi Kivilinna pand x1, x0; \ 375251496dbSJussi Kivilinna pxor x2, x0; \ 376251496dbSJussi Kivilinna por x3, x2; \ 377251496dbSJussi Kivilinna pxor RNOT, x4; \ 378251496dbSJussi Kivilinna pxor x0, x1; \ 379251496dbSJussi Kivilinna pxor x2, x0; \ 380251496dbSJussi Kivilinna pand x4, x2; \ 381251496dbSJussi Kivilinna pxor x0, x2; \ 382251496dbSJussi Kivilinna por x4, x0; \ 383251496dbSJussi Kivilinna pxor x3, x0; \ 384251496dbSJussi Kivilinna pand x2, x3; \ 385251496dbSJussi Kivilinna pxor x3, x4; \ 386251496dbSJussi Kivilinna pxor x1, x3; \ 387251496dbSJussi Kivilinna pand x0, x1; \ 388251496dbSJussi Kivilinna pxor x1, x4; \ 389251496dbSJussi Kivilinna pxor x3, x0; 390251496dbSJussi Kivilinna 391251496dbSJussi Kivilinna#define SI5(x0, x1, x2, x3, x4) \ 392251496dbSJussi Kivilinna movdqa x1, x4; \ 393251496dbSJussi Kivilinna por x2, x1; \ 394251496dbSJussi Kivilinna pxor x4, x2; \ 395251496dbSJussi Kivilinna pxor x3, x1; \ 396251496dbSJussi Kivilinna pand x4, x3; \ 397251496dbSJussi Kivilinna pxor x3, x2; \ 398251496dbSJussi Kivilinna por x0, x3; \ 399251496dbSJussi Kivilinna pxor RNOT, x0; \ 400251496dbSJussi Kivilinna pxor x2, x3; \ 401251496dbSJussi Kivilinna por x0, x2; \ 402251496dbSJussi Kivilinna pxor x1, x4; \ 403251496dbSJussi Kivilinna pxor x4, x2; \ 404251496dbSJussi Kivilinna pand x0, x4; \ 405251496dbSJussi Kivilinna pxor x1, x0; \ 406251496dbSJussi Kivilinna pxor x3, x1; \ 407251496dbSJussi Kivilinna pand x2, x0; \ 408251496dbSJussi Kivilinna pxor x3, x2; \ 409251496dbSJussi Kivilinna pxor x2, x0; \ 410251496dbSJussi Kivilinna pxor x4, x2; \ 411251496dbSJussi Kivilinna pxor x3, x4; 412251496dbSJussi Kivilinna 413251496dbSJussi Kivilinna#define SI6(x0, x1, x2, x3, x4) \ 414251496dbSJussi Kivilinna pxor x2, x0; \ 415251496dbSJussi Kivilinna movdqa x0, x4; \ 416251496dbSJussi Kivilinna pand x3, x0; \ 417251496dbSJussi Kivilinna pxor x3, x2; \ 418251496dbSJussi Kivilinna pxor x2, x0; \ 419251496dbSJussi Kivilinna pxor x1, x3; \ 420251496dbSJussi Kivilinna por x4, x2; \ 421251496dbSJussi Kivilinna pxor x3, x2; \ 422251496dbSJussi Kivilinna pand x0, x3; \ 423251496dbSJussi Kivilinna pxor RNOT, x0; \ 424251496dbSJussi Kivilinna pxor x1, x3; \ 425251496dbSJussi Kivilinna pand x2, x1; \ 426251496dbSJussi Kivilinna pxor x0, x4; \ 427251496dbSJussi Kivilinna pxor x4, x3; \ 428251496dbSJussi Kivilinna pxor x2, x4; \ 429251496dbSJussi Kivilinna pxor x1, x0; \ 430251496dbSJussi Kivilinna pxor x0, x2; 431251496dbSJussi Kivilinna 432251496dbSJussi Kivilinna#define SI7(x0, x1, x2, x3, x4) \ 433251496dbSJussi Kivilinna movdqa x3, x4; \ 434251496dbSJussi Kivilinna pand x0, x3; \ 435251496dbSJussi Kivilinna pxor x2, x0; \ 436251496dbSJussi Kivilinna por x4, x2; \ 437251496dbSJussi Kivilinna pxor x1, x4; \ 438251496dbSJussi Kivilinna pxor RNOT, x0; \ 439251496dbSJussi Kivilinna por x3, x1; \ 440251496dbSJussi Kivilinna pxor x0, x4; \ 441251496dbSJussi Kivilinna pand x2, x0; \ 442251496dbSJussi Kivilinna pxor x1, x0; \ 443251496dbSJussi Kivilinna pand x2, x1; \ 444251496dbSJussi Kivilinna pxor x2, x3; \ 445251496dbSJussi Kivilinna pxor x3, x4; \ 446251496dbSJussi Kivilinna pand x3, x2; \ 447251496dbSJussi Kivilinna por x0, x3; \ 448251496dbSJussi Kivilinna pxor x4, x1; \ 449251496dbSJussi Kivilinna pxor x4, x3; \ 450251496dbSJussi Kivilinna pand x0, x4; \ 451251496dbSJussi Kivilinna pxor x2, x4; 452251496dbSJussi Kivilinna 453847cb7efSJussi Kivilinna#define transpose_4x4(x0, x1, x2, x3, t0, t1, t2) \ 454251496dbSJussi Kivilinna movdqa x0, t2; \ 455847cb7efSJussi Kivilinna punpckldq x1, x0; \ 456847cb7efSJussi Kivilinna punpckhdq x1, t2; \ 457847cb7efSJussi Kivilinna movdqa x2, t1; \ 458847cb7efSJussi Kivilinna punpckhdq x3, x2; \ 459847cb7efSJussi Kivilinna punpckldq x3, t1; \ 460847cb7efSJussi Kivilinna movdqa x0, x1; \ 461847cb7efSJussi Kivilinna punpcklqdq t1, x0; \ 462847cb7efSJussi Kivilinna punpckhqdq t1, x1; \ 463847cb7efSJussi Kivilinna movdqa t2, x3; \ 464847cb7efSJussi Kivilinna punpcklqdq x2, t2; \ 465847cb7efSJussi Kivilinna punpckhqdq x2, x3; \ 466847cb7efSJussi Kivilinna movdqa t2, x2; 467251496dbSJussi Kivilinna 468251496dbSJussi Kivilinna#define read_blocks(in, x0, x1, x2, x3, t0, t1, t2) \ 469251496dbSJussi Kivilinna movdqu (0*4*4)(in), x0; \ 470251496dbSJussi Kivilinna movdqu (1*4*4)(in), x1; \ 471251496dbSJussi Kivilinna movdqu (2*4*4)(in), x2; \ 472251496dbSJussi Kivilinna movdqu (3*4*4)(in), x3; \ 473251496dbSJussi Kivilinna \ 474251496dbSJussi Kivilinna transpose_4x4(x0, x1, x2, x3, t0, t1, t2) 475251496dbSJussi Kivilinna 476251496dbSJussi Kivilinna#define write_blocks(out, x0, x1, x2, x3, t0, t1, t2) \ 477251496dbSJussi Kivilinna transpose_4x4(x0, x1, x2, x3, t0, t1, t2) \ 478251496dbSJussi Kivilinna \ 479251496dbSJussi Kivilinna movdqu x0, (0*4*4)(out); \ 480251496dbSJussi Kivilinna movdqu x1, (1*4*4)(out); \ 481251496dbSJussi Kivilinna movdqu x2, (2*4*4)(out); \ 482251496dbSJussi Kivilinna movdqu x3, (3*4*4)(out); 483251496dbSJussi Kivilinna 484251496dbSJussi Kivilinna#define xor_blocks(out, x0, x1, x2, x3, t0, t1, t2) \ 485251496dbSJussi Kivilinna transpose_4x4(x0, x1, x2, x3, t0, t1, t2) \ 486251496dbSJussi Kivilinna \ 487251496dbSJussi Kivilinna movdqu (0*4*4)(out), t0; \ 488251496dbSJussi Kivilinna pxor t0, x0; \ 489251496dbSJussi Kivilinna movdqu x0, (0*4*4)(out); \ 490251496dbSJussi Kivilinna movdqu (1*4*4)(out), t0; \ 491251496dbSJussi Kivilinna pxor t0, x1; \ 492251496dbSJussi Kivilinna movdqu x1, (1*4*4)(out); \ 493251496dbSJussi Kivilinna movdqu (2*4*4)(out), t0; \ 494251496dbSJussi Kivilinna pxor t0, x2; \ 495251496dbSJussi Kivilinna movdqu x2, (2*4*4)(out); \ 496251496dbSJussi Kivilinna movdqu (3*4*4)(out), t0; \ 497251496dbSJussi Kivilinna pxor t0, x3; \ 498251496dbSJussi Kivilinna movdqu x3, (3*4*4)(out); 499251496dbSJussi Kivilinna 5006d685e53SJiri SlabySYM_FUNC_START(__serpent_enc_blk_4way) 501251496dbSJussi Kivilinna /* input: 502251496dbSJussi Kivilinna * arg_ctx(%esp): ctx, CTX 503251496dbSJussi Kivilinna * arg_dst(%esp): dst 504251496dbSJussi Kivilinna * arg_src(%esp): src 505251496dbSJussi Kivilinna * arg_xor(%esp): bool, if true: xor output 506251496dbSJussi Kivilinna */ 507251496dbSJussi Kivilinna 508251496dbSJussi Kivilinna pcmpeqd RNOT, RNOT; 509251496dbSJussi Kivilinna 510251496dbSJussi Kivilinna movl arg_ctx(%esp), CTX; 511251496dbSJussi Kivilinna 512251496dbSJussi Kivilinna movl arg_src(%esp), %eax; 513251496dbSJussi Kivilinna read_blocks(%eax, RA, RB, RC, RD, RT0, RT1, RE); 514251496dbSJussi Kivilinna 515251496dbSJussi Kivilinna K(RA, RB, RC, RD, RE, 0); 516251496dbSJussi Kivilinna S0(RA, RB, RC, RD, RE); LK(RC, RB, RD, RA, RE, 1); 517251496dbSJussi Kivilinna S1(RC, RB, RD, RA, RE); LK(RE, RD, RA, RC, RB, 2); 518251496dbSJussi Kivilinna S2(RE, RD, RA, RC, RB); LK(RB, RD, RE, RC, RA, 3); 519251496dbSJussi Kivilinna S3(RB, RD, RE, RC, RA); LK(RC, RA, RD, RB, RE, 4); 520251496dbSJussi Kivilinna S4(RC, RA, RD, RB, RE); LK(RA, RD, RB, RE, RC, 5); 521251496dbSJussi Kivilinna S5(RA, RD, RB, RE, RC); LK(RC, RA, RD, RE, RB, 6); 522251496dbSJussi Kivilinna S6(RC, RA, RD, RE, RB); LK(RD, RB, RA, RE, RC, 7); 523251496dbSJussi Kivilinna S7(RD, RB, RA, RE, RC); LK(RC, RA, RE, RD, RB, 8); 524251496dbSJussi Kivilinna S0(RC, RA, RE, RD, RB); LK(RE, RA, RD, RC, RB, 9); 525251496dbSJussi Kivilinna S1(RE, RA, RD, RC, RB); LK(RB, RD, RC, RE, RA, 10); 526251496dbSJussi Kivilinna S2(RB, RD, RC, RE, RA); LK(RA, RD, RB, RE, RC, 11); 527251496dbSJussi Kivilinna S3(RA, RD, RB, RE, RC); LK(RE, RC, RD, RA, RB, 12); 528251496dbSJussi Kivilinna S4(RE, RC, RD, RA, RB); LK(RC, RD, RA, RB, RE, 13); 529251496dbSJussi Kivilinna S5(RC, RD, RA, RB, RE); LK(RE, RC, RD, RB, RA, 14); 530251496dbSJussi Kivilinna S6(RE, RC, RD, RB, RA); LK(RD, RA, RC, RB, RE, 15); 531251496dbSJussi Kivilinna S7(RD, RA, RC, RB, RE); LK(RE, RC, RB, RD, RA, 16); 532251496dbSJussi Kivilinna S0(RE, RC, RB, RD, RA); LK(RB, RC, RD, RE, RA, 17); 533251496dbSJussi Kivilinna S1(RB, RC, RD, RE, RA); LK(RA, RD, RE, RB, RC, 18); 534251496dbSJussi Kivilinna S2(RA, RD, RE, RB, RC); LK(RC, RD, RA, RB, RE, 19); 535251496dbSJussi Kivilinna S3(RC, RD, RA, RB, RE); LK(RB, RE, RD, RC, RA, 20); 536251496dbSJussi Kivilinna S4(RB, RE, RD, RC, RA); LK(RE, RD, RC, RA, RB, 21); 537251496dbSJussi Kivilinna S5(RE, RD, RC, RA, RB); LK(RB, RE, RD, RA, RC, 22); 538251496dbSJussi Kivilinna S6(RB, RE, RD, RA, RC); LK(RD, RC, RE, RA, RB, 23); 539251496dbSJussi Kivilinna S7(RD, RC, RE, RA, RB); LK(RB, RE, RA, RD, RC, 24); 540251496dbSJussi Kivilinna S0(RB, RE, RA, RD, RC); LK(RA, RE, RD, RB, RC, 25); 541251496dbSJussi Kivilinna S1(RA, RE, RD, RB, RC); LK(RC, RD, RB, RA, RE, 26); 542251496dbSJussi Kivilinna S2(RC, RD, RB, RA, RE); LK(RE, RD, RC, RA, RB, 27); 543251496dbSJussi Kivilinna S3(RE, RD, RC, RA, RB); LK(RA, RB, RD, RE, RC, 28); 544251496dbSJussi Kivilinna S4(RA, RB, RD, RE, RC); LK(RB, RD, RE, RC, RA, 29); 545251496dbSJussi Kivilinna S5(RB, RD, RE, RC, RA); LK(RA, RB, RD, RC, RE, 30); 546251496dbSJussi Kivilinna S6(RA, RB, RD, RC, RE); LK(RD, RE, RB, RC, RA, 31); 547251496dbSJussi Kivilinna S7(RD, RE, RB, RC, RA); K(RA, RB, RC, RD, RE, 32); 548251496dbSJussi Kivilinna 549251496dbSJussi Kivilinna movl arg_dst(%esp), %eax; 550251496dbSJussi Kivilinna 551251496dbSJussi Kivilinna cmpb $0, arg_xor(%esp); 5522dcfd44dSJussi Kivilinna jnz .L__enc_xor4; 553251496dbSJussi Kivilinna 554251496dbSJussi Kivilinna write_blocks(%eax, RA, RB, RC, RD, RT0, RT1, RE); 555251496dbSJussi Kivilinna 556*f94909ceSPeter Zijlstra RET; 557251496dbSJussi Kivilinna 5582dcfd44dSJussi Kivilinna.L__enc_xor4: 559251496dbSJussi Kivilinna xor_blocks(%eax, RA, RB, RC, RD, RT0, RT1, RE); 560251496dbSJussi Kivilinna 561*f94909ceSPeter Zijlstra RET; 5626d685e53SJiri SlabySYM_FUNC_END(__serpent_enc_blk_4way) 563251496dbSJussi Kivilinna 5646d685e53SJiri SlabySYM_FUNC_START(serpent_dec_blk_4way) 565251496dbSJussi Kivilinna /* input: 566251496dbSJussi Kivilinna * arg_ctx(%esp): ctx, CTX 567251496dbSJussi Kivilinna * arg_dst(%esp): dst 568251496dbSJussi Kivilinna * arg_src(%esp): src 569251496dbSJussi Kivilinna */ 570251496dbSJussi Kivilinna 571251496dbSJussi Kivilinna pcmpeqd RNOT, RNOT; 572251496dbSJussi Kivilinna 573251496dbSJussi Kivilinna movl arg_ctx(%esp), CTX; 574251496dbSJussi Kivilinna 575251496dbSJussi Kivilinna movl arg_src(%esp), %eax; 576251496dbSJussi Kivilinna read_blocks(%eax, RA, RB, RC, RD, RT0, RT1, RE); 577251496dbSJussi Kivilinna 578251496dbSJussi Kivilinna K(RA, RB, RC, RD, RE, 32); 579251496dbSJussi Kivilinna SI7(RA, RB, RC, RD, RE); KL(RB, RD, RA, RE, RC, 31); 580251496dbSJussi Kivilinna SI6(RB, RD, RA, RE, RC); KL(RA, RC, RE, RB, RD, 30); 581251496dbSJussi Kivilinna SI5(RA, RC, RE, RB, RD); KL(RC, RD, RA, RE, RB, 29); 582251496dbSJussi Kivilinna SI4(RC, RD, RA, RE, RB); KL(RC, RA, RB, RE, RD, 28); 583251496dbSJussi Kivilinna SI3(RC, RA, RB, RE, RD); KL(RB, RC, RD, RE, RA, 27); 584251496dbSJussi Kivilinna SI2(RB, RC, RD, RE, RA); KL(RC, RA, RE, RD, RB, 26); 585251496dbSJussi Kivilinna SI1(RC, RA, RE, RD, RB); KL(RB, RA, RE, RD, RC, 25); 586251496dbSJussi Kivilinna SI0(RB, RA, RE, RD, RC); KL(RE, RC, RA, RB, RD, 24); 587251496dbSJussi Kivilinna SI7(RE, RC, RA, RB, RD); KL(RC, RB, RE, RD, RA, 23); 588251496dbSJussi Kivilinna SI6(RC, RB, RE, RD, RA); KL(RE, RA, RD, RC, RB, 22); 589251496dbSJussi Kivilinna SI5(RE, RA, RD, RC, RB); KL(RA, RB, RE, RD, RC, 21); 590251496dbSJussi Kivilinna SI4(RA, RB, RE, RD, RC); KL(RA, RE, RC, RD, RB, 20); 591251496dbSJussi Kivilinna SI3(RA, RE, RC, RD, RB); KL(RC, RA, RB, RD, RE, 19); 592251496dbSJussi Kivilinna SI2(RC, RA, RB, RD, RE); KL(RA, RE, RD, RB, RC, 18); 593251496dbSJussi Kivilinna SI1(RA, RE, RD, RB, RC); KL(RC, RE, RD, RB, RA, 17); 594251496dbSJussi Kivilinna SI0(RC, RE, RD, RB, RA); KL(RD, RA, RE, RC, RB, 16); 595251496dbSJussi Kivilinna SI7(RD, RA, RE, RC, RB); KL(RA, RC, RD, RB, RE, 15); 596251496dbSJussi Kivilinna SI6(RA, RC, RD, RB, RE); KL(RD, RE, RB, RA, RC, 14); 597251496dbSJussi Kivilinna SI5(RD, RE, RB, RA, RC); KL(RE, RC, RD, RB, RA, 13); 598251496dbSJussi Kivilinna SI4(RE, RC, RD, RB, RA); KL(RE, RD, RA, RB, RC, 12); 599251496dbSJussi Kivilinna SI3(RE, RD, RA, RB, RC); KL(RA, RE, RC, RB, RD, 11); 600251496dbSJussi Kivilinna SI2(RA, RE, RC, RB, RD); KL(RE, RD, RB, RC, RA, 10); 601251496dbSJussi Kivilinna SI1(RE, RD, RB, RC, RA); KL(RA, RD, RB, RC, RE, 9); 602251496dbSJussi Kivilinna SI0(RA, RD, RB, RC, RE); KL(RB, RE, RD, RA, RC, 8); 603251496dbSJussi Kivilinna SI7(RB, RE, RD, RA, RC); KL(RE, RA, RB, RC, RD, 7); 604251496dbSJussi Kivilinna SI6(RE, RA, RB, RC, RD); KL(RB, RD, RC, RE, RA, 6); 605251496dbSJussi Kivilinna SI5(RB, RD, RC, RE, RA); KL(RD, RA, RB, RC, RE, 5); 606251496dbSJussi Kivilinna SI4(RD, RA, RB, RC, RE); KL(RD, RB, RE, RC, RA, 4); 607251496dbSJussi Kivilinna SI3(RD, RB, RE, RC, RA); KL(RE, RD, RA, RC, RB, 3); 608251496dbSJussi Kivilinna SI2(RE, RD, RA, RC, RB); KL(RD, RB, RC, RA, RE, 2); 609251496dbSJussi Kivilinna SI1(RD, RB, RC, RA, RE); KL(RE, RB, RC, RA, RD, 1); 610251496dbSJussi Kivilinna SI0(RE, RB, RC, RA, RD); K(RC, RD, RB, RE, RA, 0); 611251496dbSJussi Kivilinna 612251496dbSJussi Kivilinna movl arg_dst(%esp), %eax; 613251496dbSJussi Kivilinna write_blocks(%eax, RC, RD, RB, RE, RT0, RT1, RA); 614251496dbSJussi Kivilinna 615*f94909ceSPeter Zijlstra RET; 6166d685e53SJiri SlabySYM_FUNC_END(serpent_dec_blk_4way) 617