Latest update.

This commit is contained in:
2019-01-18 00:56:21 +09:00
parent 5b465b332e
commit 87e37412f8
71 changed files with 4462 additions and 622 deletions
+41 -36
View File
@@ -62,14 +62,12 @@ uint32_t OPENSSL_rdtsc(void)
# if defined(__GNUC__) && __GNUC__>=2
void OPENSSL_cpuid_setup(void) __attribute__ ((constructor));
# endif
/*
* Use a weak reference to getauxval() so we can use it if it is available but
* don't break the build if it is not.
*/
# if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__)
extern unsigned long getauxval(unsigned long type) __attribute__ ((weak));
# else
static unsigned long (*getauxval) (unsigned long) = NULL;
# if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
# if __GLIBC_PREREQ(2, 16)
# include <sys/auxv.h>
# define OSSL_IMPLEMENT_GETAUXVAL
# endif
# endif
/*
@@ -134,6 +132,33 @@ void OPENSSL_cpuid_setup(void)
*/
# endif
OPENSSL_armcap_P = 0;
# ifdef OSSL_IMPLEMENT_GETAUXVAL
if (getauxval(HWCAP) & HWCAP_NEON) {
unsigned long hwcap = getauxval(HWCAP_CE);
OPENSSL_armcap_P |= ARMV7_NEON;
if (hwcap & HWCAP_CE_AES)
OPENSSL_armcap_P |= ARMV8_AES;
if (hwcap & HWCAP_CE_PMULL)
OPENSSL_armcap_P |= ARMV8_PMULL;
if (hwcap & HWCAP_CE_SHA1)
OPENSSL_armcap_P |= ARMV8_SHA1;
if (hwcap & HWCAP_CE_SHA256)
OPENSSL_armcap_P |= ARMV8_SHA256;
# ifdef __aarch64__
if (hwcap & HWCAP_CE_SHA512)
OPENSSL_armcap_P |= ARMV8_SHA512;
# endif
}
# endif
sigfillset(&all_masked);
sigdelset(&all_masked, SIGILL);
sigdelset(&all_masked, SIGTRAP);
@@ -141,8 +166,6 @@ void OPENSSL_cpuid_setup(void)
sigdelset(&all_masked, SIGBUS);
sigdelset(&all_masked, SIGSEGV);
OPENSSL_armcap_P = 0;
memset(&ill_act, 0, sizeof(ill_act));
ill_act.sa_handler = ill_handler;
ill_act.sa_mask = all_masked;
@@ -150,30 +173,9 @@ void OPENSSL_cpuid_setup(void)
sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset);
sigaction(SIGILL, &ill_act, &ill_oact);
if (getauxval != NULL) {
if (getauxval(HWCAP) & HWCAP_NEON) {
unsigned long hwcap = getauxval(HWCAP_CE);
OPENSSL_armcap_P |= ARMV7_NEON;
if (hwcap & HWCAP_CE_AES)
OPENSSL_armcap_P |= ARMV8_AES;
if (hwcap & HWCAP_CE_PMULL)
OPENSSL_armcap_P |= ARMV8_PMULL;
if (hwcap & HWCAP_CE_SHA1)
OPENSSL_armcap_P |= ARMV8_SHA1;
if (hwcap & HWCAP_CE_SHA256)
OPENSSL_armcap_P |= ARMV8_SHA256;
# ifdef __aarch64__
if (hwcap & HWCAP_CE_SHA512)
OPENSSL_armcap_P |= ARMV8_SHA512;
# endif
}
} else if (sigsetjmp(ill_jmp, 1) == 0) {
/* If we used getauxval, we already have all the values */
# ifndef OSSL_IMPLEMENT_GETAUXVAL
if (sigsetjmp(ill_jmp, 1) == 0) {
_armv7_neon_probe();
OPENSSL_armcap_P |= ARMV7_NEON;
if (sigsetjmp(ill_jmp, 1) == 0) {
@@ -191,13 +193,16 @@ void OPENSSL_cpuid_setup(void)
_armv8_sha256_probe();
OPENSSL_armcap_P |= ARMV8_SHA256;
}
# if defined(__aarch64__) && !defined(__APPLE__)
# if defined(__aarch64__) && !defined(__APPLE__)
if (sigsetjmp(ill_jmp, 1) == 0) {
_armv8_sha512_probe();
OPENSSL_armcap_P |= ARMV8_SHA512;
}
# endif
# endif
}
# endif
/* Things that getauxval didn't tell us */
if (sigsetjmp(ill_jmp, 1) == 0) {
_armv7_tick();
OPENSSL_armcap_P |= ARMV7_TICK;
+1 -1
View File
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by crypto/asn1/charmap.pl
*
* Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 2000-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
+1 -1
View File
@@ -1,5 +1,5 @@
#! /usr/bin/env perl
# Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved.
# Copyright 2000-2019 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
+13 -11
View File
@@ -20,14 +20,15 @@
#define SPACE(buf, pos, n) (sizeof(buf) - (pos) > (n))
int BIO_dump_cb(int (*cb) (const void *data, size_t len, void *u),
void *u, const char *s, int len)
void *u, const void *s, int len)
{
return BIO_dump_indent_cb(cb, u, s, len, 0);
}
int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u),
void *u, const char *s, int len, int indent)
void *u, const void *v, int len, int indent)
{
const unsigned char *s = v;
int ret = 0;
char buf[288 + 1];
int i, j, rows, n;
@@ -51,7 +52,7 @@ int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u),
if (((i * dump_width) + j) >= len) {
strcpy(buf + n, " ");
} else {
ch = ((unsigned char)*(s + i * dump_width + j)) & 0xff;
ch = *(s + i * dump_width + j) & 0xff;
BIO_snprintf(buf + n, 4, "%02x%c", ch,
j == 7 ? '-' : ' ');
}
@@ -66,7 +67,7 @@ int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u),
if (((i * dump_width) + j) >= len)
break;
if (SPACE(buf, n, 1)) {
ch = ((unsigned char)*(s + i * dump_width + j)) & 0xff;
ch = *(s + i * dump_width + j) & 0xff;
#ifndef CHARSET_EBCDIC
buf[n++] = ((ch >= ' ') && (ch <= '~')) ? ch : '.';
#else
@@ -96,12 +97,12 @@ static int write_fp(const void *data, size_t len, void *fp)
return UP_fwrite(data, len, 1, fp);
}
int BIO_dump_fp(FILE *fp, const char *s, int len)
int BIO_dump_fp(FILE *fp, const void *s, int len)
{
return BIO_dump_cb(write_fp, fp, s, len);
}
int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent)
int BIO_dump_indent_fp(FILE *fp, const void *s, int len, int indent)
{
return BIO_dump_indent_cb(write_fp, fp, s, len, indent);
}
@@ -112,19 +113,20 @@ static int write_bio(const void *data, size_t len, void *bp)
return BIO_write((BIO *)bp, (const char *)data, len);
}
int BIO_dump(BIO *bp, const char *s, int len)
int BIO_dump(BIO *bp, const void *s, int len)
{
return BIO_dump_cb(write_bio, bp, s, len);
}
int BIO_dump_indent(BIO *bp, const char *s, int len, int indent)
int BIO_dump_indent(BIO *bp, const void *s, int len, int indent)
{
return BIO_dump_indent_cb(write_bio, bp, s, len, indent);
}
int BIO_hex_string(BIO *out, int indent, int width, unsigned char *data,
int BIO_hex_string(BIO *out, int indent, int width, const void *data,
int datalen)
{
const unsigned char *d = data;
int i, j = 0;
if (datalen < 1)
@@ -134,7 +136,7 @@ int BIO_hex_string(BIO *out, int indent, int width, unsigned char *data,
if (i && !j)
BIO_printf(out, "%*s", indent, "");
BIO_printf(out, "%02X:", data[i]);
BIO_printf(out, "%02X:", d[i]);
j = (j + 1) % width;
if (!j)
@@ -143,6 +145,6 @@ int BIO_hex_string(BIO *out, int indent, int width, unsigned char *data,
if (i && !j)
BIO_printf(out, "%*s", indent, "");
BIO_printf(out, "%02X", data[datalen - 1]);
BIO_printf(out, "%02X", d[datalen - 1]);
return 1;
}
+34 -32
View File
@@ -648,34 +648,41 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
goto err;
}
#ifdef RSAZ_ENABLED
if (!a->neg) {
/*
* If the size of the operands allow it, perform the optimized
* RSAZ exponentiation. For further information see
* crypto/bn/rsaz_exp.c and accompanying assembly modules.
*/
if ((16 == a->top) && (16 == p->top) && (BN_num_bits(m) == 1024)
&& rsaz_avx2_eligible()) {
if (NULL == bn_wexpand(rr, 16))
goto err;
RSAZ_1024_mod_exp_avx2(rr->d, a->d, p->d, m->d, mont->RR.d,
mont->n0[0]);
rr->top = 16;
rr->neg = 0;
bn_correct_top(rr);
ret = 1;
goto err;
} else if ((8 == a->top) && (8 == p->top) && (BN_num_bits(m) == 512)) {
if (NULL == bn_wexpand(rr, 8))
goto err;
RSAZ_512_mod_exp(rr->d, a->d, p->d, m->d, mont->n0[0], mont->RR.d);
rr->top = 8;
rr->neg = 0;
bn_correct_top(rr);
ret = 1;
if (a->neg || BN_ucmp(a, m) >= 0) {
BIGNUM *reduced = BN_CTX_get(ctx);
if (reduced == NULL
|| !BN_nnmod(reduced, a, m, ctx)) {
goto err;
}
a = reduced;
}
#ifdef RSAZ_ENABLED
/*
* If the size of the operands allow it, perform the optimized
* RSAZ exponentiation. For further information see
* crypto/bn/rsaz_exp.c and accompanying assembly modules.
*/
if ((16 == a->top) && (16 == p->top) && (BN_num_bits(m) == 1024)
&& rsaz_avx2_eligible()) {
if (NULL == bn_wexpand(rr, 16))
goto err;
RSAZ_1024_mod_exp_avx2(rr->d, a->d, p->d, m->d, mont->RR.d,
mont->n0[0]);
rr->top = 16;
rr->neg = 0;
bn_correct_top(rr);
ret = 1;
goto err;
} else if ((8 == a->top) && (8 == p->top) && (BN_num_bits(m) == 512)) {
if (NULL == bn_wexpand(rr, 8))
goto err;
RSAZ_512_mod_exp(rr->d, a->d, p->d, m->d, mont->n0[0], mont->RR.d);
rr->top = 8;
rr->neg = 0;
bn_correct_top(rr);
ret = 1;
goto err;
}
#endif
@@ -747,12 +754,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
goto err;
/* prepare a^1 in Montgomery domain */
if (a->neg || BN_ucmp(a, m) >= 0) {
if (!BN_nnmod(&am, a, m, ctx))
goto err;
if (!bn_to_mont_fixed_top(&am, &am, mont, ctx))
goto err;
} else if (!bn_to_mont_fixed_top(&am, a, mont, ctx))
if (!bn_to_mont_fixed_top(&am, a, mont, ctx))
goto err;
#if defined(SPARC_T4_MONT)
+1 -1
View File
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by crypto/bn/bn_prime.pl
*
* Copyright 1998-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 1998-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
+1 -1
View File
@@ -1,5 +1,5 @@
#! /usr/bin/env perl
# Copyright 1998-2018 The OpenSSL Project Authors. All Rights Reserved.
# Copyright 1998-2019 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
+545 -247
View File
@@ -1,5 +1,5 @@
#! /usr/bin/env perl
# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
# Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
@@ -20,41 +20,46 @@
#
# 3 times faster than compiler-generated code.
$flavour = shift;
#
# August 2018
#
# Add vx code path.
#
# Copyright IBM Corp. 2018
# Author: Patrick Steuer <patrick.steuer@de.ibm.com>
use strict;
use FindBin qw($Bin);
use lib "$Bin/../..";
use perlasm::s390x qw(:DEFAULT :VX AUTOLOAD LABEL INCLUDE);
my $flavour = shift;
my ($z,$SIZE_T);
if ($flavour =~ /3[12]/) {
$z=0; # S/390 ABI
$SIZE_T=4;
$g="";
} else {
$z=1; # zSeries ABI
$SIZE_T=8;
$g="g";
}
my $output;
while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
open STDOUT,">$output";
sub AUTOLOAD() # thunk [simplified] x86-style perlasm
{ my $opcode = $AUTOLOAD; $opcode =~ s/.*:://;
$code .= "\t$opcode\t".join(',',@_)."\n";
}
my $sp="%r15";
my $stdframe=16*$SIZE_T+4*8;
my $frame=$stdframe+4*20;
my ($out,$inp,$len,$key,$counter)=map("%r$_",(2..6));
my @x=map("%r$_",(0..7,"x","x","x","x",(10..13)));
my @t=map("%r$_",(8,9));
my @v=map("%v$_",(16..31));
sub ROUND {
my ($a0,$b0,$c0,$d0)=@_;
my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0));
my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1));
my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2));
my ($xc,$xc_)=map("\"$_\"",@t);
my @x=map("\"$_\"",@x);
my ($xc,$xc_)=map("$_",@t);
# Consider order in which variables are addressed by their
# index:
@@ -78,249 +83,542 @@ my @x=map("\"$_\"",@x);
# 'c' stores and loads in the middle, but none in the beginning
# or end.
(
"&alr (@x[$a0],@x[$b0])", # Q1
"&alr (@x[$a1],@x[$b1])", # Q2
"&xr (@x[$d0],@x[$a0])",
"&xr (@x[$d1],@x[$a1])",
"&rll (@x[$d0],@x[$d0],16)",
"&rll (@x[$d1],@x[$d1],16)",
alr (@x[$a0],@x[$b0]); # Q1
alr (@x[$a1],@x[$b1]); # Q2
xr (@x[$d0],@x[$a0]);
xr (@x[$d1],@x[$a1]);
rll (@x[$d0],@x[$d0],16);
rll (@x[$d1],@x[$d1],16);
"&alr ($xc,@x[$d0])",
"&alr ($xc_,@x[$d1])",
"&xr (@x[$b0],$xc)",
"&xr (@x[$b1],$xc_)",
"&rll (@x[$b0],@x[$b0],12)",
"&rll (@x[$b1],@x[$b1],12)",
alr ($xc,@x[$d0]);
alr ($xc_,@x[$d1]);
xr (@x[$b0],$xc);
xr (@x[$b1],$xc_);
rll (@x[$b0],@x[$b0],12);
rll (@x[$b1],@x[$b1],12);
"&alr (@x[$a0],@x[$b0])",
"&alr (@x[$a1],@x[$b1])",
"&xr (@x[$d0],@x[$a0])",
"&xr (@x[$d1],@x[$a1])",
"&rll (@x[$d0],@x[$d0],8)",
"&rll (@x[$d1],@x[$d1],8)",
alr (@x[$a0],@x[$b0]);
alr (@x[$a1],@x[$b1]);
xr (@x[$d0],@x[$a0]);
xr (@x[$d1],@x[$a1]);
rll (@x[$d0],@x[$d0],8);
rll (@x[$d1],@x[$d1],8);
"&alr ($xc,@x[$d0])",
"&alr ($xc_,@x[$d1])",
"&xr (@x[$b0],$xc)",
"&xr (@x[$b1],$xc_)",
"&rll (@x[$b0],@x[$b0],7)",
"&rll (@x[$b1],@x[$b1],7)",
alr ($xc,@x[$d0]);
alr ($xc_,@x[$d1]);
xr (@x[$b0],$xc);
xr (@x[$b1],$xc_);
rll (@x[$b0],@x[$b0],7);
rll (@x[$b1],@x[$b1],7);
"&stm ($xc,$xc_,'$stdframe+4*8+4*$c0($sp)')", # reload pair of 'c's
"&lm ($xc,$xc_,'$stdframe+4*8+4*$c2($sp)')",
stm ($xc,$xc_,"$stdframe+4*8+4*$c0($sp)"); # reload pair of 'c's
lm ($xc,$xc_,"$stdframe+4*8+4*$c2($sp)");
"&alr (@x[$a2],@x[$b2])", # Q3
"&alr (@x[$a3],@x[$b3])", # Q4
"&xr (@x[$d2],@x[$a2])",
"&xr (@x[$d3],@x[$a3])",
"&rll (@x[$d2],@x[$d2],16)",
"&rll (@x[$d3],@x[$d3],16)",
alr (@x[$a2],@x[$b2]); # Q3
alr (@x[$a3],@x[$b3]); # Q4
xr (@x[$d2],@x[$a2]);
xr (@x[$d3],@x[$a3]);
rll (@x[$d2],@x[$d2],16);
rll (@x[$d3],@x[$d3],16);
"&alr ($xc,@x[$d2])",
"&alr ($xc_,@x[$d3])",
"&xr (@x[$b2],$xc)",
"&xr (@x[$b3],$xc_)",
"&rll (@x[$b2],@x[$b2],12)",
"&rll (@x[$b3],@x[$b3],12)",
alr ($xc,@x[$d2]);
alr ($xc_,@x[$d3]);
xr (@x[$b2],$xc);
xr (@x[$b3],$xc_);
rll (@x[$b2],@x[$b2],12);
rll (@x[$b3],@x[$b3],12);
"&alr (@x[$a2],@x[$b2])",
"&alr (@x[$a3],@x[$b3])",
"&xr (@x[$d2],@x[$a2])",
"&xr (@x[$d3],@x[$a3])",
"&rll (@x[$d2],@x[$d2],8)",
"&rll (@x[$d3],@x[$d3],8)",
alr (@x[$a2],@x[$b2]);
alr (@x[$a3],@x[$b3]);
xr (@x[$d2],@x[$a2]);
xr (@x[$d3],@x[$a3]);
rll (@x[$d2],@x[$d2],8);
rll (@x[$d3],@x[$d3],8);
"&alr ($xc,@x[$d2])",
"&alr ($xc_,@x[$d3])",
"&xr (@x[$b2],$xc)",
"&xr (@x[$b3],$xc_)",
"&rll (@x[$b2],@x[$b2],7)",
"&rll (@x[$b3],@x[$b3],7)"
);
alr ($xc,@x[$d2]);
alr ($xc_,@x[$d3]);
xr (@x[$b2],$xc);
xr (@x[$b3],$xc_);
rll (@x[$b2],@x[$b2],7);
rll (@x[$b3],@x[$b3],7);
}
$code.=<<___;
.text
sub VX_ROUND {
my ($a0,$b0,$c0,$d0)=@_;
my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0));
my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1));
my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2));
.globl ChaCha20_ctr32
.type ChaCha20_ctr32,\@function
.align 32
ChaCha20_ctr32:
lt${g}r $len,$len # $len==0?
bzr %r14
a${g}hi $len,-64
l${g}hi %r1,-$frame
stm${g} %r6,%r15,`6*$SIZE_T`($sp)
sl${g}r $out,$inp # difference
la $len,0($inp,$len) # end of input minus 64
larl %r7,.Lsigma
lgr %r0,$sp
la $sp,0(%r1,$sp)
st${g} %r0,0($sp)
vaf (@v[$a0],@v[$a0],@v[$b0]);
vaf (@v[$a1],@v[$a1],@v[$b1]);
vaf (@v[$a2],@v[$a2],@v[$b2]);
vaf (@v[$a3],@v[$a3],@v[$b3]);
vx (@v[$d0],@v[$d0],@v[$a0]);
vx (@v[$d1],@v[$d1],@v[$a1]);
vx (@v[$d2],@v[$d2],@v[$a2]);
vx (@v[$d3],@v[$d3],@v[$a3]);
verllf (@v[$d0],@v[$d0],16);
verllf (@v[$d1],@v[$d1],16);
verllf (@v[$d2],@v[$d2],16);
verllf (@v[$d3],@v[$d3],16);
lmg %r8,%r11,0($key) # load key
lmg %r12,%r13,0($counter) # load counter
lmg %r6,%r7,0(%r7) # load sigma constant
vaf (@v[$c0],@v[$c0],@v[$d0]);
vaf (@v[$c1],@v[$c1],@v[$d1]);
vaf (@v[$c2],@v[$c2],@v[$d2]);
vaf (@v[$c3],@v[$c3],@v[$d3]);
vx (@v[$b0],@v[$b0],@v[$c0]);
vx (@v[$b1],@v[$b1],@v[$c1]);
vx (@v[$b2],@v[$b2],@v[$c2]);
vx (@v[$b3],@v[$b3],@v[$c3]);
verllf (@v[$b0],@v[$b0],12);
verllf (@v[$b1],@v[$b1],12);
verllf (@v[$b2],@v[$b2],12);
verllf (@v[$b3],@v[$b3],12);
la %r14,0($inp)
st${g} $out,$frame+3*$SIZE_T($sp)
st${g} $len,$frame+4*$SIZE_T($sp)
stmg %r6,%r13,$stdframe($sp) # copy key schedule to stack
srlg @x[12],%r12,32 # 32-bit counter value
j .Loop_outer
vaf (@v[$a0],@v[$a0],@v[$b0]);
vaf (@v[$a1],@v[$a1],@v[$b1]);
vaf (@v[$a2],@v[$a2],@v[$b2]);
vaf (@v[$a3],@v[$a3],@v[$b3]);
vx (@v[$d0],@v[$d0],@v[$a0]);
vx (@v[$d1],@v[$d1],@v[$a1]);
vx (@v[$d2],@v[$d2],@v[$a2]);
vx (@v[$d3],@v[$d3],@v[$a3]);
verllf (@v[$d0],@v[$d0],8);
verllf (@v[$d1],@v[$d1],8);
verllf (@v[$d2],@v[$d2],8);
verllf (@v[$d3],@v[$d3],8);
.align 16
.Loop_outer:
lm @x[0],@x[7],$stdframe+4*0($sp) # load x[0]-x[7]
lm @t[0],@t[1],$stdframe+4*10($sp) # load x[10]-x[11]
lm @x[13],@x[15],$stdframe+4*13($sp) # load x[13]-x[15]
stm @t[0],@t[1],$stdframe+4*8+4*10($sp) # offload x[10]-x[11]
lm @t[0],@t[1],$stdframe+4*8($sp) # load x[8]-x[9]
st @x[12],$stdframe+4*12($sp) # save counter
st${g} %r14,$frame+2*$SIZE_T($sp) # save input pointer
lhi %r14,10
j .Loop
.align 4
.Loop:
___
foreach (&ROUND(0, 4, 8,12)) { eval; }
foreach (&ROUND(0, 5,10,15)) { eval; }
$code.=<<___;
brct %r14,.Loop
l${g} %r14,$frame+2*$SIZE_T($sp) # pull input pointer
stm @t[0],@t[1],$stdframe+4*8+4*8($sp) # offload x[8]-x[9]
lm${g} @t[0],@t[1],$frame+3*$SIZE_T($sp)
al @x[0],$stdframe+4*0($sp) # accumulate key schedule
al @x[1],$stdframe+4*1($sp)
al @x[2],$stdframe+4*2($sp)
al @x[3],$stdframe+4*3($sp)
al @x[4],$stdframe+4*4($sp)
al @x[5],$stdframe+4*5($sp)
al @x[6],$stdframe+4*6($sp)
al @x[7],$stdframe+4*7($sp)
lrvr @x[0],@x[0]
lrvr @x[1],@x[1]
lrvr @x[2],@x[2]
lrvr @x[3],@x[3]
lrvr @x[4],@x[4]
lrvr @x[5],@x[5]
lrvr @x[6],@x[6]
lrvr @x[7],@x[7]
al @x[12],$stdframe+4*12($sp)
al @x[13],$stdframe+4*13($sp)
al @x[14],$stdframe+4*14($sp)
al @x[15],$stdframe+4*15($sp)
lrvr @x[12],@x[12]
lrvr @x[13],@x[13]
lrvr @x[14],@x[14]
lrvr @x[15],@x[15]
la @t[0],0(@t[0],%r14) # reconstruct output pointer
cl${g}r %r14,@t[1]
jh .Ltail
x @x[0],4*0(%r14) # xor with input
x @x[1],4*1(%r14)
st @x[0],4*0(@t[0]) # store output
x @x[2],4*2(%r14)
st @x[1],4*1(@t[0])
x @x[3],4*3(%r14)
st @x[2],4*2(@t[0])
x @x[4],4*4(%r14)
st @x[3],4*3(@t[0])
lm @x[0],@x[3],$stdframe+4*8+4*8($sp) # load x[8]-x[11]
x @x[5],4*5(%r14)
st @x[4],4*4(@t[0])
x @x[6],4*6(%r14)
al @x[0],$stdframe+4*8($sp)
st @x[5],4*5(@t[0])
x @x[7],4*7(%r14)
al @x[1],$stdframe+4*9($sp)
st @x[6],4*6(@t[0])
x @x[12],4*12(%r14)
al @x[2],$stdframe+4*10($sp)
st @x[7],4*7(@t[0])
x @x[13],4*13(%r14)
al @x[3],$stdframe+4*11($sp)
st @x[12],4*12(@t[0])
x @x[14],4*14(%r14)
st @x[13],4*13(@t[0])
x @x[15],4*15(%r14)
st @x[14],4*14(@t[0])
lrvr @x[0],@x[0]
st @x[15],4*15(@t[0])
lrvr @x[1],@x[1]
lrvr @x[2],@x[2]
lrvr @x[3],@x[3]
lhi @x[12],1
x @x[0],4*8(%r14)
al @x[12],$stdframe+4*12($sp) # increment counter
x @x[1],4*9(%r14)
st @x[0],4*8(@t[0])
x @x[2],4*10(%r14)
st @x[1],4*9(@t[0])
x @x[3],4*11(%r14)
st @x[2],4*10(@t[0])
st @x[3],4*11(@t[0])
cl${g}r %r14,@t[1] # done yet?
la %r14,64(%r14)
jl .Loop_outer
.Ldone:
xgr %r0,%r0
xgr %r1,%r1
xgr %r2,%r2
xgr %r3,%r3
stmg %r0,%r3,$stdframe+4*4($sp) # wipe key copy
stmg %r0,%r3,$stdframe+4*12($sp)
lm${g} %r6,%r15,`$frame+6*$SIZE_T`($sp)
br %r14
.align 16
.Ltail:
la @t[1],64($t[1])
stm @x[0],@x[7],$stdframe+4*0($sp)
sl${g}r @t[1],%r14
lm @x[0],@x[3],$stdframe+4*8+4*8($sp)
l${g}hi @x[6],0
stm @x[12],@x[15],$stdframe+4*12($sp)
al @x[0],$stdframe+4*8($sp)
al @x[1],$stdframe+4*9($sp)
al @x[2],$stdframe+4*10($sp)
al @x[3],$stdframe+4*11($sp)
lrvr @x[0],@x[0]
lrvr @x[1],@x[1]
lrvr @x[2],@x[2]
lrvr @x[3],@x[3]
stm @x[0],@x[3],$stdframe+4*8($sp)
.Loop_tail:
llgc @x[4],0(@x[6],%r14)
llgc @x[5],$stdframe(@x[6],$sp)
xr @x[5],@x[4]
stc @x[5],0(@x[6],@t[0])
la @x[6],1(@x[6])
brct @t[1],.Loop_tail
j .Ldone
.size ChaCha20_ctr32,.-ChaCha20_ctr32
.align 32
.Lsigma:
.long 0x61707865,0x3320646e,0x79622d32,0x6b206574 # endian-neutral
.asciz "ChaCha20 for s390x, CRYPTOGAMS by <appro\@openssl.org>"
.align 4
___
foreach (split("\n",$code)) {
s/\`([^\`]*)\`/eval $1/ge;
print $_,"\n";
vaf (@v[$c0],@v[$c0],@v[$d0]);
vaf (@v[$c1],@v[$c1],@v[$d1]);
vaf (@v[$c2],@v[$c2],@v[$d2]);
vaf (@v[$c3],@v[$c3],@v[$d3]);
vx (@v[$b0],@v[$b0],@v[$c0]);
vx (@v[$b1],@v[$b1],@v[$c1]);
vx (@v[$b2],@v[$b2],@v[$c2]);
vx (@v[$b3],@v[$b3],@v[$c3]);
verllf (@v[$b0],@v[$b0],7);
verllf (@v[$b1],@v[$b1],7);
verllf (@v[$b2],@v[$b2],7);
verllf (@v[$b3],@v[$b3],7);
}
close STDOUT;
PERLASM_BEGIN($output);
INCLUDE ("s390x_arch.h");
TEXT ();
################
# void ChaCha20_ctr32(unsigned char *out, const unsigned char *inp, size_t len,
# const unsigned int key[8], const unsigned int counter[4])
{
my ($out,$inp,$len,$key,$counter)=map("%r$_",(2..6));
# VX CODE PATH
{
my $off=$z*8*16+8; # offset(initial state)
my $frame=$stdframe+4*16+$off;
GLOBL ("ChaCha20_ctr32");
TYPE ("ChaCha20_ctr32","\@function");
ALIGN (32);
LABEL ("ChaCha20_ctr32");
larl ("%r1","OPENSSL_s390xcap_P");
lghi ("%r0",64);
&{$z? \&cgr:\&cr} ($len,"%r0");
jle ("_s390x_chacha_novx");
lg ("%r0","S390X_STFLE+16(%r1)");
tmhh ("%r0",0x4000); # check for vector facility
jz ("_s390x_chacha_novx");
if (!$z) {
llgfr ($len,$len);
std ("%f4","16*$SIZE_T+2*8($sp)");
std ("%f6","16*$SIZE_T+3*8($sp)");
}
&{$z? \&stmg:\&stm} ("%r6","%r7","6*$SIZE_T($sp)");
lghi ("%r1",-$frame);
lgr ("%r0",$sp);
la ($sp,"0(%r1,$sp)"); # allocate stack frame
larl ("%r7",".Lsigma");
&{$z? \&stg:\&st} ("%r0","0($sp)"); # backchain
vstm ("%v8","%v15","8($sp)") if ($z);
vlm ("%v1","%v2","0($key)"); # load key
vl ("%v0","0(%r7)"); # load sigma constant
vl ("%v3","0($counter)"); # load iv (counter||nonce)
l ("%r0","0($counter)"); # load counter
vstm ("%v0","%v3","$off($sp)"); # copy initial state to stack
srlg ("%r1",$len,8);
ltgr ("%r1","%r1");
jz (".Lvx_4x_done");
ALIGN (16); # process 4 64-byte blocks
LABEL (".Lvx_4x");
vlrepf ("%v$_",($_*4)."+$off($sp)") for (0..15); # load initial
# state
vl ("%v31","16(%r7)");
vaf ("%v12","%v12","%v31"); # increment counter
vlr (@v[$_],"%v$_") for (0..15); # copy initial state
lhi ("%r6",10);
j (".Loop_vx_4x");
ALIGN (16);
LABEL (".Loop_vx_4x");
VX_ROUND( 0, 4, 8,12); # column round
VX_ROUND( 0, 5,10,15); # diagonal round
brct ("%r6",".Loop_vx_4x");
vaf (@v[$_],@v[$_],"%v$_") for (0..15); # state += initial
# state (mod 32)
vlm ("%v6","%v7","32(%r7)"); # load vperm operands
for (0..3) { # blocks 1,2
vmrhf ("%v0",@v[$_*4+0],@v[$_*4+1]); # ks = serialize(state)
vmrhf ("%v1",@v[$_*4+2],@v[$_*4+3]);
vperm ("%v".($_+ 8),"%v0","%v1","%v6");
vperm ("%v".($_+12),"%v0","%v1","%v7");
}
vlm ("%v0","%v7","0($inp)"); # load in
vx ("%v$_","%v$_","%v".($_+8)) for (0..7); # out = in ^ ks
vstm ("%v0","%v7","0($out)"); # store out
vlm ("%v6","%v7","32(%r7)"); # restore vperm operands
for (0..3) { # blocks 2,3
vmrlf ("%v0",@v[$_*4+0],@v[$_*4+1]); # ks = serialize(state)
vmrlf ("%v1",@v[$_*4+2],@v[$_*4+3]);
vperm ("%v".($_+ 8),"%v0","%v1","%v6");
vperm ("%v".($_+12),"%v0","%v1","%v7");
}
vlm ("%v0","%v7","128($inp)"); # load in
vx ("%v$_","%v$_","%v".($_+8)) for (0..7); # out = in ^ ks
vstm ("%v0","%v7","128($out)"); # store out
ahi ("%r0",4);
st ("%r0","48+$off($sp)"); # update initial state
la ($inp,"256($inp)");
la ($out,"256($out)");
brctg ("%r1",".Lvx_4x");
ALIGN (16);
LABEL (".Lvx_4x_done");
lghi ("%r1",0xff);
ngr ($len,"%r1");
jnz (".Lvx_rem");
ALIGN (16);
LABEL (".Lvx_done");
vzero ("%v$_") for (16..31); # wipe ks and key copy
vstm ("%v16","%v17","16+$off($sp)");
vlm ("%v8","%v15","8($sp)") if ($z);
la ($sp,"$frame($sp)");
&{$z? \&lmg:\&lm} ("%r6","%r7","6*$SIZE_T($sp)");
if (!$z) {
ld ("%f4","16*$SIZE_T+2*8($sp)");
ld ("%f6","16*$SIZE_T+3*8($sp)");
vzero ("%v$_") for (8..15);
}
br ("%r14");
ALIGN (16);
LABEL (".Lvx_rem");
lhi ("%r0",64);
sr ($len,"%r0");
brc (2,".Lvx_rem_g64"); # cc==2?
lghi ("%r1",-$stdframe);
la ($counter,"48+$off($sp)"); # load updated iv
ar ($len,"%r0"); # restore len
lgr ("%r7",$counter);
&{$z? \&stg:\&st} ("%r14","14*$SIZE_T+$frame($sp)");
la ($sp,"0(%r1,$sp)");
bras ("%r14","_s390x_chacha_novx");
la ($sp,"$stdframe($sp)");
&{$z? \&lg:\&l} ("%r14","14*$SIZE_T+$frame($sp)");
lgr ($counter,"%r7");
j (".Lvx_done");
ALIGN (16);
LABEL (".Lvx_rem_g64");
vlrepf ("%v$_",($_*4)."+$off($sp)") for (0..15); # load initial
# state
vl ("%v31","16(%r7)");
vaf ("%v12","%v12","%v31"); # increment counter
vlr (@v[$_],"%v$_") for (0..15); # state = initial state
lhi ("%r6",10);
j (".Loop_vx_rem");
ALIGN (16);
LABEL (".Loop_vx_rem");
VX_ROUND( 0, 4, 8,12); # column round
VX_ROUND( 0, 5,10,15); # diagonal round
brct ("%r6",".Loop_vx_rem");
vaf (@v[$_],@v[$_],"%v$_") for (0..15); # state += initial
# state (mod 32)
vlm ("%v6","%v7","32(%r7)"); # load vperm operands
for (0..3) { # blocks 1,2
vmrhf ("%v0",@v[$_*4+0],@v[$_*4+1]); # ks = serialize(state)
vmrhf ("%v1",@v[$_*4+2],@v[$_*4+3]);
vperm ("%v".($_+8),"%v0","%v1","%v6");
vperm ("%v".($_+12),"%v0","%v1","%v7");
}
vlm ("%v0","%v3","0($inp)"); # load in
vx ("%v$_","%v$_","%v".($_+8)) for (0..3); # out = in ^ ks
vstm ("%v0","%v3","0($out)"); # store out
la ($inp,"64($inp)");
la ($out,"64($out)");
sr ($len,"%r0");
brc (4,".Lvx_tail"); # cc==4?
vlm ("%v0","%v3","0($inp)"); # load in
vx ("%v$_","%v$_","%v".($_+12)) for (0..3); # out = in ^ ks
vstm ("%v0","%v3","0($out)"); # store out
jz (".Lvx_done");
for (0..3) { # blocks 3,4
vmrlf ("%v0",@v[$_*4+0],@v[$_*4+1]); # ks = serialize(state)
vmrlf ("%v1",@v[$_*4+2],@v[$_*4+3]);
vperm ("%v".($_+12),"%v0","%v1","%v6");
vperm ("%v".($_+8),"%v0","%v1","%v7");
}
la ($inp,"64($inp)");
la ($out,"64($out)");
sr ($len,"%r0");
brc (4,".Lvx_tail"); # cc==4?
vlm ("%v0","%v3","0($inp)"); # load in
vx ("%v$_","%v$_","%v".($_+12)) for (0..3); # out = in ^ ks
vstm ("%v0","%v3","0($out)"); # store out
jz (".Lvx_done");
la ($inp,"64($inp)");
la ($out,"64($out)");
sr ($len,"%r0");
vlr ("%v".($_+4),"%v$_") for (8..11);
j (".Lvx_tail");
ALIGN (16);
LABEL (".Lvx_tail");
ar ($len,"%r0"); # restore $len
ahi ($len,-1);
lhi ("%r0",16);
for (0..2) {
vll ("%v0",$len,($_*16)."($inp)");
vx ("%v0","%v0","%v".($_+12));
vstl ("%v0",$len,($_*16)."($out)");
sr ($len,"%r0");
brc (4,".Lvx_done"); # cc==4?
}
vll ("%v0",$len,"3*16($inp)");
vx ("%v0","%v0","%v15");
vstl ("%v0",$len,"3*16($out)");
j (".Lvx_done");
SIZE ("ChaCha20_ctr32",".-ChaCha20_ctr32");
}
# NOVX CODE PATH
{
my $frame=$stdframe+4*20;
TYPE ("_s390x_chacha_novx","\@function");
ALIGN (32);
LABEL ("_s390x_chacha_novx");
&{$z? \&ltgr:\&ltr} ($len,$len); # $len==0?
bzr ("%r14");
&{$z? \&aghi:\&ahi} ($len,-64);
&{$z? \&lghi:\&lhi} ("%r1",-$frame);
&{$z? \&stmg:\&stm} ("%r6","%r15","6*$SIZE_T($sp)");
&{$z? \&slgr:\&slr} ($out,$inp); # difference
la ($len,"0($inp,$len)"); # end of input minus 64
larl ("%r7",".Lsigma");
lgr ("%r0",$sp);
la ($sp,"0(%r1,$sp)");
&{$z? \&stg:\&st} ("%r0","0($sp)");
lmg ("%r8","%r11","0($key)"); # load key
lmg ("%r12","%r13","0($counter)"); # load counter
lmg ("%r6","%r7","0(%r7)"); # load sigma constant
la ("%r14","0($inp)");
&{$z? \&stg:\&st} ($out,"$frame+3*$SIZE_T($sp)");
&{$z? \&stg:\&st} ($len,"$frame+4*$SIZE_T($sp)");
stmg ("%r6","%r13","$stdframe($sp)");# copy key schedule to stack
srlg (@x[12],"%r12",32); # 32-bit counter value
j (".Loop_outer");
ALIGN (16);
LABEL (".Loop_outer");
lm (@x[0],@x[7],"$stdframe+4*0($sp)"); # load x[0]-x[7]
lm (@t[0],@t[1],"$stdframe+4*10($sp)"); # load x[10]-x[11]
lm (@x[13],@x[15],"$stdframe+4*13($sp)"); # load x[13]-x[15]
stm (@t[0],@t[1],"$stdframe+4*8+4*10($sp)");# offload x[10]-x[11]
lm (@t[0],@t[1],"$stdframe+4*8($sp)"); # load x[8]-x[9]
st (@x[12],"$stdframe+4*12($sp)"); # save counter
&{$z? \&stg:\&st} ("%r14","$frame+2*$SIZE_T($sp)");# save input pointer
lhi ("%r14",10);
j (".Loop");
ALIGN (4);
LABEL (".Loop");
ROUND (0, 4, 8,12);
ROUND (0, 5,10,15);
brct ("%r14",".Loop");
&{$z? \&lg:\&l} ("%r14","$frame+2*$SIZE_T($sp)");# pull input pointer
stm (@t[0],@t[1],"$stdframe+4*8+4*8($sp)"); # offload x[8]-x[9]
&{$z? \&lmg:\&lm} (@t[0],@t[1],"$frame+3*$SIZE_T($sp)");
al (@x[0],"$stdframe+4*0($sp)"); # accumulate key schedule
al (@x[1],"$stdframe+4*1($sp)");
al (@x[2],"$stdframe+4*2($sp)");
al (@x[3],"$stdframe+4*3($sp)");
al (@x[4],"$stdframe+4*4($sp)");
al (@x[5],"$stdframe+4*5($sp)");
al (@x[6],"$stdframe+4*6($sp)");
al (@x[7],"$stdframe+4*7($sp)");
lrvr (@x[0],@x[0]);
lrvr (@x[1],@x[1]);
lrvr (@x[2],@x[2]);
lrvr (@x[3],@x[3]);
lrvr (@x[4],@x[4]);
lrvr (@x[5],@x[5]);
lrvr (@x[6],@x[6]);
lrvr (@x[7],@x[7]);
al (@x[12],"$stdframe+4*12($sp)");
al (@x[13],"$stdframe+4*13($sp)");
al (@x[14],"$stdframe+4*14($sp)");
al (@x[15],"$stdframe+4*15($sp)");
lrvr (@x[12],@x[12]);
lrvr (@x[13],@x[13]);
lrvr (@x[14],@x[14]);
lrvr (@x[15],@x[15]);
la (@t[0],"0(@t[0],%r14)"); # reconstruct output pointer
&{$z? \&clgr:\&clr} ("%r14",@t[1]);
jh (".Ltail");
x (@x[0],"4*0(%r14)"); # xor with input
x (@x[1],"4*1(%r14)");
st (@x[0],"4*0(@t[0])"); # store output
x (@x[2],"4*2(%r14)");
st (@x[1],"4*1(@t[0])");
x (@x[3],"4*3(%r14)");
st (@x[2],"4*2(@t[0])");
x (@x[4],"4*4(%r14)");
st (@x[3],"4*3(@t[0])");
lm (@x[0],@x[3],"$stdframe+4*8+4*8($sp)"); # load x[8]-x[11]
x (@x[5],"4*5(%r14)");
st (@x[4],"4*4(@t[0])");
x (@x[6],"4*6(%r14)");
al (@x[0],"$stdframe+4*8($sp)");
st (@x[5],"4*5(@t[0])");
x (@x[7],"4*7(%r14)");
al (@x[1],"$stdframe+4*9($sp)");
st (@x[6],"4*6(@t[0])");
x (@x[12],"4*12(%r14)");
al (@x[2],"$stdframe+4*10($sp)");
st (@x[7],"4*7(@t[0])");
x (@x[13],"4*13(%r14)");
al (@x[3],"$stdframe+4*11($sp)");
st (@x[12],"4*12(@t[0])");
x (@x[14],"4*14(%r14)");
st (@x[13],"4*13(@t[0])");
x (@x[15],"4*15(%r14)");
st (@x[14],"4*14(@t[0])");
lrvr (@x[0],@x[0]);
st (@x[15],"4*15(@t[0])");
lrvr (@x[1],@x[1]);
lrvr (@x[2],@x[2]);
lrvr (@x[3],@x[3]);
lhi (@x[12],1);
x (@x[0],"4*8(%r14)");
al (@x[12],"$stdframe+4*12($sp)"); # increment counter
x (@x[1],"4*9(%r14)");
st (@x[0],"4*8(@t[0])");
x (@x[2],"4*10(%r14)");
st (@x[1],"4*9(@t[0])");
x (@x[3],"4*11(%r14)");
st (@x[2],"4*10(@t[0])");
st (@x[3],"4*11(@t[0])");
&{$z? \&clgr:\&clr} ("%r14",@t[1]); # done yet?
la ("%r14","64(%r14)");
jl (".Loop_outer");
LABEL (".Ldone");
xgr ("%r0","%r0");
xgr ("%r1","%r1");
xgr ("%r2","%r2");
xgr ("%r3","%r3");
stmg ("%r0","%r3","$stdframe+4*4($sp)"); # wipe key copy
stmg ("%r0","%r3","$stdframe+4*12($sp)");
&{$z? \&lmg:\&lm} ("%r6","%r15","$frame+6*$SIZE_T($sp)");
br ("%r14");
ALIGN (16);
LABEL (".Ltail");
la (@t[1],"64($t[1])");
stm (@x[0],@x[7],"$stdframe+4*0($sp)");
&{$z? \&slgr:\&slr} (@t[1],"%r14");
lm (@x[0],@x[3],"$stdframe+4*8+4*8($sp)");
&{$z? \&lghi:\&lhi} (@x[6],0);
stm (@x[12],@x[15],"$stdframe+4*12($sp)");
al (@x[0],"$stdframe+4*8($sp)");
al (@x[1],"$stdframe+4*9($sp)");
al (@x[2],"$stdframe+4*10($sp)");
al (@x[3],"$stdframe+4*11($sp)");
lrvr (@x[0],@x[0]);
lrvr (@x[1],@x[1]);
lrvr (@x[2],@x[2]);
lrvr (@x[3],@x[3]);
stm (@x[0],@x[3],"$stdframe+4*8($sp)");
LABEL (".Loop_tail");
llgc (@x[4],"0(@x[6],%r14)");
llgc (@x[5],"$stdframe(@x[6],$sp)");
xr (@x[5],@x[4]);
stc (@x[5],"0(@x[6],@t[0])");
la (@x[6],"1(@x[6])");
brct (@t[1],".Loop_tail");
j (".Ldone");
SIZE ("_s390x_chacha_novx",".-_s390x_chacha_novx");
}
}
################
ALIGN (64);
LABEL (".Lsigma");
LONG (0x61707865,0x3320646e,0x79622d32,0x6b206574); # endian-neutral sigma
LONG (0x00000000,0x00000001,0x00000002,0x00000003); # vaf counter increment
LONG (0x03020100,0x07060504,0x13121110,0x17161514); # vperm serialization
LONG (0x0b0a0908,0x0f0e0d0c,0x1b1a1918,0x1f1e1d1c); # vperm serialization
ASCIZ ("\"ChaCha20 for s390x, CRYPTOGAMS by <appro\@openssl.org>\"");
ALIGN (4);
PERLASM_END();
+1
View File
@@ -9,6 +9,7 @@ GENERATE[chacha-armv4.S]=asm/chacha-armv4.pl $(PERLASM_SCHEME)
INCLUDE[chacha-armv4.o]=..
GENERATE[chacha-armv8.S]=asm/chacha-armv8.pl $(PERLASM_SCHEME)
INCLUDE[chacha-armv8.o]=..
INCLUDE[chacha-s390x.o]=..
BEGINRAW[Makefile(unix)]
##### CHACHA assembler implementations
+1 -1
View File
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by crypto/conf/keysets.pl
*
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
+26
View File
@@ -358,11 +358,36 @@ OPENSSL_INIT_SETTINGS *OPENSSL_INIT_new(void)
if (ret != NULL)
memset(ret, 0, sizeof(*ret));
ret->flags = DEFAULT_CONF_MFLAGS;
return ret;
}
#ifndef OPENSSL_NO_STDIO
int OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings,
const char *filename)
{
char *newfilename = NULL;
if (filename != NULL) {
newfilename = strdup(filename);
if (newfilename == NULL)
return 0;
}
free(settings->filename);
settings->filename = newfilename;
return 1;
}
void OPENSSL_INIT_set_config_file_flags(OPENSSL_INIT_SETTINGS *settings,
unsigned long flags)
{
settings->flags = flags;
}
int OPENSSL_INIT_set_config_appname(OPENSSL_INIT_SETTINGS *settings,
const char *appname)
{
@@ -383,6 +408,7 @@ int OPENSSL_INIT_set_config_appname(OPENSSL_INIT_SETTINGS *settings,
void OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS *settings)
{
free(settings->filename);
free(settings->appname);
free(settings);
}
+3
View File
@@ -142,6 +142,9 @@ int CONF_modules_load_file(const char *filename, const char *appname,
OPENSSL_free(file);
NCONF_free(conf);
if (flags & CONF_MFLAGS_IGNORE_RETURN_CODES)
return 1;
return ret;
}
+18 -5
View File
@@ -39,10 +39,24 @@ void OPENSSL_config(const char *appname)
}
#endif
void openssl_config_int(const char *appname)
int openssl_config_int(const OPENSSL_INIT_SETTINGS *settings)
{
int ret;
const char *filename;
const char *appname;
unsigned long flags;
if (openssl_configured)
return;
return 1;
filename = settings ? settings->filename : NULL;
appname = settings ? settings->appname : NULL;
flags = settings ? settings->flags : DEFAULT_CONF_MFLAGS;
#ifdef OPENSSL_INIT_DEBUG
fprintf(stderr, "OPENSSL_INIT: openssl_config_int(%s, %s, %lu)\n",
filename, appname, flags);
#endif
OPENSSL_load_builtin_modules();
#ifndef OPENSSL_NO_ENGINE
@@ -51,11 +65,10 @@ void openssl_config_int(const char *appname)
#endif
ERR_clear_error();
#ifndef OPENSSL_SYS_UEFI
CONF_modules_load_file(NULL, appname,
CONF_MFLAGS_DEFAULT_SECTION |
CONF_MFLAGS_IGNORE_MISSING_FILE);
ret = CONF_modules_load_file(filename, appname, flags);
#endif
openssl_configured = 1;
return ret;
}
void openssl_no_config_int(void)
+1 -1
View File
@@ -1,5 +1,5 @@
#! /usr/bin/env perl
# Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
# Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
-2
View File
@@ -29,8 +29,6 @@
.ident "des_enc.m4 2.1"
.file "des_enc-sparc.S"
#include <openssl/opensslconf.h>
#if defined(__SUNPRO_C) && defined(__sparcv9)
# define ABI64 /* They've said -xarch=v9 at command line */
#elif defined(__GNUC__) && defined(__arch64__)
+1 -1
View File
@@ -111,7 +111,7 @@ int DSO_up_ref(DSO *dso)
if (CRYPTO_UP_REF(&dso->references, &i, dso->lock) <= 0)
return 0;
REF_PRINT_COUNT("DSO", r);
REF_PRINT_COUNT("DSO", dso);
REF_ASSERT_ISNT(i < 2);
return ((i > 1) ? 1 : 0);
}
+1 -1
View File
@@ -1432,7 +1432,7 @@ void EC_nistz256_pre_comp_free(NISTZ256_PRE_COMP *pre)
return;
CRYPTO_DOWN_REF(&pre->references, &i, pre->lock);
REF_PRINT_COUNT("EC_nistz256", x);
REF_PRINT_COUNT("EC_nistz256", pre);
if (i > 0)
return;
REF_ASSERT_ISNT(i < 0);
+12
View File
@@ -741,6 +741,18 @@ int err_shelve_state(void **state)
{
int saveerrno = get_last_sys_error();
/*
* Note, at present our only caller is OPENSSL_init_crypto(), indirectly
* via ossl_init_load_crypto_nodelete(), by which point the requested
* "base" initialization has already been performed, so the below call is a
* NOOP, that re-enters OPENSSL_init_crypto() only to quickly return.
*
* If are no other valid callers of this function, the call below can be
* removed, avoiding the re-entry into OPENSSL_init_crypto(). If there are
* potential uses that are not from inside OPENSSL_init_crypto(), then this
* call is needed, but some care is required to make sure that the re-entry
* remains a NOOP.
*/
if (!OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL))
return 0;
+19 -2
View File
@@ -927,6 +927,11 @@ static int aes_t4_ocb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
const unsigned char *in, size_t len);
# endif /* OPENSSL_NO_OCB */
# ifndef OPENSSL_NO_SIV
# define aes_t4_siv_init_key aes_siv_init_key
# define aes_t4_siv_cipher aes_siv_cipher
# endif /* OPENSSL_NO_SIV */
# define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
static const EVP_CIPHER aes_t4_##keylen##_##mode = { \
nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
@@ -2427,6 +2432,18 @@ static int s390x_aes_ocb_cleanup(EVP_CIPHER_CTX *);
static int s390x_aes_ocb_ctrl(EVP_CIPHER_CTX *, int type, int arg, void *ptr);
# endif
# ifndef OPENSSL_NO_SIV
# define S390X_AES_SIV_CTX EVP_AES_SIV_CTX
# define S390X_aes_128_siv_CAPABLE 0
# define S390X_aes_192_siv_CAPABLE 0
# define S390X_aes_256_siv_CAPABLE 0
# define s390x_aes_siv_init_key aes_siv_init_key
# define s390x_aes_siv_cipher aes_siv_cipher
# define s390x_aes_siv_cleanup aes_siv_cleanup
# define s390x_aes_siv_ctrl aes_siv_ctrl
# endif
# define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode, \
MODE,flags) \
static const EVP_CIPHER s390x_aes_##keylen##_##mode = { \
@@ -2468,7 +2485,7 @@ const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
static const EVP_CIPHER s390x_aes_##keylen##_##mode = { \
nid##_##keylen##_##mode, \
blocksize, \
(EVP_CIPH_##MODE##_MODE == EVP_CIPH_XTS_MODE ? 2 : 1) * keylen / 8, \
(EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE||EVP_CIPH_##MODE##_MODE==EVP_CIPH_SIV_MODE ? 2 : 1) * keylen / 8, \
ivlen, \
flags | EVP_CIPH_##MODE##_MODE, \
s390x_aes_##mode##_init_key, \
@@ -2482,7 +2499,7 @@ static const EVP_CIPHER s390x_aes_##keylen##_##mode = { \
}; \
static const EVP_CIPHER aes_##keylen##_##mode = { \
nid##_##keylen##_##mode,blocksize, \
(EVP_CIPH_##MODE##_MODE == EVP_CIPH_XTS_MODE ? 2 : 1) * keylen / 8, \
(EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE||EVP_CIPH_##MODE##_MODE==EVP_CIPH_SIV_MODE ? 2 : 1) * keylen / 8, \
ivlen, \
flags | EVP_CIPH_##MODE##_MODE, \
aes_##mode##_init_key, \
+111 -32
View File
@@ -100,10 +100,6 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_base)
return 0;
if ((init_lock = CRYPTO_THREAD_lock_new()) == NULL)
goto err;
#ifndef OPENSSL_SYS_UEFI
if (atexit(OPENSSL_cleanup) != 0)
goto err;
#endif
OPENSSL_cpuid_setup();
destructor_key.value = key;
@@ -121,13 +117,53 @@ err:
return 0;
}
static CRYPTO_ONCE register_atexit = CRYPTO_ONCE_STATIC_INIT;
#if !defined(OPENSSL_SYS_UEFI) && defined(_WIN32)
static int win32atexit(void)
{
OPENSSL_cleanup();
return 0;
}
#endif
DEFINE_RUN_ONCE_STATIC(ossl_init_register_atexit)
{
#ifdef OPENSSL_INIT_DEBUG
fprintf(stderr, "OPENSSL_INIT: ossl_init_register_atexit()\n");
#endif
#ifndef OPENSSL_SYS_UEFI
# ifdef _WIN32
/* We use _onexit() in preference because it gets called on DLL unload */
if (_onexit(win32atexit) == NULL)
return 0;
# else
if (atexit(OPENSSL_cleanup) != 0)
return 0;
# endif
#endif
return 1;
}
DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_register_atexit,
ossl_init_register_atexit)
{
#ifdef OPENSSL_INIT_DEBUG
fprintf(stderr, "OPENSSL_INIT: ossl_init_no_register_atexit ok!\n");
#endif
/* Do nothing in this case */
return 1;
}
static CRYPTO_ONCE load_crypto_nodelete = CRYPTO_ONCE_STATIC_INIT;
DEFINE_RUN_ONCE_STATIC(ossl_init_load_crypto_nodelete)
{
#ifdef OPENSSL_INIT_DEBUG
fprintf(stderr, "OPENSSL_INIT: ossl_init_load_crypto_nodelete()\n");
#endif
#if !defined(OPENSSL_NO_DSO) && !defined(OPENSSL_USE_NODELETE)
#if !defined(OPENSSL_NO_DSO) \
&& !defined(OPENSSL_USE_NODELETE) \
&& !defined(OPENSSL_NO_PINSHARED)
# ifdef DSO_WIN32
{
HMODULE handle = NULL;
@@ -177,12 +213,6 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_load_crypto_nodelete)
static CRYPTO_ONCE load_crypto_strings = CRYPTO_ONCE_STATIC_INIT;
static int load_crypto_strings_inited = 0;
DEFINE_RUN_ONCE_STATIC(ossl_init_no_load_crypto_strings)
{
/* Do nothing in this case */
return 1;
}
DEFINE_RUN_ONCE_STATIC(ossl_init_load_crypto_strings)
{
int ret = 1;
@@ -201,6 +231,13 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_load_crypto_strings)
return ret;
}
DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_load_crypto_strings,
ossl_init_load_crypto_strings)
{
/* Do nothing in this case */
return 1;
}
static CRYPTO_ONCE add_all_ciphers = CRYPTO_ONCE_STATIC_INIT;
DEFINE_RUN_ONCE_STATIC(ossl_init_add_all_ciphers)
{
@@ -218,6 +255,13 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_add_all_ciphers)
return 1;
}
DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_add_all_ciphers,
ossl_init_add_all_ciphers)
{
/* Do nothing */
return 1;
}
static CRYPTO_ONCE add_all_digests = CRYPTO_ONCE_STATIC_INIT;
DEFINE_RUN_ONCE_STATIC(ossl_init_add_all_digests)
{
@@ -235,6 +279,13 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_add_all_digests)
return 1;
}
DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_add_all_digests,
ossl_init_add_all_digests)
{
/* Do nothing */
return 1;
}
static CRYPTO_ONCE add_all_macs = CRYPTO_ONCE_STATIC_INIT;
DEFINE_RUN_ONCE_STATIC(ossl_init_add_all_macs)
{
@@ -252,7 +303,7 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_add_all_macs)
return 1;
}
DEFINE_RUN_ONCE_STATIC(ossl_init_no_add_algs)
DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_add_all_macs, ossl_init_add_all_macs)
{
/* Do nothing */
return 1;
@@ -260,19 +311,14 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_no_add_algs)
static CRYPTO_ONCE config = CRYPTO_ONCE_STATIC_INIT;
static int config_inited = 0;
static const char *appname;
static const OPENSSL_INIT_SETTINGS *conf_settings = NULL;
DEFINE_RUN_ONCE_STATIC(ossl_init_config)
{
#ifdef OPENSSL_INIT_DEBUG
fprintf(stderr,
"OPENSSL_INIT: ossl_init_config: openssl_config(%s)\n",
appname == NULL ? "NULL" : appname);
#endif
openssl_config_int(appname);
int ret = openssl_config_int(conf_settings);
config_inited = 1;
return 1;
return ret;
}
DEFINE_RUN_ONCE_STATIC(ossl_init_no_config)
DEFINE_RUN_ONCE_STATIC_ALT(ossl_init_no_config, ossl_init_config)
{
#ifdef OPENSSL_INIT_DEBUG
fprintf(stderr,
@@ -603,17 +649,44 @@ int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings)
return 0;
}
/*
* When the caller specifies OPENSSL_INIT_BASE_ONLY, that should be the
* *only* option specified. With that option we return immediately after
* doing the requested limited initialization. Note that
* err_shelve_state() called by us via ossl_init_load_crypto_nodelete()
* re-enters OPENSSL_init_crypto() with OPENSSL_INIT_BASE_ONLY, but with
* base already initialized this is a harmless NOOP.
*
* If we remain the only caller of err_shelve_state() the recursion should
* perhaps be removed, but if in doubt, it can be left in place.
*/
if (!RUN_ONCE(&base, ossl_init_base))
return 0;
if (!(opts & OPENSSL_INIT_BASE_ONLY)
&& !RUN_ONCE(&load_crypto_nodelete,
ossl_init_load_crypto_nodelete))
if (opts & OPENSSL_INIT_BASE_ONLY)
return 1;
/*
* Now we don't always set up exit handlers, the INIT_BASE_ONLY calls
* should not have the side-effect of setting up exit handlers, and
* therefore, this code block is below the INIT_BASE_ONLY-conditioned early
* return above.
*/
if ((opts & OPENSSL_INIT_NO_ATEXIT) != 0) {
if (!RUN_ONCE_ALT(&register_atexit, ossl_init_no_register_atexit,
ossl_init_register_atexit))
return 0;
} else if (!RUN_ONCE(&register_atexit, ossl_init_register_atexit)) {
return 0;
}
if (!RUN_ONCE(&load_crypto_nodelete, ossl_init_load_crypto_nodelete))
return 0;
if ((opts & OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS)
&& !RUN_ONCE(&load_crypto_strings,
ossl_init_no_load_crypto_strings))
&& !RUN_ONCE_ALT(&load_crypto_strings,
ossl_init_no_load_crypto_strings,
ossl_init_load_crypto_strings))
return 0;
if ((opts & OPENSSL_INIT_LOAD_CRYPTO_STRINGS)
@@ -621,7 +694,8 @@ int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings)
return 0;
if ((opts & OPENSSL_INIT_NO_ADD_ALL_CIPHERS)
&& !RUN_ONCE(&add_all_ciphers, ossl_init_no_add_algs))
&& !RUN_ONCE_ALT(&add_all_ciphers, ossl_init_no_add_all_ciphers,
ossl_init_add_all_ciphers))
return 0;
if ((opts & OPENSSL_INIT_ADD_ALL_CIPHERS)
@@ -629,7 +703,8 @@ int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings)
return 0;
if ((opts & OPENSSL_INIT_NO_ADD_ALL_DIGESTS)
&& !RUN_ONCE(&add_all_digests, ossl_init_no_add_algs))
&& !RUN_ONCE_ALT(&add_all_digests, ossl_init_no_add_all_digests,
ossl_init_add_all_digests))
return 0;
if ((opts & OPENSSL_INIT_ADD_ALL_DIGESTS)
@@ -637,7 +712,8 @@ int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings)
return 0;
if ((opts & OPENSSL_INIT_NO_ADD_ALL_MACS)
&& !RUN_ONCE(&add_all_macs, ossl_init_no_add_algs))
&& !RUN_ONCE_ALT(&add_all_macs, ossl_init_no_add_all_macs,
ossl_init_add_all_macs))
return 0;
if ((opts & OPENSSL_INIT_ADD_ALL_MACS)
@@ -649,14 +725,15 @@ int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings)
return 0;
if ((opts & OPENSSL_INIT_NO_LOAD_CONFIG)
&& !RUN_ONCE(&config, ossl_init_no_config))
&& !RUN_ONCE_ALT(&config, ossl_init_no_config, ossl_init_config))
return 0;
if (opts & OPENSSL_INIT_LOAD_CONFIG) {
int ret;
CRYPTO_THREAD_write_lock(init_lock);
appname = (settings == NULL) ? NULL : settings->appname;
conf_settings = settings;
ret = RUN_ONCE(&config, ossl_init_config);
conf_settings = NULL;
CRYPTO_THREAD_unlock(init_lock);
if (!ret)
return 0;
@@ -720,7 +797,9 @@ int OPENSSL_atexit(void (*handler)(void))
{
OPENSSL_INIT_STOP *newhand;
#if !defined(OPENSSL_NO_DSO) && !defined(OPENSSL_USE_NODELETE)
#if !defined(OPENSSL_NO_DSO) \
&& !defined(OPENSSL_USE_NODELETE)\
&& !defined(OPENSSL_NO_PINSHARED)
{
union {
void *sym;
+1 -1
View File
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by crypto/objects/obj_dat.pl
*
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
+1 -1
View File
@@ -1,5 +1,5 @@
#! /usr/bin/env perl
# Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
# Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
+1 -1
View File
@@ -2,7 +2,7 @@
* WARNING: do not edit!
* Generated by objxref.pl
*
* Copyright 1998-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 1998-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
+1 -1
View File
@@ -1,5 +1,5 @@
#! /usr/bin/env perl
# Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved.
# Copyright 2000-2019 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
+1 -1
View File
@@ -1,5 +1,5 @@
#! /usr/bin/env perl
# Copyright 1998-2018 The OpenSSL Project Authors. All Rights Reserved.
# Copyright 1998-2019 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
+3060
View File
@@ -0,0 +1,3060 @@
#!/usr/bin/env perl
# Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the OpenSSL license (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html
# Copyright IBM Corp. 2018
# Author: Patrick Steuer <patrick.steuer@de.ibm.com>
package perlasm::s390x;
use strict;
use warnings;
use Carp qw(confess);
use Exporter qw(import);
our @EXPORT=qw(PERLASM_BEGIN PERLASM_END);
our @EXPORT_OK=qw(AUTOLOAD LABEL INCLUDE stfle);
our %EXPORT_TAGS=(
MSA => [qw(kmac km kmc kimd klmd)],
MSA4 => [qw(kmf kmo pcc kmctr)],
MSA5 => [qw(ppno prno)],
MSA8 => [qw(kma)],
VX => [qw(vgef vgeg vgbm vzero vone vgm vgmb vgmh vgmf vgmg
vl vlr vlrep vlrepb vlreph vlrepf vlrepg vleb vleh vlef vleg vleib
vleih vleif vleig vlgv vlgvb vlgvh vlgvf vlgvg vllez vllezb vllezh
vllezf vllezg vlm vlbb vlvg vlvgb vlvgh vlvgf vlvgg vlvgp
vll vmrh vmrhb vmrhh vmrhf vmrhg vmrl vmrlb vmrlh vmrlf vmrlg vpk
vpkh vpkf vpkg vpks vpksh vpksf vpksg vpkshs vpksfs vpksgs vpkls
vpklsh vpklsf vpklsg vpklshs vpklsfs vpklsgs vperm vpdi vrep vrepb
vreph vrepf vrepg vrepi vrepib vrepih vrepif vrepig vscef vsceg
vsel vseg vsegb vsegh vsegf vst vsteb vsteh vstef vsteg vstm vstl
vuph vuphb vuphh vuphf vuplh vuplhb vuplhh vuplhf vupl vuplb vuplhw
vuplf vupll vupllb vupllh vupllf va vab vah vaf vag vaq vacc vaccb
vacch vaccf vaccg vaccq vac vacq vaccc vacccq vn vnc vavg vavgb
vavgh vavgf vavgg vavgl vavglb vavglh vavglf vavglg vcksm vec_ vecb
vech vecf vecg vecl veclb veclh veclf veclg vceq vceqb vceqh vceqf
vceqg vceqbs vceqhs vceqfs vceqgs vch vchb vchh vchf vchg vchbs
vchhs vchfs vchgs vchl vchlb vchlh vchlf vchlg vchlbs vchlhs vchlfs
vchlgs vclz vclzb vclzh vclzf vclzg vctz vctzb vctzh vctzf vctzg
vx vgfm vgfmb vgfmh vgfmf vgfmg vgfma vgfmab vgfmah vgfmaf vgfmag
vlc vlcb vlch vlcf vlcg vlp vlpb vlph vlpf vlpg vmx vmxb vmxh vmxf
vmxg vmxl vmxlb vmxlh vmxlf vmxlg vmn vmnb vmnh vmnf vmng vmnl
vmnlb vmnlh vmnlf vmnlg vmal vmalb vmalhw vmalf vmah vmahb vmahh
vmahf vmalh vmalhb vmalhh vmalhf vmae vmaeb vmaeh vmaef vmale
vmaleb vmaleh vmalef vmao vmaob vmaoh vmaof vmalo vmalob vmaloh
vmalof vmh vmhb vmhh vmhf vmlh vmlhb vmlhh vmlhf vml vmlb vmlhw
vmlf vme vmeb vmeh vmef vmle vmleb vmleh vmlef vmo vmob vmoh vmof
vmlo vmlob vmloh vmlof vno vnot vo vpopct verllv verllvb verllvh
verllvf verllvg verll verllb verllh verllf verllg verim verimb
verimh verimf verimg veslv veslvb veslvh veslvf veslvg vesl veslb
veslh veslf veslg vesrav vesravb vesravh vesravf vesravg vesra
vesrab vesrah vesraf vesrag vesrlv vesrlvb vesrlvh vesrlvf vesrlvg
vesrl vesrlb vesrlh vesrlf vesrlg vsl vslb vsldb vsra vsrab vsrl
vsrlb vs vsb vsh vsf vsg vsq vscbi vscbib vscbih vscbif vscbig
vscbiq vsbi vsbiq vsbcbi vsbcbiq vsumg vsumgh vsumgf vsumq vsumqf
vsumqg vsum vsumb vsumh vtm vfae vfaeb vfaeh vfaef vfaebs vfaehs
vfaefs vfaezb vfaezh vfaezf vfaezbs vfaezhs vfaezfs vfee vfeeb
vfeeh vfeef vfeebs vfeehs vfeefs vfeezb vfeezh vfeezf vfeezbs
vfeezhs vfeezfs vfene vfeneb vfeneh vfenef vfenebs vfenehs vfenefs
vfenezb vfenezh vfenezf vfenezbs vfenezhs vfenezfs vistr vistrb
vistrh vistrf vistrbs vistrhs vistrfs vstrc vstrcb vstrch vstrcf
vstrcbs vstrchs vstrcfs vstrczb vstrczh vstrczf vstrczbs vstrczhs
vstrczfs vfa vfadb wfadb wfc wfcdb wfk wfkdb vfce vfcedb wfcedb
vfcedbs wfcedbs vfch vfchdb wfchdb vfchdbs wfchdbs vfche vfchedb
wfchedb vfchedbs wfchedbs vcdg vcdgb wcdgb vcdlg vcdlgb wcdlgb vcgd
vcgdb wcgdb vclgd vclgdb wclgdb vfd vfddb wfddb vfi vfidb wfidb
vlde vldeb wldeb vled vledb wledb vfm vfmdb wfmdb vfma vfmadb
wfmadb vfms vfmsdb wfmsdb vfpso vfpsodb wfpsodb vflcdb wflcdb
vflndb wflndb vflpdb wflpdb vfsq vfsqdb wfsqdb vfs vfsdb wfsdb
vftci vftcidb wftcidb)],
VXE => [qw(vbperm vllezlf vmsl vmslg vnx vnn voc vpopctb vpopcth
vpopctf vpopctg vfasb wfasb wfaxb wfcsb wfcxb wfksb wfkxb vfcesb
vfcesbs wfcesb wfcesbs wfcexb wfcexbs vfchsb vfchsbs wfchsb wfchsbs
wfchxb wfchxbs vfchesb vfchesbs wfchesb wfchesbs wfchexb wfchexbs
vfdsb wfdsb wfdxb vfisb wfisb wfixb vfll vflls wflls wflld vflr
vflrd wflrd wflrx vfmax vfmaxsb vfmaxdb wfmaxsb wfmaxdb wfmaxxb
vfmin vfminsb vfmindb wfminsb wfmindb wfminxb vfmsb wfmsb wfmxb
vfnma vfnms vfmasb wfmasb wfmaxb vfmssb wfmssb wfmsxb vfnmasb
vfnmadb wfnmasb wfnmadb wfnmaxb vfnmssb vfnmsdb wfnmssb wfnmsdb
wfnmsxb vfpsosb wfpsosb vflcsb wflcsb vflnsb wflnsb vflpsb wflpsb
vfpsoxb wfpsoxb vflcxb wflcxb vflnxb wflnxb vflpxb wflpxb vfsqsb
wfsqsb wfsqxb vfssb wfssb wfsxb vftcisb wftcisb wftcixb)],
VXD => [qw(vlrlr vlrl vstrlr vstrl vap vcp vcvb vcvbg vcvd vcvdg vdp
vlip vmp vmsp vpkz vpsop vrp vsdp vsrp vsp vtp vupkz)],
);
Exporter::export_ok_tags(qw(MSA MSA4 MSA5 MSA8 VX VXE VXD));
our $AUTOLOAD;
my $GR='(?:%r)?([0-9]|1[0-5])';
my $VR='(?:%v)?([0-9]|1[0-9]|2[0-9]|3[0-1])';
my ($file,$out);
sub PERLASM_BEGIN
{
($file,$out)=(shift,"");
}
sub PERLASM_END
{
if (defined($file)) {
open(my $fd,'>',$file)||die("can't open $file: $!");
print({$fd}$out);
close($fd);
} else {
print($out);
}
}
sub AUTOLOAD {
confess(err("PARSE")) if (grep(!defined($_),@_));
my $token;
for ($AUTOLOAD) {
$token=".$1" if (/^.*::([A-Z_]+)$/); # uppercase: directive
$token="\t$1" if (/^.*::([a-z]+)$/); # lowercase: mnemonic
confess(err("PARSE")) if (!defined($token));
}
$token.="\t" if ($#_>=0);
$out.=$token.join(',',@_)."\n";
}
sub LABEL { # label directive
confess(err("ARGNUM")) if ($#_!=0);
my ($label)=@_;
$out.="$label:\n";
}
sub INCLUDE {
confess(err("ARGNUM")) if ($#_!=0);
my ($file)=@_;
$out.="#include \"$file\"\n";
}
#
# Mnemonics
#
sub stfle {
confess(err("ARGNUM")) if ($#_!=0);
S(0xb2b0,@_);
}
# MSA
sub kmac {
confess(err("ARGNUM")) if ($#_!=1);
RRE(0xb91e,@_);
}
sub km {
confess(err("ARGNUM")) if ($#_!=1);
RRE(0xb92e,@_);
}
sub kmc {
confess(err("ARGNUM")) if ($#_!=1);
RRE(0xb92f,@_);
}
sub kimd {
confess(err("ARGNUM")) if ($#_!=1);
RRE(0xb93e,@_);
}
sub klmd {
confess(err("ARGNUM")) if ($#_!=1);
RRE(0xb93f,@_);
}
# MSA4
sub kmf {
confess(err("ARGNUM")) if ($#_!=1);
RRE(0xb92a,@_);
}
sub kmo {
confess(err("ARGNUM")) if ($#_!=1);
RRE(0xb92b,@_);
}
sub pcc {
confess(err("ARGNUM")) if ($#_!=-1);
RRE(0xb92c,@_);
}
sub kmctr {
confess(err("ARGNUM")) if ($#_!=2);
RRFb(0xb92d,@_);
}
# MSA5
sub prno {
ppno(@_);
}
sub ppno { # deprecated, use prno
confess(err("ARGNUM")) if ($#_!=1);
RRE(0xb93c,@_);
}
# MSA8
sub kma {
confess(err("ARGNUM")) if ($#_!=2);
RRFb(0xb929,@_);
}
# VX - Support Instructions
sub vgef {
confess(err("ARGNUM")) if ($#_!=2);
VRV(0xe713,@_);
}
sub vgeg {
confess(err("ARGNUM")) if ($#_!=2);
VRV(0xe712,@_);
}
sub vgbm {
confess(err("ARGNUM")) if ($#_!=1);
VRIa(0xe744,@_);
}
sub vzero {
vgbm(@_,0);
}
sub vone {
vgbm(@_,0xffff);
}
sub vgm {
confess(err("ARGNUM")) if ($#_!=3);
VRIb(0xe746,@_);
}
sub vgmb {
vgm(@_,0);
}
sub vgmh {
vgm(@_,1);
}
sub vgmf {
vgm(@_,2);
}
sub vgmg {
vgm(@_,3);
}
sub vl {
confess(err("ARGNUM")) if ($#_!=1);
VRX(0xe706,@_);
}
sub vlr {
confess(err("ARGNUM")) if ($#_!=1);
VRRa(0xe756,@_);
}
sub vlrep {
confess(err("ARGNUM")) if ($#_!=2);
VRX(0xe705,@_);
}
sub vlrepb {
vlrep(@_,0);
}
sub vlreph {
vlrep(@_,1);
}
sub vlrepf {
vlrep(@_,2);
}
sub vlrepg {
vlrep(@_,3);
}
sub vleb {
confess(err("ARGNUM")) if ($#_!=2);
VRX(0xe700,@_);
}
sub vleh {
confess(err("ARGNUM")) if ($#_!=2);
VRX(0xe701,@_);
}
sub vlef {
confess(err("ARGNUM")) if ($#_!=2);
VRX(0xe703,@_);
}
sub vleg {
confess(err("ARGNUM")) if ($#_!=2);
VRX(0xe702,@_);
}
sub vleib {
confess(err("ARGNUM")) if ($#_!=2);
VRIa(0xe740,@_);
}
sub vleih {
confess(err("ARGNUM")) if ($#_!=2);
VRIa(0xe741,@_);
}
sub vleif {
confess(err("ARGNUM")) if ($#_!=2);
VRIa(0xe743,@_);
}
sub vleig {
confess(err("ARGNUM")) if ($#_!=2);
VRIa(0xe742,@_);
}
sub vlgv {
confess(err("ARGNUM")) if ($#_!=3);
VRSc(0xe721,@_);
}
sub vlgvb {
vlgv(@_,0);
}
sub vlgvh {
vlgv(@_,1);
}
sub vlgvf {
vlgv(@_,2);
}
sub vlgvg {
vlgv(@_,3);
}
sub vllez {
confess(err("ARGNUM")) if ($#_!=2);
VRX(0xe704,@_);
}
sub vllezb {
vllez(@_,0);
}
sub vllezh {
vllez(@_,1);
}
sub vllezf {
vllez(@_,2);
}
sub vllezg {
vllez(@_,3);
}
sub vlm {
confess(err("ARGNUM")) if ($#_!=2);
VRSa(0xe736,@_);
}
sub vlbb {
confess(err("ARGNUM")) if ($#_!=2);
VRX(0xe707,@_);
}
sub vlvg {
confess(err("ARGNUM")) if ($#_!=3);
VRSb(0xe722,@_);
}
sub vlvgb {
vlvg(@_,0);
}
sub vlvgh {
vlvg(@_,1);
}
sub vlvgf {
vlvg(@_,2);
}
sub vlvgg {
vlvg(@_,3);
}
sub vlvgp {
confess(err("ARGNUM")) if ($#_!=2);
VRRf(0xe762,@_);
}
sub vll {
confess(err("ARGNUM")) if ($#_!=2);
VRSb(0xe737,@_);
}
sub vmrh {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe761,@_);
}
sub vmrhb {
vmrh(@_,0);
}
sub vmrhh {
vmrh(@_,1);
}
sub vmrhf {
vmrh(@_,2);
}
sub vmrhg {
vmrh(@_,3);
}
sub vmrl {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe760,@_);
}
sub vmrlb {
vmrl(@_,0);
}
sub vmrlh {
vmrl(@_,1);
}
sub vmrlf {
vmrl(@_,2);
}
sub vmrlg {
vmrl(@_,3);
}
sub vpk {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe794,@_);
}
sub vpkh {
vpk(@_,1);
}
sub vpkf {
vpk(@_,2);
}
sub vpkg {
vpk(@_,3);
}
sub vpks {
confess(err("ARGNUM")) if ($#_!=4);
VRRb(0xe797,@_);
}
sub vpksh {
vpks(@_,1,0);
}
sub vpksf {
vpks(@_,2,0);
}
sub vpksg {
vpks(@_,3,0);
}
sub vpkshs {
vpks(@_,1,1);
}
sub vpksfs {
vpks(@_,2,1);
}
sub vpksgs {
vpks(@_,3,1);
}
sub vpkls {
confess(err("ARGNUM")) if ($#_!=4);
VRRb(0xe795,@_);
}
sub vpklsh {
vpkls(@_,1,0);
}
sub vpklsf {
vpkls(@_,2,0);
}
sub vpklsg {
vpkls(@_,3,0);
}
sub vpklshs {
vpkls(@_,1,1);
}
sub vpklsfs {
vpkls(@_,2,1);
}
sub vpklsgs {
vpkls(@_,3,1);
}
sub vperm {
confess(err("ARGNUM")) if ($#_!=3);
VRRe(0xe78c,@_);
}
sub vpdi {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe784,@_);
}
sub vrep {
confess(err("ARGNUM")) if ($#_!=3);
VRIc(0xe74d,@_);
}
sub vrepb {
vrep(@_,0);
}
sub vreph {
vrep(@_,1);
}
sub vrepf {
vrep(@_,2);
}
sub vrepg {
vrep(@_,3);
}
sub vrepi {
confess(err("ARGNUM")) if ($#_!=2);
VRIa(0xe745,@_);
}
sub vrepib {
vrepi(@_,0);
}
sub vrepih {
vrepi(@_,1);
}
sub vrepif {
vrepi(@_,2);
}
sub vrepig {
vrepi(@_,3);
}
sub vscef {
confess(err("ARGNUM")) if ($#_!=2);
VRV(0xe71b,@_);
}
sub vsceg {
confess(err("ARGNUM")) if ($#_!=2);
VRV(0xe71a,@_);
}
sub vsel {
confess(err("ARGNUM")) if ($#_!=3);
VRRe(0xe78d,@_);
}
sub vseg {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe75f,@_);
}
sub vsegb {
vseg(@_,0);
}
sub vsegh {
vseg(@_,1);
}
sub vsegf {
vseg(@_,2);
}
sub vst {
confess(err("ARGNUM")) if ($#_!=1);
VRX(0xe70e,@_);
}
sub vsteb {
confess(err("ARGNUM")) if ($#_!=2);
VRX(0xe708,@_);
}
sub vsteh {
confess(err("ARGNUM")) if ($#_!=2);
VRX(0xe709,@_);
}
sub vstef {
confess(err("ARGNUM")) if ($#_!=2);
VRX(0xe70b,@_);
}
sub vsteg {
confess(err("ARGNUM")) if ($#_!=2);
VRX(0xe70a,@_);
}
sub vstm {
confess(err("ARGNUM")) if ($#_!=2);
VRSa(0xe73e,@_);
}
sub vstl {
confess(err("ARGNUM")) if ($#_!=2);
VRSb(0xe73f,@_);
}
sub vuph {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe7d7,@_);
}
sub vuphb {
vuph(@_,0);
}
sub vuphh {
vuph(@_,1);
}
sub vuphf {
vuph(@_,2);
}
sub vuplh {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe7d5,@_);
}
sub vuplhb {
vuplh(@_,0);
}
sub vuplhh {
vuplh(@_,1);
}
sub vuplhf {
vuplh(@_,2);
}
sub vupl {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe7d6,@_);
}
sub vuplb {
vupl(@_,0);
}
sub vuplhw {
vupl(@_,1);
}
sub vuplf {
vupl(@_,2);
}
sub vupll {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe7d4,@_);
}
sub vupllb {
vupll(@_,0);
}
sub vupllh {
vupll(@_,1);
}
sub vupllf {
vupll(@_,2);
}
# VX - Integer Instructions
sub va {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7f3,@_);
}
sub vab {
va(@_,0);
}
sub vah {
va(@_,1);
}
sub vaf {
va(@_,2);
}
sub vag {
va(@_,3);
}
sub vaq {
va(@_,4);
}
sub vacc {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7f1,@_);
}
sub vaccb {
vacc(@_,0);
}
sub vacch {
vacc(@_,1);
}
sub vaccf {
vacc(@_,2);
}
sub vaccg {
vacc(@_,3);
}
sub vaccq {
vacc(@_,4);
}
sub vac {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7bb,@_);
}
sub vacq {
vac(@_,4);
}
sub vaccc {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7b9,@_);
}
sub vacccq {
vaccc(@_,4);
}
sub vn {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe768,@_);
}
sub vnc {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe769,@_);
}
sub vavg {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7f2,@_);
}
sub vavgb {
vavg(@_,0);
}
sub vavgh {
vavg(@_,1);
}
sub vavgf {
vavg(@_,2);
}
sub vavgg {
vavg(@_,3);
}
sub vavgl {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7f0,@_);
}
sub vavglb {
vavgl(@_,0);
}
sub vavglh {
vavgl(@_,1);
}
sub vavglf {
vavgl(@_,2);
}
sub vavglg {
vavgl(@_,3);
}
sub vcksm {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe766,@_);
}
sub vec_ {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe7db,@_);
}
sub vecb {
vec_(@_,0);
}
sub vech {
vec_(@_,1);
}
sub vecf {
vec_(@_,2);
}
sub vecg {
vec_(@_,3);
}
sub vecl {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe7d9,@_);
}
sub veclb {
vecl(@_,0);
}
sub veclh {
vecl(@_,1);
}
sub veclf {
vecl(@_,2);
}
sub veclg {
vecl(@_,3);
}
sub vceq {
confess(err("ARGNUM")) if ($#_!=4);
VRRb(0xe7f8,@_);
}
sub vceqb {
vceq(@_,0,0);
}
sub vceqh {
vceq(@_,1,0);
}
sub vceqf {
vceq(@_,2,0);
}
sub vceqg {
vceq(@_,3,0);
}
sub vceqbs {
vceq(@_,0,1);
}
sub vceqhs {
vceq(@_,1,1);
}
sub vceqfs {
vceq(@_,2,1);
}
sub vceqgs {
vceq(@_,3,1);
}
sub vch {
confess(err("ARGNUM")) if ($#_!=4);
VRRb(0xe7fb,@_);
}
sub vchb {
vch(@_,0,0);
}
sub vchh {
vch(@_,1,0);
}
sub vchf {
vch(@_,2,0);
}
sub vchg {
vch(@_,3,0);
}
sub vchbs {
vch(@_,0,1);
}
sub vchhs {
vch(@_,1,1);
}
sub vchfs {
vch(@_,2,1);
}
sub vchgs {
vch(@_,3,1);
}
sub vchl {
confess(err("ARGNUM")) if ($#_!=4);
VRRb(0xe7f9,@_);
}
sub vchlb {
vchl(@_,0,0);
}
sub vchlh {
vchl(@_,1,0);
}
sub vchlf {
vchl(@_,2,0);
}
sub vchlg {
vchl(@_,3,0);
}
sub vchlbs {
vchl(@_,0,1);
}
sub vchlhs {
vchl(@_,1,1);
}
sub vchlfs {
vchl(@_,2,1);
}
sub vchlgs {
vchl(@_,3,1);
}
sub vclz {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe753,@_);
}
sub vclzb {
vclz(@_,0);
}
sub vclzh {
vclz(@_,1);
}
sub vclzf {
vclz(@_,2);
}
sub vclzg {
vclz(@_,3);
}
sub vctz {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe752,@_);
}
sub vctzb {
vctz(@_,0);
}
sub vctzh {
vctz(@_,1);
}
sub vctzf {
vctz(@_,2);
}
sub vctzg {
vctz(@_,3);
}
sub vx {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe76d,@_);
}
sub vgfm {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7b4,@_);
}
sub vgfmb {
vgfm(@_,0);
}
sub vgfmh {
vgfm(@_,1);
}
sub vgfmf {
vgfm(@_,2);
}
sub vgfmg {
vgfm(@_,3);
}
sub vgfma {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7bc,@_);
}
sub vgfmab {
vgfma(@_,0);
}
sub vgfmah {
vgfma(@_,1);
}
sub vgfmaf {
vgfma(@_,2);
}
sub vgfmag {
vgfma(@_,3);
}
sub vlc {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe7de,@_);
}
sub vlcb {
vlc(@_,0);
}
sub vlch {
vlc(@_,1);
}
sub vlcf {
vlc(@_,2);
}
sub vlcg {
vlc(@_,3);
}
sub vlp {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe7df,@_);
}
sub vlpb {
vlp(@_,0);
}
sub vlph {
vlp(@_,1);
}
sub vlpf {
vlp(@_,2);
}
sub vlpg {
vlp(@_,3);
}
sub vmx {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7ff,@_);
}
sub vmxb {
vmx(@_,0);
}
sub vmxh {
vmx(@_,1);
}
sub vmxf {
vmx(@_,2);
}
sub vmxg {
vmx(@_,3);
}
sub vmxl {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7fd,@_);
}
sub vmxlb {
vmxl(@_,0);
}
sub vmxlh {
vmxl(@_,1);
}
sub vmxlf {
vmxl(@_,2);
}
sub vmxlg {
vmxl(@_,3);
}
sub vmn {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7fe,@_);
}
sub vmnb {
vmn(@_,0);
}
sub vmnh {
vmn(@_,1);
}
sub vmnf {
vmn(@_,2);
}
sub vmng {
vmn(@_,3);
}
sub vmnl {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7fc,@_);
}
sub vmnlb {
vmnl(@_,0);
}
sub vmnlh {
vmnl(@_,1);
}
sub vmnlf {
vmnl(@_,2);
}
sub vmnlg {
vmnl(@_,3);
}
sub vmal {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7aa,@_);
}
sub vmalb {
vmal(@_,0);
}
sub vmalhw {
vmal(@_,1);
}
sub vmalf {
vmal(@_,2);
}
sub vmah {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7ab,@_);
}
sub vmahb {
vmah(@_,0);
}
sub vmahh {
vmah(@_,1);
}
sub vmahf {
vmah(@_,2);
}
sub vmalh {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7a9,@_);
}
sub vmalhb {
vmalh(@_,0);
}
sub vmalhh {
vmalh(@_,1);
}
sub vmalhf {
vmalh(@_,2);
}
sub vmae {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7ae,@_);
}
sub vmaeb {
vmae(@_,0);
}
sub vmaeh {
vmae(@_,1);
}
sub vmaef {
vmae(@_,2);
}
sub vmale {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7ac,@_);
}
sub vmaleb {
vmale(@_,0);
}
sub vmaleh {
vmale(@_,1);
}
sub vmalef {
vmale(@_,2);
}
sub vmao {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7af,@_);
}
sub vmaob {
vmao(@_,0);
}
sub vmaoh {
vmao(@_,1);
}
sub vmaof {
vmao(@_,2);
}
sub vmalo {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7ad,@_);
}
sub vmalob {
vmalo(@_,0);
}
sub vmaloh {
vmalo(@_,1);
}
sub vmalof {
vmalo(@_,2);
}
sub vmh {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7a3,@_);
}
sub vmhb {
vmh(@_,0);
}
sub vmhh {
vmh(@_,1);
}
sub vmhf {
vmh(@_,2);
}
sub vmlh {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7a1,@_);
}
sub vmlhb {
vmlh(@_,0);
}
sub vmlhh {
vmlh(@_,1);
}
sub vmlhf {
vmlh(@_,2);
}
sub vml {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7a2,@_);
}
sub vmlb {
vml(@_,0);
}
sub vmlhw {
vml(@_,1);
}
sub vmlf {
vml(@_,2);
}
sub vme {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7a6,@_);
}
sub vmeb {
vme(@_,0);
}
sub vmeh {
vme(@_,1);
}
sub vmef {
vme(@_,2);
}
sub vmle {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7a4,@_);
}
sub vmleb {
vmle(@_,0);
}
sub vmleh {
vmle(@_,1);
}
sub vmlef {
vmle(@_,2);
}
sub vmo {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7a7,@_);
}
sub vmob {
vmo(@_,0);
}
sub vmoh {
vmo(@_,1);
}
sub vmof {
vmo(@_,2);
}
sub vmlo {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7a5,@_);
}
sub vmlob {
vmlo(@_,0);
}
sub vmloh {
vmlo(@_,1);
}
sub vmlof {
vmlo(@_,2);
}
sub vno {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe76b,@_);
}
sub vnot {
vno(@_,$_[1]);
}
sub vo {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe76a,@_);
}
sub vpopct {
confess(err("ARGNUM")) if ($#_!=2);
VRRa(0xe750,@_);
}
sub verllv {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe773,@_);
}
sub verllvb {
verllv(@_,0);
}
sub verllvh {
verllv(@_,1);
}
sub verllvf {
verllv(@_,2);
}
sub verllvg {
verllv(@_,3);
}
sub verll {
confess(err("ARGNUM")) if ($#_!=3);
VRSa(0xe733,@_);
}
sub verllb {
verll(@_,0);
}
sub verllh {
verll(@_,1);
}
sub verllf {
verll(@_,2);
}
sub verllg {
verll(@_,3);
}
sub verim {
confess(err("ARGNUM")) if ($#_!=4);
VRId(0xe772,@_);
}
sub verimb {
verim(@_,0);
}
sub verimh {
verim(@_,1);
}
sub verimf {
verim(@_,2);
}
sub verimg {
verim(@_,3);
}
sub veslv {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe770,@_);
}
sub veslvb {
veslv(@_,0);
}
sub veslvh {
veslv(@_,1);
}
sub veslvf {
veslv(@_,2);
}
sub veslvg {
veslv(@_,3);
}
sub vesl {
confess(err("ARGNUM")) if ($#_!=3);
VRSa(0xe730,@_);
}
sub veslb {
vesl(@_,0);
}
sub veslh {
vesl(@_,1);
}
sub veslf {
vesl(@_,2);
}
sub veslg {
vesl(@_,3);
}
sub vesrav {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe77a,@_);
}
sub vesravb {
vesrav(@_,0);
}
sub vesravh {
vesrav(@_,1);
}
sub vesravf {
vesrav(@_,2);
}
sub vesravg {
vesrav(@_,3);
}
sub vesra {
confess(err("ARGNUM")) if ($#_!=3);
VRSa(0xe73a,@_);
}
sub vesrab {
vesra(@_,0);
}
sub vesrah {
vesra(@_,1);
}
sub vesraf {
vesra(@_,2);
}
sub vesrag {
vesra(@_,3);
}
sub vesrlv {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe778,@_);
}
sub vesrlvb {
vesrlv(@_,0);
}
sub vesrlvh {
vesrlv(@_,1);
}
sub vesrlvf {
vesrlv(@_,2);
}
sub vesrlvg {
vesrlv(@_,3);
}
sub vesrl {
confess(err("ARGNUM")) if ($#_!=3);
VRSa(0xe738,@_);
}
sub vesrlb {
vesrl(@_,0);
}
sub vesrlh {
vesrl(@_,1);
}
sub vesrlf {
vesrl(@_,2);
}
sub vesrlg {
vesrl(@_,3);
}
sub vsl {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe774,@_);
}
sub vslb {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe775,@_);
}
sub vsldb {
confess(err("ARGNUM")) if ($#_!=3);
VRId(0xe777,@_);
}
sub vsra {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe77e,@_);
}
sub vsrab {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe77f,@_);
}
sub vsrl {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe77c,@_);
}
sub vsrlb {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe77d,@_);
}
sub vs {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7f7,@_);
}
sub vsb {
vs(@_,0);
}
sub vsh {
vs(@_,1);
}
sub vsf {
vs(@_,2);
}
sub vsg {
vs(@_,3);
}
sub vsq {
vs(@_,4);
}
sub vscbi {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe7f5,@_);
}
sub vscbib {
vscbi(@_,0);
}
sub vscbih {
vscbi(@_,1);
}
sub vscbif {
vscbi(@_,2);
}
sub vscbig {
vscbi(@_,3);
}
sub vscbiq {
vscbi(@_,4);
}
sub vsbi {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7bf,@_);
}
sub vsbiq {
vsbi(@_,4);
}
sub vsbcbi {
confess(err("ARGNUM")) if ($#_!=4);
VRRd(0xe7bd,@_);
}
sub vsbcbiq {
vsbcbi(@_,4);
}
sub vsumg {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe765,@_);
}
sub vsumgh {
vsumg(@_,1);
}
sub vsumgf {
vsumg(@_,2);
}
sub vsumq {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe767,@_);
}
sub vsumqf {
vsumq(@_,2);
}
sub vsumqg {
vsumq(@_,3);
}
sub vsum {
confess(err("ARGNUM")) if ($#_!=3);
VRRc(0xe764,@_);
}
sub vsumb {
vsum(@_,0);
}
sub vsumh {
vsum(@_,1);
}
sub vtm {
confess(err("ARGNUM")) if ($#_!=1);
VRRa(0xe7d8,@_);
}
# VX - String Instructions
sub vfae {
confess(err("ARGNUM")) if ($#_<3||$#_>4);
VRRb(0xe782,@_);
}
sub vfaeb {
vfae(@_[0..2],0,$_[3]);
}
sub vfaeh {
vfae(@_[0..2],1,$_[3]);
}
sub vfaef {
vfae(@_[0..2],2,$_[3]);
}
sub vfaebs {
$_[3]=0 if (!defined($_[3]));
vfae(@_[0..2],0,0x1|$_[3]);
}
sub vfaehs {
$_[3]=0 if (!defined($_[3]));
vfae(@_[0..2],1,0x1|$_[3]);
}
sub vfaefs {
$_[3]=0 if (!defined($_[3]));
vfae(@_[0..2],2,0x1|$_[3]);
}
sub vfaezb {
$_[3]=0 if (!defined($_[3]));
vfae(@_[0..2],0,0x2|$_[3]);
}
sub vfaezh {
$_[3]=0 if (!defined($_[3]));
vfae(@_[0..2],1,0x2|$_[3]);
}
sub vfaezf {
$_[3]=0 if (!defined($_[3]));
vfae(@_[0..2],2,0x2|$_[3]);
}
sub vfaezbs {
$_[3]=0 if (!defined($_[3]));
vfae(@_[0..2],0,0x3|$_[3]);
}
sub vfaezhs {
$_[3]=0 if (!defined($_[3]));
vfae(@_[0..2],1,0x3|$_[3]);
}
sub vfaezfs {
$_[3]=0 if (!defined($_[3]));
vfae(@_[0..2],2,0x3|$_[3]);
}
sub vfee {
confess(err("ARGNUM")) if ($#_<3||$#_>4);
VRRb(0xe780,@_);
}
sub vfeeb {
vfee(@_[0..2],0,$_[3]);
}
sub vfeeh {
vfee(@_[0..2],1,$_[3]);
}
sub vfeef {
vfee(@_[0..2],2,$_[3]);
}
sub vfeebs {
vfee(@_,0,1);
}
sub vfeehs {
vfee(@_,1,1);
}
sub vfeefs {
vfee(@_,2,1);
}
sub vfeezb {
vfee(@_,0,2);
}
sub vfeezh {
vfee(@_,1,2);
}
sub vfeezf {
vfee(@_,2,2);
}
sub vfeezbs {
vfee(@_,0,3);
}
sub vfeezhs {
vfee(@_,1,3);
}
sub vfeezfs {
vfee(@_,2,3);
}
sub vfene {
confess(err("ARGNUM")) if ($#_<3||$#_>4);
VRRb(0xe781,@_);
}
sub vfeneb {
vfene(@_[0..2],0,$_[3]);
}
sub vfeneh {
vfene(@_[0..2],1,$_[3]);
}
sub vfenef {
vfene(@_[0..2],2,$_[3]);
}
sub vfenebs {
vfene(@_,0,1);
}
sub vfenehs {
vfene(@_,1,1);
}
sub vfenefs {
vfene(@_,2,1);
}
sub vfenezb {
vfene(@_,0,2);
}
sub vfenezh {
vfene(@_,1,2);
}
sub vfenezf {
vfene(@_,2,2);
}
sub vfenezbs {
vfene(@_,0,3);
}
sub vfenezhs {
vfene(@_,1,3);
}
sub vfenezfs {
vfene(@_,2,3);
}
sub vistr {
confess(err("ARGNUM")) if ($#_<2||$#_>3);
VRRa(0xe75c,@_[0..2],0,$_[3]);
}
sub vistrb {
vistr(@_[0..1],0,$_[2]);
}
sub vistrh {
vistr(@_[0..1],1,$_[2]);
}
sub vistrf {
vistr(@_[0..1],2,$_[2]);
}
sub vistrbs {
vistr(@_,0,1);
}
sub vistrhs {
vistr(@_,1,1);
}
sub vistrfs {
vistr(@_,2,1);
}
sub vstrc {
confess(err("ARGNUM")) if ($#_<4||$#_>5);
VRRd(0xe78a,@_);
}
sub vstrcb {
vstrc(@_[0..3],0,$_[4]);
}
sub vstrch {
vstrc(@_[0..3],1,$_[4]);
}
sub vstrcf {
vstrc(@_[0..3],2,$_[4]);
}
sub vstrcbs {
$_[4]=0 if (!defined($_[4]));
vstrc(@_[0..3],0,0x1|$_[4]);
}
sub vstrchs {
$_[4]=0 if (!defined($_[4]));
vstrc(@_[0..3],1,0x1|$_[4]);
}
sub vstrcfs {
$_[4]=0 if (!defined($_[4]));
vstrc(@_[0..3],2,0x1|$_[4]);
}
sub vstrczb {
$_[4]=0 if (!defined($_[4]));
vstrc(@_[0..3],0,0x2|$_[4]);
}
sub vstrczh {
$_[4]=0 if (!defined($_[4]));
vstrc(@_[0..3],1,0x2|$_[4]);
}
sub vstrczf {
$_[4]=0 if (!defined($_[4]));
vstrc(@_[0..3],2,0x2|$_[4]);
}
sub vstrczbs {
$_[4]=0 if (!defined($_[4]));
vstrc(@_[0..3],0,0x3|$_[4]);
}
sub vstrczhs {
$_[4]=0 if (!defined($_[4]));
vstrc(@_[0..3],1,0x3|$_[4]);
}
sub vstrczfs {
$_[4]=0 if (!defined($_[4]));
vstrc(@_[0..3],2,0x3|$_[4]);
}
# VX - Floating-point Instructions
sub vfa {
confess(err("ARGNUM")) if ($#_!=4);
VRRc(0xe7e3,@_);
}
sub vfadb {
vfa(@_,3,0);
}
sub wfadb {
vfa(@_,3,8);
}
sub wfc {
confess(err("ARGNUM")) if ($#_!=3);
VRRa(0xe7cb,@_);
}
sub wfcdb {
wfc(@_,3,0);
}
sub wfk {
confess(err("ARGNUM")) if ($#_!=3);
VRRa(0xe7ca,@_);
}
sub wfksb {
wfk(@_,2,0);
}
sub wfkdb {
wfk(@_,3,0);
}
sub wfkxb {
wfk(@_,4,0);
}
sub vfce {
confess(err("ARGNUM")) if ($#_!=5);
VRRc(0xe7e8,@_);
}
sub vfcedb {
vfce(@_,3,0,0);
}
sub vfcedbs {
vfce(@_,3,0,1);
}
sub wfcedb {
vfce(@_,3,8,0);
}
sub wfcedbs {
vfce(@_,3,8,1);
}
sub vfch {
confess(err("ARGNUM")) if ($#_!=5);
VRRc(0xe7eb,@_);
}
sub vfchdb {
vfch(@_,3,0,0);
}
sub vfchdbs {
vfch(@_,3,0,1);
}
sub wfchdb {
vfch(@_,3,8,0);
}
sub wfchdbs {
vfch(@_,3,8,1);
}
sub vfche {
confess(err("ARGNUM")) if ($#_!=5);
VRRc(0xe7ea,@_);
}
sub vfchedb {
vfche(@_,3,0,0);
}
sub vfchedbs {
vfche(@_,3,0,1);
}
sub wfchedb {
vfche(@_,3,8,0);
}
sub wfchedbs {
vfche(@_,3,8,1);
}
sub vcdg {
confess(err("ARGNUM")) if ($#_!=4);
VRRa(0xe7c3,@_);
}
sub vcdgb {
vcdg(@_[0..1],3,@_[2..3]);
}
sub wcdgb {
vcdg(@_[0..1],3,0x8|$_[2],$_[3]);
}
sub vcdlg {
confess(err("ARGNUM")) if ($#_!=4);
VRRa(0xe7c1,@_);
}
sub vcdlgb {
vcdlg(@_[0..1],3,@_[2..3]);
}
sub wcdlgb {
vcdlg(@_[0..1],3,0x8|$_[2],$_[3]);
}
sub vcgd {
confess(err("ARGNUM")) if ($#_!=4);
VRRa(0xe7c2,@_);
}
sub vcgdb {
vcgd(@_[0..1],3,@_[2..3]);
}
sub wcgdb {
vcgd(@_[0..1],3,0x8|$_[2],$_[3]);
}
sub vclgd {
confess(err("ARGNUM")) if ($#_!=4);
VRRa(0xe7c0,@_);
}
sub vclgdb {
vclgd(@_[0..1],3,@_[2..3]);
}
sub wclgdb {
vclgd(@_[0..1],3,0x8|$_[2],$_[3]);
}
sub vfd {
confess(err("ARGNUM")) if ($#_!=4);
VRRc(0xe7e5,@_);
}
sub vfddb {
vfd(@_,3,0);
}
sub wfddb {
vfd(@_,3,8);
}
sub vfi {
confess(err("ARGNUM")) if ($#_!=4);
VRRa(0xe7c7,@_);
}
sub vfidb {
vfi(@_[0..1],3,@_[2..3]);
}
sub wfidb {
vfi(@_[0..1],3,0x8|$_[2],$_[3]);
}
sub vlde { # deprecated, use vfll
confess(err("ARGNUM")) if ($#_!=3);
VRRa(0xe7c4,@_);
}
sub vldeb { # deprecated, use vflls
vlde(@_,2,0);
}
sub wldeb { # deprecated, use wflls
vlde(@_,2,8);
}
sub vled { # deprecated, use vflr
confess(err("ARGNUM")) if ($#_!=4);
VRRa(0xe7c5,@_);
}
sub vledb { # deprecated, use vflrd
vled(@_[0..1],3,@_[2..3]);
}
sub wledb { # deprecated, use wflrd
vled(@_[0..1],3,0x8|$_[2],$_[3]);
}
sub vfm {
confess(err("ARGNUM")) if ($#_!=4);
VRRc(0xe7e7,@_);
}
sub vfmdb {
vfm(@_,3,0);
}
sub wfmdb {
vfm(@_,3,8);
}
sub vfma {
confess(err("ARGNUM")) if ($#_!=5);
VRRe(0xe78f,@_);
}
sub vfmadb {
vfma(@_,0,3);
}
sub wfmadb {
vfma(@_,8,3);
}
sub vfms {
confess(err("ARGNUM")) if ($#_!=5);
VRRe(0xe78e,@_);
}
sub vfmsdb {
vfms(@_,0,3);
}
sub wfmsdb {
vfms(@_,8,3);
}
sub vfpso {
confess(err("ARGNUM")) if ($#_!=4);
VRRa(0xe7cc,@_);
}
sub vfpsodb {
vfpso(@_[0..1],3,0,$_[2]);
}
sub wfpsodb {
vfpso(@_[0..1],3,8,$_[2]);
}
sub vflcdb {
vfpso(@_,3,0,0);
}
sub wflcdb {
vfpso(@_,3,8,0);
}
sub vflndb {
vfpso(@_,3,0,1);
}
sub wflndb {
vfpso(@_,3,8,1);
}
sub vflpdb {
vfpso(@_,3,0,2);
}
sub wflpdb {
vfpso(@_,3,8,2);
}
sub vfsq {
confess(err("ARGNUM")) if ($#_!=3);
VRRa(0xe7ce,@_);
}
sub vfsqdb {
vfsq(@_,3,0);
}
sub wfsqdb {
vfsq(@_,3,8);
}
sub vfs {
confess(err("ARGNUM")) if ($#_!=4);
VRRc(0xe7e2,@_);
}
sub vfsdb {
vfs(@_,3,0);
}
sub wfsdb {
vfs(@_,3,8);
}
sub vftci {
confess(err("ARGNUM")) if ($#_!=4);
VRIe(0xe74a,@_);
}
sub vftcidb {
vftci(@_,3,0);
}
sub wftcidb {
vftci(@_,3,8);
}
# VXE - Support Instructions
sub vbperm {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe785,@_);
}
sub vllezlf {
vllez(@_,6);
}
# VXE - Integer Instructions
sub vmsl {
confess(err("ARGNUM")) if ($#_!=5);
VRRd(0xe7b8,@_);
}
sub vmslg {
vmsl(@_[0..3],3,$_[4]);
}
sub vnx {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe76c,@_);
}
sub vnn {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe76e,@_);
}
sub voc {
confess(err("ARGNUM")) if ($#_!=2);
VRRc(0xe76f,@_);
}
sub vpopctb {
vpopct(@_,0);
}
sub vpopcth {
vpopct(@_,1);
}
sub vpopctf {
vpopct(@_,2);
}
sub vpopctg {
vpopct(@_,3);
}
# VXE - Floating-Point Instructions
sub vfasb {
vfa(@_,2,0);
}
sub wfasb {
vfa(@_,2,8);
}
sub wfaxb {
vfa(@_,4,8);
}
sub wfcsb {
wfc(@_,2,0);
}
sub wfcxb {
wfc(@_,4,0);
}
sub vfcesb {
vfce(@_,2,0,0);
}
sub vfcesbs {
vfce(@_,2,0,1);
}
sub wfcesb {
vfce(@_,2,8,0);
}
sub wfcesbs {
vfce(@_,2,8,1);
}
sub wfcexb {
vfce(@_,4,8,0);
}
sub wfcexbs {
vfce(@_,4,8,1);
}
sub vfchsb {
vfch(@_,2,0,0);
}
sub vfchsbs {
vfch(@_,2,0,1);
}
sub wfchsb {
vfch(@_,2,8,0);
}
sub wfchsbs {
vfch(@_,2,8,1);
}
sub wfchxb {
vfch(@_,4,8,0);
}
sub wfchxbs {
vfch(@_,4,8,1);
}
sub vfchesb {
vfche(@_,2,0,0);
}
sub vfchesbs {
vfche(@_,2,0,1);
}
sub wfchesb {
vfche(@_,2,8,0);
}
sub wfchesbs {
vfche(@_,2,8,1);
}
sub wfchexb {
vfche(@_,4,8,0);
}
sub wfchexbs {
vfche(@_,4,8,1);
}
sub vfdsb {
vfd(@_,2,0);
}
sub wfdsb {
vfd(@_,2,8);
}
sub wfdxb {
vfd(@_,4,8);
}
sub vfisb {
vfi(@_[0..1],2,@_[2..3]);
}
sub wfisb {
vfi(@_[0..1],2,0x8|$_[2],$_[3]);
}
sub wfixb {
vfi(@_[0..1],4,0x8|$_[2],$_[3]);
}
sub vfll {
vlde(@_);
}
sub vflls {
vfll(@_,2,0);
}
sub wflls {
vfll(@_,2,8);
}
sub wflld {
vfll(@_,3,8);
}
sub vflr {
vled(@_);
}
sub vflrd {
vflr(@_[0..1],3,@_[2..3]);
}
sub wflrd {
vflr(@_[0..1],3,0x8|$_[2],$_[3]);
}
sub wflrx {
vflr(@_[0..1],4,0x8|$_[2],$_[3]);
}
sub vfmax {
confess(err("ARGNUM")) if ($#_!=5);
VRRc(0xe7ef,@_);
}
sub vfmaxsb {
vfmax(@_[0..2],2,0,$_[3]);
}
sub vfmaxdb {
vfmax(@_[0..2],3,0,$_[3]);
}
sub wfmaxsb {
vfmax(@_[0..2],2,8,$_[3]);
}
sub wfmaxdb {
vfmax(@_[0..2],3,8,$_[3]);
}
sub wfmaxxb {
vfmax(@_[0..2],4,8,$_[3]);
}
sub vfmin {
confess(err("ARGNUM")) if ($#_!=5);
VRRc(0xe7ee,@_);
}
sub vfminsb {
vfmin(@_[0..2],2,0,$_[5]);
}
sub vfmindb {
vfmin(@_[0..2],3,0,$_[5]);
}
sub wfminsb {
vfmin(@_[0..2],2,8,$_[5]);
}
sub wfmindb {
vfmin(@_[0..2],3,8,$_[5]);
}
sub wfminxb {
vfmin(@_[0..2],4,8,$_[5]);
}
sub vfmsb {
vfm(@_,2,0);
}
sub wfmsb {
vfm(@_,2,8);
}
sub wfmxb {
vfm(@_,4,8);
}
sub vfmasb {
vfma(@_,0,2);
}
sub wfmasb {
vfma(@_,8,2);
}
sub wfmaxb {
vfma(@_,8,4);
}
sub vfmssb {
vfms(@_,0,2);
}
sub wfmssb {
vfms(@_,8,2);
}
sub wfmsxb {
vfms(@_,8,4);
}
sub vfnma {
confess(err("ARGNUM")) if ($#_!=5);
VRRe(0xe79f,@_);
}
sub vfnmasb {
vfnma(@_,0,2);
}
sub vfnmadb {
vfnma(@_,0,3);
}
sub wfnmasb {
vfnma(@_,8,2);
}
sub wfnmadb {
vfnma(@_,8,3);
}
sub wfnmaxb {
vfnma(@_,8,4);
}
sub vfnms {
confess(err("ARGNUM")) if ($#_!=5);
VRRe(0xe79e,@_);
}
sub vfnmssb {
vfnms(@_,0,2);
}
sub vfnmsdb {
vfnms(@_,0,3);
}
sub wfnmssb {
vfnms(@_,8,2);
}
sub wfnmsdb {
vfnms(@_,8,3);
}
sub wfnmsxb {
vfnms(@_,8,4);
}
sub vfpsosb {
vfpso(@_[0..1],2,0,$_[2]);
}
sub wfpsosb {
vfpso(@_[0..1],2,8,$_[2]);
}
sub vflcsb {
vfpso(@_,2,0,0);
}
sub wflcsb {
vfpso(@_,2,8,0);
}
sub vflnsb {
vfpso(@_,2,0,1);
}
sub wflnsb {
vfpso(@_,2,8,1);
}
sub vflpsb {
vfpso(@_,2,0,2);
}
sub wflpsb {
vfpso(@_,2,8,2);
}
sub vfpsoxb {
vfpso(@_[0..1],4,0,$_[2]);
}
sub wfpsoxb {
vfpso(@_[0..1],4,8,$_[2]);
}
sub vflcxb {
vfpso(@_,4,0,0);
}
sub wflcxb {
vfpso(@_,4,8,0);
}
sub vflnxb {
vfpso(@_,4,0,1);
}
sub wflnxb {
vfpso(@_,4,8,1);
}
sub vflpxb {
vfpso(@_,4,0,2);
}
sub wflpxb {
vfpso(@_,4,8,2);
}
sub vfsqsb {
vfsq(@_,2,0);
}
sub wfsqsb {
vfsq(@_,2,8);
}
sub wfsqxb {
vfsq(@_,4,8);
}
sub vfssb {
vfs(@_,2,0);
}
sub wfssb {
vfs(@_,2,8);
}
sub wfsxb {
vfs(@_,4,8);
}
sub vftcisb {
vftci(@_,2,0);
}
sub wftcisb {
vftci(@_,2,8);
}
sub wftcixb {
vftci(@_,4,8);
}
# VXD - Support Instructions
sub vlrlr {
confess(err("ARGNUM")) if ($#_!=2);
VRSd(0xe637,@_);
}
sub vlrl {
confess(err("ARGNUM")) if ($#_!=2);
VSI(0xe635,@_);
}
sub vstrlr {
confess(err("ARGNUM")) if ($#_!=2);
VRSd(0xe63f,@_);
}
sub vstrl {
confess(err("ARGNUM")) if ($#_!=2);
VSI(0xe63d,@_);
}
sub vap {
confess(err("ARGNUM")) if ($#_!=4);
VRIf(0xe671,@_);
}
sub vcp {
confess(err("ARGNUM")) if ($#_!=2);
VRRh(0xe677,@_);
}
sub vcvb {
confess(err("ARGNUM")) if ($#_!=2);
VRRi(0xe650,@_);
}
sub vcvbg {
confess(err("ARGNUM")) if ($#_!=2);
VRRi(0xe652,@_);
}
sub vcvd {
confess(err("ARGNUM")) if ($#_!=3);
VRIi(0xe658,@_);
}
sub vcvdg {
confess(err("ARGNUM")) if ($#_!=3);
VRIi(0xe65a,@_);
}
sub vdp {
confess(err("ARGNUM")) if ($#_!=4);
VRIf(0xe67a,@_);
}
sub vlip {
confess(err("ARGNUM")) if ($#_!=2);
VRIh(0xe649,@_);
}
sub vmp {
confess(err("ARGNUM")) if ($#_!=4);
VRIf(0xe678,@_);
}
sub vmsp {
confess(err("ARGNUM")) if ($#_!=4);
VRIf(0xe679,@_);
}
sub vpkz {
confess(err("ARGNUM")) if ($#_!=2);
VSI(0xe634,@_);
}
sub vpsop {
confess(err("ARGNUM")) if ($#_!=4);
VRIg(0xe65b,@_);
}
sub vrp {
confess(err("ARGNUM")) if ($#_!=4);
VRIf(0xe67b,@_);
}
sub vsdp {
confess(err("ARGNUM")) if ($#_!=4);
VRIf(0xe67e,@_);
}
sub vsrp {
confess(err("ARGNUM")) if ($#_!=4);
VRIg(0xe659,@_);
}
sub vsp {
confess(err("ARGNUM")) if ($#_!=4);
VRIf(0xe673,@_);
}
sub vtp {
confess(err("ARGNUM")) if ($#_!=0);
VRRg(0xe65f,@_);
}
sub vupkz {
confess(err("ARGNUM")) if ($#_!=2);
VSI(0xe63c,@_);
}
#
# Instruction Formats
#
sub RRE {
confess(err("ARGNUM")) if ($#_<0||2<$#_);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$r1,$r2)=(shift,get_R(shift),get_R(shift));
$out.="\t.long\t".sprintf("%#010x",($opcode<<16|$r1<<4|$r2));
$out.="\t# $memn\t$ops\n"
}
sub RRFb {
confess(err("ARGNUM")) if ($#_<3||4<$#_);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$r1,$r3,$r2,$m4)=(shift,get_R(shift),get_R(shift)
,get_R(shift),get_M(shift));
$out.="\t.long\t"
.sprintf("%#010x",($opcode<<16|$r3<<12|$m4<<8|$r1<<4|$r2));
$out.="\t# $memn\t$ops\n"
}
sub S {
confess(err("ARGNUM")) if ($#_<0||1<$#_);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$d2,$b2)=(shift,get_DB(shift));
$out.="\t.long\t".sprintf("%#010x",($opcode<<16|$b2<<12|$d2));
$out.="\t# $memn\t$ops\n"
}
sub VRIa {
confess(err("ARGNUM")) if ($#_<2||3<$#_);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$i2,$m3)=(shift,get_V(shift),get_I(shift,16),
get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)).",";
$out.=sprintf("%#06x",$i2).",";
$out.=sprintf("%#06x",($m3<<12|RXB($v1)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRIb {
confess(err("ARGNUM")) if ($#_!=4);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$i2,$i3,$m4)=(shift,get_V(shift),get_I(shift,8),
,get_I(shift,8),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)).",";
$out.=sprintf("%#06x",($i2<<8|$i3)).",";
$out.=sprintf("%#06x",($m4<<12|RXB($v1)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRIc {
confess(err("ARGNUM")) if ($#_!=4);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v3,$i2,$m4)=(shift,get_V(shift),get_V(shift),
,get_I(shift,16),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v3&0xf)).",";
$out.=sprintf("%#06x",$i2).",";
$out.=sprintf("%#06x",($m4<<12|RXB($v1,$v3)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRId {
confess(err("ARGNUM")) if ($#_<4||$#_>5);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v2,$v3,$i4,$m5)=(shift,get_V(shift),get_V(shift),
,get_V(shift),get_I(shift,8),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).",";
$out.=sprintf("%#06x",(($v3&0xf)<<12|$i4)).",";
$out.=sprintf("%#06x",($m5<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRIe {
confess(err("ARGNUM")) if ($#_!=5);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v2,$i3,$m4,$m5)=(shift,get_V(shift),get_V(shift),
,get_I(shift,12),get_M(shift),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).",";
$out.=sprintf("%#06x",($i3<<4|$m5)).",";
$out.=sprintf("%#06x",($m4<<12|RXB($v1,$v2)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRIf {
confess(err("ARGNUM")) if ($#_!=5);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v2,$v3,$i4,$m5)=(shift,get_V(shift),get_V(shift),
,get_V(shift),get_I(shift,8),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).",";
$out.=sprintf("%#06x",(($v3&0xf)<<12|$m5<<4)|$i4>>4).",";
$out.=sprintf("%#06x",(($i4&0xf)<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRIg {
confess(err("ARGNUM")) if ($#_!=5);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v2,$i3,$i4,$m5)=(shift,get_V(shift),get_V(shift),
,get_I(shift,8),get_I(shift,8),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).",";
$out.=sprintf("%#06x",($i4<<8|$m5<<4|$i3>>4)).",";
$out.=sprintf("%#06x",(($i3&0xf)<<12|RXB($v1,$v2)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRIh {
confess(err("ARGNUM")) if ($#_!=3);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$i2,$i3)=(shift,get_V(shift),get_I(shift,16),
get_I(shift,4));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)).",";
$out.=sprintf("%#06x",$i2).",";
$out.=sprintf("%#06x",($i3<<12|RXB($v1)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRIi {
confess(err("ARGNUM")) if ($#_!=4);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$r2,$i3,$m4)=(shift,get_V(shift),get_R(shift),
,get_I(shift,8),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|$r2).",";
$out.=sprintf("%#06x",($m4<<4|$i3>>4)).",";
$out.=sprintf("%#06x",(($i3&0xf)<<12|RXB($v1)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRRa {
confess(err("ARGNUM")) if ($#_<2||5<$#_);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v2,$m3,$m4,$m5)=(shift,get_V(shift),get_V(shift),
get_M(shift),get_M(shift),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
$out.=sprintf("%#06x",($m5<<4|$m4)).",";
$out.=sprintf("%#06x",($m3<<12|RXB($v1,$v2)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRRb {
confess(err("ARGNUM")) if ($#_<3||5<$#_);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v2,$v3,$m4,$m5)=(shift,get_V(shift),get_V(shift),
get_V(shift),get_M(shift),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
$out.=sprintf("%#06x",(($v3&0xf)<<12|$m5<<4)).",";
$out.=sprintf("%#06x",($m4<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRRc {
confess(err("ARGNUM")) if ($#_<3||6<$#_);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v2,$v3,$m4,$m5,$m6)=(shift,get_V(shift),get_V(shift),
get_V(shift),get_M(shift),get_M(shift),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
$out.=sprintf("%#06x",(($v3&0xf)<<12|$m6<<4|$m5)).",";
$out.=sprintf("%#06x",($m4<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRRd {
confess(err("ARGNUM")) if ($#_<4||6<$#_);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v2,$v3,$v4,$m5,$m6)=(shift,get_V(shift),get_V(shift),
get_V(shift),get_V(shift),get_M(shift),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
$out.=sprintf("%#06x",(($v3&0xf)<<12|$m5<<8|$m6<<4)).",";
$out.=sprintf("%#06x",(($v4&0xf)<<12|RXB($v1,$v2,$v3,$v4)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRRe {
confess(err("ARGNUM")) if ($#_<4||6<$#_);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v2,$v3,$v4,$m5,$m6)=(shift,get_V(shift),get_V(shift),
get_V(shift),get_V(shift),get_M(shift),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
$out.=sprintf("%#06x",(($v3&0xf)<<12|$m6<<8|$m5)).",";
$out.=sprintf("%#06x",(($v4&0xf)<<12|RXB($v1,$v2,$v3,$v4)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRRf {
confess(err("ARGNUM")) if ($#_!=3);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$r2,$r3)=(shift,get_V(shift),get_R(shift),
get_R(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|$r2)).",";
$out.=sprintf("%#06x",($r3<<12)).",";
$out.=sprintf("%#06x",(RXB($v1)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRRg {
confess(err("ARGNUM")) if ($#_!=1);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1)=(shift,get_V(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf))).",";
$out.=sprintf("%#06x",0x0000).",";
$out.=sprintf("%#06x",(RXB(0,$v1)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRRh {
confess(err("ARGNUM")) if ($#_<2||$#_>3);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v2,$m3)=(shift,get_V(shift),get_V(shift),
get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf))).",";
$out.=sprintf("%#06x",(($v2&0xf)<<12|$m3<<4)).",";
$out.=sprintf("%#06x",(RXB(0,$v1,$v2)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRRi {
confess(err("ARGNUM")) if ($#_!=3);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$r1,$v2,$m3)=(shift,get_R(shift),get_V(shift),
get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|$r1<<4|($v2&0xf))).",";
$out.=sprintf("%#06x",($m3<<4))."\,";
$out.=sprintf("%#06x",(RXB(0,$v2)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRSa {
confess(err("ARGNUM")) if ($#_<3||$#_>4);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$v3,$d2,$b2,$m4)=(shift,get_V(shift),get_V(shift),
get_DB(shift),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v3&0xf))).",";
$out.=sprintf("%#06x",($b2<<12|$d2)).",";
$out.=sprintf("%#06x",($m4<<12|RXB($v1,$v3)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRSb {
confess(err("ARGNUM")) if ($#_<3||$#_>4);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$r3,$d2,$b2,$m4)=(shift,get_V(shift),get_R(shift),
get_DB(shift),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|$r3)).",";
$out.=sprintf("%#06x",($b2<<12|$d2)).",";
$out.=sprintf("%#06x",($m4<<12|RXB($v1)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRSc {
confess(err("ARGNUM")) if ($#_!=4);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$r1,$v3,$d2,$b2,$m4)=(shift,get_R(shift),get_V(shift),
get_DB(shift),get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|$r1<<4|($v3&0xf))).",";
$out.=sprintf("%#06x",($b2<<12|$d2)).",";
$out.=sprintf("%#06x",($m4<<12|RXB(0,$v3)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRSd {
confess(err("ARGNUM")) if ($#_!=3);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$r3,$d2,$b2)=(shift,get_V(shift),get_R(shift),
get_DB(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|$r3)).",";
$out.=sprintf("%#06x",($b2<<12|$d2)).",";
$out.=sprintf("%#06x",(($v1&0xf)<<12|RXB(0,0,0,$v1)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRV {
confess(err("ARGNUM")) if ($#_<2||$#_>3);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$d2,$v2,$b2,$m3)=(shift,get_V(shift),get_DVB(shift),
get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
$out.=sprintf("%#06x",($b2<<12|$d2)).",";
$out.=sprintf("%#06x",($m3<<12|RXB($v1,$v2)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VRX {
confess(err("ARGNUM")) if ($#_<2||$#_>3);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$d2,$x2,$b2,$m3)=(shift,get_V(shift),get_DXB(shift),
get_M(shift));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($x2))).",";
$out.=sprintf("%#06x",($b2<<12|$d2)).",";
$out.=sprintf("%#06x",($m3<<12|RXB($v1)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
sub VSI {
confess(err("ARGNUM")) if ($#_!=3);
my $ops=join(',',@_[1..$#_]);
my $memn=(caller(1))[3];
$memn=~s/^.*:://;
my ($opcode,$v1,$d2,$b2,$i3)=(shift,get_V(shift),get_DB(shift),
get_I(shift,8));
$out.="\t.word\t";
$out.=sprintf("%#06x",($opcode&0xff00|$i3)).",";
$out.=sprintf("%#06x",($b2<<12|$d2)).",";
$out.=sprintf("%#06x",(($v1&0xf)<<12|RXB(0,0,0,$v1)<<8|$opcode&0xff));
$out.="\t# $memn\t$ops\n"
}
#
# Internal
#
sub get_R {
confess(err("ARGNUM")) if ($#_!=0);
my $r;
for (shift) {
if (!defined) {
$r=0;
} elsif (/^$GR$/) {
$r=$1;
} else {
confess(err("PARSE"));
}
}
confess(err("ARGRANGE")) if ($r&~0xf);
return $r;
}
sub get_V {
confess(err("ARGNUM")) if ($#_!=0);
my $v;
for (shift) {
if (!defined) {
$v=0;
} elsif (/^$VR$/) {
$v=$1;
} else {
confess(err("PARSE"));
}
}
confess(err("ARGRANGE")) if ($v&~0x1f);
return $v;
}
sub get_I {
confess(err("ARGNUM")) if ($#_!=1);
my ($i,$bits)=(shift,shift);
$i=defined($i)?(eval($i)):(0);
confess(err("PARSE")) if (!defined($i));
confess(err("ARGRANGE")) if (abs($i)&~(2**$bits-1));
return $i&(2**$bits-1);
}
sub get_M {
confess(err("ARGNUM")) if ($#_!=0);
my $m=shift;
$m=defined($m)?(eval($m)):(0);
confess(err("PARSE")) if (!defined($m));
confess(err("ARGRANGE")) if ($m&~0xf);
return $m;
}
sub get_DB
{
confess(err("ARGNUM")) if ($#_!=0);
my ($d,$b);
for (shift) {
if (!defined) {
($d,$b)=(0,0);
} elsif (/^(.+)\($GR\)$/) {
($d,$b)=(eval($1),$2);
confess(err("PARSE")) if (!defined($d));
} elsif (/^(.+)$/) {
($d,$b)=(eval($1),0);
confess(err("PARSE")) if (!defined($d));
} else {
confess(err("PARSE"));
}
}
confess(err("ARGRANGE")) if ($d&~0xfff||$b&~0xf);
return ($d,$b);
}
sub get_DVB
{
confess(err("ARGNUM")) if ($#_!=0);
my ($d,$v,$b);
for (shift) {
if (!defined) {
($d,$v,$b)=(0,0,0);
} elsif (/^(.+)\($VR,$GR\)$/) {
($d,$v,$b)=(eval($1),$2,$3);
confess(err("PARSE")) if (!defined($d));
} elsif (/^(.+)\($GR\)$/) {
($d,$v,$b)=(eval($1),0,$2);
confess(err("PARSE")) if (!defined($d));
} elsif (/^(.+)$/) {
($d,$v,$b)=(eval($1),0,0);
confess(err("PARSE")) if (!defined($d));
} else {
confess(err("PARSE"));
}
}
confess(err("ARGRANGE")) if ($d&~0xfff||$v&~0x1f||$b&~0xf);
return ($d,$v,$b);
}
sub get_DXB
{
confess(err("ARGNUM")) if ($#_!=0);
my ($d,$x,$b);
for (shift) {
if (!defined) {
($d,$x,$b)=(0,0,0);
} elsif (/^(.+)\($GR,$GR\)$/) {
($d,$x,$b)=(eval($1),$2,$3);
confess(err("PARSE")) if (!defined($d));
} elsif (/^(.+)\($GR\)$/) {
($d,$x,$b)=(eval($1),0,$2);
confess(err("PARSE")) if (!defined($d));
} elsif (/^(.+)$/) {
($d,$x,$b)=(eval($1),0,0);
confess(err("PARSE")) if (!defined($d));
} else {
confess(err("PARSE"));
}
}
confess(err("ARGRANGE")) if ($d&~0xfff||$x&~0xf||$b&~0xf);
return ($d,$x,$b);
}
sub RXB
{
confess(err("ARGNUM")) if ($#_<0||3<$#_);
my $rxb=0;
$rxb|=0x08 if (defined($_[0])&&($_[0]&0x10));
$rxb|=0x04 if (defined($_[1])&&($_[1]&0x10));
$rxb|=0x02 if (defined($_[2])&&($_[2]&0x10));
$rxb|=0x01 if (defined($_[3])&&($_[3]&0x10));
return $rxb;
}
sub err {
my %ERR =
(
ARGNUM => 'Wrong number of arguments',
ARGRANGE=> 'Argument out of range',
PARSE => 'Parse error',
);
confess($ERR{ARGNUM}) if ($#_!=0);
return $ERR{$_[0]};
}
1;
+8 -11
View File
@@ -168,16 +168,11 @@ void OPENSSL_altivec_probe(void);
void OPENSSL_crypto207_probe(void);
void OPENSSL_madd300_probe(void);
/*
* Use a weak reference to getauxval() so we can use it if it is available
* but don't break the build if it is not. Note that this is *link-time*
* feature detection, not *run-time*. In other words if we link with
* symbol present, it's expected to be present even at run-time.
*/
#if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__)
extern unsigned long getauxval(unsigned long type) __attribute__ ((weak));
#else
static unsigned long (*getauxval) (unsigned long) = NULL;
#if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
# if __GLIBC_PREREQ(2, 16)
# include <sys/auxv.h>
# define OSSL_IMPLEMENT_GETAUXVAL
# endif
#endif
/* I wish <sys/auxv.h> was universally available */
@@ -277,7 +272,8 @@ void OPENSSL_cpuid_setup(void)
}
#endif
if (getauxval != NULL) {
#ifdef OSSL_IMPLEMENT_GETAUXVAL
{
unsigned long hwcap = getauxval(HWCAP);
if (hwcap & HWCAP_FPU) {
@@ -307,6 +303,7 @@ void OPENSSL_cpuid_setup(void)
return;
}
#endif
sigfillset(&all_masked);
sigdelset(&all_masked, SIGILL);
+6 -3
View File
@@ -34,7 +34,7 @@ static int rsa_param_encode(const EVP_PKEY *pkey,
*pstr = NULL;
/* If RSA it's just NULL type */
if (pkey->ameth->pkey_id == EVP_PKEY_RSA) {
if (pkey->ameth->pkey_id != EVP_PKEY_RSA_PSS) {
*pstrtype = V_ASN1_NULL;
return 1;
}
@@ -58,7 +58,7 @@ static int rsa_param_decode(RSA *rsa, const X509_ALGOR *alg)
int algptype;
X509_ALGOR_get0(&algoid, &algptype, &algp, alg);
if (OBJ_obj2nid(algoid) == EVP_PKEY_RSA)
if (OBJ_obj2nid(algoid) != EVP_PKEY_RSA_PSS)
return 1;
if (algptype == V_ASN1_UNDEF)
return 1;
@@ -109,7 +109,10 @@ static int rsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
RSA_free(rsa);
return 0;
}
EVP_PKEY_assign(pkey, pkey->ameth->pkey_id, rsa);
if (!EVP_PKEY_assign(pkey, pkey->ameth->pkey_id, rsa)) {
RSA_free(rsa);
return 0;
}
return 1;
}
+3 -1
View File
@@ -26,6 +26,7 @@ static BIGNUM *srp_Calc_xy(const BIGNUM *x, const BIGNUM *y, const BIGNUM *N)
unsigned char *tmp = NULL;
int numN = BN_num_bytes(N);
BIGNUM *res = NULL;
if (x != N && BN_ucmp(x, N) >= 0)
return NULL;
if (y != N && BN_ucmp(y, N) >= 0)
@@ -139,7 +140,8 @@ BIGNUM *SRP_Calc_x(const BIGNUM *s, const char *user, const char *pass)
|| !EVP_DigestFinal_ex(ctxt, dig, NULL)
|| !EVP_DigestInit_ex(ctxt, EVP_sha1(), NULL))
goto err;
BN_bn2bin(s, cs);
if (BN_bn2bin(s, cs) < 0)
goto err;
if (!EVP_DigestUpdate(ctxt, cs, BN_num_bytes(s)))
goto err;
+18 -3
View File
@@ -614,10 +614,14 @@ char *SRP_create_verifier(const char *user, const char *pass, char **salt,
if ((len = t_fromb64(tmp, sizeof(tmp), N)) <= 0)
goto err;
N_bn_alloc = BN_bin2bn(tmp, len, NULL);
if (N_bn_alloc == NULL)
goto err;
N_bn = N_bn_alloc;
if ((len = t_fromb64(tmp, sizeof(tmp) ,g)) <= 0)
goto err;
g_bn_alloc = BN_bin2bn(tmp, len, NULL);
if (g_bn_alloc == NULL)
goto err;
g_bn = g_bn_alloc;
defgNid = "*";
} else {
@@ -639,15 +643,19 @@ char *SRP_create_verifier(const char *user, const char *pass, char **salt,
goto err;
s = BN_bin2bn(tmp2, len, NULL);
}
if (s == NULL)
goto err;
if (!SRP_create_verifier_BN(user, pass, &s, &v, N_bn, g_bn))
goto err;
BN_bn2bin(v, tmp);
if (BN_bn2bin(v, tmp) < 0)
goto err;
vfsize = BN_num_bytes(v) * 2;
if (((vf = OPENSSL_malloc(vfsize)) == NULL))
goto err;
t_tob64(vf, tmp, BN_num_bytes(v));
if (!t_tob64(vf, tmp, BN_num_bytes(v)))
goto err;
if (*salt == NULL) {
char *tmp_salt;
@@ -655,7 +663,10 @@ char *SRP_create_verifier(const char *user, const char *pass, char **salt,
if ((tmp_salt = OPENSSL_malloc(SRP_RANDOM_SALT_LEN * 2)) == NULL) {
goto err;
}
t_tob64(tmp_salt, tmp2, SRP_RANDOM_SALT_LEN);
if (!t_tob64(tmp_salt, tmp2, SRP_RANDOM_SALT_LEN)) {
OPENSSL_free(tmp_salt);
goto err;
}
*salt = tmp_salt;
}
@@ -702,11 +713,15 @@ int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt,
goto err;
salttmp = BN_bin2bn(tmp2, SRP_RANDOM_SALT_LEN, NULL);
if (salttmp == NULL)
goto err;
} else {
salttmp = *salt;
}
x = SRP_Calc_x(salttmp, user, pass);
if (x == NULL)
goto err;
*verifier = BN_new();
if (*verifier == NULL)
+2 -1
View File
@@ -34,12 +34,13 @@ int OPENSSL_issetugid(void)
# if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
# if __GLIBC_PREREQ(2, 16)
# include <sys/auxv.h>
# define OSSL_IMPLEMENT_GETAUXVAL
# endif
# endif
int OPENSSL_issetugid(void)
{
# ifdef AT_SECURE
# ifdef OSSL_IMPLEMENT_GETAUXVAL
return getauxval(AT_SECURE) != 0;
# else
return getuid() != geteuid() || getgid() != getegid();
+1 -1
View File
@@ -237,7 +237,7 @@ int X509_STORE_up_ref(X509_STORE *vfy)
if (CRYPTO_UP_REF(&vfy->references, &i, vfy->lock) <= 0)
return 0;
REF_PRINT_COUNT("X509_STORE", a);
REF_PRINT_COUNT("X509_STORE", vfy);
REF_ASSERT_ISNT(i < 2);
return ((i > 1) ? 1 : 0);
}