Warning, file /libraries/qca/src/botantools/botan/mp_comba.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002 Copyright (C) 1999-2007 The Botan Project. All rights reserved.
0003 
0004 Redistribution and use in source and binary forms, for any use, with or without
0005 modification, is permitted provided that the following conditions are met:
0006 
0007 1. Redistributions of source code must retain the above copyright notice, this
0008 list of conditions, and the following disclaimer.
0009 
0010 2. Redistributions in binary form must reproduce the above copyright notice,
0011 this list of conditions, and the following disclaimer in the documentation
0012 and/or other materials provided with the distribution.
0013 
0014 THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) "AS IS" AND ANY EXPRESS OR IMPLIED
0015 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
0016 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
0017 
0018 IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE FOR ANY DIRECT,
0019 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
0020 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
0021 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
0022 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
0023 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
0024 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0025 */
0026 // LICENSEHEADER_END
0027 namespace QCA { // WRAPNS_LINE
0028 /*************************************************
0029  * Comba Multiplication and Squaring Source File  *
0030  * (C) 1999-2007 The Botan Project                *
0031  *************************************************/
0032 
0033 } // WRAPNS_LINE
0034 #include <botan/mp_core.h>
0035 namespace QCA { // WRAPNS_LINE
0036 } // WRAPNS_LINE
0037 #include <botan/mp_asmi.h>
0038 namespace QCA { // WRAPNS_LINE
0039 
0040 namespace Botan {
0041 
0042 extern "C" {
0043 
0044 /*************************************************
0045  * Comba 4x4 Multiplication                       *
0046  *************************************************/
0047 void bigint_comba_mul4(word z[8], const word x[4], const word y[4])
0048 {
0049     word w2 = 0, w1 = 0, w0 = 0;
0050 
0051     word3_muladd(&w2, &w1, &w0, x[0], y[0]);
0052     z[0] = w0;
0053     w0   = w1;
0054     w1   = w2;
0055     w2   = 0;
0056 
0057     word3_muladd(&w2, &w1, &w0, x[0], y[1]);
0058     word3_muladd(&w2, &w1, &w0, x[1], y[0]);
0059     z[1] = w0;
0060     w0   = w1;
0061     w1   = w2;
0062     w2   = 0;
0063 
0064     word3_muladd(&w2, &w1, &w0, x[0], y[2]);
0065     word3_muladd(&w2, &w1, &w0, x[1], y[1]);
0066     word3_muladd(&w2, &w1, &w0, x[2], y[0]);
0067     z[2] = w0;
0068     w0   = w1;
0069     w1   = w2;
0070     w2   = 0;
0071 
0072     word3_muladd(&w2, &w1, &w0, x[0], y[3]);
0073     word3_muladd(&w2, &w1, &w0, x[1], y[2]);
0074     word3_muladd(&w2, &w1, &w0, x[2], y[1]);
0075     word3_muladd(&w2, &w1, &w0, x[3], y[0]);
0076     z[3] = w0;
0077     w0   = w1;
0078     w1   = w2;
0079     w2   = 0;
0080 
0081     word3_muladd(&w2, &w1, &w0, x[1], y[3]);
0082     word3_muladd(&w2, &w1, &w0, x[2], y[2]);
0083     word3_muladd(&w2, &w1, &w0, x[3], y[1]);
0084     z[4] = w0;
0085     w0   = w1;
0086     w1   = w2;
0087     w2   = 0;
0088 
0089     word3_muladd(&w2, &w1, &w0, x[2], y[3]);
0090     word3_muladd(&w2, &w1, &w0, x[3], y[2]);
0091     z[5] = w0;
0092     w0   = w1;
0093     w1   = w2;
0094     w2   = 0;
0095 
0096     word3_muladd(&w2, &w1, &w0, x[3], y[3]);
0097     z[6] = w0;
0098     z[7] = w1;
0099 }
0100 
0101 /*************************************************
0102  * Comba 6x6 Multiplication                       *
0103  *************************************************/
0104 void bigint_comba_mul6(word z[12], const word x[6], const word y[6])
0105 {
0106     word w2 = 0, w1 = 0, w0 = 0;
0107 
0108     word3_muladd(&w2, &w1, &w0, x[0], y[0]);
0109     z[0] = w0;
0110     w0   = w1;
0111     w1   = w2;
0112     w2   = 0;
0113 
0114     word3_muladd(&w2, &w1, &w0, x[0], y[1]);
0115     word3_muladd(&w2, &w1, &w0, x[1], y[0]);
0116     z[1] = w0;
0117     w0   = w1;
0118     w1   = w2;
0119     w2   = 0;
0120 
0121     word3_muladd(&w2, &w1, &w0, x[0], y[2]);
0122     word3_muladd(&w2, &w1, &w0, x[1], y[1]);
0123     word3_muladd(&w2, &w1, &w0, x[2], y[0]);
0124     z[2] = w0;
0125     w0   = w1;
0126     w1   = w2;
0127     w2   = 0;
0128 
0129     word3_muladd(&w2, &w1, &w0, x[0], y[3]);
0130     word3_muladd(&w2, &w1, &w0, x[1], y[2]);
0131     word3_muladd(&w2, &w1, &w0, x[2], y[1]);
0132     word3_muladd(&w2, &w1, &w0, x[3], y[0]);
0133     z[3] = w0;
0134     w0   = w1;
0135     w1   = w2;
0136     w2   = 0;
0137 
0138     word3_muladd(&w2, &w1, &w0, x[0], y[4]);
0139     word3_muladd(&w2, &w1, &w0, x[1], y[3]);
0140     word3_muladd(&w2, &w1, &w0, x[2], y[2]);
0141     word3_muladd(&w2, &w1, &w0, x[3], y[1]);
0142     word3_muladd(&w2, &w1, &w0, x[4], y[0]);
0143     z[4] = w0;
0144     w0   = w1;
0145     w1   = w2;
0146     w2   = 0;
0147 
0148     word3_muladd(&w2, &w1, &w0, x[0], y[5]);
0149     word3_muladd(&w2, &w1, &w0, x[1], y[4]);
0150     word3_muladd(&w2, &w1, &w0, x[2], y[3]);
0151     word3_muladd(&w2, &w1, &w0, x[3], y[2]);
0152     word3_muladd(&w2, &w1, &w0, x[4], y[1]);
0153     word3_muladd(&w2, &w1, &w0, x[5], y[0]);
0154     z[5] = w0;
0155     w0   = w1;
0156     w1   = w2;
0157     w2   = 0;
0158 
0159     word3_muladd(&w2, &w1, &w0, x[1], y[5]);
0160     word3_muladd(&w2, &w1, &w0, x[2], y[4]);
0161     word3_muladd(&w2, &w1, &w0, x[3], y[3]);
0162     word3_muladd(&w2, &w1, &w0, x[4], y[2]);
0163     word3_muladd(&w2, &w1, &w0, x[5], y[1]);
0164     z[6] = w0;
0165     w0   = w1;
0166     w1   = w2;
0167     w2   = 0;
0168 
0169     word3_muladd(&w2, &w1, &w0, x[2], y[5]);
0170     word3_muladd(&w2, &w1, &w0, x[3], y[4]);
0171     word3_muladd(&w2, &w1, &w0, x[4], y[3]);
0172     word3_muladd(&w2, &w1, &w0, x[5], y[2]);
0173     z[7] = w0;
0174     w0   = w1;
0175     w1   = w2;
0176     w2   = 0;
0177 
0178     word3_muladd(&w2, &w1, &w0, x[3], y[5]);
0179     word3_muladd(&w2, &w1, &w0, x[4], y[4]);
0180     word3_muladd(&w2, &w1, &w0, x[5], y[3]);
0181     z[8] = w0;
0182     w0   = w1;
0183     w1   = w2;
0184     w2   = 0;
0185 
0186     word3_muladd(&w2, &w1, &w0, x[4], y[5]);
0187     word3_muladd(&w2, &w1, &w0, x[5], y[4]);
0188     z[9] = w0;
0189     w0   = w1;
0190     w1   = w2;
0191     w2   = 0;
0192 
0193     word3_muladd(&w2, &w1, &w0, x[5], y[5]);
0194     z[10] = w0;
0195     z[11] = w1;
0196 }
0197 
0198 /*************************************************
0199  * Comba 8x8 Multiplication                       *
0200  *************************************************/
0201 void bigint_comba_mul8(word z[16], const word x[8], const word y[8])
0202 {
0203     word w2 = 0, w1 = 0, w0 = 0;
0204 
0205     word3_muladd(&w2, &w1, &w0, x[0], y[0]);
0206     z[0] = w0;
0207     w0   = w1;
0208     w1   = w2;
0209     w2   = 0;
0210 
0211     word3_muladd(&w2, &w1, &w0, x[0], y[1]);
0212     word3_muladd(&w2, &w1, &w0, x[1], y[0]);
0213     z[1] = w0;
0214     w0   = w1;
0215     w1   = w2;
0216     w2   = 0;
0217 
0218     word3_muladd(&w2, &w1, &w0, x[0], y[2]);
0219     word3_muladd(&w2, &w1, &w0, x[1], y[1]);
0220     word3_muladd(&w2, &w1, &w0, x[2], y[0]);
0221     z[2] = w0;
0222     w0   = w1;
0223     w1   = w2;
0224     w2   = 0;
0225 
0226     word3_muladd(&w2, &w1, &w0, x[0], y[3]);
0227     word3_muladd(&w2, &w1, &w0, x[1], y[2]);
0228     word3_muladd(&w2, &w1, &w0, x[2], y[1]);
0229     word3_muladd(&w2, &w1, &w0, x[3], y[0]);
0230     z[3] = w0;
0231     w0   = w1;
0232     w1   = w2;
0233     w2   = 0;
0234 
0235     word3_muladd(&w2, &w1, &w0, x[0], y[4]);
0236     word3_muladd(&w2, &w1, &w0, x[1], y[3]);
0237     word3_muladd(&w2, &w1, &w0, x[2], y[2]);
0238     word3_muladd(&w2, &w1, &w0, x[3], y[1]);
0239     word3_muladd(&w2, &w1, &w0, x[4], y[0]);
0240     z[4] = w0;
0241     w0   = w1;
0242     w1   = w2;
0243     w2   = 0;
0244 
0245     word3_muladd(&w2, &w1, &w0, x[0], y[5]);
0246     word3_muladd(&w2, &w1, &w0, x[1], y[4]);
0247     word3_muladd(&w2, &w1, &w0, x[2], y[3]);
0248     word3_muladd(&w2, &w1, &w0, x[3], y[2]);
0249     word3_muladd(&w2, &w1, &w0, x[4], y[1]);
0250     word3_muladd(&w2, &w1, &w0, x[5], y[0]);
0251     z[5] = w0;
0252     w0   = w1;
0253     w1   = w2;
0254     w2   = 0;
0255 
0256     word3_muladd(&w2, &w1, &w0, x[0], y[6]);
0257     word3_muladd(&w2, &w1, &w0, x[1], y[5]);
0258     word3_muladd(&w2, &w1, &w0, x[2], y[4]);
0259     word3_muladd(&w2, &w1, &w0, x[3], y[3]);
0260     word3_muladd(&w2, &w1, &w0, x[4], y[2]);
0261     word3_muladd(&w2, &w1, &w0, x[5], y[1]);
0262     word3_muladd(&w2, &w1, &w0, x[6], y[0]);
0263     z[6] = w0;
0264     w0   = w1;
0265     w1   = w2;
0266     w2   = 0;
0267 
0268     word3_muladd(&w2, &w1, &w0, x[0], y[7]);
0269     word3_muladd(&w2, &w1, &w0, x[1], y[6]);
0270     word3_muladd(&w2, &w1, &w0, x[2], y[5]);
0271     word3_muladd(&w2, &w1, &w0, x[3], y[4]);
0272     word3_muladd(&w2, &w1, &w0, x[4], y[3]);
0273     word3_muladd(&w2, &w1, &w0, x[5], y[2]);
0274     word3_muladd(&w2, &w1, &w0, x[6], y[1]);
0275     word3_muladd(&w2, &w1, &w0, x[7], y[0]);
0276     z[7] = w0;
0277     w0   = w1;
0278     w1   = w2;
0279     w2   = 0;
0280 
0281     word3_muladd(&w2, &w1, &w0, x[1], y[7]);
0282     word3_muladd(&w2, &w1, &w0, x[2], y[6]);
0283     word3_muladd(&w2, &w1, &w0, x[3], y[5]);
0284     word3_muladd(&w2, &w1, &w0, x[4], y[4]);
0285     word3_muladd(&w2, &w1, &w0, x[5], y[3]);
0286     word3_muladd(&w2, &w1, &w0, x[6], y[2]);
0287     word3_muladd(&w2, &w1, &w0, x[7], y[1]);
0288     z[8] = w0;
0289     w0   = w1;
0290     w1   = w2;
0291     w2   = 0;
0292 
0293     word3_muladd(&w2, &w1, &w0, x[2], y[7]);
0294     word3_muladd(&w2, &w1, &w0, x[3], y[6]);
0295     word3_muladd(&w2, &w1, &w0, x[4], y[5]);
0296     word3_muladd(&w2, &w1, &w0, x[5], y[4]);
0297     word3_muladd(&w2, &w1, &w0, x[6], y[3]);
0298     word3_muladd(&w2, &w1, &w0, x[7], y[2]);
0299     z[9] = w0;
0300     w0   = w1;
0301     w1   = w2;
0302     w2   = 0;
0303 
0304     word3_muladd(&w2, &w1, &w0, x[3], y[7]);
0305     word3_muladd(&w2, &w1, &w0, x[4], y[6]);
0306     word3_muladd(&w2, &w1, &w0, x[5], y[5]);
0307     word3_muladd(&w2, &w1, &w0, x[6], y[4]);
0308     word3_muladd(&w2, &w1, &w0, x[7], y[3]);
0309     z[10] = w0;
0310     w0    = w1;
0311     w1    = w2;
0312     w2    = 0;
0313 
0314     word3_muladd(&w2, &w1, &w0, x[4], y[7]);
0315     word3_muladd(&w2, &w1, &w0, x[5], y[6]);
0316     word3_muladd(&w2, &w1, &w0, x[6], y[5]);
0317     word3_muladd(&w2, &w1, &w0, x[7], y[4]);
0318     z[11] = w0;
0319     w0    = w1;
0320     w1    = w2;
0321     w2    = 0;
0322 
0323     word3_muladd(&w2, &w1, &w0, x[5], y[7]);
0324     word3_muladd(&w2, &w1, &w0, x[6], y[6]);
0325     word3_muladd(&w2, &w1, &w0, x[7], y[5]);
0326     z[12] = w0;
0327     w0    = w1;
0328     w1    = w2;
0329     w2    = 0;
0330 
0331     word3_muladd(&w2, &w1, &w0, x[6], y[7]);
0332     word3_muladd(&w2, &w1, &w0, x[7], y[6]);
0333     z[13] = w0;
0334     w0    = w1;
0335     w1    = w2;
0336     w2    = 0;
0337 
0338     word3_muladd(&w2, &w1, &w0, x[7], y[7]);
0339     z[14] = w0;
0340     z[15] = w1;
0341 }
0342 
0343 /*************************************************
0344  * Comba 4x4 Squaring                             *
0345  *************************************************/
0346 void bigint_comba_sqr4(word z[8], const word x[4])
0347 {
0348     word w2 = 0, w1 = 0, w0 = 0;
0349 
0350     word3_muladd(&w2, &w1, &w0, x[0], x[0]);
0351     z[0] = w0;
0352     w0   = w1;
0353     w1   = w2;
0354     w2   = 0;
0355 
0356     word3_muladd_2(&w2, &w1, &w0, x[0], x[1]);
0357     z[1] = w0;
0358     w0   = w1;
0359     w1   = w2;
0360     w2   = 0;
0361 
0362     word3_muladd_2(&w2, &w1, &w0, x[0], x[2]);
0363     word3_muladd(&w2, &w1, &w0, x[1], x[1]);
0364     z[2] = w0;
0365     w0   = w1;
0366     w1   = w2;
0367     w2   = 0;
0368 
0369     word3_muladd_2(&w2, &w1, &w0, x[0], x[3]);
0370     word3_muladd_2(&w2, &w1, &w0, x[1], x[2]);
0371     z[3] = w0;
0372     w0   = w1;
0373     w1   = w2;
0374     w2   = 0;
0375 
0376     word3_muladd_2(&w2, &w1, &w0, x[1], x[3]);
0377     word3_muladd(&w2, &w1, &w0, x[2], x[2]);
0378     z[4] = w0;
0379     w0   = w1;
0380     w1   = w2;
0381     w2   = 0;
0382 
0383     word3_muladd_2(&w2, &w1, &w0, x[2], x[3]);
0384     z[5] = w0;
0385     w0   = w1;
0386     w1   = w2;
0387     w2   = 0;
0388 
0389     word3_muladd(&w2, &w1, &w0, x[3], x[3]);
0390     z[6] = w0;
0391     z[7] = w1;
0392 }
0393 
0394 /*************************************************
0395  * Comba 6x6 Squaring                             *
0396  *************************************************/
0397 void bigint_comba_sqr6(word z[12], const word x[6])
0398 {
0399     word w2 = 0, w1 = 0, w0 = 0;
0400 
0401     word3_muladd(&w2, &w1, &w0, x[0], x[0]);
0402     z[0] = w0;
0403     w0   = w1;
0404     w1   = w2;
0405     w2   = 0;
0406 
0407     word3_muladd_2(&w2, &w1, &w0, x[0], x[1]);
0408     z[1] = w0;
0409     w0   = w1;
0410     w1   = w2;
0411     w2   = 0;
0412 
0413     word3_muladd_2(&w2, &w1, &w0, x[0], x[2]);
0414     word3_muladd(&w2, &w1, &w0, x[1], x[1]);
0415     z[2] = w0;
0416     w0   = w1;
0417     w1   = w2;
0418     w2   = 0;
0419 
0420     word3_muladd_2(&w2, &w1, &w0, x[0], x[3]);
0421     word3_muladd_2(&w2, &w1, &w0, x[1], x[2]);
0422     z[3] = w0;
0423     w0   = w1;
0424     w1   = w2;
0425     w2   = 0;
0426 
0427     word3_muladd_2(&w2, &w1, &w0, x[0], x[4]);
0428     word3_muladd_2(&w2, &w1, &w0, x[1], x[3]);
0429     word3_muladd(&w2, &w1, &w0, x[2], x[2]);
0430     z[4] = w0;
0431     w0   = w1;
0432     w1   = w2;
0433     w2   = 0;
0434 
0435     word3_muladd_2(&w2, &w1, &w0, x[0], x[5]);
0436     word3_muladd_2(&w2, &w1, &w0, x[1], x[4]);
0437     word3_muladd_2(&w2, &w1, &w0, x[2], x[3]);
0438     z[5] = w0;
0439     w0   = w1;
0440     w1   = w2;
0441     w2   = 0;
0442 
0443     word3_muladd_2(&w2, &w1, &w0, x[1], x[5]);
0444     word3_muladd_2(&w2, &w1, &w0, x[2], x[4]);
0445     word3_muladd(&w2, &w1, &w0, x[3], x[3]);
0446     z[6] = w0;
0447     w0   = w1;
0448     w1   = w2;
0449     w2   = 0;
0450 
0451     word3_muladd_2(&w2, &w1, &w0, x[2], x[5]);
0452     word3_muladd_2(&w2, &w1, &w0, x[3], x[4]);
0453     z[7] = w0;
0454     w0   = w1;
0455     w1   = w2;
0456     w2   = 0;
0457 
0458     word3_muladd_2(&w2, &w1, &w0, x[3], x[5]);
0459     word3_muladd(&w2, &w1, &w0, x[4], x[4]);
0460     z[8] = w0;
0461     w0   = w1;
0462     w1   = w2;
0463     w2   = 0;
0464 
0465     word3_muladd_2(&w2, &w1, &w0, x[4], x[5]);
0466     z[9] = w0;
0467     w0   = w1;
0468     w1   = w2;
0469     w2   = 0;
0470 
0471     word3_muladd(&w2, &w1, &w0, x[5], x[5]);
0472     z[10] = w0;
0473     z[11] = w1;
0474 }
0475 
0476 /*************************************************
0477  * Comba 8x8 Squaring                             *
0478  *************************************************/
0479 void bigint_comba_sqr8(word z[16], const word x[8])
0480 {
0481     word w2 = 0, w1 = 0, w0 = 0;
0482 
0483     word3_muladd(&w2, &w1, &w0, x[0], x[0]);
0484     z[0] = w0;
0485     w0   = w1;
0486     w1   = w2;
0487     w2   = 0;
0488 
0489     word3_muladd_2(&w2, &w1, &w0, x[0], x[1]);
0490     z[1] = w0;
0491     w0   = w1;
0492     w1   = w2;
0493     w2   = 0;
0494 
0495     word3_muladd_2(&w2, &w1, &w0, x[0], x[2]);
0496     word3_muladd(&w2, &w1, &w0, x[1], x[1]);
0497     z[2] = w0;
0498     w0   = w1;
0499     w1   = w2;
0500     w2   = 0;
0501 
0502     word3_muladd_2(&w2, &w1, &w0, x[0], x[3]);
0503     word3_muladd_2(&w2, &w1, &w0, x[1], x[2]);
0504     z[3] = w0;
0505     w0   = w1;
0506     w1   = w2;
0507     w2   = 0;
0508 
0509     word3_muladd_2(&w2, &w1, &w0, x[0], x[4]);
0510     word3_muladd_2(&w2, &w1, &w0, x[1], x[3]);
0511     word3_muladd(&w2, &w1, &w0, x[2], x[2]);
0512     z[4] = w0;
0513     w0   = w1;
0514     w1   = w2;
0515     w2   = 0;
0516 
0517     word3_muladd_2(&w2, &w1, &w0, x[0], x[5]);
0518     word3_muladd_2(&w2, &w1, &w0, x[1], x[4]);
0519     word3_muladd_2(&w2, &w1, &w0, x[2], x[3]);
0520     z[5] = w0;
0521     w0   = w1;
0522     w1   = w2;
0523     w2   = 0;
0524 
0525     word3_muladd_2(&w2, &w1, &w0, x[0], x[6]);
0526     word3_muladd_2(&w2, &w1, &w0, x[1], x[5]);
0527     word3_muladd_2(&w2, &w1, &w0, x[2], x[4]);
0528     word3_muladd(&w2, &w1, &w0, x[3], x[3]);
0529     z[6] = w0;
0530     w0   = w1;
0531     w1   = w2;
0532     w2   = 0;
0533 
0534     word3_muladd_2(&w2, &w1, &w0, x[0], x[7]);
0535     word3_muladd_2(&w2, &w1, &w0, x[1], x[6]);
0536     word3_muladd_2(&w2, &w1, &w0, x[2], x[5]);
0537     word3_muladd_2(&w2, &w1, &w0, x[3], x[4]);
0538     z[7] = w0;
0539     w0   = w1;
0540     w1   = w2;
0541     w2   = 0;
0542 
0543     word3_muladd_2(&w2, &w1, &w0, x[1], x[7]);
0544     word3_muladd_2(&w2, &w1, &w0, x[2], x[6]);
0545     word3_muladd_2(&w2, &w1, &w0, x[3], x[5]);
0546     word3_muladd(&w2, &w1, &w0, x[4], x[4]);
0547     z[8] = w0;
0548     w0   = w1;
0549     w1   = w2;
0550     w2   = 0;
0551 
0552     word3_muladd_2(&w2, &w1, &w0, x[2], x[7]);
0553     word3_muladd_2(&w2, &w1, &w0, x[3], x[6]);
0554     word3_muladd_2(&w2, &w1, &w0, x[4], x[5]);
0555     z[9] = w0;
0556     w0   = w1;
0557     w1   = w2;
0558     w2   = 0;
0559 
0560     word3_muladd_2(&w2, &w1, &w0, x[3], x[7]);
0561     word3_muladd_2(&w2, &w1, &w0, x[4], x[6]);
0562     word3_muladd(&w2, &w1, &w0, x[5], x[5]);
0563     z[10] = w0;
0564     w0    = w1;
0565     w1    = w2;
0566     w2    = 0;
0567 
0568     word3_muladd_2(&w2, &w1, &w0, x[4], x[7]);
0569     word3_muladd_2(&w2, &w1, &w0, x[5], x[6]);
0570     z[11] = w0;
0571     w0    = w1;
0572     w1    = w2;
0573     w2    = 0;
0574 
0575     word3_muladd_2(&w2, &w1, &w0, x[5], x[7]);
0576     word3_muladd(&w2, &w1, &w0, x[6], x[6]);
0577     z[12] = w0;
0578     w0    = w1;
0579     w1    = w2;
0580     w2    = 0;
0581 
0582     word3_muladd_2(&w2, &w1, &w0, x[6], x[7]);
0583     z[13] = w0;
0584     w0    = w1;
0585     w1    = w2;
0586     w2    = 0;
0587 
0588     word3_muladd(&w2, &w1, &w0, x[7], x[7]);
0589     z[14] = w0;
0590     z[15] = w1;
0591 }
0592 }
0593 
0594 }
0595 } // WRAPNS_LINE