| 1771 | } |
| 1772 | |
| 1773 | void OpDispatchBuilder::BLSRBMIOp(OpcodeArgs) { |
| 1774 | // Equivalent to: (Src - 1) & Src |
| 1775 | LOGMAN_THROW_A_FMT(Op->InstSize >= 4, "No masking needed"); |
| 1776 | const auto Size = OpSizeFromSrc(Op); |
| 1777 | |
| 1778 | auto* Src = LoadSource(GPRClass, Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true}); |
| 1779 | auto Result = _And(Size, Sub(Size, Src, 1), Src); |
| 1780 | |
| 1781 | StoreResult(GPRClass, Op, Result, OpSize::iInvalid); |
| 1782 | |
| 1783 | auto CFInv = To01(OpSize::i64Bit, Src); |
| 1784 | |
| 1785 | SetNZ_ZeroCV(Size, Result); |
| 1786 | SetCFInverted(CFInv); |
| 1787 | InvalidatePF_AF(); |
| 1788 | } |
| 1789 | |
| 1790 | // Handles SARX, SHLX, and SHRX |
| 1791 | void OpDispatchBuilder::BMI2Shift(OpcodeArgs) { |
nothing calls this directly
no outgoing calls
no test coverage detected