diff options
Diffstat (limited to 'gcc-4.8/libgo/go/reflect/makefuncgo_386.go')
-rw-r--r-- | gcc-4.8/libgo/go/reflect/makefuncgo_386.go | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/gcc-4.8/libgo/go/reflect/makefuncgo_386.go b/gcc-4.8/libgo/go/reflect/makefuncgo_386.go index 0fac1f488..45dd2d759 100644 --- a/gcc-4.8/libgo/go/reflect/makefuncgo_386.go +++ b/gcc-4.8/libgo/go/reflect/makefuncgo_386.go @@ -15,7 +15,9 @@ import "unsafe" type i386Regs struct { esp uint32 eax uint32 // Value to return in %eax. - st0 uint64 // Value to return in %st(0). + st0 float64 // Value to return in %st(0). + sr bool // Set to true if hidden struct pointer. + sf bool // Set to true if returning float } // MakeFuncStubGo implements the 386 calling convention for MakeFunc. @@ -56,10 +58,13 @@ func MakeFuncStubGo(regs *i386Regs, c *makeFuncImpl) { in := make([]Value, 0, len(ftyp.in)) ap := uintptr(regs.esp) + regs.sr = false + regs.sf = false var retPtr unsafe.Pointer if retStruct { retPtr = *(*unsafe.Pointer)(unsafe.Pointer(ap)) ap += ptrSize + regs.sr = true } for _, rt := range ftyp.in { @@ -77,7 +82,7 @@ func MakeFuncStubGo(regs *i386Regs, c *makeFuncImpl) { // Call the real function. - out := c.fn(in) + out := c.call(in) if len(out) != len(ftyp.out) { panic("reflect: wrong return count from function created by MakeFunc") @@ -123,13 +128,16 @@ func MakeFuncStubGo(regs *i386Regs, c *makeFuncImpl) { v := out[0] w := v.iword() - if v.Kind() != Ptr && v.Kind() != UnsafePointer { - w = loadIword(unsafe.Pointer(w), v.typ.size) - } switch v.Kind() { - case Float32, Float64: - regs.st0 = uint64(uintptr(w)) - default: + case Ptr, UnsafePointer: regs.eax = uint32(uintptr(w)) + case Float32: + regs.st0 = float64(*(*float32)(unsafe.Pointer(w))) + regs.sf = true + case Float64: + regs.st0 = *(*float64)(unsafe.Pointer(w)) + regs.sf = true + default: + regs.eax = uint32(uintptr(loadIword(unsafe.Pointer(w), v.typ.size))) } } |