]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: update arm softfloat - no more R12
authorRuss Cox <rsc@golang.org>
Mon, 18 Oct 2010 16:24:59 +0000 (12:24 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 18 Oct 2010 16:24:59 +0000 (12:24 -0400)
R=ken2
CC=golang-dev
https://golang.org/cl/2555041

src/pkg/runtime/arm/softfloat.c

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