1
0
mirror of https://github.com/golang/go synced 2024-11-24 23:37:56 -07:00

runtime: update arm softfloat - no more R12

R=ken2
CC=golang-dev
https://golang.org/cl/2555041
This commit is contained in:
Russ Cox 2010-10-18 12:24:59 -04:00
parent 18ccbda50c
commit 6ac08ba638

View File

@ -370,7 +370,8 @@ ret:
// 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;
uint64 f0, f1, mant0, mant1; uint64 f0, f1, mant0, mant1;
int32 exp0, exp1; int32 exp0, exp1;
@ -502,16 +503,14 @@ loadconst(uint32 *pc, uint32 *regs)
uint32 offset; uint32 offset;
uint32 *addr; uint32 *addr;
if (*pc & 0xfffff000 != 0xe59fb838 || if ((*pc & 0xfffff000) != 0xe59fb000 || (*(pc+1) & 0xffff8fff) != 0xed9b0100)
*(pc+1) != 0xe08bb00c ||
*(pc+2) & 0xffff8fff != 0xed9b0100)
goto undef; goto undef;
offset = *pc & 0xfff; offset = *pc & 0xfff;
addr = (uint32*)((uint8*)pc + offset + 8); addr = (uint32*)((uint8*)pc + offset + 8);
//printf("DEBUG: addr %p *addr %x final %p\n", addr, *addr, *addr + regs[12]); //printf("DEBUG: addr %p *addr %x final %p\n", addr, *addr, *addr + regs[12]);
regs[11] = *addr + regs[12]; regs[11] = *addr;
loadstore(pc + 2, regs); loadstore(pc + 1, regs);
goto ret; goto ret;
undef: undef:
@ -587,6 +586,8 @@ stepflt(uint32 *pc, uint32 *regs)
{ {
uint32 i, c; uint32 i, c;
//printf("stepflt %p %p\n", pc, *pc);
i = *pc; i = *pc;
// unconditional forward branches. // unconditional forward branches.
@ -622,12 +623,11 @@ stepflt(uint32 *pc, uint32 *regs)
} }
// lookahead for virtual instructions that span multiple arm instructions // lookahead for virtual instructions that span multiple arm instructions
c = ((*pc & 0x0f000000) >> 16) | c = ((*pc & 0x0f000000) >> 20) |
((*(pc + 1) & 0x0f000000) >> 20) | ((*(pc + 1) & 0x0f000000) >> 24);
((*(pc + 2) & 0x0f000000) >> 24); if(c == 0x5d) { // 0101 1101
if(c == 0x50d) { // 0101 0000 1101
loadconst(pc, regs); loadconst(pc, regs);
return 3; return 2;
} }
return 0; return 0;