]> Cypherpunks repositories - gostls13.git/commit
reflect: add hooks for dealing with narrow width floats
authorMichael Anthony Knyszek <mknyszek@google.com>
Fri, 3 Sep 2021 21:35:59 +0000 (21:35 +0000)
committerMichael Knyszek <mknyszek@google.com>
Thu, 9 Sep 2021 16:48:19 +0000 (16:48 +0000)
commitea434450c26431332c4cc376996e2b917fd09873
treed6b96f2ca2222e60c345544bf491acf545f565fb
parenta53e3d5f885ca7a0df1cd6cf65faa5b63a802dce
reflect: add hooks for dealing with narrow width floats

Currently on amd64 and arm64, float32 values just live in the bottom 32
bits of the register, so reflect simply places them there in a RegArgs
for reflectcall to load them. This works fine because both of these
platforms don't care what the upper 32 bits are, and have instructions
to operate on float32 values specifically that we use. In sum, the
representation of the float32 in memory is identical to that of the
representation in a register.

On other platforms, however, the representation of FP values differ
depending on whether they're in memory or in a register. For instance,
on ppc64, all floating point values get promoted to a float64 when
loaded to a register (i.e. there's only one set of FP instructions). As
another example, on riscv64, narrow-width floats in registers need to be
NaN-boxed.

What all this means is that for supporting the register ABI on these
platforms, reflect needs to do a little extra work to ensure that the
representation of FP values in a RegArgs matches the representation it
takes on in a register. For this purpose, this change abstracts away the
action of storing values into a RegArgs a little bit and adds a
platform-specific hook which currently does nothing but copy the value.

For #40724.

Change-Id: I65dcc7d86d5602a584f86026ac204564617f4c5a
Reviewed-on: https://go-review.googlesource.com/c/go/+/347566
Trust: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/internal/abi/abi.go
src/reflect/abi.go
src/reflect/float32reg_generic.go [new file with mode: 0644]
src/reflect/value.go