x64: Lower bitcast, fabs, and fneg in ISLE (#4729)

* Add tests for bitcast

* Migrate bitcast to ISLE

* Add tests for fabs

* Lower fabs in ISLE

* Add tests for fneg

* Lower fneg in ISLE
This commit is contained in:
Trevor Elliott
2022-08-18 17:59:23 -07:00
committed by GitHub
parent 5ec92d59d2
commit 80c77da334
9 changed files with 279 additions and 159 deletions

View File

@@ -0,0 +1,59 @@
test compile precise-output
target x86_64
function %f1(f32) -> i32 {
block0(v0: f32):
v1 = bitcast.i32 v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movd %xmm0, %eax
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(i32) -> f32 {
block0(v0: i32):
v1 = bitcast.f32 v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movd %edi, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f3(f64) -> i64 {
block0(v0: f64):
v1 = bitcast.i64 v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movq %xmm0, %rax
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(i64) -> f64 {
block0(v0: i64):
v1 = bitcast.f64 v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movq %rdi, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -0,0 +1,67 @@
test compile precise-output
target x86_64
function %f1(f32) -> f32 {
block0(v0: f32):
v1 = fabs v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $2147483647, %ecx
; movd %ecx, %xmm5
; andps %xmm0, %xmm5, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(f64) -> f64 {
block0(v0: f64):
v1 = fabs v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movabsq $9223372036854775807, %rcx
; movq %rcx, %xmm5
; andpd %xmm0, %xmm5, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f3(f32x4) -> f32x4 {
block0(v0: f32x4):
v1 = fabs v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pcmpeqd %xmm4, %xmm4, %xmm4
; psrld %xmm4, $1, %xmm4
; andps %xmm0, %xmm4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(f64x2) -> f64x2 {
block0(v0: f64x2):
v1 = fabs v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pcmpeqd %xmm4, %xmm4, %xmm4
; psrlq %xmm4, $1, %xmm4
; andpd %xmm0, %xmm4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -10,11 +10,9 @@ block0(v0: f64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movdqa %xmm0, %xmm5
; movabsq $9223372036854775807, %rdx
; movq %rdx, %xmm0
; movdqa %xmm5, %xmm7
; andpd %xmm0, %xmm7, %xmm0
; movabsq $9223372036854775807, %rcx
; movq %rcx, %xmm5
; andpd %xmm0, %xmm5, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -29,10 +27,10 @@ block0(v0: i64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movsd 0(%rdi), %xmm5
; movabsq $9223372036854775807, %r8
; movq %r8, %xmm0
; andpd %xmm0, %xmm5, %xmm0
; movsd 0(%rdi), %xmm0
; movabsq $9223372036854775807, %rdx
; movq %rdx, %xmm6
; andpd %xmm0, %xmm6, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -0,0 +1,67 @@
test compile precise-output
target x86_64
function %f1(f32) -> f32 {
block0(v0: f32):
v1 = fneg v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $-2147483648, %ecx
; movd %ecx, %xmm5
; xorps %xmm0, %xmm5, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(f64) -> f64 {
block0(v0: f64):
v1 = fneg v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movabsq $-9223372036854775808, %rcx
; movq %rcx, %xmm5
; xorpd %xmm0, %xmm5, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f3(f32x4) -> f32x4 {
block0(v0: f32x4):
v1 = fneg v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pcmpeqd %xmm4, %xmm4, %xmm4
; pslld %xmm4, $31, %xmm4
; xorps %xmm0, %xmm4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(f64x2) -> f64x2 {
block0(v0: f64x2):
v1 = fneg v0
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pcmpeqd %xmm4, %xmm4, %xmm4
; psllq %xmm4, $63, %xmm4
; xorpd %xmm0, %xmm4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret