diff options
Diffstat (limited to 'src/pkg/runtime/softfloat_arm.c')
-rw-r--r-- | src/pkg/runtime/softfloat_arm.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/src/pkg/runtime/softfloat_arm.c b/src/pkg/runtime/softfloat_arm.c index 6b3716011..5e5f4025e 100644 --- a/src/pkg/runtime/softfloat_arm.c +++ b/src/pkg/runtime/softfloat_arm.c @@ -606,20 +606,43 @@ struct Sfregs uint32 cspr; }; +static void sfloat2(void); + #pragma textflag NOSPLIT uint32* runtime·_sfloat2(uint32 *lr, Sfregs regs) { + void (*fn)(void); + + g->m->ptrarg[0] = lr; + g->m->ptrarg[1] = ®s; + fn = sfloat2; + runtime·onM(&fn); + lr = g->m->ptrarg[0]; + g->m->ptrarg[0] = nil; + return lr; +} + +static void +sfloat2(void) +{ + uint32 *lr; + Sfregs *regs; uint32 skip; + + lr = g->m->ptrarg[0]; + regs = g->m->ptrarg[1]; + g->m->ptrarg[0] = nil; + g->m->ptrarg[1] = nil; - skip = stepflt(lr, (uint32*)®s.r0); + skip = stepflt(lr, (uint32*)®s->r0); if(skip == 0) { runtime·printf("sfloat2 %p %x\n", lr, *lr); fabort(); // not ok to fail first instruction } lr += skip; - while(skip = stepflt(lr, (uint32*)®s.r0)) + while(skip = stepflt(lr, (uint32*)®s->r0)) lr += skip; - return lr; + g->m->ptrarg[0] = lr; } |