summaryrefslogtreecommitdiff
path: root/src/liblink/asm5.c
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2014-05-07 13:17:10 -0700
committerKeith Randall <khr@golang.org>2014-05-07 13:17:10 -0700
commitc18c455ac3007cb6a843e3dfedebccd67e12d106 (patch)
treeb5d0a982ffe1b4c6300937ea08a348b97c6d6e21 /src/liblink/asm5.c
parent6a1c4c7a13467705b05c3c719753e62b73f00bb9 (diff)
downloadgo-c18c455ac3007cb6a843e3dfedebccd67e12d106.tar.gz
runtime: use duff zero and copy to initialize memory
benchmark old ns/op new ns/op delta BenchmarkCopyFat512 1307 329 -74.83% BenchmarkCopyFat256 666 169 -74.62% BenchmarkCopyFat1024 2617 671 -74.36% BenchmarkCopyFat128 343 89.0 -74.05% BenchmarkCopyFat64 182 48.9 -73.13% BenchmarkCopyFat32 103 28.8 -72.04% BenchmarkClearFat128 102 46.6 -54.31% BenchmarkClearFat512 344 167 -51.45% BenchmarkClearFat64 50.5 26.5 -47.52% BenchmarkClearFat256 147 87.2 -40.68% BenchmarkClearFat32 22.7 16.4 -27.75% BenchmarkClearFat1024 511 662 +29.55% Fixes issue 7624 LGTM=rsc R=golang-codereviews, khr, bradfitz, josharian, dave, rsc CC=golang-codereviews https://codereview.appspot.com/92760044
Diffstat (limited to 'src/liblink/asm5.c')
-rw-r--r--src/liblink/asm5.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/liblink/asm5.c b/src/liblink/asm5.c
index b62223d8e..465b645b2 100644
--- a/src/liblink/asm5.c
+++ b/src/liblink/asm5.c
@@ -356,6 +356,9 @@ static Optab optab[] =
{ APCDATA, C_LCON, C_NONE, C_LCON, 0, 0, 0 },
{ AFUNCDATA, C_LCON, C_NONE, C_ADDR, 0, 0, 0 },
+ { ADUFFZERO, C_NONE, C_NONE, C_SBRA, 5, 4, 0 }, // same as ABL
+ { ADUFFCOPY, C_NONE, C_NONE, C_SBRA, 5, 4, 0 }, // same as ABL
+
{ AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0 },
};
@@ -1138,6 +1141,8 @@ buildop(Link *ctxt)
case ABL:
case ABX:
case ABXRET:
+ case ADUFFZERO:
+ case ADUFFCOPY:
case ASWI:
case AWORD:
case AMOVM:
@@ -1301,6 +1306,7 @@ if(0 /*debug['G']*/) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->na
rel->off = ctxt->pc;
rel->siz = 4;
rel->sym = p->to.sym;
+ v += p->to.offset;
rel->add = o1 | ((v >> 2) & 0xffffff);
rel->type = R_CALLARM;
break;
@@ -2213,7 +2219,7 @@ opbra(Link *ctxt, int a, int sc)
if(sc & (C_SBIT|C_PBIT|C_WBIT))
ctxt->diag(".nil/.nil/.W on bra instruction");
sc &= C_SCOND;
- if(a == ABL)
+ if(a == ABL || a == ADUFFZERO || a == ADUFFCOPY)
return (sc<<28)|(0x5<<25)|(0x1<<24);
if(sc != 0xe)
ctxt->diag(".COND on bcond instruction");