summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShenghou Ma <minux@golang.org>2014-08-12 23:57:02 -0400
committerShenghou Ma <minux@golang.org>2014-08-12 23:57:02 -0400
commit8f91b2a823ea44649049bff69cc38e09cf5c8fba (patch)
tree053ce3a703b6440af53f01d63dab868b2971726c
parent3aab706372cb36f844645c6401a111d3ffe63b9b (diff)
downloadgo-8f91b2a823ea44649049bff69cc38e09cf5c8fba.tar.gz
[dev.power64] cmd/9g: introduce ginscon2 for CMP/CMPU, use ginscon to ADD constants
LGTM=rsc R=rsc, iant CC=golang-codereviews https://codereview.appspot.com/125170043
-rw-r--r--src/cmd/9g/cgen.c6
-rw-r--r--src/cmd/9g/gg.h1
-rw-r--r--src/cmd/9g/gsubr.c34
3 files changed, 37 insertions, 4 deletions
diff --git a/src/cmd/9g/cgen.c b/src/cmd/9g/cgen.c
index 3644ebf8f..f8078aece 100644
--- a/src/cmd/9g/cgen.c
+++ b/src/cmd/9g/cgen.c
@@ -690,8 +690,7 @@ agenr(Node *n, Node *a, Node *res)
n1.xoffset = Array_nel;
regalloc(&n4, n1.type, N);
gmove(&n1, &n4);
- nodconst(&n2, types[TUINT64], v);
- gins(optoas(OCMP, types[TUINT64]), &n4, &n2);
+ ginscon2(optoas(OCMP, types[TUINT64]), &n4, v);
regfree(&n4);
p1 = gbranch(optoas(OGT, types[TUINT64]), T, +1);
ginscall(panicindex, 0);
@@ -706,8 +705,7 @@ agenr(Node *n, Node *a, Node *res)
}
if (v*w != 0) {
- nodconst(&n2, types[tptr], v*w);
- gins(optoas(OADD, types[tptr]), &n2, &n3);
+ ginscon(optoas(OADD, types[tptr]), v*w, &n3);
}
*a = n3;
break;
diff --git a/src/cmd/9g/gg.h b/src/cmd/9g/gg.h
index 2b95dc7a6..319702200 100644
--- a/src/cmd/9g/gg.h
+++ b/src/cmd/9g/gg.h
@@ -87,6 +87,7 @@ Node* nodarg(Type*, int);
void nodreg(Node*, Type*, int);
void nodindreg(Node*, Type*, int);
void ginscon(int, vlong, Node*);
+void ginscon2(int, Node*, vlong);
void buildtxt(void);
Plist* newplist(void);
int isfat(Type*);
diff --git a/src/cmd/9g/gsubr.c b/src/cmd/9g/gsubr.c
index 0e5df5c6d..a5ce5f141 100644
--- a/src/cmd/9g/gsubr.c
+++ b/src/cmd/9g/gsubr.c
@@ -562,6 +562,40 @@ ginscon(int as, vlong c, Node *n2)
gins(as, &n1, n2);
}
+/*
+ * generate
+ * as n, $c (CMP/CMPU)
+ */
+void
+ginscon2(int as, Node *n2, vlong c)
+{
+ Node n1, ntmp;
+
+ nodconst(&n1, types[TINT64], c);
+
+ switch(as) {
+ default:
+ fatal("ginscon2");
+ case ACMP:
+ if(-BIG <= c && c <= BIG) {
+ gins(as, n2, &n1);
+ return;
+ }
+ break;
+ case ACMPU:
+ if(0 <= c && c <= 2*BIG) {
+ gins(as, n2, &n1);
+ return;
+ }
+ break;
+ }
+ // MOV n1 into register first
+ regalloc(&ntmp, types[TINT64], N);
+ gins(AMOVD, &n1, &ntmp);
+ gins(as, n2, &ntmp);
+ regfree(&ntmp);
+}
+
#define CASE(a,b) (((a)<<16)|((b)<<0))
/*c2go int CASE(int, int); */