aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/5l
diff options
context:
space:
mode:
authorShenghou Ma <minux.ma@gmail.com>2012-06-03 03:08:49 +0800
committerShenghou Ma <minux.ma@gmail.com>2012-06-03 03:08:49 +0800
commitd186d07eda6cb043c4c75ef6ec3e161e7f6c5a3e (patch)
treecfb6c127613da5a78a2e19e7ecece1d799421c3e /src/cmd/5l
parent65e61d5770c7cbabe86e8159eb922e207942dde0 (diff)
downloadgo-d186d07eda6cb043c4c75ef6ec3e161e7f6c5a3e.tar.xz
cmd/5a, cmd/5l, math: add CLZ instruction for ARM
Supported in ARMv5 and above. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/6284043
Diffstat (limited to 'src/cmd/5l')
-rw-r--r--src/cmd/5l/5.out.h4
-rw-r--r--src/cmd/5l/asm.c9
-rw-r--r--src/cmd/5l/optab.c2
-rw-r--r--src/cmd/5l/span.c1
4 files changed, 15 insertions, 1 deletions
diff --git a/src/cmd/5l/5.out.h b/src/cmd/5l/5.out.h
index 56724d3dbc..df5b5186a2 100644
--- a/src/cmd/5l/5.out.h
+++ b/src/cmd/5l/5.out.h
@@ -184,9 +184,11 @@ enum as
ASTREXD,
APLD,
-
+
AUNDEF,
+ ACLZ,
+
ALAST,
};
diff --git a/src/cmd/5l/asm.c b/src/cmd/5l/asm.c
index 6d9d0b3f21..d8fde46832 100644
--- a/src/cmd/5l/asm.c
+++ b/src/cmd/5l/asm.c
@@ -1801,6 +1801,11 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
o1 = opbra(ABL, C_SCOND_NONE);
o1 |= (v >> 2) & 0xffffff;
break;
+ case 97: /* CLZ Rm, Rd */
+ o1 = oprrr(p->as, p->scond);
+ o1 |= p->to.reg << 12;
+ o1 |= p->from.reg;
+ break;
}
out[0] = o1;
@@ -1958,6 +1963,10 @@ oprrr(int a, int sc)
return o | (0xe<<24) | (0x1<<20) | (0xb<<8) | (1<<4);
case ACMP+AEND: // cmp imm
return o | (0x3<<24) | (0x5<<20);
+
+ case ACLZ:
+ // CLZ doesn't support .S
+ return (o & (0xf<<28)) | (0x16f<<16) | (0xf1<<4);
}
diag("bad rrr %d", a);
prasm(curp);
diff --git a/src/cmd/5l/optab.c b/src/cmd/5l/optab.c
index be25b6ed61..9edbec09d6 100644
--- a/src/cmd/5l/optab.c
+++ b/src/cmd/5l/optab.c
@@ -236,5 +236,7 @@ Optab optab[] =
{ AUNDEF, C_NONE, C_NONE, C_NONE, 96, 4, 0 },
+ { ACLZ, C_REG, C_NONE, C_REG, 97, 4, 0 },
+
{ AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0 },
};
diff --git a/src/cmd/5l/span.c b/src/cmd/5l/span.c
index acacb66bb0..bda4981ee1 100644
--- a/src/cmd/5l/span.c
+++ b/src/cmd/5l/span.c
@@ -848,6 +848,7 @@ buildop(void)
case ATST:
case APLD:
case AUNDEF:
+ case ACLZ:
break;
}
}