build: LLVM: Add Flang compiler support and enable OpenMP for Clang
[platform/upstream/openblas.git] / common_x86.h
index 9506716..4363fb2 100644 (file)
 
 #ifndef ASSEMBLER
 
+#ifdef C_MSVC
+#include <intrin.h>
+#endif
+
 #define MB
 #define WMB
 
@@ -56,42 +60,67 @@ static void __inline blas_lock(volatile BLASULONG *address){
   do {
     while (*address) {YIELDING;};
 
+#if defined(_MSC_VER) && !defined(__clang__)
+       // use intrinsic instead of inline assembly
+       ret = _InterlockedExchange((volatile LONG *)address, 1);
+       // inline assembly
+       /*__asm {
+               mov eax, address
+               mov ebx, 1
+               xchg [eax], ebx
+               mov ret, ebx
+       }*/
+#else
     __asm__ __volatile__(
                         "xchgl %0, %1\n"
                         : "=r"(ret), "=m"(*address)
                         : "0"(1), "m"(*address)
                         : "memory");
+#endif
 
   } while (ret);
 
 }
+#define BLAS_LOCK_DEFINED
 
 static __inline unsigned long long rpcc(void){
+#if defined(_MSC_VER) && !defined(__clang__)
+  return __rdtsc(); // use MSVC intrinsic
+#else
   unsigned int a, d;
 
   __asm__ __volatile__ ("rdtsc" : "=a" (a), "=d" (d));
 
   return ((unsigned long long)a + ((unsigned long long)d << 32));
+#endif
 };
 #define RPCC_DEFINED
 
 static __inline unsigned long getstackaddr(void){
+#if defined(_MSC_VER) && !defined(__clang__)
+  return (unsigned long)_ReturnAddress(); // use MSVC intrinsic
+#else
   unsigned long addr;
 
   __asm__ __volatile__ ("mov %%esp, %0"
                         : "=r"(addr) : : "memory");
 
   return addr;
+#endif
 };
 
 
 static __inline long double sqrt_long(long double val) {
+#if defined(_MSC_VER) && !defined(__clang__)
+  return sqrt(val); // not sure if this will use fsqrt
+#else
   long double result;
 
   __asm__ __volatile__ ("fldt %1\n"
                    "fsqrt\n"
                    "fstpt %0\n" : "=m" (result) : "m"(val));
   return result;
+#endif
 }
 
 #define SQRT(a)  sqrt_long(a)
@@ -101,7 +130,7 @@ void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx);
 
 #define WHEREAMI
 
-static inline int WhereAmI(void){
+static __inline int WhereAmI(void){
   int eax, ebx, ecx, edx;
   int apicid;
 
@@ -145,11 +174,17 @@ static __inline int blas_quickdivide(unsigned int x, unsigned int y){
 
   if (y <= 1) return x;
 
+#if defined(_MSC_VER) && !defined(__clang__)
+  result = x/y;
+  return result;
+#else
+
   y = blas_quick_divide_table[y];
 
   __asm__ __volatile__  ("mull %0" :"=d" (result) :"a"(x), "0" (y));
 
   return result;
+#endif
 }
 #endif
 
@@ -285,8 +320,12 @@ REALNAME:
 
 #define PROFCODE
 
+#ifdef __clang__
+#define EPILOGUE .end
+#else
 #define EPILOGUE .end   REALNAME
 #endif
+#endif
 
 #if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_NETBSD) || defined(__ELF__)
 #define PROLOGUE \