]> Cypherpunks repositories - gostls13.git/commitdiff
5a, 5l, math: Add support for ABSD, ABSF floating point instructions.
authorMichał Derkacz <ziutek@lnet.pl>
Fri, 3 Aug 2012 20:15:11 +0000 (16:15 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 3 Aug 2012 20:15:11 +0000 (16:15 -0400)
R=golang-dev, dave, rsc, minux.ma
CC=golang-dev
https://golang.org/cl/6225051

src/cmd/5a/lex.c
src/cmd/5l/5.out.h
src/cmd/5l/asm.c
src/cmd/5l/softfloat.c
src/cmd/5l/span.c
src/pkg/runtime/softfloat_arm.c

index 19e5982bfc069a039deb0a8aa70f4df9bc37361a..cc02879b76f1b98e59b3b95a87dbbbd32612ac93 100644 (file)
@@ -329,8 +329,6 @@ struct
        "STREXD",               LTYPE9, ASTREXD,
 
 /*
-       "ABSF",         LTYPEI, AABSF,
-       "ABSD",         LTYPEI, AABSD,
        "NEGF",         LTYPEI, ANEGF,
        "NEGD",         LTYPEI, ANEGD,
        "SQTF",         LTYPEI, ASQTF,
@@ -343,6 +341,8 @@ struct
        "NRMD",         LTYPEI, ANRMD,
 */
 
+       "ABSF",         LTYPEI, AABSF,
+       "ABSD",         LTYPEI, AABSD,
        "SQRTF",        LTYPEI, ASQRTF,
        "SQRTD",        LTYPEI, ASQRTD,
        "CMPF",         LTYPEL, ACMPF,
index ff13c64a6efa25c94146c8ed2f0198dfdc0f58dc..1dea18c49e89051d64b29c3692ecb75dd15e8a78 100644 (file)
@@ -126,6 +126,8 @@ enum        as
        ADIVD,
        ASQRTF,
        ASQRTD,
+       AABSF,
+       AABSD,
 
        ASRL,
        ASRA,
index 911b6892cfdaf8ace0f309dc4785b1699bbc3e51..9a74c2a35d655a5ec8b787b2b5afc5f99befdc2e 100644 (file)
@@ -1493,7 +1493,7 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
                r = p->reg;
                if(r == NREG) {
                        r = rt;
-                       if(p->as == AMOVF || p->as == AMOVD || p->as == ASQRTF || p->as == ASQRTD)
+                       if(p->as == AMOVF || p->as == AMOVD || p->as == ASQRTF || p->as == ASQRTD || p->as == AABSF || p->as == AABSD)
                                r = 0;
                }
                o1 |= rf | (r<<16) | (rt<<12);
@@ -1948,6 +1948,8 @@ oprrr(int a, int sc)
        case ADIVF:     return o | (0xe<<24) | (0x8<<20) | (0xa<<8) | (0<<4);
        case ASQRTD:    return o | (0xe<<24) | (0xb<<20) | (1<<16) | (0xb<<8) | (0xc<<4);
        case ASQRTF:    return o | (0xe<<24) | (0xb<<20) | (1<<16) | (0xa<<8) | (0xc<<4);
+       case AABSD: return o | (0xe<<24) | (0xb<<20) | (0<<16) | (0xb<<8) | (0xc<<4);
+       case AABSF: return o | (0xe<<24) | (0xb<<20) | (0<<16) | (0xa<<8) | (0xc<<4);
        case ACMPD:     return o | (0xe<<24) | (0xb<<20) | (4<<16) | (0xb<<8) | (0xc<<4);
        case ACMPF:     return o | (0xe<<24) | (0xb<<20) | (4<<16) | (0xa<<8) | (0xc<<4);
 
index 40110717802ebf288caf2d59e3d025c20e0582b9..8be5b7585c1e63e5142f18961eaebf2893e97355 100644 (file)
@@ -55,6 +55,8 @@ softfloat(void)
                        case ADIVD:
                        case ASQRTF:
                        case ASQRTD:
+                       case AABSF:
+                       case AABSD:
                                goto soft;
 
                        default:
index 93991ba49cb4180659e2e61566cf7d59b9627bb9..3787740e283c4f44e627f9757621f7600f8e0a1b 100644 (file)
@@ -819,6 +819,8 @@ buildop(void)
                        oprange[ASQRTD] = oprange[r];
                        oprange[AMOVFD] = oprange[r];
                        oprange[AMOVDF] = oprange[r];
+                       oprange[AABSF] = oprange[r];
+                       oprange[AABSD] = oprange[r];
                        break;
 
                case ACMPF:
index bd73cb15b517b7b91e2eea93d965331fdf2b912b..9a54406302973cad5902c5ec17cd272e907bff49 100644 (file)
@@ -420,6 +420,23 @@ stage3:    // regd, regm are 4bit variables
                                regd, regm, m->freghi[regd], m->freglo[regd]);
                break;
 
+       case 0xeeb00bc0:        // D[regd] = abs D[regm]
+               m->freglo[regd] = m->freglo[regm];
+               m->freghi[regd] = m->freghi[regm] & ((1<<31)-1);
+
+               if(trace)
+                       runtime·printf("*** D[%d] = abs D[%d] %x-%x\n",
+                                       regd, regm, m->freghi[regd], m->freglo[regd]);
+               break;
+
+       case 0xeeb00ac0:        // F[regd] = abs F[regm]
+               m->freglo[regd] = m->freglo[regm] & ((1<<31)-1);
+
+               if(trace)
+                       runtime·printf("*** F[%d] = abs F[%d] %x\n",
+                                       regd, regm, m->freglo[regd]);
+               break;
+
        case 0xeeb40bc0:        // D[regd] :: D[regm] (CMPD)
                runtime·fcmp64c(getd(regd), getd(regm), &cmp, &nan);
                m->fflag = fstatus(nan, cmp);