cosmopolitan/tool/build/lib/cond.h

51 lines
1.4 KiB
C

#ifndef COSMOPOLITAN_TOOL_BUILD_LIB_COND_H_
#define COSMOPOLITAN_TOOL_BUILD_LIB_COND_H_
#include "tool/build/lib/flags.h"
#include "tool/build/lib/machine.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0)
forceinline bool GetCond(struct Machine *m, int x) {
uint32_t f = m->flags;
switch (x) {
case 0:
return GetFlag(f, FLAGS_OF);
case 1:
return !GetFlag(f, FLAGS_OF);
case 2:
return GetFlag(f, FLAGS_CF);
case 3:
return !GetFlag(f, FLAGS_CF);
case 4:
return GetFlag(f, FLAGS_ZF);
case 5:
return !GetFlag(f, FLAGS_ZF);
case 6:
return GetFlag(f, FLAGS_CF) || GetFlag(f, FLAGS_ZF);
case 7:
return !GetFlag(f, FLAGS_CF) && !GetFlag(f, FLAGS_ZF);
case 8:
return GetFlag(f, FLAGS_SF);
case 9:
return !GetFlag(f, FLAGS_SF);
case 10:
return GetFlag(f, FLAGS_PF);
case 11:
return !GetFlag(f, FLAGS_PF);
case 12:
return GetFlag(f, FLAGS_SF) != GetFlag(f, FLAGS_OF);
case 13:
return GetFlag(f, FLAGS_SF) == GetFlag(f, FLAGS_OF);
case 14:
return GetFlag(f, FLAGS_ZF) ||
GetFlag(f, FLAGS_SF) != GetFlag(f, FLAGS_OF);
case 15:
return !GetFlag(f, FLAGS_ZF) &&
GetFlag(f, FLAGS_SF) == GetFlag(f, FLAGS_OF);
default:
unreachable;
}
}
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_TOOL_BUILD_LIB_COND_H_ */