]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/5a, cmd/5l, math: add CLZ instruction for ARM
authorShenghou Ma <minux.ma@gmail.com>
Sat, 2 Jun 2012 19:08:49 +0000 (03:08 +0800)
committerShenghou Ma <minux.ma@gmail.com>
Sat, 2 Jun 2012 19:08:49 +0000 (03:08 +0800)
        Supported in ARMv5 and above.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6284043

src/cmd/5a/lex.c
src/cmd/5l/5.out.h
src/cmd/5l/asm.c
src/cmd/5l/optab.c
src/cmd/5l/span.c
src/pkg/math/big/arith_arm.s

index e569fe62d3aaa617b5072cfd73aba3344d940e8b..6064becb9f0b8b6ab5f3b3bc92724f930af16bd9 100644 (file)
@@ -406,6 +406,8 @@ struct
 
        "PLD",          LTYPEPLD, APLD,
        "UNDEF",        LTYPEE, AUNDEF,
+       "CLZ",          LTYPE2, ACLZ,
+
        0
 };
 
index 56724d3dbcea3184fa695dce938612eeaacdd556..df5b5186a2cd553e9210c5c99deb92b02c095366 100644 (file)
@@ -184,9 +184,11 @@ enum       as
        ASTREXD,
 
        APLD,
-       
+
        AUNDEF,
 
+       ACLZ,
+
        ALAST,
 };
 
index 6d9d0b3f210244cb33b2c5b0dafe9dbef1625347..d8fde4683229422fb3e556ebe8d601ab9a711f36 100644 (file)
@@ -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);
index be25b6ed6116d226c2beed463b776313134a790a..9edbec09d67bdd158cb8a0e5397a390a30918c96 100644 (file)
@@ -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 },
 };
index acacb66bb06d14bbb69a7037ef2a348b629714ba..bda4981ee1dc0e34eb653bb41b1c6493064dc5e0 100644 (file)
@@ -848,6 +848,7 @@ buildop(void)
                case ATST:
                case APLD:
                case AUNDEF:
+               case ACLZ:
                        break;
                }
        }
index dbf3360b58e72d84dab2e4c2a64aae1f21e790b0..ed0f371655e772db819f63776261632e5151fbfc 100644 (file)
@@ -314,7 +314,7 @@ TEXT ·mulWW(SB),7,$0
 // func bitLen(x Word) (n int)
 TEXT ·bitLen(SB),7,$0
        MOVW    x+0(FP), R0
-       WORD    $0xe16f0f10 // CLZ R0, R0  (count leading zeros)
+       CLZ     R0, R0
        MOVW    $32, R1
        SUB.S   R0, R1
        MOVW    R1, n+4(FP)