Deji Akingunola 36809e
---
Deji Akingunola 36809e
 CONFIG/include/atlconf.h            |   18 +++++++-----
Deji Akingunola 36809e
 CONFIG/src/Makefile                 |    5 +++
Deji Akingunola 36809e
 CONFIG/src/SpewMakeInc.c            |    5 +++
Deji Akingunola 36809e
 CONFIG/src/atlcomp.txt              |   50 ++++++++++++++++++++++++++++++++++++
Deji Akingunola 36809e
 CONFIG/src/atlconf_misc.c           |    2 +
Deji Akingunola 36809e
 CONFIG/src/backend/Make.ext         |    2 +
Deji Akingunola 36809e
 CONFIG/src/backend/archinfo_linux.c |   12 ++++++++
Deji Akingunola 36809e
 CONFIG/src/backend/probe_gas_s390.S |   13 +++++++++
Deji Akingunola 36809e
 CONFIG/src/probe_comp.c             |    2 +
Deji Akingunola 36809e
 include/atlas_prefetch.h            |    6 ++++
Deji Akingunola 36809e
 10 files changed, 108 insertions(+), 7 deletions(-)
Deji Akingunola 36809e
Deji Akingunola 36809e
Index: b/CONFIG/include/atlconf.h
Deji Akingunola 36809e
===================================================================
Deji Akingunola 36809e
--- a/CONFIG/include/atlconf.h
Deji Akingunola 36809e
+++ b/CONFIG/include/atlconf.h
Deji Akingunola 36809e
@@ -14,9 +14,9 @@ enum OSTYPE {OSOther=0, OSLinux, OSSunOS
Deji Akingunola 36809e
              OSWin9x, OSWinNT, OSHPUX, OSFreeBSD, OSOSX};
Deji Akingunola 36809e
 #define OSIsWin(OS_) (((OS_) == OSWinNT) || ((OS_) == OSWin9x))
Deji Akingunola 36809e
 
Deji Akingunola 36809e
-enum ARCHFAM {AFOther=0, AFPPC, AFSPARC, AFALPHA, AFX86, AFIA64, AFMIPS};
Deji Akingunola 36809e
+enum ARCHFAM {AFOther=0, AFPPC, AFSPARC, AFALPHA, AFX86, AFIA64, AFMIPS, AFS390};
Deji Akingunola 36809e
 
Deji Akingunola 36809e
-#define NMACH 37
Deji Akingunola 36809e
+#define NMACH 42
Deji Akingunola 36809e
 static char *machnam[NMACH] =
