/* An example of ccmp > g++ ccmp.cpp -I ../xbyak > sde -future -- ./a.out */ #include #include #include using namespace Xbyak; struct Code1 : Xbyak::CodeGenerator { Code1() { Xbyak::util::StackFrame sf(this, 2); const auto& p1 = sf.p[0]; const auto& p2 = sf.p[1]; int dfv = 0; cmp(p1, 3); ctesta(p2, 1, dfv); // eflags = (p1 > 3) ? ((p2 & 1) == 0) : dfv; setz(al|T_zu); } }; struct Code2 : Xbyak::CodeGenerator { Code2() { Xbyak::util::StackFrame sf(this, 3); const auto& p1 = sf.p[0]; const auto& p2 = sf.p[1]; const auto& p3 = sf.p[2]; int dfv = 0; cmp(p1, 1); ccmpe(p2, 2, dfv); // eflags = p1==1 ? p2==2 : dfv; ccmpe(p3, 3, dfv); // eflags = (p1==1 && p2==2) ? p3==3 : dfv; setz(al|T_zu); // p1==1 && p2==2 && p3==3 } }; int main() try { { puts("(p1 > 3) && ((p2 & 1) == 0)"); Code1 c; auto f = c.getCode(); for (int p1 = 2; p1 < 5; p1++) { for (int p2 = 0; p2 < 3; p2++) { printf("p1=%d p2=%d ret=%d (%d)\n", p1, p2, f(p1, p2), p1 > 3 && ((p2&1) == 0)); } } } { puts("p1 == 1 && p2 == 2 && p3 == 3"); Code2 c; auto f = c.getCode(); for (int p1 = 0; p1 < 3; p1++) { for (int p2 = 1; p2 < 4; p2++) { for (int p3 = 2; p3 < 5; p3++) { printf("p1=%d p2=%d p3=%d ret=%d (%d)\n", p1, p2, p3, f(p1, p2, p3), p1==1 && p2==2 && p3==3); } } } } } catch (std::exception& e) { printf("ERR %s\n", e.what()); }