/* ANSI-C code produced by genperf */ /* Command-line: genperf ./modules/arch/x86/x86regtmod.gperf x86regtmod.c */ #line 26 "./modules/arch/x86/x86regtmod.gperf" #include RCSID("$Id: x86regtmod.gperf 2061 2008-04-12 01:33:54Z peter $"); #include #include #include #include "modules/arch/x86/x86arch.h" enum regtmod_type { REG = 1, REGGROUP, SEGREG, TARGETMOD }; #line 51 "./modules/arch/x86/x86regtmod.gperf" struct regtmod_parse_data { const char *name; unsigned int type:8; /* regtmod_type */ /* REG: register size * SEGREG: prefix encoding * Others: 0 */ unsigned int size_prefix:8; /* REG: register index * REGGROUP: register group type * SEGREG: register encoding * TARGETMOD: target modifier */ unsigned int data:8; /* REG: required bits setting * SEGREG: BITS in which the segment is ignored * Others: 0 */ unsigned int bits:8; }; static const struct regtmod_parse_data * regtmod_find(const char *key, size_t len) { static const struct regtmod_parse_data pd[152] = { #line 110 "./modules/arch/x86/x86regtmod.gperf" {"st6", REG, X86_FPUREG, 6, 0}, #line 140 "./modules/arch/x86/x86regtmod.gperf" {"ymm1", REG, X86_YMMREG, 1, 0}, #line 162 "./modules/arch/x86/x86regtmod.gperf" {"rsp", REG, X86_REG64, 4, 64}, #line 168 "./modules/arch/x86/x86regtmod.gperf" {"r10", REG, X86_REG64, 10, 64}, #line 197 "./modules/arch/x86/x86regtmod.gperf" {"bp", REG, X86_REG16, 5, 0}, #line 219 "./modules/arch/x86/x86regtmod.gperf" {"r10b", REG, X86_REG8, 10, 64}, #line 115 "./modules/arch/x86/x86regtmod.gperf" {"mm2", REG, X86_MMXREG, 2, 0}, #line 165 "./modules/arch/x86/x86regtmod.gperf" {"rdi", REG, X86_REG64, 7, 64}, #line 151 "./modules/arch/x86/x86regtmod.gperf" {"ymm12", REG, X86_YMMREG, 12, 64}, #line 166 "./modules/arch/x86/x86regtmod.gperf" {"r8", REG, X86_REG64, 8, 64}, #line 247 "./modules/arch/x86/x86regtmod.gperf" {"gs", SEGREG, 0x65, 0x05, 0}, #line 185 "./modules/arch/x86/x86regtmod.gperf" {"r10d", REG, X86_REG32, 10, 64}, #line 164 "./modules/arch/x86/x86regtmod.gperf" {"rsi", REG, X86_REG64, 6, 64}, #line 175 "./modules/arch/x86/x86regtmod.gperf" {"eax", REG, X86_REG32, 0, 0}, #line 116 "./modules/arch/x86/x86regtmod.gperf" {"mm3", REG, X86_MMXREG, 3, 0}, #line 99 "./modules/arch/x86/x86regtmod.gperf" {"tr6", REG, X86_TRREG, 6, 0}, #line 93 "./modules/arch/x86/x86regtmod.gperf" {"tr0", REG, X86_TRREG, 0, 0}, #line 213 "./modules/arch/x86/x86regtmod.gperf" {"ah", REG, X86_REG8, 4, 0}, #line 128 "./modules/arch/x86/x86regtmod.gperf" {"xmm6", REG, X86_XMMREG, 6, 0}, #line 90 "./modules/arch/x86/x86regtmod.gperf" {"dr6", REG, X86_DRREG, 6, 0}, #line 179 "./modules/arch/x86/x86regtmod.gperf" {"esp", REG, X86_REG32, 4, 0}, #line 227 "./modules/arch/x86/x86regtmod.gperf" {"bpl", REG, X86_REG8X, 5, 64}, #line 98 "./modules/arch/x86/x86regtmod.gperf" {"tr5", REG, X86_TRREG, 5, 0}, #line 192 "./modules/arch/x86/x86regtmod.gperf" {"ax", REG, X86_REG16, 0, 0}, #line 196 "./modules/arch/x86/x86regtmod.gperf" {"sp", REG, X86_REG16, 4, 0}, #line 224 "./modules/arch/x86/x86regtmod.gperf" {"r15b", REG, X86_REG8, 15, 64}, #line 136 "./modules/arch/x86/x86regtmod.gperf" {"xmm14", REG, X86_XMMREG, 14, 64}, #line 134 "./modules/arch/x86/x86regtmod.gperf" {"xmm12", REG, X86_XMMREG, 12, 64}, #line 169 "./modules/arch/x86/x86regtmod.gperf" {"r11", REG, X86_REG64, 11, 64}, #line 237 "./modules/arch/x86/x86regtmod.gperf" {"xmm", REGGROUP, 0, X86_XMMREG, 0}, #line 141 "./modules/arch/x86/x86regtmod.gperf" {"ymm2", REG, X86_YMMREG, 2, 0}, #line 180 "./modules/arch/x86/x86regtmod.gperf" {"ebp", REG, X86_REG32, 5, 0}, #line 130 "./modules/arch/x86/x86regtmod.gperf" {"xmm8", REG, X86_XMMREG, 8, 64}, #line 187 "./modules/arch/x86/x86regtmod.gperf" {"r12d", REG, X86_REG32, 12, 64}, #line 143 "./modules/arch/x86/x86regtmod.gperf" {"ymm4", REG, X86_YMMREG, 4, 0}, #line 142 "./modules/arch/x86/x86regtmod.gperf" {"ymm3", REG, X86_YMMREG, 3, 0}, #line 158 "./modules/arch/x86/x86regtmod.gperf" {"rax", REG, X86_REG64, 0, 64}, #line 125 "./modules/arch/x86/x86regtmod.gperf" {"xmm3", REG, X86_XMMREG, 3, 0}, #line 122 "./modules/arch/x86/x86regtmod.gperf" {"xmm0", REG, X86_XMMREG, 0, 0}, #line 91 "./modules/arch/x86/x86regtmod.gperf" {"dr7", REG, X86_DRREG, 7, 0}, #line 206 "./modules/arch/x86/x86regtmod.gperf" {"r14w", REG, X86_REG16, 14, 64}, #line 114 "./modules/arch/x86/x86regtmod.gperf" {"mm1", REG, X86_MMXREG, 1, 0}, #line 212 "./modules/arch/x86/x86regtmod.gperf" {"bl", REG, X86_REG8, 3, 0}, #line 201 "./modules/arch/x86/x86regtmod.gperf" {"r9w", REG, X86_REG16, 9, 64}, #line 152 "./modules/arch/x86/x86regtmod.gperf" {"ymm13", REG, X86_YMMREG, 13, 64}, #line 218 "./modules/arch/x86/x86regtmod.gperf" {"r9b", REG, X86_REG8, 9, 64}, #line 147 "./modules/arch/x86/x86regtmod.gperf" {"ymm8", REG, X86_YMMREG, 8, 64}, #line 194 "./modules/arch/x86/x86regtmod.gperf" {"dx", REG, X86_REG16, 2, 0}, #line 170 "./modules/arch/x86/x86regtmod.gperf" {"r12", REG, X86_REG64, 12, 64}, #line 204 "./modules/arch/x86/x86regtmod.gperf" {"r12w", REG, X86_REG16, 12, 64}, #line 167 "./modules/arch/x86/x86regtmod.gperf" {"r9", REG, X86_REG64, 9, 64}, #line 207 "./modules/arch/x86/x86regtmod.gperf" {"r15w", REG, X86_REG16, 15, 64}, #line 228 "./modules/arch/x86/x86regtmod.gperf" {"sil", REG, X86_REG8X, 6, 64}, #line 202 "./modules/arch/x86/x86regtmod.gperf" {"r10w", REG, X86_REG16, 10, 64}, #line 145 "./modules/arch/x86/x86regtmod.gperf" {"ymm6", REG, X86_YMMREG, 6, 0}, #line 244 "./modules/arch/x86/x86regtmod.gperf" {"ss", SEGREG, 0x36, 0x02, 64}, #line 97 "./modules/arch/x86/x86regtmod.gperf" {"tr4", REG, X86_TRREG, 4, 0}, #line 80 "./modules/arch/x86/x86regtmod.gperf" {"cr3", REG, X86_CRREG, 3, 0}, #line 203 "./modules/arch/x86/x86regtmod.gperf" {"r11w", REG, X86_REG16, 11, 64}, #line 126 "./modules/arch/x86/x86regtmod.gperf" {"xmm4", REG, X86_XMMREG, 4, 0}, #line 104 "./modules/arch/x86/x86regtmod.gperf" {"st0", REG, X86_FPUREG, 0, 0}, #line 229 "./modules/arch/x86/x86regtmod.gperf" {"dil", REG, X86_REG8X, 7, 64}, #line 96 "./modules/arch/x86/x86regtmod.gperf" {"tr3", REG, X86_TRREG, 3, 0}, #line 188 "./modules/arch/x86/x86regtmod.gperf" {"r13d", REG, X86_REG32, 13, 64}, #line 200 "./modules/arch/x86/x86regtmod.gperf" {"r8w", REG, X86_REG16, 8, 64}, #line 135 "./modules/arch/x86/x86regtmod.gperf" {"xmm13", REG, X86_XMMREG, 13, 64}, #line 107 "./modules/arch/x86/x86regtmod.gperf" {"st3", REG, X86_FPUREG, 3, 0}, #line 137 "./modules/arch/x86/x86regtmod.gperf" {"xmm15", REG, X86_XMMREG, 15, 64}, #line 132 "./modules/arch/x86/x86regtmod.gperf" {"xmm10", REG, X86_XMMREG, 10, 64}, #line 242 "./modules/arch/x86/x86regtmod.gperf" {"es", SEGREG, 0x26, 0x00, 64}, #line 82 "./modules/arch/x86/x86regtmod.gperf" {"cr8", REG, X86_CRREG, 8, 64}, #line 129 "./modules/arch/x86/x86regtmod.gperf" {"xmm7", REG, X86_XMMREG, 7, 0}, #line 226 "./modules/arch/x86/x86regtmod.gperf" {"spl", REG, X86_REG8X, 4, 64}, #line 173 "./modules/arch/x86/x86regtmod.gperf" {"r15", REG, X86_REG64, 15, 64}, #line 81 "./modules/arch/x86/x86regtmod.gperf" {"cr4", REG, X86_CRREG, 4, 0}, #line 246 "./modules/arch/x86/x86regtmod.gperf" {"fs", SEGREG, 0x64, 0x04, 0}, #line 159 "./modules/arch/x86/x86regtmod.gperf" {"rcx", REG, X86_REG64, 1, 64}, #line 113 "./modules/arch/x86/x86regtmod.gperf" {"mm0", REG, X86_MMXREG, 0, 0}, #line 236 "./modules/arch/x86/x86regtmod.gperf" {"mm", REGGROUP, 0, X86_MMXREG, 0}, #line 94 "./modules/arch/x86/x86regtmod.gperf" {"tr1", REG, X86_TRREG, 1, 0}, #line 252 "./modules/arch/x86/x86regtmod.gperf" {"short", TARGETMOD, 0, X86_SHORT, 0}, #line 108 "./modules/arch/x86/x86regtmod.gperf" {"st4", REG, X86_FPUREG, 4, 0}, #line 78 "./modules/arch/x86/x86regtmod.gperf" {"cr0", REG, X86_CRREG, 0, 0}, #line 133 "./modules/arch/x86/x86regtmod.gperf" {"xmm11", REG, X86_XMMREG, 11, 64}, #line 117 "./modules/arch/x86/x86regtmod.gperf" {"mm4", REG, X86_MMXREG, 4, 0}, #line 216 "./modules/arch/x86/x86regtmod.gperf" {"bh", REG, X86_REG8, 7, 0}, #line 190 "./modules/arch/x86/x86regtmod.gperf" {"r15d", REG, X86_REG32, 15, 64}, #line 86 "./modules/arch/x86/x86regtmod.gperf" {"dr2", REG, X86_DRREG, 2, 0}, #line 183 "./modules/arch/x86/x86regtmod.gperf" {"r8d", REG, X86_REG32, 8, 64}, #line 146 "./modules/arch/x86/x86regtmod.gperf" {"ymm7", REG, X86_YMMREG, 7, 0}, #line 131 "./modules/arch/x86/x86regtmod.gperf" {"xmm9", REG, X86_XMMREG, 9, 64}, #line 221 "./modules/arch/x86/x86regtmod.gperf" {"r12b", REG, X86_REG8, 12, 64}, #line 106 "./modules/arch/x86/x86regtmod.gperf" {"st2", REG, X86_FPUREG, 2, 0}, #line 148 "./modules/arch/x86/x86regtmod.gperf" {"ymm9", REG, X86_YMMREG, 9, 64}, #line 111 "./modules/arch/x86/x86regtmod.gperf" {"st7", REG, X86_FPUREG, 7, 0}, #line 195 "./modules/arch/x86/x86regtmod.gperf" {"bx", REG, X86_REG16, 3, 0}, #line 150 "./modules/arch/x86/x86regtmod.gperf" {"ymm11", REG, X86_YMMREG, 11, 64}, #line 144 "./modules/arch/x86/x86regtmod.gperf" {"ymm5", REG, X86_YMMREG, 5, 0}, #line 154 "./modules/arch/x86/x86regtmod.gperf" {"ymm15", REG, X86_YMMREG, 15, 64}, #line 163 "./modules/arch/x86/x86regtmod.gperf" {"rbp", REG, X86_REG64, 5, 64}, #line 171 "./modules/arch/x86/x86regtmod.gperf" {"r13", REG, X86_REG64, 13, 64}, #line 118 "./modules/arch/x86/x86regtmod.gperf" {"mm5", REG, X86_MMXREG, 5, 0}, #line 198 "./modules/arch/x86/x86regtmod.gperf" {"si", REG, X86_REG16, 6, 0}, #line 211 "./modules/arch/x86/x86regtmod.gperf" {"dl", REG, X86_REG8, 2, 0}, #line 199 "./modules/arch/x86/x86regtmod.gperf" {"di", REG, X86_REG16, 7, 0}, #line 79 "./modules/arch/x86/x86regtmod.gperf" {"cr2", REG, X86_CRREG, 2, 0}, #line 189 "./modules/arch/x86/x86regtmod.gperf" {"r14d", REG, X86_REG32, 14, 64}, #line 153 "./modules/arch/x86/x86regtmod.gperf" {"ymm14", REG, X86_YMMREG, 14, 64}, #line 100 "./modules/arch/x86/x86regtmod.gperf" {"tr7", REG, X86_TRREG, 7, 0}, #line 245 "./modules/arch/x86/x86regtmod.gperf" {"ds", SEGREG, 0x3e, 0x03, 64}, #line 193 "./modules/arch/x86/x86regtmod.gperf" {"cx", REG, X86_REG16, 1, 0}, #line 235 "./modules/arch/x86/x86regtmod.gperf" {"st", REGGROUP, 0, X86_FPUREG, 0}, #line 182 "./modules/arch/x86/x86regtmod.gperf" {"edi", REG, X86_REG32, 7, 0}, #line 209 "./modules/arch/x86/x86regtmod.gperf" {"al", REG, X86_REG8, 0, 0}, #line 120 "./modules/arch/x86/x86regtmod.gperf" {"mm7", REG, X86_MMXREG, 7, 0}, #line 178 "./modules/arch/x86/x86regtmod.gperf" {"ebx", REG, X86_REG32, 3, 0}, #line 124 "./modules/arch/x86/x86regtmod.gperf" {"xmm2", REG, X86_XMMREG, 2, 0}, #line 109 "./modules/arch/x86/x86regtmod.gperf" {"st5", REG, X86_FPUREG, 5, 0}, #line 231 "./modules/arch/x86/x86regtmod.gperf" {"rip", REG, X86_RIP, 0, 64}, #line 161 "./modules/arch/x86/x86regtmod.gperf" {"rbx", REG, X86_REG64, 3, 64}, #line 254 "./modules/arch/x86/x86regtmod.gperf" {"to", TARGETMOD, 0, X86_TO, 0}, #line 186 "./modules/arch/x86/x86regtmod.gperf" {"r11d", REG, X86_REG32, 11, 64}, #line 89 "./modules/arch/x86/x86regtmod.gperf" {"dr5", REG, X86_DRREG, 5, 0}, #line 85 "./modules/arch/x86/x86regtmod.gperf" {"dr1", REG, X86_DRREG, 1, 0}, #line 251 "./modules/arch/x86/x86regtmod.gperf" {"near", TARGETMOD, 0, X86_NEAR, 0}, #line 172 "./modules/arch/x86/x86regtmod.gperf" {"r14", REG, X86_REG64, 14, 64}, #line 215 "./modules/arch/x86/x86regtmod.gperf" {"dh", REG, X86_REG8, 6, 0}, #line 210 "./modules/arch/x86/x86regtmod.gperf" {"cl", REG, X86_REG8, 1, 0}, #line 88 "./modules/arch/x86/x86regtmod.gperf" {"dr4", REG, X86_DRREG, 4, 0}, #line 149 "./modules/arch/x86/x86regtmod.gperf" {"ymm10", REG, X86_YMMREG, 10, 64}, #line 87 "./modules/arch/x86/x86regtmod.gperf" {"dr3", REG, X86_DRREG, 3, 0}, #line 127 "./modules/arch/x86/x86regtmod.gperf" {"xmm5", REG, X86_XMMREG, 5, 0}, #line 119 "./modules/arch/x86/x86regtmod.gperf" {"mm6", REG, X86_MMXREG, 6, 0}, #line 205 "./modules/arch/x86/x86regtmod.gperf" {"r13w", REG, X86_REG16, 13, 64}, #line 253 "./modules/arch/x86/x86regtmod.gperf" {"far", TARGETMOD, 0, X86_FAR, 0}, #line 139 "./modules/arch/x86/x86regtmod.gperf" {"ymm0", REG, X86_YMMREG, 0, 0}, #line 238 "./modules/arch/x86/x86regtmod.gperf" {"ymm", REGGROUP, 0, X86_YMMREG, 0}, #line 214 "./modules/arch/x86/x86regtmod.gperf" {"ch", REG, X86_REG8, 5, 0}, #line 123 "./modules/arch/x86/x86regtmod.gperf" {"xmm1", REG, X86_XMMREG, 1, 0}, #line 181 "./modules/arch/x86/x86regtmod.gperf" {"esi", REG, X86_REG32, 6, 0}, #line 223 "./modules/arch/x86/x86regtmod.gperf" {"r14b", REG, X86_REG8, 14, 64}, #line 105 "./modules/arch/x86/x86regtmod.gperf" {"st1", REG, X86_FPUREG, 1, 0}, #line 217 "./modules/arch/x86/x86regtmod.gperf" {"r8b", REG, X86_REG8, 8, 64}, #line 220 "./modules/arch/x86/x86regtmod.gperf" {"r11b", REG, X86_REG8, 11, 64}, #line 222 "./modules/arch/x86/x86regtmod.gperf" {"r13b", REG, X86_REG8, 13, 64}, #line 176 "./modules/arch/x86/x86regtmod.gperf" {"ecx", REG, X86_REG32, 1, 0}, #line 95 "./modules/arch/x86/x86regtmod.gperf" {"tr2", REG, X86_TRREG, 2, 0}, #line 160 "./modules/arch/x86/x86regtmod.gperf" {"rdx", REG, X86_REG64, 2, 64}, #line 184 "./modules/arch/x86/x86regtmod.gperf" {"r9d", REG, X86_REG32, 9, 64}, #line 243 "./modules/arch/x86/x86regtmod.gperf" {"cs", SEGREG, 0x2e, 0x01, 0}, #line 84 "./modules/arch/x86/x86regtmod.gperf" {"dr0", REG, X86_DRREG, 0, 0}, #line 177 "./modules/arch/x86/x86regtmod.gperf" {"edx", REG, X86_REG32, 2, 0} }; static const unsigned char tab[] = { 0,0,125,22,0,0,85,0,85,168,0,0,0,7,113,0, 0,0,0,22,183,0,0,11,42,55,0,0,82,0,88,235, 0,0,0,0,0,0,183,85,0,0,145,113,220,125,22,0, 88,183,0,7,0,0,0,7,0,125,113,87,131,116,7,0, 113,7,0,113,0,87,87,7,7,7,113,40,85,125,113,85, 0,0,22,235,0,131,125,113,0,22,0,220,0,220,0,120, 116,0,124,184,0,0,0,183,92,125,0,92,125,0,0,177, 7,0,0,7,0,45,0,214,180,113,211,163,142,0,88,173, }; const struct regtmod_parse_data *ret; unsigned long rsl, val = phash_lookup(key, len, 0x9e3779b9UL); rsl = ((val>>25)^tab[val&0x7f]); if (rsl >= 152) return NULL; ret = &pd[rsl]; if (strcmp(key, ret->name) != 0) return NULL; return ret; } #line 255 "./modules/arch/x86/x86regtmod.gperf" yasm_arch_regtmod yasm_x86__parse_check_regtmod(yasm_arch *arch, const char *id, size_t id_len, uintptr_t *data) { yasm_arch_x86 *arch_x86 = (yasm_arch_x86 *)arch; /*@null@*/ const struct regtmod_parse_data *pdata; size_t i; static char lcaseid[8]; unsigned int bits; yasm_arch_regtmod type; if (id_len > 7) return YASM_ARCH_NOTREGTMOD; for (i=0; itype; bits = pdata->bits; if (type == YASM_ARCH_REG && bits != 0 && arch_x86->mode_bits != bits) { yasm_warn_set(YASM_WARN_GENERAL, N_("`%s' is a register in %u-bit mode"), id, bits); return YASM_ARCH_NOTREGTMOD; } if (type == YASM_ARCH_SEGREG && bits != 0 && arch_x86->mode_bits == bits) { yasm_warn_set(YASM_WARN_GENERAL, N_("`%s' segment register ignored in %u-bit mode"), id, bits); } if (type == YASM_ARCH_SEGREG) *data = (pdata->size_prefix<<8) | pdata->data; else *data = pdata->size_prefix | pdata->data; return type; }