-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathjank_test.cpp
More file actions
122 lines (105 loc) · 2.46 KB
/
Copy pathjank_test.cpp
File metadata and controls
122 lines (105 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "zero/util.h"
#include "zero/custom_intrin.h"
struct x87EnvTest {
FCW fcw;
uint16_t pad0;
FSW fsw;
uint16_t pad1;
uint16_t tag_word;
uint16_t pad2;
uint32_t fip;
uint16_t fcs;
uint16_t fop;
uint32_t fdp;
uint16_t fds;
uint16_t pad3;
};
dllexport gnu_noinline void mmx_jank_test() {
__asm {
EMMS
FLDZ
FLDZ
FLDZ
FLDZ
FLDZ
FLDZ
FLDZ
FLDZ
FNINIT
FNCLEX
}
struct {
union {
float tempf[4];
int32_t tempi[4];
};
x87EnvTest env[4];
} stack;
memset(&stack, 0, sizeof(stack));
__asm {
FLD1
FST stack.tempf
}
store_x87_env(&stack.env[0]);
__asm {
XORPS XMM0, XMM0
CVTPI2PS XMM0, stack.tempi
FST stack.tempf + 4
}
store_x87_env(&stack.env[1]);
__asm {
CVTPI2PS XMM0, MM0
FST stack.tempf + 8
}
store_x87_env(&stack.env[2]);
__asm {
MOVQ MM0, MM0
FST stack.tempf + 12
}
store_x87_env(&stack.env[3]);
__asm {
EMMS
}
static constexpr const char* fpu_tag_strings[] = {
"Valid",
"Zero ",
"Other",
"Empty"
};
#define TagWordString(i, r) \
fpu_tag_strings[((uint32_t)stack.env[i].tag_word >> ((r) * 2)) & 0b11]
printf(
"x87 base:\n"
"-TOS: %u\n"
"-TAG: %04X, %s,%s,%s,%s,%s,%s,%s,%s\n"
"-VAL: %08X\n"
"MMX mem->SSE:\n"
"-TOS: %u\n"
"-TAG: %04X, %s,%s,%s,%s,%s,%s,%s,%s\n"
"-VAL: %08X\n"
"MMX reg->SSE:\n"
"-TOS: %u\n"
"-TAG: %04X, %s,%s,%s,%s,%s,%s,%s,%s\n"
"-VAL: %08X\n"
"MMX reg->MMX:\n"
"-TOS: %u\n"
"-TAG: %04X, %s,%s,%s,%s,%s,%s,%s,%s\n"
"-VAL: %08X\n"
, stack.env[0].fsw.stack_top
, stack.env[0].tag_word, TagWordString(0, 0), TagWordString(0, 1), TagWordString(0, 2), TagWordString(0, 3), TagWordString(0, 4), TagWordString(0, 5), TagWordString(0, 6), TagWordString(0, 7)
, stack.tempi[0]
, stack.env[1].fsw.stack_top
, stack.env[1].tag_word, TagWordString(1, 0), TagWordString(1, 1), TagWordString(1, 2), TagWordString(1, 3), TagWordString(1, 4), TagWordString(1, 5), TagWordString(1, 6), TagWordString(1, 7)
, stack.tempi[1]
, stack.env[2].fsw.stack_top
, stack.env[2].tag_word, TagWordString(2, 0), TagWordString(2, 1), TagWordString(2, 2), TagWordString(2, 3), TagWordString(2, 4), TagWordString(2, 5), TagWordString(2, 6), TagWordString(2, 7)
, stack.tempi[2]
, stack.env[3].fsw.stack_top
, stack.env[3].tag_word, TagWordString(3, 0), TagWordString(3, 1), TagWordString(3, 2), TagWordString(3, 3), TagWordString(3, 4), TagWordString(3, 5), TagWordString(3, 6), TagWordString(3, 7)
, stack.tempi[3]
);
}
int main() {
mmx_jank_test();
return 0;
}