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 )