address.cpp
1 #include <stdio.h> 2 #include <string.h> 3 4 #define NUM_OF_ARRAY(x) (sizeof(x) / sizeof(x[0])) 5 6 void genVsibSub(bool isJIT, const char *name, const char *tbl[], size_t tblSize) 7 { 8 for (size_t i = 0; i < tblSize; i++) { 9 if (isJIT) { 10 printf("%s (ymm7, ptr[", name); 11 } else { 12 printf("%s ymm7, [", name); 13 } 14 printf("%s", tbl[i]); 15 if (isJIT) { 16 printf("], ymm4); dump();\n"); 17 } else { 18 printf("], ymm4\n"); 19 } 20 } 21 } 22 void genVsib(bool isJIT) 23 { 24 if (isJIT) puts("void genVsib() {"); 25 const char *vm32xTbl[] = { 26 "xmm0", 27 "xmm0 * 1", 28 "xmm0 + 4", 29 "xmm0 + eax", 30 "xmm0 * 4 + ecx", 31 "xmm3 * 8 + edi + 123", 32 "xmm2 * 2 + 5", 33 "eax + xmm0", 34 "esp + xmm2", 35 }; 36 const char *vm32yTbl[] = { 37 "ymm0", 38 "ymm0 * 1", 39 "ymm0 + 4", 40 "ymm0 + eax", 41 "ymm0 * 4 + ecx", 42 "ymm3 * 8 + edi + 123", 43 "ymm2 * 2 + 5", 44 "eax + ymm0", 45 "esp + ymm2", 46 }; 47 genVsibSub(isJIT, "vgatherdpd", vm32xTbl, NUM_OF_ARRAY(vm32xTbl)); 48 genVsibSub(isJIT, "vgatherqpd", vm32yTbl, NUM_OF_ARRAY(vm32yTbl)); 49 #ifdef XBYAK64 50 const char *vm32x64Tbl[] = { 51 "xmm0 + r11", 52 "r13 + xmm15", 53 "123 + rsi + xmm2 * 4", 54 }; 55 genVsibSub(isJIT, "vgatherdpd", vm32x64Tbl, NUM_OF_ARRAY(vm32x64Tbl)); 56 #endif 57 if (isJIT) puts("}"); 58 } 59 60 void genAddress(bool isJIT, const char regTbl[][5], size_t regTblNum) 61 { 62 int count = 0; 63 int funcNum = 1; 64 if (isJIT) { 65 puts("void gen0(){"); 66 } 67 for (size_t i = 0; i < regTblNum + 1; i++) { 68 const char *base = regTbl[i]; 69 for (size_t j = 0; j < regTblNum + 1; j++) { 70 if (j == 4) continue; /* esp is not index register */ 71 const char *index = regTbl[j]; 72 static const int scaleTbl[] = { 0, 1, 2, 4, 8 }; 73 for (size_t k = 0; k < NUM_OF_ARRAY(scaleTbl); k++) { 74 int scale = scaleTbl[k]; 75 static const int dispTbl[] = { 0, 1, 1000, -1, -1000 }; 76 for (size_t m = 0; m < NUM_OF_ARRAY(dispTbl); m++) { 77 int disp = dispTbl[m]; 78 bool isFirst = true; 79 if (isJIT) { 80 printf("mov (ecx, ptr["); 81 } else { 82 printf("mov ecx, ["); 83 } 84 if (i < regTblNum) { 85 printf("%s", base); 86 isFirst = false; 87 } 88 if (j < regTblNum) { 89 if (!isFirst) putchar('+'); 90 printf("%s", index); 91 if (scale) printf("*%d", scale); 92 isFirst = false; 93 } 94 if (isFirst) { 95 if (isJIT) printf("(void*)"); 96 printf("%d", disp); 97 } else { 98 if (disp >= 0) { 99 putchar('+'); 100 } 101 printf("%d", disp); 102 isFirst = false; 103 } 104 if (isJIT) { 105 printf("]); dump();\n"); 106 } else { 107 printf("]\n"); 108 } 109 if (isJIT) { 110 count++; 111 if ((count % 100) == 0) { 112 printf("}\n void gen%d(){\n", funcNum++); 113 } 114 } 115 } 116 } 117 } 118 } 119 if (isJIT) puts("}"); 120 genVsib(isJIT); 121 if (isJIT) { 122 printf("void gen(){\n"); 123 for (int i = 0; i < funcNum; i++) { 124 printf(" gen%d();\n", i); 125 } 126 puts("genVsib();"); 127 printf("}\n"); 128 } 129 } 130 131 int main(int argc, char *argv[]) 132 { 133 argc--, argv++; 134 bool phase = argc > 0 && strcmp(*argv, "1") == 0; 135 bool isJIT = (argc > 1); 136 fprintf(stderr, "phase:%c %s\n", phase ? '1' : '2', isJIT ? "jit" : "asm"); 137 if (phase) { 138 fprintf(stderr, "32bit reg\n"); 139 static const char reg32Tbl[][5] = { 140 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", 141 #ifdef XBYAK64 142 "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d", 143 #endif 144 }; 145 genAddress(isJIT, reg32Tbl, NUM_OF_ARRAY(reg32Tbl)); 146 } else { 147 #ifdef XBYAK64 148 fprintf(stderr, "64bit reg\n"); 149 static const char reg64Tbl[][5] = { 150 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 151 }; 152 genAddress(isJIT, reg64Tbl, NUM_OF_ARRAY(reg64Tbl)); 153 #endif 154 } 155 }