Remove .ret from libem and inline the code.
authorGeorge Koehler <xkernigh@netscape.net>
Fri, 17 Feb 2017 02:18:39 +0000 (21:18 -0500)
committerGeorge Koehler <xkernigh@netscape.net>
Fri, 17 Feb 2017 02:18:39 +0000 (21:18 -0500)
This removes a wrong-way dependency of libsys on libem.  The C
functions in libsys called .ret, but libsys is after libem in the
linker arguments, so the linker didn't find .ret unless something else
had called .ret.  Almost everything called .ret, but I got a linker
error when I wrote an assembly program using the EM runtime, because
my assembly program didn't call .ret.

Add a dummy comment to build.lua, so git checkout touches that file,
the build system reconfigures itself, and the *.s glob sees that ret.s
has gone.

mach/powerpc/libem/build.lua
mach/powerpc/libem/ret.s [deleted file]
mach/powerpc/ncg/table

index 3d1a106..16a0314 100644 (file)
@@ -6,7 +6,7 @@ for _, plat in ipairs(vars.plats) do
        acklibrary {
                name = "lib_"..plat,
                srcs = {
-                       "./*.s", -- los4.s, sts4.s
+                       "./*.s", -- rm ret.s
                },
                vars = { plat = plat },
                deps = {
diff --git a/mach/powerpc/libem/ret.s b/mach/powerpc/libem/ret.s
deleted file mode 100644 (file)
index c498af2..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-.sect .text
-
-! Standard boilerplate for returning from functions.
-
-.define .ret
-.ret:
-       lwz r0, 4(fp)
-       mtspr lr, r0
-       lwz r0, 0(fp)   ! our stack frame becomes invalid as soon as...
-       addi sp, fp, 8  ! ...we change sp
-       mr fp, r0
-       blr
index 264767e..abfb3d5 100644 (file)
@@ -228,6 +228,7 @@ INSTRUCTIONS
   bcctrl          CONST:ro, CONST:ro, CONST:ro.
     bctrl.
   bclr            CONST:ro, CONST:ro, CONST:ro.
+    blr.
   bl              LABEL:ro.
   cmp             CR:ro, CONST:ro, GPR:ro, GPR:ro kills :cc.
     cmpw          GPR:ro, GPR:ro kills :cc.
@@ -1839,23 +1840,29 @@ PATTERNS
 
        pat ret $1==0                      /* Return from procedure */
                gen
+                       /* Restore saved registers. */
                        return
-                       b {LABEL, ".ret"}
-
-       pat ret $1==INT32                  /* Return from procedure, word */
+                       /* Epilog: restore lr and fp. */
+                       lwz r0, {IND_RC_W, fp, 4}
+                       mtspr lr, r0
+                       lwz r0, {IND_RC_W, fp, 0}
+                       /* Free our stack frame. */
+                       addi sp, fp, {CONST, 8}
+                       mr fp, r0
+                       blr.
+
+       pat ret $1==4                      /* Return from procedure, word */
                with REG
-               gen
-                       move %1, r3
-                       return
-                       b {LABEL, ".ret"}
+                       gen move %1, r3
+                       leaving ret 0
 
-       pat ret $1==INT64                  /* Return from procedure, double-word */
+       pat ret $1==8                      /* Return from proc, double-word */
                with REG REG
-               gen
-                       move %1, r3
-                       move %2, r4
-                       return
-                       b {LABEL, ".ret"}
+                       gen
+                               move %1, r3
+                               move %2, r4
+                       leaving
+                               ret 0
 
        pat blm                            /* Block move constant length */
                leaving