| 1634 | } |
| 1635 | |
| 1636 | void JitCodeGen::getCF(LazyFlagType flags, RegPtr result) { |
| 1637 | if (flags == FLAGS_NONE || flags == FLAGS_CFOF) { |
| 1638 | andValueWithDest(JitWidth::b32, result, getReadOnlyFlags(result), CF); |
| 1639 | } else if (flags == FLAGS_ADD8) { |
| 1640 | // cpu->result.u8<cpu->dst.u8; |
| 1641 | compareReg(JitWidth::b8, getFlagResultReadOnly(result), getFlagDestReadOnly(getConditionCalculationReg(1)), JitEvaluate::LESS_THAN_UNSIGNED, result); |
| 1642 | } else if (flags == FLAGS_ADD16) { |
| 1643 | // cpu->result.u16<cpu->dst.u16; |
| 1644 | compareReg(JitWidth::b16, getFlagResultReadOnly(result), getFlagDestReadOnly(getConditionCalculationReg(1)), JitEvaluate::LESS_THAN_UNSIGNED, result); |
| 1645 | } else if (flags == FLAGS_ADD32) { |
| 1646 | // cpu->result.u32<cpu->dst.u32; |
| 1647 | compareReg(JitWidth::b32, getFlagResultReadOnly(result), getFlagDestReadOnly(getConditionCalculationReg(1)), JitEvaluate::LESS_THAN_UNSIGNED, result); |
| 1648 | } else if (flags == FLAGS_OR8) { |
| 1649 | // 0 |
| 1650 | xorReg(JitWidth::b32, result, result); |
| 1651 | } else if (flags == FLAGS_OR16) { |
| 1652 | // 0 |
| 1653 | xorReg(JitWidth::b32, result, result); |
| 1654 | } else if (flags == FLAGS_OR32) { |
| 1655 | // 0 |
| 1656 | xorReg(JitWidth::b32, result, result); |
| 1657 | } else if (flags == FLAGS_ADC8) { |
| 1658 | // (cpu->result.u8 < cpu->dst.u8) || (cpu->oldCF && (cpu->result.u8 == cpu->dst.u8)); |
| 1659 | RegPtr tmp = getConditionCalculationReg(2); |
| 1660 | RegPtr fResult = getFlagResultTmp(getConditionCalculationReg(1)); |
| 1661 | RegPtr fDest = getFlagDestReadOnly(tmp); |
| 1662 | compareReg(JitWidth::b8, fResult, fDest, JitEvaluate::LESS_THAN_UNSIGNED, result); |
| 1663 | compareReg(JitWidth::b8, fResult, fDest, JitEvaluate::EQUALS, fResult); |
| 1664 | andReg(JitWidth::b32, fResult, getFlagCF(tmp)); |
| 1665 | orReg(JitWidth::b32, result, fResult); |
| 1666 | } else if (flags == FLAGS_ADC16) { |
| 1667 | // (cpu->result.u16 < cpu->dst.u16) || (cpu->oldCF && (cpu->result.u16 == cpu->dst.u16)); |
| 1668 | RegPtr tmp = getConditionCalculationReg(2); |
| 1669 | RegPtr fResult = getFlagResultTmp(getConditionCalculationReg(1)); |
| 1670 | RegPtr fDest = getFlagDestReadOnly(tmp); |
| 1671 | compareReg(JitWidth::b16, fResult, fDest, JitEvaluate::LESS_THAN_UNSIGNED, result); |
| 1672 | compareReg(JitWidth::b16, fResult, fDest, JitEvaluate::EQUALS, fResult); |
| 1673 | andReg(JitWidth::b32, fResult, getFlagCF(tmp)); |
| 1674 | orReg(JitWidth::b32, result, fResult); |
| 1675 | } else if (flags == FLAGS_ADC32) { |
| 1676 | // (cpu->result.u32 < cpu->dst.u32) || (cpu->oldCF && (cpu->result.u32 == cpu->dst.u32)); |
| 1677 | RegPtr tmp = getConditionCalculationReg(2); |
| 1678 | RegPtr fResult = getFlagResultTmp(getConditionCalculationReg(1)); |
| 1679 | RegPtr fDest = getFlagDestReadOnly(tmp); |
| 1680 | compareReg(JitWidth::b32, fResult, fDest, JitEvaluate::LESS_THAN_UNSIGNED, result); |
| 1681 | compareReg(JitWidth::b32, fResult, fDest, JitEvaluate::EQUALS, fResult); |
| 1682 | andReg(JitWidth::b32, fResult, getFlagCF(tmp)); |
| 1683 | orReg(JitWidth::b32, result, fResult); |
| 1684 | } else if (flags == FLAGS_SBB8) { |
| 1685 | // (cpu->dst.u8 < cpu->result.u8) || (cpu->oldCF && (cpu->src.u8==0xff)); |
| 1686 | compareReg(JitWidth::b8, getFlagDestReadOnly(getConditionCalculationReg(1)), getFlagResultReadOnly(getConditionCalculationReg(2)), JitEvaluate::LESS_THAN_UNSIGNED, result); |
| 1687 | RegPtr tmp = getConditionCalculationReg(1); |
| 1688 | RegPtr tmp2 = getConditionCalculationReg(2); |
| 1689 | movValue(JitWidth::b32, tmp2, 0xff); |
| 1690 | compareReg(JitWidth::b8, getFlagSrcReadOnly(tmp), tmp2, JitEvaluate::EQUALS, tmp); |
| 1691 | andReg(JitWidth::b32, tmp, getFlagCF(tmp2)); |
| 1692 | orReg(JitWidth::b32, result, tmp); |
| 1693 | } else if (flags == FLAGS_SBB16) { |