From: George Koehler Date: Fri, 17 Feb 2017 02:18:39 +0000 (-0500) Subject: Remove .ret from libem and inline the code. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=736c45453c173f48229293f8a431628864019b0c;p=ack.git Remove .ret from libem and inline the code. 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. --- diff --git a/mach/powerpc/libem/build.lua b/mach/powerpc/libem/build.lua index 3d1a1062e..16a03147e 100644 --- a/mach/powerpc/libem/build.lua +++ b/mach/powerpc/libem/build.lua @@ -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 index c498af240..000000000 --- a/mach/powerpc/libem/ret.s +++ /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 diff --git a/mach/powerpc/ncg/table b/mach/powerpc/ncg/table index 264767e8b..abfb3d550 100644 --- a/mach/powerpc/ncg/table +++ b/mach/powerpc/ncg/table @@ -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