x64: Lower extractlane, scalar_to_vector, and splat in ISLE (#4780)

Lower extractlane, scalar_to_vector and splat in ISLE.

This PR also makes some changes to the SinkableLoad api
* change the return type of sink_load to RegMem as there are more functions available for dealing with RegMem
* add reg_mem_to_reg_mem_imm and register it as an automatic conversion
This commit is contained in:
Trevor Elliott
2022-08-25 09:38:03 -07:00
committed by GitHub
parent d3c463aac0
commit 9386409607
10 changed files with 285 additions and 251 deletions

View File

@@ -0,0 +1,87 @@
test compile precise-output
target x86_64
function %f1(i8x16) -> i8 {
block0(v0: i8x16):
v1 = extractlane v0, 1
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pextrb $1, %xmm0, %rax
; movq %rbp, %rsp
; popq %rbp
; ret
function %f2(i16x8) -> i16 {
block0(v0: i16x8):
v1 = extractlane v0, 1
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pextrw $1, %xmm0, %rax
; movq %rbp, %rsp
; popq %rbp
; ret
function %f3(i32x4) -> i32 {
block0(v0: i32x4):
v1 = extractlane v0, 1
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pextrd $1, %xmm0, %rax
; movq %rbp, %rsp
; popq %rbp
; ret
function %f4(i64x2) -> i64 {
block0(v0: i64x2):
v1 = extractlane v0, 1
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pextrd.w $1, %xmm0, %rax
; movq %rbp, %rsp
; popq %rbp
; ret
function %f5(f32x4) -> f32 {
block0(v0: f32x4):
v1 = extractlane v0, 1
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pshufd $1, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
function %f6(f64x2) -> f64 {
block0(v0: f64x2):
v1 = extractlane v0, 1
return v1
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pshufd $238, %xmm0, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret

View File

@@ -74,8 +74,8 @@ block0(v0: i8):
; block0:
; uninit %xmm0
; pinsrb $0, %xmm0, %rdi, %xmm0
; pxor %xmm6, %xmm6, %xmm6
; pshufb %xmm0, %xmm6, %xmm0
; pxor %xmm7, %xmm7, %xmm7
; pshufb %xmm0, %xmm7, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -90,11 +90,11 @@ block0:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $65535, %eax
; uninit %xmm0
; pinsrw $0, %xmm0, %rax, %xmm0
; pinsrw $1, %xmm0, %rax, %xmm0
; pshufd $0, %xmm0, %xmm0
; movl $65535, %edi
; uninit %xmm5
; pinsrw $0, %xmm5, %rdi, %xmm5
; pinsrw $1, %xmm5, %rdi, %xmm5
; pshufd $0, %xmm5, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -108,9 +108,9 @@ block0(v0: i32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; uninit %xmm0
; pinsrd $0, %xmm0, %rdi, %xmm0
; pshufd $0, %xmm0, %xmm0
; uninit %xmm4
; pinsrd $0, %xmm4, %rdi, %xmm4
; pshufd $0, %xmm4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -124,11 +124,11 @@ block0(v0: f64):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movdqa %xmm0, %xmm4
; movdqa %xmm0, %xmm6
; uninit %xmm0
; movdqa %xmm4, %xmm5
; movsd %xmm0, %xmm5, %xmm0
; movlhps %xmm0, %xmm5, %xmm0
; movdqa %xmm6, %xmm7
; movsd %xmm0, %xmm7, %xmm0
; movlhps %xmm0, %xmm7, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret