| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| #include "runtime.h" |
| |
| // returns number of bytes that the fp instruction is occupying |
| static uint32 |
| isfltinstr(uint32 *pc) |
| { |
| uint32 i; |
| uint32 c; |
| |
| i = *pc; |
| c = i >> 25 & 7; |
| |
| switch(c) { |
| case 6: // 110 |
| //printf(" %p coproc multi: %x\n", pc, i); |
| return 4; |
| case 7: // 111 |
| if (i>>24 & 1) return 0; // ignore swi |
| //printf(" %p coproc %x\n", pc, i); |
| return 4; |
| } |
| |
| // lookahead for virtual instructions that span multiple arm instructions |
| c = ((*pc & 0x0f000000) >> 16) | |
| ((*(pc + 1) & 0x0f000000) >> 20) | |
| ((*(pc + 2) & 0x0f000000) >> 24); |
| if(c == 0x50d) { |
| //printf(" %p coproc const %x\n", pc, i); |
| return 12; |
| } |
| |
| //printf(" %p %x\n", pc, i); |
| return 0; |
| } |
| |
| #pragma textflag 7 |
| uint32* |
| _sfloat2(uint32 *lr, uint32 r0) |
| { |
| uint32 skip; |
| |
| //printf("softfloat: pre %p\n", lr); |
| while(skip = isfltinstr(lr)) |
| lr += skip; |
| //printf(" post: %p\n", lr); |
| return lr; |
| } |
| |
| |