From d57fcbf05c431fa767467b2a04f477309b681f9d Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 22 Feb 2013 14:23:21 -0500 Subject: [PATCH] cmd/5l, cmd/6l, cmd/8l: accept CALL reg, reg The new src argument is ignored during linking (that is, CALL r1, r2 is identical to CALL r2 for linking), but it serves as a hint to the 5g/6g/8g optimizer that the src register is live on entry to the called function and must be preserved. It is possible to avoid exposing this fact to the rest of the toolchain, keeping it entirely within 5g/6g/8g, but I think it will help to be able to look in object files and assembly listings and linker -a / -W output to see CALL instructions are "Go func value" calls and which are "C function pointer" calls. R=ken2 CC=golang-dev https://golang.org/cl/7364045 --- src/cmd/5l/optab.c | 1 + src/cmd/6l/optab.c | 3 ++- src/cmd/8l/optab.c | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cmd/5l/optab.c b/src/cmd/5l/optab.c index 1e93a3113bd..231071f2091 100644 --- a/src/cmd/5l/optab.c +++ b/src/cmd/5l/optab.c @@ -63,6 +63,7 @@ Optab optab[] = { AB, C_NONE, C_NONE, C_ROREG, 6, 4, 0, LPOOL }, { ABL, C_NONE, C_NONE, C_ROREG, 7, 8, 0 }, + { ABL, C_REG, C_NONE, C_ROREG, 7, 8, 0 }, { ABX, C_NONE, C_NONE, C_ROREG, 75, 12, 0 }, { ABXRET, C_NONE, C_NONE, C_ROREG, 76, 4, 0 }, diff --git a/src/cmd/6l/optab.c b/src/cmd/6l/optab.c index 43f34d9747c..21b4784353f 100644 --- a/src/cmd/6l/optab.c +++ b/src/cmd/6l/optab.c @@ -326,7 +326,8 @@ uchar yloop[] = }; uchar ycall[] = { - Ynone, Yml, Zo_m64, 2, + Ynone, Yml, Zo_m64, 0, + Yrx, Yrx, Zo_m64, 2, Ynone, Ybr, Zcall, 1, 0 }; diff --git a/src/cmd/8l/optab.c b/src/cmd/8l/optab.c index ae808ec7703..3ccdbfd2260 100644 --- a/src/cmd/8l/optab.c +++ b/src/cmd/8l/optab.c @@ -266,7 +266,8 @@ uchar yloop[] = }; uchar ycall[] = { - Ynone, Yml, Zo_m, 2, + Ynone, Yml, Zo_m, 0, + Yrx, Yrx, Zo_m, 2, Ynone, Ycol, Zcallind, 2, Ynone, Ybr, Zcall, 0, Ynone, Yi32, Zcallcon, 1,