diff options
author | Keith Randall <khr@golang.org> | 2014-05-07 13:17:10 -0700 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2014-05-07 13:17:10 -0700 |
commit | c18c455ac3007cb6a843e3dfedebccd67e12d106 (patch) | |
tree | b5d0a982ffe1b4c6300937ea08a348b97c6d6e21 /src/liblink/asm5.c | |
parent | 6a1c4c7a13467705b05c3c719753e62b73f00bb9 (diff) | |
download | go-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.c | 8 |
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"); |