x64: Refactor and fill out some gpr-vs-xmm bits (#6058)
* x64: Add instruction helpers for `mov{d,q}`
These will soon grow AVX-equivalents so move them to instruction helpers
to have clauses for AVX in the future.
* x64: Don't auto-convert between RegMemImm and XmmMemImm
The previous conversion, `mov_rmi_to_xmm`, would move from GPR registers
to XMM registers which isn't what many of the other `convert` statements
between these newtypes do. This seemed like a possible footgun so I've
removed the auto-conversion and added an explicit helper to go from a
`u32` to an `XmmMemImm`.
* x64: Add AVX encodings of some more GPR-related insns
This commit adds some more support for AVX instructions where GPRs are
in use mixed in with XMM registers. This required a few more variants of
`Inst` to handle the new instructions.
* Fix vpmovmskb encoding
* Fix xmm-to-gpr encoding of vmovd/vmovq
* Fix typo
* Fix rebase conflict
* Fix rebase conflict with tests
This commit is contained in:
104
cranelift/filetests/filetests/isa/x64/fcvt-avx.clif
Normal file
104
cranelift/filetests/filetests/isa/x64/fcvt-avx.clif
Normal file
@@ -0,0 +1,104 @@
|
||||
test compile precise-output
|
||||
set enable_simd
|
||||
target x86_64 has_avx
|
||||
|
||||
function %f3(i32) -> f32 {
|
||||
block0(v0: i32):
|
||||
v1 = fcvt_from_sint.f32 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vcvtsi2ss %edi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vcvtsi2ssl %edi, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f4(i64) -> f32 {
|
||||
block0(v0: i64):
|
||||
v1 = fcvt_from_sint.f32 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vcvtsi2ss %rdi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vcvtsi2ssq %rdi, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f7(i32) -> f64 {
|
||||
block0(v0: i32):
|
||||
v1 = fcvt_from_sint.f64 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vcvtsi2sd %edi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vcvtsi2sdl %edi, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f8(i64) -> f64 {
|
||||
block0(v0: i64):
|
||||
v1 = fcvt_from_sint.f64 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vcvtsi2sd %rdi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vcvtsi2sdq %rdi, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
104
cranelift/filetests/filetests/isa/x64/float-bitcast-avx.clif
Normal file
104
cranelift/filetests/filetests/isa/x64/float-bitcast-avx.clif
Normal file
@@ -0,0 +1,104 @@
|
||||
test compile precise-output
|
||||
set enable_simd
|
||||
target x86_64 has_avx
|
||||
|
||||
function %i32_to_f32(i32) -> f32 {
|
||||
block0(v0: i32):
|
||||
v1 = bitcast.f32 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovd %edi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovd %edi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %i64_to_f64(i64) -> f64 {
|
||||
block0(v0: i64):
|
||||
v1 = bitcast.f64 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovq %rdi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovq %rdi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f32_to_i32(f32) -> i32 {
|
||||
block0(v0: f32):
|
||||
v1 = bitcast.i32 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovd %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovd %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f64_to_i64(f64) -> i64 {
|
||||
block0(v0: f64):
|
||||
v1 = bitcast.i64 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovq %xmm0, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovq %xmm0, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
104
cranelift/filetests/filetests/isa/x64/float-bitcast.clif
Normal file
104
cranelift/filetests/filetests/isa/x64/float-bitcast.clif
Normal file
@@ -0,0 +1,104 @@
|
||||
test compile precise-output
|
||||
set enable_simd
|
||||
target x86_64
|
||||
|
||||
function %i32_to_f32(i32) -> f32 {
|
||||
block0(v0: i32):
|
||||
v1 = bitcast.f32 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movd %edi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movd %edi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %i64_to_f64(i64) -> f64 {
|
||||
block0(v0: i64):
|
||||
v1 = bitcast.f64 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movq %rdi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f32_to_i32(f32) -> i32 {
|
||||
block0(v0: f32):
|
||||
v1 = bitcast.i32 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movd %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movd %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f64_to_i64(f64) -> i64 {
|
||||
block0(v0: f64):
|
||||
v1 = bitcast.i64 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movq %xmm0, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movq %xmm0, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
@@ -920,7 +920,7 @@ block0(v0: i8x16, v1: i32):
|
||||
; vpunpcklbw %xmm0, %xmm0, %xmm5
|
||||
; vpunpckhbw %xmm0, %xmm0, %xmm7
|
||||
; addl %r9d, $8, %r9d
|
||||
; movd %r9d, %xmm11
|
||||
; vmovd %r9d, %xmm11
|
||||
; vpsraw %xmm5, %xmm11, %xmm13
|
||||
; vpsraw %xmm7, %xmm11, %xmm15
|
||||
; vpacksswb %xmm13, %xmm15, %xmm0
|
||||
@@ -938,7 +938,7 @@ block0(v0: i8x16, v1: i32):
|
||||
; vpunpcklbw %xmm0, %xmm0, %xmm5
|
||||
; vpunpckhbw %xmm0, %xmm0, %xmm7
|
||||
; addl $8, %r9d
|
||||
; movd %r9d, %xmm11
|
||||
; vmovd %r9d, %xmm11
|
||||
; vpsraw %xmm11, %xmm5, %xmm13
|
||||
; vpsraw %xmm11, %xmm7, %xmm15
|
||||
; vpacksswb %xmm15, %xmm13, %xmm0
|
||||
@@ -992,7 +992,7 @@ block0(v0: i16x8, v1: i32):
|
||||
; block0:
|
||||
; movq %rdi, %rcx
|
||||
; andq %rcx, $15, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsraw %xmm0, %xmm5, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1005,7 +1005,7 @@ block0(v0: i16x8, v1: i32):
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %rcx
|
||||
; andq $0xf, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsraw %xmm5, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1049,7 +1049,7 @@ block0(v0: i32x4, v1: i32):
|
||||
; block0:
|
||||
; movq %rdi, %rcx
|
||||
; andq %rcx, $31, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsrad %xmm0, %xmm5, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1062,7 +1062,7 @@ block0(v0: i32x4, v1: i32):
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %rcx
|
||||
; andq $0x1f, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsrad %xmm5, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1315,7 +1315,7 @@ block0(v0: i8):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; uninit %xmm4
|
||||
; vpxor %xmm4, %xmm4, %xmm6
|
||||
; vpshufb %xmm2, %xmm6, %xmm0
|
||||
@@ -1328,7 +1328,7 @@ block0(v0: i8):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpxor %xmm4, %xmm4, %xmm6
|
||||
; vpshufb %xmm6, %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
@@ -1389,7 +1389,7 @@ block0(v0: i8x16, v1: i32):
|
||||
; block0:
|
||||
; movq %rdi, %r10
|
||||
; andq %r10, $7, %r10
|
||||
; movd %r10d, %xmm5
|
||||
; vmovd %r10d, %xmm5
|
||||
; vpsllw %xmm0, %xmm5, %xmm7
|
||||
; lea const(0), %rsi
|
||||
; shlq $4, %r10, %r10
|
||||
@@ -1406,7 +1406,7 @@ block0(v0: i8x16, v1: i32):
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %r10
|
||||
; andq $7, %r10
|
||||
; movd %r10d, %xmm5
|
||||
; vmovd %r10d, %xmm5
|
||||
; vpsllw %xmm5, %xmm0, %xmm7
|
||||
; leaq 0x15(%rip), %rsi
|
||||
; shlq $4, %r10
|
||||
@@ -1461,7 +1461,7 @@ block0(v0: i16x8, v1: i32):
|
||||
; block0:
|
||||
; movq %rdi, %rcx
|
||||
; andq %rcx, $15, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsllw %xmm0, %xmm5, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1474,7 +1474,7 @@ block0(v0: i16x8, v1: i32):
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %rcx
|
||||
; andq $0xf, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsllw %xmm5, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1518,7 +1518,7 @@ block0(v0: i32x4, v1: i32):
|
||||
; block0:
|
||||
; movq %rdi, %rcx
|
||||
; andq %rcx, $31, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpslld %xmm0, %xmm5, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1531,7 +1531,7 @@ block0(v0: i32x4, v1: i32):
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %rcx
|
||||
; andq $0x1f, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpslld %xmm5, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1575,7 +1575,7 @@ block0(v0: i64x2, v1: i32):
|
||||
; block0:
|
||||
; movq %rdi, %rcx
|
||||
; andq %rcx, $63, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsllq %xmm0, %xmm5, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1588,7 +1588,7 @@ block0(v0: i64x2, v1: i32):
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %rcx
|
||||
; andq $0x3f, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsllq %xmm5, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1632,7 +1632,7 @@ block0(v0: i8x16, v1: i32):
|
||||
; block0:
|
||||
; movq %rdi, %r10
|
||||
; andq %r10, $7, %r10
|
||||
; movd %r10d, %xmm5
|
||||
; vmovd %r10d, %xmm5
|
||||
; vpsrlw %xmm0, %xmm5, %xmm7
|
||||
; lea const(0), %rsi
|
||||
; shlq $4, %r10, %r10
|
||||
@@ -1648,7 +1648,7 @@ block0(v0: i8x16, v1: i32):
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %r10
|
||||
; andq $7, %r10
|
||||
; movd %r10d, %xmm5
|
||||
; vmovd %r10d, %xmm5
|
||||
; vpsrlw %xmm5, %xmm0, %xmm7
|
||||
; leaq 0x15(%rip), %rsi
|
||||
; shlq $4, %r10
|
||||
@@ -1713,7 +1713,7 @@ block0(v0: i16x8, v1: i32):
|
||||
; block0:
|
||||
; movq %rdi, %rcx
|
||||
; andq %rcx, $15, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsrlw %xmm0, %xmm5, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1726,7 +1726,7 @@ block0(v0: i16x8, v1: i32):
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %rcx
|
||||
; andq $0xf, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsrlw %xmm5, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1770,7 +1770,7 @@ block0(v0: i32x4, v1: i32):
|
||||
; block0:
|
||||
; movq %rdi, %rcx
|
||||
; andq %rcx, $31, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsrld %xmm0, %xmm5, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1783,7 +1783,7 @@ block0(v0: i32x4, v1: i32):
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %rcx
|
||||
; andq $0x1f, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsrld %xmm5, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1827,7 +1827,7 @@ block0(v0: i64x2, v1: i32):
|
||||
; block0:
|
||||
; movq %rdi, %rcx
|
||||
; andq %rcx, $63, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsrlq %xmm0, %xmm5, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1840,7 +1840,7 @@ block0(v0: i64x2, v1: i32):
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %rcx
|
||||
; andq $0x3f, %rcx
|
||||
; movd %ecx, %xmm5
|
||||
; vmovd %ecx, %xmm5
|
||||
; vpsrlq %xmm5, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
|
||||
@@ -41,7 +41,7 @@ block0(v0: i64):
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movl $-2147483648, %eax
|
||||
; movd %eax, %xmm4
|
||||
; vmovd %eax, %xmm4
|
||||
; vandnps %xmm4, const(0), %xmm6
|
||||
; vandps %xmm4, 0(%rdi), %xmm8
|
||||
; vorps %xmm6, %xmm8, %xmm0
|
||||
@@ -55,7 +55,7 @@ block0(v0: i64):
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movl $0x80000000, %eax
|
||||
; movd %eax, %xmm4
|
||||
; vmovd %eax, %xmm4
|
||||
; vandnps 0x1b(%rip), %xmm4, %xmm6
|
||||
; vandps (%rdi), %xmm4, %xmm8
|
||||
; vorps %xmm8, %xmm6, %xmm0
|
||||
|
||||
@@ -12,7 +12,7 @@ block0(v0: i8):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; uninit %xmm4
|
||||
; vpxor %xmm4, %xmm4, %xmm6
|
||||
; vpshufb %xmm2, %xmm6, %xmm0
|
||||
@@ -25,7 +25,7 @@ block0(v0: i8):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpxor %xmm4, %xmm4, %xmm6
|
||||
; vpshufb %xmm6, %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
@@ -42,7 +42,7 @@ block0(v0: i16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpshuflw $0, %xmm2, %xmm4
|
||||
; vpshufd $0, %xmm4, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
@@ -54,7 +54,7 @@ block0(v0: i16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpshuflw $0, %xmm2, %xmm4
|
||||
; vpshufd $0, %xmm4, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
@@ -71,7 +71,7 @@ block0(v0: i32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpshufd $0, %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -82,7 +82,7 @@ block0(v0: i32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpshufd $0, %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -98,7 +98,7 @@ block0(v0: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movq %rdi, %xmm2
|
||||
; vmovq %rdi, %xmm2
|
||||
; vmovddup %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -109,7 +109,7 @@ block0(v0: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %xmm2
|
||||
; vmovq %rdi, %xmm2
|
||||
; vmovddup %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
|
||||
@@ -12,7 +12,7 @@ block0(v0: i8):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpbroadcastb %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -23,7 +23,7 @@ block0(v0: i8):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpbroadcastb %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -39,7 +39,7 @@ block0(v0: i16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpbroadcastw %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -50,7 +50,7 @@ block0(v0: i16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpbroadcastw %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -66,7 +66,7 @@ block0(v0: i32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpbroadcastd %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -77,7 +77,7 @@ block0(v0: i32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movd %edi, %xmm2
|
||||
; vmovd %edi, %xmm2
|
||||
; vpbroadcastd %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -93,7 +93,7 @@ block0(v0: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movq %rdi, %xmm2
|
||||
; vmovq %rdi, %xmm2
|
||||
; vmovddup %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -104,7 +104,7 @@ block0(v0: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movq %rdi, %xmm2
|
||||
; vmovq %rdi, %xmm2
|
||||
; vmovddup %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
|
||||
108
cranelift/filetests/filetests/isa/x64/vhigh_bits-avx.clif
Normal file
108
cranelift/filetests/filetests/isa/x64/vhigh_bits-avx.clif
Normal file
@@ -0,0 +1,108 @@
|
||||
test compile precise-output
|
||||
set enable_simd
|
||||
target x86_64 has_avx
|
||||
|
||||
function %f1(i8x16) -> i8 {
|
||||
block0(v0: i8x16):
|
||||
v1 = vhigh_bits.i8 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpmovmskb %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpmovmskb %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f3(i16x8) -> i8 {
|
||||
block0(v0: i16x8):
|
||||
v1 = vhigh_bits.i8 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpacksswb %xmm0, %xmm0, %xmm2
|
||||
; vpmovmskb %xmm2, %eax
|
||||
; shrq $8, %rax, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpacksswb %xmm0, %xmm0, %xmm2
|
||||
; vpmovmskb %xmm2, %eax
|
||||
; shrq $8, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f4(i32x4) -> i8 {
|
||||
block0(v0: i32x4):
|
||||
v1 = vhigh_bits.i8 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovmskps %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovmskps %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f5(i64x2) -> i8 {
|
||||
block0(v0: i64x2):
|
||||
v1 = vhigh_bits.i8 v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovmskpd %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovmskpd %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
Reference in New Issue
Block a user