mirror of
https://github.com/pineappleEA/pineapple-src.git
synced 2024-11-29 18:18:28 -05:00
79 lines
1.3 KiB
C++
79 lines
1.3 KiB
C++
|
#if defined(_MSC_VER) && (_MSC_VER <= 1200)
|
||
|
#pragma warning(disable:4514)
|
||
|
#pragma warning(disable:4786)
|
||
|
#endif
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#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<Test> {
|
||
|
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");
|
||
|
}
|
||
|
}
|