54 lines
1.1 KiB
Go
54 lines
1.1 KiB
Go
|
|
//go:build ignore
|
||
|
|
// +build ignore
|
||
|
|
|
||
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
. "github.com/mmcloughlin/avo/build"
|
||
|
|
. "github.com/mmcloughlin/avo/operand"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Float32 generates a function which indexes into an array of single-precision
|
||
|
|
// integer float values.
|
||
|
|
func Float32() {
|
||
|
|
f32 := GLOBL("f32", RODATA|NOPTR)
|
||
|
|
for i := 0; i < 10; i++ {
|
||
|
|
DATA(4*i, F32(i))
|
||
|
|
}
|
||
|
|
|
||
|
|
TEXT("Float32", NOSPLIT, "func(i int) float32")
|
||
|
|
Doc("Float32 indexes into an array of single-precision integral floats.")
|
||
|
|
i := Load(Param("i"), GP64())
|
||
|
|
ptr := Mem{Base: GP64()}
|
||
|
|
LEAQ(f32, ptr.Base)
|
||
|
|
x := XMM()
|
||
|
|
MOVSS(ptr.Idx(i, 4), x)
|
||
|
|
Store(x, ReturnIndex(0))
|
||
|
|
RET()
|
||
|
|
}
|
||
|
|
|
||
|
|
// Float64 generates a function which indexes into an array of double-precision
|
||
|
|
// integer float values.
|
||
|
|
func Float64() {
|
||
|
|
f64 := GLOBL("f64", RODATA|NOPTR)
|
||
|
|
for i := 0; i < 10; i++ {
|
||
|
|
DATA(8*i, F64(i))
|
||
|
|
}
|
||
|
|
|
||
|
|
TEXT("Float64", NOSPLIT, "func(i int) float64")
|
||
|
|
Doc("Float64 indexes into an array of double-precision integral floats.")
|
||
|
|
i := Load(Param("i"), GP64())
|
||
|
|
ptr := Mem{Base: GP64()}
|
||
|
|
LEAQ(f64, ptr.Base)
|
||
|
|
x := XMM()
|
||
|
|
MOVSD(ptr.Idx(i, 8), x)
|
||
|
|
Store(x, ReturnIndex(0))
|
||
|
|
RET()
|
||
|
|
}
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
Float32()
|
||
|
|
Float64()
|
||
|
|
Generate()
|
||
|
|
}
|