diff options
author | Tony Varghese <tonypalampalliyil@gmail.com> | 2025-10-15 10:54:04 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-10-15 10:54:04 +0530 |
commit | 60ee515b8cc2f14d548d7e0a20f44434a237f22b (patch) | |
tree | 4f31f09c856a8b3c01b2bc8af5e2604536f81f4a /clang/lib/InstallAPI/HeaderFile.cpp | |
parent | 856555bfd843e50a0d869bf45b58a514b11cbdb6 (diff) | |
download | llvm-60ee515b8cc2f14d548d7e0a20f44434a237f22b.zip llvm-60ee515b8cc2f14d548d7e0a20f44434a237f22b.tar.gz llvm-60ee515b8cc2f14d548d7e0a20f44434a237f22b.tar.bz2 |
[PowerPC] Emit lxvkq and vsrq instructions for build vector patterns (#157625)
### Optimize BUILD_VECTOR having special quadword patterns
This change optimizes `BUILD_VECTOR` operations by using the `lxvkq` or
`xxpltib + vsrq` instructions to inline constants matching specific
128-bit patterns:
- **MSB set pattern**: `0x8000_0000_0000_0000_0000_0000_0000_0000`
- **LSB set pattern**: `0x0000_0000_0000_0000_0000_0000_0000_0001`
### Implementation Details
The `lxvkq` instruction loads special quadword values into VSX
registers:
```asm
lxvkq XT, UIM
# When UIM=16: loads 0x8000_0000_0000_0000_0000_0000_0000_0000
```
The optimization reconstructs the 128-bit register pattern from
`BUILD_VECTOR` operands, accounting for target endianness. For example,
the MSB pattern can be represented as:
- **Big-Endian**: `<i64 -9223372036854775808, i64 0>`
- **Little-Endian**: `<i64 0, i64 -9223372036854775808>`
Both produce the same register value:
`0x8000_0000_0000_0000_0000_0000_0000_0000`
### MSB Pattern (`0x8000...0000`)
All vector types (`v2i64`, `v4i32`, `v8i16`, `v16i8`) generate:
```asm
lxvkq v2, 16
```
### LSB Pattern (`0x0000...0001`)
All vector types generate:
```asm
xxspltib v2, 255
vsrq v2, v2, v2
```
---------
Co-authored-by: Tony Varghese <tony.varghese@ibm.com>
Diffstat (limited to 'clang/lib/InstallAPI/HeaderFile.cpp')
0 files changed, 0 insertions, 0 deletions