Deji Akingunola 36809e
    {"UNKNOWN", "POWER3", "POWER4", "POWER5", "PPCG4", "PPCG5",
Deji Akingunola 36809e
     "POWER6", "POWER7",
Deji Akingunola 36809e
@@ -25,7 +25,8 @@ static char *machnam[NMACH] =
Deji Akingunola 36809e
     "Efficeon", "K7", "HAMMER", "AMD64K10h", "UNKNOWNx86",
Deji Akingunola 36809e
     "IA64Itan", "IA64Itan2",
Deji Akingunola 36809e
     "USI", "USII", "USIII", "USIV", "UST2", "UnknownUS",
Deji Akingunola 36809e
-    "MIPSR1xK", "MIPSICE9"};
Deji Akingunola 36809e
+    "MIPSR1xK", "MIPSICE9",
Deji Akingunola 36809e
+    "IBMz900", "IBMz990", "IBMz9", "IBMz10", "IBMz196" };
Deji Akingunola 36809e
 enum MACHTYPE {MACHOther, IbmPwr3, IbmPwr4, IbmPwr5, PPCG4, PPCG5,
Deji Akingunola 36809e
                IbmPwr6, IbmPwr7,
Deji Akingunola 36809e
                IntP5, IntP5MMX, IntPPRO, IntPII, IntPIII, IntPM, IntCoreS,
Deji Akingunola 36809e
@@ -34,7 +35,8 @@ enum MACHTYPE {MACHOther, IbmPwr3, IbmPw
Deji Akingunola 36809e
                IA64Itan, IA64Itan2,
Deji Akingunola 36809e
                SunUSI, SunUSII, SunUSIII, SunUSIV, SunUST2, SunUSX,
Deji Akingunola 36809e
                MIPSR1xK, /* includes R10K, R12K, R14K, R16K */
Deji Akingunola 36809e
-               MIPSICE9   /* SiCortex ICE9 -- like MIPS5K */
Deji Akingunola 36809e
+               MIPSICE9,   /* SiCortex ICE9 -- like MIPS5K */
Deji Akingunola 36809e
+               IBMz900, IBMz990, IBMz9, IBMz10, IBMz196 /* s390(x) in Linux */
Deji Akingunola 36809e
                };
Deji Akingunola 36809e
 #define MachIsX86(mach_) \
Deji Akingunola 36809e
    ( (mach_) >= IntP5 && (mach_) <= x86X )
Deji Akingunola 36809e
@@ -51,6 +53,8 @@ enum MACHTYPE {MACHOther, IbmPwr3, IbmPw
Deji Akingunola 36809e
 #endif
Deji Akingunola 36809e
 #define MachIsPPC(mach_) \
Deji Akingunola 36809e
    ( (mach_) >= PPCG4 && (mach_) <= PPCG5 )
Deji Akingunola 36809e
+#define MachIsS390(mach_) \
Deji Akingunola 36809e
+   ( (mach_) >= IBMz900 && (mach_) <= IBMz196 )
Deji Akingunola 36809e
 
Deji Akingunola 36809e
 static char *f2c_namestr[5] = {"UNKNOWN","Add_", "Add__", "NoChange", "UpCase"};
Deji Akingunola 36809e
 static char *f2c_intstr[5] =
Deji Akingunola 36809e
@@ -68,13 +72,13 @@ static char *ISAXNAM[NISA] =
Deji Akingunola 36809e
    {"", "AltiVec", "SSE3", "SSE2", "SSE1", "3DNow"};
Deji Akingunola 36809e
 enum ISAEXT {ISA_None=0, ISA_AV, ISA_SSE3, ISA_SSE2, ISA_SSE1, ISA_3DNow};
Deji Akingunola 36809e
 
Deji Akingunola 36809e
-#define NASMD 7
Deji Akingunola 36809e
+#define NASMD 8
Deji Akingunola 36809e
 enum ASMDIA
Deji Akingunola 36809e
    {ASM_None=0, gas_x86_32, gas_x86_64, gas_sparc, gas_ppc, gas_parisc,
Deji Akingunola 36809e
-    gas_mips};
Deji Akingunola 36809e
+    gas_mips, gas_s390};
Deji Akingunola 36809e
 static char *ASMNAM[NASMD] =
Deji Akingunola 36809e
    {"",     "GAS_x8632", "GAS_x8664", "GAS_SPARC", "GAS_PPC", "GAS_PARISC",
Deji Akingunola 36809e
-    "GAS_MIPS"};
Deji Akingunola 36809e
+    "GAS_MIPS", "GAS_S390"};
Deji Akingunola 36809e
 
Deji Akingunola 36809e
 
