Skip to content

[AVX2] bitcast i64 to <64 x i1> + sext <64 x i1> to <64 x i8> should not use vpermq 0b01_00_01_00 when vpbroadcastq would work too #110868

@Validark

Description

@Validark

LLVM Godbolt
Zig Godbolt

define dso_local range(i8 -1, 1) <64 x i8> @unmovemask64(i64 %0) local_unnamed_addr {
Entry:
  %1 = bitcast i64 %0 to <64 x i1>
  %2 = sext <64 x i1> %1 to <64 x i8>
  ret <64 x i8> %2
}

Emit for Zen 3:

.LCPI0_0:
        .byte   0
        .byte   0
        .byte   0
        .byte   0
        .byte   0
        .byte   0
        .byte   0
        .byte   0
        .byte   1
        .byte   1
        .byte   1
        .byte   1
        .byte   1
        .byte   1
        .byte   1
        .byte   1
        .byte   2
        .byte   2
        .byte   2
        .byte   2
        .byte   2
        .byte   2
        .byte   2
        .byte   2
        .byte   3
        .byte   3
        .byte   3
        .byte   3
        .byte   3
        .byte   3
        .byte   3
        .byte   3
.LCPI0_2:
        .byte   4
        .byte   4
        .byte   4
        .byte   4
        .byte   4
        .byte   4
        .byte   4
        .byte   4
        .byte   5
        .byte   5
        .byte   5
        .byte   5
        .byte   5
        .byte   5
        .byte   5
        .byte   5
        .byte   6
        .byte   6
        .byte   6
        .byte   6
        .byte   6
        .byte   6
        .byte   6
        .byte   6
        .byte   7
        .byte   7
        .byte   7
        .byte   7
        .byte   7
        .byte   7
        .byte   7
        .byte   7
.LCPI0_1:
        .byte   1
        .byte   2
        .byte   4
        .byte   8
        .byte   16
        .byte   32
        .byte   64
        .byte   128
unmovemask64:
        vmovq   xmm0, rdi
        vpbroadcastq    ymm2, qword ptr [rip + .LCPI0_1]
-       vpermq  ymm1, ymm0, 68 ; 0b01_00_01_00
+       vpbroadcastq    ymm1, xmm0
        vpshufb ymm0, ymm1, ymmword ptr [rip + .LCPI0_0]
        vpshufb ymm1, ymm1, ymmword ptr [rip + .LCPI0_2]
        vpand   ymm0, ymm0, ymm2
        vpand   ymm1, ymm1, ymm2
        vpcmpeqb        ymm0, ymm0, ymm2
        vpcmpeqb        ymm1, ymm1, ymm2
        ret

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions