From 7e8471fd29de69e0b375af45ea8abff74c34db5a Mon Sep 17 00:00:00 2001 From: Gvozden Neskovic Date: Mon, 15 Feb 2016 19:18:39 +0100 Subject: [PATCH] Implementation of vdev_raidz generate and reconstruct routines - specialized gen/rec routines for all RAIDZ levels, - new scalar raidz implementation (unrolled), - two x86_64 SIMD implementations (SSE_4.1 and AVX2 instructions sets), - fastest routines selected on module load (benchmark). New zfs module parameters: - zfs_raidz_math_impl (int): selects a new implementation to use: "-1" - the fastest (DEFAULT), "0" - new scalar routines, "1" - new SSE routines, "2" - new AVX2 routines. - zfs_raidz_new_math (uint): enables or disables new implementations: "1" - use new raidz implementation (DEFAULT), "0" - use old raidz implementation. vdev_raidz_math: fix AVX2 code compilation against kernels older and newer than ~3.16 kernel comp: fix CPU feature check for new kernels vdev_raidz_math_scalar: fix function prototype inconsistencies --- cmd/zdb/zdb.c | 1 + cmd/ztest/ztest.c | 1 + include/sys/Makefile.am | 1 + include/sys/vdev_raidz.h | 43 + lib/libzpool/Makefile.am | 4 + module/zfs/Makefile.in | 5 + module/zfs/vdev_raidz.c | 144 +- module/zfs/vdev_raidz.h | 231 + module/zfs/vdev_raidz_math.c | 530 + module/zfs/vdev_raidz_math_avx2.c | 245 + module/zfs/vdev_raidz_math_avx2_mul.h | 11910 +++++++++++++++++++++ module/zfs/vdev_raidz_math_impl.h | 523 + module/zfs/vdev_raidz_math_scalar.c | 705 ++ module/zfs/vdev_raidz_math_sse.c | 771 ++ module/zfs/vdev_raidz_math_sse_mul.h | 13594 ++++++++++++++++++++++++ module/zfs/vdev_raidz_math_x86simd.h | 583 + module/zfs/zfs_vfsops.c | 2 + 17 files changed, 29180 insertions(+), 113 deletions(-) create mode 100644 include/sys/vdev_raidz.h create mode 100644 module/zfs/vdev_raidz.h create mode 100644 module/zfs/vdev_raidz_math.c create mode 100644 module/zfs/vdev_raidz_math_avx2.c create mode 100644 module/zfs/vdev_raidz_math_avx2_mul.h create mode 100644 module/zfs/vdev_raidz_math_impl.h create mode 100644 module/zfs/vdev_raidz_math_scalar.c create mode 100644 module/zfs/vdev_raidz_math_sse.c create mode 100644 module/zfs/vdev_raidz_math_sse_mul.h create mode 100644 module/zfs/vdev_raidz_math_x86simd.h diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c index cbc98d24c2f8..37b128476986 100644 --- a/cmd/zdb/zdb.c +++ b/cmd/zdb/zdb.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include diff --git a/cmd/ztest/ztest.c b/cmd/ztest/ztest.c index 42643ef5d063..cbab1638a0ff 100644 --- a/cmd/ztest/ztest.c +++ b/cmd/ztest/ztest.c @@ -103,6 +103,7 @@ #include #include #include +#include #include #include #include diff --git a/include/sys/Makefile.am b/include/sys/Makefile.am index 73e86d03bb38..66dee0bab3a4 100644 --- a/include/sys/Makefile.am +++ b/include/sys/Makefile.am @@ -73,6 +73,7 @@ COMMON_H = \ $(top_srcdir)/include/sys/vdev_file.h \ $(top_srcdir)/include/sys/vdev.h \ $(top_srcdir)/include/sys/vdev_impl.h \ + $(top_srcdir)/include/sys/vdev_raidz.h \ $(top_srcdir)/include/sys/xvattr.h \ $(top_srcdir)/include/sys/zap.h \ $(top_srcdir)/include/sys/zap_impl.h \ diff --git a/include/sys/vdev_raidz.h b/include/sys/vdev_raidz.h new file mode 100644 index 000000000000..0f99fa4ef54c --- /dev/null +++ b/include/sys/vdev_raidz.h @@ -0,0 +1,43 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (C) 2016 Gvozden Neskovic . + */ + +#ifndef _SYS_VDEV_RAIDZ_H +#define _SYS_VDEV_RAIDZ_H + +#ifdef __cplusplus +extern "C" { +#endif + +void vdev_raidz_math_init(void); + +/* testing interface */ +#if !defined(_KENREL) +void vdev_raidz_cycle_impl(unsigned int v); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_VDEV_RAIDZ_H */ diff --git a/lib/libzpool/Makefile.am b/lib/libzpool/Makefile.am index f45a57d71fdf..ed17ccb0460e 100644 --- a/lib/libzpool/Makefile.am +++ b/lib/libzpool/Makefile.am @@ -90,6 +90,10 @@ KERNEL_C = \ vdev_missing.c \ vdev_queue.c \ vdev_raidz.c \ + vdev_raidz_math.c \ + vdev_raidz_math_scalar.c \ + vdev_raidz_math_sse.c \ + vdev_raidz_math_avx2.c \ vdev_root.c \ zap.c \ zap_leaf.c \ diff --git a/module/zfs/Makefile.in b/module/zfs/Makefile.in index d3a0206c9f7a..39e58ebc6e22 100644 --- a/module/zfs/Makefile.in +++ b/module/zfs/Makefile.in @@ -69,6 +69,8 @@ $(MODULE)-objs += vdev_mirror.o $(MODULE)-objs += vdev_missing.o $(MODULE)-objs += vdev_queue.o $(MODULE)-objs += vdev_raidz.o +$(MODULE)-objs += vdev_raidz_math.o +$(MODULE)-objs += vdev_raidz_math_scalar.o $(MODULE)-objs += vdev_root.o $(MODULE)-objs += zap.o $(MODULE)-objs += zap_leaf.o @@ -107,3 +109,6 @@ $(MODULE)-objs += zrlock.o $(MODULE)-objs += zvol.o $(MODULE)-objs += dsl_destroy.o $(MODULE)-objs += dsl_userhold.o + +$(MODULE)-$(CONFIG_X86) += vdev_raidz_math_sse.o +$(MODULE)-$(CONFIG_X86) += vdev_raidz_math_avx2.o diff --git a/module/zfs/vdev_raidz.c b/module/zfs/vdev_raidz.c index b9479092c842..0f68c5c340e8 100644 --- a/module/zfs/vdev_raidz.c +++ b/module/zfs/vdev_raidz.c @@ -22,6 +22,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2014 by Delphix. All rights reserved. + * Copyright (C) 2016 Gvozden Nešković. All rights reserved. */ #include @@ -32,6 +33,8 @@ #include #include +#include "vdev_raidz.h" + /* * Virtual device vector for RAID-Z. * @@ -99,33 +102,6 @@ * or in concert to recover missing data columns. */ -typedef struct raidz_col { - uint64_t rc_devidx; /* child device index for I/O */ - uint64_t rc_offset; /* device offset */ - uint64_t rc_size; /* I/O size */ - void *rc_data; /* I/O data */ - void *rc_gdata; /* used to store the "good" version */ - int rc_error; /* I/O error for this device */ - uint8_t rc_tried; /* Did we attempt this I/O column? */ - uint8_t rc_skipped; /* Did we skip this I/O column? */ -} raidz_col_t; - -typedef struct raidz_map { - uint64_t rm_cols; /* Regular column count */ - uint64_t rm_scols; /* Count including skipped columns */ - uint64_t rm_bigcols; /* Number of oversized columns */ - uint64_t rm_asize; /* Actual total I/O size */ - uint64_t rm_missingdata; /* Count of missing data devices */ - uint64_t rm_missingparity; /* Count of missing parity devices */ - uint64_t rm_firstdatacol; /* First data column/parity count */ - uint64_t rm_nskip; /* Skipped sectors for padding */ - uint64_t rm_skipstart; /* Column index of padding start */ - void *rm_datacopy; /* rm_asize-buffer of copied data */ - uintptr_t rm_reports; /* # of referencing checksum reports */ - uint8_t rm_freed; /* map no longer has referencing ZIO */ - uint8_t rm_ecksuminjected; /* checksum error was injected */ - raidz_col_t rm_col[1]; /* Flexible array of I/O columns */ -} raidz_map_t; #define VDEV_RAIDZ_P 0 #define VDEV_RAIDZ_Q 1 @@ -159,97 +135,14 @@ typedef struct raidz_map { */ int vdev_raidz_default_to_general; -/* Powers of 2 in the Galois field defined above. */ -static const uint8_t vdev_raidz_pow2[256] = { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26, - 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, - 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, - 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, - 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23, - 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, - 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1, - 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, - 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, - 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, - 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2, - 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, - 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce, - 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, - 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc, - 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, - 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54, - 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, - 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73, - 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, - 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff, - 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, - 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41, - 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, - 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6, - 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, - 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09, - 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, - 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16, - 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, - 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x01 -}; -/* Logs of 2 in the Galois field defined above. */ -static const uint8_t vdev_raidz_log2[256] = { - 0x00, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, - 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b, - 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, - 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71, - 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, - 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45, - 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, - 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6, - 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, - 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88, - 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, - 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40, - 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, - 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d, - 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, - 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57, - 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, - 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18, - 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, - 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e, - 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, - 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61, - 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, - 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2, - 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, - 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6, - 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, - 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a, - 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, - 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7, - 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, - 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf, -}; - -static void vdev_raidz_generate_parity(raidz_map_t *rm); - /* - * Multiply a given number by 2 raised to the given power. + * Select a new raidz implementation by default. */ -static uint8_t -vdev_raidz_exp2(uint_t a, int exp) -{ - if (a == 0) - return (0); +unsigned long zfs_raidz_new_math = 1; - ASSERT(exp >= 0); - ASSERT(vdev_raidz_log2[a] > 0 || a == 1); - exp += vdev_raidz_log2[a]; - if (exp > 255) - exp -= 255; +static void vdev_raidz_generate_parity(raidz_map_t *rm); - return (vdev_raidz_pow2[exp]); -} static void vdev_raidz_map_free(raidz_map_t *rm) @@ -272,6 +165,9 @@ vdev_raidz_map_free(raidz_map_t *rm) if (rm->rm_datacopy != NULL) zio_buf_free(rm->rm_datacopy, size); + /* Free the raidz math plan */ + raidz_math_plan_free(rm->rm_mathplan); + kmem_free(rm, offsetof(raidz_map_t, rm_col[rm->rm_scols])); } @@ -579,6 +475,10 @@ vdev_raidz_map_alloc(zio_t *zio, uint64_t unit_shift, uint64_t dcols, zio->io_vsd = rm; zio->io_vsd_ops = &vdev_raidz_vsd_ops; + + /* Math plan */ + rm->rm_mathplan = raidz_math_plan_alloc(rm); + return (rm); } @@ -729,6 +629,11 @@ vdev_raidz_generate_parity_pqr(raidz_map_t *rm) static void vdev_raidz_generate_parity(raidz_map_t *rm) { + if(zfs_raidz_new_math != 0) { + raidz_math_generate(rm->rm_mathplan); + return; + } + switch (rm->rm_firstdatacol) { case 1: vdev_raidz_generate_parity_p(rm); @@ -1435,6 +1340,14 @@ vdev_raidz_reconstruct(raidz_map_t *rm, int *t, int nt) dt = &tgts[nbadparity]; + /* + * Reconstruct using the new math implementation. + */ + if(zfs_raidz_new_math != 0) { + return (raidz_math_reconstruct(rm->rm_mathplan, + parity_valid, dt, nbaddata)); + } + /* * See if we can use any of our optimized reconstruction routines. */ @@ -2220,3 +2133,8 @@ vdev_ops_t vdev_raidz_ops = { VDEV_TYPE_RAIDZ, /* name of this vdev type */ B_FALSE /* not a leaf vdev */ }; + +#if defined(_KERNEL) && defined(HAVE_SPL) +module_param(zfs_raidz_new_math, ulong, 0644); +MODULE_PARM_DESC(zfs_raidz_new_math, "Select raidz implementation: old(0), new(!=0)"); +#endif diff --git a/module/zfs/vdev_raidz.h b/module/zfs/vdev_raidz.h new file mode 100644 index 000000000000..b19c55006015 --- /dev/null +++ b/module/zfs/vdev_raidz.h @@ -0,0 +1,231 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (C) 2016 Gvozden Nešković. All rights reserved. + */ + +#ifndef _VDEV_RAIDZ_H +#define _VDEV_RAIDZ_H + +#if defined(_KERNEL) +#include +#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0) +#include +#else +#include +#endif + +#else /* !defined(_KERNEL) */ + +#define kernel_fpu_begin() do {} while (0) +#define kernel_fpu_end() do {} while (0) + +#endif /* defined(_KERNEL) */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +enum raidz_math_gen_op { + RAIDZ_GEN_P = 0, + RAIDZ_GEN_PQ, + RAIDZ_GEN_PQR, + RAIDZ_GEN_NUM = 3 +}; +enum raidz_rec_op { + RAIDZ_REC_P = 0, + RAIDZ_REC_Q, + RAIDZ_REC_R, + RAIDZ_REC_PQ, + RAIDZ_REC_PR, + RAIDZ_REC_QR, + RAIDZ_REC_PQR, + RAIDZ_REC_NUM = 7 +}; + +extern const char *raidz_gen_name[RAIDZ_GEN_NUM]; +extern const char *raidz_rec_name[RAIDZ_REC_NUM]; + +typedef void (*raidz_gen_f)(void **, void **, const size_t, + const size_t, const size_t, const size_t); + +typedef int (*raidz_rec_f)(void **, void **, const size_t, + const size_t, const size_t, const size_t, + const size_t *); + +typedef int (*will_work_f)(void); + +typedef struct raidz_math_impl { + raidz_gen_f gen[RAIDZ_GEN_NUM]; + raidz_rec_f rec[RAIDZ_REC_NUM]; + + will_work_f is_supported; + + char *name; +} raidz_math_impl_t; + + +#if !defined(_RAIDZ_TEST) +enum raidz_math_conf { + RAIDZ_CONF_RAIDZ1 = 1, + RAIDZ_CONF_RAIDZ2, + RAIDZ_CONF_RAIDZ3, + RAIDZ_CONF_UNKNOWN +}; + +typedef struct raidz_math_plan { + enum raidz_math_conf mp_conf; /* RAIDZ1/2/3 */ + void **mp_ccols; /* Code columns */ + void **mp_dcols; /* Data columns */ + size_t mp_ndatacols; /* Number of data columns */ + size_t mp_nbigdatacols; /* Number of big data columns */ + size_t mp_csize; /* Size of code columns */ + size_t mp_ldsize; /* Size of the last data column */ + raidz_math_impl_t *mp_ops; /* RAIDZ math operations */ + void *mp_columns[1]; +} raidz_math_plan_t; + +typedef struct raidz_col { + size_t rc_devidx; /* child device index for I/O */ + size_t rc_offset; /* device offset */ + size_t rc_size; /* I/O size */ + void *rc_data; /* I/O data */ + void *rc_gdata; /* used to store the "good" version */ + int rc_error; /* I/O error for this device */ + unsigned int rc_tried; /* Did we attempt this I/O column? */ + unsigned int rc_skipped; /* Did we skip this I/O column? */ +} raidz_col_t; + +typedef struct raidz_map { + size_t rm_cols; /* Regular column count */ + size_t rm_scols; /* Count including skipped columns */ + size_t rm_bigcols; /* Number of oversized columns */ + size_t rm_asize; /* Actual total I/O size */ + size_t rm_missingdata; /* Count of missing data devices */ + size_t rm_missingparity; /* Count of missing parity devices */ + size_t rm_firstdatacol; /* First data column/parity count */ + size_t rm_nskip; /* Skipped sectors for padding */ + size_t rm_skipstart; /* Column index of padding start */ + void *rm_datacopy; /* rm_asize-buffer of copied data */ + size_t rm_reports; /* # of referencing checksum reports */ + unsigned int rm_freed; /* map no longer has referencing ZIO */ + unsigned int rm_ecksuminjected; /* checksum error was injected */ + raidz_math_plan_t *rm_mathplan; /* Raidz math helper struct */ + raidz_col_t rm_col[1]; /* Flexible array of I/O columns */ +} raidz_map_t; + +raidz_math_plan_t *raidz_math_plan_alloc(const raidz_map_t *rm); +void raidz_math_plan_free(raidz_math_plan_t *mp); +void raidz_math_generate(const raidz_math_plan_t *mp); +int raidz_math_reconstruct(const raidz_math_plan_t *mp, + const int *parity_valid, const int *dt, const int nbaddata); + +void raidz_math_plan_print(const raidz_map_t *rm); + +#endif /* !defined(_RAIDZ_TEST) */ + +#define RAIDZ_SCALAR_GEN_WRAP(code, impl) \ +static void \ +impl ## _gen_ ## code(void **codes, void **data,\ + const size_t ndatacols, const size_t nbigdatacols,\ + const size_t codesize, const size_t ldatasize)\ +{\ + raidz_generate_## code ## _impl(codes, data, ndatacols, \ + nbigdatacols, codesize, ldatasize); \ +} + +#define RAIDZ_SCALAR_REC_WRAP(code, impl) \ +static int \ +impl ## _rec_ ## code(void **codes, void **data,\ + const size_t ndatacols, const size_t nbigdatacols,\ + const size_t codesize, const size_t ldatasize,\ + const size_t *tgtidx)\ +{ \ + return (raidz_reconstruct_## code ## _impl(codes, data, ndatacols,\ + nbigdatacols, codesize, ldatasize, tgtidx)); \ +} + + +#define RAIDZ_x86SIMD_GEN_WRAP(code, impl) \ +static void \ +impl ## _gen_ ## code(void **codes, void **data,\ + const size_t ndatacols, const size_t nbigdatacols,\ + const size_t codesize, const size_t ldatasize)\ +{\ + kernel_fpu_begin();\ + \ + raidz_generate_## code ## _impl(codes, data, ndatacols, \ + nbigdatacols, codesize, ldatasize); \ + \ + kernel_fpu_end();\ +} + +#define RAIDZ_x86SIMD_REC_WRAP(code, impl) \ +static int \ +impl ## _rec_ ## code(void **codes, void **data,\ + const size_t ndatacols, const size_t nbigdatacols,\ + const size_t codesize, const size_t ldatasize,\ + const size_t *tgtidx)\ +{ \ + int code;\ + kernel_fpu_begin();\ + \ + code = raidz_reconstruct_## code ## _impl(codes, data, ndatacols,\ + nbigdatacols, codesize, ldatasize, tgtidx); \ + \ + kernel_fpu_end();\ + \ + return (code);\ +} + +/* + * Powers of 2 in the Galois field defined above. + * Elements are repeated to seepd up vdev_raidz_exp2 function, + * (used in scalar reconstruction). + */ +extern const unsigned char vdev_raidz_pow2[511] __attribute__((aligned(256))); +/* Logs of 2 in the Galois field defined above. */ +extern const unsigned char vdev_raidz_log2[256] __attribute__((aligned(256))); + +/* + * Multiply a given number by 2 raised to the given power. + */ +static inline unsigned char +vdev_raidz_exp2(const unsigned char a, const unsigned char exp) +{ + if (a == 0) { + return (0); + } else { + return (vdev_raidz_pow2[exp + vdev_raidz_log2[a]]); + } +} + +#ifdef __cplusplus +} +#endif + +#endif /* _VDEV_RAIDZ_H */ diff --git a/module/zfs/vdev_raidz_math.c b/module/zfs/vdev_raidz_math.c new file mode 100644 index 000000000000..7319bb6b2013 --- /dev/null +++ b/module/zfs/vdev_raidz_math.c @@ -0,0 +1,530 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (C) 2016 Gvozden Nešković. All rights reserved. + */ + +#include "vdev_raidz.h" +#include + +#if !defined(_RAIDZ_TEST) + +#include +#include +#include +#include +#include + +extern const raidz_math_impl_t vdev_raidz_scalar_impl; +extern const raidz_math_impl_t vdev_raidz_sse_impl; +extern const raidz_math_impl_t vdev_raidz_avx2_impl; + +/* + * Select the fastest raidz math by default. + */ +int zfs_raidz_math_impl = -1; +static int zfs_raidz_math_impl_prev = -2; + + +static raidz_math_impl_t vdev_raidz_fastest_impl = { + .name = "fastest" +}; + +const +raidz_math_impl_t *raidz_all_maths[] = { + &vdev_raidz_scalar_impl, +#if (defined(_KERNEL) && defined(__x86_64__)) || !defined(_KERNEL) + &vdev_raidz_sse_impl, +#endif +#if (defined(_KERNEL) && defined(CONFIG_AS_AVX2)) || !defined(_KERNEL) + &vdev_raidz_avx2_impl, +#endif + (raidz_math_impl_t *) NULL /* sentinel */ +}; + +size_t raidz_supported_maths_cnt = 0; +raidz_math_impl_t const * +raidz_supported_maths[sizeof (raidz_all_maths)/sizeof(raidz_math_impl_t*)]; + +#define CODE_P (0) +#define CODE_Q (1) +#define CODE_R (2) + +static inline size_t +raidz_nparity(const raidz_map_t *rm) +{ + return (rm->rm_firstdatacol); +} + +static inline size_t +raidz_nccols(const raidz_map_t *rm) +{ + return (raidz_nparity(rm)); +} + +static inline size_t +raidz_ndcols(const raidz_map_t *rm) +{ + return (rm->rm_cols - raidz_nparity(rm)); +} + +static inline size_t +raidz_csize(const raidz_map_t *rm) +{ + ASSERT(rm->rm_col[0].rc_size == + rm->rm_col[rm->rm_firstdatacol].rc_size); + return (rm->rm_col[0].rc_size); +} + +static inline size_t +raidz_dsize(const raidz_map_t *rm) +{ + ASSERT(raidz_csize(rm) == + rm->rm_col[rm->rm_firstdatacol].rc_size); + return (raidz_csize(rm)); +} + +static inline size_t +raidz_ldsize(const raidz_map_t *rm) +{ + return (rm->rm_col[rm->rm_cols - 1].rc_size); +} + +static inline size_t +raidz_nbigdcols(const raidz_map_t *rm) +{ + size_t nbigdcols = 0; + + if (rm->rm_bigcols == 0) { + nbigdcols = 0; /* all same size */ + } else if (rm->rm_bigcols == rm->rm_cols) { + nbigdcols = 0; /* data doesn't span all columns */ + } else if (rm->rm_bigcols < rm->rm_cols) { + nbigdcols = rm->rm_bigcols - raidz_nparity(rm); + + ASSERT(rm->rm_col[rm->rm_bigcols - 1].rc_size == + raidz_csize(rm)); + ASSERT(rm->rm_col[rm->rm_firstdatacol].rc_size == + raidz_csize(rm)); + ASSERT(nbigdcols < raidz_ndcols(rm)); + } else { + return (0); + } + + return (nbigdcols); +} + +static enum raidz_math_conf +raidz_conf(const raidz_map_t *rm) +{ + switch (raidz_nparity(rm)) { + case 1: + return (RAIDZ_CONF_RAIDZ1); + case 2: + return (RAIDZ_CONF_RAIDZ2); + case 3: + return (RAIDZ_CONF_RAIDZ3); + default: + cmn_err(CE_PANIC, "Unknown RAIDZ configuration."); + break; + } + return (RAIDZ_CONF_UNKNOWN); +} + +#if !defined(_KERNEL) + +int raidz_cycle_impl = 0; +size_t raidz_curr_impl = 0; + +void +vdev_raidz_cycle_impl(unsigned int v) +{ + if(v == 0) { + raidz_cycle_impl = 0; + } else { + raidz_cycle_impl = 1; + } +} + +static raidz_math_impl_t* +vdev_get_impl(void) +{ + if(raidz_cycle_impl == 0) { + return &vdev_raidz_fastest_impl; + } else { + raidz_curr_impl = (raidz_curr_impl+1) % raidz_supported_maths_cnt; + + return (raidz_math_impl_t*) raidz_supported_maths[raidz_curr_impl]; + } +} + +#endif /* !defined(_KERNEL) */ + +raidz_math_plan_t * +raidz_math_plan_alloc(const raidz_map_t *rm) +{ + raidz_math_plan_t *mp; + size_t c, ndcols; + + (void)zfs_raidz_math_impl_prev; + + ndcols = raidz_ndcols(rm); + + mp = kmem_alloc(offsetof(raidz_math_plan_t, + mp_columns[3 + ndcols]), KM_SLEEP); + + mp->mp_conf = raidz_conf(rm); + mp->mp_ndatacols = ndcols; + mp->mp_nbigdatacols = raidz_nbigdcols(rm); + mp->mp_csize = raidz_csize(rm); + mp->mp_ldsize = raidz_ldsize(rm); + + ASSERT(mp->mp_csize % 512 == 0); + ASSERT(mp->mp_ldsize % 512 == 0); + + mp->mp_ccols = mp->mp_columns; + mp->mp_dcols = mp->mp_columns + 3; + + for (c = 0; c < rm->rm_firstdatacol; c++) { + ASSERT(((uintptr_t)(rm->rm_col[c].rc_data) & 31) == 0); + + mp->mp_ccols[c] = rm->rm_col[c].rc_data; + } + + for (; c < rm->rm_cols; c++) { + ASSERT(((uintptr_t)(rm->rm_col[c].rc_data) & 31) == 0); + + mp->mp_dcols[c - rm->rm_firstdatacol] = rm->rm_col[c].rc_data; + } + + /* Benchmark if not initialized */ + if(raidz_supported_maths_cnt == 0) { + vdev_raidz_math_init(); + } + + /* + Set raidz implementation. + If selected implementation is not supported use scalar. + */ + mp->mp_ops = &vdev_raidz_fastest_impl; + +#if defined(_KERNEL) + if(zfs_raidz_math_impl >= 0) { + + if(zfs_raidz_math_impl >= raidz_supported_maths_cnt ) { + zfs_raidz_math_impl = raidz_supported_maths_cnt - 1; + } + + mp->mp_ops = (raidz_math_impl_t*) raidz_supported_maths[zfs_raidz_math_impl]; + } + + if(zfs_raidz_math_impl_prev != zfs_raidz_math_impl) { +#if defined(_KERNEL) + cmn_err(CE_CONT, "RAIDZ_math: Using %s raidz implementation!\n", mp->mp_ops->name); +#endif + zfs_raidz_math_impl_prev = zfs_raidz_math_impl; + } + +#else /* userspace */ + mp->mp_ops = vdev_get_impl(); +#endif + + return (mp); +} + +void +raidz_math_plan_free(raidz_math_plan_t *mp) +{ + kmem_free(mp, offsetof(raidz_math_plan_t, + mp_columns[3 + mp->mp_ndatacols])); +} + +void +raidz_math_generate(const raidz_math_plan_t *mp) +{ + raidz_gen_f gen_parity = NULL; + + switch (mp->mp_conf) { + case RAIDZ_CONF_RAIDZ1: + gen_parity = mp->mp_ops->gen[RAIDZ_GEN_P]; + break; + case RAIDZ_CONF_RAIDZ2: + gen_parity = mp->mp_ops->gen[RAIDZ_GEN_PQ]; + break; + case RAIDZ_CONF_RAIDZ3: + gen_parity = mp->mp_ops->gen[RAIDZ_GEN_PQR]; + break; + default: + gen_parity = NULL; + break; + } + + ASSERT(gen_parity != NULL); + + gen_parity(mp->mp_ccols, mp->mp_dcols, mp->mp_ndatacols, + mp->mp_nbigdatacols, mp->mp_csize, mp->mp_ldsize); +} + +static raidz_rec_f +_reconstruct_fun_raidz1(const raidz_math_plan_t *mp, const int *parity_valid, + const int nbaddata) +{ + if (nbaddata == 1 && parity_valid[CODE_P]) { + return (mp->mp_ops->rec[RAIDZ_REC_P]); + } + return ((raidz_rec_f) NULL); +} + +static raidz_rec_f +_reconstruct_fun_raidz2(const raidz_math_plan_t *mp, const int *parity_valid, + const int nbaddata) +{ + if (nbaddata == 1) { + if (parity_valid[CODE_P]) { + return (mp->mp_ops->rec[RAIDZ_REC_P]); + } else if (parity_valid[CODE_Q]) { + return (mp->mp_ops->rec[RAIDZ_REC_Q]); + } + } else if (nbaddata == 2 && + parity_valid[CODE_P] && parity_valid[CODE_Q]) { + return (mp->mp_ops->rec[RAIDZ_REC_PQ]); + } + return ((raidz_rec_f) NULL); +} + +static raidz_rec_f +_reconstruct_fun_raidz3(const raidz_math_plan_t *mp, const int *parity_valid, + const int nbaddata) +{ + if (nbaddata == 1) { + if (parity_valid[CODE_P]) { + return (mp->mp_ops->rec[RAIDZ_REC_P]); + } else if (parity_valid[CODE_Q]) { + return (mp->mp_ops->rec[RAIDZ_REC_Q]); + } else if (parity_valid[CODE_R]) { + return (mp->mp_ops->rec[RAIDZ_REC_R]); + } + } else if (nbaddata == 2) { + if (parity_valid[CODE_P] && parity_valid[CODE_Q]) { + return (mp->mp_ops->rec[RAIDZ_REC_PQ]); + } else if (parity_valid[CODE_P] && parity_valid[CODE_R]) { + return (mp->mp_ops->rec[RAIDZ_REC_PR]); + } else if (parity_valid[CODE_Q] && parity_valid[CODE_R]) { + return (mp->mp_ops->rec[RAIDZ_REC_QR]); + } + } else if (nbaddata == 3 && + parity_valid[CODE_P] && parity_valid[CODE_Q] && + parity_valid[CODE_R]) { + return (mp->mp_ops->rec[RAIDZ_REC_PQR]); + } + return ((raidz_rec_f) NULL); +} + +int +raidz_math_reconstruct(const raidz_math_plan_t *mp, const int *parity_valid, + const int *dt, const int nbaddata) +{ + size_t tidx[RAIDZ_GEN_NUM], c; + raidz_rec_f rec_data = NULL; + + switch (mp->mp_conf) { + case RAIDZ_CONF_RAIDZ1: + rec_data = _reconstruct_fun_raidz1(mp, + parity_valid, nbaddata); + break; + case RAIDZ_CONF_RAIDZ2: + rec_data = _reconstruct_fun_raidz2(mp, + parity_valid, nbaddata); + break; + case RAIDZ_CONF_RAIDZ3: + rec_data = _reconstruct_fun_raidz3(mp, + parity_valid, nbaddata); + break; + default: + break; + } + + ASSERT(rec_data != NULL); + + for (c = 0; c < nbaddata; c++) { + tidx[c] = dt[c] - mp->mp_conf; + } + + return (rec_data(mp->mp_ccols, mp->mp_dcols, + mp->mp_ndatacols, mp->mp_nbigdatacols, + mp->mp_csize, mp->mp_ldsize, tidx)); +} + +#endif /* !defined(_RAIDZ_TEST) */ + + +const char *raidz_gen_name[] = { + "gen_p", "gen_pq", "gen_pqr" +}; +const char *raidz_rec_name[] = { + "rec_p", "rec_q", "rec_r", + "rec_pq", "rec_pr", "rec_qr", "rec_pqr" +}; + +#if !defined(_RAIDZ_TEST) + +/* Number of pages for benchmark: 2^BENCH_SIZE_ORD */ +#define BENCH_D_COLS (8) +#define BENCH_COLS (3 + BENCH_D_COLS) +#define BENCH_SD_SIZE (PAGE_SIZE*3/4) +#define BENCH_NS (50ULL*1000ULL*1000ULL) /*50ms*/ + +#define BENCH_RES_FMT "RAIDZ_math: [%-7s] %-8s %5ld.%.3ld MB/s\n" +#define BENCH_SKIP_FMT "RAIDZ_math: [%-7s] is unsupported\n" + +#if defined(_KERNEL) +#define bench_print(x...) cmn_err(CE_CONT, x) +#else +#define bench_print(x...) do{}while(0) +#endif + +void +vdev_raidz_math_init(void) +{ + const raidz_math_impl_t **test_impl; + raidz_math_impl_t const *curr_impl; + void *columns[BENCH_COLS]; + const size_t tgtidx[3] = { 0, 1, 2 }; + unsigned long long run_count, best_run_count, speed; + hrtime_t t_start; + void *mem; + int i; + + /* move supported maths into raidz_supported_maths */ + for (i=0,test_impl = raidz_all_maths; *test_impl != NULL; test_impl++) { + curr_impl = *test_impl; + + if ((*curr_impl->is_supported)()) { + raidz_supported_maths[i++] = (raidz_math_impl_t *) curr_impl; + } else { + bench_print(BENCH_SKIP_FMT, curr_impl->name); + continue; + } + } + raidz_supported_maths[i] = NULL; /* sentinel */ + raidz_supported_maths_cnt = i; + + /* allocate one page per column */ +#if defined(_KERNEL) + mem = (void *) zio_buf_alloc(PAGE_SIZE * BENCH_COLS); +#else + mem = (void *) malloc(PAGE_SIZE * BENCH_COLS); +#endif + + if (!mem) { + /* use scalar math */ + memcpy(&vdev_raidz_fastest_impl, &vdev_raidz_scalar_impl, + sizeof (raidz_math_impl_t)); + + cmn_err(CE_WARN, "RAIDZ_math: Can not allocate benchmark memory!"); + cmn_err(CE_WARN, "RAIDZ_math: Using scalar implementation"); + return; + } + + /* Setup column pointers for calculation */ + columns[0] = mem; + for (i = 1; i < BENCH_COLS; i++) { + columns[i] = columns[i - 1] + PAGE_SIZE; + } + + /* Find the fastest gen functions */ + for (i = 0; i < RAIDZ_GEN_NUM; i++) { + best_run_count = 0; + for (test_impl = raidz_supported_maths; *test_impl != NULL; + test_impl++) { + curr_impl = *test_impl; + + run_count = 0; + t_start = gethrtime(); + + do { + (*curr_impl->gen[i])(columns, &columns[3], + BENCH_D_COLS, BENCH_D_COLS / 2, + PAGE_SIZE, BENCH_SD_SIZE); + run_count++; + } while (gethrtime() < (t_start + BENCH_NS)); + + speed = run_count * (PAGE_SIZE >> 10) * 1000000000ULL; + speed /= (gethrtime() - t_start); + + if (run_count > best_run_count) { + best_run_count = run_count; + vdev_raidz_fastest_impl.gen[i] = + curr_impl->gen[i]; + } + + bench_print(BENCH_RES_FMT, raidz_gen_name[i], + (*test_impl)->name, speed/1000, speed%1000); + } + } + + /* Find the fastest rec functions */ + for (i = 0; i < RAIDZ_REC_NUM; i++) { + best_run_count = 0; + for (test_impl = raidz_supported_maths; *test_impl != NULL; + test_impl++) { + curr_impl = *test_impl; + + run_count = 0; + t_start = gethrtime(); + + do { + (*curr_impl->rec[i])(columns, &columns[3], + BENCH_D_COLS, BENCH_D_COLS / 2, + PAGE_SIZE, BENCH_SD_SIZE, + tgtidx); + run_count++; + } while (gethrtime() < (t_start + BENCH_NS)); + + speed = run_count * (PAGE_SIZE >> 10) * 1000000000ULL; + speed /= (gethrtime() - t_start); + + if (run_count > best_run_count) { + best_run_count = run_count; + vdev_raidz_fastest_impl.rec[i] = + curr_impl->rec[i]; + } + + bench_print(BENCH_RES_FMT, raidz_rec_name[i], + (*test_impl)->name, speed/1000, speed%1000); + } + } + + /* Free benchmark memory */ +#if defined(_KERNEL) && defined(HAVE_SPL) + zio_buf_free(mem, PAGE_SIZE * BENCH_COLS); +#else + free(mem); +#endif +} + +#endif /* !defined(_RAIDZ_TEST) */ + +#if defined(_KERNEL) && defined(HAVE_SPL) +module_param(zfs_raidz_math_impl, int, 0644); +MODULE_PARM_DESC(zfs_raidz_math_impl, "Select raidz math: fastest(-1), scalar(0), SSE(1), AVX2(2)."); +#endif diff --git a/module/zfs/vdev_raidz_math_avx2.c b/module/zfs/vdev_raidz_math_avx2.c new file mode 100644 index 000000000000..6a72fda91341 --- /dev/null +++ b/module/zfs/vdev_raidz_math_avx2.c @@ -0,0 +1,245 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (C) 2016 Gvozden Nešković. All rights reserved. + */ + +#include +#include "vdev_raidz.h" + +#if !defined(_KERNEL) +#include +#endif + +#define __asm __asm__ __volatile__ + +#define _REG_CNT(_0,_1,_2,_3,_4,_5,_6,_7, N, ...) N +#define REG_CNT(r...) _REG_CNT(r, 8,7,6,5,4,3,2,1) + +#define VR0_(REG, ...) "ymm"#REG +#define VR1_(_1, REG, ...) "ymm"#REG +#define VR2_(_1,_2, REG, ...) "ymm"#REG +#define VR3_(_1,_2,_3, REG, ...) "ymm"#REG +#define VR4_(_1,_2,_3,_4, REG, ...) "ymm"#REG +#define VR5_(_1,_2,_3,_4,_5, REG, ...) "ymm"#REG +#define VR6_(_1,_2,_3,_4,_5,_6, REG, ...) "ymm"#REG +#define VR7_(_1,_2,_3,_4,_5,_6,_7, REG, ...) "ymm"#REG + +#define VR0(r...) VR0_(r) +#define VR1(r...) VR1_(r) +#define VR2(r...) VR2_(r, 1) +#define VR3(r...) VR3_(r, 1,2) +#define VR4(r...) VR4_(r, 1) +#define VR5(r...) VR5_(r, 1,2) +#define VR6(r...) VR6_(r, 1,2,3) +#define VR7(r...) VR7_(r, 1,2,3,4) + +#define R_01(REG1, REG2, ...) REG1, REG2 +#define R_23_(_0,_1, REG2, REG3, ...) REG2, REG3 +#define R_23(REG...) R_23_(REG, 1,2,3) + +#define ELEM_SIZE 32 + +typedef struct elem { + unsigned char b[ELEM_SIZE]; +} elem_t __attribute__((aligned(ELEM_SIZE))); + +/* Convert from GF log to perform multiplications using SIMD */ +inline static int +fix_mul_exponent(int e) { + return ((int)vdev_raidz_pow2[e]); +} + +#define PREFETCHNTA(ptr, offset, stride) \ +{ \ + switch(stride){\ + case 4: __asm("prefetchnta %0" :: "m" (((elem_t*)ptr)[offset+3])); \ + __asm("prefetchnta %0" :: "m" (((elem_t*)ptr)[offset+2])); \ + case 2: __asm("prefetchnta %0" :: "m" (((elem_t*)ptr)[offset+1])); \ + __asm("prefetchnta %0" :: "m" (((elem_t*)ptr)[offset+0])); \ + }\ +} + +#define XOR_ACC(src, r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 4: __asm("vpxor %0, %%" VR3(r)", %%" VR3(r) : : "m" (((elem_t*)src)[3]));\ + __asm("vpxor %0, %%" VR2(r)", %%" VR2(r) : : "m" (((elem_t*)src)[2]));\ + case 2: __asm("vpxor %0, %%" VR1(r)", %%" VR1(r) : : "m" (((elem_t*)src)[1]));\ + case 1: __asm("vpxor %0, %%" VR0(r)", %%" VR0(r) : : "m" (((elem_t*)src)[0]));\ + }\ +} + +#define XOR(r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 8:\ + __asm("vpxor %" VR3(r) ", %" VR7(r)", %" VR7(r));\ + __asm("vpxor %" VR2(r) ", %" VR6(r)", %" VR6(r));\ + __asm("vpxor %" VR1(r) ", %" VR5(r)", %" VR5(r));\ + __asm("vpxor %" VR0(r) ", %" VR4(r)", %" VR4(r));\ + break;\ + case 4:\ + __asm("vpxor %" VR1(r) ", %" VR3(r)", %" VR3(r));\ + __asm("vpxor %" VR0(r) ", %" VR2(r)", %" VR2(r));\ + break;\ + case 2:\ + __asm("vpxor %" VR0(r) ", %" VR1(r)", %" VR1(r));\ + break;\ + }\ +} + +#define COPY(r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 8:\ + __asm("vmovdqa %" VR0(r) ", %" VR4(r));\ + __asm("vmovdqa %" VR1(r) ", %" VR5(r));\ + __asm("vmovdqa %" VR2(r) ", %" VR6(r));\ + __asm("vmovdqa %" VR3(r) ", %" VR7(r));\ + break;\ + case 4:\ + __asm("vmovdqa %" VR0(r) ", %" VR2(r));\ + __asm("vmovdqa %" VR1(r) ", %" VR3(r));\ + break;\ + case 2:\ + __asm("vmovdqa %" VR0(r) ", %" VR1(r));\ + break;\ + }\ +} + +#define LOAD(src, r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 4: __asm("vmovdqa %0, %%" VR3(r) : : "m" (((elem_t *)src)[3]));\ + __asm("vmovdqa %0, %%" VR2(r) : : "m" (((elem_t *)src)[2]));\ + case 2: __asm("vmovdqa %0, %%" VR1(r) : : "m" (((elem_t *)src)[1]));\ + case 1: __asm("vmovdqa %0, %%" VR0(r) : : "m" (((elem_t *)src)[0]));\ + }\ +} + +#define ZERO(r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 4: __asm("vpxor %" VR3(r)", %" VR3(r)", %" VR3(r));\ + __asm("vpxor %" VR2(r)", %" VR2(r)", %" VR2(r));\ + case 2: __asm("vpxor %" VR1(r)", %" VR1(r)", %" VR1(r));\ + case 1: __asm("vpxor %" VR0(r)", %" VR0(r)", %" VR0(r));\ + }\ +} + +#define STREAM_STORE(dst, r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 4: __asm("vmovntdq %%" VR3(r)", %0" : "=m" (((elem_t *)dst)[3]));\ + __asm("vmovntdq %%" VR2(r)", %0" : "=m" (((elem_t *)dst)[2]));\ + case 2: __asm("vmovntdq %%" VR1(r)", %0" : "=m" (((elem_t *)dst)[1]));\ + case 1: __asm("vmovntdq %%" VR0(r)", %0" : "=m" (((elem_t *)dst)[0]));\ + }\ +} + +#define FLUSH() \ +{ \ + __asm("vzeroupper"); \ + __asm("sfence" : : : "memory"); \ +} + +#define MUL2_SETUP() \ +{ \ + __asm("vbroadcasti128 %0, %%ymm14" : : "m" (sse_gf_mod_constants[1][0])); \ + __asm("vpxor %ymm15, %ymm15 ,%ymm15"); \ +} + +#define MUL2_(r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 2:\ + __asm("vpcmpgtb %" VR0(r)", %ymm15, %ymm12");\ + __asm("vpcmpgtb %" VR1(r)", %ymm15, %ymm13");\ + __asm("vpaddb %" VR0(r)", %" VR0(r)", %" VR0(r));\ + __asm("vpaddb %" VR1(r)", %" VR1(r)", %" VR1(r));\ + __asm("vpand %ymm14, %ymm12, %ymm12");\ + __asm("vpand %ymm14, %ymm13, %ymm13");\ + __asm("vpxor %ymm12, %" VR0(r)", %" VR0(r));\ + __asm("vpxor %ymm13, %" VR1(r)", %" VR1(r));\ + break;\ + }\ +} + +#define MUL2(r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 2:\ + MUL2_(r);\ + break;\ + case 4:\ + MUL2_(R_01(r));\ + MUL2_(R_23(r));\ + break;\ + }\ +} + +#define MUL4(r...) \ +{ \ + MUL2(r); \ + MUL2(r); \ +} + +#include "vdev_raidz_math_avx2_mul.h" +#include "vdev_raidz_math_x86simd.h" +#include "vdev_raidz_math_impl.h" + +RAIDZ_x86SIMD_GEN_WRAP(p, avx2); +RAIDZ_x86SIMD_GEN_WRAP(pq, avx2); +RAIDZ_x86SIMD_GEN_WRAP(pqr, avx2); + +RAIDZ_x86SIMD_REC_WRAP(p, avx2); +RAIDZ_x86SIMD_REC_WRAP(q, avx2); +RAIDZ_x86SIMD_REC_WRAP(r, avx2); +RAIDZ_x86SIMD_REC_WRAP(pq, avx2); +RAIDZ_x86SIMD_REC_WRAP(pr, avx2); +RAIDZ_x86SIMD_REC_WRAP(qr, avx2); +RAIDZ_x86SIMD_REC_WRAP(pqr, avx2); + +static int +raidz_math_will_avx2_work(void) +{ +#if defined(__x86_64__) && defined(_KERNEL) && defined(CONFIG_AS_AVX2) + return ( + boot_cpu_has(X86_FEATURE_AVX) && + boot_cpu_has(X86_FEATURE_AVX2) + ); +#else + return (!system("grep avx2 /proc/cpuinfo 2>&1 > /dev/null")); +#endif +} + +const raidz_math_impl_t vdev_raidz_avx2_impl = { + .gen = { &avx2_gen_p, &avx2_gen_pq, &avx2_gen_pqr }, + .rec = { + &avx2_rec_p, &avx2_rec_q, &avx2_rec_r, + &avx2_rec_pq, &avx2_rec_pr, &avx2_rec_qr, + &avx2_rec_pqr + }, + .is_supported = &raidz_math_will_avx2_work, + .name = "avx2" +}; diff --git a/module/zfs/vdev_raidz_math_avx2_mul.h b/module/zfs/vdev_raidz_math_avx2_mul.h new file mode 100644 index 000000000000..d46d31f5e584 --- /dev/null +++ b/module/zfs/vdev_raidz_math_avx2_mul.h @@ -0,0 +1,11910 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (C) 2016 Gvozden Nešković. All rights reserved. + */ + +#ifndef _VDEV_RAIDZ_MATH_AVX2_MUL_H +#define _VDEV_RAIDZ_MATH_AVX2_MUL_H + +#include + +#if defined(_RAIDZ_TEST) +#include +#endif + +#define _AVX2_SIZE (32) + +#define _MUL_IN1 "ymm0" +#define _MUL_IN2 "ymm1" + +#define _MUL_TMP1 "ymm10" +#define _MUL_TMP2 "ymm11" +#define _MUL_TMP3 "ymm12" + +#define _0F_MASK "ymm13" +#define _LT_LOW "ymm14" +#define _LT_UP "ymm15" + +extern const uint8_t sse_gf_mod_constants[2][16] __attribute__((aligned(256))); +extern const uint8_t sse_gf_mod_lt[2*256][16] __attribute__((aligned(256))); + +#define SETUP(a)\ +{\ + __asm("vbroadcasti128 %0, %%" _0F_MASK : : "m" (sse_gf_mod_constants[0][0]));\ + __asm("vbroadcasti128 %0, %%" _LT_LOW : : "m" (sse_gf_mod_lt[2*(a)+0][0]));\ + __asm("vbroadcasti128 %0, %%" _LT_UP : : "m" (sse_gf_mod_lt[2*(a)+1][0]));\ +} + +#define MUL_MLOOKUP_x2_0()\ +{\ + __asm("vpxor %" _MUL_IN1 ", %" _MUL_IN1 ", %" _MUL_IN1);\ + __asm("vpxor %" _MUL_IN2 ", %" _MUL_IN2 ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_1()\ +{} + +#define MUL_MLOOKUP_x2_2()\ +{\ + __asm("vbroadcasti128 %0, %%" _MUL_TMP1 : : "m" (sse_gf_mod_constants[1][0]));\ + __asm("vpxor %" _MUL_TMP3 ", %" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpcmpgtb %" _MUL_IN1 ", %" _MUL_TMP3 ", %" _MUL_TMP2);\ + __asm("vpcmpgtb %" _MUL_IN2 ", %" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpand %" _MUL_TMP1 ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x1d */\ + __asm("vpand %" _MUL_TMP1 ", %" _MUL_TMP3 ", %" _MUL_TMP3); /* 32x 0x1d */\ + __asm("vpaddb %" _MUL_IN1 ", %" _MUL_IN1 ", %" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ", %" _MUL_IN2 ", %" _MUL_IN2);\ + __asm("vpxor %" _MUL_TMP2 ", %" _MUL_IN1 ", %" _MUL_IN1);\ + __asm("vpxor %" _MUL_TMP3 ", %" _MUL_IN2 ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_3()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_4()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_5()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_6()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_7()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_8()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_9()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_10()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_11()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_12()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_13()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_14()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_15()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_16()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_17()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_18()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_19()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_20()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_21()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_22()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_23()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_24()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_25()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_26()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_27()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_28()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_29()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_30()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_31()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_32()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_33()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_34()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_35()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_36()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_37()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_38()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_39()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_40()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_41()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_42()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_43()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_44()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_45()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_46()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_47()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_48()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_49()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_50()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_51()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_52()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_53()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_54()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_55()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_56()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_57()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_58()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_59()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_60()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_61()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_62()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_63()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_64()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_65()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_66()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_67()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_68()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_69()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_70()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_71()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_72()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_73()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_74()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_75()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_76()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_77()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_78()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_79()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_80()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_81()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_82()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_83()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_84()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_85()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_86()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_87()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_88()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_89()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_90()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_91()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_92()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_93()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_94()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_95()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_96()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_97()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_98()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_99()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_100()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_101()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_102()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_103()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_104()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_105()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_106()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_107()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_108()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_109()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_110()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_111()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_112()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_113()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_114()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_115()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_116()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_117()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_118()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_119()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_120()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_121()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_122()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_123()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_124()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_125()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_126()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_127()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_128()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_129()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_130()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_131()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_132()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_133()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_134()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_135()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_136()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_137()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_138()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_139()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_140()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_141()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_142()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_143()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_144()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_145()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_146()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_147()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_148()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_149()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_150()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_151()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_152()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_153()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_154()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_155()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_156()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_157()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_158()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_159()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_160()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_161()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_162()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_163()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_164()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_165()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_166()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_167()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_168()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_169()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_170()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_171()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_172()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_173()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_174()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_175()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_176()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_177()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_178()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_179()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_180()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_181()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_182()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_183()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_184()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_185()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_186()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_187()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_188()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_189()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_190()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_191()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_192()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_193()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_194()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_195()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_196()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_197()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_198()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_199()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_200()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_201()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_202()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_203()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_204()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_205()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_206()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_207()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_208()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_209()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_210()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_211()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_212()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_213()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_214()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_215()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_216()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_217()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_218()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_219()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_220()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_221()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_222()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_223()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_224()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_225()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_226()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_227()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_228()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_229()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_230()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_231()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_232()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_233()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_234()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_235()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_236()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_237()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_238()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_239()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_240()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_241()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_242()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_243()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_244()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_245()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_246()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_247()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_248()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_249()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_250()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_251()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_252()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_253()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_254()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_255()\ +{\ + /* mod */ \ + __asm("vpsrlq $0x4, %" _MUL_IN1 ", %" _MUL_TMP1);\ + __asm("vpsrlq $0x4, %" _MUL_IN2 ", %" _MUL_TMP2);\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_TMP2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_LOW ", %" _MUL_TMP3);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_LOW ", %" _LT_LOW);\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN1 ", %" _MUL_TMP1); /* 32x 0x0x */\ + __asm("vpand %" _0F_MASK ", %" _MUL_IN2 ", %" _MUL_TMP2); /* 32x 0x0x */\ + __asm("vpshufb %" _MUL_TMP1 ", %" _LT_UP ", %" _MUL_TMP1);\ + __asm("vpshufb %" _MUL_TMP2 ", %" _LT_UP ", %" _MUL_TMP2);\ + __asm("vpxor %" _MUL_TMP1 ",%" _MUL_TMP3 ", %" _MUL_TMP3);\ + __asm("vpxor %" _MUL_TMP2 ",%" _LT_LOW ", %" _LT_LOW);\ + \ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 1*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 2*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 3*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 4*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 5*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 6*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* r ^= a << 7*/\ + __asm("vpaddb %" _MUL_IN1 ",%" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("vpaddb %" _MUL_IN2 ",%" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("vpxor %" _MUL_IN1 ",%" _MUL_TMP3 ",%" _MUL_TMP3);\ + __asm("vpxor %" _MUL_IN2 ",%" _LT_LOW ",%" _LT_LOW);\ + /* store */ \ + __asm("vmovdqa %" _MUL_TMP3 ", %" _MUL_IN1);\ + __asm("vmovdqa %" _LT_LOW ", %" _MUL_IN2);\ +} + +static void mul_0(void){ MUL_MLOOKUP_x2_0(); } +static void mul_1(void){ } +static void mul_2(void){ MUL_MLOOKUP_x2_2(); } +static void mul_3(void){ SETUP(3); MUL_MLOOKUP_x2_3(); } +static void mul_4(void){ SETUP(4); MUL_MLOOKUP_x2_4(); } +static void mul_5(void){ SETUP(5); MUL_MLOOKUP_x2_5(); } +static void mul_6(void){ SETUP(6); MUL_MLOOKUP_x2_6(); } +static void mul_7(void){ SETUP(7); MUL_MLOOKUP_x2_7(); } +static void mul_8(void){ SETUP(8); MUL_MLOOKUP_x2_8(); } +static void mul_9(void){ SETUP(9); MUL_MLOOKUP_x2_9(); } +static void mul_10(void){ SETUP(10); MUL_MLOOKUP_x2_10(); } +static void mul_11(void){ SETUP(11); MUL_MLOOKUP_x2_11(); } +static void mul_12(void){ SETUP(12); MUL_MLOOKUP_x2_12(); } +static void mul_13(void){ SETUP(13); MUL_MLOOKUP_x2_13(); } +static void mul_14(void){ SETUP(14); MUL_MLOOKUP_x2_14(); } +static void mul_15(void){ SETUP(15); MUL_MLOOKUP_x2_15(); } +static void mul_16(void){ SETUP(16); MUL_MLOOKUP_x2_16(); } +static void mul_17(void){ SETUP(17); MUL_MLOOKUP_x2_17(); } +static void mul_18(void){ SETUP(18); MUL_MLOOKUP_x2_18(); } +static void mul_19(void){ SETUP(19); MUL_MLOOKUP_x2_19(); } +static void mul_20(void){ SETUP(20); MUL_MLOOKUP_x2_20(); } +static void mul_21(void){ SETUP(21); MUL_MLOOKUP_x2_21(); } +static void mul_22(void){ SETUP(22); MUL_MLOOKUP_x2_22(); } +static void mul_23(void){ SETUP(23); MUL_MLOOKUP_x2_23(); } +static void mul_24(void){ SETUP(24); MUL_MLOOKUP_x2_24(); } +static void mul_25(void){ SETUP(25); MUL_MLOOKUP_x2_25(); } +static void mul_26(void){ SETUP(26); MUL_MLOOKUP_x2_26(); } +static void mul_27(void){ SETUP(27); MUL_MLOOKUP_x2_27(); } +static void mul_28(void){ SETUP(28); MUL_MLOOKUP_x2_28(); } +static void mul_29(void){ SETUP(29); MUL_MLOOKUP_x2_29(); } +static void mul_30(void){ SETUP(30); MUL_MLOOKUP_x2_30(); } +static void mul_31(void){ SETUP(31); MUL_MLOOKUP_x2_31(); } +static void mul_32(void){ SETUP(32); MUL_MLOOKUP_x2_32(); } +static void mul_33(void){ SETUP(33); MUL_MLOOKUP_x2_33(); } +static void mul_34(void){ SETUP(34); MUL_MLOOKUP_x2_34(); } +static void mul_35(void){ SETUP(35); MUL_MLOOKUP_x2_35(); } +static void mul_36(void){ SETUP(36); MUL_MLOOKUP_x2_36(); } +static void mul_37(void){ SETUP(37); MUL_MLOOKUP_x2_37(); } +static void mul_38(void){ SETUP(38); MUL_MLOOKUP_x2_38(); } +static void mul_39(void){ SETUP(39); MUL_MLOOKUP_x2_39(); } +static void mul_40(void){ SETUP(40); MUL_MLOOKUP_x2_40(); } +static void mul_41(void){ SETUP(41); MUL_MLOOKUP_x2_41(); } +static void mul_42(void){ SETUP(42); MUL_MLOOKUP_x2_42(); } +static void mul_43(void){ SETUP(43); MUL_MLOOKUP_x2_43(); } +static void mul_44(void){ SETUP(44); MUL_MLOOKUP_x2_44(); } +static void mul_45(void){ SETUP(45); MUL_MLOOKUP_x2_45(); } +static void mul_46(void){ SETUP(46); MUL_MLOOKUP_x2_46(); } +static void mul_47(void){ SETUP(47); MUL_MLOOKUP_x2_47(); } +static void mul_48(void){ SETUP(48); MUL_MLOOKUP_x2_48(); } +static void mul_49(void){ SETUP(49); MUL_MLOOKUP_x2_49(); } +static void mul_50(void){ SETUP(50); MUL_MLOOKUP_x2_50(); } +static void mul_51(void){ SETUP(51); MUL_MLOOKUP_x2_51(); } +static void mul_52(void){ SETUP(52); MUL_MLOOKUP_x2_52(); } +static void mul_53(void){ SETUP(53); MUL_MLOOKUP_x2_53(); } +static void mul_54(void){ SETUP(54); MUL_MLOOKUP_x2_54(); } +static void mul_55(void){ SETUP(55); MUL_MLOOKUP_x2_55(); } +static void mul_56(void){ SETUP(56); MUL_MLOOKUP_x2_56(); } +static void mul_57(void){ SETUP(57); MUL_MLOOKUP_x2_57(); } +static void mul_58(void){ SETUP(58); MUL_MLOOKUP_x2_58(); } +static void mul_59(void){ SETUP(59); MUL_MLOOKUP_x2_59(); } +static void mul_60(void){ SETUP(60); MUL_MLOOKUP_x2_60(); } +static void mul_61(void){ SETUP(61); MUL_MLOOKUP_x2_61(); } +static void mul_62(void){ SETUP(62); MUL_MLOOKUP_x2_62(); } +static void mul_63(void){ SETUP(63); MUL_MLOOKUP_x2_63(); } +static void mul_64(void){ SETUP(64); MUL_MLOOKUP_x2_64(); } +static void mul_65(void){ SETUP(65); MUL_MLOOKUP_x2_65(); } +static void mul_66(void){ SETUP(66); MUL_MLOOKUP_x2_66(); } +static void mul_67(void){ SETUP(67); MUL_MLOOKUP_x2_67(); } +static void mul_68(void){ SETUP(68); MUL_MLOOKUP_x2_68(); } +static void mul_69(void){ SETUP(69); MUL_MLOOKUP_x2_69(); } +static void mul_70(void){ SETUP(70); MUL_MLOOKUP_x2_70(); } +static void mul_71(void){ SETUP(71); MUL_MLOOKUP_x2_71(); } +static void mul_72(void){ SETUP(72); MUL_MLOOKUP_x2_72(); } +static void mul_73(void){ SETUP(73); MUL_MLOOKUP_x2_73(); } +static void mul_74(void){ SETUP(74); MUL_MLOOKUP_x2_74(); } +static void mul_75(void){ SETUP(75); MUL_MLOOKUP_x2_75(); } +static void mul_76(void){ SETUP(76); MUL_MLOOKUP_x2_76(); } +static void mul_77(void){ SETUP(77); MUL_MLOOKUP_x2_77(); } +static void mul_78(void){ SETUP(78); MUL_MLOOKUP_x2_78(); } +static void mul_79(void){ SETUP(79); MUL_MLOOKUP_x2_79(); } +static void mul_80(void){ SETUP(80); MUL_MLOOKUP_x2_80(); } +static void mul_81(void){ SETUP(81); MUL_MLOOKUP_x2_81(); } +static void mul_82(void){ SETUP(82); MUL_MLOOKUP_x2_82(); } +static void mul_83(void){ SETUP(83); MUL_MLOOKUP_x2_83(); } +static void mul_84(void){ SETUP(84); MUL_MLOOKUP_x2_84(); } +static void mul_85(void){ SETUP(85); MUL_MLOOKUP_x2_85(); } +static void mul_86(void){ SETUP(86); MUL_MLOOKUP_x2_86(); } +static void mul_87(void){ SETUP(87); MUL_MLOOKUP_x2_87(); } +static void mul_88(void){ SETUP(88); MUL_MLOOKUP_x2_88(); } +static void mul_89(void){ SETUP(89); MUL_MLOOKUP_x2_89(); } +static void mul_90(void){ SETUP(90); MUL_MLOOKUP_x2_90(); } +static void mul_91(void){ SETUP(91); MUL_MLOOKUP_x2_91(); } +static void mul_92(void){ SETUP(92); MUL_MLOOKUP_x2_92(); } +static void mul_93(void){ SETUP(93); MUL_MLOOKUP_x2_93(); } +static void mul_94(void){ SETUP(94); MUL_MLOOKUP_x2_94(); } +static void mul_95(void){ SETUP(95); MUL_MLOOKUP_x2_95(); } +static void mul_96(void){ SETUP(96); MUL_MLOOKUP_x2_96(); } +static void mul_97(void){ SETUP(97); MUL_MLOOKUP_x2_97(); } +static void mul_98(void){ SETUP(98); MUL_MLOOKUP_x2_98(); } +static void mul_99(void){ SETUP(99); MUL_MLOOKUP_x2_99(); } +static void mul_100(void){ SETUP(100); MUL_MLOOKUP_x2_100(); } +static void mul_101(void){ SETUP(101); MUL_MLOOKUP_x2_101(); } +static void mul_102(void){ SETUP(102); MUL_MLOOKUP_x2_102(); } +static void mul_103(void){ SETUP(103); MUL_MLOOKUP_x2_103(); } +static void mul_104(void){ SETUP(104); MUL_MLOOKUP_x2_104(); } +static void mul_105(void){ SETUP(105); MUL_MLOOKUP_x2_105(); } +static void mul_106(void){ SETUP(106); MUL_MLOOKUP_x2_106(); } +static void mul_107(void){ SETUP(107); MUL_MLOOKUP_x2_107(); } +static void mul_108(void){ SETUP(108); MUL_MLOOKUP_x2_108(); } +static void mul_109(void){ SETUP(109); MUL_MLOOKUP_x2_109(); } +static void mul_110(void){ SETUP(110); MUL_MLOOKUP_x2_110(); } +static void mul_111(void){ SETUP(111); MUL_MLOOKUP_x2_111(); } +static void mul_112(void){ SETUP(112); MUL_MLOOKUP_x2_112(); } +static void mul_113(void){ SETUP(113); MUL_MLOOKUP_x2_113(); } +static void mul_114(void){ SETUP(114); MUL_MLOOKUP_x2_114(); } +static void mul_115(void){ SETUP(115); MUL_MLOOKUP_x2_115(); } +static void mul_116(void){ SETUP(116); MUL_MLOOKUP_x2_116(); } +static void mul_117(void){ SETUP(117); MUL_MLOOKUP_x2_117(); } +static void mul_118(void){ SETUP(118); MUL_MLOOKUP_x2_118(); } +static void mul_119(void){ SETUP(119); MUL_MLOOKUP_x2_119(); } +static void mul_120(void){ SETUP(120); MUL_MLOOKUP_x2_120(); } +static void mul_121(void){ SETUP(121); MUL_MLOOKUP_x2_121(); } +static void mul_122(void){ SETUP(122); MUL_MLOOKUP_x2_122(); } +static void mul_123(void){ SETUP(123); MUL_MLOOKUP_x2_123(); } +static void mul_124(void){ SETUP(124); MUL_MLOOKUP_x2_124(); } +static void mul_125(void){ SETUP(125); MUL_MLOOKUP_x2_125(); } +static void mul_126(void){ SETUP(126); MUL_MLOOKUP_x2_126(); } +static void mul_127(void){ SETUP(127); MUL_MLOOKUP_x2_127(); } +static void mul_128(void){ SETUP(128); MUL_MLOOKUP_x2_128(); } +static void mul_129(void){ SETUP(129); MUL_MLOOKUP_x2_129(); } +static void mul_130(void){ SETUP(130); MUL_MLOOKUP_x2_130(); } +static void mul_131(void){ SETUP(131); MUL_MLOOKUP_x2_131(); } +static void mul_132(void){ SETUP(132); MUL_MLOOKUP_x2_132(); } +static void mul_133(void){ SETUP(133); MUL_MLOOKUP_x2_133(); } +static void mul_134(void){ SETUP(134); MUL_MLOOKUP_x2_134(); } +static void mul_135(void){ SETUP(135); MUL_MLOOKUP_x2_135(); } +static void mul_136(void){ SETUP(136); MUL_MLOOKUP_x2_136(); } +static void mul_137(void){ SETUP(137); MUL_MLOOKUP_x2_137(); } +static void mul_138(void){ SETUP(138); MUL_MLOOKUP_x2_138(); } +static void mul_139(void){ SETUP(139); MUL_MLOOKUP_x2_139(); } +static void mul_140(void){ SETUP(140); MUL_MLOOKUP_x2_140(); } +static void mul_141(void){ SETUP(141); MUL_MLOOKUP_x2_141(); } +static void mul_142(void){ SETUP(142); MUL_MLOOKUP_x2_142(); } +static void mul_143(void){ SETUP(143); MUL_MLOOKUP_x2_143(); } +static void mul_144(void){ SETUP(144); MUL_MLOOKUP_x2_144(); } +static void mul_145(void){ SETUP(145); MUL_MLOOKUP_x2_145(); } +static void mul_146(void){ SETUP(146); MUL_MLOOKUP_x2_146(); } +static void mul_147(void){ SETUP(147); MUL_MLOOKUP_x2_147(); } +static void mul_148(void){ SETUP(148); MUL_MLOOKUP_x2_148(); } +static void mul_149(void){ SETUP(149); MUL_MLOOKUP_x2_149(); } +static void mul_150(void){ SETUP(150); MUL_MLOOKUP_x2_150(); } +static void mul_151(void){ SETUP(151); MUL_MLOOKUP_x2_151(); } +static void mul_152(void){ SETUP(152); MUL_MLOOKUP_x2_152(); } +static void mul_153(void){ SETUP(153); MUL_MLOOKUP_x2_153(); } +static void mul_154(void){ SETUP(154); MUL_MLOOKUP_x2_154(); } +static void mul_155(void){ SETUP(155); MUL_MLOOKUP_x2_155(); } +static void mul_156(void){ SETUP(156); MUL_MLOOKUP_x2_156(); } +static void mul_157(void){ SETUP(157); MUL_MLOOKUP_x2_157(); } +static void mul_158(void){ SETUP(158); MUL_MLOOKUP_x2_158(); } +static void mul_159(void){ SETUP(159); MUL_MLOOKUP_x2_159(); } +static void mul_160(void){ SETUP(160); MUL_MLOOKUP_x2_160(); } +static void mul_161(void){ SETUP(161); MUL_MLOOKUP_x2_161(); } +static void mul_162(void){ SETUP(162); MUL_MLOOKUP_x2_162(); } +static void mul_163(void){ SETUP(163); MUL_MLOOKUP_x2_163(); } +static void mul_164(void){ SETUP(164); MUL_MLOOKUP_x2_164(); } +static void mul_165(void){ SETUP(165); MUL_MLOOKUP_x2_165(); } +static void mul_166(void){ SETUP(166); MUL_MLOOKUP_x2_166(); } +static void mul_167(void){ SETUP(167); MUL_MLOOKUP_x2_167(); } +static void mul_168(void){ SETUP(168); MUL_MLOOKUP_x2_168(); } +static void mul_169(void){ SETUP(169); MUL_MLOOKUP_x2_169(); } +static void mul_170(void){ SETUP(170); MUL_MLOOKUP_x2_170(); } +static void mul_171(void){ SETUP(171); MUL_MLOOKUP_x2_171(); } +static void mul_172(void){ SETUP(172); MUL_MLOOKUP_x2_172(); } +static void mul_173(void){ SETUP(173); MUL_MLOOKUP_x2_173(); } +static void mul_174(void){ SETUP(174); MUL_MLOOKUP_x2_174(); } +static void mul_175(void){ SETUP(175); MUL_MLOOKUP_x2_175(); } +static void mul_176(void){ SETUP(176); MUL_MLOOKUP_x2_176(); } +static void mul_177(void){ SETUP(177); MUL_MLOOKUP_x2_177(); } +static void mul_178(void){ SETUP(178); MUL_MLOOKUP_x2_178(); } +static void mul_179(void){ SETUP(179); MUL_MLOOKUP_x2_179(); } +static void mul_180(void){ SETUP(180); MUL_MLOOKUP_x2_180(); } +static void mul_181(void){ SETUP(181); MUL_MLOOKUP_x2_181(); } +static void mul_182(void){ SETUP(182); MUL_MLOOKUP_x2_182(); } +static void mul_183(void){ SETUP(183); MUL_MLOOKUP_x2_183(); } +static void mul_184(void){ SETUP(184); MUL_MLOOKUP_x2_184(); } +static void mul_185(void){ SETUP(185); MUL_MLOOKUP_x2_185(); } +static void mul_186(void){ SETUP(186); MUL_MLOOKUP_x2_186(); } +static void mul_187(void){ SETUP(187); MUL_MLOOKUP_x2_187(); } +static void mul_188(void){ SETUP(188); MUL_MLOOKUP_x2_188(); } +static void mul_189(void){ SETUP(189); MUL_MLOOKUP_x2_189(); } +static void mul_190(void){ SETUP(190); MUL_MLOOKUP_x2_190(); } +static void mul_191(void){ SETUP(191); MUL_MLOOKUP_x2_191(); } +static void mul_192(void){ SETUP(192); MUL_MLOOKUP_x2_192(); } +static void mul_193(void){ SETUP(193); MUL_MLOOKUP_x2_193(); } +static void mul_194(void){ SETUP(194); MUL_MLOOKUP_x2_194(); } +static void mul_195(void){ SETUP(195); MUL_MLOOKUP_x2_195(); } +static void mul_196(void){ SETUP(196); MUL_MLOOKUP_x2_196(); } +static void mul_197(void){ SETUP(197); MUL_MLOOKUP_x2_197(); } +static void mul_198(void){ SETUP(198); MUL_MLOOKUP_x2_198(); } +static void mul_199(void){ SETUP(199); MUL_MLOOKUP_x2_199(); } +static void mul_200(void){ SETUP(200); MUL_MLOOKUP_x2_200(); } +static void mul_201(void){ SETUP(201); MUL_MLOOKUP_x2_201(); } +static void mul_202(void){ SETUP(202); MUL_MLOOKUP_x2_202(); } +static void mul_203(void){ SETUP(203); MUL_MLOOKUP_x2_203(); } +static void mul_204(void){ SETUP(204); MUL_MLOOKUP_x2_204(); } +static void mul_205(void){ SETUP(205); MUL_MLOOKUP_x2_205(); } +static void mul_206(void){ SETUP(206); MUL_MLOOKUP_x2_206(); } +static void mul_207(void){ SETUP(207); MUL_MLOOKUP_x2_207(); } +static void mul_208(void){ SETUP(208); MUL_MLOOKUP_x2_208(); } +static void mul_209(void){ SETUP(209); MUL_MLOOKUP_x2_209(); } +static void mul_210(void){ SETUP(210); MUL_MLOOKUP_x2_210(); } +static void mul_211(void){ SETUP(211); MUL_MLOOKUP_x2_211(); } +static void mul_212(void){ SETUP(212); MUL_MLOOKUP_x2_212(); } +static void mul_213(void){ SETUP(213); MUL_MLOOKUP_x2_213(); } +static void mul_214(void){ SETUP(214); MUL_MLOOKUP_x2_214(); } +static void mul_215(void){ SETUP(215); MUL_MLOOKUP_x2_215(); } +static void mul_216(void){ SETUP(216); MUL_MLOOKUP_x2_216(); } +static void mul_217(void){ SETUP(217); MUL_MLOOKUP_x2_217(); } +static void mul_218(void){ SETUP(218); MUL_MLOOKUP_x2_218(); } +static void mul_219(void){ SETUP(219); MUL_MLOOKUP_x2_219(); } +static void mul_220(void){ SETUP(220); MUL_MLOOKUP_x2_220(); } +static void mul_221(void){ SETUP(221); MUL_MLOOKUP_x2_221(); } +static void mul_222(void){ SETUP(222); MUL_MLOOKUP_x2_222(); } +static void mul_223(void){ SETUP(223); MUL_MLOOKUP_x2_223(); } +static void mul_224(void){ SETUP(224); MUL_MLOOKUP_x2_224(); } +static void mul_225(void){ SETUP(225); MUL_MLOOKUP_x2_225(); } +static void mul_226(void){ SETUP(226); MUL_MLOOKUP_x2_226(); } +static void mul_227(void){ SETUP(227); MUL_MLOOKUP_x2_227(); } +static void mul_228(void){ SETUP(228); MUL_MLOOKUP_x2_228(); } +static void mul_229(void){ SETUP(229); MUL_MLOOKUP_x2_229(); } +static void mul_230(void){ SETUP(230); MUL_MLOOKUP_x2_230(); } +static void mul_231(void){ SETUP(231); MUL_MLOOKUP_x2_231(); } +static void mul_232(void){ SETUP(232); MUL_MLOOKUP_x2_232(); } +static void mul_233(void){ SETUP(233); MUL_MLOOKUP_x2_233(); } +static void mul_234(void){ SETUP(234); MUL_MLOOKUP_x2_234(); } +static void mul_235(void){ SETUP(235); MUL_MLOOKUP_x2_235(); } +static void mul_236(void){ SETUP(236); MUL_MLOOKUP_x2_236(); } +static void mul_237(void){ SETUP(237); MUL_MLOOKUP_x2_237(); } +static void mul_238(void){ SETUP(238); MUL_MLOOKUP_x2_238(); } +static void mul_239(void){ SETUP(239); MUL_MLOOKUP_x2_239(); } +static void mul_240(void){ SETUP(240); MUL_MLOOKUP_x2_240(); } +static void mul_241(void){ SETUP(241); MUL_MLOOKUP_x2_241(); } +static void mul_242(void){ SETUP(242); MUL_MLOOKUP_x2_242(); } +static void mul_243(void){ SETUP(243); MUL_MLOOKUP_x2_243(); } +static void mul_244(void){ SETUP(244); MUL_MLOOKUP_x2_244(); } +static void mul_245(void){ SETUP(245); MUL_MLOOKUP_x2_245(); } +static void mul_246(void){ SETUP(246); MUL_MLOOKUP_x2_246(); } +static void mul_247(void){ SETUP(247); MUL_MLOOKUP_x2_247(); } +static void mul_248(void){ SETUP(248); MUL_MLOOKUP_x2_248(); } +static void mul_249(void){ SETUP(249); MUL_MLOOKUP_x2_249(); } +static void mul_250(void){ SETUP(250); MUL_MLOOKUP_x2_250(); } +static void mul_251(void){ SETUP(251); MUL_MLOOKUP_x2_251(); } +static void mul_252(void){ SETUP(252); MUL_MLOOKUP_x2_252(); } +static void mul_253(void){ SETUP(253); MUL_MLOOKUP_x2_253(); } +static void mul_254(void){ SETUP(254); MUL_MLOOKUP_x2_254(); } +static void mul_255(void){ SETUP(255); MUL_MLOOKUP_x2_255(); } + +typedef void (*mul_fn_ptr_t)(void); + +static const mul_fn_ptr_t __attribute__((aligned(256))) +gf_mul_fns[256] = { + mul_0, mul_1, mul_2, mul_3, mul_4, mul_5, mul_6, mul_7, + mul_8, mul_9, mul_10, mul_11, mul_12, mul_13, mul_14, mul_15, + mul_16, mul_17, mul_18, mul_19, mul_20, mul_21, mul_22, mul_23, + mul_24, mul_25, mul_26, mul_27, mul_28, mul_29, mul_30, mul_31, + mul_32, mul_33, mul_34, mul_35, mul_36, mul_37, mul_38, mul_39, + mul_40, mul_41, mul_42, mul_43, mul_44, mul_45, mul_46, mul_47, + mul_48, mul_49, mul_50, mul_51, mul_52, mul_53, mul_54, mul_55, + mul_56, mul_57, mul_58, mul_59, mul_60, mul_61, mul_62, mul_63, + mul_64, mul_65, mul_66, mul_67, mul_68, mul_69, mul_70, mul_71, + mul_72, mul_73, mul_74, mul_75, mul_76, mul_77, mul_78, mul_79, + mul_80, mul_81, mul_82, mul_83, mul_84, mul_85, mul_86, mul_87, + mul_88, mul_89, mul_90, mul_91, mul_92, mul_93, mul_94, mul_95, + mul_96, mul_97, mul_98, mul_99, mul_100, mul_101, mul_102, mul_103, + mul_104, mul_105, mul_106, mul_107, mul_108, mul_109, mul_110, mul_111, + mul_112, mul_113, mul_114, mul_115, mul_116, mul_117, mul_118, mul_119, + mul_120, mul_121, mul_122, mul_123, mul_124, mul_125, mul_126, mul_127, + mul_128, mul_129, mul_130, mul_131, mul_132, mul_133, mul_134, mul_135, + mul_136, mul_137, mul_138, mul_139, mul_140, mul_141, mul_142, mul_143, + mul_144, mul_145, mul_146, mul_147, mul_148, mul_149, mul_150, mul_151, + mul_152, mul_153, mul_154, mul_155, mul_156, mul_157, mul_158, mul_159, + mul_160, mul_161, mul_162, mul_163, mul_164, mul_165, mul_166, mul_167, + mul_168, mul_169, mul_170, mul_171, mul_172, mul_173, mul_174, mul_175, + mul_176, mul_177, mul_178, mul_179, mul_180, mul_181, mul_182, mul_183, + mul_184, mul_185, mul_186, mul_187, mul_188, mul_189, mul_190, mul_191, + mul_192, mul_193, mul_194, mul_195, mul_196, mul_197, mul_198, mul_199, + mul_200, mul_201, mul_202, mul_203, mul_204, mul_205, mul_206, mul_207, + mul_208, mul_209, mul_210, mul_211, mul_212, mul_213, mul_214, mul_215, + mul_216, mul_217, mul_218, mul_219, mul_220, mul_221, mul_222, mul_223, + mul_224, mul_225, mul_226, mul_227, mul_228, mul_229, mul_230, mul_231, + mul_232, mul_233, mul_234, mul_235, mul_236, mul_237, mul_238, mul_239, + mul_240, mul_241, mul_242, mul_243, mul_244, mul_245, mul_246, mul_247, + mul_248, mul_249, mul_250, mul_251, mul_252, mul_253, mul_254, mul_255, + }; + + + +#endif /*_VDEV_RAIDZ_MATH_AVX2_MUL_H */ diff --git a/module/zfs/vdev_raidz_math_impl.h b/module/zfs/vdev_raidz_math_impl.h new file mode 100644 index 000000000000..2dbd1f2925a7 --- /dev/null +++ b/module/zfs/vdev_raidz_math_impl.h @@ -0,0 +1,523 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (C) 2016 Gvozden Nešković. All rights reserved. + */ + +#ifndef _VDEV_RAIDZ_MATH_IMPL_H +#define _VDEV_RAIDZ_MATH_IMPL_H + +#include + +struct elem_t; +struct elem_mul_pad_t; + +static inline void +raidz_flush_data(void); + +static inline size_t +gen_p_block(elem_t *p, + const elem_t **data, + const size_t nd, + const size_t off); + +static inline size_t +gen_pq_block(elem_t *p, elem_t *q, + const elem_t **data, + const size_t nd, const size_t nld, + const size_t off); + +static inline size_t +gen_pqr_block(elem_t *p, elem_t *q, elem_t *r, + const elem_t **data, + const size_t nd, const size_t nld, + const size_t off); + +static inline size_t +rec_p_block(elem_t *p_col, elem_t **d_cols, + const size_t xidx, + const size_t nd, + const size_t off); + +static inline size_t +rec_q_block(elem_t *q_col, elem_t **d_cols, + const size_t xidx, + const int x_mul, + const size_t nd, const size_t nld, + const size_t off); + +static inline size_t +rec_r_block(elem_t *r_col, elem_t **d_cols, + const size_t xidx, + const int x_mul, + const size_t nd, const size_t nld, + const size_t off); + +static inline size_t +rec_pq_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t xsize, const size_t ysize, + const int a_mul, const int b_mul, + const size_t nd, const size_t nld, + const size_t off); + +static inline size_t +rec_pr_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t xsize, const size_t ysize, + const int a_mul, const int b_mul, + const size_t nd, const size_t nld, + const size_t off); + +static inline __attribute__((always_inline)) size_t +rec_qr_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t xsize, const size_t ysize, + const int xq_mul, const int x_mul, + const int yq_mul, const int y_mul, + const size_t nd, const size_t nld, + const size_t off); + +static inline __attribute__((always_inline)) size_t +rec_pqr_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t z, + const size_t xsize, const size_t ysize, + const size_t zsize, + const int xp_mul, const int xq_mul, + const int xr_mul, + const int yp_mul, const int yq_mul, + const int upd_q_mul, + const size_t nd, const size_t nld, + const size_t off); + +static inline void +raidz_flush_data(void); + +static inline size_t +raidz_col_size(const size_t idx, const size_t nbigdatacols, + const size_t codesize, const size_t ldatasize) +{ + if (idx < nbigdatacols) { + return (codesize); + } + return (ldatasize); +} + +static inline void +raidz_generate_p_impl(void **codes, void **data, + const size_t ndatacols, const size_t nbigdatacols, + const size_t codesize, const size_t ldatasize) +{ + const size_t siter = ldatasize / sizeof (elem_t); + const size_t biter = codesize / sizeof (elem_t); + size_t i; + + elem_t *p_col = (elem_t *) codes[0]; + const elem_t **d_cols = (const elem_t **) data; + + for (i = 0; i < siter; ) { + i += gen_p_block(p_col, d_cols, ndatacols, i); + } + for (; i < biter; ) { + i += gen_p_block(p_col, d_cols, nbigdatacols, i); + } + + raidz_flush_data(); +} + +static inline void +raidz_generate_pq_impl(void **codes, void **data, + const size_t ndatacols, const size_t nbigdatacols, + const size_t codesize, const size_t ldatasize) +{ + const size_t siter = ldatasize / sizeof (elem_t); + const size_t biter = codesize / sizeof (elem_t); + size_t i; + + elem_t *p_col = (elem_t *) codes[0]; + elem_t *q_col = (elem_t *) codes[1]; + const elem_t **d_cols = (const elem_t **) data; + + for (i = 0; i < siter; ) { + i += gen_pq_block(p_col, q_col, d_cols, + ndatacols, ndatacols, i); + } + for (; i < biter; ) { + i += gen_pq_block(p_col, q_col, d_cols, + ndatacols, nbigdatacols, i); + } + raidz_flush_data(); +} + +static inline void +raidz_generate_pqr_impl(void **codes, void **data, + const size_t ndatacols, const size_t nbigdatacols, + const size_t codesize, const size_t ldatasize) +{ + const size_t siter = ldatasize / sizeof (elem_t); + const size_t biter = codesize / sizeof (elem_t); + size_t i; + + elem_t *p_col = (elem_t *) codes[0]; + elem_t *q_col = (elem_t *) codes[1]; + elem_t *r_col = (elem_t *) codes[2]; + const elem_t **d_cols = (const elem_t **) data; + + for (i = 0; i < siter; ) { + i += gen_pqr_block(p_col, q_col, r_col, d_cols, + ndatacols, ndatacols, i); + } + for (; i < biter; ) { + i += gen_pqr_block(p_col, q_col, r_col, d_cols, + ndatacols, nbigdatacols, i); + } + + raidz_flush_data(); +} + +static inline int +raidz_reconstruct_p_impl(void **codes, void **data, + const size_t ndatacols, const size_t nbigdatacols, + const size_t codesize, const size_t ldatasize, + const size_t *tgtidx) +{ + const size_t xidx = tgtidx[0]; + const size_t xsize = raidz_col_size(xidx, nbigdatacols, + codesize, ldatasize); + + elem_t *const p_col = (elem_t *) codes[0]; + elem_t **const d_cols = (elem_t **) data; + + const size_t siter = ldatasize / sizeof (elem_t); + const size_t biter = xsize / sizeof (elem_t); + size_t i; + + for (i = 0; i < siter; ) { + i += rec_p_block(p_col, d_cols, xidx, ndatacols, i); + } + for (; i < biter; ) { + i += rec_p_block(p_col, d_cols, xidx, nbigdatacols, i); + } + raidz_flush_data(); + + return (1 << 0); +} + +static inline int +raidz_reconstruct_q_impl(void **codes, void **data, + const size_t ndatacols, const size_t nbigdatacols, + const size_t codesize, const size_t ldatasize, + const size_t *tgtidx) +{ + const size_t xidx = tgtidx[0]; + const size_t xsize = raidz_col_size(xidx, nbigdatacols, + codesize, ldatasize); + + elem_t *const q_col = (elem_t *) codes[1]; + elem_t **const d_cols = (elem_t **) data; + + const size_t siter = ldatasize / sizeof (elem_t); + const size_t biter = xsize / sizeof (elem_t); + + const int tgtmul = fix_mul_exponent(255 - (ndatacols - xidx - 1)); + size_t i; + + for (i = 0; i < siter; ) { + i += rec_q_block(q_col, d_cols, xidx, tgtmul, + ndatacols, ndatacols, i); + } + for (; i < biter; ) { + i += rec_q_block(q_col, d_cols, xidx, tgtmul, + ndatacols, nbigdatacols, i); + } + + raidz_flush_data(); + + return (1 << 1); +} + +static inline int +raidz_reconstruct_r_impl(void **codes, void **data, + const size_t ndatacols, const size_t nbigdatacols, + const size_t codesize, const size_t ldatasize, + const size_t *tgtidx) +{ + const size_t xidx = tgtidx[0]; + const size_t xsize = raidz_col_size(xidx, nbigdatacols, + codesize, ldatasize); + + elem_t *const r_col = (elem_t *) codes[2]; + elem_t **const d_cols = (elem_t **) data; + + const size_t siter = ldatasize / sizeof (elem_t); + const size_t biter = (xsize / sizeof (elem_t)); + + const int tgtmul = fix_mul_exponent(255 - 2 * (ndatacols - xidx - 1)); + + size_t i; + + for (i = 0; i < siter; ) { + i += rec_r_block(r_col, d_cols, xidx, tgtmul, + ndatacols, ndatacols, i); + } + for (; i < biter; ) { + i += rec_r_block(r_col, d_cols, xidx, tgtmul, + ndatacols, nbigdatacols, i); + } + + raidz_flush_data(); + + return (1 << 2); +} + +static inline int +raidz_reconstruct_pq_impl(void **codes, void **data, + const size_t ndatacols, const size_t nbigdatacols, + const size_t codesize, const size_t ldatasize, + const size_t *tgtidx) +{ + const size_t xidx = tgtidx[0]; + const size_t yidx = tgtidx[1]; + const size_t xsize = raidz_col_size(xidx, nbigdatacols, + codesize, ldatasize); + const size_t ysize = raidz_col_size(yidx, nbigdatacols, + codesize, ldatasize); + + elem_t **const d_cols = (elem_t **) data; + const elem_t **const c_cols = (const elem_t **) codes; + + const size_t siter = ldatasize / sizeof (elem_t); + const size_t biter = xsize / sizeof (elem_t); + + int tmp, aexp, bexp, a, b; + size_t i; + + a = vdev_raidz_pow2[255 + xidx - yidx]; + b = vdev_raidz_pow2[255 - (ndatacols - 1 - xidx)]; + tmp = 255 - vdev_raidz_log2[a ^ 0x01]; + + aexp = fix_mul_exponent(vdev_raidz_log2[vdev_raidz_exp2(a, tmp)]); + bexp = fix_mul_exponent(vdev_raidz_log2[vdev_raidz_exp2(b, tmp)]); + + for (i = 0; i < siter; ) { + i += rec_pq_block(c_cols, d_cols, + xidx, yidx, + xsize, xsize, + aexp, bexp, + ndatacols, ndatacols, i); + } + + for (; i < biter; ) { + i += rec_pq_block(c_cols, d_cols, + xidx, yidx, + xsize, ysize, + aexp, bexp, + ndatacols, nbigdatacols, i); + } + + raidz_flush_data(); + + return ((1 << 0) | (1 << 1)); +} + +static inline int +raidz_reconstruct_pr_impl(void **codes, void **data, + const size_t ndatacols, const size_t nbigdatacols, + const size_t codesize, const size_t ldatasize, + const size_t *tgtidx) +{ + const size_t xidx = tgtidx[0]; + const size_t yidx = tgtidx[1]; + const size_t xsize = raidz_col_size(xidx, nbigdatacols, + codesize, ldatasize); + const size_t ysize = raidz_col_size(yidx, nbigdatacols, + codesize, ldatasize); + + elem_t **const d_cols = (elem_t **) data; + const elem_t **const c_cols = (const elem_t **) codes; + + const size_t siter = ldatasize / sizeof (elem_t); + const size_t biter = xsize / sizeof (elem_t); + + int tmp, aexp, bexp, a, b; + size_t i; + + a = vdev_raidz_pow2[255 + 2 * xidx - 2 * yidx]; + b = vdev_raidz_pow2[255 - 2 * (ndatacols - 1 - xidx)]; + tmp = 255 - vdev_raidz_log2[a ^ 0x01]; + + aexp = fix_mul_exponent(vdev_raidz_log2[vdev_raidz_exp2(a, tmp)]); + bexp = fix_mul_exponent(vdev_raidz_log2[vdev_raidz_exp2(b, tmp)]); + + for (i = 0; i < siter; ) { + i += rec_pr_block(c_cols, d_cols, + xidx, yidx, + xsize, xsize, + aexp, bexp, + ndatacols, ndatacols, i); + } + for (; i < biter; ) { + i += rec_pr_block(c_cols, d_cols, + xidx, yidx, + xsize, ysize, + aexp, bexp, + ndatacols, nbigdatacols, i); + } + + raidz_flush_data(); + + return ((1 << 0) | (1 << 2)); +} + + +static inline int +raidz_reconstruct_qr_impl(void **codes, void **data, + const size_t ndatacols, const size_t nbigdatacols, + const size_t codesize, const size_t ldatasize, + const size_t *tgtidx) +{ + const size_t xidx = tgtidx[0]; + const size_t yidx = tgtidx[1]; + const size_t xsize = raidz_col_size(xidx, nbigdatacols, + codesize, ldatasize); + const size_t ysize = raidz_col_size(yidx, nbigdatacols, + codesize, ldatasize); + + elem_t **const d_cols = (elem_t **) data; + const elem_t **const c_cols = (const elem_t **) codes; + + const size_t siter = ldatasize / sizeof (elem_t); + const size_t biter = xsize / sizeof (elem_t); + size_t i; + int xqmul_exp, xmul_exp, yqmul_exp, ymul_exp, denom; + + denom = 255 - vdev_raidz_log2[ + vdev_raidz_pow2[3 * ndatacols - 3 - xidx - 2 * yidx] ^ + vdev_raidz_pow2[3 * ndatacols - 3 - 2 * xidx - yidx] + ]; + + xqmul_exp = fix_mul_exponent(ndatacols - 1 - yidx); + xmul_exp = fix_mul_exponent(ndatacols - 1 - yidx + denom); + + yqmul_exp = fix_mul_exponent(ndatacols - 1 - xidx); + ymul_exp = fix_mul_exponent(ndatacols - 1 - xidx + denom); + + for (i = 0; i < siter; ) { + i += rec_qr_block(c_cols, d_cols, xidx, yidx, + xsize, xsize, + xqmul_exp, xmul_exp, yqmul_exp, ymul_exp, + ndatacols, ndatacols, i); + } + for (; i < biter; ) { + i += rec_qr_block(c_cols, d_cols, + xidx, yidx, + xsize, ysize, + xqmul_exp, xmul_exp, yqmul_exp, ymul_exp, + ndatacols, nbigdatacols, i); + } + + raidz_flush_data(); + + return ((1 << 1) | (1 << 2)); +} + +static inline int +raidz_reconstruct_pqr_impl(void **codes, void **data, + const size_t ndatacols, const size_t nbigdatacols, + const size_t codesize, const size_t ldatasize, + const size_t *tgtidx) +{ + const size_t xidx = tgtidx[0]; + const size_t yidx = tgtidx[1]; + const size_t zidx = tgtidx[2]; + const size_t xsize = raidz_col_size(xidx, nbigdatacols, + codesize, ldatasize); + const size_t ysize = raidz_col_size(yidx, nbigdatacols, + codesize, ldatasize); + const size_t zsize = raidz_col_size(zidx, nbigdatacols, + codesize, ldatasize); + + elem_t **const d_cols = (elem_t **) data; + const elem_t **const c_cols = (const elem_t **) codes; + + const size_t siter = ldatasize / sizeof (elem_t); + const size_t biter = xsize / sizeof (elem_t); + size_t i; + + int xp_exp, xq_exp, xr_exp, yp_exp, yq_exp, yu_exp, xdenom, ydenom; + + xdenom = 255 - vdev_raidz_log2[ + vdev_raidz_pow2[3 * ndatacols - 3 - 2 * xidx - yidx] ^ + vdev_raidz_pow2[3 * ndatacols - 3 - xidx - 2 * yidx] ^ + vdev_raidz_pow2[3 * ndatacols - 3 - 2 * xidx - zidx] ^ + vdev_raidz_pow2[3 * ndatacols - 3 - xidx - 2 * zidx] ^ + vdev_raidz_pow2[3 * ndatacols - 3 - 2 * yidx - zidx] ^ + vdev_raidz_pow2[3 * ndatacols - 3 - yidx - 2 * zidx] + ]; + + xp_exp = fix_mul_exponent(vdev_raidz_log2[ + vdev_raidz_pow2[3 * ndatacols - 3 - 2 * yidx - zidx] ^ + vdev_raidz_pow2[3 * ndatacols - 3 - yidx - 2 * zidx] + ] + xdenom); + xq_exp = fix_mul_exponent(vdev_raidz_log2[ + vdev_raidz_pow2[2 * ndatacols - 2 - 2 * yidx] ^ + vdev_raidz_pow2[2 * ndatacols - 2 - 2 * zidx] + ] + xdenom); + xr_exp = fix_mul_exponent(vdev_raidz_log2[ + vdev_raidz_pow2[ndatacols - 1 - yidx] ^ + vdev_raidz_pow2[ndatacols - 1 - zidx] + ] + xdenom); + + ydenom = 255 - vdev_raidz_log2[ + vdev_raidz_pow2[ndatacols - 1 - yidx] ^ + vdev_raidz_pow2[ndatacols - 1 - zidx] + ]; + + yp_exp = fix_mul_exponent(ndatacols - 1 - zidx + ydenom); + yq_exp = fix_mul_exponent(ydenom); + yu_exp = fix_mul_exponent(ndatacols - 1 - xidx); + + + for (i = 0; i < siter; ) { + i += rec_pqr_block(c_cols, d_cols, + xidx, yidx, zidx, + xsize, xsize, xsize, + xp_exp, xq_exp, xr_exp, + yp_exp, yq_exp, yu_exp, + ndatacols, ndatacols, i); + } + for (; i < biter; ) { + i += rec_pqr_block(c_cols, d_cols, + xidx, yidx, zidx, + xsize, ysize, zsize, + xp_exp, xq_exp, xr_exp, + yp_exp, yq_exp, yu_exp, + ndatacols, nbigdatacols, i); + } + + raidz_flush_data(); + + return ((1 << 0) | (1 << 1) | (1 << 2)); +} + +#endif /* _VDEV_RAIDZ_MATH_IMPL_H */ diff --git a/module/zfs/vdev_raidz_math_scalar.c b/module/zfs/vdev_raidz_math_scalar.c new file mode 100644 index 000000000000..b979d4bf25c0 --- /dev/null +++ b/module/zfs/vdev_raidz_math_scalar.c @@ -0,0 +1,705 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (C) 2016 Gvozden Nešković. All rights reserved. + */ + +#include "vdev_raidz.h" + +/* + * Provide native cpu scalar routines. + * Support 32bit and 64bit CPUs. Check the size of unsigned long long + * to determine native register size . + */ + +#if (((~(0ULL)) >> 24) == 0xFF) +#define RAIDZ_ELEM_SIZE (4) +#elif (((~(0ULL)) >> 56) == 0xFF) +#define RAIDZ_ELEM_SIZE (8) +#else +#error "VDEV_RAIDZ: Native CPU register size not supported." +#endif + +typedef union elem { + unsigned long long e; + unsigned char b[RAIDZ_ELEM_SIZE]; +} elem_t __attribute__((aligned(RAIDZ_ELEM_SIZE))); + +static const struct raidz_scalar_constants { + elem_t mod; + elem_t mask; + elem_t check; +} raidz_scalar_constants = { +#if RAIDZ_ELEM_SIZE == 8 + .mod.e = 0x1d1d1d1d1d1d1d1dULL, + .mask.e = 0xfefefefefefefefeULL, + .check.e = 0x8080808080808080ULL, +#else + .mod.e = 0x1d1d1d1dULL, + .mask.e = 0xfefefefeULL, + .check.e = 0x80808080ULL, +#endif +}; + +/* Keep multiplication in log form for scalar */ +inline static int +fix_mul_exponent(int e) { + while(e > 255) + e -= 255; + return e; +} + +static inline void +xor_acc_x2(const elem_t *data, elem_t *a0, elem_t *a1) +{ + a0->e ^= data[0].e; + a1->e ^= data[1].e; +} + +static inline void +load_x2(const elem_t *src, elem_t *a0, elem_t *a1) +{ + a0->e = src[0].e; + a1->e = src[1].e; +} + +static inline void +store_x2(elem_t *dst, elem_t a0, elem_t a1) +{ + dst[0].e = a0.e; + dst[1].e = a1.e; +} + +static inline void +zero_store_x2(elem_t *dst) +{ + dst[0].e = dst[1].e = 0; +} + +static inline void +xor_x2(const elem_t a0, const elem_t a1, elem_t *r0, elem_t *r1) +{ + r0->e ^= a0.e; + r1->e ^= a1.e; +} + +static inline void +copy_x2(const elem_t a0, const elem_t a1, elem_t *c0, elem_t *c1) +{ + c0->e = a0.e; + c1->e = a1.e; +} + +static inline void +zero_x2(elem_t *r0, elem_t *r1) +{ + r0->e = r1->e = 0ULL; +} + +static inline void +mul2_x2(elem_t *a0, elem_t *a1) +{ + elem_t cmp, dbl, mask; + + cmp.e = (*a0).e & raidz_scalar_constants.check.e; + mask.e = (cmp.e << 1) - (cmp.e >> 7); + dbl.e = ((*a0).e << 1) & raidz_scalar_constants.mask.e; + (*a0).e = dbl.e ^ (mask.e & raidz_scalar_constants.mod.e); + + cmp.e = (*a1).e & raidz_scalar_constants.check.e; + mask.e = (cmp.e << 1) - (cmp.e >> 7); + dbl.e = ((*a1).e << 1) & raidz_scalar_constants.mask.e; + (*a1).e = dbl.e ^ (mask.e & raidz_scalar_constants.mod.e); +} + +static inline void +mul4_x2(elem_t *a0, elem_t *a1) +{ + mul2_x2(a0, a1); + mul2_x2(a0, a1); +} + +static inline elem_t +exp2_x1(const elem_t a, const int mul) +{ + elem_t r; + switch (RAIDZ_ELEM_SIZE) { + case 8: + r.b[7] = vdev_raidz_exp2(a.b[7], mul); + r.b[6] = vdev_raidz_exp2(a.b[6], mul); + r.b[5] = vdev_raidz_exp2(a.b[5], mul); + r.b[4] = vdev_raidz_exp2(a.b[4], mul); + case 4: + r.b[3] = vdev_raidz_exp2(a.b[3], mul); + r.b[2] = vdev_raidz_exp2(a.b[2], mul); + r.b[1] = vdev_raidz_exp2(a.b[1], mul); + r.b[0] = vdev_raidz_exp2(a.b[0], mul); + } + return (r); +} + +static inline void +exp2_x2(elem_t *a0, elem_t *a1, const int mul) +{ + *a0 = exp2_x1(*a0, mul); + *a1 = exp2_x1(*a1, mul); +} + +static inline void +raidz_flush_data(void) +{ +} + +static inline size_t +gen_p_block(elem_t *p, + const elem_t **data, + const size_t nd, + const size_t off) +{ + size_t c; + elem_t p0, p1; + + load_x2(data[0] + off, &p0, &p1); + for (c = 1; c < nd; c++) { + xor_acc_x2(data[c] + off, &p0, &p1); + } + store_x2(p + off, p0, p1); + return (2); +} + +static inline size_t +gen_pq_block(elem_t *p, elem_t *q, + const elem_t **data, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + elem_t p0, p1; + elem_t q0, q1; + + load_x2(data[0] + off, &p0, &p1); + copy_x2(p0, p1, &q0, &q1); + for (c = 1; c < nld; c++) { + mul2_x2(&q0, &q1); + xor_acc_x2(data[c] + off, &p0, &p1); + xor_acc_x2(data[c] + off, &q0, &q1); + } + for (; c < nd; c++) { + mul2_x2(&q0, &q1); + } + store_x2(p + off, p0, p1); + store_x2(q + off, q0, q1); + + return (2); +} + +static inline size_t +gen_pqr_block(elem_t *p, elem_t *q, elem_t *r, + const elem_t **data, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + elem_t p0, p1; + elem_t q0, q1; + elem_t r0, r1; + + load_x2(data[0] + off, &p0, &p1); + copy_x2(p0, p1, &q0, &q1); + copy_x2(p0, p1, &r0, &r1); + + for (c = 1; c < nld; c++) { + mul2_x2(&q0, &q1); + mul4_x2(&r0, &r1); + xor_acc_x2(data[c] + off, &p0, &p1); + xor_acc_x2(data[c] + off, &q0, &q1); + xor_acc_x2(data[c] + off, &r0, &r1); + } + for (; c < nd; c++) { + mul2_x2(&q0, &q1); + mul4_x2(&r0, &r1); + } + store_x2(p + off, p0, p1); + store_x2(q + off, q0, q1); + store_x2(r + off, r0, r1); + + return (2); +} + + +static inline size_t +rec_p_block(elem_t *p_col, elem_t **d_cols, + const size_t xidx, + const size_t nd, + const size_t off) +{ + size_t c; + elem_t *const x_col = d_cols[xidx]; + elem_t p0, p1; + + load_x2(x_col + off, &p0, &p1); + + for (c = 0; c < nd; c++) { + xor_acc_x2(d_cols[c] + off, &p0, &p1); + } + xor_acc_x2(p_col + off, &p0, &p1); + store_x2(x_col + off, p0, p1); + + return (2); +} + +static inline size_t +rec_q_block(elem_t *q_col, elem_t **d_cols, + const size_t xidx, + const int x_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + elem_t *const x_col = d_cols[xidx]; + elem_t q0, q1; + + zero_store_x2(x_col + off); + load_x2(d_cols[0] + off, &q0, &q1); + + for (c = 1; c < nld; c++) { + mul2_x2(&q0, &q1); + xor_acc_x2(d_cols[c] + off, &q0, &q1); + } + for (; c < nd; c++) { + mul2_x2(&q0, &q1); + } + xor_acc_x2(q_col + off, &q0, &q1); + exp2_x2(&q0, &q1, x_mul); + store_x2(x_col + off, q0, q1); + + return (2); +} + +static inline size_t +rec_r_block(elem_t *r_col, elem_t **d_cols, + const size_t xidx, + const int x_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + elem_t *const x_col = d_cols[xidx]; + elem_t r0, r1; + + zero_store_x2(x_col + off); + load_x2(d_cols[0] + off, &r0, &r1); + + for (c = 1; c < nld; c++) { + mul4_x2(&r0, &r1); + xor_acc_x2(d_cols[c] + off, &r0, &r1); + } + for (; c < nd; c++) { + mul4_x2(&r0, &r1); + } + xor_acc_x2(r_col + off, &r0, &r1); + exp2_x2(&r0, &r1, x_mul); + + store_x2(x_col + off, r0, r1); + + return (2); +} + +static inline size_t +rec_pq_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t xsize, const size_t ysize, + const int a_mul, const int b_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + elem_t *const p_col = (elem_t *) codes[0]; + elem_t *const q_col = (elem_t *) codes[1]; + elem_t **const src = (elem_t **) data; + elem_t *const x_col = src[x]; + elem_t *const y_col = src[y]; + + elem_t p0, p1; + elem_t q0, q1; + elem_t t0, t1; + + zero_x2(&p0, &p1); + zero_x2(&q0, &q1); + + for (c = 0; c < nld; c++) { + mul2_x2(&q0, &q1); + if (c != x && c != y) { + xor_acc_x2(data[c] + off, &p0, &p1); + xor_acc_x2(data[c] + off, &q0, &q1); + } + } + for (; c < nd; c++) { + mul2_x2(&q0, &q1); + } + + xor_acc_x2(p_col + off, &p0, &p1); + xor_acc_x2(q_col + off, &q0, &q1); + + /* Save Pxy */ + copy_x2(p0, p1, &t0, &t1); + + /* Calc X */ + exp2_x2(&p0, &p1, a_mul); + exp2_x2(&q0, &q1, b_mul); + xor_x2(q0, q1, &p0, &p1); + store_x2(x_col + off, p0, p1); + + if (xsize == ysize) { + /* Calc Y */ + xor_x2(t0, t1, &p0, &p1); + store_x2(y_col + off, p0, p1); + } + return (2); +} + + + +static inline size_t +rec_pr_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t xsize, const size_t ysize, + const int a_mul, const int b_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + elem_t *const p_col = (elem_t *) codes[0]; + elem_t *const r_col = (elem_t *) codes[2]; + elem_t **const src = (elem_t **) data; + elem_t *const x_col = src[x]; + elem_t *const y_col = src[y]; + + elem_t p0, p1; + elem_t r0, r1; + elem_t t0, t1; + + zero_x2(&p0, &p1); + zero_x2(&r0, &r1); + + for (c = 0; c < nld; c++) { + mul4_x2(&r0, &r1); + if (c != x && c != y) { + xor_acc_x2(data[c] + off, &p0, &p1); + xor_acc_x2(data[c] + off, &r0, &r1); + } + } + for (; c < nd; c++) { + mul4_x2(&r0, &r1); + } + + xor_acc_x2(p_col + off, &p0, &p1); + xor_acc_x2(r_col + off, &r0, &r1); + + /* Save Pxy */ + copy_x2(p0, p1, &t0, &t1); + + /* Calc X */ + exp2_x2(&p0, &p1, a_mul); + exp2_x2(&r0, &r1, b_mul); + xor_x2(r0, r1, &p0, &p1); + store_x2(x_col + off, p0, p1); + + if (xsize == ysize) { + /* Calc Y */ + xor_x2(t0, t1, &p0, &p1); + store_x2(y_col + off, p0, p1); + } + return (2); +} + + +static inline __attribute__((always_inline)) size_t +rec_qr_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t xsize, const size_t ysize, + const int xq_mul, const int x_mul, + const int yq_mul, const int y_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + elem_t *const q_col = (elem_t *) codes[1]; + elem_t *const r_col = (elem_t *) codes[2]; + elem_t *const x_col = data[x]; + elem_t *const y_col = data[y]; + + elem_t q0, q1; + elem_t r0, r1; + elem_t t0, t1; + + zero_x2(&q0, &q1); + zero_x2(&r0, &r1); + + for (c = 0; c < nld; c++) { + mul2_x2(&q0, &q1); + mul4_x2(&r0, &r1); + if (c != x && c != y) { + xor_acc_x2(data[c] + off, &q0, &q1); + xor_acc_x2(data[c] + off, &r0, &r1); + } + } + for (; c < nd; c++) { + mul2_x2(&q0, &q1); + mul4_x2(&r0, &r1); + } + + xor_acc_x2(q_col + off, &q0, &q1); + xor_acc_x2(r_col + off, &r0, &r1); + + /* Calc X */ + copy_x2(q0, q1, &t0, &t1); + exp2_x2(&t0, &t1, xq_mul); /* X = Q * xqm */ + xor_x2(r0, r1, &t0, &t1); /* X = R ^ X */ + exp2_x2(&t0, &t1, x_mul); /* X = X * xm */ + store_x2(x_col + off, t0, t1); + + if (xsize == ysize) { + /* Calc Y */ + exp2_x2(&q0, &q1, yq_mul); + xor_x2(r0, r1, &q0, &q1); + exp2_x2(&q0, &q1, y_mul); + store_x2(y_col + off, q0, q1); + } + return (2); +} + + +static inline __attribute__((always_inline)) size_t +rec_pqr_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t z, + const size_t xsize, const size_t ysize, + const size_t zsize, + const int xp_mul, const int xq_mul, + const int xr_mul, + const int yp_mul, const int yq_mul, + const int upd_q_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + elem_t *const p_col = (elem_t *) codes[0]; + elem_t *const q_col = (elem_t *) codes[1]; + elem_t *const r_col = (elem_t *) codes[2]; + elem_t *const x_col = data[x]; + elem_t *const y_col = data[y]; + elem_t *const z_col = data[z]; + + elem_t p0, p1, q0, q1, r0, r1; + elem_t t0, t1, t2, t3; + + zero_x2(&p0, &p1); + zero_x2(&q0, &q1); + zero_x2(&r0, &r1); + + for (c = 0; c < nld; c++) { + mul2_x2(&q0, &q1); + mul4_x2(&r0, &r1); + if (c != x && c != y && c != z) { + xor_acc_x2(data[c] + off, &p0, &p1); + xor_acc_x2(data[c] + off, &q0, &q1); + xor_acc_x2(data[c] + off, &r0, &r1); + } + } + for (; c < nd; c++) { + mul2_x2(&q0, &q1); + mul4_x2(&r0, &r1); + } + + xor_acc_x2(p_col + off, &p0, &p1); + xor_acc_x2(q_col + off, &q0, &q1); + xor_acc_x2(r_col + off, &r0, &r1); + + /* Calc X */ + copy_x2(p0, p1, &t0, &t1); + exp2_x2(&t0, &t1, xp_mul); + copy_x2(q0, q1, &t2, &t3); + exp2_x2(&t2, &t3, xq_mul); + xor_x2(t2, t3, &t0, &t1); + exp2_x2(&r0, &r1, xr_mul); + xor_x2(r0, r1, &t0, &t1); + store_x2(x_col + off, t0, t1); + + + if (ysize == xsize) { + /* Calc Y */ + xor_x2(t0, t1, &p0, &p1); + exp2_x2(&t0, &t1, upd_q_mul); + xor_x2(t0, t1, &q0, &q1); + + copy_x2(p0, p1, &t0, &t1); + exp2_x2(&t0, &t1, yp_mul); + exp2_x2(&q0, &q1, yq_mul); + xor_x2(q0, q1, &t0, &t1); + store_x2(y_col + off, t0, t1); + + if (zsize == xsize) { + /* Calc Z */ + xor_x2(p0, p1, &t0, &t1); + store_x2(z_col + off, t0, t1); + } + } + + return (2); +} + + +#include "vdev_raidz_math_impl.h" + +static int +raidz_math_will_scalar_work(void) +{ + return (1); /* will always work */ +} + +RAIDZ_SCALAR_GEN_WRAP(p, scalar); +RAIDZ_SCALAR_GEN_WRAP(pq, scalar); +RAIDZ_SCALAR_GEN_WRAP(pqr, scalar); + +RAIDZ_SCALAR_REC_WRAP(p, scalar); +RAIDZ_SCALAR_REC_WRAP(q, scalar); +RAIDZ_SCALAR_REC_WRAP(r, scalar); +RAIDZ_SCALAR_REC_WRAP(pq, scalar); +RAIDZ_SCALAR_REC_WRAP(pr, scalar); +RAIDZ_SCALAR_REC_WRAP(qr, scalar); +RAIDZ_SCALAR_REC_WRAP(pqr, scalar); + +const raidz_math_impl_t vdev_raidz_scalar_impl = { + .gen = { &scalar_gen_p, &scalar_gen_pq, &scalar_gen_pqr }, + .rec = { + &scalar_rec_p, &scalar_rec_q, &scalar_rec_r, + &scalar_rec_pq, &scalar_rec_pr, &scalar_rec_qr, + &scalar_rec_pqr + }, + .is_supported = &raidz_math_will_scalar_work, + .name = "scalar" +}; + +/* Powers of 2 in the Galois field defined above. */ +const unsigned char vdev_raidz_pow2[511] __attribute__((aligned(256))) = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, + 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26, + 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, + 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, + 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, + 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23, + 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, + 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1, + 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, + 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, + 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, + 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2, + 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, + 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce, + 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, + 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc, + 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, + 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54, + 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, + 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73, + 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, + 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff, + 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, + 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41, + 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, + 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6, + 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, + 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09, + 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, + 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16, + 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, + 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x01, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, + 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26, + 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, + 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, + 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, + 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23, + 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, + 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1, + 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, + 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, + 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, + 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2, + 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, + 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce, + 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, + 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc, + 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, + 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54, + 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, + 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73, + 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, + 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff, + 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, + 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41, + 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, + 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6, + 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, + 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09, + 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, + 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16, + 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, + 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x01 +}; + +/* Logs of 2 in the Galois field defined above. */ +const unsigned char vdev_raidz_log2[256] __attribute__((aligned(256))) = { + 0x00, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, + 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b, + 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, + 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71, + 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, + 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45, + 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, + 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6, + 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, + 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88, + 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, + 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40, + 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, + 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d, + 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, + 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57, + 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, + 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18, + 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, + 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e, + 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, + 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61, + 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, + 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2, + 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, + 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6, + 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, + 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a, + 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, + 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7, + 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, + 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf, +}; diff --git a/module/zfs/vdev_raidz_math_sse.c b/module/zfs/vdev_raidz_math_sse.c new file mode 100644 index 000000000000..0e19fcaddb56 --- /dev/null +++ b/module/zfs/vdev_raidz_math_sse.c @@ -0,0 +1,771 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (C) 2016 Gvozden Nešković. All rights reserved. + */ + +#include "vdev_raidz.h" +#include + + #if !defined(_KERNEL) + #include + #endif + +#define __asm __asm__ __volatile__ + +#define _REG_CNT(_0,_1,_2,_3,_4,_5,_6,_7, N, ...) N +#define REG_CNT(r...) _REG_CNT(r, 8,7,6,5,4,3,2,1) + +#define VR0_(REG, ...) "xmm"#REG +#define VR1_(_1, REG, ...) "xmm"#REG +#define VR2_(_1,_2, REG, ...) "xmm"#REG +#define VR3_(_1,_2,_3, REG, ...) "xmm"#REG +#define VR4_(_1,_2,_3,_4, REG, ...) "xmm"#REG +#define VR5_(_1,_2,_3,_4,_5, REG, ...) "xmm"#REG +#define VR6_(_1,_2,_3,_4,_5,_6, REG, ...) "xmm"#REG +#define VR7_(_1,_2,_3,_4,_5,_6,_7, REG, ...) "xmm"#REG + +#define VR0(r...) VR0_(r) +#define VR1(r...) VR1_(r) +#define VR2(r...) VR2_(r, 1) +#define VR3(r...) VR3_(r, 1,2) +#define VR4(r...) VR4_(r, 1) +#define VR5(r...) VR5_(r, 1,2) +#define VR6(r...) VR6_(r, 1,2,3) +#define VR7(r...) VR7_(r, 1,2,3,4) + +#define R_01(REG1, REG2, ...) REG1, REG2 +#define R_23_(_0,_1, REG2, REG3, ...) REG2, REG3 +#define R_23(REG...) R_23_(REG, 1,2) + +#define ELEM_SIZE 16 + +typedef struct elem { + unsigned char b[ELEM_SIZE]; +} elem_t __attribute__((aligned(ELEM_SIZE))); + +/* Convert from GF log to perform multiplications using SIMD */ +inline static int +fix_mul_exponent(int e) { + return ((int)vdev_raidz_pow2[e]); +} + +#define PREFETCHNTA(ptr, offset, stride) \ +{ \ + switch(stride){\ + case 4: __asm("prefetchnta %0" :: "m" (((elem_t*)ptr)[offset+2])); \ + case 2: __asm("prefetchnta %0" :: "m" (((elem_t*)ptr)[offset+0])); \ + }\ +} + +#define XOR_ACC(src, r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 4: __asm("pxor %0, %%" VR3(r) : : "m" (((elem_t*)src)[3]));\ + __asm("pxor %0, %%" VR2(r) : : "m" (((elem_t*)src)[2]));\ + case 2: __asm("pxor %0, %%" VR1(r) : : "m" (((elem_t*)src)[1]));\ + case 1: __asm("pxor %0, %%" VR0(r) : : "m" (((elem_t*)src)[0]));\ + }\ +} + +#define XOR(r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 8:\ + __asm("pxor %" VR0(r) ", %" VR4(r));\ + __asm("pxor %" VR1(r) ", %" VR5(r));\ + __asm("pxor %" VR2(r) ", %" VR6(r));\ + __asm("pxor %" VR3(r) ", %" VR7(r));\ + break;\ + case 4:\ + __asm("pxor %" VR0(r) ", %" VR2(r));\ + __asm("pxor %" VR1(r) ", %" VR3(r));\ + break;\ + case 2:\ + __asm("pxor %" VR0(r) ", %" VR1(r));\ + break;\ + }\ +} + +#define COPY(r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 8:\ + __asm("movdqa %" VR0(r) ", %" VR4(r));\ + __asm("movdqa %" VR1(r) ", %" VR5(r));\ + __asm("movdqa %" VR2(r) ", %" VR6(r));\ + __asm("movdqa %" VR3(r) ", %" VR7(r));\ + break;\ + case 4:\ + __asm("movdqa %" VR0(r) ", %" VR2(r));\ + __asm("movdqa %" VR1(r) ", %" VR3(r));\ + break;\ + case 2:\ + __asm("movdqa %" VR0(r) ", %" VR1(r));\ + break;\ + }\ +} + +#define LOAD(src, r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 4: __asm("movdqa %0, %%" VR3(r) : : "m" (((elem_t *)src)[3]));\ + __asm("movdqa %0, %%" VR2(r) : : "m" (((elem_t *)src)[2]));\ + case 2: __asm("movdqa %0, %%" VR1(r) : : "m" (((elem_t *)src)[1]));\ + case 1: __asm("movdqa %0, %%" VR0(r) : : "m" (((elem_t *)src)[0]));\ + }\ +} + +#define ZERO(r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 4: __asm("pxor %" VR3(r)", %" VR3(r));\ + __asm("pxor %" VR2(r)", %" VR2(r));\ + case 2: __asm("pxor %" VR1(r)", %" VR1(r));\ + case 1: __asm("pxor %" VR0(r)", %" VR0(r));\ + }\ +} + +#define STREAM_STORE(dst, r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 4: __asm("movntdq %%" VR3(r)", %0" : "=m" (((elem_t *)dst)[3]));\ + __asm("movntdq %%" VR2(r)", %0" : "=m" (((elem_t *)dst)[2]));\ + case 2: __asm("movntdq %%" VR1(r)", %0" : "=m" (((elem_t *)dst)[1]));\ + case 1: __asm("movntdq %%" VR0(r)", %0" : "=m" (((elem_t *)dst)[0]));\ + }\ +} + +#define FLUSH() \ +{ \ + __asm("sfence" : : : "memory"); \ +} + +#define MUL2_SETUP() \ +{ \ + __asm("movdqa %0, %%xmm15" : : "m" (sse_gf_mod_constants[1][0])); \ +} + +#define MUL2_(r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 2:\ + __asm("pxor %xmm14, %xmm14"); \ + __asm("pxor %xmm13, %xmm13"); \ + __asm("pcmpgtb %" VR0(r)", %xmm14"); \ + __asm("pcmpgtb %" VR1(r)", %xmm13"); \ + __asm("pand %xmm15, %xmm14"); \ + __asm("pand %xmm15, %xmm13"); \ + __asm("paddb %" VR0(r)", %" VR0(r)); \ + __asm("paddb %" VR1(r)", %" VR1(r)); \ + __asm("pxor %xmm14, %" VR0(r)); \ + __asm("pxor %xmm13, %" VR1(r)); \ + break;\ + }\ +} + +#define MUL2(r...) \ +{ \ + switch(REG_CNT(r)) {\ + case 2:\ + MUL2_(r);\ + break;\ + case 4:\ + MUL2_(R_01(r));\ + MUL2_(R_23(r));\ + break;\ + }\ +} + +#define MUL4(r...) \ +{ \ + MUL2(r); \ + MUL2(r); \ +} + +#include "vdev_raidz_math_sse_mul.h" +#include "vdev_raidz_math_x86simd.h" +#include "vdev_raidz_math_impl.h" + +RAIDZ_x86SIMD_GEN_WRAP(p, sse); +RAIDZ_x86SIMD_GEN_WRAP(pq, sse); +RAIDZ_x86SIMD_GEN_WRAP(pqr, sse); + +RAIDZ_x86SIMD_REC_WRAP(p, sse); +RAIDZ_x86SIMD_REC_WRAP(q, sse); +RAIDZ_x86SIMD_REC_WRAP(r, sse); +RAIDZ_x86SIMD_REC_WRAP(pq, sse); +RAIDZ_x86SIMD_REC_WRAP(pr, sse); +RAIDZ_x86SIMD_REC_WRAP(qr, sse); +RAIDZ_x86SIMD_REC_WRAP(pqr, sse); + +static int +raidz_math_will_sse_work(void) +{ +#if defined(__x86_64__) && defined(_KERNEL) + return ( + boot_cpu_has(X86_FEATURE_MMX) && + boot_cpu_has(X86_FEATURE_FXSR) && + boot_cpu_has(X86_FEATURE_XMM) && + boot_cpu_has(X86_FEATURE_XMM2) && + boot_cpu_has(X86_FEATURE_SSSE3) && + boot_cpu_has(X86_FEATURE_XMM4_1) + ); +#else + return (!system("grep sse4_1 /proc/cpuinfo 2>&1 > /dev/null")); +#endif +} + +const +raidz_math_impl_t vdev_raidz_sse_impl = { + .gen = { &sse_gen_p, &sse_gen_pq, &sse_gen_pqr }, + .rec = { + &sse_rec_p, &sse_rec_q, &sse_rec_r, + &sse_rec_pq, &sse_rec_pr, &sse_rec_qr, + &sse_rec_pqr + }, + + .is_supported = &raidz_math_will_sse_work, + .name = "sse" +}; + +const uint8_t __attribute__((aligned(256))) +sse_gf_mod_constants[2][16] = { + {0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f}, + {0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d} +}; + +const uint8_t __attribute__((aligned(256))) +sse_gf_mod_lt[2*256][16] = { + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x3a,0x27,0x74,0x69,0x4e,0x53,0xe8,0xf5,0xd2,0xcf,0x9c,0x81,0xa6,0xbb}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x3a,0x27,0x74,0x69,0x4e,0x53,0xe8,0xf5,0xd2,0xcf,0x9c,0x81,0xa6,0xbb}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x3a,0x27,0x74,0x69,0x4e,0x53,0xf5,0xe8,0xcf,0xd2,0x81,0x9c,0xbb,0xa6}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x3a,0x27,0x74,0x69,0x4e,0x53,0xf5,0xe8,0xcf,0xd2,0x81,0x9c,0xbb,0xa6}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x3a,0x27,0x69,0x74,0x53,0x4e,0xd2,0xcf,0xe8,0xf5,0xbb,0xa6,0x81,0x9c}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x3a,0x27,0x69,0x74,0x53,0x4e,0xd2,0xcf,0xe8,0xf5,0xbb,0xa6,0x81,0x9c}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x3a,0x27,0x69,0x74,0x53,0x4e,0xcf,0xd2,0xf5,0xe8,0xa6,0xbb,0x9c,0x81}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x3a,0x27,0x69,0x74,0x53,0x4e,0xcf,0xd2,0xf5,0xe8,0xa6,0xbb,0x9c,0x81}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x27,0x3a,0x4e,0x53,0x69,0x74,0x9c,0x81,0xbb,0xa6,0xd2,0xcf,0xf5,0xe8}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x27,0x3a,0x4e,0x53,0x69,0x74,0x9c,0x81,0xbb,0xa6,0xd2,0xcf,0xf5,0xe8}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x27,0x3a,0x4e,0x53,0x69,0x74,0x81,0x9c,0xa6,0xbb,0xcf,0xd2,0xe8,0xf5}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x27,0x3a,0x4e,0x53,0x69,0x74,0x81,0x9c,0xa6,0xbb,0xcf,0xd2,0xe8,0xf5}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x27,0x3a,0x53,0x4e,0x74,0x69,0xa6,0xbb,0x81,0x9c,0xf5,0xe8,0xd2,0xcf}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x27,0x3a,0x53,0x4e,0x74,0x69,0xa6,0xbb,0x81,0x9c,0xf5,0xe8,0xd2,0xcf}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x27,0x3a,0x53,0x4e,0x74,0x69,0xbb,0xa6,0x9c,0x81,0xe8,0xf5,0xcf,0xd2}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x1d,0x27,0x3a,0x53,0x4e,0x74,0x69,0xbb,0xa6,0x9c,0x81,0xe8,0xf5,0xcf,0xd2}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + {0x00,0x3a,0x74,0x4e,0xe8,0xd2,0x9c,0xa6,0xcd,0xf7,0xb9,0x83,0x25,0x1f,0x51,0x6b}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x74,0x4e,0xe8,0xd2,0x9c,0xa6,0xcd,0xf7,0xb9,0x83,0x25,0x1f,0x51,0x6b}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x74,0x4e,0xe8,0xd2,0x9c,0xa6,0xd0,0xea,0xa4,0x9e,0x38,0x02,0x4c,0x76}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x74,0x4e,0xe8,0xd2,0x9c,0xa6,0xd0,0xea,0xa4,0x9e,0x38,0x02,0x4c,0x76}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x74,0x4e,0xf5,0xcf,0x81,0xbb,0xf7,0xcd,0x83,0xb9,0x02,0x38,0x76,0x4c}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x74,0x4e,0xf5,0xcf,0x81,0xbb,0xf7,0xcd,0x83,0xb9,0x02,0x38,0x76,0x4c}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x74,0x4e,0xf5,0xcf,0x81,0xbb,0xea,0xd0,0x9e,0xa4,0x1f,0x25,0x6b,0x51}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x74,0x4e,0xf5,0xcf,0x81,0xbb,0xea,0xd0,0x9e,0xa4,0x1f,0x25,0x6b,0x51}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x69,0x53,0xd2,0xe8,0xbb,0x81,0xb9,0x83,0xd0,0xea,0x6b,0x51,0x02,0x38}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x69,0x53,0xd2,0xe8,0xbb,0x81,0xb9,0x83,0xd0,0xea,0x6b,0x51,0x02,0x38}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x69,0x53,0xd2,0xe8,0xbb,0x81,0xa4,0x9e,0xcd,0xf7,0x76,0x4c,0x1f,0x25}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x69,0x53,0xd2,0xe8,0xbb,0x81,0xa4,0x9e,0xcd,0xf7,0x76,0x4c,0x1f,0x25}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x69,0x53,0xcf,0xf5,0xa6,0x9c,0x83,0xb9,0xea,0xd0,0x4c,0x76,0x25,0x1f}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x69,0x53,0xcf,0xf5,0xa6,0x9c,0x83,0xb9,0xea,0xd0,0x4c,0x76,0x25,0x1f}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x69,0x53,0xcf,0xf5,0xa6,0x9c,0x9e,0xa4,0xf7,0xcd,0x51,0x6b,0x38,0x02}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x3a,0x69,0x53,0xcf,0xf5,0xa6,0x9c,0x9e,0xa4,0xf7,0xcd,0x51,0x6b,0x38,0x02}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x4e,0x69,0x9c,0xbb,0xd2,0xf5,0x25,0x02,0x6b,0x4c,0xb9,0x9e,0xf7,0xd0}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x4e,0x69,0x9c,0xbb,0xd2,0xf5,0x25,0x02,0x6b,0x4c,0xb9,0x9e,0xf7,0xd0}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x4e,0x69,0x9c,0xbb,0xd2,0xf5,0x38,0x1f,0x76,0x51,0xa4,0x83,0xea,0xcd}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x4e,0x69,0x9c,0xbb,0xd2,0xf5,0x38,0x1f,0x76,0x51,0xa4,0x83,0xea,0xcd}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x4e,0x69,0x81,0xa6,0xcf,0xe8,0x1f,0x38,0x51,0x76,0x9e,0xb9,0xd0,0xf7}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x4e,0x69,0x81,0xa6,0xcf,0xe8,0x1f,0x38,0x51,0x76,0x9e,0xb9,0xd0,0xf7}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x4e,0x69,0x81,0xa6,0xcf,0xe8,0x02,0x25,0x4c,0x6b,0x83,0xa4,0xcd,0xea}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x4e,0x69,0x81,0xa6,0xcf,0xe8,0x02,0x25,0x4c,0x6b,0x83,0xa4,0xcd,0xea}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x53,0x74,0xa6,0x81,0xf5,0xd2,0x51,0x76,0x02,0x25,0xf7,0xd0,0xa4,0x83}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x53,0x74,0xa6,0x81,0xf5,0xd2,0x51,0x76,0x02,0x25,0xf7,0xd0,0xa4,0x83}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x53,0x74,0xa6,0x81,0xf5,0xd2,0x4c,0x6b,0x1f,0x38,0xea,0xcd,0xb9,0x9e}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x53,0x74,0xa6,0x81,0xf5,0xd2,0x4c,0x6b,0x1f,0x38,0xea,0xcd,0xb9,0x9e}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x53,0x74,0xbb,0x9c,0xe8,0xcf,0x6b,0x4c,0x38,0x1f,0xd0,0xf7,0x83,0xa4}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x53,0x74,0xbb,0x9c,0xe8,0xcf,0x6b,0x4c,0x38,0x1f,0xd0,0xf7,0x83,0xa4}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x53,0x74,0xbb,0x9c,0xe8,0xcf,0x76,0x51,0x25,0x02,0xcd,0xea,0x9e,0xb9}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x27,0x53,0x74,0xbb,0x9c,0xe8,0xcf,0x76,0x51,0x25,0x02,0xcd,0xea,0x9e,0xb9}, + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d}, + {0x00,0x74,0xe8,0x9c,0xcd,0xb9,0x25,0x51,0x87,0xf3,0x6f,0x1b,0x4a,0x3e,0xa2,0xd6}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xe8,0x9c,0xcd,0xb9,0x25,0x51,0x87,0xf3,0x6f,0x1b,0x4a,0x3e,0xa2,0xd6}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xe8,0x9c,0xcd,0xb9,0x25,0x51,0x9a,0xee,0x72,0x06,0x57,0x23,0xbf,0xcb}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xe8,0x9c,0xcd,0xb9,0x25,0x51,0x9a,0xee,0x72,0x06,0x57,0x23,0xbf,0xcb}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xe8,0x9c,0xd0,0xa4,0x38,0x4c,0xbd,0xc9,0x55,0x21,0x6d,0x19,0x85,0xf1}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xe8,0x9c,0xd0,0xa4,0x38,0x4c,0xbd,0xc9,0x55,0x21,0x6d,0x19,0x85,0xf1}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xe8,0x9c,0xd0,0xa4,0x38,0x4c,0xa0,0xd4,0x48,0x3c,0x70,0x04,0x98,0xec}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xe8,0x9c,0xd0,0xa4,0x38,0x4c,0xa0,0xd4,0x48,0x3c,0x70,0x04,0x98,0xec}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xf5,0x81,0xf7,0x83,0x02,0x76,0xf3,0x87,0x06,0x72,0x04,0x70,0xf1,0x85}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xf5,0x81,0xf7,0x83,0x02,0x76,0xf3,0x87,0x06,0x72,0x04,0x70,0xf1,0x85}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xf5,0x81,0xf7,0x83,0x02,0x76,0xee,0x9a,0x1b,0x6f,0x19,0x6d,0xec,0x98}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xf5,0x81,0xf7,0x83,0x02,0x76,0xee,0x9a,0x1b,0x6f,0x19,0x6d,0xec,0x98}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xf5,0x81,0xea,0x9e,0x1f,0x6b,0xc9,0xbd,0x3c,0x48,0x23,0x57,0xd6,0xa2}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xf5,0x81,0xea,0x9e,0x1f,0x6b,0xc9,0xbd,0x3c,0x48,0x23,0x57,0xd6,0xa2}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xf5,0x81,0xea,0x9e,0x1f,0x6b,0xd4,0xa0,0x21,0x55,0x3e,0x4a,0xcb,0xbf}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x74,0xf5,0x81,0xea,0x9e,0x1f,0x6b,0xd4,0xa0,0x21,0x55,0x3e,0x4a,0xcb,0xbf}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xd2,0xbb,0xb9,0xd0,0x6b,0x02,0x6f,0x06,0xbd,0xd4,0xd6,0xbf,0x04,0x6d}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xd2,0xbb,0xb9,0xd0,0x6b,0x02,0x6f,0x06,0xbd,0xd4,0xd6,0xbf,0x04,0x6d}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xd2,0xbb,0xb9,0xd0,0x6b,0x02,0x72,0x1b,0xa0,0xc9,0xcb,0xa2,0x19,0x70}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xd2,0xbb,0xb9,0xd0,0x6b,0x02,0x72,0x1b,0xa0,0xc9,0xcb,0xa2,0x19,0x70}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xd2,0xbb,0xa4,0xcd,0x76,0x1f,0x55,0x3c,0x87,0xee,0xf1,0x98,0x23,0x4a}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xd2,0xbb,0xa4,0xcd,0x76,0x1f,0x55,0x3c,0x87,0xee,0xf1,0x98,0x23,0x4a}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xd2,0xbb,0xa4,0xcd,0x76,0x1f,0x48,0x21,0x9a,0xf3,0xec,0x85,0x3e,0x57}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xd2,0xbb,0xa4,0xcd,0x76,0x1f,0x48,0x21,0x9a,0xf3,0xec,0x85,0x3e,0x57}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xcf,0xa6,0x83,0xea,0x4c,0x25,0x1b,0x72,0xd4,0xbd,0x98,0xf1,0x57,0x3e}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xcf,0xa6,0x83,0xea,0x4c,0x25,0x1b,0x72,0xd4,0xbd,0x98,0xf1,0x57,0x3e}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xcf,0xa6,0x83,0xea,0x4c,0x25,0x06,0x6f,0xc9,0xa0,0x85,0xec,0x4a,0x23}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xcf,0xa6,0x83,0xea,0x4c,0x25,0x06,0x6f,0xc9,0xa0,0x85,0xec,0x4a,0x23}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xcf,0xa6,0x9e,0xf7,0x51,0x38,0x21,0x48,0xee,0x87,0xbf,0xd6,0x70,0x19}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xcf,0xa6,0x9e,0xf7,0x51,0x38,0x21,0x48,0xee,0x87,0xbf,0xd6,0x70,0x19}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xcf,0xa6,0x9e,0xf7,0x51,0x38,0x3c,0x55,0xf3,0x9a,0xa2,0xcb,0x6d,0x04}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x69,0xcf,0xa6,0x9e,0xf7,0x51,0x38,0x3c,0x55,0xf3,0x9a,0xa2,0xcb,0x6d,0x04}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x3a,0x3a,0x3a,0x3a,0x27,0x27,0x27,0x27}, + {0x00,0x4e,0x9c,0xd2,0x25,0x6b,0xb9,0xf7,0x4a,0x04,0xd6,0x98,0x6f,0x21,0xf3,0xbd}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x9c,0xd2,0x25,0x6b,0xb9,0xf7,0x4a,0x04,0xd6,0x98,0x6f,0x21,0xf3,0xbd}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x9c,0xd2,0x25,0x6b,0xb9,0xf7,0x57,0x19,0xcb,0x85,0x72,0x3c,0xee,0xa0}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x9c,0xd2,0x25,0x6b,0xb9,0xf7,0x57,0x19,0xcb,0x85,0x72,0x3c,0xee,0xa0}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x9c,0xd2,0x38,0x76,0xa4,0xea,0x70,0x3e,0xec,0xa2,0x48,0x06,0xd4,0x9a}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x9c,0xd2,0x38,0x76,0xa4,0xea,0x70,0x3e,0xec,0xa2,0x48,0x06,0xd4,0x9a}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x9c,0xd2,0x38,0x76,0xa4,0xea,0x6d,0x23,0xf1,0xbf,0x55,0x1b,0xc9,0x87}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x9c,0xd2,0x38,0x76,0xa4,0xea,0x6d,0x23,0xf1,0xbf,0x55,0x1b,0xc9,0x87}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x81,0xcf,0x1f,0x51,0x9e,0xd0,0x3e,0x70,0xbf,0xf1,0x21,0x6f,0xa0,0xee}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x81,0xcf,0x1f,0x51,0x9e,0xd0,0x3e,0x70,0xbf,0xf1,0x21,0x6f,0xa0,0xee}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x81,0xcf,0x1f,0x51,0x9e,0xd0,0x23,0x6d,0xa2,0xec,0x3c,0x72,0xbd,0xf3}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x81,0xcf,0x1f,0x51,0x9e,0xd0,0x23,0x6d,0xa2,0xec,0x3c,0x72,0xbd,0xf3}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x81,0xcf,0x02,0x4c,0x83,0xcd,0x04,0x4a,0x85,0xcb,0x06,0x48,0x87,0xc9}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x81,0xcf,0x02,0x4c,0x83,0xcd,0x04,0x4a,0x85,0xcb,0x06,0x48,0x87,0xc9}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x81,0xcf,0x02,0x4c,0x83,0xcd,0x19,0x57,0x98,0xd6,0x1b,0x55,0x9a,0xd4}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x4e,0x81,0xcf,0x02,0x4c,0x83,0xcd,0x19,0x57,0x98,0xd6,0x1b,0x55,0x9a,0xd4}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xa6,0xf5,0x51,0x02,0xf7,0xa4,0xa2,0xf1,0x04,0x57,0xf3,0xa0,0x55,0x06}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xa6,0xf5,0x51,0x02,0xf7,0xa4,0xa2,0xf1,0x04,0x57,0xf3,0xa0,0x55,0x06}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xa6,0xf5,0x51,0x02,0xf7,0xa4,0xbf,0xec,0x19,0x4a,0xee,0xbd,0x48,0x1b}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xa6,0xf5,0x51,0x02,0xf7,0xa4,0xbf,0xec,0x19,0x4a,0xee,0xbd,0x48,0x1b}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xa6,0xf5,0x4c,0x1f,0xea,0xb9,0x98,0xcb,0x3e,0x6d,0xd4,0x87,0x72,0x21}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xa6,0xf5,0x4c,0x1f,0xea,0xb9,0x98,0xcb,0x3e,0x6d,0xd4,0x87,0x72,0x21}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xa6,0xf5,0x4c,0x1f,0xea,0xb9,0x85,0xd6,0x23,0x70,0xc9,0x9a,0x6f,0x3c}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xa6,0xf5,0x4c,0x1f,0xea,0xb9,0x85,0xd6,0x23,0x70,0xc9,0x9a,0x6f,0x3c}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xbb,0xe8,0x6b,0x38,0xd0,0x83,0xd6,0x85,0x6d,0x3e,0xbd,0xee,0x06,0x55}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xbb,0xe8,0x6b,0x38,0xd0,0x83,0xd6,0x85,0x6d,0x3e,0xbd,0xee,0x06,0x55}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xbb,0xe8,0x6b,0x38,0xd0,0x83,0xcb,0x98,0x70,0x23,0xa0,0xf3,0x1b,0x48}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xbb,0xe8,0x6b,0x38,0xd0,0x83,0xcb,0x98,0x70,0x23,0xa0,0xf3,0x1b,0x48}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xbb,0xe8,0x76,0x25,0xcd,0x9e,0xec,0xbf,0x57,0x04,0x9a,0xc9,0x21,0x72}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xbb,0xe8,0x76,0x25,0xcd,0x9e,0xec,0xbf,0x57,0x04,0x9a,0xc9,0x21,0x72}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xbb,0xe8,0x76,0x25,0xcd,0x9e,0xf1,0xa2,0x4a,0x19,0x87,0xd4,0x3c,0x6f}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0x53,0xbb,0xe8,0x76,0x25,0xcd,0x9e,0xf1,0xa2,0x4a,0x19,0x87,0xd4,0x3c,0x6f}, + {0x00,0x00,0x00,0x00,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x27,0x27,0x3a,0x3a,0x3a,0x3a}, + {0x00,0xe8,0xcd,0x25,0x87,0x6f,0x4a,0xa2,0x13,0xfb,0xde,0x36,0x94,0x7c,0x59,0xb1}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xcd,0x25,0x87,0x6f,0x4a,0xa2,0x13,0xfb,0xde,0x36,0x94,0x7c,0x59,0xb1}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xcd,0x25,0x87,0x6f,0x4a,0xa2,0x0e,0xe6,0xc3,0x2b,0x89,0x61,0x44,0xac}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xcd,0x25,0x87,0x6f,0x4a,0xa2,0x0e,0xe6,0xc3,0x2b,0x89,0x61,0x44,0xac}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xcd,0x25,0x9a,0x72,0x57,0xbf,0x29,0xc1,0xe4,0x0c,0xb3,0x5b,0x7e,0x96}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xcd,0x25,0x9a,0x72,0x57,0xbf,0x29,0xc1,0xe4,0x0c,0xb3,0x5b,0x7e,0x96}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xcd,0x25,0x9a,0x72,0x57,0xbf,0x34,0xdc,0xf9,0x11,0xae,0x46,0x63,0x8b}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xcd,0x25,0x9a,0x72,0x57,0xbf,0x34,0xdc,0xf9,0x11,0xae,0x46,0x63,0x8b}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xd0,0x38,0xbd,0x55,0x6d,0x85,0x67,0x8f,0xb7,0x5f,0xda,0x32,0x0a,0xe2}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xd0,0x38,0xbd,0x55,0x6d,0x85,0x67,0x8f,0xb7,0x5f,0xda,0x32,0x0a,0xe2}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xd0,0x38,0xbd,0x55,0x6d,0x85,0x7a,0x92,0xaa,0x42,0xc7,0x2f,0x17,0xff}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xd0,0x38,0xbd,0x55,0x6d,0x85,0x7a,0x92,0xaa,0x42,0xc7,0x2f,0x17,0xff}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xd0,0x38,0xa0,0x48,0x70,0x98,0x5d,0xb5,0x8d,0x65,0xfd,0x15,0x2d,0xc5}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xd0,0x38,0xa0,0x48,0x70,0x98,0x5d,0xb5,0x8d,0x65,0xfd,0x15,0x2d,0xc5}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xd0,0x38,0xa0,0x48,0x70,0x98,0x40,0xa8,0x90,0x78,0xe0,0x08,0x30,0xd8}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xe8,0xd0,0x38,0xa0,0x48,0x70,0x98,0x40,0xa8,0x90,0x78,0xe0,0x08,0x30,0xd8}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xf7,0x02,0xf3,0x06,0x04,0xf1,0xfb,0x0e,0x0c,0xf9,0x08,0xfd,0xff,0x0a}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xf7,0x02,0xf3,0x06,0x04,0xf1,0xfb,0x0e,0x0c,0xf9,0x08,0xfd,0xff,0x0a}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xf7,0x02,0xf3,0x06,0x04,0xf1,0xe6,0x13,0x11,0xe4,0x15,0xe0,0xe2,0x17}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xf7,0x02,0xf3,0x06,0x04,0xf1,0xe6,0x13,0x11,0xe4,0x15,0xe0,0xe2,0x17}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xf7,0x02,0xee,0x1b,0x19,0xec,0xc1,0x34,0x36,0xc3,0x2f,0xda,0xd8,0x2d}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xf7,0x02,0xee,0x1b,0x19,0xec,0xc1,0x34,0x36,0xc3,0x2f,0xda,0xd8,0x2d}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xf7,0x02,0xee,0x1b,0x19,0xec,0xdc,0x29,0x2b,0xde,0x32,0xc7,0xc5,0x30}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xf7,0x02,0xee,0x1b,0x19,0xec,0xdc,0x29,0x2b,0xde,0x32,0xc7,0xc5,0x30}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xea,0x1f,0xc9,0x3c,0x23,0xd6,0x8f,0x7a,0x65,0x90,0x46,0xb3,0xac,0x59}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xea,0x1f,0xc9,0x3c,0x23,0xd6,0x8f,0x7a,0x65,0x90,0x46,0xb3,0xac,0x59}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xea,0x1f,0xc9,0x3c,0x23,0xd6,0x92,0x67,0x78,0x8d,0x5b,0xae,0xb1,0x44}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xea,0x1f,0xc9,0x3c,0x23,0xd6,0x92,0x67,0x78,0x8d,0x5b,0xae,0xb1,0x44}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xea,0x1f,0xd4,0x21,0x3e,0xcb,0xb5,0x40,0x5f,0xaa,0x61,0x94,0x8b,0x7e}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xea,0x1f,0xd4,0x21,0x3e,0xcb,0xb5,0x40,0x5f,0xaa,0x61,0x94,0x8b,0x7e}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xea,0x1f,0xd4,0x21,0x3e,0xcb,0xa8,0x5d,0x42,0xb7,0x7c,0x89,0x96,0x63}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xf5,0xea,0x1f,0xd4,0x21,0x3e,0xcb,0xa8,0x5d,0x42,0xb7,0x7c,0x89,0x96,0x63}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x74,0x74,0x69,0x69,0x4e,0x4e,0x53,0x53}, + {0x00,0xd2,0xb9,0x6b,0x6f,0xbd,0xd6,0x04,0xde,0x0c,0x67,0xb5,0xb1,0x63,0x08,0xda}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xb9,0x6b,0x6f,0xbd,0xd6,0x04,0xde,0x0c,0x67,0xb5,0xb1,0x63,0x08,0xda}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xb9,0x6b,0x6f,0xbd,0xd6,0x04,0xc3,0x11,0x7a,0xa8,0xac,0x7e,0x15,0xc7}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xb9,0x6b,0x6f,0xbd,0xd6,0x04,0xc3,0x11,0x7a,0xa8,0xac,0x7e,0x15,0xc7}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xb9,0x6b,0x72,0xa0,0xcb,0x19,0xe4,0x36,0x5d,0x8f,0x96,0x44,0x2f,0xfd}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xb9,0x6b,0x72,0xa0,0xcb,0x19,0xe4,0x36,0x5d,0x8f,0x96,0x44,0x2f,0xfd}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xb9,0x6b,0x72,0xa0,0xcb,0x19,0xf9,0x2b,0x40,0x92,0x8b,0x59,0x32,0xe0}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xb9,0x6b,0x72,0xa0,0xcb,0x19,0xf9,0x2b,0x40,0x92,0x8b,0x59,0x32,0xe0}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xa4,0x76,0x55,0x87,0xf1,0x23,0xaa,0x78,0x0e,0xdc,0xff,0x2d,0x5b,0x89}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xa4,0x76,0x55,0x87,0xf1,0x23,0xaa,0x78,0x0e,0xdc,0xff,0x2d,0x5b,0x89}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xa4,0x76,0x55,0x87,0xf1,0x23,0xb7,0x65,0x13,0xc1,0xe2,0x30,0x46,0x94}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xa4,0x76,0x55,0x87,0xf1,0x23,0xb7,0x65,0x13,0xc1,0xe2,0x30,0x46,0x94}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xa4,0x76,0x48,0x9a,0xec,0x3e,0x90,0x42,0x34,0xe6,0xd8,0x0a,0x7c,0xae}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xa4,0x76,0x48,0x9a,0xec,0x3e,0x90,0x42,0x34,0xe6,0xd8,0x0a,0x7c,0xae}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xa4,0x76,0x48,0x9a,0xec,0x3e,0x8d,0x5f,0x29,0xfb,0xc5,0x17,0x61,0xb3}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xd2,0xa4,0x76,0x48,0x9a,0xec,0x3e,0x8d,0x5f,0x29,0xfb,0xc5,0x17,0x61,0xb3}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x83,0x4c,0x1b,0xd4,0x98,0x57,0x36,0xf9,0xb5,0x7a,0x2d,0xe2,0xae,0x61}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x83,0x4c,0x1b,0xd4,0x98,0x57,0x36,0xf9,0xb5,0x7a,0x2d,0xe2,0xae,0x61}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x83,0x4c,0x1b,0xd4,0x98,0x57,0x2b,0xe4,0xa8,0x67,0x30,0xff,0xb3,0x7c}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x83,0x4c,0x1b,0xd4,0x98,0x57,0x2b,0xe4,0xa8,0x67,0x30,0xff,0xb3,0x7c}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x83,0x4c,0x06,0xc9,0x85,0x4a,0x0c,0xc3,0x8f,0x40,0x0a,0xc5,0x89,0x46}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x83,0x4c,0x06,0xc9,0x85,0x4a,0x0c,0xc3,0x8f,0x40,0x0a,0xc5,0x89,0x46}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x83,0x4c,0x06,0xc9,0x85,0x4a,0x11,0xde,0x92,0x5d,0x17,0xd8,0x94,0x5b}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x83,0x4c,0x06,0xc9,0x85,0x4a,0x11,0xde,0x92,0x5d,0x17,0xd8,0x94,0x5b}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x9e,0x51,0x21,0xee,0xbf,0x70,0x42,0x8d,0xdc,0x13,0x63,0xac,0xfd,0x32}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x9e,0x51,0x21,0xee,0xbf,0x70,0x42,0x8d,0xdc,0x13,0x63,0xac,0xfd,0x32}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x9e,0x51,0x21,0xee,0xbf,0x70,0x5f,0x90,0xc1,0x0e,0x7e,0xb1,0xe0,0x2f}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x9e,0x51,0x21,0xee,0xbf,0x70,0x5f,0x90,0xc1,0x0e,0x7e,0xb1,0xe0,0x2f}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x9e,0x51,0x3c,0xf3,0xa2,0x6d,0x78,0xb7,0xe6,0x29,0x44,0x8b,0xda,0x15}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x9e,0x51,0x3c,0xf3,0xa2,0x6d,0x78,0xb7,0xe6,0x29,0x44,0x8b,0xda,0x15}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x9e,0x51,0x3c,0xf3,0xa2,0x6d,0x65,0xaa,0xfb,0x34,0x59,0x96,0xc7,0x08}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0xcf,0x9e,0x51,0x3c,0xf3,0xa2,0x6d,0x65,0xaa,0xfb,0x34,0x59,0x96,0xc7,0x08}, + {0x00,0x00,0x1d,0x1d,0x3a,0x3a,0x27,0x27,0x69,0x69,0x74,0x74,0x53,0x53,0x4e,0x4e}, + {0x00,0x9c,0x25,0xb9,0x4a,0xd6,0x6f,0xf3,0x94,0x08,0xb1,0x2d,0xde,0x42,0xfb,0x67}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x25,0xb9,0x4a,0xd6,0x6f,0xf3,0x94,0x08,0xb1,0x2d,0xde,0x42,0xfb,0x67}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x25,0xb9,0x4a,0xd6,0x6f,0xf3,0x89,0x15,0xac,0x30,0xc3,0x5f,0xe6,0x7a}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x25,0xb9,0x4a,0xd6,0x6f,0xf3,0x89,0x15,0xac,0x30,0xc3,0x5f,0xe6,0x7a}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x25,0xb9,0x57,0xcb,0x72,0xee,0xae,0x32,0x8b,0x17,0xf9,0x65,0xdc,0x40}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x25,0xb9,0x57,0xcb,0x72,0xee,0xae,0x32,0x8b,0x17,0xf9,0x65,0xdc,0x40}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x25,0xb9,0x57,0xcb,0x72,0xee,0xb3,0x2f,0x96,0x0a,0xe4,0x78,0xc1,0x5d}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x25,0xb9,0x57,0xcb,0x72,0xee,0xb3,0x2f,0x96,0x0a,0xe4,0x78,0xc1,0x5d}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x38,0xa4,0x70,0xec,0x48,0xd4,0xe0,0x7c,0xd8,0x44,0x90,0x0c,0xa8,0x34}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x38,0xa4,0x70,0xec,0x48,0xd4,0xe0,0x7c,0xd8,0x44,0x90,0x0c,0xa8,0x34}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x38,0xa4,0x70,0xec,0x48,0xd4,0xfd,0x61,0xc5,0x59,0x8d,0x11,0xb5,0x29}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x38,0xa4,0x70,0xec,0x48,0xd4,0xfd,0x61,0xc5,0x59,0x8d,0x11,0xb5,0x29}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x38,0xa4,0x6d,0xf1,0x55,0xc9,0xda,0x46,0xe2,0x7e,0xb7,0x2b,0x8f,0x13}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x38,0xa4,0x6d,0xf1,0x55,0xc9,0xda,0x46,0xe2,0x7e,0xb7,0x2b,0x8f,0x13}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x38,0xa4,0x6d,0xf1,0x55,0xc9,0xc7,0x5b,0xff,0x63,0xaa,0x36,0x92,0x0e}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x9c,0x38,0xa4,0x6d,0xf1,0x55,0xc9,0xc7,0x5b,0xff,0x63,0xaa,0x36,0x92,0x0e}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x1f,0x9e,0x3e,0xbf,0x21,0xa0,0x7c,0xfd,0x63,0xe2,0x42,0xc3,0x5d,0xdc}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x1f,0x9e,0x3e,0xbf,0x21,0xa0,0x7c,0xfd,0x63,0xe2,0x42,0xc3,0x5d,0xdc}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x1f,0x9e,0x3e,0xbf,0x21,0xa0,0x61,0xe0,0x7e,0xff,0x5f,0xde,0x40,0xc1}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x1f,0x9e,0x3e,0xbf,0x21,0xa0,0x61,0xe0,0x7e,0xff,0x5f,0xde,0x40,0xc1}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x1f,0x9e,0x23,0xa2,0x3c,0xbd,0x46,0xc7,0x59,0xd8,0x65,0xe4,0x7a,0xfb}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x1f,0x9e,0x23,0xa2,0x3c,0xbd,0x46,0xc7,0x59,0xd8,0x65,0xe4,0x7a,0xfb}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x1f,0x9e,0x23,0xa2,0x3c,0xbd,0x5b,0xda,0x44,0xc5,0x78,0xf9,0x67,0xe6}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x1f,0x9e,0x23,0xa2,0x3c,0xbd,0x5b,0xda,0x44,0xc5,0x78,0xf9,0x67,0xe6}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x02,0x83,0x04,0x85,0x06,0x87,0x08,0x89,0x0a,0x8b,0x0c,0x8d,0x0e,0x8f}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x02,0x83,0x04,0x85,0x06,0x87,0x08,0x89,0x0a,0x8b,0x0c,0x8d,0x0e,0x8f}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x02,0x83,0x04,0x85,0x06,0x87,0x15,0x94,0x17,0x96,0x11,0x90,0x13,0x92}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x02,0x83,0x04,0x85,0x06,0x87,0x15,0x94,0x17,0x96,0x11,0x90,0x13,0x92}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x02,0x83,0x19,0x98,0x1b,0x9a,0x32,0xb3,0x30,0xb1,0x2b,0xaa,0x29,0xa8}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x02,0x83,0x19,0x98,0x1b,0x9a,0x32,0xb3,0x30,0xb1,0x2b,0xaa,0x29,0xa8}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x02,0x83,0x19,0x98,0x1b,0x9a,0x2f,0xae,0x2d,0xac,0x36,0xb7,0x34,0xb5}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0x81,0x02,0x83,0x19,0x98,0x1b,0x9a,0x2f,0xae,0x2d,0xac,0x36,0xb7,0x34,0xb5}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x4e,0x4e,0x53,0x53,0x69,0x69,0x74,0x74}, + {0x00,0xa6,0x51,0xf7,0xa2,0x04,0xf3,0x55,0x59,0xff,0x08,0xae,0xfb,0x5d,0xaa,0x0c}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x51,0xf7,0xa2,0x04,0xf3,0x55,0x59,0xff,0x08,0xae,0xfb,0x5d,0xaa,0x0c}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x51,0xf7,0xa2,0x04,0xf3,0x55,0x44,0xe2,0x15,0xb3,0xe6,0x40,0xb7,0x11}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x51,0xf7,0xa2,0x04,0xf3,0x55,0x44,0xe2,0x15,0xb3,0xe6,0x40,0xb7,0x11}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x51,0xf7,0xbf,0x19,0xee,0x48,0x63,0xc5,0x32,0x94,0xdc,0x7a,0x8d,0x2b}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x51,0xf7,0xbf,0x19,0xee,0x48,0x63,0xc5,0x32,0x94,0xdc,0x7a,0x8d,0x2b}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x51,0xf7,0xbf,0x19,0xee,0x48,0x7e,0xd8,0x2f,0x89,0xc1,0x67,0x90,0x36}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x51,0xf7,0xbf,0x19,0xee,0x48,0x7e,0xd8,0x2f,0x89,0xc1,0x67,0x90,0x36}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x4c,0xea,0x98,0x3e,0xd4,0x72,0x2d,0x8b,0x61,0xc7,0xb5,0x13,0xf9,0x5f}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x4c,0xea,0x98,0x3e,0xd4,0x72,0x2d,0x8b,0x61,0xc7,0xb5,0x13,0xf9,0x5f}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x4c,0xea,0x98,0x3e,0xd4,0x72,0x30,0x96,0x7c,0xda,0xa8,0x0e,0xe4,0x42}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x4c,0xea,0x98,0x3e,0xd4,0x72,0x30,0x96,0x7c,0xda,0xa8,0x0e,0xe4,0x42}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x4c,0xea,0x85,0x23,0xc9,0x6f,0x17,0xb1,0x5b,0xfd,0x92,0x34,0xde,0x78}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x4c,0xea,0x85,0x23,0xc9,0x6f,0x17,0xb1,0x5b,0xfd,0x92,0x34,0xde,0x78}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x4c,0xea,0x85,0x23,0xc9,0x6f,0x0a,0xac,0x46,0xe0,0x8f,0x29,0xc3,0x65}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xa6,0x4c,0xea,0x85,0x23,0xc9,0x6f,0x0a,0xac,0x46,0xe0,0x8f,0x29,0xc3,0x65}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x6b,0xd0,0xd6,0x6d,0xbd,0x06,0xb1,0x0a,0xda,0x61,0x67,0xdc,0x0c,0xb7}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x6b,0xd0,0xd6,0x6d,0xbd,0x06,0xb1,0x0a,0xda,0x61,0x67,0xdc,0x0c,0xb7}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x6b,0xd0,0xd6,0x6d,0xbd,0x06,0xac,0x17,0xc7,0x7c,0x7a,0xc1,0x11,0xaa}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x6b,0xd0,0xd6,0x6d,0xbd,0x06,0xac,0x17,0xc7,0x7c,0x7a,0xc1,0x11,0xaa}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x6b,0xd0,0xcb,0x70,0xa0,0x1b,0x8b,0x30,0xe0,0x5b,0x40,0xfb,0x2b,0x90}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x6b,0xd0,0xcb,0x70,0xa0,0x1b,0x8b,0x30,0xe0,0x5b,0x40,0xfb,0x2b,0x90}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x6b,0xd0,0xcb,0x70,0xa0,0x1b,0x96,0x2d,0xfd,0x46,0x5d,0xe6,0x36,0x8d}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x6b,0xd0,0xcb,0x70,0xa0,0x1b,0x96,0x2d,0xfd,0x46,0x5d,0xe6,0x36,0x8d}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x76,0xcd,0xec,0x57,0x9a,0x21,0xc5,0x7e,0xb3,0x08,0x29,0x92,0x5f,0xe4}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x76,0xcd,0xec,0x57,0x9a,0x21,0xc5,0x7e,0xb3,0x08,0x29,0x92,0x5f,0xe4}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x76,0xcd,0xec,0x57,0x9a,0x21,0xd8,0x63,0xae,0x15,0x34,0x8f,0x42,0xf9}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x76,0xcd,0xec,0x57,0x9a,0x21,0xd8,0x63,0xae,0x15,0x34,0x8f,0x42,0xf9}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x76,0xcd,0xf1,0x4a,0x87,0x3c,0xff,0x44,0x89,0x32,0x0e,0xb5,0x78,0xc3}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x76,0xcd,0xf1,0x4a,0x87,0x3c,0xff,0x44,0x89,0x32,0x0e,0xb5,0x78,0xc3}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x76,0xcd,0xf1,0x4a,0x87,0x3c,0xe2,0x59,0x94,0x2f,0x13,0xa8,0x65,0xde}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, + {0x00,0xbb,0x76,0xcd,0xf1,0x4a,0x87,0x3c,0xe2,0x59,0x94,0x2f,0x13,0xa8,0x65,0xde}, + {0x00,0x00,0x1d,0x1d,0x27,0x27,0x3a,0x3a,0x53,0x53,0x4e,0x4e,0x74,0x74,0x69,0x69}, +}; diff --git a/module/zfs/vdev_raidz_math_sse_mul.h b/module/zfs/vdev_raidz_math_sse_mul.h new file mode 100644 index 000000000000..e3cbdffe6b64 --- /dev/null +++ b/module/zfs/vdev_raidz_math_sse_mul.h @@ -0,0 +1,13594 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (C) 2016 Gvozden Nešković. All rights reserved. + */ + +#ifndef _VDEV_RAIDZ_MATH_SSE_MUL_H +#define _VDEV_RAIDZ_MATH_SSE_MUL_H + +#include + +#if defined(_RAIDZ_TEST) +#include +#endif + +#define _SSE_SIZE (16) + +#define _MUL_IN1 "xmm0" +#define _MUL_IN2 "xmm1" + +#define _MUL_TMP1 "xmm10" +#define _MUL_TMP2 "xmm11" +#define _MUL_TMP3 "xmm12" + +#define _0F_MASK "xmm13" +#define _LT_LOW "xmm14" +#define _LT_UP "xmm15" + +extern const uint8_t sse_gf_mod_constants[2][16] __attribute__((aligned(256))); +extern const uint8_t sse_gf_mod_lt[2*256][16] __attribute__((aligned(256))); + +#define SETUP(a)\ +{\ + __asm("movdqa %0, %%" _0F_MASK : : "m" (sse_gf_mod_constants[0][0]));\ + __asm("movdqa %0, %%" _LT_LOW : : "m" (sse_gf_mod_lt[2*(a)+0][0]));\ + __asm("movdqa %0, %%" _LT_UP : : "m" (sse_gf_mod_lt[2*(a)+1][0]));\ +} + +#define MUL_MLOOKUP_x2_0()\ +{\ + __asm("pxor %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_1()\ +{} + +#define MUL_MLOOKUP_x2_2()\ +{\ + __asm("movdqa %0, %%" _MUL_TMP3 : : "m" (sse_gf_mod_constants[1][0]));\ + __asm("pxor %" _MUL_TMP1 ",%" _MUL_TMP1);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP2);\ + __asm("pcmpgtb %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("pcmpgtb %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _MUL_TMP3", %" _MUL_TMP1); /* 16x 0x1d */\ + __asm("pand %" _MUL_TMP3", %" _MUL_TMP2); /* 16x 0x1d */\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_TMP1 ",%" _MUL_IN1);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_3()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_4()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_5()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_6()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_7()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_8()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_9()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_10()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_11()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_12()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_13()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_14()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_15()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_16()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_17()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_18()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_19()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_20()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_21()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_22()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_23()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_24()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_25()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_26()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_27()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_28()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_29()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_30()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_31()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_32()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_33()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_34()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_35()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_36()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_37()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_38()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_39()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_40()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_41()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_42()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_43()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_44()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_45()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_46()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_47()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_48()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_49()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_50()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_51()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_52()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_53()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_54()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_55()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_56()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_57()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_58()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_59()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_60()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_61()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_62()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_63()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_64()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_65()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_66()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_67()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_68()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_69()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_70()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_71()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_72()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_73()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_74()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_75()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_76()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_77()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_78()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_79()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_80()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_81()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_82()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_83()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_84()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_85()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_86()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_87()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_88()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_89()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_90()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_91()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_92()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_93()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_94()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_95()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_96()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_97()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_98()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_99()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_100()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_101()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_102()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_103()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_104()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_105()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_106()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_107()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_108()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_109()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_110()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_111()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_112()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_113()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_114()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_115()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_116()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_117()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_118()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_119()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_120()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_121()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_122()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_123()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_124()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_125()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_126()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_127()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_128()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_129()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_130()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_131()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_132()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_133()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_134()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_135()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_136()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_137()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_138()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_139()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_140()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_141()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_142()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_143()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_144()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_145()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_146()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_147()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_148()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_149()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_150()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_151()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_152()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_153()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_154()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_155()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_156()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_157()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_158()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_159()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_160()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_161()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_162()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_163()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_164()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_165()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_166()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_167()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_168()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_169()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_170()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_171()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_172()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_173()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_174()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_175()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_176()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_177()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_178()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_179()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_180()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_181()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_182()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_183()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_184()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_185()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_186()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_187()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_188()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_189()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_190()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_191()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_192()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_193()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_194()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_195()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_196()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_197()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_198()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_199()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_200()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_201()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_202()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_203()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_204()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_205()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_206()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_207()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_208()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_209()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_210()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_211()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_212()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_213()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_214()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_215()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_216()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_217()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_218()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_219()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_220()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_221()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_222()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_223()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_224()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_225()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_226()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_227()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_228()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_229()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_230()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_231()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_232()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_233()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_234()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_235()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_236()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_237()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_238()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_239()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_240()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_241()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_242()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_243()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_244()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_245()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_246()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_247()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_248()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_249()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_250()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_251()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_252()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_253()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_254()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +#define MUL_MLOOKUP_x2_255()\ +{\ + /* loaded in _MUL_IN1, _MUL_IN2 */ \ + /* mod */ \ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("movdqa %" _LT_LOW ",%" _MUL_TMP3);\ + __asm("psrlq $0x4, %" _MUL_TMP1);\ + __asm("psrlq $0x4, %" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_LOW);\ + __asm("pshufb %" _MUL_TMP2 ",%" _MUL_TMP3);\ + __asm("movdqa %" _MUL_IN1 ",%" _MUL_TMP1);\ + __asm("movdqa %" _MUL_IN2 ",%" _MUL_TMP2);\ + __asm("pand %" _0F_MASK ", %" _MUL_TMP1);\ + __asm("pand %" _MUL_TMP2 ", %" _0F_MASK);\ + __asm("movdqa %" _LT_UP ",%" _MUL_TMP2);\ + __asm("pshufb %" _MUL_TMP1 ",%" _LT_UP);\ + __asm("pshufb %" _0F_MASK ",%" _MUL_TMP2);\ + __asm("pxor %" _LT_UP ",%" _LT_LOW);\ + __asm("pxor %" _MUL_TMP2 ",%" _MUL_TMP3);\ +\ + /* acc lower part */ \ + /* r ^= a << 0*/\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 1*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 2*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 3*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 4*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 5*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 6*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* r ^= a << 7*/\ + __asm("paddb %" _MUL_IN1 ",%" _MUL_IN1);\ + __asm("paddb %" _MUL_IN2 ",%" _MUL_IN2);\ + __asm("pxor %" _MUL_IN1 ",%" _LT_LOW);\ + __asm("pxor %" _MUL_IN2 ",%" _MUL_TMP3);\ + /* store in _MUL_IN1,_MUL_IN2 */ \ + __asm("movdqa %" _LT_LOW ",%" _MUL_IN1);\ + __asm("movdqa %" _MUL_TMP3 ",%" _MUL_IN2);\ +} + +static void mul_0(void){ MUL_MLOOKUP_x2_0(); } +static void mul_1(void){ } +static void mul_2(void){ MUL_MLOOKUP_x2_2(); } +static void mul_3(void){ SETUP(3); MUL_MLOOKUP_x2_3(); } +static void mul_4(void){ SETUP(4); MUL_MLOOKUP_x2_4(); } +static void mul_5(void){ SETUP(5); MUL_MLOOKUP_x2_5(); } +static void mul_6(void){ SETUP(6); MUL_MLOOKUP_x2_6(); } +static void mul_7(void){ SETUP(7); MUL_MLOOKUP_x2_7(); } +static void mul_8(void){ SETUP(8); MUL_MLOOKUP_x2_8(); } +static void mul_9(void){ SETUP(9); MUL_MLOOKUP_x2_9(); } +static void mul_10(void){ SETUP(10); MUL_MLOOKUP_x2_10(); } +static void mul_11(void){ SETUP(11); MUL_MLOOKUP_x2_11(); } +static void mul_12(void){ SETUP(12); MUL_MLOOKUP_x2_12(); } +static void mul_13(void){ SETUP(13); MUL_MLOOKUP_x2_13(); } +static void mul_14(void){ SETUP(14); MUL_MLOOKUP_x2_14(); } +static void mul_15(void){ SETUP(15); MUL_MLOOKUP_x2_15(); } +static void mul_16(void){ SETUP(16); MUL_MLOOKUP_x2_16(); } +static void mul_17(void){ SETUP(17); MUL_MLOOKUP_x2_17(); } +static void mul_18(void){ SETUP(18); MUL_MLOOKUP_x2_18(); } +static void mul_19(void){ SETUP(19); MUL_MLOOKUP_x2_19(); } +static void mul_20(void){ SETUP(20); MUL_MLOOKUP_x2_20(); } +static void mul_21(void){ SETUP(21); MUL_MLOOKUP_x2_21(); } +static void mul_22(void){ SETUP(22); MUL_MLOOKUP_x2_22(); } +static void mul_23(void){ SETUP(23); MUL_MLOOKUP_x2_23(); } +static void mul_24(void){ SETUP(24); MUL_MLOOKUP_x2_24(); } +static void mul_25(void){ SETUP(25); MUL_MLOOKUP_x2_25(); } +static void mul_26(void){ SETUP(26); MUL_MLOOKUP_x2_26(); } +static void mul_27(void){ SETUP(27); MUL_MLOOKUP_x2_27(); } +static void mul_28(void){ SETUP(28); MUL_MLOOKUP_x2_28(); } +static void mul_29(void){ SETUP(29); MUL_MLOOKUP_x2_29(); } +static void mul_30(void){ SETUP(30); MUL_MLOOKUP_x2_30(); } +static void mul_31(void){ SETUP(31); MUL_MLOOKUP_x2_31(); } +static void mul_32(void){ SETUP(32); MUL_MLOOKUP_x2_32(); } +static void mul_33(void){ SETUP(33); MUL_MLOOKUP_x2_33(); } +static void mul_34(void){ SETUP(34); MUL_MLOOKUP_x2_34(); } +static void mul_35(void){ SETUP(35); MUL_MLOOKUP_x2_35(); } +static void mul_36(void){ SETUP(36); MUL_MLOOKUP_x2_36(); } +static void mul_37(void){ SETUP(37); MUL_MLOOKUP_x2_37(); } +static void mul_38(void){ SETUP(38); MUL_MLOOKUP_x2_38(); } +static void mul_39(void){ SETUP(39); MUL_MLOOKUP_x2_39(); } +static void mul_40(void){ SETUP(40); MUL_MLOOKUP_x2_40(); } +static void mul_41(void){ SETUP(41); MUL_MLOOKUP_x2_41(); } +static void mul_42(void){ SETUP(42); MUL_MLOOKUP_x2_42(); } +static void mul_43(void){ SETUP(43); MUL_MLOOKUP_x2_43(); } +static void mul_44(void){ SETUP(44); MUL_MLOOKUP_x2_44(); } +static void mul_45(void){ SETUP(45); MUL_MLOOKUP_x2_45(); } +static void mul_46(void){ SETUP(46); MUL_MLOOKUP_x2_46(); } +static void mul_47(void){ SETUP(47); MUL_MLOOKUP_x2_47(); } +static void mul_48(void){ SETUP(48); MUL_MLOOKUP_x2_48(); } +static void mul_49(void){ SETUP(49); MUL_MLOOKUP_x2_49(); } +static void mul_50(void){ SETUP(50); MUL_MLOOKUP_x2_50(); } +static void mul_51(void){ SETUP(51); MUL_MLOOKUP_x2_51(); } +static void mul_52(void){ SETUP(52); MUL_MLOOKUP_x2_52(); } +static void mul_53(void){ SETUP(53); MUL_MLOOKUP_x2_53(); } +static void mul_54(void){ SETUP(54); MUL_MLOOKUP_x2_54(); } +static void mul_55(void){ SETUP(55); MUL_MLOOKUP_x2_55(); } +static void mul_56(void){ SETUP(56); MUL_MLOOKUP_x2_56(); } +static void mul_57(void){ SETUP(57); MUL_MLOOKUP_x2_57(); } +static void mul_58(void){ SETUP(58); MUL_MLOOKUP_x2_58(); } +static void mul_59(void){ SETUP(59); MUL_MLOOKUP_x2_59(); } +static void mul_60(void){ SETUP(60); MUL_MLOOKUP_x2_60(); } +static void mul_61(void){ SETUP(61); MUL_MLOOKUP_x2_61(); } +static void mul_62(void){ SETUP(62); MUL_MLOOKUP_x2_62(); } +static void mul_63(void){ SETUP(63); MUL_MLOOKUP_x2_63(); } +static void mul_64(void){ SETUP(64); MUL_MLOOKUP_x2_64(); } +static void mul_65(void){ SETUP(65); MUL_MLOOKUP_x2_65(); } +static void mul_66(void){ SETUP(66); MUL_MLOOKUP_x2_66(); } +static void mul_67(void){ SETUP(67); MUL_MLOOKUP_x2_67(); } +static void mul_68(void){ SETUP(68); MUL_MLOOKUP_x2_68(); } +static void mul_69(void){ SETUP(69); MUL_MLOOKUP_x2_69(); } +static void mul_70(void){ SETUP(70); MUL_MLOOKUP_x2_70(); } +static void mul_71(void){ SETUP(71); MUL_MLOOKUP_x2_71(); } +static void mul_72(void){ SETUP(72); MUL_MLOOKUP_x2_72(); } +static void mul_73(void){ SETUP(73); MUL_MLOOKUP_x2_73(); } +static void mul_74(void){ SETUP(74); MUL_MLOOKUP_x2_74(); } +static void mul_75(void){ SETUP(75); MUL_MLOOKUP_x2_75(); } +static void mul_76(void){ SETUP(76); MUL_MLOOKUP_x2_76(); } +static void mul_77(void){ SETUP(77); MUL_MLOOKUP_x2_77(); } +static void mul_78(void){ SETUP(78); MUL_MLOOKUP_x2_78(); } +static void mul_79(void){ SETUP(79); MUL_MLOOKUP_x2_79(); } +static void mul_80(void){ SETUP(80); MUL_MLOOKUP_x2_80(); } +static void mul_81(void){ SETUP(81); MUL_MLOOKUP_x2_81(); } +static void mul_82(void){ SETUP(82); MUL_MLOOKUP_x2_82(); } +static void mul_83(void){ SETUP(83); MUL_MLOOKUP_x2_83(); } +static void mul_84(void){ SETUP(84); MUL_MLOOKUP_x2_84(); } +static void mul_85(void){ SETUP(85); MUL_MLOOKUP_x2_85(); } +static void mul_86(void){ SETUP(86); MUL_MLOOKUP_x2_86(); } +static void mul_87(void){ SETUP(87); MUL_MLOOKUP_x2_87(); } +static void mul_88(void){ SETUP(88); MUL_MLOOKUP_x2_88(); } +static void mul_89(void){ SETUP(89); MUL_MLOOKUP_x2_89(); } +static void mul_90(void){ SETUP(90); MUL_MLOOKUP_x2_90(); } +static void mul_91(void){ SETUP(91); MUL_MLOOKUP_x2_91(); } +static void mul_92(void){ SETUP(92); MUL_MLOOKUP_x2_92(); } +static void mul_93(void){ SETUP(93); MUL_MLOOKUP_x2_93(); } +static void mul_94(void){ SETUP(94); MUL_MLOOKUP_x2_94(); } +static void mul_95(void){ SETUP(95); MUL_MLOOKUP_x2_95(); } +static void mul_96(void){ SETUP(96); MUL_MLOOKUP_x2_96(); } +static void mul_97(void){ SETUP(97); MUL_MLOOKUP_x2_97(); } +static void mul_98(void){ SETUP(98); MUL_MLOOKUP_x2_98(); } +static void mul_99(void){ SETUP(99); MUL_MLOOKUP_x2_99(); } +static void mul_100(void){ SETUP(100); MUL_MLOOKUP_x2_100(); } +static void mul_101(void){ SETUP(101); MUL_MLOOKUP_x2_101(); } +static void mul_102(void){ SETUP(102); MUL_MLOOKUP_x2_102(); } +static void mul_103(void){ SETUP(103); MUL_MLOOKUP_x2_103(); } +static void mul_104(void){ SETUP(104); MUL_MLOOKUP_x2_104(); } +static void mul_105(void){ SETUP(105); MUL_MLOOKUP_x2_105(); } +static void mul_106(void){ SETUP(106); MUL_MLOOKUP_x2_106(); } +static void mul_107(void){ SETUP(107); MUL_MLOOKUP_x2_107(); } +static void mul_108(void){ SETUP(108); MUL_MLOOKUP_x2_108(); } +static void mul_109(void){ SETUP(109); MUL_MLOOKUP_x2_109(); } +static void mul_110(void){ SETUP(110); MUL_MLOOKUP_x2_110(); } +static void mul_111(void){ SETUP(111); MUL_MLOOKUP_x2_111(); } +static void mul_112(void){ SETUP(112); MUL_MLOOKUP_x2_112(); } +static void mul_113(void){ SETUP(113); MUL_MLOOKUP_x2_113(); } +static void mul_114(void){ SETUP(114); MUL_MLOOKUP_x2_114(); } +static void mul_115(void){ SETUP(115); MUL_MLOOKUP_x2_115(); } +static void mul_116(void){ SETUP(116); MUL_MLOOKUP_x2_116(); } +static void mul_117(void){ SETUP(117); MUL_MLOOKUP_x2_117(); } +static void mul_118(void){ SETUP(118); MUL_MLOOKUP_x2_118(); } +static void mul_119(void){ SETUP(119); MUL_MLOOKUP_x2_119(); } +static void mul_120(void){ SETUP(120); MUL_MLOOKUP_x2_120(); } +static void mul_121(void){ SETUP(121); MUL_MLOOKUP_x2_121(); } +static void mul_122(void){ SETUP(122); MUL_MLOOKUP_x2_122(); } +static void mul_123(void){ SETUP(123); MUL_MLOOKUP_x2_123(); } +static void mul_124(void){ SETUP(124); MUL_MLOOKUP_x2_124(); } +static void mul_125(void){ SETUP(125); MUL_MLOOKUP_x2_125(); } +static void mul_126(void){ SETUP(126); MUL_MLOOKUP_x2_126(); } +static void mul_127(void){ SETUP(127); MUL_MLOOKUP_x2_127(); } +static void mul_128(void){ SETUP(128); MUL_MLOOKUP_x2_128(); } +static void mul_129(void){ SETUP(129); MUL_MLOOKUP_x2_129(); } +static void mul_130(void){ SETUP(130); MUL_MLOOKUP_x2_130(); } +static void mul_131(void){ SETUP(131); MUL_MLOOKUP_x2_131(); } +static void mul_132(void){ SETUP(132); MUL_MLOOKUP_x2_132(); } +static void mul_133(void){ SETUP(133); MUL_MLOOKUP_x2_133(); } +static void mul_134(void){ SETUP(134); MUL_MLOOKUP_x2_134(); } +static void mul_135(void){ SETUP(135); MUL_MLOOKUP_x2_135(); } +static void mul_136(void){ SETUP(136); MUL_MLOOKUP_x2_136(); } +static void mul_137(void){ SETUP(137); MUL_MLOOKUP_x2_137(); } +static void mul_138(void){ SETUP(138); MUL_MLOOKUP_x2_138(); } +static void mul_139(void){ SETUP(139); MUL_MLOOKUP_x2_139(); } +static void mul_140(void){ SETUP(140); MUL_MLOOKUP_x2_140(); } +static void mul_141(void){ SETUP(141); MUL_MLOOKUP_x2_141(); } +static void mul_142(void){ SETUP(142); MUL_MLOOKUP_x2_142(); } +static void mul_143(void){ SETUP(143); MUL_MLOOKUP_x2_143(); } +static void mul_144(void){ SETUP(144); MUL_MLOOKUP_x2_144(); } +static void mul_145(void){ SETUP(145); MUL_MLOOKUP_x2_145(); } +static void mul_146(void){ SETUP(146); MUL_MLOOKUP_x2_146(); } +static void mul_147(void){ SETUP(147); MUL_MLOOKUP_x2_147(); } +static void mul_148(void){ SETUP(148); MUL_MLOOKUP_x2_148(); } +static void mul_149(void){ SETUP(149); MUL_MLOOKUP_x2_149(); } +static void mul_150(void){ SETUP(150); MUL_MLOOKUP_x2_150(); } +static void mul_151(void){ SETUP(151); MUL_MLOOKUP_x2_151(); } +static void mul_152(void){ SETUP(152); MUL_MLOOKUP_x2_152(); } +static void mul_153(void){ SETUP(153); MUL_MLOOKUP_x2_153(); } +static void mul_154(void){ SETUP(154); MUL_MLOOKUP_x2_154(); } +static void mul_155(void){ SETUP(155); MUL_MLOOKUP_x2_155(); } +static void mul_156(void){ SETUP(156); MUL_MLOOKUP_x2_156(); } +static void mul_157(void){ SETUP(157); MUL_MLOOKUP_x2_157(); } +static void mul_158(void){ SETUP(158); MUL_MLOOKUP_x2_158(); } +static void mul_159(void){ SETUP(159); MUL_MLOOKUP_x2_159(); } +static void mul_160(void){ SETUP(160); MUL_MLOOKUP_x2_160(); } +static void mul_161(void){ SETUP(161); MUL_MLOOKUP_x2_161(); } +static void mul_162(void){ SETUP(162); MUL_MLOOKUP_x2_162(); } +static void mul_163(void){ SETUP(163); MUL_MLOOKUP_x2_163(); } +static void mul_164(void){ SETUP(164); MUL_MLOOKUP_x2_164(); } +static void mul_165(void){ SETUP(165); MUL_MLOOKUP_x2_165(); } +static void mul_166(void){ SETUP(166); MUL_MLOOKUP_x2_166(); } +static void mul_167(void){ SETUP(167); MUL_MLOOKUP_x2_167(); } +static void mul_168(void){ SETUP(168); MUL_MLOOKUP_x2_168(); } +static void mul_169(void){ SETUP(169); MUL_MLOOKUP_x2_169(); } +static void mul_170(void){ SETUP(170); MUL_MLOOKUP_x2_170(); } +static void mul_171(void){ SETUP(171); MUL_MLOOKUP_x2_171(); } +static void mul_172(void){ SETUP(172); MUL_MLOOKUP_x2_172(); } +static void mul_173(void){ SETUP(173); MUL_MLOOKUP_x2_173(); } +static void mul_174(void){ SETUP(174); MUL_MLOOKUP_x2_174(); } +static void mul_175(void){ SETUP(175); MUL_MLOOKUP_x2_175(); } +static void mul_176(void){ SETUP(176); MUL_MLOOKUP_x2_176(); } +static void mul_177(void){ SETUP(177); MUL_MLOOKUP_x2_177(); } +static void mul_178(void){ SETUP(178); MUL_MLOOKUP_x2_178(); } +static void mul_179(void){ SETUP(179); MUL_MLOOKUP_x2_179(); } +static void mul_180(void){ SETUP(180); MUL_MLOOKUP_x2_180(); } +static void mul_181(void){ SETUP(181); MUL_MLOOKUP_x2_181(); } +static void mul_182(void){ SETUP(182); MUL_MLOOKUP_x2_182(); } +static void mul_183(void){ SETUP(183); MUL_MLOOKUP_x2_183(); } +static void mul_184(void){ SETUP(184); MUL_MLOOKUP_x2_184(); } +static void mul_185(void){ SETUP(185); MUL_MLOOKUP_x2_185(); } +static void mul_186(void){ SETUP(186); MUL_MLOOKUP_x2_186(); } +static void mul_187(void){ SETUP(187); MUL_MLOOKUP_x2_187(); } +static void mul_188(void){ SETUP(188); MUL_MLOOKUP_x2_188(); } +static void mul_189(void){ SETUP(189); MUL_MLOOKUP_x2_189(); } +static void mul_190(void){ SETUP(190); MUL_MLOOKUP_x2_190(); } +static void mul_191(void){ SETUP(191); MUL_MLOOKUP_x2_191(); } +static void mul_192(void){ SETUP(192); MUL_MLOOKUP_x2_192(); } +static void mul_193(void){ SETUP(193); MUL_MLOOKUP_x2_193(); } +static void mul_194(void){ SETUP(194); MUL_MLOOKUP_x2_194(); } +static void mul_195(void){ SETUP(195); MUL_MLOOKUP_x2_195(); } +static void mul_196(void){ SETUP(196); MUL_MLOOKUP_x2_196(); } +static void mul_197(void){ SETUP(197); MUL_MLOOKUP_x2_197(); } +static void mul_198(void){ SETUP(198); MUL_MLOOKUP_x2_198(); } +static void mul_199(void){ SETUP(199); MUL_MLOOKUP_x2_199(); } +static void mul_200(void){ SETUP(200); MUL_MLOOKUP_x2_200(); } +static void mul_201(void){ SETUP(201); MUL_MLOOKUP_x2_201(); } +static void mul_202(void){ SETUP(202); MUL_MLOOKUP_x2_202(); } +static void mul_203(void){ SETUP(203); MUL_MLOOKUP_x2_203(); } +static void mul_204(void){ SETUP(204); MUL_MLOOKUP_x2_204(); } +static void mul_205(void){ SETUP(205); MUL_MLOOKUP_x2_205(); } +static void mul_206(void){ SETUP(206); MUL_MLOOKUP_x2_206(); } +static void mul_207(void){ SETUP(207); MUL_MLOOKUP_x2_207(); } +static void mul_208(void){ SETUP(208); MUL_MLOOKUP_x2_208(); } +static void mul_209(void){ SETUP(209); MUL_MLOOKUP_x2_209(); } +static void mul_210(void){ SETUP(210); MUL_MLOOKUP_x2_210(); } +static void mul_211(void){ SETUP(211); MUL_MLOOKUP_x2_211(); } +static void mul_212(void){ SETUP(212); MUL_MLOOKUP_x2_212(); } +static void mul_213(void){ SETUP(213); MUL_MLOOKUP_x2_213(); } +static void mul_214(void){ SETUP(214); MUL_MLOOKUP_x2_214(); } +static void mul_215(void){ SETUP(215); MUL_MLOOKUP_x2_215(); } +static void mul_216(void){ SETUP(216); MUL_MLOOKUP_x2_216(); } +static void mul_217(void){ SETUP(217); MUL_MLOOKUP_x2_217(); } +static void mul_218(void){ SETUP(218); MUL_MLOOKUP_x2_218(); } +static void mul_219(void){ SETUP(219); MUL_MLOOKUP_x2_219(); } +static void mul_220(void){ SETUP(220); MUL_MLOOKUP_x2_220(); } +static void mul_221(void){ SETUP(221); MUL_MLOOKUP_x2_221(); } +static void mul_222(void){ SETUP(222); MUL_MLOOKUP_x2_222(); } +static void mul_223(void){ SETUP(223); MUL_MLOOKUP_x2_223(); } +static void mul_224(void){ SETUP(224); MUL_MLOOKUP_x2_224(); } +static void mul_225(void){ SETUP(225); MUL_MLOOKUP_x2_225(); } +static void mul_226(void){ SETUP(226); MUL_MLOOKUP_x2_226(); } +static void mul_227(void){ SETUP(227); MUL_MLOOKUP_x2_227(); } +static void mul_228(void){ SETUP(228); MUL_MLOOKUP_x2_228(); } +static void mul_229(void){ SETUP(229); MUL_MLOOKUP_x2_229(); } +static void mul_230(void){ SETUP(230); MUL_MLOOKUP_x2_230(); } +static void mul_231(void){ SETUP(231); MUL_MLOOKUP_x2_231(); } +static void mul_232(void){ SETUP(232); MUL_MLOOKUP_x2_232(); } +static void mul_233(void){ SETUP(233); MUL_MLOOKUP_x2_233(); } +static void mul_234(void){ SETUP(234); MUL_MLOOKUP_x2_234(); } +static void mul_235(void){ SETUP(235); MUL_MLOOKUP_x2_235(); } +static void mul_236(void){ SETUP(236); MUL_MLOOKUP_x2_236(); } +static void mul_237(void){ SETUP(237); MUL_MLOOKUP_x2_237(); } +static void mul_238(void){ SETUP(238); MUL_MLOOKUP_x2_238(); } +static void mul_239(void){ SETUP(239); MUL_MLOOKUP_x2_239(); } +static void mul_240(void){ SETUP(240); MUL_MLOOKUP_x2_240(); } +static void mul_241(void){ SETUP(241); MUL_MLOOKUP_x2_241(); } +static void mul_242(void){ SETUP(242); MUL_MLOOKUP_x2_242(); } +static void mul_243(void){ SETUP(243); MUL_MLOOKUP_x2_243(); } +static void mul_244(void){ SETUP(244); MUL_MLOOKUP_x2_244(); } +static void mul_245(void){ SETUP(245); MUL_MLOOKUP_x2_245(); } +static void mul_246(void){ SETUP(246); MUL_MLOOKUP_x2_246(); } +static void mul_247(void){ SETUP(247); MUL_MLOOKUP_x2_247(); } +static void mul_248(void){ SETUP(248); MUL_MLOOKUP_x2_248(); } +static void mul_249(void){ SETUP(249); MUL_MLOOKUP_x2_249(); } +static void mul_250(void){ SETUP(250); MUL_MLOOKUP_x2_250(); } +static void mul_251(void){ SETUP(251); MUL_MLOOKUP_x2_251(); } +static void mul_252(void){ SETUP(252); MUL_MLOOKUP_x2_252(); } +static void mul_253(void){ SETUP(253); MUL_MLOOKUP_x2_253(); } +static void mul_254(void){ SETUP(254); MUL_MLOOKUP_x2_254(); } +static void mul_255(void){ SETUP(255); MUL_MLOOKUP_x2_255(); } + +typedef void (*mul_fn_ptr_t)(void); + +static const mul_fn_ptr_t __attribute__((aligned(256))) +gf_mul_fns[256] = { + mul_0, mul_1, mul_2, mul_3, mul_4, mul_5, mul_6, mul_7, + mul_8, mul_9, mul_10, mul_11, mul_12, mul_13, mul_14, mul_15, + mul_16, mul_17, mul_18, mul_19, mul_20, mul_21, mul_22, mul_23, + mul_24, mul_25, mul_26, mul_27, mul_28, mul_29, mul_30, mul_31, + mul_32, mul_33, mul_34, mul_35, mul_36, mul_37, mul_38, mul_39, + mul_40, mul_41, mul_42, mul_43, mul_44, mul_45, mul_46, mul_47, + mul_48, mul_49, mul_50, mul_51, mul_52, mul_53, mul_54, mul_55, + mul_56, mul_57, mul_58, mul_59, mul_60, mul_61, mul_62, mul_63, + mul_64, mul_65, mul_66, mul_67, mul_68, mul_69, mul_70, mul_71, + mul_72, mul_73, mul_74, mul_75, mul_76, mul_77, mul_78, mul_79, + mul_80, mul_81, mul_82, mul_83, mul_84, mul_85, mul_86, mul_87, + mul_88, mul_89, mul_90, mul_91, mul_92, mul_93, mul_94, mul_95, + mul_96, mul_97, mul_98, mul_99, mul_100, mul_101, mul_102, mul_103, + mul_104, mul_105, mul_106, mul_107, mul_108, mul_109, mul_110, mul_111, + mul_112, mul_113, mul_114, mul_115, mul_116, mul_117, mul_118, mul_119, + mul_120, mul_121, mul_122, mul_123, mul_124, mul_125, mul_126, mul_127, + mul_128, mul_129, mul_130, mul_131, mul_132, mul_133, mul_134, mul_135, + mul_136, mul_137, mul_138, mul_139, mul_140, mul_141, mul_142, mul_143, + mul_144, mul_145, mul_146, mul_147, mul_148, mul_149, mul_150, mul_151, + mul_152, mul_153, mul_154, mul_155, mul_156, mul_157, mul_158, mul_159, + mul_160, mul_161, mul_162, mul_163, mul_164, mul_165, mul_166, mul_167, + mul_168, mul_169, mul_170, mul_171, mul_172, mul_173, mul_174, mul_175, + mul_176, mul_177, mul_178, mul_179, mul_180, mul_181, mul_182, mul_183, + mul_184, mul_185, mul_186, mul_187, mul_188, mul_189, mul_190, mul_191, + mul_192, mul_193, mul_194, mul_195, mul_196, mul_197, mul_198, mul_199, + mul_200, mul_201, mul_202, mul_203, mul_204, mul_205, mul_206, mul_207, + mul_208, mul_209, mul_210, mul_211, mul_212, mul_213, mul_214, mul_215, + mul_216, mul_217, mul_218, mul_219, mul_220, mul_221, mul_222, mul_223, + mul_224, mul_225, mul_226, mul_227, mul_228, mul_229, mul_230, mul_231, + mul_232, mul_233, mul_234, mul_235, mul_236, mul_237, mul_238, mul_239, + mul_240, mul_241, mul_242, mul_243, mul_244, mul_245, mul_246, mul_247, + mul_248, mul_249, mul_250, mul_251, mul_252, mul_253, mul_254, mul_255, + }; + + +#endif /*_VDEV_RAIDZ_MATH_SSE_MUL_H */ diff --git a/module/zfs/vdev_raidz_math_x86simd.h b/module/zfs/vdev_raidz_math_x86simd.h new file mode 100644 index 000000000000..b583f4db5e87 --- /dev/null +++ b/module/zfs/vdev_raidz_math_x86simd.h @@ -0,0 +1,583 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (C) 2016 Gvozden Nešković. All rights reserved. + */ + +#ifndef _VDEV_RAIDZ_MATH_X86SIMD_H +#define _VDEV_RAIDZ_MATH_X86SIMD_H + +#include + +#if defined(_RAIDZ_TEST) +#include +#define P2ROUNDUP(x, align) (-(-(x) & -(align))) +#endif + +static inline void +raidz_flush_data(void) +{ + FLUSH(); +} + +static inline size_t +gen_p_block(elem_t *p, const elem_t **data, + const size_t nd, const size_t off) +{ + size_t c; + +#define G_P_P 0,1,2,3 + + PREFETCHNTA(data[0] + off, 4, 4); + + LOAD(data[0] + off, G_P_P); + for (c = 1; c < nd; c++) { + PREFETCHNTA(data[c] + off, 4, 4); + + XOR_ACC(data[c] + off, G_P_P); + } + + STREAM_STORE(p + off, G_P_P); + return (4); +} + +static inline size_t +gen_pq_block(elem_t *p, elem_t *q, const elem_t **data, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + +#define G_PQ_P 0,1,2,3 +#define G_PQ_Q 4,5,6,7 + + PREFETCHNTA(data[0] + off, 4, 4); + + MUL2_SETUP(); + + LOAD(data[0] + off, G_PQ_P); + COPY(G_PQ_P, G_PQ_Q); + + for (c = 1; c < nld; c++) { + PREFETCHNTA(data[c] + off, 4, 4); + MUL2(G_PQ_Q); + + LOAD(data[c] + off, 8,9,10,11); + XOR(8,9,10,11, G_PQ_P); + XOR(8,9,10,11, G_PQ_Q); + } + + STREAM_STORE(p + off, G_PQ_P); + + for (; c < nd; c++) { + MUL2(G_PQ_Q); + } + + STREAM_STORE(q + off, G_PQ_Q); + + return (4); +} + +static inline size_t +gen_pqr_block(elem_t *p, elem_t *q, elem_t *r, const elem_t **data, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + +#define G_PQR_P 0,1,2,3 +#define G_PQR_Q 4,5,6,7 +#define G_PQR_R 8,9,10,11 + +#define G_PQR_P_1 0,1 +#define G_PQR_P_2 2,3 +#define G_PQR_Q_1 4,5 +#define G_PQR_Q_2 6,7 +#define G_PQR_R_1 8,9 +#define G_PQR_R_2 10,11 + + PREFETCHNTA(data[0] + off, 4, 4); + + MUL2_SETUP(); + + LOAD(data[0] + off, G_PQR_P); + COPY(G_PQR_P, G_PQR_Q); + COPY(G_PQR_P, G_PQR_R); + + for (c = 1; c < nld; c++) { + PREFETCHNTA(data[c] + off, 4, 4); + + MUL2(G_PQR_Q); + MUL4(G_PQR_R); + + LOAD(data[c] + off, 12,13); + XOR(12,13, G_PQR_P_1); + XOR(12,13, G_PQR_Q_1); + XOR(12,13, G_PQR_R_1); + + LOAD(data[c] + off + 2, 12,13); + XOR(12,13, G_PQR_P_2); + XOR(12,13, G_PQR_Q_2); + XOR(12,13, G_PQR_R_2); + } + + STREAM_STORE(p + off, G_PQR_P); + + for (; c < nd; c++) { + MUL2(G_PQR_Q); + MUL4(G_PQR_R); + } + + STREAM_STORE(q + off, G_PQR_Q); + STREAM_STORE(r + off, G_PQR_R); + + return (4); +} + +static inline size_t +rec_p_block(elem_t *p_col, elem_t **d_cols, + const size_t xidx, + const size_t nd, + const size_t off) +{ + size_t c; + elem_t *const x_col = d_cols[xidx]; + +#define R_P_P 0,1,2,3 + + PREFETCHNTA(p_col + off, 0, 4); + + ZERO(R_P_P); + + for (c = 0; c < nd; c++) { + PREFETCHNTA(d_cols[c] + off, 4, 4); + + if(c != xidx) { + XOR_ACC(d_cols[c] + off, R_P_P); + } + } + + XOR_ACC(p_col + off, R_P_P); + STREAM_STORE(x_col + off, R_P_P); + + return (4); +} + +static inline size_t +rec_q_block(elem_t *q_col, elem_t **d_cols, + const size_t xidx, + const int x_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + elem_t *const x_col = d_cols[xidx]; + +#define R_Q_Q 0,1 + + PREFETCHNTA(q_col + off, 0, 2); + + MUL2_SETUP(); + ZERO(R_Q_Q); + + for (c = 0; c < nld; c++) { + PREFETCHNTA(d_cols[c] + off, 2, 2); + + MUL2(R_Q_Q); + + if(c != xidx) { + XOR_ACC(d_cols[c] + off, R_Q_Q); + } + } + + for (; c < nd; c++) { + MUL2(R_Q_Q); + } + + XOR_ACC(q_col + off, R_Q_Q); + + /* MUL_x4(x_mul, 0,1); */ + gf_mul_fns[x_mul](); + + STREAM_STORE(x_col + off, R_Q_Q); + return (2); +} + +static inline size_t +rec_r_block(elem_t *r_col, elem_t **d_cols, + const size_t xidx, + const int x_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c = 0; + elem_t *const x_col = d_cols[xidx]; + +#define R_R_R 0,1 + + PREFETCHNTA(r_col + off, 0, 2); + + MUL2_SETUP(); + ZERO(R_R_R); + + for (c = 0; c < nld; c++) { + PREFETCHNTA(d_cols[c] + off, 2, 2); + + MUL4(R_R_R); + + if(c != xidx) { + XOR_ACC(d_cols[c] + off, R_R_R); + } + } + + for (; c < nd; c++) { + MUL4(R_R_R); + } + + XOR_ACC(r_col + off, R_R_R); + + /* MUL(x_mul, 0); */ + gf_mul_fns[x_mul](); + STREAM_STORE(x_col + off, R_R_R); + + return (2); +} + +static inline size_t +rec_pq_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t xsize, const size_t ysize, + const int a_mul, const int b_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + + elem_t *const p_col = (elem_t *) codes[0]; + elem_t *const q_col = (elem_t *) codes[1]; + elem_t **const src = (elem_t **) data; + elem_t *const x_col = src[x]; + elem_t *const y_col = src[y]; + + PREFETCHNTA(p_col + off, 0, 2); + PREFETCHNTA(q_col + off, 0, 2); + +#define R_PQ_P 0,1 +#define R_PQ_Q 2,3 + + MUL2_SETUP(); + ZERO(R_PQ_P); + ZERO(R_PQ_Q); + + for (c = 0; c < nld; c++) { + PREFETCHNTA(data[c] + off, 2, 2); + + MUL2(R_PQ_Q); + + if (c != x && c != y) { + LOAD(data[c] + off, 4,5); + XOR(4,5, R_PQ_P); + XOR(4,5, R_PQ_Q); + } + } + + for (; c < nd; c++) { + MUL2(R_PQ_Q); + } + + XOR_ACC(p_col + off, R_PQ_P); + XOR_ACC(q_col + off, R_PQ_Q); + + /* Save Pxy */ + COPY(R_PQ_P, 4,5); + + /* Calc X */ + //MUL_x4(a_mul, 0); + gf_mul_fns[a_mul](); + COPY(R_PQ_P, 6,7); + + //MUL_x4(b_mul, 1); + COPY(R_PQ_Q, R_PQ_P); + gf_mul_fns[b_mul](); + + XOR(6,7, R_PQ_P); + STREAM_STORE(x_col + off, R_PQ_P); + + if (xsize == ysize) { + /* Calc Y */ + XOR(4,5, R_PQ_P); + STREAM_STORE(y_col + off, R_PQ_P); + } + + return (2); +} + +static inline size_t +rec_pr_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t xsize, const size_t ysize, + const int a_mul, const int b_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + + elem_t *const p_col = (elem_t *) codes[0]; + elem_t *const r_col = (elem_t *) codes[2]; + elem_t **const src = (elem_t **) data; + elem_t *const x_col = src[x]; + elem_t *const y_col = src[y]; + +#define R_PR_P 0,1 +#define R_PR_R 2,3 + + PREFETCHNTA(p_col + off, 0, 2); + PREFETCHNTA(r_col + off, 0, 2); + + MUL2_SETUP(); + ZERO(R_PR_P); + ZERO(R_PR_R); + + for (c = 0; c < nld; c++) { + PREFETCHNTA(data[c] + off, 2, 2); + MUL4(R_PR_R); + if (c != x && c != y) { + LOAD(data[c] + off, 4,5); + XOR(4,5, R_PR_P); + XOR(4,5, R_PR_R); + } + } + + for (; c < nd; c++) { + MUL4(R_PR_R); + } + + XOR_ACC(p_col + off, R_PR_P); + XOR_ACC(r_col + off, R_PR_R); + + /* Save Pxy */ + COPY(R_PR_P, 4,5); + + /* Calc X */ + /* MUL(a_mul, 0); */ + gf_mul_fns[a_mul](); + COPY(R_PR_P, 6,7); + + //MUL(b_mul, 1); + COPY(R_PR_R, R_PR_P); + gf_mul_fns[b_mul](); + + XOR(6,7, R_PR_P); + STREAM_STORE(x_col + off, R_PR_P); + + if (xsize == ysize) { + /* Calc Y */ + XOR(4,5, R_PR_P); + STREAM_STORE(y_col + off, R_PR_P); + } + + return (2); +} + +static inline __attribute__((always_inline)) size_t +rec_qr_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t xsize, const size_t ysize, + const int xq_mul, const int x_mul, + const int yq_mul, const int y_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + + elem_t *const q_col = (elem_t *) codes[1]; + elem_t *const r_col = (elem_t *) codes[2]; + elem_t *const x_col = data[x]; + elem_t *const y_col = data[y]; + +#define R_QR_P 0,1 +#define R_QR_R 2,3 + + PREFETCHNTA(q_col + off, 0, 2); + PREFETCHNTA(r_col + off, 0, 2); + + MUL2_SETUP(); + ZERO(R_QR_P); + ZERO(R_QR_R); + + for (c = 0; c < nld; c++) { + PREFETCHNTA(data[c] + off, 2, 2); + + MUL2(R_QR_P); + MUL4(R_QR_R); + + if (c != x && c != y) { + LOAD(data[c] + off, 4,5); + XOR(4,5, R_QR_P); + XOR(4,5, R_QR_R); + } + } + + for (; c < nd; c++) { + MUL2(R_QR_P); + MUL4(R_QR_R); + } + + XOR_ACC(q_col + off, R_QR_P); + XOR_ACC(r_col + off, R_QR_R); + + /* Calc X */ + COPY(R_QR_P, 4,5); + + /* X = Q * xqm + MUL(xq_mul, 0); */ + gf_mul_fns[xq_mul](); + + XOR(R_QR_R, R_QR_P); /* X = R ^ X */ + + /* X = X * xm + MUL(x_mul, 0); */ + gf_mul_fns[x_mul](); + STREAM_STORE(x_col + off, R_QR_P); + + if (xsize == ysize) { + /* Calc Y */ + /* X = Q * xqm + MUL(yq_mul, R_QR_P); */ + COPY(4,5, R_QR_P); + gf_mul_fns[yq_mul](); + + XOR(R_QR_R, R_QR_P); /* X = R ^ X */ + + /* X = X * xm + MUL(y_mul, R_QR_P); */ + gf_mul_fns[y_mul](); + STREAM_STORE(y_col + off, R_QR_P); + } + + return (2); +} + +static inline __attribute__((always_inline)) size_t +rec_pqr_block(const elem_t **codes, elem_t **data, + const size_t x, const size_t y, + const size_t z, + const size_t xsize, const size_t ysize, + const size_t zsize, + const int xp_mul, const int xq_mul, + const int xr_mul, + const int yp_mul, const int yq_mul, + const int upd_q_mul, + const size_t nd, const size_t nld, + const size_t off) +{ + size_t c; + + elem_t *const p_col = (elem_t *) codes[0]; + elem_t *const q_col = (elem_t *) codes[1]; + elem_t *const r_col = (elem_t *) codes[2]; + elem_t *const x_col = data[x]; + elem_t *const y_col = data[y]; + elem_t *const z_col = data[z]; + +#define R_PQR_P 0,1 +#define R_PQR_Q 2,3 +#define R_PQR_R 4,5 + + PREFETCHNTA(p_col + off, 0, 2); + PREFETCHNTA(q_col + off, 0, 2); + PREFETCHNTA(r_col + off, 0, 2); + + MUL2_SETUP(); + ZERO(R_PQR_P); + ZERO(R_PQR_Q); + ZERO(R_PQR_R); + + for (c = 0; c < nld; c++) { + PREFETCHNTA(data[c] + off, 2, 2); + + MUL2(R_PQR_Q); + MUL4(R_PQR_R); + + if (c != x && c != y && c != z) { + LOAD(data[c] + off, 6,7); + XOR(6,7, R_PQR_P); + XOR(6,7, R_PQR_Q); + XOR(6,7, R_PQR_R); + } + } + + for (; c < nd; c++) { + MUL2(R_PQR_Q); + MUL4(R_PQR_R); + } + + XOR_ACC(p_col + off, R_PQR_P); + XOR_ACC(q_col + off, R_PQR_Q); + XOR_ACC(r_col + off, R_PQR_R); + + /* Calc X */ + COPY(R_PQR_P, 6,7); + + //MUL(xp_mul, 0); + gf_mul_fns[xp_mul](); + COPY(R_PQR_P, 8,9); + COPY(R_PQR_Q, R_PQR_P); + gf_mul_fns[xq_mul](); + XOR(R_PQR_P, 8,9); + + /* MUL(xr_mul, 4); */ + COPY(R_PQR_R, R_PQR_P); + gf_mul_fns[xr_mul](); + XOR(8,9, R_PQR_P); + + STREAM_STORE(x_col + off, R_PQR_P); + + if (ysize == xsize) { + /* Calc Y */ + XOR(R_PQR_P, 6,7); + /* MUL(upd_q_mul, 0); */ + gf_mul_fns[upd_q_mul](); + XOR(R_PQR_P, R_PQR_Q); + + /* MUL(yp_mul, 6); */ + COPY(6,7, R_PQR_P); + gf_mul_fns[yp_mul](); + COPY(R_PQR_P, 8,9); + + /* MUL(yq_mul, 1); */ + COPY(R_PQR_Q, R_PQR_P); + gf_mul_fns[yq_mul](); + XOR(8,9, R_PQR_P); + + STREAM_STORE(y_col + off, R_PQR_P); + + if (zsize == xsize) { + /* Calc Z */ + XOR(6,7, R_PQR_P); + STREAM_STORE(z_col + off, R_PQR_P); + } + } + return (2); +} + +#endif /* _VDEV_RAIDZ_MATH_X86SIMD_H */ diff --git a/module/zfs/zfs_vfsops.c b/module/zfs/zfs_vfsops.c index 7696071f1fe7..e106dfb03237 100644 --- a/module/zfs/zfs_vfsops.c +++ b/module/zfs/zfs_vfsops.c @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -1775,6 +1776,7 @@ EXPORT_SYMBOL(zfs_get_zplprop); void zfs_init(void) { + vdev_raidz_math_init(); zfsctl_init(); zfs_znode_init(); dmu_objset_register_type(DMU_OST_ZFS, zfs_space_delta_cb);