diff options
| author | Shenghou Ma <minux.ma@gmail.com> | 2012-06-03 03:08:49 +0800 |
|---|---|---|
| committer | Shenghou Ma <minux.ma@gmail.com> | 2012-06-03 03:08:49 +0800 |
| commit | d186d07eda6cb043c4c75ef6ec3e161e7f6c5a3e (patch) | |
| tree | cfb6c127613da5a78a2e19e7ecece1d799421c3e /src/cmd/5l | |
| parent | 65e61d5770c7cbabe86e8159eb922e207942dde0 (diff) | |
| download | go-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.h | 4 | ||||
| -rw-r--r-- | src/cmd/5l/asm.c | 9 | ||||
| -rw-r--r-- | src/cmd/5l/optab.c | 2 | ||||
| -rw-r--r-- | src/cmd/5l/span.c | 1 |
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; } } |