Deji Akingunola 36809e
 /*
Deji Akingunola 36809e
Index: b/CONFIG/src/Makefile
Deji Akingunola 36809e
===================================================================
Deji Akingunola 36809e
--- a/CONFIG/src/Makefile
Deji Akingunola 36809e
+++ b/CONFIG/src/Makefile
Deji Akingunola 36809e
@@ -177,6 +177,11 @@ IRun_GAS_x8632 :
Deji Akingunola 36809e
 	$(MAKE) $(atlrun) atldir=$(mydir) exe=xprobe_gas_x8632 args="$(args)" \
Deji Akingunola 36809e
                 redir=config0.out
Deji Akingunola 36809e
 	- cat config0.out
Deji Akingunola 36809e
+IRun_GAS_S390 :
Deji Akingunola 36809e
+	$(CC) $(CCFLAGS) -o xprobe_gas_s390 $(SRCdir)/backend/probe_this_asm.c $(SRCdir)/backend/probe_gas_s390.S
Deji Akingunola 36809e
+	$(MAKE) $(atlrun) atldir=$(mydir) exe=xprobe_gas_s390 args="$(args)" \
Deji Akingunola 36809e
+                redir=config0.out
Deji Akingunola 36809e
+	- cat config0.out
Deji Akingunola 36809e
 
Deji Akingunola 36809e
 IRunC2C :
Deji Akingunola 36809e
 	- rm -f config0.out xc2c c2cslave.o
Deji Akingunola 36809e
Index: b/CONFIG/src/SpewMakeInc.c
Deji Akingunola 36809e
===================================================================
Deji Akingunola 36809e
--- a/CONFIG/src/SpewMakeInc.c
Deji Akingunola 36809e
+++ b/CONFIG/src/SpewMakeInc.c
Deji Akingunola 36809e
@@ -342,6 +342,9 @@ char *GetPtrbitsFlag(enum OSTYPE OS, enu
Deji Akingunola 36809e
       return(sp);
Deji Akingunola 36809e
    if (MachIsMIPS(arch))
Deji Akingunola 36809e
       return((ptrbits == 64) ? "-mabi=64" : "-mabi=n32");
Deji Akingunola 36809e
+   if (MachIsS390(arch))
Deji Akingunola 36809e
+      return((ptrbits == 64) ? "-m64" : "-m31");
Deji Akingunola 36809e
+
Deji Akingunola 36809e
    if (!CompIsGcc(comp))
Deji Akingunola 36809e
    {
Deji Akingunola 36809e
 /*
Deji Akingunola 36809e
@@ -671,6 +674,8 @@ main(int nargs, char **args)
Deji Akingunola 36809e
       if (OS == OSFreeBSD)
Deji Akingunola 36809e
          fprintf(fpout, "_fbsd");
Deji Akingunola 36809e
    }
Deji Akingunola 36809e
+   if (MachIsS390(mach))
Deji Akingunola 36809e
+      fprintf(fpout, ptrbits == 32 ? "-m31" : "-m64");
Deji Akingunola 36809e
    fprintf(fpout, "\n   F77SYSLIB = %s\n", f77lib ? f77lib : "");
Deji Akingunola 36809e
    fprintf(fpout, "   BC = $(ICC)\n");
Deji Akingunola 36809e
    fprintf(fpout, "   NCFLAGS = $(ICCFLAGS)\n");
Deji Akingunola 36809e
Index: b/CONFIG/src/atlcomp.txt
Deji Akingunola 36809e
===================================================================
Deji Akingunola 36809e
--- a/CONFIG/src/atlcomp.txt
Deji Akingunola 36809e
+++ b/CONFIG/src/atlcomp.txt
Deji Akingunola 36809e
@@ -164,6 +164,56 @@ MACH=ALL OS=WinNT LVL=0 COMPS=f77
Deji Akingunola 36809e
 MACH=P4,PM OS=WinNT LVL=0 COMPS=icc,dmc,smc,dkc,skc,xcc
Deji Akingunola 36809e
    'icl' '-QxN -O3 -Qprec -fp:extended -fp:except -nologo -Oy'
Deji Akingunola 36809e
 #
Deji Akingunola 36809e
+# IBM System z or zEnterprise
Deji Akingunola 36809e
+#
Deji Akingunola 36809e
+
Deji Akingunola 36809e
+# z900 or z800
Deji Akingunola 36809e
+MACH=IBMz900 OS=ALL LVL=1000 COMPS=f77
Deji Akingunola 36809e
+   'gfortran' '-march=z900 -O3 -funroll-loops'
Deji Akingunola 36809e
+MACH=IBMz900 OS=ALL LVL=1000 COMPS=smc,dmc,skc,dkc,icc,xcc
Deji Akingunola 36809e
+   'gcc' '-march=z900 -O3 -funroll-loops'
Deji Akingunola 36809e
+
Deji Akingunola 36809e
+# z990 or z890
Deji Akingunola 36809e
+MACH=IBMz990 OS=ALL LVL=1000 COMPS=f77
Deji Akingunola 36809e
+   'gfortran' '-march=z990 -O3 -funroll-loops'
Deji Akingunola 36809e
+MACH=IBMz990 OS=ALL LVL=1000 COMPS=smc,dmc,skc,dkc,icc,xcc
Deji Akingunola 36809e
+   'gcc' '-march=z990 -O3 -funroll-loops'
Deji Akingunola 36809e
+
Deji Akingunola 36809e
+# z9-EC z9-BC or z9-109
Deji Akingunola 36809e
+MACH=IBMz9 OS=ALL LVL=1000 COMPS=f77
Deji Akingunola 36809e
+   'gfortran' '-march=z9-109 -O3 -funroll-loops'
Deji Akingunola 36809e
+MACH=IBMz9 OS=ALL LVL=1000 COMPS=smc,dmc,skc,dkc,icc,xcc
Deji Akingunola 36809e
+   'gcc' '-march=z9-109 -O3 -funroll-loops'
Deji Akingunola 36809e
+
Deji Akingunola 36809e
+# on z10 and z196 gcc emits prefetches which disturb cache size
Deji Akingunola 36809e
+# detection and optimization. Therefore, we use fno-prefetch-loop-arrays
Deji Akingunola 36809e
+# z10
Deji Akingunola 36809e
+MACH=IBMz10 OS=ALL LVL=1000 COMPS=f77
Deji Akingunola 36809e
+   'gfortran' '-march=z10 -O3 -funroll-loops -fno-prefetch-loop-arrays'
Deji Akingunola 36809e
+MACH=IBMz10 OS=ALL LVL=1000 COMPS=smc,dmc,skc,dkc,icc,xcc
Deji Akingunola 36809e
+   'gcc' '-march=z10 -O3 -funroll-loops -fno-prefetch-loop-arrays'
Deji Akingunola 36809e
+
Deji Akingunola 36809e
+# z196. we also try to fallback to z10 and z9 for older compilers
Deji Akingunola 36809e
+MACH=IBMz196 OS=ALL LVL=1000 COMPS=f77
Deji Akingunola 36809e
+   'gfortran' '-march=z196 -O3 -funroll-loops -fno-prefetch-loop-arrays'
Deji Akingunola 36809e
+MACH=IBMz196 OS=ALL LVL=800 COMPS=f77
Deji Akingunola 36809e
+   'gfortran' '-march=z10 -O3 -funroll-loops -fno-prefetch-loop-arrays'
Deji Akingunola 36809e
+MACH=IBMz196 OS=ALL LVL=600 COMPS=f77
Deji Akingunola 36809e
+   'gfortran' '-march=z9-109 -O3 -funroll-loops'
Deji Akingunola 36809e
+MACH=IBMz196 OS=ALL LVL=1000 COMPS=smc,dmc,skc,dkc,icc,xcc
Deji Akingunola 36809e
+   'gcc' '-march=z196 -O3 -funroll-loops -fno-prefetch-loop-arrays'
Deji Akingunola 36809e
+MACH=IBMz196 OS=ALL LVL=800 COMPS=smc,dmc,skc,dkc,icc,xcc
Deji Akingunola 36809e
+   'gcc' '-march=z10 -O3 -funroll-loops -fno-prefetch-loop-arrays'
Deji Akingunola 36809e
+MACH=IBMz196 OS=ALL LVL=600 COMPS=smc,dmc,skc,dkc,icc,xcc
Deji Akingunola 36809e
+   'gcc' '-march=z9-109 -O3 -funroll-loops'
Deji Akingunola 36809e
+
Deji Akingunola 36809e
+# ALL march options failed, go back to conservative defaults
Deji Akingunola 36809e
+MACH=IBMz900,IBMz990,IBMz9,IBMz10,IBMz196 OS=ALL LVL=500 COMPS=f77
Deji Akingunola 36809e
+   'gfortran' '-O3 -funroll-loops'
Deji Akingunola 36809e
+MACH=IBMz900,IBMz990,IBMz9,IBMz10,IBMz196 OS=ALL LVL=500 COMPS=smc,dmc,skc,dkc,icc,xcc
Deji Akingunola 36809e
+   'gcc' '-O3 -funroll-loops'
Deji Akingunola 36809e
+
Deji Akingunola 36809e
+#
Deji Akingunola 36809e
 # Generic defaults
Deji Akingunola 36809e
 #
Deji Akingunola 36809e
 MACH=ALL OS=ALL LVL=5 COMPS=icc,smc,dmc,skc,dkc,xcc
Deji Akingunola 36809e
Index: b/CONFIG/src/atlconf_misc.c
Deji Akingunola 36809e
===================================================================
Deji Akingunola 36809e
--- a/CONFIG/src/atlconf_misc.c
Deji Akingunola 36809e
+++ b/CONFIG/src/atlconf_misc.c
Deji Akingunola 36809e
@@ -480,6 +480,7 @@ enum ARCHFAM ProbeArchFam(char *targ)
Deji Akingunola 36809e
       else if (strstr(res, "alpha")) fam = AFALPHA;
Deji Akingunola 36809e
       else if (strstr(res, "ia64")) fam = AFIA64;
Deji Akingunola 36809e
       else if (strstr(res, "mips")) fam = AFMIPS;
Deji Akingunola 36809e
+      else if (strstr(res, "s390")) fam = AFS390;
Deji Akingunola 36809e
       else if ( strstr(res, "i686") || strstr(res, "i586") ||
Deji Akingunola 36809e
                 strstr(res, "i486") || strstr(res, "i386") ||
Deji Akingunola 36809e
                 strstr(res, "x86") || strstr(res, "x86_64") ) fam = AFX86;
Deji Akingunola 36809e
@@ -501,6 +502,7 @@ enum ARCHFAM ProbeArchFam(char *targ)
Deji Akingunola 36809e
                    strstr(res, "i486") || strstr(res, "i386") ||
Deji Akingunola 36809e
                    strstr(res, "x86_64") ) fam = AFX86;
Deji Akingunola 36809e
          else if (strstr(res, "mips")) fam = AFMIPS;
Deji Akingunola 36809e
+         else if (strstr(res, "s390")) fam = AFS390;
Deji Akingunola 36809e
       }
Deji Akingunola 36809e
    }
Deji Akingunola 36809e
    return(fam);
Deji Akingunola 36809e
Index: b/CONFIG/src/backend/Make.ext
Deji Akingunola 36809e
===================================================================
Deji Akingunola 36809e
--- a/CONFIG/src/backend/Make.ext
Deji Akingunola 36809e
+++ b/CONFIG/src/backend/Make.ext
Deji Akingunola 36809e
@@ -43,6 +43,8 @@ probe_gas_parisc.S : $(basf)
Deji Akingunola 36809e
 	$(extC) -b $(basf) -o probe_gas_parisc.S rout=probe_gas_parisc.S
Deji Akingunola 36809e
 probe_gas_mips.S : $(basf)
Deji Akingunola 36809e
 	$(extC) -b $(basf) -o probe_gas_mips.S rout=probe_gas_mips.S
Deji Akingunola 36809e
+probe_gas_s390.S : $(basf)
Deji Akingunola 36809e
+	$(extC) -b $(basf) -o probe_gas_s390.S rout=probe_gas_s390.S
Deji Akingunola 36809e
 probe_SSE3.S : $(basf)
Deji Akingunola 36809e
 	$(extC) -b $(basf) -o probe_SSE3.S rout=probe_SSE3.S
Deji Akingunola 36809e
 probe_SSE2.S : $(basf)
Deji Akingunola 36809e
Index: b/CONFIG/src/backend/archinfo_linux.c
Deji Akingunola 36809e
===================================================================
Deji Akingunola 36809e
--- a/CONFIG/src/backend/archinfo_linux.c
Deji Akingunola 36809e
+++ b/CONFIG/src/backend/archinfo_linux.c
Deji Akingunola 36809e
@@ -193,6 +193,18 @@ enum MACHTYPE ProbeArch()
Deji Akingunola 36809e
       }
Deji Akingunola 36809e
       #endif
Deji Akingunola 36809e
       break;
Deji Akingunola 36809e
+   case AFS390:
Deji Akingunola 36809e
+      if ( !CmndOneLine(NULL, "cat /proc/cpuinfo | fgrep \"processor \"", res) )
Deji Akingunola 36809e
+      {
Deji Akingunola 36809e
+         if (strstr(res, "2064") || strstr(res, "2066")) mach = IBMz900;
Deji Akingunola 36809e
+         else if (strstr(res, "2084") || strstr(res, "2086")) mach = IBMz990;
Deji Akingunola 36809e
+         else if (strstr(res, "2094") || strstr(res, "2096")) mach = IBMz9;
Deji Akingunola 36809e
+         else if (strstr(res, "2097") || strstr(res, "2098")) mach = IBMz10;
Deji Akingunola 36809e
+         /* we consider anything else to be a z196 or later */
Deji Akingunola 36809e
+         else mach = IBMz196;
Deji Akingunola 36809e
+      }
Deji Akingunola 36809e
+      break;
Deji Akingunola 36809e
+
Deji Akingunola 36809e
    default:
