Commit dee5adcf authored by Michał Derkacz's avatar Michał Derkacz Committed by Russ Cox

5a, 5l, math: Add support for ABSD, ABSF floating point instructions.

R=golang-dev, dave, rsc, minux.ma
CC=golang-dev
https://golang.org/cl/6225051
parent 823962c5
...@@ -329,8 +329,6 @@ struct ...@@ -329,8 +329,6 @@ struct
"STREXD", LTYPE9, ASTREXD, "STREXD", LTYPE9, ASTREXD,
/* /*
"ABSF", LTYPEI, AABSF,
"ABSD", LTYPEI, AABSD,
"NEGF", LTYPEI, ANEGF, "NEGF", LTYPEI, ANEGF,
"NEGD", LTYPEI, ANEGD, "NEGD", LTYPEI, ANEGD,
"SQTF", LTYPEI, ASQTF, "SQTF", LTYPEI, ASQTF,
...@@ -343,6 +341,8 @@ struct ...@@ -343,6 +341,8 @@ struct
"NRMD", LTYPEI, ANRMD, "NRMD", LTYPEI, ANRMD,
*/ */
"ABSF", LTYPEI, AABSF,
"ABSD", LTYPEI, AABSD,
"SQRTF", LTYPEI, ASQRTF, "SQRTF", LTYPEI, ASQRTF,
"SQRTD", LTYPEI, ASQRTD, "SQRTD", LTYPEI, ASQRTD,
"CMPF", LTYPEL, ACMPF, "CMPF", LTYPEL, ACMPF,
......
...@@ -126,6 +126,8 @@ enum as ...@@ -126,6 +126,8 @@ enum as
ADIVD, ADIVD,
ASQRTF, ASQRTF,
ASQRTD, ASQRTD,
AABSF,
AABSD,
ASRL, ASRL,
ASRA, ASRA,
......
...@@ -1493,7 +1493,7 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p- ...@@ -1493,7 +1493,7 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
r = p->reg; r = p->reg;
if(r == NREG) { if(r == NREG) {
r = rt; 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; r = 0;
} }
o1 |= rf | (r<<16) | (rt<<12); o1 |= rf | (r<<16) | (rt<<12);
...@@ -1948,6 +1948,8 @@ oprrr(int a, int sc) ...@@ -1948,6 +1948,8 @@ oprrr(int a, int sc)
case ADIVF: return o | (0xe<<24) | (0x8<<20) | (0xa<<8) | (0<<4); 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 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 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 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); case ACMPF: return o | (0xe<<24) | (0xb<<20) | (4<<16) | (0xa<<8) | (0xc<<4);
......
...@@ -55,6 +55,8 @@ softfloat(void) ...@@ -55,6 +55,8 @@ softfloat(void)
case ADIVD: case ADIVD:
case ASQRTF: case ASQRTF:
case ASQRTD: case ASQRTD:
case AABSF:
case AABSD:
goto soft; goto soft;
default: default:
......
...@@ -819,6 +819,8 @@ buildop(void) ...@@ -819,6 +819,8 @@ buildop(void)
oprange[ASQRTD] = oprange[r]; oprange[ASQRTD] = oprange[r];
oprange[AMOVFD] = oprange[r]; oprange[AMOVFD] = oprange[r];
oprange[AMOVDF] = oprange[r]; oprange[AMOVDF] = oprange[r];
oprange[AABSF] = oprange[r];
oprange[AABSD] = oprange[r];
break; break;
case ACMPF: case ACMPF:
......
...@@ -420,6 +420,23 @@ stage3: // regd, regm are 4bit variables ...@@ -420,6 +420,23 @@ stage3: // regd, regm are 4bit variables
regd, regm, m->freghi[regd], m->freglo[regd]); regd, regm, m->freghi[regd], m->freglo[regd]);
break; 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) case 0xeeb40bc0: // D[regd] :: D[regm] (CMPD)
runtime·fcmp64c(getd(regd), getd(regm), &cmp, &nan); runtime·fcmp64c(getd(regd), getd(regm), &cmp, &nan);
m->fflag = fstatus(nan, cmp); m->fflag = fstatus(nan, cmp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment