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:
87
cranelift/filetests/filetests/isa/x64/extractlane.clif
Normal file
87
cranelift/filetests/filetests/isa/x64/extractlane.clif
Normal 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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user