x64: Lower fcopysign, ceil, floor, nearest, and trunc in ISLE (#4730)

https://github.com/bytecodealliance/wasmtime/pull/4730
This commit is contained in:
Trevor Elliott
2022-08-22 13:57:36 -07:00
committed by GitHub
parent bb0b6dafde
commit cee4b209f3
14 changed files with 605 additions and 111 deletions

View File

@@ -0,0 +1,33 @@
test compile precise-output
target x86_64 has_sse41=false
function %f1(f32) -> f32 {
block0(v0: f32):
v1 = ceil v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; load_ext_name %CeilF32+0, %r8
; call *%r8
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(f64) -> f64 {
block0(v0: f64):
v1 = ceil v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; load_ext_name %CeilF64+0, %r8
; call *%r8
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -0,0 +1,59 @@
test compile precise-output
target x86_64 has_sse41=true
function %f1(f32) -> f32 {
block0(v0: f32):
v1 = ceil v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundss $2, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(f64) -> f64 {
block0(v0: f64):
v1 = ceil v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundsd $2, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(f32x4) -> f32x4 {
block0(v0: f32x4):
v1 = ceil v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundps $2, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(f64x2) -> f64x2 {
block0(v0: f64x2):
v1 = ceil v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundpd $2, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -0,0 +1,43 @@
test compile precise-output
target x86_64
function %f1(f32, f32) -> f32 {
block0(v0: f32, v1: f32):
v2 = fcopysign v0, v1
return v2
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $-2147483648, %r8d
; movd %r8d, %xmm9
; movdqa %xmm0, %xmm14
; movdqa %xmm9, %xmm0
; andnps %xmm0, %xmm14, %xmm0
; andps %xmm9, %xmm1, %xmm9
; orps %xmm0, %xmm9, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f1(f64, f64) -> f64 {
block0(v0: f64, v1: f64):
v2 = fcopysign v0, v1
return v2
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movabsq $-9223372036854775808, %r8
; movq %r8, %xmm9
; movdqa %xmm0, %xmm14
; movdqa %xmm9, %xmm0
; andnpd %xmm0, %xmm14, %xmm0
; andpd %xmm9, %xmm1, %xmm9
; orpd %xmm0, %xmm9, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -0,0 +1,33 @@
test compile precise-output
target x86_64 has_sse41=false
function %f1(f32) -> f32 {
block0(v0: f32):
v1 = floor v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; load_ext_name %FloorF32+0, %r8
; call *%r8
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(f64) -> f64 {
block0(v0: f64):
v1 = floor v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; load_ext_name %FloorF64+0, %r8
; call *%r8
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -0,0 +1,59 @@
test compile precise-output
target x86_64 has_sse41=true
function %f1(f32) -> f32 {
block0(v0: f32):
v1 = floor v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundss $1, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(f64) -> f64 {
block0(v0: f64):
v1 = floor v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundsd $1, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(f32x4) -> f32x4 {
block0(v0: f32x4):
v1 = floor v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundps $1, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(f64x2) -> f64x2 {
block0(v0: f64x2):
v1 = floor v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundpd $1, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -0,0 +1,33 @@
test compile precise-output
target x86_64 has_sse41=false
function %f1(f32) -> f32 {
block0(v0: f32):
v1 = nearest v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; load_ext_name %NearestF32+0, %r8
; call *%r8
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(f64) -> f64 {
block0(v0: f64):
v1 = nearest v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; load_ext_name %NearestF64+0, %r8
; call *%r8
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -0,0 +1,59 @@
test compile precise-output
target x86_64 has_sse41=true
function %f1(f32) -> f32 {
block0(v0: f32):
v1 = nearest v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundss $0, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(f64) -> f64 {
block0(v0: f64):
v1 = nearest v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundsd $0, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(f32x4) -> f32x4 {
block0(v0: f32x4):
v1 = nearest v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundps $0, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(f64x2) -> f64x2 {
block0(v0: f64x2):
v1 = nearest v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundpd $0, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -0,0 +1,33 @@
test compile precise-output
target x86_64 has_sse41=false
function %f1(f32) -> f32 {
block0(v0: f32):
v1 = trunc v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; load_ext_name %TruncF32+0, %r8
; call *%r8
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(f64) -> f64 {
block0(v0: f64):
v1 = trunc v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; load_ext_name %TruncF64+0, %r8
; call *%r8
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -0,0 +1,59 @@
test compile precise-output
target x86_64 has_sse41=true
function %f1(f32) -> f32 {
block0(v0: f32):
v1 = trunc v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundss $3, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(f64) -> f64 {
block0(v0: f64):
v1 = trunc v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundsd $3, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(f32x4) -> f32x4 {
block0(v0: f32x4):
v1 = trunc v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundps $3, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(f64x2) -> f64x2 {
block0(v0: f64x2):
v1 = trunc v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; roundpd $3, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret