mips: implement MB and WMB
[platform/upstream/openblas.git] / common_mips64.h
index 5745dec..21e706c 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
-Copyright (c) 2011, Lab of Parallel Software and Computational Science,ICSAS
+Copyright (c) 2011-2014, The OpenBLAS Project
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -13,21 +13,21 @@ met:
       notice, this list of conditions and the following disclaimer in
       the documentation and/or other materials provided with the
       distribution.
-   3. Neither the name of the ISCAS nor the names of its contributors may 
-      be used to endorse or promote products derived from this software 
-      without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
+   3. Neither the name of the OpenBLAS project nor the names of 
+      its contributors may be used to endorse or promote products 
+      derived from this software without specific prior written 
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 **********************************************************************************/
 
 /*********************************************************************/
@@ -71,8 +71,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #ifndef COMMON_MIPS64
 #define COMMON_MIPS64
 
-#define MB
-#define WMB
+#define MB  __sync_synchronize()
+#define WMB __sync_synchronize()
 
 #define INLINE inline
 
@@ -98,21 +98,35 @@ static void INLINE blas_lock(volatile unsigned long *address){
 
   } while (ret);
 }
+#define BLAS_LOCK_DEFINED
 
 static inline unsigned int rpcc(void){
   unsigned long ret;
-#if defined(LOONGSON3A)
-  unsigned long long tmp;
-  __asm__ __volatile__("dmfc0 %0, $25, 1": "=r"(tmp):: "memory");
-  ret=tmp;
-#else
-  __asm__ __volatile__(".set   push    \n"                                     
-          ".set   mips32r2\n"                                                  
-          "rdhwr %0, $30  \n"                                                  
-          ".set pop" : "=r"(ret) : : "memory");
-#endif
+
+  //  unsigned long long tmp;
+  //__asm__ __volatile__("dmfc0 %0, $25, 1": "=r"(tmp):: "memory");
+  //ret=tmp;
+  __asm__ __volatile__(".set push \n"
+                       ".set mips32r2\n"
+                       "rdhwr %0, $2\n"
+                       ".set pop": "=r"(ret):: "memory");
+
   return ret;
 }
+#define RPCC_DEFINED
+
+#ifndef NO_AFFINITY
+#define WHEREAMI
+static inline int WhereAmI(void){
+  int ret=0;
+  __asm__ __volatile__(".set push \n"
+                       ".set mips32r2\n"
+                       "rdhwr %0, $0\n"
+                       ".set pop": "=r"(ret):: "memory");
+  return ret;
+
+}
+#endif
 
 static inline int blas_quickdivide(blasint x, blasint y){
   return x / y;
@@ -152,6 +166,7 @@ static inline int blas_quickdivide(blasint x, blasint y){
 #define CMPEQ  c.eq.d
 #define CMPLE  c.le.d
 #define CMPLT  c.lt.d
+#define        NEG     neg.d
 #else
 #define LD     lwc1
 #define ST     swc1
@@ -170,6 +185,14 @@ static inline int blas_quickdivide(blasint x, blasint y){
 #define CMPEQ  c.eq.s
 #define CMPLE  c.le.s
 #define CMPLT  c.lt.s
+#define PLU     plu.ps
+#define PLL     pll.ps
+#define PUU     puu.ps
+#define PUL     pul.ps
+#define MADPS   madd.ps
+#define CVTU    cvt.s.pu
+#define CVTL    cvt.s.pl
+#define        NEG     neg.s
 #endif
 
 #if   defined(__64BIT__) &&  defined(USE64BITINT)
@@ -206,10 +229,17 @@ REALNAME: ;\
        .set    noreorder ;\
        .set    nomacro
 
+#if defined(__linux__) && defined(__ELF__)
+#define GNUSTACK .section .note.GNU-stack,"",@progbits
+#else
+#define GNUSTACK
+#endif
+
 #define EPILOGUE \
        .set    macro ;\
        .set    reorder ;\
-       .end    REALNAME
+       .end    REALNAME ;\
+       GNUSTACK
 
 #define PROFCODE
 #endif
@@ -218,7 +248,17 @@ REALNAME: ;\
 
 #define SEEK_ADDRESS
 
-#define BUFFER_SIZE     ( 8 << 20)
+#define BUFFER_SIZE     ( 32 << 20)
+
+#if defined(LOONGSON3A)
+#define PAGESIZE       (16UL << 10)
+#define FIXED_PAGESIZE (16UL << 10)
+#endif
+
+#if defined(LOONGSON3B)
+#define PAGESIZE       (16UL << 10)
+#define FIXED_PAGESIZE (16UL << 10)
+#endif
 
 #ifndef PAGESIZE
 #define PAGESIZE       (64UL << 10)
@@ -230,4 +270,12 @@ REALNAME: ;\
 #ifndef MAP_ANONYMOUS
 #define MAP_ANONYMOUS MAP_ANON
 #endif
+
+#if defined(LOONGSON3A) || defined(LOONGSON3B)
+#define PREFETCHD_(x) ld $0, x
+#define PREFETCHD(x)  PREFETCHD_(x)
+#else
+#define PREFETCHD(x)
+#endif
+
 #endif