Przeglądaj źródła

New DRAM reading pattern
New instruction weights

tevador 7 lat temu
rodzic
commit
9ed71ae167
1 zmienionych plików z 51 dodań i 266 usunięć
  1. 51 266
      tests/rx2c.py

+ 51 - 266
tests/rx2c.py

@@ -4,6 +4,38 @@ import os
 
 PROGRAM_SIZE = 512
 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):
     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))
     for i in range(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("\tmmu.m0 = (aesKey[10] << 16) | (aesKey[11] << 24);\n")
     file.write("\tmmu.mx = 0;\n")
     file.write("\tsp = 0;\n")
     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}}\n\t\t{0} = A; }}\n".format(writeC(symbol, type)))
 
-opcodeMap = {
-    0: write_ADD_64,
-    1: write_ADD_64,
-    2: write_ADD_64,
-    3: write_ADD_64,
-    4: write_ADD_64,
-    5: write_ADD_64,
-    6: write_ADD_64,
-    7: write_ADD_64,
-    8: write_ADD_64,
-    9: write_ADD_64,
-    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,
-}
+opcodeMap = { }
+
+def buildOpcodeMap():
+    functions = globals()
+    totalWeight = 0;
+    for instruction, weight in INSTRUCTION_WEIGHTS:
+        func = functions['write_' + instruction]
+        for i in range(weight):
+            opcodeMap[totalWeight] = func
+            totalWeight = totalWeight + 1
+    assert totalWeight == 256
 
 def writeCode(file, i, symbol):
     opcodeMap.get(symbol.opcode)(file, i, symbol)
@@ -664,7 +449,6 @@ def writeProlog(file):
                 "} stack_t;\n"
                 "typedef struct {\n"
                 "	addr_t m0;\n"
-                "	addr_t m1;\n"
                 "	addr_t mx;\n"
                 "#ifdef RAM\n"
                 "	const char* buffer;\n"
@@ -680,10 +464,10 @@ def writeProlog(file):
                 "#define STACK_LENGTH (128 * 1024)\n"
                 "#ifdef RAM\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"
                 "#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"
                 "#define PUSH_VALUE(x) stack[sp++].value = x\n"
                 "#define PUSH_ADDRESS(x) stack[sp++].address = x\n"
@@ -695,12 +479,12 @@ def writeProlog(file):
                 "	data = DRAM_READ(mmu);\n"
                 "	mmu->m0 += 8;\n"
                 "	mmu->mx ^= addr;\n"
-                "	if((mmu->m0 & 255) == 128) {\n"
-                "		mmu->m1 = mmu->mx & 0xFFFFFF00;\n"
+                "	if((mmu->mx & 0xFFFF) == 0) {\n"
+                "		mmu->m0 = mmu->mx;\n"
+                "#if defined(PREF)\n"
                 "		PREFETCH(mmu);\n"
+                "#endif\n"
                 "	}\n"
-                "	if((mmu->m0 & 255) == 0)\n"
-                "		mmu->m0 = mmu->m1;\n"
                 "	return data;\n"
                 "}\n"
                 "static inline __m128i sl_xor(__m128i tmp1) {\n"
@@ -792,6 +576,7 @@ def writeProlog(file):
                 "}\n"))
 
 with sys.stdout as file:
+    buildOpcodeMap()
     writeProlog(file)
     file.write("const byte aesKey[32] = {{ {0} }};\n".format(genBytes(32)))
     file.write("const byte aesSeed[128] = {{ {0} }};\n".format(genBytes(128)))