commit 46c1913860bdb59d25d54f3457dd59359e106a14
parent ba78519f05016007bd4b4ebda64e385ca316bd5b
Author: Alexander Burger <abu@software-lab.de>
Date:   Thu, 11 Oct 2012 07:20:00 +0200
emu64 continued
Diffstat:
3 files changed, 132 insertions(+), 131 deletions(-)
diff --git a/src64/Makefile b/src64/Makefile
@@ -1,4 +1,4 @@
-# 07oct12abu
+# 10oct12abu
 # (c) Software Lab. Alexander Burger
 
 .SILENT:
@@ -38,16 +38,12 @@ ifeq ($(UNAME), Linux)
 		SYS = .linux
 		FMT = .s
 		ARCH = x86-64
-		MKASM-BASE =
-		MKASM-LIB = -fpic
 		AS = as
 	else
 		ifeq ($(MACHINE), ppc64)
 			SYS = .linux
 			FMT = .s
 			ARCH = ppc64
-			MKASM-BASE = -'prSym "ppc64.symtab"'
-			MKASM-LIB = -fpic -'rdSym "ppc64.symtab"'
 			AS = as -mppc64 -a64
 		endif
 	endif
@@ -60,8 +56,6 @@ else
 		SYS = .sunOs
 		FMT = .s
 		ARCH = x86-64
-		MKASM-BASE =
-		MKASM-LIB = -fpic
 		AS = gas --64
 		LD-MAIN = -m64 -lc -lm -ldl -lsocket -lnsl
 		LD-SHARED = -m64 -shared
@@ -100,13 +94,13 @@ $(lib)/ht: $(ARCH)$(SYS).ht.o
 
 # Explicit builds for cross-assembly
 $(ARCH)$(SYS).base$(FMT): sysdefs arch/$(ARCH).l $(baseFiles) sys/$(ARCH)$(SYS).code.l
-	./mkAsm $(ARCH) "$(SYS)" $(FMT) $(OS) base $(lib)/map $(baseFiles) sys/$(ARCH)$(SYS).code.l $(MKASM-BASE)
+	./mkAsm $(ARCH) "$(SYS)" $(FMT) $(OS) base $(lib)/map  $(baseFiles) sys/$(ARCH)$(SYS).code.l
 
 $(ARCH)$(SYS).ext$(FMT): sysdefs arch/$(ARCH).l ext.l $(ARCH)$(SYS).base$(FMT)
-	./mkAsm $(ARCH) "$(SYS)" $(FMT) $(OS) ext "" $(MKASM-LIB) ext.l
+	./mkAsm $(ARCH) "$(SYS)" $(FMT) $(OS) ext "" -fpic  ext.l
 
 $(ARCH)$(SYS).ht$(FMT): sysdefs arch/$(ARCH).l ht.l $(ARCH)$(SYS).base$(FMT)
-	./mkAsm $(ARCH) "$(SYS)" $(FMT) $(OS) ht "" $(MKASM-LIB) ht.l
+	./mkAsm $(ARCH) "$(SYS)" $(FMT) $(OS) ht "" -fpic  ht.l
 
 sysdefs: sysdefs.c
 	$(CC) -o sysdefs -D_FILE_OFFSET_BITS=64 sysdefs.c
diff --git a/src64/arch/emu.l b/src64/arch/emu.l
@@ -1,4 +1,4 @@
-# 09oct12abu
+# 10oct12abu
 # (c) Software Lab. Alexander Burger
 
 # *AsmOpcodes *AsmCode *AsmPos *Labels *AsmData *SysFun
@@ -982,128 +982,129 @@
    (if *LittleEndian
       (prinl "   struct {uint32_t l, h;};")
       (prinl "   struct {uint32_t h, l;};") )
