]> Cypherpunks repositories - gostls13.git/commitdiff
fix float <-> int64 conversions
authorKai Backman <kaib@golang.org>
Sun, 11 Oct 2009 05:06:26 +0000 (22:06 -0700)
committerKai Backman <kaib@golang.org>
Sun, 11 Oct 2009 05:06:26 +0000 (22:06 -0700)
R=rsc
APPROVED=rsc
DELTA=25  (25 added, 0 deleted, 0 changed)
OCL=35566
CL=35574

src/cmd/gc/sys.go
src/cmd/gc/walk.c
src/pkg/runtime/arm/vlrt.c

index b4c05a185f428f309c88e39b5e46f5ae3923d1ad..5e363292093836950c8afb0bad79a20d109578bb 100644 (file)
@@ -89,3 +89,5 @@ func int64div(int64, int64) int64
 func uint64div(uint64, uint64) uint64
 func int64mod(int64, int64) int64
 func uint64mod(uint64, uint64) uint64
+func float64toint64(float64) int64
+func int64tofloat64(int64) float64
index abbd37335b2a865fa1336b2286580a7a695230f8..e5aa1e726547c675eb4a75fd69225a10128a8531 100644 (file)
@@ -713,6 +713,16 @@ walkexpr(Node **np, NodeList **init)
 
        case OCONV:
        case OCONVNOP:
+               if(thechar == '5') {
+                       if(isfloat[n->left->type->etype] && (n->type->etype == TINT64)) {
+                               n = mkcall("float64toint64", n->type, init, conv(n->left, types[TFLOAT64]));
+                               goto ret;
+                       }
+                       if((n->left->type->etype == TINT64) && isfloat[n->type->etype]) {
+                               n = mkcall("int64tofloat64", n->type, init, conv(n->left, types[TINT64]));
+                               goto ret;
+                       }
+               }
                walkexpr(&n->left, init);
                goto ret;
 
index 03840f1f627fddc1e62062c182c2d0b2bd4866d2..a012b3e14efa9e05eee4c99a0fd4f5f6cf25da45 100755 (executable)
@@ -142,6 +142,12 @@ _f2v(Vlong *y, float f)
         _d2v(y, f);
 }
 
+void
+sys·float64toint64(double d, Vlong y)
+{
+       _d2v(&y, d);
+}
+
 double
 _v2d(Vlong x)
 {
@@ -162,6 +168,13 @@ _v2f(Vlong x)
         return _v2d(x);
 }
 
+void
+sys·int64tofloat64(Vlong y, double d)
+{
+       d = _v2d(y);
+}
+
+
 static void
 dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r)
 {