Deji Akingunola 36809e
 #if 0
Deji Akingunola 36809e
       if (!CmndOneLine(NULL, "fgrep 'cpu family' /proc/cpuinfo", res))
Deji Akingunola 36809e
Index: b/CONFIG/src/backend/probe_gas_s390.S
Deji Akingunola 36809e
===================================================================
Deji Akingunola 36809e
--- /dev/null
Deji Akingunola 36809e
+++ b/CONFIG/src/backend/probe_gas_s390.S
Deji Akingunola 36809e
@@ -0,0 +1,13 @@
Deji Akingunola 36809e
+#define ATL_GAS_PPC
Deji Akingunola 36809e
+#include "atlas_asm.h"
Deji Akingunola 36809e
+/*
Deji Akingunola 36809e
+ * Linux S390 assembler for:
Deji Akingunola 36809e
+ * int asm_probe(int i)
Deji Akingunola 36809e
+ * RETURNS: i*3
Deji Akingunola 36809e
+ */
Deji Akingunola 36809e
+.globl ATL_asmdecor(asm_probe)
Deji Akingunola 36809e
+ATL_asmdecor(asm_probe):
Deji Akingunola 36809e
+	lr	r3,r2
Deji Akingunola 36809e
+	ar	r2,r3
Deji Akingunola 36809e
+	ar	r2,r3
Deji Akingunola 36809e
+	br	r14
Deji Akingunola 36809e
Index: b/CONFIG/src/probe_comp.c
Deji Akingunola 36809e
===================================================================
Deji Akingunola 36809e
--- a/CONFIG/src/probe_comp.c
Deji Akingunola 36809e
+++ b/CONFIG/src/probe_comp.c
Deji Akingunola 36809e
@@ -509,6 +509,8 @@ char *GetPtrbitsFlag(enum OSTYPE OS, enu
Deji Akingunola 36809e
       return(sp);
Deji Akingunola 36809e
    if (MachIsMIPS(arch))
Deji Akingunola 36809e
       return((ptrbits == 64) ? "-mabi=64" : "-mabi=n32");
Deji Akingunola 36809e
+   if (MachIsS390(arch))
Deji Akingunola 36809e
+      return((ptrbits == 64) ? "-m64" : "-m31");
Deji Akingunola 36809e
    if (!CompIsGcc(comp))
Deji Akingunola 36809e
    {
Deji Akingunola 36809e
 /*
Deji Akingunola 36809e
Index: b/include/atlas_prefetch.h
Deji Akingunola 36809e
===================================================================
Deji Akingunola 36809e
--- a/include/atlas_prefetch.h
Deji Akingunola 36809e
+++ b/include/atlas_prefetch.h
Deji Akingunola 36809e
@@ -149,6 +149,12 @@
Deji Akingunola 36809e
    #define ATL_GOT_L1PREFETCH
Deji Akingunola 36809e
    #define ATL_L1LS 32
Deji Akingunola 36809e
    #define ATL_L2LS 64
Deji Akingunola 36809e
+#elif defined(ATL_ARCH_IBMz196) || defined(ATL_ARCH_IBMz10)
Deji Akingunola 36809e
+   #define ATL_pfl1R(mem) __builtin_prefetch(mem, 0, 3)
Deji Akingunola 36809e
+   #define ATL_pfl1W(mem) __builtin_prefetch(mem, 1, 3)
Deji Akingunola 36809e
+   #define ATL_GOT_L1PREFETCH
Deji Akingunola 36809e
+   #define ATL_L1LS 256
Deji Akingunola 36809e
+   #define ATL_L2LS 256
Deji Akingunola 36809e
 #elif defined(__GNUC__)  /* last ditch, use gcc predefined func */
Deji Akingunola 36809e
    #define ATL_pfl1R(mem) __builtin_prefetch(mem, 0, 3)
Deji Akingunola 36809e
    #define ATL_pfl1W(mem) __builtin_prefetch(mem, 1, 3)