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"} + /* 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==INT32 /* Return from procedure, word */ + 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