+   (prinl "} op, *ptr;")
+   (prinl) )
+
+(de epilog (File)
+   (mapc prinl
+      (if *FPic
+         (quote
+            "extern uint16_t *PC;"
+            "extern uint8_t *Stack;"
+            "extern op A, C, E, X, Y, Z, L, S;"
+            "extern uint64_t Result;"
+            "extern int Carry;"
+            "extern void mul2(uint64_t);"
+            "extern void div2(uint64_t);"
+            "extern void begin(int,int,int,int,int,int,int);"
+            "extern void *argv(int,ptr);"
+            "extern void retv(int,ptr);" )
+         (quote
+            "uint16_t *PC;"
+            "uint8_t *Stack;"
+            "op A, C, E, X, Y, Z, L, S;"
+            "uint64_t Result;"
+            "int Carry;"
+            NIL
+            "static void run(int);"
+            NIL
+            "void mul2(uint64_t src) {"
+            "   uint32_t h = src >> 32;"
+            "   uint32_t l = (uint32_t)src;"
+            "   op a, b;"
+            NIL
+            "   a.n = (uint64_t)A.l * l;"
+            "   b.n = (uint64_t)A.h * l;"
+            "   C.n = (uint64_t)b.h + ((a.h += b.l) < b.l);"
+            "   b.n = (uint64_t)A.l * h;"
+            "   C.n += (uint64_t)b.h + ((a.h += b.l) < b.l);"
+            "   C.n += (uint64_t)A.h * h;"
+            "   A.n = a.n;"
+            "}"
+            NIL
+            "void div2(uint64_t src) {"
+            "   uint64_t vn0, vn1, q1, q0, rhat;"
+            "   int s;"
+            NIL
+            "   if (C.n >= src)"
+            "      A.n = C.n = MAX64;"                         # Overflow
+            "   else {"
+            "      s = 0;"
+            "      while ((int64_t)src > 0) {"                 # Normalize
+            "         C.n = (C.n << 1) + ((int64_t)A.n < 0);"  # Shift dividend left
+            "         A.n <<= 1;"
+            "         src <<= 1;"                              # and divisor
+            "         ++s;"
+            "      }"
+            "      vn1 = src >> 32;"                           # Split divisor into high
+            "      vn0 = (uint32_t)src;"                       # and low 32 bits
+            "      q1 = C.n / vn1;"                            # First quotient digit
+            "      rhat = C.n - q1 * vn1;"
+            NIL
+            "      while (q1 >> 32  ||  q1 * vn0 > (rhat << 32) + A.h) {"
+            "         --q1;"
+            "         if ((rhat += vn1) >> 32)"
+            "            break;"
+            "      }"
+            "      C.n = (C.n << 32) + A.h - q1 * src;"
+            "      q0 = C.n / vn1;"                            # Second quotient digit
+            "      rhat = C.n - q0 * vn1;"
+            NIL
+            "      while (q0 >> 32  ||  q0 * vn0 > (rhat << 32) + A.l) {"
+            "         --q0;"
+            "         if ((rhat += vn1) >> 32)"
+            "            break;"
+            "      }"
+            "      C.n = ((C.n << 32) + A.l - q0 * src) >> s;" # Remainder
+            "      A.n = (q1 << 32) + q0;"                     # Quotient
+            "   }"
+            "}"
+            NIL
+            "void begin(int i, int a, int c, int e, int x, int y, int z) {"
+               "   S.p -= 8,  *(uint16_t**)S.p = PC;"
+               "   S.p -= 8,  ((ptr)S.p)->l = Carry;"
+               "   S.p -= 8,  ((ptr)S.p)->n = Result;"
+               "   S.p -= 8,  *(ptr)S.p = Z,  Z.n = z;"
+               "   S.p -= 8,  *(ptr)S.p = Y,  Y.n = y;"
+               "   S.p -= 8,  *(ptr)S.p = X,  X.n = x;"
+               "   S.p -= 8,  *(ptr)S.p = E,  E.n = e;"
+               "   S.p -= 8,  *(ptr)S.p = C,  C.n = c;"
+               "   S.p -= 8,  *(ptr)S.p = A,  A.n = a;"
+               "   run(i);"
+               "   A = *(ptr)S.p,  S.p += 8;"
+               "   C = *(ptr)S.p,  S.p += 8;"
+               "   E = *(ptr)S.p,  S.p += 8;"
+               "   X = *(ptr)S.p,  S.p += 8;"
+               "   Y = *(ptr)S.p,  S.p += 8;"
+               "   Z = *(ptr)S.p,  S.p += 8;"
+               "   Result = ((ptr)S.p)->n,  S.p += 8;"
+               "   Carry = ((ptr)S.p)->l,  S.p += 8;"
+               "   PC = *(uint16_t**)S.p,  S.p += 8;"
+            "}"
+            NIL
+            "void *argv(int i, ptr p) {"
+            "   if (p) {"
+            "      if (i == 0)"
+            "         while (((uint8_t**)p)[i] = p[i].p)"
+            "            ++i;"
+            "      else"
+            "         while (--i >= 0)"
+            "            ((uint8_t**)p)[i] = p[i].p;"
+            "   }"
+            "   return p;"
+            "}"
+            NIL
+            "void retv(int i, ptr p) {"
+            "   if (p)"
+            "      while (--i >= 0)"
+            "         p[i].n = (uint64_t)(unsigned long)((uint8_t**)p)[i];"
+            "}"
+            NIL ) ) )
    (mapc prinl
       (quote
-         "} op, *ptr;"
-         NIL
-         ~(if *FPic
-            (quote
-               "extern uint16_t *PC;"
-               "extern uint8_t *Stack;"
-               "extern op A, C, E, X, Y, Z, L, S;"
-               "extern uint64_t Result;"
-               "extern int Carry;"
-               "extern void mul2(uint64_t);"
-               "extern void div2(uint64_t);"
-               "extern void begin(int,int,int,int,int,int,int);"
-               "extern void *argv(int,ptr);"
-               "extern void retv(int,ptr);" )
-            (quote
-               "uint16_t *PC;"
-               "uint8_t *Stack;"
-               "op A, C, E, X, Y, Z, L, S;"
-               "uint64_t Result;"
-               "int Carry;"
-               NIL
-               "static void run(int);"
-               NIL
-               "void mul2(uint64_t src) {"
-               "   uint32_t h = src >> 32;"
-               "   uint32_t l = (uint32_t)src;"
-               "   op a, b;"
-               NIL
-               "   a.n = (uint64_t)A.l * l;"
-               "   b.n = (uint64_t)A.h * l;"
-               "   C.n = (uint64_t)b.h + ((a.h += b.l) < b.l);"
-               "   b.n = (uint64_t)A.l * h;"
-               "   C.n += (uint64_t)b.h + ((a.h += b.l) < b.l);"
-               "   C.n += (uint64_t)A.h * h;"
-               "   A.n = a.n;"
-               "}"
-               NIL
-               "void div2(uint64_t src) {"
-               "   uint64_t vn0, vn1, q1, q0, rhat;"
-               "   int s;"
-               NIL
-               "   if (C.n >= src)"
-               "      A.n = C.n = MAX64;"                         # Overflow
-               "   else {"
-               "      s = 0;"
-               "      while ((int64_t)src > 0) {"                 # Normalize
-               "         C.n = (C.n << 1) + ((int64_t)A.n < 0);"  # Shift dividend left
-               "         A.n <<= 1;"
-               "         src <<= 1;"                              # and divisor
-               "         ++s;"
-               "      }"
-               "      vn1 = src >> 32;"                           # Split divisor into high
-               "      vn0 = (uint32_t)src;"                       # and low 32 bits
-               "      q1 = C.n / vn1;"                            # First quotient digit
-               "      rhat = C.n - q1 * vn1;"
-               NIL
-               "      while (q1 >> 32  ||  q1 * vn0 > (rhat << 32) + A.h) {"
-               "         --q1;"
-               "         if ((rhat += vn1) >> 32)"
-               "            break;"
-               "      }"
-               "      C.n = (C.n << 32) + A.h - q1 * src;"
-               "      q0 = C.n / vn1;"                            # Second quotient digit
-               "      rhat = C.n - q0 * vn1;"
-               NIL
-               "      while (q0 >> 32  ||  q0 * vn0 > (rhat << 32) + A.l) {"
-               "         --q0;"
-               "         if ((rhat += vn1) >> 32)"
-               "            break;"
-               "      }"
-               "      C.n = ((C.n << 32) + A.l - q0 * src) >> s;" # Remainder
-               "      A.n = (q1 << 32) + q0;"                     # Quotient
-               "   }"
-               "}"
-               NIL
-               "void begin(int i, int a, int c, int e, int x, int y, int z) {"
-                  "   S.p -= 8,  *(uint16_t**)S.p = PC;"
-                  "   S.p -= 8,  ((ptr)S.p)->l = Carry;"
-                  "   S.p -= 8,  ((ptr)S.p)->n = Result;"
-                  "   S.p -= 8,  *(ptr)S.p = Z,  Z.n = z;"
-                  "   S.p -= 8,  *(ptr)S.p = Y,  Y.n = y;"
-                  "   S.p -= 8,  *(ptr)S.p = X,  X.n = x;"
-                  "   S.p -= 8,  *(ptr)S.p = E,  E.n = e;"
-                  "   S.p -= 8,  *(ptr)S.p = C,  C.n = c;"
-                  "   S.p -= 8,  *(ptr)S.p = A,  A.n = a;"
-                  "   run(i);"
-                  "   A = *(ptr)S.p,  S.p += 8;"
-                  "   C = *(ptr)S.p,  S.p += 8;"
-                  "   E = *(ptr)S.p,  S.p += 8;"
-                  "   X = *(ptr)S.p,  S.p += 8;"
-                  "   Y = *(ptr)S.p,  S.p += 8;"
-                  "   Z = *(ptr)S.p,  S.p += 8;"
-                  "   Result = ((ptr)S.p)->n,  S.p += 8;"
-                  "   Carry = ((ptr)S.p)->l,  S.p += 8;"
-                  "   PC = *(uint16_t**)S.p,  S.p += 8;"
-               "}"
-               NIL
-               "void *argv(int i, ptr p) {"
-               "   if (p) {"
-               "      if (i == 0)"
-               "         while (((uint8_t**)p)[i] = p[i].p)"
-               "            ++i;"
-               "      else"
-               "         while (--i >= 0)"
-               "            ((uint8_t**)p)[i] = p[i].p;"
-               "   }"
-               "   return p;"
-               "}"
-               NIL
-               "void retv(int i, ptr p) {"
-               "   if (p)"
-               "      while (--i >= 0)"
-               "         p[i].n = (uint64_t)(unsigned long)((uint8_t**)p)[i];"
-               "}"
-               NIL ) )
          "uint16_t Code[];"
          NIL
-         "op Data[] = {" ) ) )
-
-(de epilog (File)
+         "op Data[] = {" ) )
    (setq
       *AsmData (flip *AsmData)
       *AsmCode (flip *AsmCode) )
diff --git a/src64/arch/ppc64.l b/src64/arch/ppc64.l
@@ -1,4 +1,4 @@
-# 04oct12abu
+# 10oct12abu
 # (c) Software Lab. Alexander Burger
 
 # Byte order
@@ -38,6 +38,10 @@
 (zero *DataPos *CodePos)
 (off *DataLabels *CodeLabels *DataIndex *CodeIndex)
 
+(redef fpic ()
+   (fpic)
+   (rdSym "ppc64.symtab") )
+
 (redef label (Lbl Flg)
    (ifn *FPic
       (cond
@@ -1566,6 +1570,8 @@
 ### Decoration ###
 (de prolog (File))
 
-(de epilog (File))
+(de epilog (File)
+   (unless *FPic
+      (prSym "ppc64.symtab") ) )
 
 # vi:et:ts=3:sw=3