]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.11] cmd/compile: use correct store types in softfloat
authorCherry Zhang <cherryyz@google.com>
Sat, 17 Nov 2018 03:53:04 +0000 (22:53 -0500)
committerFilippo Valsorda <filippo@golang.org>
Fri, 14 Dec 2018 19:54:21 +0000 (19:54 +0000)
When using softfloat, floating point ops are rewritten to integer
ops. The types of store ops were not rewritten. This may lower
to floating point stores, which are problematic. This CL fixes
this by rewriting the store types as well.

This fixes test/fixedbugs/issue28688.go on Wasm. Softfloat mode
is not used by default on Wasm, and it is not needed as Wasm spec
supports floating points. But it is nice to have the correct
types.

Change-Id: Ib5e19e19fa9491b15c2f60320f8724cace5cefb5
Reviewed-on: https://go-review.googlesource.com/c/149965
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
(cherry picked from commit 63a3993a336714f95400e3e614064d4ae72995de)
Reviewed-on: https://go-review.googlesource.com/c/151344
Reviewed-by: Filippo Valsorda <filippo@golang.org>
src/cmd/compile/internal/ssa/softfloat.go

index 39829b046c5dc05f2b027bf2fb89f5f14bb7a391..4afb94057d0bc4393b0fceef7e2787173d6d3ecc 100644 (file)
@@ -4,7 +4,10 @@
 
 package ssa
 
-import "math"
+import (
+       "cmd/compile/internal/types"
+       "math"
+)
 
 func softfloat(f *Func) {
        if !f.Config.SoftFloat {
@@ -53,6 +56,15 @@ func softfloat(f *Func) {
                                        v.Type = f.Config.Types.UInt64
                                }
                                newInt64 = newInt64 || v.Type.Size() == 8
+                       } else if (v.Op == OpStore || v.Op == OpZero || v.Op == OpMove) && v.Aux.(*types.Type).IsFloat() {
+                               switch size := v.Aux.(*types.Type).Size(); size {
+                               case 4:
+                                       v.Aux = f.Config.Types.UInt32
+                               case 8:
+                                       v.Aux = f.Config.Types.UInt64
+                               default:
+                                       v.Fatalf("bad float type with size %d", size)
+                               }
                        }
                }
        }