MCPcopy Create free account
hub / github.com/danoon2/Boxedwine / getCF

Method getCF

source/emulation/cpu/jit/jitCodeGen.cpp:1636–1837  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1634}
1635
1636void 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) {

Callers 1

initMethod · 0.45

Calls 1

kpanicFunction · 0.85

Tested by

no test coverage detected