#if defined(_MSC_VER) && (_MSC_VER <= 1200) #pragma warning(disable:4514) #pragma warning(disable:4786) #endif #include #include #include "../../include.mie/mie_thread.h" #include "xbyak/xbyak.h" class WriteMMX : public Xbyak::CodeGenerator { public: WriteMMX() { #ifdef XBYAK32 mov(ecx, ptr [esp + 4]); #endif movd(mm0, ecx); ret(); } void (*set() const)(int x) { return (void (*)(int x))getCode(); } }; class ReadMMX : public Xbyak::CodeGenerator { public: ReadMMX() { movd(eax, mm0); ret(); } int (*get() const)() { return (int (*)())getCode(); } }; class Test : public MIE::ThreadBase { int n_; public: Test(int n) : n_(n) { } void threadEntry() { printf("n=%d\n", n_); WriteMMX w; w.set()(n_); ReadMMX r; for (;;) { int b = r.get()(); printf("b=%d\n", b); if (b != n_) { printf("mm0 has changed!\n"); } MIE::MIE_Sleep(1000); } } void stopThread() { } }; int main(int argc, char *argv[]) { #ifdef XBYAK32 puts("32bit"); #else puts("64bit"); #endif try { int n = atoi(argc == 1 ? "1223" : argv[1]); Test test0(n), test1(n + 1); test0.beginThread(); test1.beginThread(); test0.joinThread(); test1.joinThread(); } catch (std::exception& e) { printf("ERR:%s\n", e.what()); } catch (...) { printf("unknown error\n"); } }