Simd-Avx512
view release on metacpan or search on metacpan
lib/Simd/Avx512.pm view on Meta::CPAN
$l
}
sub requireNumber128or256or512($) # Check that we have a number with a value of 128|256|512
{my ($n) = @_; # Number
confess "128|256|512 required for operand" unless $n == 128 or $n == 256 or $n == 512;
}
sub flipBitsUnderMask($$) # Flip the bits in a string where the corresponding mask bit is 1 else leave the bit as is
{my ($string, $mask) = @_; # Bit string, mask
my $l = requireSameLength $string, $mask;
my $f = '';
for my $i(0..$l-1) # Each character in the string and mask
{my $s = substr($string, $i, 1);
$f .= substr($mask, $i, 1) eq '0' ? $s : $s eq '0' ? '1' : '0'
}
$f
}
sub compareTwosComplement($$) # Compare two numbers in two's complement formats and return -1 if the first number is less than the second, 0 if they are equal, else +1
{my ($a, $b) = @_; # First, second
my $n = requireSameLength $a, $b;
return -1 if substr($a, 0, 1) eq '1' and substr($b, 0, 1) eq '0'; # Leading sign bit
return +1 if substr($a, 0, 1) eq '0' and substr($b, 0, 1) eq '1';
for(1..$n) # Non sign bits
{return -1 if substr($a, $_, 1) eq '0' and substr($b, $_, 1) eq '1';
return +1 if substr($a, $_, 1) eq '1' and substr($b, $_, 1) eq '0';
}
0 # Equal
}
lib/Simd/Avx512.pm view on Meta::CPAN
sub VPCMPUQ($$$$) # Packed CoMPare Unsigned Qword
{my ($k2, $xmm1, $xmm2, $op) = @_; # Input mask, qwords, qwords, test code
vpcmpu 64, $k2, $xmm1, $xmm2, $op
}
#D1 VPTEST # Packed TEST
#D2 VPTESTM # Packed TEST MASK
sub andAndTest($$) #P And two bit strings of the same length and return 0 if the result is 0 else 1
{my ($a, $b) = @_; # Element, element
my $N = requireSameLength $a, $b; # Check that the two elements have the same length
for(0..$N-1) # Look for match
{return 1 if substr($a, $_, 1) eq '1' and substr($b, $_, 1) eq '1';
}
0
}
sub vptest($$$) #P Packed TEST
{my ($size, $xmm1, $xmm2) = @_; # Size of element in bits, element, element
require8or16or32or64 $size if $develop; # We supply this parameter so we ought to get it right
lib/Simd/Avx512.pm view on Meta::CPAN
}
$r
}
#D1 Compress and Expand # Compress or expand
#D2 VPCOMPRESS # Packed COMPRESS
sub vpcompress($$$$$) #P Packed COMPRESS
{my ($size, $xmm1, $k2, $z, $xmm2) = @_; # Size of each element in bits, Compression target, compression mask, clear upper elements, source to compress
require64 $k2;
my $n = require128or256or512 $xmm1, $xmm2;
my $N = $n / $size; # Number of elements
$xmm1 = '0' x length $xmm1 if $z; # Clear target if requested
my $p = 0; # Position in target
for(1..$N) # Compress selected elements
{if (substr($k2, -$_, 1) eq '1')
{substr($xmm1, --$p * $size, $size) = substr($xmm2, -$_ * $size, $size)
}
}
$xmm1
}
lib/Simd/Avx512.pm view on Meta::CPAN
sub VPCOMPRESSQ($$$$) # Packed COMPRESS Qword
{my ($xmm1, $k2, $z, $xmm2) = @_; # Compression target, compression mask, clear upper elements, source to compress
vpcompress 64, $xmm1, $k2, $z, $xmm2
}
#D2 VPEXPAND # Packed EXPAND
sub vpexpand($$$$$) #P Packed EXPAND
{my ($size, $xmm1, $k2, $z, $xmm2) = @_; # Size of each element in bits, Compression target, expansion mask, clear upper elements, source to expand
require64 $k2;
my $n = require128or256or512 $xmm1, $xmm2;
my $N = $n / $size; # Number of elements
$xmm1 = '0' x length $xmm1 if $z; # Clear target if requested
my $p = 0; # Position in target
for(1..$N) # Compress selected elements
{if (substr($k2, -$_, 1) eq '1')
{substr($xmm2, -$_ * $size, $size) = substr($xmm1, --$p * $size, $size)
}
}
$xmm1
}
( run in 0.362 second using v1.01-cache-2.11-cpan-0d8aa00de5b )