void cgAssertType(IRLS& env, const IRInstruction* inst) { auto& v = vmain(env); auto const& dtype = inst->dst()->type(); if (dtype == TBottom) { v << ud2(); v = v.makeBlock(); return; } auto const dst = dstLoc(env, inst, 0); auto const src = srcLoc(env, inst, 0); copyTV(v, src, dst, dtype); }
static void test_lt () { rw_info (0, __FILE__, __LINE__, "operator<"); std::tuple<> nt1, nt2; TEST (!(nt1 < nt1)); TEST (!(nt1 < nt2)); std::tuple<int> it1 (1), it2 (2); TEST (!(it1 < it1)); TEST (it1 < it2); UserDefined ud1 (1), ud2 (2); std::tuple<UserDefined> ut1 (ud1), ut2 (ud2); TEST (!(ut1 < ut1)); TEST (ut1 < ut2); std::tuple<long, const char*> pt1 (1234L, "string"); TEST (!(pt1 < pt1)); std::tuple<long, const char*> pt2 (1235L, "string"); TEST (pt1 < pt2); std::tuple<long, const char*> pt3 (1234L, "strings"); TEST (pt1 < pt3); std::tuple<bool, char, int, double, void*, UserDefined> bt1 (true, 'a', 255, 3.14159, &nt1, ud1), bt2 (true, 'a', 256, 3.14159, &nt1, ud1), bt3 (true, 'a', 255, 3.14159, &nt1, ud2); rw_assert (!(bt1 < bt1), __FILE__, __LINE__, "bt1 < bt1, got true, expected false"); rw_assert (bt1 < bt2, __FILE__, __LINE__, "bt1 < bt2, got false, expected true"); rw_assert (bt1 < bt3, __FILE__, __LINE__, "bt1 < bt3, got false, expected true"); }
static void test_eq () { rw_info (0, __FILE__, __LINE__, "operator=="); std::tuple<> nt1, nt2; // special case rw_assert (nt1 == nt1, __FILE__, __LINE__, "nt1 == nt1, got false, expected true"); #undef TEST #define TEST(expr) \ rw_assert (expr, __FILE__, __LINE__, #expr \ "; got %b, expected %b", !(expr), expr) TEST (nt1 == nt2); std::tuple<int> it1 (1), it2 (1), it3 (2); TEST (it1 == it1); TEST (it1 == it2); TEST (!(it1 == it3)); UserDefined ud1 (1), ud2 (2); std::tuple<UserDefined> ut1 (ud1), ut2 (ud1), ut3 (ud2); TEST (ut1 == ut1); TEST (ut1 == ut2); TEST (!(ut1 == ut3)); std::tuple<bool, char, int, double, void*, UserDefined> bt1 (true, 'a', 255, 3.14159, &nt1, ud1), bt2 (true, 'a', 255, 3.14159, &nt1, ud1), bt3 (true, 'a', 256, 3.14159, &nt1, ud1); TEST (bt1 == bt1); TEST (bt1 == bt2); TEST (!(bt1 == bt3)); }
explicit Code(int mode, size_t size, void *p) : Xbyak::CodeGenerator(size, p) { inLocalLabel(); #ifdef XBYAK64 const Xbyak::Reg64& a = rax; const Xbyak::Reg64& c = rcx; #ifdef XBYAK64_WIN mov(rax, rcx); #else mov(rax, rdi); #endif #else const Xbyak::Reg32& a = eax; const Xbyak::Reg32& c = ecx; mov(a, ptr [esp + 4]); #endif switch (mode) { case 0: mov(c, ".jmp_table"); lea(c, ptr [c + a * 8]); jmp(c); align(8); L(".jmp_table"); mov(a, expectTbl[0]); ret(); align(8); mov(a, expectTbl[1]); ret(); align(8); mov(a, expectTbl[2]); ret(); break; case 1: /* the label for putL is defined when called */ mov(c, ".jmp_table"); jmp(ptr [c + a * (int)sizeof(size_t)]); L(".label1"); mov(a, expectTbl[0]); jmp(".end"); L(".label2"); mov(a, expectTbl[1]); jmp(".end"); L(".label3"); mov(a, expectTbl[2]); jmp(".end"); L(".end"); ret(); ud2(); align(8); L(".jmp_table"); putL(".label1"); putL(".label2"); putL(".label3"); break; case 2: /* the label for putL is not defined when called */ jmp(".in"); ud2(); align(8); L(".jmp_table"); putL(".label1"); putL(".label2"); putL(".label3"); L(".in"); mov(c, ".jmp_table"); jmp(ptr [c + a * (int)sizeof(size_t)]); L(".label1"); mov(a, expectTbl[0]); jmp(".end"); L(".label2"); mov(a, expectTbl[1]); jmp(".end"); L(".label3"); mov(a, expectTbl[2]); jmp(".end"); L(".end"); ret(); break; } outLocalLabel(); }