x64: Improve memory support in {insert,extract}lane (#5982)
* x64: Improve memory support in `{insert,extract}lane`
This commit improves adds support to Cranelift to emit `pextr{b,w,d,q}`
with a memory destination, merging a store-of-extract operation into one
instruction. Additionally AVX support is added for the `pextr*`
instructions.
I've additionally tried to ensure that codegen tests and runtests exist
for all forms of these instructions too.
* Add missing commas
* Fix tests
This commit is contained in:
309
cranelift/filetests/filetests/isa/x64/extractlane-avx.clif
Normal file
309
cranelift/filetests/filetests/isa/x64/extractlane-avx.clif
Normal file
@@ -0,0 +1,309 @@
|
||||
test compile precise-output
|
||||
target x86_64 has_avx
|
||||
|
||||
function %f1(i8x16) -> i8 {
|
||||
block0(v0: i8x16):
|
||||
v1 = extractlane v0, 1
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpextrb $1, %xmm0, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpextrb $1, %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f2(i16x8) -> i16 {
|
||||
block0(v0: i16x8):
|
||||
v1 = extractlane v0, 1
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpextrw $1, %xmm0, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpextrw $1, %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f3(i32x4) -> i32 {
|
||||
block0(v0: i32x4):
|
||||
v1 = extractlane v0, 1
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpextrd $1, %xmm0, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpextrd $1, %xmm0, %eax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f4(i64x2) -> i64 {
|
||||
block0(v0: i64x2):
|
||||
v1 = extractlane v0, 1
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpextrq $1, %xmm0, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpextrq $1, %xmm0, %rax
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f5(f32x4) -> f32 {
|
||||
block0(v0: f32x4):
|
||||
v1 = extractlane v0, 1
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpshufd $1, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpshufd $1, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %f6(f64x2) -> f64 {
|
||||
block0(v0: f64x2):
|
||||
v1 = extractlane v0, 1
|
||||
return v1
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpshufd $238, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpshufd $0xee, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %extract_i8x16_lane0_to_memory(i8x16, i64) {
|
||||
block0(v0: i8x16, v1: i64):
|
||||
v2 = extractlane v0, 0
|
||||
store v2, v1
|
||||
return
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpextrb $0, %xmm0, 0(%rdi)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpextrb $0, %xmm0, (%rdi) ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %extract_i16x8_lane0_to_memory(i16x8, i64) {
|
||||
block0(v0: i16x8, v1: i64):
|
||||
v2 = extractlane v0, 0
|
||||
store v2, v1
|
||||
return
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpextrw $0, %xmm0, 0(%rdi)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpextrw $0, %xmm0, (%rdi) ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %extract_i32x4_lane0_to_memory(i32x4, i64) {
|
||||
block0(v0: i32x4, v1: i64):
|
||||
v2 = extractlane v0, 0
|
||||
store v2, v1
|
||||
return
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpextrd $0, %xmm0, 0(%rdi)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpextrd $0, %xmm0, (%rdi) ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %extract_f32x4_lane0_to_memory(f32x4, i64) {
|
||||
block0(v0: f32x4, v1: i64):
|
||||
v2 = extractlane v0, 0
|
||||
store v2, v1
|
||||
return
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovss %xmm0, 0(%rdi)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovss %xmm0, (%rdi) ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %extract_i64x2_lane0_to_memory(i64x2, i64) {
|
||||
block0(v0: i64x2, v1: i64):
|
||||
v2 = extractlane v0, 0
|
||||
store v2, v1
|
||||
return
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpextrq $0, %xmm0, 0(%rdi)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpextrq $0, %xmm0, (%rdi) ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %extract_f64x2_lane0_to_memory(f64x2, i64) {
|
||||
block0(v0: f64x2, v1: i64):
|
||||
v2 = extractlane v0, 0
|
||||
store v2, v1
|
||||
return
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovsd %xmm0, 0(%rdi)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovsd %xmm0, (%rdi) ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
@@ -151,6 +151,58 @@ block0(v0: f64x2):
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %extract_i8x16_lane0_to_memory(i8x16, i64) {
|
||||
block0(v0: i8x16, v1: i64):
|
||||
v2 = extractlane v0, 0
|
||||
store v2, v1
|
||||
return
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; pextrb $0, %xmm0, 0(%rdi)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; pextrb $0, %xmm0, (%rdi) ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %extract_i16x8_lane0_to_memory(i16x8, i64) {
|
||||
block0(v0: i16x8, v1: i64):
|
||||
v2 = extractlane v0, 0
|
||||
store v2, v1
|
||||
return
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; pextrw $0, %xmm0, 0(%rdi)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; pextrw $0, %xmm0, (%rdi) ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %extract_i32x4_lane0_to_memory(i32x4, i64) {
|
||||
block0(v0: i32x4, v1: i64):
|
||||
v2 = extractlane v0, 0
|
||||
@@ -162,7 +214,7 @@ block0(v0: i32x4, v1: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movss %xmm0, 0(%rdi)
|
||||
; pextrd $0, %xmm0, 0(%rdi)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -172,7 +224,7 @@ block0(v0: i32x4, v1: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movss %xmm0, (%rdi) ; trap: heap_oob
|
||||
; pextrd $0, %xmm0, (%rdi) ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
@@ -214,7 +266,7 @@ block0(v0: i64x2, v1: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movsd %xmm0, 0(%rdi)
|
||||
; pextrq $0, %xmm0, 0(%rdi)
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -224,7 +276,7 @@ block0(v0: i64x2, v1: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movsd %xmm0, (%rdi) ; trap: heap_oob
|
||||
; pextrq $0, %xmm0, (%rdi) ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
@@ -526,7 +526,7 @@ block0(v0: f32x4):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vcmpps $0 %xmm0, %xmm0, %xmm2
|
||||
; vcmpps $0, %xmm0, %xmm0, %xmm2
|
||||
; vandps %xmm0, %xmm2, %xmm4
|
||||
; vpxor %xmm2, %xmm4, %xmm6
|
||||
; vcvttps2dq %xmm4, %xmm8
|
||||
@@ -565,7 +565,7 @@ block0(v0: f64x2):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vcmppd $0 %xmm0, %xmm0, %xmm2
|
||||
; vcmppd $0, %xmm0, %xmm0, %xmm2
|
||||
; vandps %xmm2, const(0), %xmm4
|
||||
; vminpd %xmm0, %xmm4, %xmm6
|
||||
; vcvttpd2dq %xmm6, %xmm0
|
||||
|
||||
190
cranelift/filetests/filetests/isa/x64/insertlane-avx.clif
Normal file
190
cranelift/filetests/filetests/isa/x64/insertlane-avx.clif
Normal file
@@ -0,0 +1,190 @@
|
||||
test compile precise-output
|
||||
set enable_simd
|
||||
target x86_64 has_avx
|
||||
|
||||
function %insertlane_f64x2_zero(f64x2, f64) -> f64x2 {
|
||||
block0(v0: f64x2, v1: f64):
|
||||
v2 = insertlane v0, v1, 0
|
||||
return v2
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovsd %xmm0, %xmm1, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovsd %xmm1, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %insertlane_f64x2_one(f64x2, f64) -> f64x2 {
|
||||
block0(v0: f64x2, v1: f64):
|
||||
v2 = insertlane v0, v1, 1
|
||||
return v2
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovlhps %xmm0, %xmm1, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovlhps %xmm1, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %insertlane_f64x2_zero_with_load(f64x2, i64) -> f64x2 {
|
||||
block0(v0: f64x2, v1: i64):
|
||||
v2 = load.f64 v1
|
||||
v3 = insertlane v0, v2, 0
|
||||
return v3
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovsd 0(%rdi), %xmm3
|
||||
; vmovsd %xmm0, %xmm3, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovsd (%rdi), %xmm3 ; trap: heap_oob
|
||||
; vmovsd %xmm3, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %insertlane_i8x16_one_load(i8x16, i64) -> i8x16 {
|
||||
block0(v0: i8x16, v1: i64):
|
||||
v2 = load.i8 v1
|
||||
v3 = insertlane v0, v2, 1
|
||||
return v3
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movzbq 0(%rdi), %rdx
|
||||
; vpinsrb $1, %xmm0, %rdx, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movzbq (%rdi), %rdx ; trap: heap_oob
|
||||
; vpinsrb $1, %edx, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %insertlane_i16x8_one_load(i16x8, i64) -> i16x8 {
|
||||
block0(v0: i16x8, v1: i64):
|
||||
v2 = load.i16 v1
|
||||
v3 = insertlane v0, v2, 1
|
||||
return v3
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movzwq 0(%rdi), %rdx
|
||||
; vpinsrw $1, %xmm0, %rdx, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movzwq (%rdi), %rdx ; trap: heap_oob
|
||||
; vpinsrw $1, %edx, %xmm0, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %insertlane_i32x4_one_load(i32x4, i64) -> i32x4 {
|
||||
block0(v0: i32x4, v1: i64):
|
||||
v2 = load.i32 v1
|
||||
v3 = insertlane v0, v2, 1
|
||||
return v3
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpinsrd $1, %xmm0, 0(%rdi), %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpinsrd $1, (%rdi), %xmm0, %xmm0 ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %insertlane_i64x2_one_load(i64x2, i64) -> i64x2 {
|
||||
block0(v0: i64x2, v1: i64):
|
||||
v2 = load.i64 v1
|
||||
v3 = insertlane v0, v2, 1
|
||||
return v3
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpinsrq $1, %xmm0, 0(%rdi), %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vpinsrq $1, (%rdi), %xmm0, %xmm0 ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
test compile precise-output
|
||||
set enable_simd
|
||||
target x86_64 has_avx
|
||||
target x86_64
|
||||
|
||||
function %insertlane_f64x2_zero(f64x2, f64) -> f64x2 {
|
||||
block0(v0: f64x2, v1: f64):
|
||||
@@ -12,7 +12,7 @@ block0(v0: f64x2, v1: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovsd %xmm0, %xmm1, %xmm0
|
||||
; movsd %xmm0, %xmm1, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -22,7 +22,7 @@ block0(v0: f64x2, v1: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovsd %xmm1, %xmm0, %xmm0
|
||||
; movsd %xmm1, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
@@ -37,7 +37,7 @@ block0(v0: f64x2, v1: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovlhps %xmm0, %xmm1, %xmm0
|
||||
; movlhps %xmm0, %xmm1, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -47,7 +47,7 @@ block0(v0: f64x2, v1: f64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovlhps %xmm1, %xmm0, %xmm0
|
||||
; movlhps %xmm1, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
@@ -63,8 +63,8 @@ block0(v0: f64x2, v1: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vmovsd 0(%rdi), %xmm3
|
||||
; vmovsd %xmm0, %xmm3, %xmm0
|
||||
; movsd 0(%rdi), %xmm3
|
||||
; movsd %xmm0, %xmm3, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -74,8 +74,116 @@ block0(v0: f64x2, v1: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; vmovsd (%rdi), %xmm3 ; trap: heap_oob
|
||||
; vmovsd %xmm3, %xmm0, %xmm0
|
||||
; movsd (%rdi), %xmm3 ; trap: heap_oob
|
||||
; movsd %xmm3, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %insertlane_i8x16_one_load(i8x16, i64) -> i8x16 {
|
||||
block0(v0: i8x16, v1: i64):
|
||||
v2 = load.i8 v1
|
||||
v3 = insertlane v0, v2, 1
|
||||
return v3
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movzbq 0(%rdi), %rdx
|
||||
; pinsrb $1, %xmm0, %rdx, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movzbq (%rdi), %rdx ; trap: heap_oob
|
||||
; pinsrb $1, %edx, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %insertlane_i16x8_one_load(i16x8, i64) -> i16x8 {
|
||||
block0(v0: i16x8, v1: i64):
|
||||
v2 = load.i16 v1
|
||||
v3 = insertlane v0, v2, 1
|
||||
return v3
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; movzwq 0(%rdi), %rdx
|
||||
; pinsrw $1, %xmm0, %rdx, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; movzwq (%rdi), %rdx ; trap: heap_oob
|
||||
; pinsrw $1, %edx, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %insertlane_i32x4_one_load(i32x4, i64) -> i32x4 {
|
||||
block0(v0: i32x4, v1: i64):
|
||||
v2 = load.i32 v1
|
||||
v3 = insertlane v0, v2, 1
|
||||
return v3
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; pinsrd $1, %xmm0, 0(%rdi), %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; pinsrd $1, (%rdi), %xmm0 ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
function %insertlane_i64x2_one_load(i64x2, i64) -> i64x2 {
|
||||
block0(v0: i64x2, v1: i64):
|
||||
v2 = load.i64 v1
|
||||
v3 = insertlane v0, v2, 1
|
||||
return v3
|
||||
}
|
||||
|
||||
; VCode:
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; pinsrd.w $1, %xmm0, 0(%rdi), %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
;
|
||||
; Disassembled:
|
||||
; block0: ; offset 0x0
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block1: ; offset 0x4
|
||||
; pinsrq $1, (%rdi), %xmm0 ; trap: heap_oob
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; retq
|
||||
|
||||
@@ -1204,7 +1204,7 @@ block0(v0: i8x16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpalignr $8 %xmm0, %xmm0, %xmm2
|
||||
; vpalignr $8, %xmm0, %xmm0, %xmm2
|
||||
; vpmovzxbw %xmm2, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
@@ -1316,7 +1316,7 @@ block0(v0: i8):
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; uninit %xmm2
|
||||
; vpinsrb $0 %xmm2, %rdi, %xmm4
|
||||
; vpinsrb $0, %xmm2, %rdi, %xmm4
|
||||
; uninit %xmm6
|
||||
; vpxor %xmm6, %xmm6, %xmm8
|
||||
; vpshufb %xmm4, %xmm8, %xmm0
|
||||
@@ -1354,7 +1354,7 @@ block0(v0: f64x2):
|
||||
; vminpd %xmm6, const(0), %xmm8
|
||||
; vroundpd $3, %xmm8, %xmm10
|
||||
; vaddpd %xmm10, const(1), %xmm12
|
||||
; vshufps $136 %xmm12, %xmm4, %xmm0
|
||||
; vshufps $136, %xmm12, %xmm4, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
|
||||
@@ -529,7 +529,7 @@ block0(v0: f32x4, v1: f32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vinsertps $16 %xmm0, %xmm1, %xmm0
|
||||
; vinsertps $16, %xmm0, %xmm1, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -579,7 +579,7 @@ block0(v0: i8x16, v1: i8):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpinsrb $1 %xmm0, %rdi, %xmm0
|
||||
; vpinsrb $1, %xmm0, %rdi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -604,7 +604,7 @@ block0(v0: i16x8, v1: i16):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpinsrw $1 %xmm0, %rdi, %xmm0
|
||||
; vpinsrw $1, %xmm0, %rdi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -629,7 +629,7 @@ block0(v0: i32x4, v1: i32):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpinsrd $1 %xmm0, %rdi, %xmm0
|
||||
; vpinsrd $1, %xmm0, %rdi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
@@ -654,7 +654,7 @@ block0(v0: i64x2, v1: i64):
|
||||
; pushq %rbp
|
||||
; movq %rsp, %rbp
|
||||
; block0:
|
||||
; vpinsrq $1 %xmm0, %rdi, %xmm0
|
||||
; vpinsrq $1, %xmm0, %rdi, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
; popq %rbp
|
||||
; ret
|
||||
|
||||
@@ -215,7 +215,7 @@ block0(v0: f32x4, v1: f32x4):
|
||||
; vminps %xmm0, %xmm1, %xmm3
|
||||
; vminps %xmm1, %xmm0, %xmm5
|
||||
; vorps %xmm3, %xmm5, %xmm7
|
||||
; vcmpps $3 %xmm7, %xmm5, %xmm9
|
||||
; vcmpps $3, %xmm7, %xmm5, %xmm9
|
||||
; vorps %xmm7, %xmm9, %xmm11
|
||||
; vpsrld %xmm9, $10, %xmm13
|
||||
; vandnps %xmm13, %xmm11, %xmm0
|
||||
@@ -252,7 +252,7 @@ block0(v0: f64x2, v1: f64x2):
|
||||
; vminpd %xmm0, %xmm1, %xmm3
|
||||
; vminpd %xmm1, %xmm0, %xmm5
|
||||
; vorpd %xmm3, %xmm5, %xmm7
|
||||
; vcmppd $3 %xmm3, %xmm5, %xmm9
|
||||
; vcmppd $3, %xmm3, %xmm5, %xmm9
|
||||
; vorpd %xmm7, %xmm9, %xmm11
|
||||
; vpsrlq %xmm9, $13, %xmm13
|
||||
; vandnpd %xmm13, %xmm11, %xmm0
|
||||
@@ -291,7 +291,7 @@ block0(v0: f32x4, v1: f32x4):
|
||||
; vxorps %xmm3, %xmm5, %xmm7
|
||||
; vorps %xmm3, %xmm7, %xmm9
|
||||
; vsubps %xmm9, %xmm7, %xmm11
|
||||
; vcmpps $3 %xmm9, %xmm9, %xmm13
|
||||
; vcmpps $3, %xmm9, %xmm9, %xmm13
|
||||
; vpsrld %xmm13, $10, %xmm15
|
||||
; vandnps %xmm15, %xmm11, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
@@ -330,7 +330,7 @@ block0(v0: f64x2, v1: f64x2):
|
||||
; vxorpd %xmm3, %xmm5, %xmm7
|
||||
; vorpd %xmm3, %xmm7, %xmm9
|
||||
; vsubpd %xmm9, %xmm7, %xmm11
|
||||
; vcmppd $3 %xmm9, %xmm9, %xmm13
|
||||
; vcmppd $3, %xmm9, %xmm9, %xmm13
|
||||
; vpsrlq %xmm13, $13, %xmm15
|
||||
; vandnpd %xmm15, %xmm11, %xmm0
|
||||
; movq %rbp, %rsp
|
||||
|
||||
@@ -4,6 +4,7 @@ target aarch64
|
||||
target s390x
|
||||
set enable_simd
|
||||
target x86_64 has_sse3 has_ssse3 has_sse41
|
||||
target x86_64 has_sse3 has_ssse3 has_sse41 has_avx
|
||||
|
||||
function %extractlane_4(i8x16) -> i8 {
|
||||
block0(v0: i8x16):
|
||||
@@ -33,3 +34,69 @@ block0(v0: i64x2):
|
||||
return v1
|
||||
}
|
||||
; run: %extractlane_1([0 4294967297]) == 4294967297
|
||||
|
||||
function %extractlane_i8x16_through_stack(i8x16) -> i8 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: i8x16):
|
||||
v2 = stack_addr.i64 ss0
|
||||
v3 = extractlane v0, 1
|
||||
store v3, v2
|
||||
v4 = load.i8 v2
|
||||
return v4
|
||||
}
|
||||
; run: %extractlane_i8x16_through_stack([1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]) == 2
|
||||
|
||||
function %extractlane_i16x8_through_stack(i16x8) -> i16 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: i16x8):
|
||||
v2 = stack_addr.i64 ss0
|
||||
v3 = extractlane v0, 2
|
||||
store v3, v2
|
||||
v4 = load.i16 v2
|
||||
return v4
|
||||
}
|
||||
; run: %extractlane_i16x8_through_stack([1 2 3 4 5 6 7 8]) == 3
|
||||
|
||||
function %extractlane_i32x4_through_stack(i32x4) -> i32 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: i32x4):
|
||||
v2 = stack_addr.i64 ss0
|
||||
v3 = extractlane v0, 3
|
||||
store v3, v2
|
||||
v4 = load.i32 v2
|
||||
return v4
|
||||
}
|
||||
; run: %extractlane_i32x4_through_stack([1 2 3 4]) == 4
|
||||
|
||||
function %extractlane_i64x2_through_stack(i64x2) -> i64 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: i64x2):
|
||||
v2 = stack_addr.i64 ss0
|
||||
v3 = extractlane v0, 0
|
||||
store v3, v2
|
||||
v4 = load.i64 v2
|
||||
return v4
|
||||
}
|
||||
; run: %extractlane_i64x2_through_stack([1 2]) == 1
|
||||
|
||||
function %extractlane_f32x4_through_stack(f32x4) -> f32 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: f32x4):
|
||||
v2 = stack_addr.i64 ss0
|
||||
v3 = extractlane v0, 3
|
||||
store v3, v2
|
||||
v4 = load.f32 v2
|
||||
return v4
|
||||
}
|
||||
; run: %extractlane_f32x4_through_stack([0x1.0 0x2.0 0x3.0 0x4.0]) == 0x4.0
|
||||
|
||||
function %extractlane_f64x2_through_stack(f64x2) -> f64 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: f64x2):
|
||||
v2 = stack_addr.i64 ss0
|
||||
v3 = extractlane v0, 0
|
||||
store v3, v2
|
||||
v4 = load.f64 v2
|
||||
return v4
|
||||
}
|
||||
; run: %extractlane_f64x2_through_stack([0x1.0 0x2.0]) == 0x1.0
|
||||
|
||||
@@ -47,3 +47,91 @@ block0(v0: f64x2, v1: f64):
|
||||
return v2
|
||||
}
|
||||
; run: %insertlane_1_in_f64x2([0x1.0 0x2.0], 0x3.0) == [0x1.0 0x3.0]
|
||||
|
||||
function %insertlane_i8x16_through_stack(i8x16, i8) -> i8x16 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: i8x16, v1: i8):
|
||||
v2 = stack_addr.i64 ss0
|
||||
store v1, v2
|
||||
v3 = load.i8 v2
|
||||
v4 = insertlane v0, v3, 1
|
||||
return v4
|
||||
}
|
||||
; run: %insertlane_i8x16_through_stack([1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1], 2) == [1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
|
||||
|
||||
function %insertlane_i16x8_through_stack(i16x8, i16) -> i16x8 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: i16x8, v1: i16):
|
||||
v2 = stack_addr.i64 ss0
|
||||
store v1, v2
|
||||
v3 = load.i16 v2
|
||||
v4 = insertlane v0, v3, 2
|
||||
return v4
|
||||
}
|
||||
; run: %insertlane_i16x8_through_stack([1 1 1 1 1 1 1 1], 2) == [1 1 2 1 1 1 1 1]
|
||||
|
||||
function %insertlane_i32x4_through_stack(i32x4, i32) -> i32x4 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: i32x4, v1: i32):
|
||||
v2 = stack_addr.i64 ss0
|
||||
store v1, v2
|
||||
v3 = load.i32 v2
|
||||
v4 = insertlane v0, v3, 3
|
||||
return v4
|
||||
}
|
||||
; run: %insertlane_i32x4_through_stack([1 1 1 1], 2) == [1 1 1 2]
|
||||
|
||||
function %insertlane_i64x2_through_stack(i64x2, i64) -> i64x2 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: i64x2, v1: i64):
|
||||
v2 = stack_addr.i64 ss0
|
||||
store v1, v2
|
||||
v3 = load.i64 v2
|
||||
v4 = insertlane v0, v3, 0
|
||||
return v4
|
||||
}
|
||||
; run: %insertlane_i64x2_through_stack([1 1], 2) == [2 1]
|
||||
|
||||
function %insertlane_f32x4_through_stack(f32x4, f32) -> f32x4 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: f32x4, v1: f32):
|
||||
v2 = stack_addr.i64 ss0
|
||||
store v1, v2
|
||||
v3 = load.f32 v2
|
||||
v4 = insertlane v0, v3, 3
|
||||
return v4
|
||||
}
|
||||
; run: %insertlane_f32x4_through_stack([0x1.0 0x1.0 0x1.0 0x1.0], 0x2.0) == [0x1.0 0x1.0 0x1.0 0x2.0]
|
||||
|
||||
function %insertlane_f32x4_through_stack2(f32x4, f32) -> f32x4 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: f32x4, v1: f32):
|
||||
v2 = stack_addr.i64 ss0
|
||||
store v1, v2
|
||||
v3 = load.f32 v2
|
||||
v4 = insertlane v0, v3, 0
|
||||
return v4
|
||||
}
|
||||
; run: %insertlane_f32x4_through_stack2([0x1.0 0x1.0 0x1.0 0x1.0], 0x2.0) == [0x2.0 0x1.0 0x1.0 0x1.0]
|
||||
|
||||
function %insertlane_f64x2_through_stack(f64x2, f64) -> f64x2 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: f64x2, v1: f64):
|
||||
v2 = stack_addr.i64 ss0
|
||||
store v1, v2
|
||||
v3 = load.f64 v2
|
||||
v4 = insertlane v0, v3, 0
|
||||
return v4
|
||||
}
|
||||
; run: %insertlane_f64x2_through_stack([0x1.0 0x1.0], 0x2.0) == [0x2.0 0x1.0]
|
||||
|
||||
function %insertlane_f64x2_through_stack2(f64x2, f64) -> f64x2 {
|
||||
ss0 = explicit_slot 8
|
||||
block0(v0: f64x2, v1: f64):
|
||||
v2 = stack_addr.i64 ss0
|
||||
store v1, v2
|
||||
v3 = load.f64 v2
|
||||
v4 = insertlane v0, v3, 1
|
||||
return v4
|
||||
}
|
||||
; run: %insertlane_f64x2_through_stack2([0x1.0 0x1.0], 0x2.0) == [0x1.0 0x2.0]
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
;; movq %rsp, %rbp
|
||||
;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 }
|
||||
;; block0:
|
||||
;; vcmpps $0 %xmm0, %xmm0, %xmm3
|
||||
;; vcmpps $0, %xmm0, %xmm0, %xmm3
|
||||
;; vandps %xmm0, %xmm3, %xmm5
|
||||
;; vpxor %xmm3, %xmm5, %xmm7
|
||||
;; vcvttps2dq %xmm5, %xmm9
|
||||
@@ -71,7 +71,7 @@
|
||||
;; vcvtdq2ps %xmm11, %xmm13
|
||||
;; vcvttps2dq %xmm7, %xmm15
|
||||
;; vsubps %xmm7, %xmm13, %xmm1
|
||||
;; vcmpps $2 %xmm13, %xmm1, %xmm3
|
||||
;; vcmpps $2, %xmm13, %xmm1, %xmm3
|
||||
;; vcvttps2dq %xmm1, %xmm5
|
||||
;; vpxor %xmm5, %xmm3, %xmm7
|
||||
;; uninit %xmm9
|
||||
@@ -90,7 +90,7 @@
|
||||
;; movq %rsp, %rbp
|
||||
;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 }
|
||||
;; block0:
|
||||
;; vcmppd $0 %xmm0, %xmm0, %xmm3
|
||||
;; vcmppd $0, %xmm0, %xmm0, %xmm3
|
||||
;; vandps %xmm3, const(0), %xmm5
|
||||
;; vminpd %xmm0, %xmm5, %xmm7
|
||||
;; vcvttpd2dq %xmm7, %xmm0
|
||||
@@ -112,7 +112,7 @@
|
||||
;; vminpd %xmm7, const(0), %xmm9
|
||||
;; vroundpd $3, %xmm9, %xmm11
|
||||
;; vaddpd %xmm11, const(1), %xmm13
|
||||
;; vshufps $136 %xmm13, %xmm5, %xmm0
|
||||
;; vshufps $136, %xmm13, %xmm5, %xmm0
|
||||
;; jmp label1
|
||||
;; block1:
|
||||
;; movq %rbp, %rsp
|
||||
@@ -128,9 +128,9 @@
|
||||
;; vpmovsxbw %xmm0, %xmm10
|
||||
;; vpmovsxbw %xmm1, %xmm12
|
||||
;; vpmullw %xmm10, %xmm12, %xmm14
|
||||
;; vpalignr $8 %xmm0, %xmm0, %xmm8
|
||||
;; vpalignr $8, %xmm0, %xmm0, %xmm8
|
||||
;; vpmovsxbw %xmm8, %xmm10
|
||||
;; vpalignr $8 %xmm1, %xmm1, %xmm12
|
||||
;; vpalignr $8, %xmm1, %xmm1, %xmm12
|
||||
;; vpmovsxbw %xmm12, %xmm15
|
||||
;; vpmullw %xmm10, %xmm15, %xmm0
|
||||
;; vphaddw %xmm14, %xmm0, %xmm0
|
||||
@@ -149,9 +149,9 @@
|
||||
;; vpmovsxbw %xmm0, %xmm13
|
||||
;; vpmovsxbw %xmm1, %xmm15
|
||||
;; vpmullw %xmm13, %xmm15, %xmm3
|
||||
;; vpalignr $8 %xmm0, %xmm0, %xmm11
|
||||
;; vpalignr $8, %xmm0, %xmm0, %xmm11
|
||||
;; vpmovsxbw %xmm11, %xmm13
|
||||
;; vpalignr $8 %xmm1, %xmm1, %xmm15
|
||||
;; vpalignr $8, %xmm1, %xmm1, %xmm15
|
||||
;; vpmovsxbw %xmm15, %xmm1
|
||||
;; vpmullw %xmm13, %xmm1, %xmm4
|
||||
;; vphaddw %xmm3, %xmm4, %xmm15
|
||||
|
||||
Reference in New Issue
Block a user