]> Cypherpunks repositories - gostls13.git/commitdiff
reflect: implement float32 for regabi riscv64
authorMeng Zhuo <mzh@golangcn.org>
Fri, 29 Apr 2022 07:28:03 +0000 (15:28 +0800)
committermzh <mzh@golangcn.org>
Wed, 4 May 2022 13:38:32 +0000 (13:38 +0000)
This CL implement archFloat32FromReg and archFloat32ToReg
need for riscv64 due to differences in the way float32 are
represented in registers as compared to other platforms.

Change-Id: I5eab27df242f84b387b0c8dc7f347c93b3fd9df0
Reviewed-on: https://go-review.googlesource.com/c/go/+/403134
Run-TryBot: mzh <mzh@golangcn.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/reflect/float32reg_generic.go
src/reflect/float32reg_riscv64.s [new file with mode: 0644]
src/reflect/stubs_riscv64.go [new file with mode: 0644]

index 307c0bb33c1c7c94bc33dd45d4f4f5e73d191c21..23ad4bf285b24873342e5e565228d2c66a08203f 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build !ppc64 && !ppc64le
+//go:build !ppc64 && !ppc64le && !riscv64
 
 package reflect
 
diff --git a/src/reflect/float32reg_riscv64.s b/src/reflect/float32reg_riscv64.s
new file mode 100644 (file)
index 0000000..8fcf3ba
--- /dev/null
@@ -0,0 +1,27 @@
+// Copyright 2022 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 "textflag.h"
+
+// riscv64 allows 32-bit floats to live in the bottom
+// part of the register, it expects them to be NaN-boxed.
+// These functions are needed to ensure correct conversions
+// on riscv64.
+
+// Convert float32->uint64
+TEXT ·archFloat32ToReg(SB),NOSPLIT,$0-16
+       MOVF    val+0(FP), F1
+       MOVD    F1, ret+8(FP)
+       RET
+
+// Convert uint64->float32
+TEXT ·archFloat32FromReg(SB),NOSPLIT,$0-12
+       // Normally a float64->float32 conversion
+       // would need rounding, but riscv64 store valid
+       // float32 in the lower 32 bits, thus we only need to
+       // unboxed the NaN-box by store a float32.
+       MOVD    reg+0(FP), F1
+       MOVF    F1, ret+8(FP)
+       RET
+
diff --git a/src/reflect/stubs_riscv64.go b/src/reflect/stubs_riscv64.go
new file mode 100644 (file)
index 0000000..a72ebab
--- /dev/null
@@ -0,0 +1,8 @@
+// Copyright 2022 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.
+
+package reflect
+
+func archFloat32FromReg(reg uint64) float32
+func archFloat32ToReg(val float32) uint64