Add SHA-512 implementations for POWER8 and POWER9
[libgcrypt.git] / cipher / sha512-ssse3-amd64.S
index c721bcf..39bfe36 100644 (file)
     defined(HAVE_INTEL_SYNTAX_PLATFORM_AS) && \
     defined(HAVE_GCC_INLINE_ASM_SSSE3) && defined(USE_SHA512)
 
-#ifdef __PIC__
-#  define ADD_RIP +rip
-#else
-#  define ADD_RIP
-#endif
-
-#ifdef HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS
-# define ELF(...) __VA_ARGS__
-#else
-# define ELF(...) /*_*/
-#endif
+#include "asm-common-amd64.h"
 
 .intel_syntax noprefix
 
@@ -271,6 +261,7 @@ frame_size = ((frame_GPRSAVE) + (frame_GPRSAVE_size))
 ELF(.type _gcry_sha512_transform_amd64_ssse3,@function;)
 .align 16
 _gcry_sha512_transform_amd64_ssse3:
+       CFI_STARTPROC()
        xor eax, eax
 
        cmp msglen, 0
@@ -278,6 +269,7 @@ _gcry_sha512_transform_amd64_ssse3:
 
        /* Allocate Stack Space */
        sub     rsp, frame_size
+       CFI_ADJUST_CFA_OFFSET(frame_size);
 
        /* Save GPRs */
        mov     [rsp + frame_GPRSAVE + 8 * 0], rbx
@@ -285,6 +277,11 @@ _gcry_sha512_transform_amd64_ssse3:
        mov     [rsp + frame_GPRSAVE + 8 * 2], r13
        mov     [rsp + frame_GPRSAVE + 8 * 3], r14
        mov     [rsp + frame_GPRSAVE + 8 * 4], r15
+       CFI_REL_OFFSET(rbx, frame_GPRSAVE + 8 * 0);
+       CFI_REL_OFFSET(r12, frame_GPRSAVE + 8 * 1);
+       CFI_REL_OFFSET(r13, frame_GPRSAVE + 8 * 2);
+       CFI_REL_OFFSET(r14, frame_GPRSAVE + 8 * 3);
+       CFI_REL_OFFSET(r15, frame_GPRSAVE + 8 * 4);
 
 .Lupdateblock:
 
@@ -351,9 +348,11 @@ _gcry_sha512_transform_amd64_ssse3:
        mov     r13, [rsp + frame_GPRSAVE + 8 * 2]
        mov     r14, [rsp + frame_GPRSAVE + 8 * 3]
        mov     r15, [rsp + frame_GPRSAVE + 8 * 4]
-
-       /* Restore Stack Pointer */
-       add     rsp, frame_size
+       CFI_RESTORE(rbx)
+       CFI_RESTORE(r12)
+       CFI_RESTORE(r13)
+       CFI_RESTORE(r14)
+       CFI_RESTORE(r15)
 
        pxor    xmm0, xmm0
        pxor    xmm1, xmm1
@@ -362,19 +361,28 @@ _gcry_sha512_transform_amd64_ssse3:
        pxor    xmm4, xmm4
        pxor    xmm5, xmm5
 
-       /* Return stack burn depth */
-       mov     rax, frame_size
+       /* Burn stack */
+       t = 0
+       .rept frame_W_size / 16
+               movdqu [rsp + frame_W + (t) * 16], xmm0
+               t = ((t)+1)
+       .endr
+       movdqu [rsp + frame_WK], xmm0
+       xor     eax, eax
+
+       /* Restore Stack Pointer */
+       add     rsp, frame_size
+       CFI_ADJUST_CFA_OFFSET(-frame_size);
 
 .Lnowork:
        ret
+       CFI_ENDPROC()
 
 /*
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Binary Data
 */
 
-.data
-
 .align 16
 
 /* Mask for byte-swapping a couple of qwords in an XMM register using (v)pshufb. */