SIMD support

The IBM z14™ and the IBM z13® machines added various vector instruction facilities to their processor's instruction set. These are single instruction, multiple data (SIMD) vector instructions that perform the same operation on multiple data points (the vector elements) simultaneously. Thus, starting with IBM z14 and libica version 3.3, you can exploit this data-level parallelism to improve performance of multi-precision arithmetic.

So starting with libica version 3.3 and IBM z14, you can use two APIs to exploit this parallelism in public key cryptography functions for computationally intensive squaring and multiplication operations for numbers up to a size of 512 bits.

Input format

For both APIs, the input numbers are represented in radix 264 with little-endian digit order, that is, the least-significant digit is stored at array element zero.

That is:


a = a7(264)7 + a6(264)6 + a5(264)5 + a4(264)4 + a3(264)3 + a2(264)2 + a1(264) + a0;
with:
ai ∈  {0,...,264-1}  

is represented by:

uint64_t a[8] = {a0; a1; a2; a3; a4; a5; a6; a7};

All input must be zero-padded. The output is zero-padded.