bn_mul_recursive doesn't handle all cases correctly, which results in
[openssl.git] / crypto / md32_common.h
index ce956df3825ac8bd5aad2d2567acb671ce3db596..8fda6ffded85dbb002424011eb5ca875cd784fc3 100644 (file)
                                : "r"(a), "I"(n));      \
                           ret;                         \
                        })
+#  elif defined(__s390x__)
+#   define ROTATE(a,n) ({ register unsigned int ret;   \
+                               asm ("rll %0,%1,%2"     \
+                               : "=r"(ret)             \
+                               : "r"(a), "I"(n));      \
+                         ret;                          \
+                       })
 #  endif
 # endif
 #endif /* PEDANTIC */
 #  endif
 # endif
 #endif
+#if defined(__s390__) || defined(__s390x__)
+# define HOST_c2l(c,l) ((l)=*((const unsigned int *)(c)), (c)+=4, (l))
+# define HOST_l2c(l,c) (*((unsigned int *)(c))=(l), (c)+=4, (l))
+#endif
 
 #ifndef HOST_c2l
 #define HOST_c2l(c,l)  (l =(((unsigned long)(*((c)++)))<<24),          \
 
 #elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
 
+#ifndef PEDANTIC
+# if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
+#  if defined(__s390x__)
+#   define HOST_c2l(c,l)       ({ asm ("lrv    %0,0(%1)"               \
+                                       :"=r"(l) : "r"(c));             \
+                                  (c)+=4; (l);                         })
+#   define HOST_l2c(l,c)       ({ asm ("strv   %0,0(%1)"               \
+                                       : : "r"(l),"r"(c) : "memory");  \
+                                  (c)+=4; (l);                         })
+#  endif
+# endif
+#endif
 #if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
 # ifndef B_ENDIAN
    /* See comment in DATA_ORDER_IS_BIG_ENDIAN section. */