// The OS/K Team licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #include //----------------------------------------------------------------------------// #define IMPL_START(name) \ uint i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2, acc_t *p3, \ ulong *r1, ulong *r2, ulong *r3) \ //----------------------------------------------------------------------------// #define INTO() \ if (R(RFX) & OF) _except(ctx, E_OVF, "Overflow"); #define PARITY(v) __builtin_parity(v) #define SET_ZF(v) \ R(RFX) = ((v) == 0 ? (R(RFX)|ZF) : (R(RFX)&~ZF)) #define SET_SF(v) \ R(RFX) = ((long)(v) < 0 ? (R(RFX)|SF) : (R(RFX)&~SF)) #define SET_PF(v) \ R(RFX) = (PARITY(v) == 1 ? (R(RFX)|PF) : (R(RFX)&~PF)) #define SET_ZSF(v) \ SET_ZF(v); \ SET_SF(v) //----------------------------------------------------------------------------// #define COMPARE_ADD(v1, v2) \ ulong _u1 = (ulong)v1, _u2 = (ulong)v2, _u3 = (_u1 + _u2); \ \ if (_u1 + _u2 < _u2) R(RFX) |= CF; \ else R(RFX) &= ~CF; \ \ if (((_u1 ^ _u3) & (_u2 ^ _u3)) >> 63) \ R(RFX) |= OF; \ else R(RFX) &= ~OF; \ \ SET_ZSF(_u3); #define COMPARE_SUB(v1, v2) \ ulong _u1 = (ulong)v1, _u2 = (ulong)v2, _u3 = (_u1 - _u2); \ \ if (_u1 < _u2) R(RFX) |= CF; \ else R(RFX) &= ~CF; \ \ if (((_u1 ^ _u3) & (_u1 ^ _u2)) >> 63) \ R(RFX) |= OF; \ else R(RFX) &= ~OF; \ \ SET_ZSF(_u3); //----------------------------------------------------------------------------// #define CHK_SUPERV() \ do { \ if ((R(CR0) & UF) > 0) { \ _except(ctx, E_SYS, "Supervisor-only INSTR"); \ } \ } while (0) //----------------------------------------------------------------------------//