{"schema":"libjg2-1",
"vpath":"/git/",
"avatar":"/git/avatar/",
"alang":"",
"gen_ut":1752658436,
"reponame":"openssl",
"desc":"OpenSSL",
"owner": { "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" },"url":"https://warmcat.com/repo/openssl",
"f":3,
"items": [
{"schema":"libjg2-1",
"cid":"c7c7d5a5cf597c4718569810d512db85",
"commit": {"type":"commit",
"time": 1532606509,
"time_ofs": 120,
"oid_tree": { "oid": "68367b4465e758feb1ce1be06a3fde5fe711b654", "alias": []},
"oid":{ "oid": "8e8307231014bded6eb9562262ef09a76d4bfe87", "alias": []},
"msg": "Add ec/asm/x25519-ppc64.pl module.",
"sig_commit": { "git_time": { "time": 1532606509, "offset": 120 }, "name": "Andy Polyakov", "email": "appro@openssl.org", "md5": "50bd64fa2a792cbbf679fa16213a3b2a" },
"sig_author": { "git_time": { "time": 1532507049, "offset": 120 }, "name": "Andy Polyakov", "email": "appro@openssl.org", "md5": "50bd64fa2a792cbbf679fa16213a3b2a" }},
"body": "Add ec/asm/x25519-ppc64.pl module.\n\nReviewed-by: Rich Salz \u003crsalz@openssl.org\u003e\nReviewed-by: Richard Levitte \u003clevitte@openssl.org\u003e\n(Merged from https://github.com/openssl/openssl/pull/6782)\n"
,
"diff": "diff --git a/crypto/ec/asm/x25519-ppc64.pl b/crypto/ec/asm/x25519-ppc64.pl\nnew file mode 100755\nindex 0000000..3773cb2\n--- /dev/null\n+++ b/crypto/ec/asm/x25519-ppc64.pl\n@@ -0,0 +1,824 @@\n+#! /usr/bin/env perl\n+# Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.\n+#\n+# Licensed under the OpenSSL license (the \u0022License\u0022). You may not use\n+# this file except in compliance with the License. You can obtain a copy\n+# in the file LICENSE in the source distribution or at\n+# https://www.openssl.org/source/license.html\n+#\n+# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n+# Written by Andy Polyakov \u003cappro@openssl.org\u003e for the OpenSSL\n+# project. The module is, however, dual licensed under OpenSSL and\n+# CRYPTOGAMS licenses depending on where you obtain it. For further\n+# details see http://www.openssl.org/~appro/cryptogams/.\n+# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n+#\n+# X25519 lower-level primitives for PPC64.\n+#\n+# July 2018.\n+#\n+# Base 2^64 is faster than base 2^51 on pre-POWER8, most notably ~15%\n+# faster on PPC970/G5. POWER8 on the other hand seems to trip on own\n+# shoelaces when handling longer carry chains. As base 2^51 has just\n+# single-carry pairs, it's 25% faster than base 2^64. Since PPC970 is\n+# pretty old, base 2^64 implementation is not engaged. Comparison to\n+# compiler-generated code is complicated by the fact that not all\n+# compilers support 128-bit integers. When compiler doesn't, like xlc,\n+# this module delivers more than 2x improvement, and when it does,\n+# from 12% to 30% improvement was measured...\n+\n+$flavour \u003d shift;\n+while (($output\u003dshift) \u0026\u0026 ($output!~/\u005cw[\u005cw\u005c-]*\u005c.\u005cw+$/)) {}\n+\n+$0 \u003d~ m/(.*[\u005c/\u005c\u005c])[^\u005c/\u005c\u005c]+$/; $dir\u003d$1;\n+( $xlate\u003d\u0022${dir}ppc-xlate.pl\u0022 and -f $xlate ) or\n+( $xlate\u003d\u0022${dir}../../perlasm/ppc-xlate.pl\u0022 and -f $xlate) or\n+die \u0022can't locate ppc-xlate.pl\u0022;\n+\n+open OUT,\u0022| \u005c\u0022$^X\u005c\u0022 $xlate $flavour $output\u0022;\n+*STDOUT\u003d*OUT;\n+\n+my $sp \u003d \u0022r1\u0022;\n+my ($rp,$ap,$bp) \u003d map(\u0022r$_\u0022,3..5);\n+\n+####################################################### base 2^64\n+if (0) {\n+my ($bi,$a0,$a1,$a2,$a3,$t0,$t1, $t2,$t3,\n+ $acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7) \u003d\n+ map(\u0022r$_\u0022,(6..12,22..31));\n+my $zero \u003d \u0022r0\u0022;\n+my $FRAME \u003d 16*8;\n+\n+$code.\u003d\u003c\u003c___;\n+.text\n+\n+.globl\tx25519_fe64_mul\n+.type\tx25519_fe64_mul,\u005c@function\n+.align\t5\n+x25519_fe64_mul:\n+\tstdu\t$sp,-$FRAME($sp)\n+\tstd\tr22,`$FRAME-8*10`($sp)\n+\tstd\tr23,`$FRAME-8*9`($sp)\n+\tstd\tr24,`$FRAME-8*8`($sp)\n+\tstd\tr25,`$FRAME-8*7`($sp)\n+\tstd\tr26,`$FRAME-8*6`($sp)\n+\tstd\tr27,`$FRAME-8*5`($sp)\n+\tstd\tr28,`$FRAME-8*4`($sp)\n+\tstd\tr29,`$FRAME-8*3`($sp)\n+\tstd\tr30,`$FRAME-8*2`($sp)\n+\tstd\tr31,`$FRAME-8*1`($sp)\n+\n+\tld\t$bi,0($bp)\n+\tld\t$a0,0($ap)\n+\txor\t$zero,$zero,$zero\n+\tld\t$a1,8($ap)\n+\tld\t$a2,16($ap)\n+\tld\t$a3,24($ap)\n+\n+\tmulld\t$acc0,$a0,$bi\t\t# a[0]*b[0]\n+\tmulhdu\t$t0,$a0,$bi\n+\tmulld\t$acc1,$a1,$bi\t\t# a[1]*b[0]\n+\tmulhdu\t$t1,$a1,$bi\n+\tmulld\t$acc2,$a2,$bi\t\t# a[2]*b[0]\n+\tmulhdu\t$t2,$a2,$bi\n+\tmulld\t$acc3,$a3,$bi\t\t# a[3]*b[0]\n+\tmulhdu\t$t3,$a3,$bi\n+___\n+for(my @acc\u003d($acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7),\n+ my $i\u003d1; $i\u003c4; shift(@acc), $i++) {\n+my $acc4 \u003d $i\u003d\u003d1? $zero : @acc[4];\n+\n+$code.\u003d\u003c\u003c___;\n+\tld\t$bi,`8*$i`($bp)\n+\taddc\t@acc[1],@acc[1],$t0\t# accumulate high parts\n+\tmulld\t$t0,$a0,$bi\n+\tadde\t@acc[2],@acc[2],$t1\n+\tmulld\t$t1,$a1,$bi\n+\tadde\t@acc[3],@acc[3],$t2\n+\tmulld\t$t2,$a2,$bi\n+\tadde\t@acc[4],$acc4,$t3\n+\tmulld\t$t3,$a3,$bi\n+\taddc\t@acc[1],@acc[1],$t0\t# accumulate low parts\n+\tmulhdu\t$t0,$a0,$bi\n+\tadde\t@acc[2],@acc[2],$t1\n+\tmulhdu\t$t1,$a1,$bi\n+\tadde\t@acc[3],@acc[3],$t2\n+\tmulhdu\t$t2,$a2,$bi\n+\tadde\t@acc[4],@acc[4],$t3\n+\tmulhdu\t$t3,$a3,$bi\n+\tadde\t@acc[5],$zero,$zero\n+___\n+}\n+$code.\u003d\u003c\u003c___;\n+\tli\t$bi,38\n+\taddc\t$acc4,$acc4,$t0\n+\tmulld\t$t0,$acc4,$bi\n+\tadde\t$acc5,$acc5,$t1\n+\tmulld\t$t1,$acc5,$bi\n+\tadde\t$acc6,$acc6,$t2\n+\tmulld\t$t2,$acc6,$bi\n+\tadde\t$acc7,$acc7,$t3\n+\tmulld\t$t3,$acc7,$bi\n+\n+\taddc\t$acc0,$acc0,$t0\n+\tmulhdu\t$t0,$acc4,$bi\n+\tadde\t$acc1,$acc1,$t1\n+\tmulhdu\t$t1,$acc5,$bi\n+\tadde\t$acc2,$acc2,$t2\n+\tmulhdu\t$t2,$acc6,$bi\n+\tadde\t$acc3,$acc3,$t3\n+\tmulhdu\t$t3,$acc7,$bi\n+\tadde\t$acc4,$zero,$zero\n+\n+\taddc\t$acc1,$acc1,$t0\n+\tadde\t$acc2,$acc2,$t1\n+\tadde\t$acc3,$acc3,$t2\n+\tadde\t$acc4,$acc4,$t3\n+\n+\tmulld\t$acc4,$acc4,$bi\n+\n+\taddc\t$acc0,$acc0,$acc4\n+\taddze\t$acc1,$acc1\n+\taddze\t$acc2,$acc2\n+\taddze\t$acc3,$acc3\n+\n+\tsubfe\t$acc4,$acc4,$acc4\t# carry -\u003e ~mask\n+\tstd\t$acc1,8($rp)\n+\tandc\t$acc4,$bi,$acc4\n+\tstd\t$acc2,16($rp)\n+\tadd\t$acc0,$acc0,$acc4\n+\tstd\t$acc3,24($rp)\n+\tstd\t$acc0,0($rp)\n+\n+\tld\tr22,`$FRAME-8*10`($sp)\n+\tld\tr23,`$FRAME-8*9`($sp)\n+\tld\tr24,`$FRAME-8*8`($sp)\n+\tld\tr25,`$FRAME-8*7`($sp)\n+\tld\tr26,`$FRAME-8*6`($sp)\n+\tld\tr27,`$FRAME-8*5`($sp)\n+\tld\tr28,`$FRAME-8*4`($sp)\n+\tld\tr29,`$FRAME-8*3`($sp)\n+\tld\tr30,`$FRAME-8*2`($sp)\n+\tld\tr31,`$FRAME-8*1`($sp)\n+\taddi\t$sp,$sp,$FRAME\n+\tblr\n+\t.long\t0\n+\t.byte\t0,12,4,0,0x80,10,3,0\n+\t.long\t0\n+.size\tx25519_fe64_mul,.-x25519_fe64_mul\n+\n+.globl\tx25519_fe64_sqr\n+.type\tx25519_fe64_sqr,\u005c@function\n+.align\t5\n+x25519_fe64_sqr:\n+\tstdu\t$sp,-$FRAME($sp)\n+\tstd\tr22,`$FRAME-8*10`($sp)\n+\tstd\tr23,`$FRAME-8*9`($sp)\n+\tstd\tr24,`$FRAME-8*8`($sp)\n+\tstd\tr25,`$FRAME-8*7`($sp)\n+\tstd\tr26,`$FRAME-8*6`($sp)\n+\tstd\tr27,`$FRAME-8*5`($sp)\n+\tstd\tr28,`$FRAME-8*4`($sp)\n+\tstd\tr29,`$FRAME-8*3`($sp)\n+\tstd\tr30,`$FRAME-8*2`($sp)\n+\tstd\tr31,`$FRAME-8*1`($sp)\n+\n+\tld\t$a0,0($ap)\n+\txor\t$zero,$zero,$zero\n+\tld\t$a1,8($ap)\n+\tld\t$a2,16($ap)\n+\tld\t$a3,24($ap)\n+\n+\t################################\n+\t# | | | | | |a1*a0| |\n+\t# | | | | |a2*a0| | |\n+\t# | |a3*a2|a3*a0| | | |\n+\t# | | | |a2*a1| | | |\n+\t# | | |a3*a1| | | | |\n+\t# *| | | | | | | | 2|\n+\t# +|a3*a3|a2*a2|a1*a1|a0*a0|\n+\t# |--+--+--+--+--+--+--+--|\n+\t# |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is $accx, i.e. follow $accx\n+\t#\n+\t# \u0022can't overflow\u0022 below mark carrying into high part of\n+\t# multiplication result, which can't overflow, because it\n+\t# can never be all ones.\n+\n+\tmulld\t$acc1,$a1,$a0\t\t# a[1]*a[0]\n+\tmulhdu\t$t1,$a1,$a0\n+\tmulld\t$acc2,$a2,$a0\t\t# a[2]*a[0]\n+\tmulhdu\t$t2,$a2,$a0\n+\tmulld\t$acc3,$a3,$a0\t\t# a[3]*a[0]\n+\tmulhdu\t$acc4,$a3,$a0\n+\n+\taddc\t$acc2,$acc2,$t1\t\t# accumulate high parts of multiplication\n+\t mulld\t$t0,$a2,$a1\t\t# a[2]*a[1]\n+\t mulhdu\t$t1,$a2,$a1\n+\tadde\t$acc3,$acc3,$t2\n+\t mulld\t$t2,$a3,$a1\t\t# a[3]*a[1]\n+\t mulhdu\t$t3,$a3,$a1\n+\taddze\t$acc4,$acc4\t\t# can't overflow\n+\n+\tmulld\t$acc5,$a3,$a2\t\t# a[3]*a[2]\n+\tmulhdu\t$acc6,$a3,$a2\n+\n+\taddc\t$t1,$t1,$t2\t\t# accumulate high parts of multiplication\n+\t mulld\t$acc0,$a0,$a0\t\t# a[0]*a[0]\n+\taddze\t$t2,$t3\t\t\t# can't overflow\n+\n+\taddc\t$acc3,$acc3,$t0\t\t# accumulate low parts of multiplication\n+\t mulhdu\t$a0,$a0,$a0\n+\tadde\t$acc4,$acc4,$t1\n+\t mulld\t$t1,$a1,$a1\t\t# a[1]*a[1]\n+\tadde\t$acc5,$acc5,$t2\n+\t mulhdu\t$a1,$a1,$a1\n+\taddze\t$acc6,$acc6\t\t# can't overflow\n+\n+\taddc\t$acc1,$acc1,$acc1\t# acc[1-6]*\u003d2\n+\t mulld\t$t2,$a2,$a2\t\t# a[2]*a[2]\n+\tadde\t$acc2,$acc2,$acc2\n+\t mulhdu\t$a2,$a2,$a2\n+\tadde\t$acc3,$acc3,$acc3\n+\t mulld\t$t3,$a3,$a3\t\t# a[3]*a[3]\n+\tadde\t$acc4,$acc4,$acc4\n+\t mulhdu\t$a3,$a3,$a3\n+\tadde\t$acc5,$acc5,$acc5\n+\tadde\t$acc6,$acc6,$acc6\n+\taddze\t$acc7,$zero\n+\n+\taddc\t$acc1,$acc1,$a0\t\t# +a[i]*a[i]\n+\t li\t$bi,38\n+\tadde\t$acc2,$acc2,$t1\n+\tadde\t$acc3,$acc3,$a1\n+\tadde\t$acc4,$acc4,$t2\n+\tadde\t$acc5,$acc5,$a2\n+\tadde\t$acc6,$acc6,$t3\n+\tadde\t$acc7,$acc7,$a3\n+\n+\tmulld\t$t0,$acc4,$bi\n+\tmulld\t$t1,$acc5,$bi\n+\tmulld\t$t2,$acc6,$bi\n+\tmulld\t$t3,$acc7,$bi\n+\n+\taddc\t$acc0,$acc0,$t0\n+\tmulhdu\t$t0,$acc4,$bi\n+\tadde\t$acc1,$acc1,$t1\n+\tmulhdu\t$t1,$acc5,$bi\n+\tadde\t$acc2,$acc2,$t2\n+\tmulhdu\t$t2,$acc6,$bi\n+\tadde\t$acc3,$acc3,$t3\n+\tmulhdu\t$t3,$acc7,$bi\n+\taddze\t$acc4,$zero\n+\n+\taddc\t$acc1,$acc1,$t0\n+\tadde\t$acc2,$acc2,$t1\n+\tadde\t$acc3,$acc3,$t2\n+\tadde\t$acc4,$acc4,$t3\n+\n+\tmulld\t$acc4,$acc4,$bi\n+\n+\taddc\t$acc0,$acc0,$acc4\n+\taddze\t$acc1,$acc1\n+\taddze\t$acc2,$acc2\n+\taddze\t$acc3,$acc3\n+\n+\tsubfe\t$acc4,$acc4,$acc4\t# carry -\u003e ~mask\n+\tstd\t$acc1,8($rp)\n+\tandc\t$acc4,$bi,$acc4\n+\tstd\t$acc2,16($rp)\n+\tadd\t$acc0,$acc0,$acc4\n+\tstd\t$acc3,24($rp)\n+\tstd\t$acc0,0($rp)\n+\n+\tld\tr22,`$FRAME-8*10`($sp)\n+\tld\tr23,`$FRAME-8*9`($sp)\n+\tld\tr24,`$FRAME-8*8`($sp)\n+\tld\tr25,`$FRAME-8*7`($sp)\n+\tld\tr26,`$FRAME-8*6`($sp)\n+\tld\tr27,`$FRAME-8*5`($sp)\n+\tld\tr28,`$FRAME-8*4`($sp)\n+\tld\tr29,`$FRAME-8*3`($sp)\n+\tld\tr30,`$FRAME-8*2`($sp)\n+\tld\tr31,`$FRAME-8*1`($sp)\n+\taddi\t$sp,$sp,$FRAME\n+\tblr\n+\t.long\t0\n+\t.byte\t0,12,4,0,0x80,10,2,0\n+\t.long\t0\n+.size\tx25519_fe64_sqr,.-x25519_fe64_sqr\n+\n+.globl\tx25519_fe64_mul121666\n+.type\tx25519_fe64_mul121666,\u005c@function\n+.align\t5\n+x25519_fe64_mul121666:\n+\tlis\t$bi,`65536\u003e\u003e16`\n+\tori\t$bi,$bi,`121666-65536`\n+\n+\tld\t$t0,0($ap)\n+\tld\t$t1,8($ap)\n+\tld\t$bp,16($ap)\n+\tld\t$ap,24($ap)\n+\n+\tmulld\t$a0,$t0,$bi\n+\tmulhdu\t$t0,$t0,$bi\n+\tmulld\t$a1,$t1,$bi\n+\tmulhdu\t$t1,$t1,$bi\n+\tmulld\t$a2,$bp,$bi\n+\tmulhdu\t$bp,$bp,$bi\n+\tmulld\t$a3,$ap,$bi\n+\tmulhdu\t$ap,$ap,$bi\n+\n+\taddc\t$a1,$a1,$t0\n+\tadde\t$a2,$a2,$t1\n+\tadde\t$a3,$a3,$bp\n+\taddze\t$ap, $ap\n+\n+\tmulli\t$ap,$ap,38\n+\n+\taddc\t$a0,$a0,$ap\n+\taddze\t$a1,$a1\n+\taddze\t$a2,$a2\n+\taddze\t$a3,$a3\n+\n+\tsubfe\t$t1,$t1,$t1\t\t# carry -\u003e ~mask\n+\tstd\t$a1,8($rp)\n+\tandc\t$t0,$t0,$t1\n+\tstd\t$a2,16($rp)\n+\tadd\t$a0,$a0,$t0\n+\tstd\t$a3,24($rp)\n+\tstd\t$a0,0($rp)\n+\n+\tblr\n+\t.long\t0\n+\t.byte\t0,12,0x14,0,0,0,2,0\n+\t.long\t0\n+.size\tx25519_fe64_mul121666,.-x25519_fe64_mul121666\n+\n+.globl\tx25519_fe64_add\n+.type\tx25519_fe64_add,\u005c@function\n+.align\t5\n+x25519_fe64_add:\n+\tld\t$a0,0($ap)\n+\tld\t$t0,0($bp)\n+\tld\t$a1,8($ap)\n+\tld\t$t1,8($bp)\n+\tld\t$a2,16($ap)\n+\tld\t$bi,16($bp)\n+\tld\t$a3,24($ap)\n+\tld\t$bp,24($bp)\n+\n+\taddc\t$a0,$a0,$t0\n+\tadde\t$a1,$a1,$t1\n+\tadde\t$a2,$a2,$bi\n+\tadde\t$a3,$a3,$bp\n+\n+\tli\t$t0,38\n+\tsubfe\t$t1,$t1,$t1\t\t# carry -\u003e ~mask\n+\tandc\t$t1,$t0,$t1\n+\n+\taddc\t$a0,$a0,$t1\n+\taddze\t$a1,$a1\n+\taddze\t$a2,$a2\n+\taddze\t$a3,$a3\n+\n+\tsubfe\t$t1,$t1,$t1\t\t# carry -\u003e ~mask\n+\tstd\t$a1,8($rp)\n+\tandc\t$t0,$t0,$t1\n+\tstd\t$a2,16($rp)\n+\tadd\t$a0,$a0,$t0\n+\tstd\t$a3,24($rp)\n+\tstd\t$a0,0($rp)\n+\n+\tblr\n+\t.long\t0\n+\t.byte\t0,12,0x14,0,0,0,3,0\n+\t.long\t0\n+.size\tx25519_fe64_add,.-x25519_fe64_add\n+\n+.globl\tx25519_fe64_sub\n+.type\tx25519_fe64_sub,\u005c@function\n+.align\t5\n+x25519_fe64_sub:\n+\tld\t$a0,0($ap)\n+\tld\t$t0,0($bp)\n+\tld\t$a1,8($ap)\n+\tld\t$t1,8($bp)\n+\tld\t$a2,16($ap)\n+\tld\t$bi,16($bp)\n+\tld\t$a3,24($ap)\n+\tld\t$bp,24($bp)\n+\n+\tsubfc\t$a0,$t0,$a0\n+\tsubfe\t$a1,$t1,$a1\n+\tsubfe\t$a2,$bi,$a2\n+\tsubfe\t$a3,$bp,$a3\n+\n+\tli\t$t0,38\n+\tsubfe\t$t1,$t1,$t1\t\t# borrow -\u003e mask\n+\txor\t$zero,$zero,$zero\n+\tand\t$t1,$t0,$t1\n+\n+\tsubfc\t$a0,$t1,$a0\n+\tsubfe\t$a1,$zero,$a1\n+\tsubfe\t$a2,$zero,$a2\n+\tsubfe\t$a3,$zero,$a3\n+\n+\tsubfe\t$t1,$t1,$t1\t\t# borrow -\u003e mask\n+\tstd\t$a1,8($rp)\n+\tand\t$t0,$t0,$t1\n+\tstd\t$a2,16($rp)\n+\tsubf\t$a0,$t0,$a0\n+\tstd\t$a3,24($rp)\n+\tstd\t$a0,0($rp)\n+\n+\tblr\n+\t.long\t0\n+\t.byte\t0,12,0x14,0,0,0,3,0\n+\t.long\t0\n+.size\tx25519_fe64_sub,.-x25519_fe64_sub\n+\n+.globl\tx25519_fe64_tobytes\n+.type\tx25519_fe64_tobytes,\u005c@function\n+.align\t5\n+x25519_fe64_tobytes:\n+\tld\t$a3,24($ap)\n+\tld\t$a0,0($ap)\n+\tld\t$a1,8($ap)\n+\tld\t$a2,16($ap)\n+\n+\tsradi\t$t0,$a3,63\t\t# most significant bit -\u003e mask\n+\tli\t$t1,19\n+\tand\t$t0,$t0,$t1\n+\tsldi\t$a3,$a3,1\n+\tadd\t$t0,$t0,$t1\t\t# compare to modulus in the same go\n+\tsrdi\t$a3,$a3,1\t\t# most signifcant bit cleared\n+\n+\taddc\t$a0,$a0,$t0\n+\taddze\t$a1,$a1\n+\taddze\t$a2,$a2\n+\taddze\t$a3,$a3\n+\n+\txor\t$zero,$zero,$zero\n+\tsradi\t$t0,$a3,63\t\t# most significant bit -\u003e mask\n+\tsldi\t$a3,$a3,1\n+\tandc\t$t0,$t1,$t0\n+\tsrdi\t$a3,$a3,1\t\t# most signifcant bit cleared\n+\n+\tsubi\t$rp,$rp,1\n+\tsubfc\t$a0,$t0,$a0\n+\tsubfe\t$a1,$zero,$a1\n+\tsubfe\t$a2,$zero,$a2\n+\tsubfe\t$a3,$zero,$a3\n+\n+___\n+for (my @a\u003d($a0,$a1,$a2,$a3), my $i\u003d0; $i\u003c4; shift(@a), $i++) {\n+$code.\u003d\u003c\u003c___;\n+\tsrdi\t$t0,@a[0],8\n+\tstbu\t@a[0],1($rp)\n+\tsrdi\t@a[0],@a[0],16\n+\tstbu\t$t0,1($rp)\n+\tsrdi\t$t0,@a[0],8\n+\tstbu\t@a[0],1($rp)\n+\tsrdi\t@a[0],@a[0],16\n+\tstbu\t$t0,1($rp)\n+\tsrdi\t$t0,@a[0],8\n+\tstbu\t@a[0],1($rp)\n+\tsrdi\t@a[0],@a[0],16\n+\tstbu\t$t0,1($rp)\n+\tsrdi\t$t0,@a[0],8\n+\tstbu\t@a[0],1($rp)\n+\tstbu\t$t0,1($rp)\n+___\n+}\n+$code.\u003d\u003c\u003c___;\n+\tblr\n+\t.long\t0\n+\t.byte\t0,12,0x14,0,0,0,2,0\n+\t.long\t0\n+.size\tx25519_fe64_tobytes,.-x25519_fe64_tobytes\n+___\n+}\n+####################################################### base 2^51\n+{\n+my ($bi,$a0,$a1,$a2,$a3,$a4,$t0, $t1,\n+ $h0lo,$h0hi,$h1lo,$h1hi,$h2lo,$h2hi,$h3lo,$h3hi,$h4lo,$h4hi) \u003d\n+ map(\u0022r$_\u0022,(6..12,21..31));\n+my $mask \u003d \u0022r0\u0022;\n+my $FRAME \u003d 18*8;\n+\n+$code.\u003d\u003c\u003c___;\n+.text\n+\n+.globl\tx25519_fe51_mul\n+.type\tx25519_fe51_mul,\u005c@function\n+.align\t5\n+x25519_fe51_mul:\n+\tstdu\t$sp,-$FRAME($sp)\n+\tstd\tr21,`$FRAME-8*11`($sp)\n+\tstd\tr22,`$FRAME-8*10`($sp)\n+\tstd\tr23,`$FRAME-8*9`($sp)\n+\tstd\tr24,`$FRAME-8*8`($sp)\n+\tstd\tr25,`$FRAME-8*7`($sp)\n+\tstd\tr26,`$FRAME-8*6`($sp)\n+\tstd\tr27,`$FRAME-8*5`($sp)\n+\tstd\tr28,`$FRAME-8*4`($sp)\n+\tstd\tr29,`$FRAME-8*3`($sp)\n+\tstd\tr30,`$FRAME-8*2`($sp)\n+\tstd\tr31,`$FRAME-8*1`($sp)\n+\n+\tld\t$bi,0($bp)\n+\tld\t$a0,0($ap)\n+\tld\t$a1,8($ap)\n+\tld\t$a2,16($ap)\n+\tld\t$a3,24($ap)\n+\tld\t$a4,32($ap)\n+\n+\tmulld\t$h0lo,$a0,$bi\t\t# a[0]*b[0]\n+\tmulhdu\t$h0hi,$a0,$bi\n+\n+\tmulld\t$h1lo,$a1,$bi\t\t# a[1]*b[0]\n+\tmulhdu\t$h1hi,$a1,$bi\n+\n+\t mulld\t$h4lo,$a4,$bi\t\t# a[4]*b[0]\n+\t mulhdu\t$h4hi,$a4,$bi\n+\t ld\t$ap,8($bp)\n+\t mulli\t$a4,$a4,19\n+\n+\tmulld\t$h2lo,$a2,$bi\t\t# a[2]*b[0]\n+\tmulhdu\t$h2hi,$a2,$bi\n+\n+\tmulld\t$h3lo,$a3,$bi\t\t# a[3]*b[0]\n+\tmulhdu\t$h3hi,$a3,$bi\n+___\n+for(my @a\u003d($a0,$a1,$a2,$a3,$a4),\n+ my $i\u003d1; $i\u003c4; $i++) {\n+\t($ap,$bi) \u003d ($bi,$ap);\n+$code.\u003d\u003c\u003c___;\n+\tmulld\t$t0,@a[4],$bi\n+\tmulhdu\t$t1,@a[4],$bi\n+\taddc\t$h0lo,$h0lo,$t0\n+\tadde\t$h0hi,$h0hi,$t1\n+\n+\tmulld\t$t0,@a[0],$bi\n+\tmulhdu\t$t1,@a[0],$bi\n+\taddc\t$h1lo,$h1lo,$t0\n+\tadde\t$h1hi,$h1hi,$t1\n+\n+\t mulld\t$t0,@a[3],$bi\n+\t mulhdu\t$t1,@a[3],$bi\n+\t ld\t$ap,`8*($i+1)`($bp)\n+\t mulli\t@a[3],@a[3],19\n+\t addc\t$h4lo,$h4lo,$t0\n+\t adde\t$h4hi,$h4hi,$t1\n+\n+\tmulld\t$t0,@a[1],$bi\n+\tmulhdu\t$t1,@a[1],$bi\n+\taddc\t$h2lo,$h2lo,$t0\n+\tadde\t$h2hi,$h2hi,$t1\n+\n+\tmulld\t$t0,@a[2],$bi\n+\tmulhdu\t$t1,@a[2],$bi\n+\taddc\t$h3lo,$h3lo,$t0\n+\tadde\t$h3hi,$h3hi,$t1\n+___\n+\tunshift(@a,pop(@a));\n+}\n+\t($ap,$bi) \u003d ($bi,$ap);\n+$code.\u003d\u003c\u003c___;\n+\tmulld\t$t0,$a1,$bi\n+\tmulhdu\t$t1,$a1,$bi\n+\taddc\t$h0lo,$h0lo,$t0\n+\tadde\t$h0hi,$h0hi,$t1\n+\n+\tmulld\t$t0,$a2,$bi\n+\tmulhdu\t$t1,$a2,$bi\n+\taddc\t$h1lo,$h1lo,$t0\n+\tadde\t$h1hi,$h1hi,$t1\n+\n+\tmulld\t$t0,$a3,$bi\n+\tmulhdu\t$t1,$a3,$bi\n+\taddc\t$h2lo,$h2lo,$t0\n+\tadde\t$h2hi,$h2hi,$t1\n+\n+\tmulld\t$t0,$a4,$bi\n+\tmulhdu\t$t1,$a4,$bi\n+\taddc\t$h3lo,$h3lo,$t0\n+\tadde\t$h3hi,$h3hi,$t1\n+\n+\tmulld\t$t0,$a0,$bi\n+\tmulhdu\t$t1,$a0,$bi\n+\taddc\t$h4lo,$h4lo,$t0\n+\tadde\t$h4hi,$h4hi,$t1\n+\n+.Lfe51_reduce:\n+\tli\t$mask,-1\n+\tsrdi\t$mask,$mask,13\t\t# 0x7ffffffffffff\n+\n+\tsrdi\t$t0,$h2lo,51\n+\tand\t$a2,$h2lo,$mask\n+\tinsrdi\t$t0,$h2hi,51,0\t\t# h2\u003e\u003e51\n+\t srdi\t$t1,$h0lo,51\n+\t and\t$a0,$h0lo,$mask\n+\t insrdi\t$t1,$h0hi,51,0\t\t# h0\u003e\u003e51\n+\taddc\t$h3lo,$h3lo,$t0\n+\taddze\t$h3hi,$h3hi\n+\t addc\t$h1lo,$h1lo,$t1\n+\t addze\t$h1hi,$h1hi\n+\n+\tsrdi\t$t0,$h3lo,51\n+\tand\t$a3,$h3lo,$mask\n+\tinsrdi\t$t0,$h3hi,51,0\t\t# h3\u003e\u003e51\n+\t srdi\t$t1,$h1lo,51\n+\t and\t$a1,$h1lo,$mask\n+\t insrdi\t$t1,$h1hi,51,0\t\t# h1\u003e\u003e51\n+\taddc\t$h4lo,$h4lo,$t0\n+\taddze\t$h4hi,$h4hi\n+\t add\t$a2,$a2,$t1\n+\n+\tsrdi\t$t0,$h4lo,51\n+\tand\t$a4,$h4lo,$mask\n+\tinsrdi\t$t0,$h4hi,51,0\n+\tmulli\t$t0,$t0,19\t\t# (h4 \u003e\u003e 51) * 19\n+\n+\tadd\t$a0,$a0,$t0\n+\n+\tsrdi\t$t1,$a2,51\n+\tand\t$a2,$a2,$mask\n+\tadd\t$a3,$a3,$t1\n+\n+\tsrdi\t$t0,$a0,51\n+\tand\t$a0,$a0,$mask\n+\tadd\t$a1,$a1,$t0\n+\n+\tstd\t$a2,16($rp)\n+\tstd\t$a3,24($rp)\n+\tstd\t$a4,32($rp)\n+\tstd\t$a0,0($rp)\n+\tstd\t$a1,8($rp)\n+\n+\tld\tr21,`$FRAME-8*11`($sp)\n+\tld\tr22,`$FRAME-8*10`($sp)\n+\tld\tr23,`$FRAME-8*9`($sp)\n+\tld\tr24,`$FRAME-8*8`($sp)\n+\tld\tr25,`$FRAME-8*7`($sp)\n+\tld\tr26,`$FRAME-8*6`($sp)\n+\tld\tr27,`$FRAME-8*5`($sp)\n+\tld\tr28,`$FRAME-8*4`($sp)\n+\tld\tr29,`$FRAME-8*3`($sp)\n+\tld\tr30,`$FRAME-8*2`($sp)\n+\tld\tr31,`$FRAME-8*1`($sp)\n+\taddi\t$sp,$sp,$FRAME\n+\tblr\n+\t.long\t0\n+\t.byte\t0,12,4,0,0x80,11,3,0\n+\t.long\t0\n+.size\tx25519_fe51_mul,.-x25519_fe51_mul\n+___\n+{\n+my ($a0,$a1,$a2,$a3,$a4,$t0,$t1) \u003d ($a0,$a1,$a2,$a3,$a4,$t0,$t1);\n+$code.\u003d\u003c\u003c___;\n+.globl\tx25519_fe51_sqr\n+.type\tx25519_fe51_sqr,\u005c@function\n+.align\t5\n+x25519_fe51_sqr:\n+\tstdu\t$sp,-$FRAME($sp)\n+\tstd\tr21,`$FRAME-8*11`($sp)\n+\tstd\tr22,`$FRAME-8*10`($sp)\n+\tstd\tr23,`$FRAME-8*9`($sp)\n+\tstd\tr24,`$FRAME-8*8`($sp)\n+\tstd\tr25,`$FRAME-8*7`($sp)\n+\tstd\tr26,`$FRAME-8*6`($sp)\n+\tstd\tr27,`$FRAME-8*5`($sp)\n+\tstd\tr28,`$FRAME-8*4`($sp)\n+\tstd\tr29,`$FRAME-8*3`($sp)\n+\tstd\tr30,`$FRAME-8*2`($sp)\n+\tstd\tr31,`$FRAME-8*1`($sp)\n+\n+\tld\t$a0,0($ap)\n+\tld\t$a1,8($ap)\n+\tld\t$a2,16($ap)\n+\tld\t$a3,24($ap)\n+\tld\t$a4,32($ap)\n+\n+\tadd\t$bi,$a0,$a0\t\t# a[0]*2\n+\tmulli\t$t1,$a4,19\t\t# a[4]*19\n+\n+\tmulld\t$h0lo,$a0,$a0\n+\tmulhdu\t$h0hi,$a0,$a0\n+\tmulld\t$h1lo,$a1,$bi\n+\tmulhdu\t$h1hi,$a1,$bi\n+\tmulld\t$h2lo,$a2,$bi\n+\tmulhdu\t$h2hi,$a2,$bi\n+\tmulld\t$h3lo,$a3,$bi\n+\tmulhdu\t$h3hi,$a3,$bi\n+\tmulld\t$h4lo,$a4,$bi\n+\tmulhdu\t$h4hi,$a4,$bi\n+\tadd\t$bi,$a1,$a1\t\t# a[1]*2\n+___\n+\t($a4,$t1) \u003d ($t1,$a4);\n+$code.\u003d\u003c\u003c___;\n+\tmulld\t$t0,$t1,$a4\n+\tmulhdu\t$t1,$t1,$a4\n+\taddc\t$h3lo,$h3lo,$t0\n+\tadde\t$h3hi,$h3hi,$t1\n+\n+\tmulli\t$bp,$a3,19\t\t# a[3]*19\n+\n+\tmulld\t$t0,$a1,$a1\n+\tmulhdu\t$t1,$a1,$a1\n+\taddc\t$h2lo,$h2lo,$t0\n+\tadde\t$h2hi,$h2hi,$t1\n+\tmulld\t$t0,$a2,$bi\n+\tmulhdu\t$t1,$a2,$bi\n+\taddc\t$h3lo,$h3lo,$t0\n+\tadde\t$h3hi,$h3hi,$t1\n+\tmulld\t$t0,$a3,$bi\n+\tmulhdu\t$t1,$a3,$bi\n+\taddc\t$h4lo,$h4lo,$t0\n+\tadde\t$h4hi,$h4hi,$t1\n+\tmulld\t$t0,$a4,$bi\n+\tmulhdu\t$t1,$a4,$bi\n+\tadd\t$bi,$a3,$a3\t\t# a[3]*2\n+\taddc\t$h0lo,$h0lo,$t0\n+\tadde\t$h0hi,$h0hi,$t1\n+___\n+\t($a3,$t1) \u003d ($bp,$a3);\n+$code.\u003d\u003c\u003c___;\n+\tmulld\t$t0,$t1,$a3\n+\tmulhdu\t$t1,$t1,$a3\n+\taddc\t$h1lo,$h1lo,$t0\n+\tadde\t$h1hi,$h1hi,$t1\n+\tmulld\t$t0,$bi,$a4\n+\tmulhdu\t$t1,$bi,$a4\n+\tadd\t$bi,$a2,$a2\t\t# a[2]*2\n+\taddc\t$h2lo,$h2lo,$t0\n+\tadde\t$h2hi,$h2hi,$t1\n+\n+\tmulld\t$t0,$a2,$a2\n+\tmulhdu\t$t1,$a2,$a2\n+\taddc\t$h4lo,$h4lo,$t0\n+\tadde\t$h4hi,$h4hi,$t1\n+\tmulld\t$t0,$a3,$bi\n+\tmulhdu\t$t1,$a3,$bi\n+\taddc\t$h0lo,$h0lo,$t0\n+\tadde\t$h0hi,$h0hi,$t1\n+\tmulld\t$t0,$a4,$bi\n+\tmulhdu\t$t1,$a4,$bi\n+\taddc\t$h1lo,$h1lo,$t0\n+\tadde\t$h1hi,$h1hi,$t1\n+\n+\tb\t.Lfe51_reduce\n+\t.long\t0\n+\t.byte\t0,12,4,0,0x80,11,2,0\n+\t.long\t0\n+.size\tx25519_fe51_sqr,.-x25519_fe51_sqr\n+___\n+}\n+$code.\u003d\u003c\u003c___;\n+.globl\tx25519_fe51_mul121666\n+.type\tx25519_fe51_mul121666,\u005c@function\n+.align\t5\n+x25519_fe51_mul121666:\n+\tstdu\t$sp,-$FRAME($sp)\n+\tstd\tr21,`$FRAME-8*11`($sp)\n+\tstd\tr22,`$FRAME-8*10`($sp)\n+\tstd\tr23,`$FRAME-8*9`($sp)\n+\tstd\tr24,`$FRAME-8*8`($sp)\n+\tstd\tr25,`$FRAME-8*7`($sp)\n+\tstd\tr26,`$FRAME-8*6`($sp)\n+\tstd\tr27,`$FRAME-8*5`($sp)\n+\tstd\tr28,`$FRAME-8*4`($sp)\n+\tstd\tr29,`$FRAME-8*3`($sp)\n+\tstd\tr30,`$FRAME-8*2`($sp)\n+\tstd\tr31,`$FRAME-8*1`($sp)\n+\n+\tlis\t$bi,`65536\u003e\u003e16`\n+\tori\t$bi,$bi,`121666-65536`\n+\tld\t$a0,0($ap)\n+\tld\t$a1,8($ap)\n+\tld\t$a2,16($ap)\n+\tld\t$a3,24($ap)\n+\tld\t$a4,32($ap)\n+\n+\tmulld\t$h0lo,$a0,$bi\t\t# a[0]*121666\n+\tmulhdu\t$h0hi,$a0,$bi\n+\tmulld\t$h1lo,$a1,$bi\t\t# a[1]*121666\n+\tmulhdu\t$h1hi,$a1,$bi\n+\tmulld\t$h2lo,$a2,$bi\t\t# a[2]*121666\n+\tmulhdu\t$h2hi,$a2,$bi\n+\tmulld\t$h3lo,$a3,$bi\t\t# a[3]*121666\n+\tmulhdu\t$h3hi,$a3,$bi\n+\tmulld\t$h4lo,$a4,$bi\t\t# a[4]*121666\n+\tmulhdu\t$h4hi,$a4,$bi\n+\n+\tb\t.Lfe51_reduce\n+\t.long\t0\n+\t.byte\t0,12,4,0,0x80,11,2,0\n+\t.long\t0\n+.size\tx25519_fe51_mul121666,.-x25519_fe51_mul121666\n+___\n+}\n+\n+$code \u003d~ s/\u005c`([^\u005c`]*)\u005c`/eval $1/gem;\n+print $code;\n+close STDOUT;\ndiff --git a/crypto/ec/build.info b/crypto/ec/build.info\nindex db506c5..a1e673e 100644\n--- a/crypto/ec/build.info\n+++ b/crypto/ec/build.info\n@@ -27,6 +27,7 @@ INCLUDE[ecp_nistz256-armv8.o]\u003d..\n GENERATE[ecp_nistz256-ppc64.s]\u003dasm/ecp_nistz256-ppc64.pl $(PERLASM_SCHEME)\n \n GENERATE[x25519-x86_64.s]\u003dasm/x25519-x86_64.pl $(PERLASM_SCHEME)\n+GENERATE[x25519-ppc64.s]\u003dasm/x25519-ppc64.pl $(PERLASM_SCHEME)\n \n BEGINRAW[Makefile]\n {- $builddir -}/ecp_nistz256-%.S:\t{- $sourcedir -}/asm/ecp_nistz256-%.pl\n","s":{"c":1752658436,"u": 35345}}
],"g": 38860,"chitpc": 0,"ehitpc": 0,"indexed":0
,
"ab": 0, "si": 0, "db":0, "di":0, "sat":0, "lfc": "0000"}