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