Commit Graph

23 Commits

Author SHA1 Message Date
Wunkolo
6ee2e3718f [x64] Add AVX512 optimizations for OPCODE_VECTOR_COMPARE_UGT(Integer)
AVX512 has native unsigned integer comparisons instructions, removing
the need to XOR the most-significant-bit with a constant in memory to
use the signed comparison instructions. These instructions only write to
a k-mask register though and need an additional call to `vpmovm2*` to
turn the mask-register into a vector-mask register.

As of Icelake:
`vpcmpu*` is all L3/T1
`vpmovm2d` is L1/T0.33
`vpmovm2{b,w}` is L3/T0.33

As of Zen4:
`vpcmpu*` is all L3/T0.50
`vpmovm2*` is all L1/T0.25
2023-05-29 14:57:09 -05:00
Wunkolo
5fde7c6aa5 [x64] Add AVX512 optimizations for PERMUTE_V128
Uses the single-instruction AVX512 `vperm*` instructions to accelerate
the `INT8_TYPE` and `INT16_TYPE` permutation opcodes.

The `INT8_TYPE` is accelerated using `AVX512VBMI` subset of AVX512.
Available since Icelake(Intel) and Zen4(AMD).
2022-10-21 08:47:31 -05:00
Wunkolo
d73088e5ca [x64] Add AVX512 optimization for OPCODE_VECTOR_SUB(saturated)
Passes the `vsubuws` and `vsubsws` unit-tests from https://github.com/xenia-project/xenia/pull/1348
2022-10-21 08:45:43 -05:00
Rick Gibbed
3bfa3b05e1 Lint fix. 2022-09-22 06:34:21 -05:00
Wunkolo
addd8c94e5 [x64] Add AVX512 optimization for OPCODE_VECTOR_ADD(saturated)
Uses a single `vpternlogd` to test for signed/unsigned
overflow/underflow. Then utilizes AVX512 mask operations to create
either `0x7FFFFFFF` or `0x80000000` arithmetically.
2022-09-14 11:39:03 -05:00
Wunkolo
9fd684594b [x64] Add AVX512 optimization for OPCODE_VECTOR_CONVERT_F2I(unsigned)
`vcvttps2udq` already saturates overflowing and unordered values to `0xFFFFFFFF`. Using mask registers, zeroes are written to negative values within the same instruction.
2022-09-12 13:52:57 -05:00
Wunkolo
be8b9c512f [x64] Add GFNI optimization for SPLAT(int8)
`pxor` is a zero-uop register-rename and `gf2p8affineqb dest, zero, int8`
is a very quick single-instruction way to use affine galois
transformations to fill a register with an immediate byte without
touching memory.
2022-04-26 13:46:46 -05:00
Wunkolo
337f0b2948 [x64] Add AVX512 optimization for VECTOR_ROTATE_LEFT(Int32)
`vprolvd` is an almost 1:1 analog with this opcode and can be
conditionally emitted when the host supports AVX512{F,VL}.

Altivec docs say that `vrl{bhw}` masks the lower log2(n) bits of the
element-size.

[vprold](https://www.felixcloutier.com/x86/vprold:vprolvd:vprolq:vprolvq)
modulos the shift-value by the element size in bits, which is the same
as masking the lower log2(n) bits. So `vrlw` maps exactly to `vprold`.
2022-03-08 12:18:58 -06:00
Wunkolo
24205ee860 [x64] Fix VECTOR_SH{L,R,A}_V128(Int8) masking
[AltiVec](https://www.nxp.com/docs/en/reference-manual/ALTIVECPEM.pdf)
doc says that it just uses the lower `log2(n)` bits of the shift-amount
rather than the whole element-sized value. So there is no need to handle
an overflow. Also adjusts 64-bit literals to utilize the explicit
`UINT64_C` type.
2022-01-29 02:39:34 -06:00
Wunkolo
bd9a290b30 [x64] Add GFNI-based optimization for VECTOR_SH{R,L}_V128(Int8)
In the `Int8` case of `VECTOR_SH{R,L}_V128`, when all the values are the
same, then a single-instruction `gf2p8affineqb` can be emitted that does
an int8-based arithmetic-shift, utilizing GF(8) arithmetic.

More info here:
https://wunkolo.github.io/post/2020/11/gf2p8affineqb-int8-shifting/

Also fixes the iteration-type for when detecting if all of the simd
lanes are the same value(was iterating `u16` and not `u8`)
2022-01-29 02:39:34 -06:00
Wunkolo
a9a365aa32 [x64] Add GFNI-based optimization for VECTOR_SHA_V128(Int8)
In the `Int8` case of `VECTOR_SHA_V128`, when all the values are the same, then a single-instruction `gf2p8affineqb` can be emitted that does an int8-based arithmetic-shift, utilizing GF(8) arithmetic.

More info here:
https://wunkolo.github.io/post/2020/11/gf2p8affineqb-int8-shifting/

As of now(Dec 2021): Tremont(Lakefield), Jasper Lake, Ice lake, Tigerlake, and Rocket Lake support GNFI.
2022-01-13 15:32:55 -06:00
Triang3l
e720e0a540 [Code] Remove game names from code comments (most of at least) 2021-09-05 21:27:40 +03:00
Triang3l
5c47a3a588 [x64] vcfux single rounding for 0x80000000+ 2020-12-11 21:20:13 +03:00
gibbed
ae15c27a24 [x64] Take advantage of StashConstantXmm. 2019-11-30 20:08:10 -06:00
gibbed
04a54cc58f [x64] Fix constant src2 in VECTOR_ROTATE_LEFT_V128. 2019-11-30 20:08:10 -06:00
gibbed
f7a8c5ce7a [x64] Fix corruption of src1 in calls to EmulateVectorRotateLeft.
To mitigate this mistake in the future, implemented new
StashConstantXmm functions.
2019-11-30 20:08:10 -06:00
Triang3l
8c00aea5ff [CPU] vpkd3d VPACK_NORMPACKED64 2019-07-20 22:04:37 +03:00
Triang3l
4ae9266f13 [CPU] Fix vpkd3d half4 component order 2019-01-24 17:45:41 +03:00
Triang3l
949b05f517 [CPU] Fix saturation in D3DCOLOR vpkd3d 2019-01-13 17:29:06 +03:00
Dr. Chat
b3d509eb01 [x64] Swap to using anchor variables instead of dummy function calls 2018-11-23 18:02:04 -06:00
Dr. Chat
b57bb74965 [x64] Change the parameters to host_to_guest_thunk
Shuffle some code around in x64_backend.cc
Add GetNativeParam to avoid hardcoding parameters
2018-11-23 18:02:04 -06:00
Dr. Chat
c451fda819 [x64] Template-ize a few vector emulation functions 2018-11-23 18:02:03 -06:00
Dr. Chat
c318009733 [x64] Factor out vector handling code 2018-11-23 18:02:03 -06:00