mirror of
https://git.wownero.com/wownero/RandomWOW.git
synced 2024-08-15 00:23:14 +00:00
New DRAM reading pattern
New instruction weights
This commit is contained in:
parent
58ae98c6a4
commit
9ed71ae167
1 changed files with 51 additions and 266 deletions
317
tests/rx2c.py
317
tests/rx2c.py
|
@ -4,6 +4,38 @@ import os
|
||||||
|
|
||||||
PROGRAM_SIZE = 512
|
PROGRAM_SIZE = 512
|
||||||
INSTRUCTION_COUNT = 1024 * 1024
|
INSTRUCTION_COUNT = 1024 * 1024
|
||||||
|
INSTRUCTION_WEIGHTS = [
|
||||||
|
("ADD_64", 16),
|
||||||
|
("ADD_32", 8),
|
||||||
|
("SUB_64", 16),
|
||||||
|
("SUB_32", 8),
|
||||||
|
("MUL_64", 7),
|
||||||
|
("MULH_64", 7),
|
||||||
|
("MUL_32", 7),
|
||||||
|
("IMUL_32", 7),
|
||||||
|
("IMULH_64", 7),
|
||||||
|
("DIV_64", 1),
|
||||||
|
("IDIV_64", 1),
|
||||||
|
("AND_64", 4),
|
||||||
|
("AND_32", 3),
|
||||||
|
("OR_64", 4),
|
||||||
|
("OR_32", 3),
|
||||||
|
("XOR_64", 4),
|
||||||
|
("XOR_32", 3),
|
||||||
|
("SHL_64", 6),
|
||||||
|
("SHR_64", 6),
|
||||||
|
("SAR_64", 6),
|
||||||
|
("ROL_64", 9),
|
||||||
|
("ROR_64", 9),
|
||||||
|
("FADD", 22),
|
||||||
|
("FSUB", 22),
|
||||||
|
("FMUL", 22),
|
||||||
|
("FDIV", 8),
|
||||||
|
("FSQRT", 6),
|
||||||
|
("FROUND", 2),
|
||||||
|
("CALL", 17),
|
||||||
|
("RET", 15),
|
||||||
|
]
|
||||||
|
|
||||||
def genBytes(count):
|
def genBytes(count):
|
||||||
return ', '.join(str(random.getrandbits(8)) for i in range(count))
|
return ', '.join(str(random.getrandbits(8)) for i in range(count))
|
||||||
|
@ -114,8 +146,8 @@ def writeInitialValues(file):
|
||||||
file.write("\tr{0} = *(uint64_t*)(aesSeed + {1});\n".format(i, i * 8))
|
file.write("\tr{0} = *(uint64_t*)(aesSeed + {1});\n".format(i, i * 8))
|
||||||
for i in range(8):
|
for i in range(8):
|
||||||
file.write("\tf{0} = *(int64_t*)(aesSeed + {1});\n".format(i, 64 + i * 8))
|
file.write("\tf{0} = *(int64_t*)(aesSeed + {1});\n".format(i, 64 + i * 8))
|
||||||
file.write("\tmmu.m0 = (aesKey[9] << 8) | (aesKey[10] << 16) | (aesKey[11] << 24);\n")
|
|
||||||
file.write("\taesInitialize((__m128i*)aesKey, (__m128i*)aesSeed, (__m128i*)scratchpad, SCRATCHPAD_SIZE);\n")
|
file.write("\taesInitialize((__m128i*)aesKey, (__m128i*)aesSeed, (__m128i*)scratchpad, SCRATCHPAD_SIZE);\n")
|
||||||
|
file.write("\tmmu.m0 = (aesKey[10] << 16) | (aesKey[11] << 24);\n")
|
||||||
file.write("\tmmu.mx = 0;\n")
|
file.write("\tmmu.mx = 0;\n")
|
||||||
file.write("\tsp = 0;\n")
|
file.write("\tsp = 0;\n")
|
||||||
file.write("\tic = {0};\n".format(INSTRUCTION_COUNT))
|
file.write("\tic = {0};\n".format(INSTRUCTION_COUNT))
|
||||||
|
@ -365,264 +397,17 @@ def write_RET(file, i, symbol):
|
||||||
file.write("\t\t\tgoto *target;\n")
|
file.write("\t\t\tgoto *target;\n")
|
||||||
file.write("\t\t}}\n\t\t{0} = A; }}\n".format(writeC(symbol, type)))
|
file.write("\t\t}}\n\t\t{0} = A; }}\n".format(writeC(symbol, type)))
|
||||||
|
|
||||||
opcodeMap = {
|
opcodeMap = { }
|
||||||
0: write_ADD_64,
|
|
||||||
1: write_ADD_64,
|
def buildOpcodeMap():
|
||||||
2: write_ADD_64,
|
functions = globals()
|
||||||
3: write_ADD_64,
|
totalWeight = 0;
|
||||||
4: write_ADD_64,
|
for instruction, weight in INSTRUCTION_WEIGHTS:
|
||||||
5: write_ADD_64,
|
func = functions['write_' + instruction]
|
||||||
6: write_ADD_64,
|
for i in range(weight):
|
||||||
7: write_ADD_64,
|
opcodeMap[totalWeight] = func
|
||||||
8: write_ADD_64,
|
totalWeight = totalWeight + 1
|
||||||
9: write_ADD_64,
|
assert totalWeight == 256
|
||||||
10: write_ADD_64,
|
|
||||||
11: write_ADD_64,
|
|
||||||
12: write_ADD_64,
|
|
||||||
13: write_ADD_64,
|
|
||||||
14: write_ADD_32,
|
|
||||||
15: write_ADD_32,
|
|
||||||
16: write_ADD_32,
|
|
||||||
17: write_ADD_32,
|
|
||||||
18: write_ADD_32,
|
|
||||||
19: write_ADD_32,
|
|
||||||
20: write_ADD_32,
|
|
||||||
21: write_SUB_64,
|
|
||||||
22: write_SUB_64,
|
|
||||||
23: write_SUB_64,
|
|
||||||
24: write_SUB_64,
|
|
||||||
25: write_SUB_64,
|
|
||||||
26: write_SUB_64,
|
|
||||||
27: write_SUB_64,
|
|
||||||
28: write_SUB_64,
|
|
||||||
29: write_SUB_64,
|
|
||||||
30: write_SUB_64,
|
|
||||||
31: write_SUB_64,
|
|
||||||
32: write_SUB_64,
|
|
||||||
33: write_SUB_64,
|
|
||||||
34: write_SUB_64,
|
|
||||||
35: write_SUB_32,
|
|
||||||
36: write_SUB_32,
|
|
||||||
37: write_SUB_32,
|
|
||||||
38: write_SUB_32,
|
|
||||||
39: write_SUB_32,
|
|
||||||
40: write_SUB_32,
|
|
||||||
41: write_SUB_32,
|
|
||||||
42: write_MUL_64,
|
|
||||||
43: write_MUL_64,
|
|
||||||
44: write_MUL_64,
|
|
||||||
45: write_MUL_64,
|
|
||||||
46: write_MULH_64,
|
|
||||||
47: write_MULH_64,
|
|
||||||
48: write_MULH_64,
|
|
||||||
49: write_MULH_64,
|
|
||||||
50: write_MUL_32,
|
|
||||||
51: write_MUL_32,
|
|
||||||
52: write_MUL_32,
|
|
||||||
53: write_MUL_32,
|
|
||||||
54: write_IMUL_32,
|
|
||||||
55: write_IMUL_32,
|
|
||||||
56: write_IMUL_32,
|
|
||||||
57: write_IMUL_32,
|
|
||||||
58: write_IMULH_64,
|
|
||||||
59: write_IMULH_64,
|
|
||||||
60: write_IMULH_64,
|
|
||||||
61: write_IMULH_64,
|
|
||||||
62: write_DIV_64,
|
|
||||||
63: write_IDIV_64,
|
|
||||||
64: write_AND_64,
|
|
||||||
65: write_AND_64,
|
|
||||||
66: write_AND_64,
|
|
||||||
67: write_AND_64,
|
|
||||||
68: write_AND_64,
|
|
||||||
69: write_AND_64,
|
|
||||||
70: write_AND_64,
|
|
||||||
71: write_AND_64,
|
|
||||||
72: write_AND_64,
|
|
||||||
73: write_AND_64,
|
|
||||||
74: write_AND_64,
|
|
||||||
75: write_AND_64,
|
|
||||||
76: write_AND_64,
|
|
||||||
77: write_AND_32,
|
|
||||||
78: write_AND_32,
|
|
||||||
79: write_AND_32,
|
|
||||||
80: write_AND_32,
|
|
||||||
81: write_AND_32,
|
|
||||||
82: write_AND_32,
|
|
||||||
83: write_OR_64,
|
|
||||||
84: write_OR_64,
|
|
||||||
85: write_OR_64,
|
|
||||||
86: write_OR_64,
|
|
||||||
87: write_OR_64,
|
|
||||||
88: write_OR_64,
|
|
||||||
89: write_OR_64,
|
|
||||||
90: write_OR_64,
|
|
||||||
91: write_OR_64,
|
|
||||||
92: write_OR_64,
|
|
||||||
93: write_OR_64,
|
|
||||||
94: write_OR_64,
|
|
||||||
95: write_OR_64,
|
|
||||||
96: write_OR_32,
|
|
||||||
97: write_OR_32,
|
|
||||||
98: write_OR_32,
|
|
||||||
99: write_OR_32,
|
|
||||||
100: write_OR_32,
|
|
||||||
101: write_OR_32,
|
|
||||||
102: write_XOR_64,
|
|
||||||
103: write_XOR_64,
|
|
||||||
104: write_XOR_64,
|
|
||||||
105: write_XOR_64,
|
|
||||||
106: write_XOR_64,
|
|
||||||
107: write_XOR_64,
|
|
||||||
108: write_XOR_64,
|
|
||||||
109: write_XOR_64,
|
|
||||||
110: write_XOR_64,
|
|
||||||
111: write_XOR_64,
|
|
||||||
112: write_XOR_64,
|
|
||||||
113: write_XOR_64,
|
|
||||||
114: write_XOR_64,
|
|
||||||
115: write_XOR_64,
|
|
||||||
116: write_XOR_32,
|
|
||||||
117: write_XOR_32,
|
|
||||||
118: write_XOR_32,
|
|
||||||
119: write_XOR_32,
|
|
||||||
120: write_XOR_32,
|
|
||||||
121: write_XOR_32,
|
|
||||||
122: write_SHL_64,
|
|
||||||
123: write_SHL_64,
|
|
||||||
124: write_SHL_64,
|
|
||||||
125: write_SHL_64,
|
|
||||||
126: write_SHL_64,
|
|
||||||
127: write_SHL_64,
|
|
||||||
128: write_SHL_64,
|
|
||||||
129: write_SHR_64,
|
|
||||||
130: write_SHR_64,
|
|
||||||
131: write_SHR_64,
|
|
||||||
132: write_SHR_64,
|
|
||||||
133: write_SAR_64,
|
|
||||||
134: write_SAR_64,
|
|
||||||
135: write_SAR_64,
|
|
||||||
136: write_ROL_64,
|
|
||||||
137: write_ROL_64,
|
|
||||||
138: write_ROL_64,
|
|
||||||
139: write_ROL_64,
|
|
||||||
140: write_ROL_64,
|
|
||||||
141: write_ROL_64,
|
|
||||||
142: write_ROL_64,
|
|
||||||
143: write_ROL_64,
|
|
||||||
144: write_ROL_64,
|
|
||||||
145: write_ROL_64,
|
|
||||||
146: write_ROL_64,
|
|
||||||
147: write_ROR_64,
|
|
||||||
148: write_ROR_64,
|
|
||||||
149: write_ROR_64,
|
|
||||||
150: write_ROR_64,
|
|
||||||
151: write_ROR_64,
|
|
||||||
152: write_ROR_64,
|
|
||||||
153: write_ROR_64,
|
|
||||||
154: write_ROR_64,
|
|
||||||
155: write_ROR_64,
|
|
||||||
156: write_ROR_64,
|
|
||||||
157: write_ROR_64,
|
|
||||||
158: write_FADD,
|
|
||||||
159: write_FADD,
|
|
||||||
160: write_FADD,
|
|
||||||
161: write_FADD,
|
|
||||||
162: write_FADD,
|
|
||||||
163: write_FADD,
|
|
||||||
164: write_FADD,
|
|
||||||
165: write_FADD,
|
|
||||||
166: write_FADD,
|
|
||||||
167: write_FADD,
|
|
||||||
168: write_FADD,
|
|
||||||
169: write_FADD,
|
|
||||||
170: write_FADD,
|
|
||||||
171: write_FADD,
|
|
||||||
172: write_FADD,
|
|
||||||
173: write_FADD,
|
|
||||||
174: write_FADD,
|
|
||||||
175: write_FADD,
|
|
||||||
176: write_FSUB,
|
|
||||||
177: write_FSUB,
|
|
||||||
178: write_FSUB,
|
|
||||||
179: write_FSUB,
|
|
||||||
180: write_FSUB,
|
|
||||||
181: write_FSUB,
|
|
||||||
182: write_FSUB,
|
|
||||||
183: write_FSUB,
|
|
||||||
184: write_FSUB,
|
|
||||||
185: write_FSUB,
|
|
||||||
186: write_FSUB,
|
|
||||||
187: write_FSUB,
|
|
||||||
188: write_FSUB,
|
|
||||||
189: write_FSUB,
|
|
||||||
190: write_FSUB,
|
|
||||||
191: write_FSUB,
|
|
||||||
192: write_FSUB,
|
|
||||||
193: write_FSUB,
|
|
||||||
194: write_FMUL,
|
|
||||||
195: write_FMUL,
|
|
||||||
196: write_FMUL,
|
|
||||||
197: write_FMUL,
|
|
||||||
198: write_FMUL,
|
|
||||||
199: write_FMUL,
|
|
||||||
200: write_FMUL,
|
|
||||||
201: write_FMUL,
|
|
||||||
202: write_FMUL,
|
|
||||||
203: write_FMUL,
|
|
||||||
204: write_FMUL,
|
|
||||||
205: write_FMUL,
|
|
||||||
206: write_FMUL,
|
|
||||||
207: write_FMUL,
|
|
||||||
208: write_FMUL,
|
|
||||||
209: write_FMUL,
|
|
||||||
210: write_FMUL,
|
|
||||||
211: write_FMUL,
|
|
||||||
212: write_FDIV,
|
|
||||||
213: write_FDIV,
|
|
||||||
214: write_FDIV,
|
|
||||||
215: write_FSQRT,
|
|
||||||
216: write_FSQRT,
|
|
||||||
217: write_FSQRT,
|
|
||||||
218: write_FSQRT,
|
|
||||||
219: write_FSQRT,
|
|
||||||
220: write_FSQRT,
|
|
||||||
221: write_FSQRT,
|
|
||||||
222: write_FROUND,
|
|
||||||
223: write_FROUND,
|
|
||||||
224: write_CALL,
|
|
||||||
225: write_CALL,
|
|
||||||
226: write_CALL,
|
|
||||||
227: write_CALL,
|
|
||||||
228: write_CALL,
|
|
||||||
229: write_CALL,
|
|
||||||
230: write_CALL,
|
|
||||||
231: write_CALL,
|
|
||||||
232: write_CALL,
|
|
||||||
233: write_CALL,
|
|
||||||
234: write_CALL,
|
|
||||||
235: write_CALL,
|
|
||||||
236: write_CALL,
|
|
||||||
237: write_CALL,
|
|
||||||
238: write_CALL,
|
|
||||||
239: write_CALL,
|
|
||||||
240: write_CALL,
|
|
||||||
241: write_RET,
|
|
||||||
242: write_RET,
|
|
||||||
243: write_RET,
|
|
||||||
244: write_RET,
|
|
||||||
245: write_RET,
|
|
||||||
246: write_RET,
|
|
||||||
247: write_RET,
|
|
||||||
248: write_RET,
|
|
||||||
249: write_RET,
|
|
||||||
250: write_RET,
|
|
||||||
251: write_RET,
|
|
||||||
252: write_RET,
|
|
||||||
253: write_RET,
|
|
||||||
254: write_RET,
|
|
||||||
255: write_RET,
|
|
||||||
}
|
|
||||||
|
|
||||||
def writeCode(file, i, symbol):
|
def writeCode(file, i, symbol):
|
||||||
opcodeMap.get(symbol.opcode)(file, i, symbol)
|
opcodeMap.get(symbol.opcode)(file, i, symbol)
|
||||||
|
@ -664,7 +449,6 @@ def writeProlog(file):
|
||||||
"} stack_t;\n"
|
"} stack_t;\n"
|
||||||
"typedef struct {\n"
|
"typedef struct {\n"
|
||||||
" addr_t m0;\n"
|
" addr_t m0;\n"
|
||||||
" addr_t m1;\n"
|
|
||||||
" addr_t mx;\n"
|
" addr_t mx;\n"
|
||||||
"#ifdef RAM\n"
|
"#ifdef RAM\n"
|
||||||
" const char* buffer;\n"
|
" const char* buffer;\n"
|
||||||
|
@ -680,10 +464,10 @@ def writeProlog(file):
|
||||||
"#define STACK_LENGTH (128 * 1024)\n"
|
"#define STACK_LENGTH (128 * 1024)\n"
|
||||||
"#ifdef RAM\n"
|
"#ifdef RAM\n"
|
||||||
"#define DRAM_READ(mmu) (convertible_t)*(uint64_t*)((mmu)->buffer + (mmu)->m0)\n"
|
"#define DRAM_READ(mmu) (convertible_t)*(uint64_t*)((mmu)->buffer + (mmu)->m0)\n"
|
||||||
"#define PREFETCH(mmu) _mm_prefetch(((mmu)->buffer + (mmu)->m1), _MM_HINT_T0)\n"
|
"#define PREFETCH(mmu) _mm_prefetch(((mmu)->buffer + (mmu)->m0), _MM_HINT_T0)\n"
|
||||||
"#else\n"
|
"#else\n"
|
||||||
"#define DRAM_READ(mmu) (convertible_t)(uint64_t)__rolq(6364136223846793005ULL*((mmu)->m0)+1442695040888963407ULL,32)\n"
|
"#define DRAM_READ(mmu) (convertible_t)(uint64_t)__rolq(6364136223846793005ULL*((mmu)->m0)+1442695040888963407ULL,32)\n"
|
||||||
"#define PREFETCH(x)\n"
|
"#define PREFETCH(mmu)\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#define PUSH_VALUE(x) stack[sp++].value = x\n"
|
"#define PUSH_VALUE(x) stack[sp++].value = x\n"
|
||||||
"#define PUSH_ADDRESS(x) stack[sp++].address = x\n"
|
"#define PUSH_ADDRESS(x) stack[sp++].address = x\n"
|
||||||
|
@ -695,12 +479,12 @@ def writeProlog(file):
|
||||||
" data = DRAM_READ(mmu);\n"
|
" data = DRAM_READ(mmu);\n"
|
||||||
" mmu->m0 += 8;\n"
|
" mmu->m0 += 8;\n"
|
||||||
" mmu->mx ^= addr;\n"
|
" mmu->mx ^= addr;\n"
|
||||||
" if((mmu->m0 & 255) == 128) {\n"
|
" if((mmu->mx & 0xFFFF) == 0) {\n"
|
||||||
" mmu->m1 = mmu->mx & 0xFFFFFF00;\n"
|
" mmu->m0 = mmu->mx;\n"
|
||||||
|
"#if defined(PREF)\n"
|
||||||
" PREFETCH(mmu);\n"
|
" PREFETCH(mmu);\n"
|
||||||
|
"#endif\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" if((mmu->m0 & 255) == 0)\n"
|
|
||||||
" mmu->m0 = mmu->m1;\n"
|
|
||||||
" return data;\n"
|
" return data;\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"static inline __m128i sl_xor(__m128i tmp1) {\n"
|
"static inline __m128i sl_xor(__m128i tmp1) {\n"
|
||||||
|
@ -792,6 +576,7 @@ def writeProlog(file):
|
||||||
"}\n"))
|
"}\n"))
|
||||||
|
|
||||||
with sys.stdout as file:
|
with sys.stdout as file:
|
||||||
|
buildOpcodeMap()
|
||||||
writeProlog(file)
|
writeProlog(file)
|
||||||
file.write("const byte aesKey[32] = {{ {0} }};\n".format(genBytes(32)))
|
file.write("const byte aesKey[32] = {{ {0} }};\n".format(genBytes(32)))
|
||||||
file.write("const byte aesSeed[128] = {{ {0} }};\n".format(genBytes(128)))
|
file.write("const byte aesSeed[128] = {{ {0} }};\n".format(genBytes(128)))
|
||||||
|
|
Loading…
Reference in a new issue