Issue 89996
Summary Bitmanipulations can be performed on vectors after they are moved over to scalar registers
Labels new issue
Assignees
Reporter Validark
    This code:

```zig
export fn foo(v: @Vector(4, u8)) u32 {
    return @bitCast(v & @as(@Vector(4, u8), @splat(0xF)));
}
```

Gives me:

```asm
.LCPI0_0:
 .byte   15
        .byte   15
        .byte   15
        .byte 15
        .zero   1
        .zero   1
        .zero   1
 .zero   1
        .zero   1
        .zero   1
        .zero   1
 .zero   1
        .zero   1
        .zero   1
        .zero 1
        .zero   1
foo:
        vpand   xmm0, xmm0, xmmword ptr [rip + .LCPI0_0]
        vmovd   eax, xmm0
 ret
```

However, I can move the `&` to come after moving to a scalar register:

```zig
export fn bar(v: @Vector(4, u8)) u32 {
 return @as(u32, @bitCast(v)) & 0x0F0F0F0F;
}
```

Emit:

```asm
bar:
        vmovd eax, xmm0
        and     eax, 252645135
 ret
```

https://zig.godbolt.org/z/jq1dfvboE
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to