1
0
mirror of https://github.com/golang/go synced 2024-11-24 04:40:24 -07:00

reflect: implement float32 for regabi riscv64

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>
This commit is contained in:
Meng Zhuo 2022-04-29 15:28:03 +08:00 committed by mzh
parent 7cf3268666
commit 93218ea1a7
3 changed files with 36 additions and 1 deletions

View 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

View File

@ -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

View File

@ -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