From: Rémy Oudompheng Date: Tue, 4 Jun 2013 06:33:00 +0000 (+0200) Subject: cmd/6c, cmd/8c: avoid generating long multiplication when not necessary. X-Git-Tag: go1.2rc2~1334 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=2c0b00744f067c7d9f44a735f77aa0eb0e2e345e;p=gostls13.git cmd/6c, cmd/8c: avoid generating long multiplication when not necessary. On amd64 benchmark old ns/op new ns/op delta BenchmarkHashStringSpeed 91 74 -18.49% BenchmarkHashInt32Speed 54 45 -17.88% BenchmarkHashInt64Speed 76 58 -23.53% BenchmarkHashStringArraySpeed 231 188 -18.61% Fixes #5367. R=golang-dev, iant, dave, daniel.morsing, ality, rsc CC=golang-dev https://golang.org/cl/9040043 --- diff --git a/src/cmd/6c/cgen.c b/src/cmd/6c/cgen.c index 95400c4453..7afacb2177 100644 --- a/src/cmd/6c/cgen.c +++ b/src/cmd/6c/cgen.c @@ -392,13 +392,13 @@ cgen(Node *n, Node *nn) } } - if(o == OMUL) { + if(o == OMUL || o == OLMUL) { if(l->addable >= INDEXED) { t = l; l = r; r = t; } - /* should favour AX */ + reg[D_DX]++; // for gopcode case OMUL regalloc(&nod, l, nn); cgen(l, &nod); if(r->addable < INDEXED || hardconst(r)) { @@ -410,6 +410,7 @@ cgen(Node *n, Node *nn) gopcode(OMUL, n->type, r, &nod); /* addressible */ gmove(&nod, nn); regfree(&nod); + reg[D_DX]--; break; } diff --git a/src/cmd/8c/cgen.c b/src/cmd/8c/cgen.c index 78eb7ecedb..4d4ae13abe 100644 --- a/src/cmd/8c/cgen.c +++ b/src/cmd/8c/cgen.c @@ -404,13 +404,13 @@ cgen(Node *n, Node *nn) } } - if(o == OMUL) { + if(o == OMUL || o == OLMUL) { if(l->addable >= INDEXED) { t = l; l = r; r = t; } - /* should favour AX */ + reg[D_DX]++; // for gopcode case OMUL regalloc(&nod, l, nn); cgen(l, &nod); if(r->addable < INDEXED) { @@ -422,6 +422,7 @@ cgen(Node *n, Node *nn) gopcode(OMUL, n->type, r, &nod); /* addressible */ gmove(&nod, nn); regfree(&nod); + reg[D_DX]--; break; }