mirror of
https://github.com/golang/go
synced 2024-11-22 01:34:41 -07:00
more soft float support. passes several basic tests
but with less precision than hardware counterparts. fixed a number of tests to output BUG when they failed. changed the runner to distinghuish between output and output containing ^BUG R=rsc CC=dho, golang-dev https://golang.org/cl/1778041
This commit is contained in:
parent
658d521358
commit
36057e721e
@ -19,8 +19,17 @@ static uint32 doabort = 0;
|
|||||||
static uint32 trace = 0;
|
static uint32 trace = 0;
|
||||||
|
|
||||||
#define DOUBLE_EXPBIAS 1023
|
#define DOUBLE_EXPBIAS 1023
|
||||||
|
#define DOUBLE_MANT_MASK 0xfffffffffffffll
|
||||||
|
#define DOUBLE_MANT_TOP_BIT 0x10000000000000ll
|
||||||
|
#define DZERO 0x0000000000000000ll
|
||||||
|
#define DNZERO 0x8000000000000000ll
|
||||||
|
#define DONE 0x3ff0000000000000ll
|
||||||
|
#define DINF 0x7ff0000000000000ll
|
||||||
|
#define DNINF 0xfff0000000000000ll
|
||||||
|
|
||||||
#define SINGLE_EXPBIAS 127
|
#define SINGLE_EXPBIAS 127
|
||||||
|
|
||||||
|
|
||||||
static const int8* opnames[] = {
|
static const int8* opnames[] = {
|
||||||
// binary
|
// binary
|
||||||
"adf",
|
"adf",
|
||||||
@ -121,7 +130,7 @@ fmantissa(uint64 f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fprint()
|
fprint(void)
|
||||||
{
|
{
|
||||||
uint32 i;
|
uint32 i;
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
@ -145,14 +154,25 @@ s2d(uint32 s)
|
|||||||
(uint64)(s & 0x7fffff) << 29; // mantissa
|
(uint64)(s & 0x7fffff) << 29; // mantissa
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int64
|
||||||
|
rsh(int64 f, int32 s)
|
||||||
|
{
|
||||||
|
if (s >= 0)
|
||||||
|
return f>>s;
|
||||||
|
else
|
||||||
|
return f<<-s;
|
||||||
|
}
|
||||||
|
|
||||||
// cdp, data processing instructions
|
// cdp, data processing instructions
|
||||||
static void
|
static void
|
||||||
dataprocess(uint32* pc)
|
dataprocess(uint32* pc)
|
||||||
{
|
{
|
||||||
uint32 i, opcode, unary, dest, lhs, rhs, prec;
|
uint32 i, opcode, unary, dest, lhs, rhs, prec;
|
||||||
uint32 high;
|
uint32 high;
|
||||||
|
int32 expd, exp0, exp1;
|
||||||
uint64 fraw0, fraw1, exp, sign;
|
uint64 fraw0, fraw1, exp, sign;
|
||||||
uint64 fd, f0, f1;
|
uint64 fd, f0, f1;
|
||||||
|
int64 fsd, fs0, fs1;
|
||||||
|
|
||||||
i = *pc;
|
i = *pc;
|
||||||
|
|
||||||
@ -165,6 +185,9 @@ dataprocess(uint32* pc)
|
|||||||
rhs = i & 15;
|
rhs = i & 15;
|
||||||
|
|
||||||
prec = precision(i);
|
prec = precision(i);
|
||||||
|
// if (prec != 1)
|
||||||
|
// goto undef;
|
||||||
|
|
||||||
if (unary) {
|
if (unary) {
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case 0: // mvf
|
case 0: // mvf
|
||||||
@ -174,28 +197,115 @@ dataprocess(uint32* pc)
|
|||||||
goto undef;
|
goto undef;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
fraw0 = m->freg[lhs];
|
||||||
|
fraw1 = frhs(rhs);
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
|
case 2: // suf
|
||||||
|
fraw1 ^= 0x1ll << 63;
|
||||||
|
// fallthrough
|
||||||
|
case 0: // adf
|
||||||
|
if (fraw0 == DZERO || fraw0 == DNZERO) {
|
||||||
|
m->freg[dest] = fraw1;
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
if (fraw1 == DZERO || fraw1 == DNZERO) {
|
||||||
|
m->freg[dest] = fraw0;
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
fs0 = fraw0 & DOUBLE_MANT_MASK | DOUBLE_MANT_TOP_BIT;
|
||||||
|
fs1 = fraw1 & DOUBLE_MANT_MASK | DOUBLE_MANT_TOP_BIT;
|
||||||
|
exp0 = fexp(fraw0);
|
||||||
|
exp1 = fexp(fraw1);
|
||||||
|
if (exp0 > exp1)
|
||||||
|
fs1 = rsh(fs1, exp0-exp1);
|
||||||
|
else
|
||||||
|
fs0 = rsh(fs0, exp1-exp0);
|
||||||
|
if (fraw0 & 0x1ll<<63)
|
||||||
|
fs0 = -fs0;
|
||||||
|
if (fraw1 & 0x1ll<<63)
|
||||||
|
fs1 = -fs1;
|
||||||
|
fsd = fs0 + fs1;
|
||||||
|
if (fsd == 0) {
|
||||||
|
m->freg[dest] = DZERO;
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
sign = (uint64)fsd & 0x1ll<<63;
|
||||||
|
if (fsd < 0)
|
||||||
|
fsd = -fsd;
|
||||||
|
for (expd = 55; expd > 0; expd--) {
|
||||||
|
if (0x1ll<<expd & fsd)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (exp0 > exp1)
|
||||||
|
exp = expd + exp0 - 52;
|
||||||
|
else
|
||||||
|
exp = expd + exp1 - 52;
|
||||||
|
// too small value, can't represent
|
||||||
|
if (1<<31 & expd) {
|
||||||
|
m->freg[dest] = DZERO;
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
// infinity
|
||||||
|
if (expd > 1<<12) {
|
||||||
|
m->freg[dest] = DINF;
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
fd = sign | (exp + DOUBLE_EXPBIAS)<<52 | (uint64)fsd & DOUBLE_MANT_MASK;
|
||||||
|
m->freg[dest] = fd;
|
||||||
|
goto ret;
|
||||||
|
|
||||||
|
case 4: //dvf
|
||||||
|
// reciprocal for fraw1
|
||||||
|
if (fraw1 == DONE)
|
||||||
|
goto muf;
|
||||||
|
f0 = 0x1ll << 63;
|
||||||
|
f1 = fraw1 & DOUBLE_MANT_MASK | DOUBLE_MANT_TOP_BIT;
|
||||||
|
f1 >>= 21;
|
||||||
|
fd = f0/f1;
|
||||||
|
fd <<= 21;
|
||||||
|
fd &= DOUBLE_MANT_MASK;
|
||||||
|
exp1 = -fexp(fraw1) - 1;
|
||||||
|
sign = fraw1 & 0x1ll<<63;
|
||||||
|
fraw1 = sign | (uint64)(exp1 + DOUBLE_EXPBIAS)<<52 | fd;
|
||||||
|
// fallthrough
|
||||||
case 1: // muf
|
case 1: // muf
|
||||||
fraw0 = m->freg[lhs];
|
muf:
|
||||||
fraw1 = frhs(rhs);
|
if (fraw0 == DNZERO || fraw1 == DNZERO) {
|
||||||
f0 = fraw0>>21 & 0xffffffff | 0x80000000;
|
m->freg[dest] = DNZERO;
|
||||||
f1 = fraw1>>21 & 0xffffffff | 0x80000000;
|
goto ret;
|
||||||
|
}
|
||||||
|
if (fraw0 == DZERO || fraw1 == DZERO) {
|
||||||
|
m->freg[dest] = DZERO;
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
if (fraw0 == DONE) {
|
||||||
|
m->freg[dest] = fraw1;
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
if (fraw1 == DONE) {
|
||||||
|
m->freg[dest] = fraw0;
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
f0 = fraw0>>21 & 0x7fffffff | 0x1ll<<31;
|
||||||
|
f1 = fraw1>>21 & 0x7fffffff | 0x1ll<<31;
|
||||||
fd = f0*f1;
|
fd = f0*f1;
|
||||||
high = fd >> 63;
|
high = fd >> 63;
|
||||||
if (high)
|
if (high)
|
||||||
fd = fd >> 11 & 0x000fffffffffffffll;
|
fd = fd >> 11 & DOUBLE_MANT_MASK;
|
||||||
else
|
else
|
||||||
fd = fd >> 10 & 0x000fffffffffffffll;
|
fd = fd >> 10 & DOUBLE_MANT_MASK;
|
||||||
exp = (uint64)(fexp(fraw0) + fexp(fraw1) + !!high + DOUBLE_EXPBIAS) & 0x7ff;
|
exp = (uint64)(fexp(fraw0) + fexp(fraw1) + !!high + DOUBLE_EXPBIAS) & 0x7ff;
|
||||||
sign = fraw0 >> 63 ^ fraw1 >> 63;
|
sign = fraw0 >> 63 ^ fraw1 >> 63;
|
||||||
fd = sign << 63 | exp <<52 | fd;
|
fd = sign<<63 | exp<<52 | fd;
|
||||||
m->freg[dest] = fd;
|
m->freg[dest] = fd;
|
||||||
goto ret;
|
goto ret;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
goto undef;
|
goto undef;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
undef:
|
undef:
|
||||||
doabort = 1;
|
doabort = 1;
|
||||||
|
|
||||||
@ -209,6 +319,7 @@ ret:
|
|||||||
printf("#%s\n", fpconst[rhs&0x7]);
|
printf("#%s\n", fpconst[rhs&0x7]);
|
||||||
else
|
else
|
||||||
printf("f%d\n", rhs&0x7);
|
printf("f%d\n", rhs&0x7);
|
||||||
|
fprint();
|
||||||
}
|
}
|
||||||
if (doabort)
|
if (doabort)
|
||||||
fabort();
|
fabort();
|
||||||
@ -218,12 +329,13 @@ ret:
|
|||||||
#define FLAGS_N (1 << 31)
|
#define FLAGS_N (1 << 31)
|
||||||
#define FLAGS_Z (1 << 30)
|
#define FLAGS_Z (1 << 30)
|
||||||
#define FLAGS_C (1 << 29)
|
#define FLAGS_C (1 << 29)
|
||||||
|
#define FLAGS_V (1 << 28)
|
||||||
|
|
||||||
// cmf, compare floating point
|
// cmf, compare floating point
|
||||||
static void
|
static void
|
||||||
compare(uint32 *pc, uint32 *regs) {
|
compare(uint32 *pc, uint32 *regs) {
|
||||||
uint32 i, flags, lhs, rhs, sign0, sign1;
|
uint32 i, flags, lhs, rhs, sign0, sign1;
|
||||||
uint32 f0, f1, mant0, mant1;
|
uint64 f0, f1, mant0, mant1;
|
||||||
int32 exp0, exp1;
|
int32 exp0, exp1;
|
||||||
|
|
||||||
i = *pc;
|
i = *pc;
|
||||||
@ -233,6 +345,10 @@ compare(uint32 *pc, uint32 *regs) {
|
|||||||
|
|
||||||
f0 = m->freg[lhs];
|
f0 = m->freg[lhs];
|
||||||
f1 = frhs(rhs);
|
f1 = frhs(rhs);
|
||||||
|
if (isNaN(float64frombits(f0)) || isNaN(float64frombits(f1))) {
|
||||||
|
flags = FLAGS_C | FLAGS_V;
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
if (f0 == f1) {
|
if (f0 == f1) {
|
||||||
flags = FLAGS_Z | FLAGS_C;
|
flags = FLAGS_Z | FLAGS_C;
|
||||||
goto ret;
|
goto ret;
|
||||||
@ -372,6 +488,60 @@ ret:
|
|||||||
fabort();
|
fabort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fltfix(uint32 *pc, uint32 *regs)
|
||||||
|
{
|
||||||
|
uint32 i, toarm, freg, reg, sign, val, prec;
|
||||||
|
int32 rd, exp;
|
||||||
|
uint64 fd, f0;
|
||||||
|
|
||||||
|
i = *pc;
|
||||||
|
toarm = i>>20 & 0x1;
|
||||||
|
freg = i>>16 & 0x7;
|
||||||
|
reg = i>>12 & 0xf;
|
||||||
|
prec = precision(i);
|
||||||
|
|
||||||
|
if (toarm) { //fix
|
||||||
|
f0 = m->freg[freg];
|
||||||
|
fd = f0 & DOUBLE_MANT_MASK | DOUBLE_MANT_TOP_BIT;
|
||||||
|
exp = fexp(f0) - 52;
|
||||||
|
if (exp < 0)
|
||||||
|
fd = fd>>(-exp);
|
||||||
|
else
|
||||||
|
fd = fd<<exp;
|
||||||
|
rd = ((int32)fd & 0x7fffffff);
|
||||||
|
if (f0 & 0x1ll<<63)
|
||||||
|
rd = -rd;
|
||||||
|
regs[reg] = (uint32)rd;
|
||||||
|
} else { // flt
|
||||||
|
if (regs[reg] == 0) {
|
||||||
|
m->freg[freg] = DZERO;
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
sign = regs[reg] >> 31 & 0x1;
|
||||||
|
val = regs[reg];
|
||||||
|
if (sign) val = -val;
|
||||||
|
for (exp = 31; exp >= 0; exp--) {
|
||||||
|
if (1<<(exp) & val)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fd = (uint64)val<<(52-exp) & DOUBLE_MANT_MASK;
|
||||||
|
m->freg[freg] = (uint64)(sign) << 63 |
|
||||||
|
(uint64)(exp + DOUBLE_EXPBIAS) << 52 | fd;
|
||||||
|
}
|
||||||
|
goto ret;
|
||||||
|
|
||||||
|
ret:
|
||||||
|
if (trace || doabort) {
|
||||||
|
if (toarm)
|
||||||
|
printf(" %p %x\tfix%s\t\tr%d, f%d\n", pc, *pc, fpprec[prec], reg, freg);
|
||||||
|
else
|
||||||
|
printf(" %p %x\tflt%s\t\tf%d, r%d\n", pc, *pc, fpprec[prec], freg, reg);
|
||||||
|
fprint();
|
||||||
|
}
|
||||||
|
if (doabort)
|
||||||
|
fabort();
|
||||||
|
}
|
||||||
|
|
||||||
// returns number of words that the fp instruction is occupying, 0 if next instruction isn't float.
|
// returns number of words that the fp instruction is occupying, 0 if next instruction isn't float.
|
||||||
// TODO(kaib): insert sanity checks for coproc 1
|
// TODO(kaib): insert sanity checks for coproc 1
|
||||||
@ -381,8 +551,17 @@ stepflt(uint32 *pc, uint32 *regs)
|
|||||||
uint32 i, c;
|
uint32 i, c;
|
||||||
|
|
||||||
i = *pc;
|
i = *pc;
|
||||||
c = i >> 25 & 7;
|
|
||||||
|
|
||||||
|
// unconditional forward branches.
|
||||||
|
// inserted by linker after we instrument the code.
|
||||||
|
if ((i & 0xff000000) == 0xea000000) {
|
||||||
|
if (i & 0x00800000) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return i & 0x007ffffff + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = i >> 25 & 7;
|
||||||
switch(c) {
|
switch(c) {
|
||||||
case 6: // 110
|
case 6: // 110
|
||||||
loadstore(pc, regs);
|
loadstore(pc, regs);
|
||||||
@ -391,11 +570,14 @@ stepflt(uint32 *pc, uint32 *regs)
|
|||||||
if (i>>24 & 1) return 0; // ignore swi
|
if (i>>24 & 1) return 0; // ignore swi
|
||||||
|
|
||||||
if (i>>4 & 1) { //data transfer
|
if (i>>4 & 1) { //data transfer
|
||||||
if ((i&0x00f0ff00) != 0x0090f100) {
|
if ((i&0x00f0ff00) == 0x0090f100) {
|
||||||
printf(" %p %x\n", pc, i);
|
compare(pc, regs);
|
||||||
|
} else if ((i&0x00e00f10) == 0x00000110) {
|
||||||
|
fltfix(pc, regs);
|
||||||
|
} else {
|
||||||
|
printf(" %p %x\t// case 7 fail\n", pc, i);
|
||||||
fabort();
|
fabort();
|
||||||
}
|
}
|
||||||
compare(pc, regs);
|
|
||||||
} else {
|
} else {
|
||||||
dataprocess(pc);
|
dataprocess(pc);
|
||||||
}
|
}
|
||||||
@ -419,7 +601,7 @@ uint32*
|
|||||||
_sfloat2(uint32 *lr, uint32 r0)
|
_sfloat2(uint32 *lr, uint32 r0)
|
||||||
{
|
{
|
||||||
uint32 skip;
|
uint32 skip;
|
||||||
uint32 cpsr;
|
// uint32 cpsr;
|
||||||
|
|
||||||
while(skip = stepflt(lr, &r0)) {
|
while(skip = stepflt(lr, &r0)) {
|
||||||
lr += skip;
|
lr += skip;
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
./235.go
|
./235.go
|
||||||
./64bit.go # slow with GOGC=on
|
./64bit.go
|
||||||
./args.go
|
./args.go
|
||||||
./assign.go
|
./assign.go
|
||||||
|
./assign1.go
|
||||||
./bigalg.go
|
./bigalg.go
|
||||||
|
./bigmap.go
|
||||||
./blank.go
|
./blank.go
|
||||||
./blank1.go
|
./blank1.go
|
||||||
./chancap.go
|
./chancap.go
|
||||||
./char_lit.go
|
./char_lit.go
|
||||||
|
./char_lit1.go
|
||||||
./closedchan.go
|
./closedchan.go
|
||||||
./closure.go
|
./closure.go
|
||||||
./cmp1.go
|
./cmp1.go
|
||||||
@ -14,6 +17,9 @@
|
|||||||
./cmp3.go
|
./cmp3.go
|
||||||
./cmp4.go
|
./cmp4.go
|
||||||
./cmp5.go
|
./cmp5.go
|
||||||
|
./cmplx.go
|
||||||
|
# ./cmplxdivide.go # fail
|
||||||
|
./cmplxdivide1.go
|
||||||
./complit.go
|
./complit.go
|
||||||
./compos.go
|
./compos.go
|
||||||
./const.go
|
./const.go
|
||||||
@ -24,7 +30,7 @@
|
|||||||
./convert3.go
|
./convert3.go
|
||||||
./convlit.go
|
./convlit.go
|
||||||
./convlit1.go
|
./convlit1.go
|
||||||
# ./copy.go # slow
|
./copy.go
|
||||||
./ddd.go
|
./ddd.go
|
||||||
./ddd1.go
|
./ddd1.go
|
||||||
./ddd2.go
|
./ddd2.go
|
||||||
@ -32,23 +38,22 @@
|
|||||||
./decl.go
|
./decl.go
|
||||||
./declbad.go
|
./declbad.go
|
||||||
./defer.go
|
./defer.go
|
||||||
# ./deferprint.go # need floating point
|
./deferprint.go
|
||||||
./empty.go
|
./empty.go
|
||||||
./env.go
|
./env.go
|
||||||
./escape.go
|
./escape.go
|
||||||
# ./float_lit.go # need floating point
|
# ./float_lit.go # fail
|
||||||
# ./floatcmp.go # need floating point
|
# ./floatcmp.go # fail
|
||||||
./for.go
|
./for.go
|
||||||
# ./func.go
|
./func.go
|
||||||
./func1.go
|
./func1.go
|
||||||
./func2.go
|
./func2.go
|
||||||
./func3.go
|
./func3.go
|
||||||
./func4.go
|
./func4.go
|
||||||
./func5.go
|
./func5.go
|
||||||
# ./gc.go
|
./gc.go
|
||||||
# ./gc1.go
|
./gc1.go
|
||||||
./hashmap.go
|
./hashmap.go
|
||||||
./hilbert.go
|
|
||||||
./helloworld.go
|
./helloworld.go
|
||||||
./if.go
|
./if.go
|
||||||
./if1.go
|
./if1.go
|
||||||
@ -60,64 +65,70 @@
|
|||||||
./indirect.go
|
./indirect.go
|
||||||
./indirect1.go
|
./indirect1.go
|
||||||
./initcomma.go
|
./initcomma.go
|
||||||
# ./initialize.go # need floating point
|
# ./initialize.go # fail
|
||||||
./initializerr.go
|
./initializerr.go
|
||||||
./initsyscall.go
|
./initsyscall.go
|
||||||
./int_lit.go
|
./int_lit.go
|
||||||
./intcvt.go
|
./intcvt.go
|
||||||
./iota.go
|
./iota.go
|
||||||
# ./literal.go # need floating point
|
# ./literal.go # fail
|
||||||
# ./malloc1.go
|
./malloc1.go
|
||||||
# ./mallocfin.go
|
# ./mallocfin.go # fail
|
||||||
# ./mallocrand.go
|
./mallocrand.go
|
||||||
# ./mallocrep.go
|
./mallocrep.go
|
||||||
# ./mallocrep1.go
|
./mallocrep1.go
|
||||||
# ./map.go # need floating point
|
# ./map.go # fail
|
||||||
./method.go
|
./method.go
|
||||||
./method1.go
|
./method1.go
|
||||||
./method2.go
|
./method2.go
|
||||||
./method3.go
|
./method3.go
|
||||||
#./named.go # need floating point
|
# ./named.go # fail
|
||||||
./named1.go
|
./named1.go
|
||||||
./nil.go
|
./nil.go
|
||||||
# ./nul1.go # android runner gets confused
|
./nul1.go
|
||||||
./parentype.go
|
./parentype.go
|
||||||
# ./peano.go # foo
|
./peano.go
|
||||||
./printbig.go
|
./printbig.go
|
||||||
./range.go
|
# ./range.go # fail
|
||||||
./recover.go
|
./recover.go
|
||||||
./recover1.go
|
./recover1.go
|
||||||
./recover2.go
|
./recover2.go
|
||||||
|
# ./recover3.go # fail
|
||||||
./rename.go
|
./rename.go
|
||||||
./rename1.go
|
./rename1.go
|
||||||
./runtime.go
|
./runtime.go
|
||||||
./sieve.go
|
./sieve.go
|
||||||
# ./sigchld.go # fail - does not survive signal
|
./sigchld.go
|
||||||
./simassign.go
|
./simassign.go
|
||||||
|
./sinit.go
|
||||||
./stack.go
|
./stack.go
|
||||||
./string_lit.go
|
./string_lit.go
|
||||||
./stringrange.go
|
./stringrange.go
|
||||||
./switch.go
|
./switch.go
|
||||||
./switch1.go
|
./switch1.go
|
||||||
|
./test.go
|
||||||
./test0.go
|
./test0.go
|
||||||
./turing.go
|
./turing.go
|
||||||
./typeswitch.go
|
./typeswitch.go
|
||||||
# ./typeswitch1.go
|
./typeswitch1.go
|
||||||
./typeswitch2.go
|
./typeswitch2.go
|
||||||
|
./undef.go
|
||||||
./utf.go
|
./utf.go
|
||||||
|
./varerr.go
|
||||||
./varinit.go
|
./varinit.go
|
||||||
# ./vectors.go
|
./vectors.go
|
||||||
|
# ./zerodivide.go # fail
|
||||||
ken/array.go
|
ken/array.go
|
||||||
# ken/chan.go # slow
|
ken/chan.go
|
||||||
# ken/chan1.go # slow
|
ken/chan1.go
|
||||||
ken/complit.go
|
ken/complit.go
|
||||||
# ken/cplx0.go # need floating point
|
ken/cplx0.go
|
||||||
# ken/cplx1.go # need floating point
|
# ken/cplx1.go # fail
|
||||||
# ken/cplx2.go # need floating point
|
# ken/cplx2.go # fail
|
||||||
# ken/cplx3.go # need floating point
|
ken/cplx3.go
|
||||||
# ken/cplx4.go # need floating point
|
# ken/cplx4.go # fail
|
||||||
# ken/cplx5.go # need floating point
|
ken/cplx5.go
|
||||||
# ken/divconst.go # slow
|
ken/divconst.go
|
||||||
ken/divmod.go
|
ken/divmod.go
|
||||||
ken/embed.go
|
ken/embed.go
|
||||||
ken/for.go
|
ken/for.go
|
||||||
@ -127,28 +138,28 @@ ken/intervar.go
|
|||||||
ken/label.go
|
ken/label.go
|
||||||
ken/litfun.go
|
ken/litfun.go
|
||||||
ken/mfunc.go
|
ken/mfunc.go
|
||||||
# ken/modconst.go # slow
|
ken/modconst.go
|
||||||
ken/ptrfun.go
|
ken/ptrfun.go
|
||||||
ken/ptrvar.go
|
ken/ptrvar.go
|
||||||
ken/range.go
|
ken/range.go
|
||||||
ken/rob1.go
|
ken/rob1.go
|
||||||
ken/rob2.go
|
ken/rob2.go
|
||||||
ken/robfor.go
|
ken/robfor.go
|
||||||
# ken/robfunc.go # fail
|
ken/robfunc.go
|
||||||
ken/robif.go
|
ken/robif.go
|
||||||
ken/shift.go
|
ken/shift.go
|
||||||
#ken/simparray.go # need floating point
|
# ken/simparray.go # fail
|
||||||
ken/simpbool.go
|
ken/simpbool.go
|
||||||
#ken/simpconv.go # need floating point
|
# ken/simpconv.go # fail
|
||||||
ken/simpfun.go
|
ken/simpfun.go
|
||||||
ken/simpprint.go
|
ken/simpprint.go
|
||||||
ken/simpswitch.go
|
ken/simpswitch.go
|
||||||
ken/simpvar.go
|
ken/simpvar.go
|
||||||
#ken/slicearray.go # need floating point
|
ken/slicearray.go
|
||||||
#ken/sliceslice.go # need floating point
|
ken/sliceslice.go
|
||||||
ken/string.go
|
ken/string.go
|
||||||
ken/strvar.go
|
ken/strvar.go
|
||||||
# chan/doubleselect.go # slow
|
chan/doubleselect.go
|
||||||
chan/fifo.go
|
chan/fifo.go
|
||||||
chan/goroutines.go
|
chan/goroutines.go
|
||||||
chan/nonblock.go
|
chan/nonblock.go
|
||||||
@ -167,8 +178,8 @@ interface/embed.go
|
|||||||
interface/embed0.go
|
interface/embed0.go
|
||||||
interface/embed1.go
|
interface/embed1.go
|
||||||
interface/explicit.go
|
interface/explicit.go
|
||||||
# interface/fake.go # fails - panic: assert
|
|
||||||
interface/fail.go
|
interface/fail.go
|
||||||
|
# interface/fake.go # fail
|
||||||
interface/pointer.go
|
interface/pointer.go
|
||||||
interface/receiver.go
|
interface/receiver.go
|
||||||
interface/receiver1.go
|
interface/receiver1.go
|
||||||
@ -196,6 +207,7 @@ syntax/semi5.go
|
|||||||
syntax/semi6.go
|
syntax/semi6.go
|
||||||
syntax/semi7.go
|
syntax/semi7.go
|
||||||
syntax/slice.go
|
syntax/slice.go
|
||||||
|
syntax/topexpr.go
|
||||||
syntax/vareq.go
|
syntax/vareq.go
|
||||||
syntax/vareq1.go
|
syntax/vareq1.go
|
||||||
fixedbugs/bug000.go
|
fixedbugs/bug000.go
|
||||||
@ -209,7 +221,7 @@ fixedbugs/bug007.go
|
|||||||
fixedbugs/bug008.go
|
fixedbugs/bug008.go
|
||||||
fixedbugs/bug009.go
|
fixedbugs/bug009.go
|
||||||
fixedbugs/bug010.go
|
fixedbugs/bug010.go
|
||||||
#fixedbugs/bug011.go # need floating point
|
fixedbugs/bug011.go
|
||||||
fixedbugs/bug012.go
|
fixedbugs/bug012.go
|
||||||
fixedbugs/bug013.go
|
fixedbugs/bug013.go
|
||||||
fixedbugs/bug014.go
|
fixedbugs/bug014.go
|
||||||
@ -303,7 +315,7 @@ fixedbugs/bug116.go
|
|||||||
fixedbugs/bug117.go
|
fixedbugs/bug117.go
|
||||||
fixedbugs/bug118.go
|
fixedbugs/bug118.go
|
||||||
fixedbugs/bug119.go
|
fixedbugs/bug119.go
|
||||||
# fixedbugs/bug120.go # needs floating point
|
fixedbugs/bug120.go
|
||||||
fixedbugs/bug121.go
|
fixedbugs/bug121.go
|
||||||
fixedbugs/bug122.go
|
fixedbugs/bug122.go
|
||||||
fixedbugs/bug123.go
|
fixedbugs/bug123.go
|
||||||
@ -332,8 +344,7 @@ fixedbugs/bug149.go
|
|||||||
fixedbugs/bug150.go
|
fixedbugs/bug150.go
|
||||||
fixedbugs/bug151.go
|
fixedbugs/bug151.go
|
||||||
fixedbugs/bug152.go
|
fixedbugs/bug152.go
|
||||||
fixedbugs/bug153.go
|
fixedbugs/bug154.go
|
||||||
# fixedbugs/bug154.go # needs floating point
|
|
||||||
fixedbugs/bug155.go
|
fixedbugs/bug155.go
|
||||||
fixedbugs/bug156.go
|
fixedbugs/bug156.go
|
||||||
fixedbugs/bug157.go
|
fixedbugs/bug157.go
|
||||||
@ -397,7 +408,7 @@ fixedbugs/bug217.go
|
|||||||
fixedbugs/bug218.go
|
fixedbugs/bug218.go
|
||||||
fixedbugs/bug219.go
|
fixedbugs/bug219.go
|
||||||
fixedbugs/bug220.go
|
fixedbugs/bug220.go
|
||||||
# fixedbugs/bug221.go # slow
|
# fixedbugs/bug221.go # fail
|
||||||
fixedbugs/bug222.go
|
fixedbugs/bug222.go
|
||||||
fixedbugs/bug223.go
|
fixedbugs/bug223.go
|
||||||
fixedbugs/bug224.go
|
fixedbugs/bug224.go
|
||||||
@ -412,14 +423,14 @@ fixedbugs/bug232.go
|
|||||||
fixedbugs/bug233.go
|
fixedbugs/bug233.go
|
||||||
fixedbugs/bug234.go
|
fixedbugs/bug234.go
|
||||||
fixedbugs/bug235.go
|
fixedbugs/bug235.go
|
||||||
# fixedbugs/bug236.go # slow
|
# fixedbugs/bug236.go # fail
|
||||||
fixedbugs/bug237.go
|
fixedbugs/bug237.go
|
||||||
fixedbugs/bug238.go
|
fixedbugs/bug238.go
|
||||||
fixedbugs/bug239.go
|
fixedbugs/bug239.go
|
||||||
fixedbugs/bug240.go
|
fixedbugs/bug240.go
|
||||||
fixedbugs/bug241.go
|
fixedbugs/bug241.go
|
||||||
fixedbugs/bug242.go
|
fixedbugs/bug242.go
|
||||||
# fixedbugs/bug243.go # fail
|
# fixedbugs/bug243.go # fail
|
||||||
fixedbugs/bug244.go
|
fixedbugs/bug244.go
|
||||||
fixedbugs/bug245.go
|
fixedbugs/bug245.go
|
||||||
fixedbugs/bug246.go
|
fixedbugs/bug246.go
|
||||||
@ -433,12 +444,35 @@ fixedbugs/bug253.go
|
|||||||
fixedbugs/bug254.go
|
fixedbugs/bug254.go
|
||||||
fixedbugs/bug255.go
|
fixedbugs/bug255.go
|
||||||
fixedbugs/bug256.go
|
fixedbugs/bug256.go
|
||||||
# fixedbugs/bug257.go # slow
|
fixedbugs/bug257.go
|
||||||
# fixedbugs/bug258.go # needs floating point
|
fixedbugs/bug258.go
|
||||||
fixedbugs/bug259.go
|
fixedbugs/bug259.go
|
||||||
fixedbugs/bug261.go
|
fixedbugs/bug261.go
|
||||||
fixedbugs/bug262.go
|
fixedbugs/bug262.go
|
||||||
fixedbugs/bug263.go
|
fixedbugs/bug263.go
|
||||||
fixedbugs/bug264.go
|
fixedbugs/bug264.go
|
||||||
fixedbugs/bug265.go
|
fixedbugs/bug265.go
|
||||||
bugs/bug260.go
|
fixedbugs/bug266.go
|
||||||
|
fixedbugs/bug267.go
|
||||||
|
fixedbugs/bug268.go
|
||||||
|
fixedbugs/bug269.go
|
||||||
|
fixedbugs/bug270.go
|
||||||
|
fixedbugs/bug271.go
|
||||||
|
# fixedbugs/bug272.go # fail
|
||||||
|
fixedbugs/bug273.go
|
||||||
|
fixedbugs/bug275.go
|
||||||
|
fixedbugs/bug276.go
|
||||||
|
fixedbugs/bug277.go
|
||||||
|
fixedbugs/bug278.go
|
||||||
|
fixedbugs/bug279.go
|
||||||
|
fixedbugs/bug280.go
|
||||||
|
# fixedbugs/bug281.go # fail, BUG
|
||||||
|
fixedbugs/bug282.go
|
||||||
|
fixedbugs/bug283.go
|
||||||
|
fixedbugs/bug284.go
|
||||||
|
fixedbugs/bug285.go
|
||||||
|
fixedbugs/bug287.go
|
||||||
|
fixedbugs/bug288.go
|
||||||
|
# bugs/bug260.go # fail, BUG
|
||||||
|
# bugs/bug274.go # fail, BUG
|
||||||
|
# bugs/bug286.go # fail, BUG
|
||||||
|
@ -34,9 +34,14 @@ func calike(a, b complex128) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
bad := false
|
||||||
for _, t := range tests {
|
for _, t := range tests {
|
||||||
x := t.f/t.g
|
x := t.f/t.g
|
||||||
if !calike(x, t.out) {
|
if !calike(x, t.out) {
|
||||||
|
if !bad {
|
||||||
|
fmt.Printf("BUG\n")
|
||||||
|
bad = true
|
||||||
|
}
|
||||||
fmt.Printf("%v/%v: expected %v error; got %v\n", t.f, t.g, t.out, x)
|
fmt.Printf("%v/%v: expected %v error; got %v\n", t.f, t.g, t.out, x)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,20 @@
|
|||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
|
||||||
|
var deLim float64
|
||||||
|
var bad bool
|
||||||
|
|
||||||
|
func
|
||||||
|
init() {
|
||||||
|
if os.Getenv("GOARCH") == "arm" {
|
||||||
|
deLim = 1.0e-8
|
||||||
|
} else {
|
||||||
|
deLim = 10.e-14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func
|
func
|
||||||
pow10(pow int) float64 {
|
pow10(pow int) float64 {
|
||||||
if pow < 0 { return 1/pow10(-pow); }
|
if pow < 0 { return 1/pow10(-pow); }
|
||||||
@ -30,15 +44,18 @@ close(da float64, ia, ib int64, pow int) bool {
|
|||||||
de = -de;
|
de = -de;
|
||||||
}
|
}
|
||||||
|
|
||||||
if de < 1.0e-14 {
|
if de < deLim {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if !bad {
|
||||||
|
println("BUG")
|
||||||
|
bad = true
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
func
|
func
|
||||||
main() {
|
main() {
|
||||||
|
|
||||||
if !close(0., 0, 1, 0) { print("0. is ", 0., "\n"); }
|
if !close(0., 0, 1, 0) { print("0. is ", 0., "\n"); }
|
||||||
if !close(+10., 10, 1, 0) { print("+10. is ", +10., "\n"); }
|
if !close(+10., 10, 1, 0) { print("+10. is ", +10., "\n"); }
|
||||||
if !close(-210., -210, 1, 0) { print("-210. is ", -210., "\n"); }
|
if !close(-210., -210, 1, 0) { print("-210. is ", -210., "\n"); }
|
||||||
|
@ -9,13 +9,13 @@ package main
|
|||||||
import "math"
|
import "math"
|
||||||
|
|
||||||
type floatTest struct {
|
type floatTest struct {
|
||||||
name string;
|
name string
|
||||||
expr bool;
|
expr bool
|
||||||
want bool;
|
want bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var nan float64 = math.NaN();
|
var nan float64 = math.NaN()
|
||||||
var f float64 = 1;
|
var f float64 = 1
|
||||||
|
|
||||||
var tests = []floatTest{
|
var tests = []floatTest{
|
||||||
floatTest{"nan == nan", nan == nan, false},
|
floatTest{"nan == nan", nan == nan, false},
|
||||||
@ -75,14 +75,14 @@ var tests = []floatTest{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
bad := false;
|
bad := false
|
||||||
for _, t := range tests {
|
for _, t := range tests {
|
||||||
if t.expr != t.want {
|
if t.expr != t.want {
|
||||||
if !bad {
|
if !bad {
|
||||||
bad = true;
|
bad = true
|
||||||
println("BUG: floatcmp");
|
println("BUG: floatcmp")
|
||||||
}
|
}
|
||||||
println(t.name, "=", t.expr, "want", t.want);
|
println(t.name, "=", t.expr, "want", t.want)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,16 +19,58 @@ panic: runtime error: hash of unhashable type []int
|
|||||||
|
|
||||||
panic PC=xxx
|
panic PC=xxx
|
||||||
|
|
||||||
|
=========== ./deferprint.go
|
||||||
|
printing: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
||||||
|
42 true false true +1.755561e+000 world 0x0 [0/0]0x0 0x0 0x0 255
|
||||||
|
|
||||||
=========== ./helloworld.go
|
=========== ./helloworld.go
|
||||||
hello, world
|
hello, world
|
||||||
|
|
||||||
|
=========== ./peano.go
|
||||||
|
0! = 1
|
||||||
|
1! = 1
|
||||||
|
2! = 2
|
||||||
|
3! = 6
|
||||||
|
4! = 24
|
||||||
|
5! = 120
|
||||||
|
6! = 720
|
||||||
|
7! = 5040
|
||||||
|
8! = 40320
|
||||||
|
9! = 362880
|
||||||
|
|
||||||
=========== ./printbig.go
|
=========== ./printbig.go
|
||||||
-9223372036854775808
|
-9223372036854775808
|
||||||
9223372036854775807
|
9223372036854775807
|
||||||
|
|
||||||
|
=========== ./sigchld.go
|
||||||
|
survived SIGCHLD
|
||||||
|
|
||||||
|
=========== ./sinit.go
|
||||||
|
FAIL
|
||||||
|
|
||||||
=========== ./turing.go
|
=========== ./turing.go
|
||||||
Hello World!
|
Hello World!
|
||||||
|
|
||||||
|
=========== ken/cplx0.go
|
||||||
|
(+1.066132e-308+1.313301e-308i)
|
||||||
|
(+1.066132e-308+1.066132e-308i)
|
||||||
|
(+1.066132e-308+1.313301e-308i)
|
||||||
|
(+1.066132e-308+1.066132e-308i)
|
||||||
|
|
||||||
|
=========== ken/cplx3.go
|
||||||
|
(+1.362661e-308+2.270313e+000i)
|
||||||
|
(+1.362661e-308+2.270313e+000i)
|
||||||
|
64
|
||||||
|
|
||||||
|
=========== ken/cplx5.go
|
||||||
|
(+0.000000e+000+0.000000e+000i)
|
||||||
|
(+1.066132e-308+1.066132e-308i)
|
||||||
|
(+1.066132e-308+2.272661e+000i)
|
||||||
|
(+2.270313e+000+2.272661e+000i)
|
||||||
|
(+2.270313e+000+2.272661e+000i)
|
||||||
|
(+1.313272e-308+0.000000e+000i)
|
||||||
|
(+1.313272e-308+0.000000e+000i)
|
||||||
|
|
||||||
=========== ken/intervar.go
|
=========== ken/intervar.go
|
||||||
print 1 bio 2 file 3 -- abc
|
print 1 bio 2 file 3 -- abc
|
||||||
|
|
||||||
@ -50,6 +92,9 @@ hello world
|
|||||||
=========== ken/string.go
|
=========== ken/string.go
|
||||||
abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz
|
abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz
|
||||||
|
|
||||||
|
=========== chan/doubleselect.go
|
||||||
|
PASS
|
||||||
|
|
||||||
=========== chan/nonblock.go
|
=========== chan/nonblock.go
|
||||||
PASS
|
PASS
|
||||||
|
|
||||||
@ -104,7 +149,3 @@ panic PC=xxx
|
|||||||
panic: interface conversion: interface is main.T, not main.T
|
panic: interface conversion: interface is main.T, not main.T
|
||||||
|
|
||||||
panic PC=xxx
|
panic PC=xxx
|
||||||
|
|
||||||
=========== bugs/bug260.go
|
|
||||||
FAIL
|
|
||||||
BUG: bug260 failed
|
|
||||||
|
@ -39,6 +39,6 @@ func main() {
|
|||||||
// compiler used to crash on nested divide
|
// compiler used to crash on nested divide
|
||||||
c4 := cmplx(real(c3/2), imag(c3/2))
|
c4 := cmplx(real(c3/2), imag(c3/2))
|
||||||
if c4 != c3/2 {
|
if c4 != c3/2 {
|
||||||
fmt.Printf("c3 = %G != c4 = %G\n", c3, c4)
|
fmt.Printf("BUG: c3 = %G != c4 = %G\n", c3, c4)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
// [ $GOOS != nacl ] || exit 0 # NaCl runner elides NUL in output
|
// [ $GOOS != nacl ] || exit 0 # NaCl runner elides NUL in output
|
||||||
|
// [ $GORUN != "a" ] || exit 0 # Android runner gets confused by the NUL output
|
||||||
// $G $D/$F.go && $L $F.$A && ./$A.out >tmp.go &&
|
// $G $D/$F.go && $L $F.$A && ./$A.out >tmp.go &&
|
||||||
// errchk $G -e tmp.go
|
// errchk $G -e tmp.go
|
||||||
// rm -f tmp.go
|
// rm -f tmp.go
|
||||||
|
8
test/run
8
test/run
@ -63,11 +63,19 @@ do
|
|||||||
echo "===========" $i
|
echo "===========" $i
|
||||||
cat $TMP1FILE
|
cat $TMP1FILE
|
||||||
echo >&2 fail: $i
|
echo >&2 fail: $i
|
||||||
|
echo "# $i # fail" >>pass.out
|
||||||
elif test -s $TMP1FILE
|
elif test -s $TMP1FILE
|
||||||
then
|
then
|
||||||
echo
|
echo
|
||||||
echo "===========" $i
|
echo "===========" $i
|
||||||
cat $TMP1FILE
|
cat $TMP1FILE
|
||||||
|
if grep -q '^BUG' $TMP1FILE
|
||||||
|
then
|
||||||
|
echo >&2 fail: $i
|
||||||
|
echo "# $i # fail, BUG" >>pass.out
|
||||||
|
else
|
||||||
|
echo $i >>pass.out
|
||||||
|
fi
|
||||||
elif [ $dir = "bugs" ]
|
elif [ $dir = "bugs" ]
|
||||||
then
|
then
|
||||||
echo $i succeeded with no output.
|
echo $i succeeded with no output.
|
||||||
|
@ -137,6 +137,7 @@ func alike(a, b float64) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
bad := false
|
||||||
for _, t := range errorTests {
|
for _, t := range errorTests {
|
||||||
if t.err != "" && syscall.OS == "nacl" {
|
if t.err != "" && syscall.OS == "nacl" {
|
||||||
continue
|
continue
|
||||||
@ -161,6 +162,10 @@ func main() {
|
|||||||
for _, t := range floatTests {
|
for _, t := range floatTests {
|
||||||
x := t.f/t.g
|
x := t.f/t.g
|
||||||
if !alike(x, t.out) {
|
if !alike(x, t.out) {
|
||||||
|
if !bad {
|
||||||
|
bad = true
|
||||||
|
fmt.Printf("BUG\n")
|
||||||
|
}
|
||||||
fmt.Printf("%v/%v: expected %g error; got %g\n", t.f, t.g, t.out, x)
|
fmt.Printf("%v/%v: expected %g error; got %g\n", t.f, t.g, t.out, x)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user