x64: Improve codegen for vectors with constant shift amounts (#5797)

I stumbled across this working on #5795 and figured this was a nice
opportunity to improve the codegen here.
This commit is contained in:
Alex Crichton
2023-02-16 14:47:59 -06:00
committed by GitHub
parent 1efee4abdf
commit cae3b26623
4 changed files with 344 additions and 63 deletions

View File

@@ -360,6 +360,117 @@ block0(v0: i32):
; addb %al, (%rax)
; addb %al, (%rax)
function %ishl_i8x16_imm(i8x16) -> i8x16 {
block0(v0: i8x16):
v1 = iconst.i32 124
v2 = ishl v0, v1
return v2
}
; VCode:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; psllw %xmm0, $4, %xmm0
; movdqu const(0), %xmm4
; pand %xmm0, %xmm4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; psllw $4, %xmm0
; movdqu 0xf(%rip), %xmm4
; pand %xmm4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq
; addb %al, (%rax)
; addb %al, (%rax)
; addb %al, (%rax)
function %ishl_i16x8_imm(i16x8) -> i16x8 {
block0(v0: i16x8):
v1 = iconst.i32 1
v2 = ishl v0, v1
return v2
}
; VCode:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; psllw %xmm0, $1, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; psllw $1, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq
function %ishl_i32x4_imm(i32x4) -> i32x4 {
block0(v0: i32x4):
v1 = iconst.i32 100
v2 = ishl v0, v1
return v2
}
; VCode:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pslld %xmm0, $4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; pslld $4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq
function %ishl_i64x2_imm(i64x2) -> i64x2 {
block0(v0: i64x2):
v1 = iconst.i32 100
v2 = ishl v0, v1
return v2
}
; VCode:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; psllq %xmm0, $36, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; psllq $0x24, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq
function %ushr_i8x16_imm() -> i8x16 {
block0:
v0 = iconst.i32 1
@@ -373,14 +484,9 @@ block0:
; movq %rsp, %rbp
; block0:
; movdqu const(1), %xmm0
; movl $1, %r9d
; andq %r9, $7, %r9
; movd %r9d, %xmm5
; psrlw %xmm0, %xmm5, %xmm0
; lea const(0), %rsi
; shlq $4, %r9, %r9
; movdqu 0(%rsi,%r9,1), %xmm13
; pand %xmm0, %xmm13, %xmm0
; psrlw %xmm0, $1, %xmm0
; movdqu const(0), %xmm3
; pand %xmm0, %xmm3, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -390,21 +496,109 @@ block0:
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; movdqu 0xb4(%rip), %xmm0
; movl $1, %r9d
; andq $7, %r9
; movd %r9d, %xmm5
; psrlw %xmm5, %xmm0
; leaq 0x1a(%rip), %rsi
; shlq $4, %r9
; movdqu (%rsi, %r9), %xmm13
; pand %xmm13, %xmm0
; movdqu 0x34(%rip), %xmm0
; psrlw $1, %xmm0
; movdqu 0x17(%rip), %xmm3
; pand %xmm3, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq
; addb %al, (%rax)
; addb %al, (%rax)
; addb %bh, %bh
; addb %al, (%rax)
; addb %al, (%rax)
; addb %al, (%rax)
; addb %al, (%rax)
; addb %al, (%rax)
; jg 0xb1
; jg 0xb3
; jg 0xb5
; jg 0xb7
; jg 0xb9
; jg 0xbb
; jg 0xbd
; jg 0xbf
; addb %al, (%rcx)
; addb (%rbx), %al
; addb $5, %al
function %ushr_i16x8_imm(i16x8) -> i16x8 {
block0(v0: i16x8):
v1 = iconst.i32 1
v2 = ushr v0, v1
return v2
}
; VCode:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; psrlw %xmm0, $1, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; psrlw $1, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq
function %ushr_i32x4_imm(i32x4) -> i32x4 {
block0(v0: i32x4):
v1 = iconst.i32 100
v2 = ushr v0, v1
return v2
}
; VCode:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; psrld %xmm0, $4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; psrld $4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq
function %ushr_i64x2_imm(i64x2) -> i64x2 {
block0(v0: i64x2):
v1 = iconst.i32 100
v2 = ushr v0, v1
return v2
}
; VCode:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; psrlq %xmm0, $36, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; psrlq $0x24, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq
function %sshr_i8x16(i32) -> i8x16 {
block0(v0: i32):
@@ -465,19 +659,15 @@ block0(v0: i8x16, v1: i32):
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movl $3, %r10d
; andq %r10, $7, %r10
; movdqa %xmm0, %xmm13
; punpcklbw %xmm13, %xmm0, %xmm13
; movdqa %xmm13, %xmm12
; movdqa %xmm0, %xmm13
; punpckhbw %xmm13, %xmm0, %xmm13
; addl %r10d, $8, %r10d
; movd %r10d, %xmm14
; movdqa %xmm12, %xmm0
; psraw %xmm0, %xmm14, %xmm0
; psraw %xmm13, %xmm14, %xmm13
; packsswb %xmm0, %xmm13, %xmm0
; movdqa %xmm0, %xmm7
; punpcklbw %xmm7, %xmm0, %xmm7
; movdqa %xmm7, %xmm8
; movdqa %xmm0, %xmm7
; punpckhbw %xmm7, %xmm0, %xmm7
; movdqa %xmm8, %xmm0
; psraw %xmm0, $11, %xmm0
; psraw %xmm7, $11, %xmm7
; packsswb %xmm0, %xmm7, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -487,19 +677,104 @@ block0(v0: i8x16, v1: i32):
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; movl $3, %r10d
; andq $7, %r10
; movdqa %xmm0, %xmm13
; punpcklbw %xmm0, %xmm13
; movdqa %xmm13, %xmm12
; movdqa %xmm0, %xmm13
; punpckhbw %xmm0, %xmm13
; addl $8, %r10d
; movd %r10d, %xmm14
; movdqa %xmm12, %xmm0
; psraw %xmm14, %xmm0
; psraw %xmm14, %xmm13
; packsswb %xmm13, %xmm0
; movdqa %xmm0, %xmm7
; punpcklbw %xmm0, %xmm7
; movdqa %xmm7, %xmm8
; movdqa %xmm0, %xmm7
; punpckhbw %xmm0, %xmm7
; movdqa %xmm8, %xmm0
; psraw $0xb, %xmm0
; psraw $0xb, %xmm7
; packsswb %xmm7, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq
function %sshr_i16x8_imm(i16x8) -> i16x8 {
block0(v0: i16x8):
v1 = iconst.i32 1
v2 = sshr v0, v1
return v2
}
; VCode:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; psraw %xmm0, $1, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; psraw $1, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq
function %sshr_i32x4_imm(i32x4) -> i32x4 {
block0(v0: i32x4):
v1 = iconst.i32 100
v2 = sshr v0, v1
return v2
}
; VCode:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; psrad %xmm0, $4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; psrad $4, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq
function %sshr_i64x2_imm(i64x2) -> i64x2 {
block0(v0: i64x2):
v1 = iconst.i32 100
v2 = sshr v0, v1
return v2
}
; VCode:
; pushq %rbp
; movq %rsp, %rbp
; block0:
; pextrd.w $0, %xmm0, %rdx
; pextrd.w $1, %xmm0, %r9
; sarq $36, %rdx, %rdx
; sarq $36, %r9, %r9
; uninit %xmm0
; pinsrd.w $0, %xmm0, %rdx, %xmm0
; pinsrd.w $1, %xmm0, %r9, %xmm0
; movq %rbp, %rsp
; popq %rbp
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block1: ; offset 0x4
; pextrq $0, %xmm0, %rdx
; pextrq $1, %xmm0, %r9
; sarq $0x24, %rdx
; sarq $0x24, %r9
; pinsrq $0, %rdx, %xmm0
; pinsrq $1, %r9, %xmm0
; movq %rbp, %rsp
; popq %rbp
; retq