00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 #include <stdint.h>
00066 #include "elf_stuff.h"
00067 #ifdef KEY
00068 #include "dwarf_stuff.h"
00069 #endif
00070
00071 #define USE_STANDARD_TYPES 1
00072 #include "defs.h"
00073 #include "config_targ_opt.h"
00074 #include "targ_const.h"
00075 #include "targ_const_private.h"
00076 #include "vstring.h"
00077 #include "config_asm.h"
00078 #include "em_elf.h"
00079 #include "symtab.h"
00080 #include "tn.h"
00081 #include "cgemit.h"
00082 #include "cgemit_targ.h"
00083 #include "cgtarget.h"
00084 #include "data_layout.h"
00085 #include "bb.h"
00086 #include "op.h"
00087 #include "iface_scn.h"
00088 #include "cg_flags.h"
00089 #include "glob.h"
00090 #include "sections.h"
00091 #include "targ_isa_print.h"
00092 #include "config_debug.h"
00093
00094
00095 extern const char * ip_calc_funcname;
00096
00097 static ST *current_pu = NULL;
00098
00099 static BOOL
00100 Non_Default_Text_Section (ST *pu)
00101 {
00102 if (!pu || !ST_base(pu))
00103 return FALSE;
00104
00105 return ((ST_sclass(ST_base(pu)) == SCLASS_TEXT) &&
00106 strcmp(ST_name(ST_base(pu)), ".text"));
00107 }
00108
00109
00110 void
00111 CGEMIT_Targ_Initialize (ST *pu)
00112 {
00113 current_pu = pu;
00114 }
00115
00116
00117 void
00118 CGEMIT_Targ_Text_Initialize (ST *pu)
00119 {
00120 if (Non_Default_Text_Section(pu))
00121 fprintf (Asm_File, "\t.begin\tliteral_prefix %s\n", ST_name(ST_base(pu)));
00122 }
00123
00124
00125 void
00126 CGEMIT_Targ_Text_Finalize (ST *pu)
00127 {
00128 if (Non_Default_Text_Section(pu))
00129 fprintf (Asm_File, "\t.end\tliteral_prefix\n");
00130 }
00131
00132
00133 BOOL
00134 CGEMIT_Align_Section_Once (const char *scn_name)
00135 {
00136 return strcmp(scn_name, ".literal") && strcmp(scn_name, ".text");
00137 }
00138
00139 void
00140 CGEMIT_Prn_File_Dir_In_Asm(USRCPOS usrcpos,
00141 const char *pathname,
00142 const char *filename)
00143 {
00144 #if defined(BUILD_OS_DARWIN)
00145
00146 fprintf (Asm_File, "\t%s\t\"%s/%s\"\n", AS_FILE, pathname, filename);
00147 #else
00148 if (CG_emit_non_gas_syntax)
00149 fprintf (Asm_File, "\t%s\t%d\t\"%s/%s\"\n",
00150 AS_FILE, USRCPOS_filenum(usrcpos)-1, pathname, filename);
00151 else fprintf (Asm_File, "\t%s\t%d\t\"%s/%s\"\n",
00152 AS_FILE, USRCPOS_filenum(usrcpos), pathname, filename);
00153 #endif
00154 }
00155
00156 extern void
00157 CGEMIT_Prn_Line_Dir_In_Asm (USRCPOS usrcpos)
00158 {
00159 if( !CG_emit_asm_dwarf) {
00160 fprintf (Asm_File, " # ");
00161 }
00162 #if defined(BUILD_OS_DARWIN)
00163
00164 fprintf (Asm_File, "\t.line\t%d\n",
00165 USRCPOS_linenum(usrcpos));
00166 #else
00167 if (CG_emit_non_gas_syntax)
00168 fprintf (Asm_File, "\t.loc\t%d\t%d\t%d\n",
00169 USRCPOS_filenum(usrcpos)-1,
00170 USRCPOS_linenum(usrcpos),
00171 USRCPOS_column(usrcpos));
00172 else
00173 fprintf (Asm_File, "\t.loc\t%d\t%d\t%d\n",
00174 USRCPOS_filenum(usrcpos),
00175 USRCPOS_linenum(usrcpos),
00176 USRCPOS_column(usrcpos));
00177 #endif
00178 }
00179
00180
00181 void
00182 CGEMIT_Prn_Scn_In_Asm (ST *st, ST *cur_section)
00183 {
00184 UINT32 tmp, power;
00185
00186
00187
00188 {
00189 char *name = ST_name(st);
00190 if (strstr(name, "__libc_") == name)
00191 return;
00192 }
00193 power = 0;
00194 for (tmp = STB_align(st); tmp > 1; tmp >>= 1) power++;
00195 CGEMIT_Prn_Scn_In_Asm(Asm_File,
00196 ST_name(st),
00197 Get_Section_Elf_Type(STB_section_idx(st)),
00198 Get_Section_Elf_Flags(STB_section_idx(st)),
00199 Get_Section_Elf_Entsize(STB_section_idx(st)),
00200 power,
00201 (cur_section != NULL) ? ST_name(cur_section) : NULL);
00202 }
00203
00204 void
00205 CGEMIT_Prn_Scn_In_Asm (FILE *asm_file,
00206 const char *scn_name,
00207 Elf64_Word scn_type,
00208 Elf64_Word scn_flags,
00209 Elf64_Xword scn_entsize,
00210 Elf64_Word scn_align,
00211 const char *cur_scn_name)
00212 {
00213 if ((cur_scn_name != NULL) && !strcmp(cur_scn_name, ".literal"))
00214 {
00215
00216
00217
00218 if (Non_Default_Text_Section(current_pu))
00219 fprintf (asm_file, "\t.end\tliteral_prefix\n");
00220 }
00221 #if defined(BUILD_OS_DARWIN)
00222
00223 else if (0 == strcmp(scn_name, BSS_RAW_NAME)) {
00224 return;
00225 }
00226 #endif
00227
00228
00229
00230 if (!strcmp(scn_name, ".data") || !strcmp(scn_name, ".text"))
00231 {
00232 fprintf (asm_file, "\n\t%s", scn_name);
00233 }
00234 else if (!strcmp(scn_name, ".literal"))
00235 {
00236
00237
00238 if (Non_Default_Text_Section(current_pu))
00239 {
00240 CGEMIT_Prn_Scn_In_Asm(ST_base(current_pu), NULL);
00241 fprintf (asm_file, "\t.begin\tliteral_prefix %s\n",
00242 ST_name(ST_base(current_pu)));
00243 }
00244 else
00245 {
00246 fprintf (asm_file, "\n\t.text\n");
00247 }
00248 fprintf (asm_file, "\t.literal_position\n");
00249 }
00250 else
00251 {
00252 char scn_flags_string[5];
00253 char *p = &scn_flags_string[0];
00254
00255 #if defined(BUILD_OS_DARWIN)
00256 fprintf (asm_file, "\n\t%s %s", AS_SECTION, map_section_name(scn_name));
00257 #else
00258 fprintf (asm_file, "\n\t%s %s", AS_SECTION, scn_name);
00259 #endif
00260 if (CG_emit_non_gas_syntax && strcmp(scn_name, ".srdata") == 0) {
00261 static BOOL printed = FALSE;
00262 if (!printed) {
00263 fprintf(asm_file, ", %d, %#x, %lld, ",
00264 scn_type, scn_flags, scn_entsize);
00265 int tmp1 = 1, tmp2 = scn_align;
00266 for (; tmp2 >= 1; tmp1 *= 2, tmp2 --);
00267 fprintf(asm_file, "%d", tmp1);
00268 printed = TRUE;
00269 }
00270 }
00271 #if ! defined(BUILD_OS_DARWIN)
00272
00273 if (! CG_emit_non_gas_syntax) {
00274 if ((scn_flags & SHF_WRITE) &&
00275 !(scn_name && !strncmp(scn_name,".gnu.linkonce.r.",16)))
00276 *p++ = 'w';
00277 if (scn_flags & SHF_ALLOC) *p++ = 'a';
00278 if (scn_flags & SHF_EXECINSTR) *p++ = 'x';
00279 #ifdef KEY
00280 if (scn_flags & SHF_TLS) *p++ = 'T';
00281 #endif
00282 *p = '\0';
00283 fprintf (asm_file, ", \"%s\"", scn_flags_string);
00284 if (scn_type == SHT_PROGBITS)
00285 fprintf (asm_file, ",@progbits");
00286 else if (scn_type == SHT_NOBITS)
00287 fprintf (asm_file, ",@nobits");
00288 }
00289 #endif
00290 #ifdef TARG_X8664
00291 #if ! defined(BUILD_OS_DARWIN)
00292
00293
00294 if (strcmp(scn_name, DEBUG_FRAME_SECTNAME) == 0)
00295 fprintf(asm_file, "\n.LCIE:");
00296 #endif
00297
00298
00299 if (!strcmp (scn_name, EH_FRAME_SECTNAME))
00300 fprintf (asm_file, "\n.LEHCIE:");
00301 #endif
00302 }
00303
00304 fprintf (asm_file, "\n");
00305
00306
00307
00308
00309
00310
00311 if (!CGEMIT_Align_Section_Once(scn_name))
00312 fprintf (asm_file, "\t%s\t%d\n", AS_ALIGN, scn_align);
00313 #if defined(BUILD_OS_DARWIN)
00314
00315
00316 fprintf(asm_file, "%s:\n", scn_name);
00317 #endif
00318 }
00319
00320 void
00321 CGEMIT_Change_Origin_In_Asm (ST *st, INT64 offset)
00322 {
00323
00324
00325 #define EH_REGION_LINKONCE_PREFIX ".gnu.linkonce.e."
00326 #define EH_DESC_LINKONCE_PREFIX ".gnu.linkonce.h."
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339 if (strcmp(ST_name(st), ".literal") &&
00340 strcmp(ST_name(st), ".xt_except_table") &&
00341 strcmp(ST_name(st), ".xt_desc_table") &&
00342 strncmp(ST_name(st), EH_REGION_LINKONCE_PREFIX,
00343 strlen(EH_REGION_LINKONCE_PREFIX)) &&
00344 strncmp(ST_name(st), EH_DESC_LINKONCE_PREFIX,
00345 strlen(EH_DESC_LINKONCE_PREFIX)))
00346 {
00347 if (CG_emit_non_gas_syntax)
00348 fprintf (Asm_File, "\t%s 0x%llx\n", ".origin", offset);
00349 else fprintf (Asm_File, "\t%s 0x%llx\n", AS_ORIGIN, offset);
00350 fprintf ( Asm_File, "\t%s\t0\n", AS_ALIGN );
00351 }
00352 }
00353
00354
00355
00356 extern BOOL
00357 CGEMIT_Use_Base_ST_For_Reloc (INT reloc, ST *st)
00358 {
00359 if (reloc == TN_RELOC_IA_LTOFF_FPTR)
00360
00361 return FALSE;
00362
00363
00364 else if (ST_sclass(st) == SCLASS_TEXT)
00365 return FALSE;
00366 #ifdef KEY
00367 else if (ST_is_thread_local(st))
00368 return FALSE;
00369 #endif
00370 else
00371 return ST_is_export_local(st);
00372 }
00373
00374
00375 extern INT
00376 CGEMIT_Relocs_In_Asm (TN *t, ST *st, vstring *buf, INT64 *val)
00377 {
00378 INT paren = 1;
00379
00380
00381 if (ST_class(st) == CLASS_BLOCK && STB_section(st)) {
00382 *val -= GP_DISP;
00383 }
00384 switch (TN_relocs(t)) {
00385 case TN_RELOC_GOT_DISP:
00386 *buf = vstr_concat (*buf, "%got_disp");
00387 break;
00388 case TN_RELOC_GOT_PAGE:
00389 *buf = vstr_concat (*buf, "%got_page");
00390 break;
00391 case TN_RELOC_GOT_OFST:
00392 *buf = vstr_concat (*buf, "%got_ofst");
00393 break;
00394 case TN_RELOC_HI_GPSUB:
00395 *buf = vstr_concat (*buf, "%hi(%neg(%gp_rel");
00396 paren += 2;
00397 break;
00398 case TN_RELOC_LO_GPSUB:
00399 *buf = vstr_concat (*buf, "%lo(%neg(%gp_rel");
00400 paren += 2;
00401 break;
00402 case TN_RELOC_GPREL16:
00403 *buf = vstr_concat (*buf, "%gp_rel");
00404 break;
00405 case TN_RELOC_HIGH16:
00406 *buf = vstr_concat (*buf, "%hi");
00407 break;
00408 case TN_RELOC_LOW16:
00409 *buf = vstr_concat (*buf, "%lo");
00410 break;
00411 case TN_RELOC_X8664_64:
00412 break;
00413 case TN_RELOC_X8664_PC32:
00414 *buf = vstr_concat (*buf, "$");
00415 break;
00416 case TN_RELOC_IA32_GOT:
00417 *buf = vstr_concat (*buf, ST_name(st));
00418 *buf = vstr_concat (*buf, "@GOT");
00419 return 0;
00420 case TN_RELOC_X8664_GOTPCREL:
00421 *buf = vstr_concat (*buf, ST_name(st));
00422 *buf = vstr_concat (*buf, "@GOTPCREL");
00423 return 0;
00424 case TN_RELOC_IA32_GLOBAL_OFFSET_TABLE:
00425 {
00426 char* str = NULL;
00427 if (Is_Target_EM64T() ||
00428 Is_Target_Wolfdale() ||
00429 Is_Target_Core())
00430 asprintf( &str, "$_GLOBAL_OFFSET_TABLE_+[.-%s]", ST_name(st) );
00431 else
00432 asprintf( &str, "$_GLOBAL_OFFSET_TABLE_" );
00433 *buf = vstr_concat( *buf, str );
00434 free( str );
00435 }
00436 return 0;
00437 case TN_RELOC_X8664_TPOFF32_seg_reg:
00438 *buf = vstr_concat(*buf, Is_Target_32bit() ? "%gs:" : "%fs:");
00439
00440 case TN_RELOC_X8664_TPOFF32:
00441 *buf = vstr_concat(*buf, ST_name(st));
00442 *buf = vstr_concat(*buf, Is_Target_32bit() ? "@NTPOFF" : "@TPOFF");
00443 return 0;
00444 case TN_RELOC_X8664_GOTTPOFF:
00445 *buf = vstr_concat(*buf, ST_name(st));
00446 *buf = vstr_concat(*buf,
00447 Is_Target_32bit() ? "@INDNTPOFF" : "@GOTTPOFF");
00448 return 0;
00449 default:
00450 #pragma mips_frequency_hint NEVER
00451 FmtAssert (FALSE, ("relocs_asm: illegal reloc TN"));
00452
00453 }
00454 *buf = vstr_concat (*buf, "(" );
00455 *buf = vstr_concat (*buf, ST_name(st));
00456 *buf = vstr_concat (*buf, Symbol_Name_Suffix);
00457 return paren;
00458 }
00459
00460
00461 extern void
00462 CGEMIT_Relocs_In_Object (TN *t, ST *st, INT32 PC, pSCNINFO PU_section, INT64 *val)
00463 {
00464 FmtAssert(FALSE, ("NYI"));
00465 }
00466
00467
00468 extern void
00469 CGEMIT_Add_Call_Information (OP *op, BB *bb, INT32 PC, pSCNINFO PU_section)
00470 {
00471 ANNOTATION *ant = ANNOT_Get (BB_annotations(bb), ANNOT_CALLINFO);
00472 ST *call_sym = CALLINFO_call_st(ANNOT_callinfo(ant));
00473 Elf_Event_Kind event_type;
00474
00475 if (call_sym == NULL) return;
00476 if (ST_is_export_local(call_sym)) {
00477 event_type = EK_FCALL_LOCAL;
00478 }
00479 else {
00480 event_type = EK_FCALL_EXTERN;
00481 }
00482 Em_Add_New_Event (event_type, PC, EMT_Put_Elf_Symbol(call_sym),
00483 0, 0, PU_section);
00484
00485
00486
00487
00488
00489
00490 Em_Add_New_Rela (EMT_Put_Elf_Symbol(call_sym),
00491 R_IA_64_PCREL21B, PC, 0, PU_section);
00492
00493 if (EMIT_interface_section) {
00494 Interface_Scn_Add_Call( call_sym,
00495 CALLINFO_call_wn(ANNOT_callinfo(ant)));
00496 }
00497 }
00498
00499
00500
00501 void
00502 CGEMIT_Gen_Asm_Frame (INT64 frame_len)
00503 {
00504 if (CG_inhibit_size_directive)
00505 return;
00506 TN *tn = ((Current_PU_Stack_Model == SMODEL_SMALL) ? SP_TN : FP_TN);
00507 ISA_REGISTER_CLASS rc = TN_register_class(tn);
00508 REGISTER reg = TN_register(tn);
00509 fprintf ( Asm_File, "\t%s\t%s, %lld, %s\n",
00510 AS_FRAME,
00511 ABI_PROPERTY_Reg_Name(rc, REGISTER_machine_id(rc, reg)),
00512 frame_len,
00513 ABI_PROPERTY_Reg_Name(rc, REGISTER_machine_id(rc, reg)));
00514 }
00515
00516
00517
00518 void
00519 CGEMIT_Prn_Ent_In_Asm (ST *pu)
00520 {
00521 FmtAssert(false, ("No AS_ENT for x86_64"));
00522 }
00523
00524
00525
00526 void
00527 STACK_FP_Fixup_PU()
00528 {}
00529
00530 void
00531 CGEMIT_Weak_Alias (ST *sym, ST *strongsym)
00532 {
00533 fprintf ( Asm_File, "\t%s\t%s\n", AS_WEAK, ST_name(sym));
00534 CGEMIT_Alias (sym, strongsym);
00535 }
00536
00537 void CGEMIT_Write_Literal_TCON(ST *lit_st, TCON tcon)
00538 {
00539 INT64 val;
00540 if (TCON_ty(tcon) == MTYPE_F4)
00541 val = TCON_word0(tcon);
00542 else if ((TCON_ty(tcon) == MTYPE_I4) || (TCON_ty(tcon) == MTYPE_U4))
00543 val = TCON_v0(tcon);
00544 else
00545 FmtAssert(FALSE, ("Invalid literal value"));
00546 fprintf ( Asm_File, "\t%s\t", ".literal");
00547 EMT_Write_Qualified_Name(Asm_File, lit_st);
00548 if ((val >= INT32_MIN) && (val <= INT32_MAX))
00549 fprintf(Asm_File, ", %lld\n", val);
00550 else
00551 fprintf(Asm_File, ", %#llx\n", val);
00552
00553 }
00554
00555 void CGEMIT_Write_Literal_Label (ST *lit_st, LABEL_IDX lab)
00556 {
00557 fprintf ( Asm_File, "\t%s\t", ".literal");
00558 EMT_Write_Qualified_Name(Asm_File, lit_st);
00559 union {
00560 UINT64 u;
00561 void *p;
00562 } u;
00563 u.u = 0;
00564 u.p = LABEL_name(lab);
00565 fprintf(Asm_File, ", %lld\n", u.u);
00566 }
00567
00568 void CGEMIT_Write_Literal_Symbol (ST *lit_st, ST *sym,
00569 Elf64_Sxword sym_ofst)
00570 {
00571 ST *basesym;
00572 basesym = sym;
00573 INT64 base_ofst = 0;
00574
00575 if (Has_Base_Block(sym) && ST_is_export_local(sym) && ST_class(sym) != CLASS_FUNC) {
00576 Base_Symbol_And_Offset (sym, &basesym, &base_ofst);
00577 }
00578 base_ofst += sym_ofst;
00579
00580 fprintf ( Asm_File, "\t%s\t", ".literal");
00581 EMT_Write_Qualified_Name(Asm_File, lit_st);
00582 fprintf ( Asm_File, ", ");
00583 if (ST_class(sym) == CLASS_CONST) {
00584 EMT_Write_Qualified_Name (Asm_File, basesym);
00585 if (base_ofst == 0)
00586 fprintf (Asm_File, "\n");
00587 else
00588 fprintf (Asm_File, " %+lld\n", base_ofst);
00589 }
00590 else {
00591 EMT_Write_Qualified_Name (Asm_File, sym);
00592 if (sym_ofst == 0)
00593 fprintf (Asm_File, "\n");
00594 else
00595 fprintf (Asm_File, " %+lld\n", sym_ofst);
00596 }
00597 }
00598
00599 void CGEMIT_Alias (ST *sym, ST *strongsym)
00600 {
00601
00602 fprintf ( Asm_File, "\t%s = %s", ST_name(sym), ST_name(strongsym));
00603 if (ST_is_export_local(strongsym) && ST_class(strongsym) == CLASS_VAR) {
00604
00605 if (ST_level(strongsym) == GLOBAL_SYMTAB) {
00606
00607 if (Emit_Global_Data || ST_sclass(strongsym) == SCLASS_PSTATIC)
00608 fprintf ( Asm_File, "%s%d", Label_Name_Separator, ST_index(strongsym));
00609 }
00610 else
00611 fprintf ( Asm_File, "%s%d%s%d", Label_Name_Separator,
00612 ST_pu(Get_Current_PU_ST()),
00613 Label_Name_Separator, ST_index(strongsym));
00614 }
00615 fprintf ( Asm_File, "\n");
00616 }
00617
00618
00620
00621
00622
00624
00625 static const char* OP_Name[TOP_count];
00626
00627 static void Init_OP_Name()
00628 {
00629 static BOOL bInit = FALSE;
00630
00631 if( bInit )
00632 return;
00633
00634 bInit = TRUE;
00635 bzero( OP_Name, sizeof(OP_Name) );
00636
00637
00638
00639 OP_Name[TOP_reti] = "ret";
00640 OP_Name[TOP_comixsd] = "comisd";
00641 OP_Name[TOP_comixxsd] = "comisd";
00642 OP_Name[TOP_comixxxsd]= "comisd";
00643 OP_Name[TOP_comixss] = "comiss";
00644 OP_Name[TOP_comixxss] = "comiss";
00645 OP_Name[TOP_comixxxss]= "comiss";
00646 OP_Name[TOP_add32] = "addl";
00647 OP_Name[TOP_adc32] = "adcl";
00648 OP_Name[TOP_add64] = "addq";
00649 OP_Name[TOP_addx32] = "addl";
00650 OP_Name[TOP_addx64] = "addq";
00651 OP_Name[TOP_addxx32] = "addl";
00652 OP_Name[TOP_addxxx32] = "addl";
00653 OP_Name[TOP_addxx64] = "addq";
00654 OP_Name[TOP_addxxx64] = "addq";
00655 OP_Name[TOP_addxss] = "addss";
00656 OP_Name[TOP_addxsd] = "addsd";
00657 OP_Name[TOP_addxxss] = "addss";
00658 OP_Name[TOP_addxxxss] = "addss";
00659 OP_Name[TOP_addxxsd] = "addsd";
00660 OP_Name[TOP_addxxxsd] = "addsd";
00661 OP_Name[TOP_add128v8] = "paddb";
00662 OP_Name[TOP_addx128v8] = "paddb";
00663 OP_Name[TOP_addxx128v8] = "paddb";
00664 OP_Name[TOP_addxxx128v8] = "paddb";
00665 OP_Name[TOP_mul128v16] = "pmullw";
00666 OP_Name[TOP_add128v16] = "paddw";
00667 OP_Name[TOP_addx128v16] = "paddw";
00668 OP_Name[TOP_addxx128v16] = "paddw";
00669 OP_Name[TOP_addxxx128v16] = "paddw";
00670 OP_Name[TOP_add128v32] = "paddd";
00671 OP_Name[TOP_addx128v32] = "paddd";
00672 OP_Name[TOP_addxx128v32] = "paddd";
00673 OP_Name[TOP_addxxx128v32] = "paddd";
00674 OP_Name[TOP_add128v64] = "paddq";
00675 OP_Name[TOP_addx128v64] = "paddq";
00676 OP_Name[TOP_addxx128v64] = "paddq";
00677 OP_Name[TOP_addxxx128v64] = "paddq";
00678 OP_Name[TOP_fadd128v32] = "addps";
00679 OP_Name[TOP_faddx128v32] = "addps";
00680 OP_Name[TOP_faddxx128v32] = "addps";
00681 OP_Name[TOP_faddxxx128v32] = "addps";
00682 OP_Name[TOP_fadd128v64] = "addpd";
00683 OP_Name[TOP_faddx128v64] = "addpd";
00684 OP_Name[TOP_faddxx128v64] = "addpd";
00685 OP_Name[TOP_faddxxx128v64] = "addpd";
00686 OP_Name[TOP_faddsub128v32] = "addsubps";
00687 OP_Name[TOP_faddsubx128v32] = "addsubps";
00688 OP_Name[TOP_faddsubxx128v32] = "addsubps";
00689 OP_Name[TOP_faddsubxxx128v32] = "addsubps";
00690 OP_Name[TOP_faddsub128v64] = "addsubpd";
00691 OP_Name[TOP_faddsubx128v64] = "addsubpd";
00692 OP_Name[TOP_faddsubxx128v64] = "addsubpd";
00693 OP_Name[TOP_faddsubxxx128v64] = "addsubpd";
00694 OP_Name[TOP_fhadd128v32] = "haddps";
00695 OP_Name[TOP_fhaddx128v32] = "haddps";
00696 OP_Name[TOP_fhaddxx128v32] = "haddps";
00697 OP_Name[TOP_fhaddxxx128v32] = "haddps";
00698 OP_Name[TOP_fhadd128v64] = "haddpd";
00699 OP_Name[TOP_fhaddx128v64] = "haddpd";
00700 OP_Name[TOP_fhaddxx128v64] = "haddpd";
00701 OP_Name[TOP_fhaddxxx128v64] = "haddpd";
00702 OP_Name[TOP_fsub128v32] = "hsubps";
00703 OP_Name[TOP_fsubx128v32] = "hsubps";
00704 OP_Name[TOP_fsubxx128v32] = "hsubps";
00705 OP_Name[TOP_fsubxxx128v32] = "hsubps";
00706 OP_Name[TOP_fsub128v64] = "hsubpd";
00707 OP_Name[TOP_fsubx128v64] = "hsubpd";
00708 OP_Name[TOP_fsubxx128v64] = "hsubpd";
00709 OP_Name[TOP_fsubxxx128v64] = "hsubpd";
00710 OP_Name[TOP_fmovsldup] = "movsldup";
00711 OP_Name[TOP_fmovshdup] = "movshdup";
00712 OP_Name[TOP_fmovddup] = "movddup";
00713 OP_Name[TOP_fmovsldupx] = "movsldup";
00714 OP_Name[TOP_fmovshdupx] = "movshdup";
00715 OP_Name[TOP_fmovddupx] = "movddup";
00716 OP_Name[TOP_fmovsldupxx] = "movsldup";
00717 OP_Name[TOP_fmovshdupxx] = "movshdup";
00718 OP_Name[TOP_fmovddupxx] = "movddup";
00719 OP_Name[TOP_fmovsldupxxx] = "movsldup";
00720 OP_Name[TOP_fmovshdupxxx] = "movshdup";
00721 OP_Name[TOP_fmovddupxxx] = "movddup";
00722 OP_Name[TOP_addi32] = "addl";
00723 OP_Name[TOP_adci32] = "adcl";
00724 OP_Name[TOP_addi64] = "addq";
00725 OP_Name[TOP_imuli32] = "imull";
00726 OP_Name[TOP_imuli64] = "imulq";
00727 OP_Name[TOP_and32] = "andl";
00728 OP_Name[TOP_andx32] = "andl";
00729 OP_Name[TOP_andxx32] = "andl";
00730 OP_Name[TOP_andxxx32]= "andl";
00731 OP_Name[TOP_and64] = "andq";
00732 OP_Name[TOP_andx64] = "andq";
00733 OP_Name[TOP_andxx64] = "andq";
00734 OP_Name[TOP_andxxx64]= "andq";
00735 OP_Name[TOP_andi32] = "andl";
00736 OP_Name[TOP_andi64] = "andq";
00737 OP_Name[TOP_and128v8] = "pand";
00738 OP_Name[TOP_andx128v8] = "pand";
00739 OP_Name[TOP_andxx128v8] = "pand";
00740 OP_Name[TOP_andxxx128v8] = "pand";
00741 OP_Name[TOP_and128v16] = "pand";
00742 OP_Name[TOP_andx128v16] = "pand";
00743 OP_Name[TOP_andxx128v16] = "pand";
00744 OP_Name[TOP_andxxx128v16] = "pand";
00745 OP_Name[TOP_and128v32] = "pand";
00746 OP_Name[TOP_andx128v32] = "pand";
00747 OP_Name[TOP_andxx128v32] = "pand";
00748 OP_Name[TOP_andxxx128v32] = "pand";
00749 OP_Name[TOP_and128v64] = "pand";
00750 OP_Name[TOP_andx128v64] = "pand";
00751 OP_Name[TOP_andxx128v64] = "pand";
00752 OP_Name[TOP_andxxx128v64] = "pand";
00753 OP_Name[TOP_fand128v32] = "andps";
00754 OP_Name[TOP_fandx128v32] = "andps";
00755 OP_Name[TOP_fandxx128v32] = "andps";
00756 OP_Name[TOP_fandxxx128v32] = "andps";
00757 OP_Name[TOP_fand128v64] = "andpd";
00758 OP_Name[TOP_fandx128v64] = "andpd";
00759 OP_Name[TOP_fandxx128v64] = "andpd";
00760 OP_Name[TOP_fandxxx128v64] = "andpd";
00761 OP_Name[TOP_or128v8] = "por";
00762 OP_Name[TOP_orx128v8] = "por";
00763 OP_Name[TOP_orxx128v8] = "por";
00764 OP_Name[TOP_orxxx128v8] = "por";
00765 OP_Name[TOP_or128v16] = "por";
00766 OP_Name[TOP_orx128v16] = "por";
00767 OP_Name[TOP_orxx128v16] = "por";
00768 OP_Name[TOP_orxxx128v16] = "por";
00769 OP_Name[TOP_or128v32] = "por";
00770 OP_Name[TOP_orx128v32] = "por";
00771 OP_Name[TOP_orxx128v32] = "por";
00772 OP_Name[TOP_orxxx128v32] = "por";
00773 OP_Name[TOP_or128v64] = "por";
00774 OP_Name[TOP_orx128v64] = "por";
00775 OP_Name[TOP_orxx128v64] = "por";
00776 OP_Name[TOP_orxxx128v64] = "por";
00777 OP_Name[TOP_for128v32] = "orps";
00778 OP_Name[TOP_forx128v32] = "orps";
00779 OP_Name[TOP_forxx128v32] = "orps";
00780 OP_Name[TOP_forxxx128v32] = "orps";
00781 OP_Name[TOP_for128v64] = "orpd";
00782 OP_Name[TOP_forx128v64] = "orpd";
00783 OP_Name[TOP_forxx128v64] = "orpd";
00784 OP_Name[TOP_forxxx128v64] = "orpd";
00785 OP_Name[TOP_xor128v8] = "pxor";
00786 OP_Name[TOP_xorx128v8] = "pxor";
00787 OP_Name[TOP_xorxx128v8] = "pxor";
00788 OP_Name[TOP_xorxxx128v8] = "pxor";
00789 OP_Name[TOP_xor128v16] = "pxor";
00790 OP_Name[TOP_xorx128v16] = "pxor";
00791 OP_Name[TOP_xorxx128v16] = "pxor";
00792 OP_Name[TOP_xorxxx128v16] = "pxor";
00793 OP_Name[TOP_xor128v32] = "pxor";
00794 OP_Name[TOP_xorx128v32] = "pxor";
00795 OP_Name[TOP_xorxx128v32] = "pxor";
00796 OP_Name[TOP_xorxxx128v32] = "pxor";
00797 OP_Name[TOP_xor128v64] = "pxor";
00798 OP_Name[TOP_xorx128v64] = "pxor";
00799 OP_Name[TOP_xorxx128v64] = "pxor";
00800 OP_Name[TOP_xorxxx128v64] = "pxor";
00801 OP_Name[TOP_fxor128v32] = "xorps";
00802 OP_Name[TOP_fxorx128v32] = "xorps";
00803 OP_Name[TOP_fxorxx128v32] = "xorps";
00804 OP_Name[TOP_fxorxxx128v32] = "xorps";
00805 OP_Name[TOP_fxor128v64] = "xorpd";
00806 OP_Name[TOP_fxorx128v64] = "xorpd";
00807 OP_Name[TOP_fxorxx128v64] = "xorpd";
00808 OP_Name[TOP_fxorxxx128v64] = "xorpd";
00809 OP_Name[TOP_fmax128v32] = "maxps";
00810 OP_Name[TOP_fmaxx128v32] = "maxps";
00811 OP_Name[TOP_fmaxxx128v32] = "maxps";
00812 OP_Name[TOP_fmaxxxx128v32] = "maxps";
00813 OP_Name[TOP_fmax128v64] = "maxpd";
00814 OP_Name[TOP_fmaxx128v64] = "maxpd";
00815 OP_Name[TOP_fmaxxx128v64] = "maxpd";
00816 OP_Name[TOP_fmaxxxx128v64] = "maxpd";
00817 OP_Name[TOP_fmin128v32] = "minps";
00818 OP_Name[TOP_fminx128v32] = "minps";
00819 OP_Name[TOP_fminxx128v32] = "minps";
00820 OP_Name[TOP_fminxxx128v32] = "minps";
00821 OP_Name[TOP_fmin128v64] = "minpd";
00822 OP_Name[TOP_fminx128v64] = "minpd";
00823 OP_Name[TOP_fminxx128v64] = "minpd";
00824 OP_Name[TOP_fminxxx128v64] = "minpd";
00825 OP_Name[TOP_fdiv128v32] = "divps";
00826 OP_Name[TOP_fdivx128v32] = "divps";
00827 OP_Name[TOP_fdivxx128v32] = "divps";
00828 OP_Name[TOP_fdivxxx128v32] = "divps";
00829 OP_Name[TOP_fdiv128v64] = "divpd";
00830 OP_Name[TOP_fdivx128v64] = "divpd";
00831 OP_Name[TOP_fdivxx128v64] = "divpd";
00832 OP_Name[TOP_fdivxxx128v64] = "divpd";
00833 OP_Name[TOP_fmul128v32] = "mulps";
00834 OP_Name[TOP_fmulx128v32] = "mulps";
00835 OP_Name[TOP_fmulxx128v32] = "mulps";
00836 OP_Name[TOP_fmulxxx128v32] = "mulps";
00837 OP_Name[TOP_fmul128v64] = "mulpd";
00838 OP_Name[TOP_fmulx128v64] = "mulpd";
00839 OP_Name[TOP_fmulxx128v64] = "mulpd";
00840 OP_Name[TOP_fmulxxx128v64] = "mulpd";
00841 OP_Name[TOP_frsqrt128v32] = "rsqrtps";
00842 OP_Name[TOP_fsqrt128v32] = "sqrtps";
00843 OP_Name[TOP_fsqrt128v64] = "sqrtpd";
00844 OP_Name[TOP_frcp128v32] = "rcpps";
00845 OP_Name[TOP_subus128v16] = "psubusw";
00846 OP_Name[TOP_cmpgt128v8] = "pcmpgtb";
00847 OP_Name[TOP_cmpgt128v16] = "pcmpgtw";
00848 OP_Name[TOP_cmpgt128v32] = "pcmpgtd";
00849 OP_Name[TOP_cmpeq128v8] = "pcmpeqb";
00850 OP_Name[TOP_cmpeq128v16] = "pcmpeqw";
00851 OP_Name[TOP_cmpeq128v32] = "pcmpeqd";
00852 OP_Name[TOP_cmpgtx128v8] = "pcmpgtb";
00853 OP_Name[TOP_cmpgtx128v16] = "pcmpgtw";
00854 OP_Name[TOP_cmpgtx128v32] = "pcmpgtd";
00855 OP_Name[TOP_cmpeqx128v8] = "pcmpeqb";
00856 OP_Name[TOP_cmpeqx128v16] = "pcmpeqw";
00857 OP_Name[TOP_cmpeqx128v32] = "pcmpeqd";
00858 OP_Name[TOP_cmpgtxx128v8] = "pcmpgtb";
00859 OP_Name[TOP_cmpgtxx128v16] = "pcmpgtw";
00860 OP_Name[TOP_cmpgtxx128v32] = "pcmpgtd";
00861 OP_Name[TOP_cmpeqxx128v8] = "pcmpeqb";
00862 OP_Name[TOP_cmpeqxx128v16] = "pcmpeqw";
00863 OP_Name[TOP_cmpeqxx128v32] = "pcmpeqd";
00864 OP_Name[TOP_cmpgtxxx128v8] = "pcmpgtb";
00865 OP_Name[TOP_cmpgtxxx128v16] = "pcmpgtw";
00866 OP_Name[TOP_cmpgtxxx128v32] = "pcmpgtd";
00867 OP_Name[TOP_cmpeqxxx128v8] = "pcmpeqb";
00868 OP_Name[TOP_cmpeqxxx128v16] = "pcmpeqw";
00869 OP_Name[TOP_cmpeqxxx128v32] = "pcmpeqd";
00870 OP_Name[TOP_max128v8] = "pmaxub";
00871 OP_Name[TOP_max128v16] = "pmaxsw";
00872 OP_Name[TOP_maxx128v8] = "pmaxub";
00873 OP_Name[TOP_maxx128v16] = "pmaxsw";
00874 OP_Name[TOP_maxxx128v8] = "pmaxub";
00875 OP_Name[TOP_maxxx128v16] = "pmaxsw";
00876 OP_Name[TOP_maxxxx128v8] = "pmaxub";
00877 OP_Name[TOP_maxxxx128v16] = "pmaxsw";
00878 OP_Name[TOP_min128v8] = "pmaxub";
00879 OP_Name[TOP_min128v16] = "pmaxsw";
00880 OP_Name[TOP_minx128v8] = "pmaxub";
00881 OP_Name[TOP_minx128v16] = "pmaxsw";
00882 OP_Name[TOP_minxx128v8] = "pmaxub";
00883 OP_Name[TOP_minxx128v16] = "pmaxsw";
00884 OP_Name[TOP_minxxx128v8] = "pmaxub";
00885 OP_Name[TOP_minxxx128v16] = "pmaxsw";
00886 OP_Name[TOP_icall] = "call";
00887 OP_Name[TOP_icallx] = "call";
00888 OP_Name[TOP_icallxx] = "call";
00889 OP_Name[TOP_icallxxx] = "call";
00890 OP_Name[TOP_ijmp] = "jmp";
00891 OP_Name[TOP_ijmpx] = "jmp";
00892 OP_Name[TOP_ijmpxx] = "jmp";
00893 OP_Name[TOP_ijmpxxx] = "jmp";
00894 OP_Name[TOP_xor8] = "xorb";
00895 OP_Name[TOP_xorx8] = "xorb";
00896 OP_Name[TOP_xorxx8] = "xorb";
00897 OP_Name[TOP_xorxxx8]= "xorb";
00898 OP_Name[TOP_xor16] = "xorw";
00899 OP_Name[TOP_xorx16] = "xorw";
00900 OP_Name[TOP_xorxx16] = "xorw";
00901 OP_Name[TOP_xorxxx16]= "xorw";
00902 OP_Name[TOP_and8] = "andb";
00903 OP_Name[TOP_andx8] = "andb";
00904 OP_Name[TOP_andxx8] = "andb";
00905 OP_Name[TOP_andxxx8]= "andb";
00906 OP_Name[TOP_and16] = "andw";
00907 OP_Name[TOP_andx16] = "andw";
00908 OP_Name[TOP_andxx16] = "andw";
00909 OP_Name[TOP_andxxx16]= "andw";
00910 OP_Name[TOP_or8] = "orb";
00911 OP_Name[TOP_orx8] = "orb";
00912 OP_Name[TOP_orxx8] = "orb";
00913 OP_Name[TOP_orxxx8]= "orb";
00914 OP_Name[TOP_or16] = "orw";
00915 OP_Name[TOP_orx16] = "orw";
00916 OP_Name[TOP_orxx16] = "orw";
00917 OP_Name[TOP_orxxx16]= "orw";
00918 OP_Name[TOP_cmp8] = "cmpb";
00919 OP_Name[TOP_cmpx8] = "cmpb";
00920 OP_Name[TOP_cmpxx8] = "cmpb";
00921 OP_Name[TOP_cmpxxx8]= "cmpb";
00922 OP_Name[TOP_cmpi8] = "cmpb";
00923 OP_Name[TOP_cmpxi8] = "cmpb";
00924 OP_Name[TOP_cmpxxi8] = "cmpb";
00925 OP_Name[TOP_cmpxxxi8]= "cmpb";
00926 OP_Name[TOP_cmp16] = "cmpw";
00927 OP_Name[TOP_cmpx16] = "cmpw";
00928 OP_Name[TOP_cmpxx16] = "cmpw";
00929 OP_Name[TOP_cmpxxx16]= "cmpw";
00930 OP_Name[TOP_cmpi16] = "cmpw";
00931 OP_Name[TOP_cmpxi16] = "cmpw";
00932 OP_Name[TOP_cmpxxi16] = "cmpw";
00933 OP_Name[TOP_cmpxxxi16]= "cmpw";
00934 OP_Name[TOP_cmp32] = "cmpl";
00935 OP_Name[TOP_cmpx32] = "cmpl";
00936 OP_Name[TOP_cmpxx32] = "cmpl";
00937 OP_Name[TOP_cmpxxx32]= "cmpl";
00938 OP_Name[TOP_cmpxi32] = "cmpl";
00939 OP_Name[TOP_cmpxxi32] = "cmpl";
00940 OP_Name[TOP_cmpxxxi32]= "cmpl";
00941 OP_Name[TOP_cmp64] = "cmpq";
00942 OP_Name[TOP_cmpx64] = "cmpq";
00943 OP_Name[TOP_cmpxx64] = "cmpq";
00944 OP_Name[TOP_cmpxxx64]= "cmpq";
00945 OP_Name[TOP_cmpxi64] = "cmpq";
00946 OP_Name[TOP_cmpxxi64] = "cmpq";
00947 OP_Name[TOP_cmpxxxi64]= "cmpq";
00948 OP_Name[TOP_cmpi32] = "cmpl";
00949 OP_Name[TOP_cmpi64] = "cmpq";
00950
00951
00952 OP_Name[TOP_div32] = "divl";
00953 OP_Name[TOP_div64] = "divq";
00954 OP_Name[TOP_idiv32] = "idivl";
00955 OP_Name[TOP_idiv64] = "idivq";
00956
00957
00958 OP_Name[TOP_lea32] = "leal";
00959 OP_Name[TOP_lea64] = "leaq";
00960 OP_Name[TOP_leax32] = "leal";
00961 OP_Name[TOP_leax64] = "leaq";
00962 OP_Name[TOP_leaxx32] = "leal";
00963 OP_Name[TOP_leaxx64] = "leaq";
00964 OP_Name[TOP_prefetchx] = "prefetch";
00965 OP_Name[TOP_prefetchxx] = "prefetch";
00966 OP_Name[TOP_prefetchwx] = "prefetchw";
00967 OP_Name[TOP_prefetchwxx] = "prefetchw";
00968 OP_Name[TOP_prefetcht0x] = "prefetcht0";
00969 OP_Name[TOP_prefetcht0xx]= "prefetcht0";
00970 OP_Name[TOP_prefetcht1x] = "prefetcht1";
00971 OP_Name[TOP_prefetcht1xx]= "prefetcht1";
00972 OP_Name[TOP_prefetchntax] = "prefetchnta";
00973 OP_Name[TOP_prefetchntaxx]= "prefetchnta";
00974 if (CG_use_prefetchnta) {
00975 OP_Name[TOP_prefetcht0] = "prefetchnta";
00976 OP_Name[TOP_prefetcht0x] = "prefetchnta";
00977 OP_Name[TOP_prefetcht0xx]= "prefetchnta";
00978 }
00979 OP_Name[TOP_ld8_32] = "movsbl";
00980 OP_Name[TOP_ldx8_32] = "movsbl";
00981 OP_Name[TOP_ldxx8_32] = "movsbl";
00982 OP_Name[TOP_ldu8_32] = "movzbl";
00983 OP_Name[TOP_ldxu8_32] = "movzbl";
00984 OP_Name[TOP_ldxxu8_32]= "movzbl";
00985 OP_Name[TOP_ld8_32_n32] = "movsbl";
00986 OP_Name[TOP_ldu8_32_n32] = "movzbl";
00987
00988 OP_Name[TOP_ld16_32] = "movswl";
00989 OP_Name[TOP_ldx16_32] = "movswl";
00990 OP_Name[TOP_ldxx16_32] = "movswl";
00991 OP_Name[TOP_ldu16_32] = "movzwl";
00992 OP_Name[TOP_ldxu16_32] = "movzwl";
00993 OP_Name[TOP_ldxxu16_32]= "movzwl";
00994 OP_Name[TOP_ld16_32_n32] = "movswl";
00995 OP_Name[TOP_ldu16_32_n32] = "movzwl";
00996
00997 OP_Name[TOP_ld8_64] = "movsbq";
00998 OP_Name[TOP_ldx8_64] = "movsbq";
00999 OP_Name[TOP_ldxx8_64] = "movsbq";
01000 OP_Name[TOP_ld8_64_off] = "movsbq";
01001 OP_Name[TOP_ldu8_64] = "movzbq";
01002 OP_Name[TOP_ldxu8_64] = "movzbq";
01003 OP_Name[TOP_ldxxu8_64] = "movzbq";
01004 OP_Name[TOP_ldu8_64_off] = "movzbq";
01005 OP_Name[TOP_ld16_64] = "movswq";
01006 OP_Name[TOP_ldx16_64] = "movswq";
01007 OP_Name[TOP_ldxx16_64] = "movswq";
01008 OP_Name[TOP_ld16_64_off] = "movswq";
01009 OP_Name[TOP_ldu16_64] = "movzwq";
01010 OP_Name[TOP_ldxu16_64] = "movzwq";
01011 OP_Name[TOP_ldxxu16_64] = "movzwq";
01012 OP_Name[TOP_ldu16_64_off] = "movzwq";
01013 OP_Name[TOP_ld32_64_off] = "movslq";
01014
01015 OP_Name[TOP_ld32] = "movl";
01016 OP_Name[TOP_ldx32] = "movl";
01017 OP_Name[TOP_ldxx32]= "movl";
01018 OP_Name[TOP_ld32_n32] = "movl";
01019 OP_Name[TOP_ld64] = "movq";
01020 OP_Name[TOP_ld64_off] = "movq";
01021 OP_Name[TOP_ldx64] = "movq";
01022 OP_Name[TOP_ldxx64]= "movq";
01023 OP_Name[TOP_zero32] = "xorl";
01024 OP_Name[TOP_zero64] = "xorq";
01025 OP_Name[TOP_xzero32] = "xorps";
01026 OP_Name[TOP_xzero64] = "xorpd";
01027 OP_Name[TOP_xzero128v32] = "xorps";
01028 OP_Name[TOP_xzero128v64] = "xorpd";
01029 OP_Name[TOP_inc8] = "incb";
01030 OP_Name[TOP_inc16] = "incw";
01031 OP_Name[TOP_inc32] = "incl";
01032 OP_Name[TOP_inc64] = "incq";
01033 OP_Name[TOP_dec8] = "decb";
01034 OP_Name[TOP_dec16] = "decw";
01035 OP_Name[TOP_dec32] = "decl";
01036 OP_Name[TOP_dec64] = "decq";
01037 OP_Name[TOP_ldc32] = "movl";
01038 OP_Name[TOP_ldc64] = "movq";
01039 OP_Name[TOP_ld32_64] = "movslq";
01040 OP_Name[TOP_ldx32_64] = "movslq";
01041 OP_Name[TOP_ldxx32_64] = "movslq";
01042 OP_Name[TOP_mov32] = "movl";
01043 OP_Name[TOP_mov64] = "movq";
01044
01045 OP_Name[TOP_movzlq] = "movl";
01046
01047 OP_Name[TOP_fstps_n32] = "fstps";
01048 OP_Name[TOP_fstpl_n32] = "fstpl";
01049 OP_Name[TOP_fstpt_n32] = "fstpt";
01050 OP_Name[TOP_fsts_n32] = "fsts";
01051 OP_Name[TOP_fstl_n32] = "fstl";
01052
01053 OP_Name[TOP_flds_n32] = "flds";
01054 OP_Name[TOP_fldl_n32] = "fldl";
01055 OP_Name[TOP_fldt_n32] = "fldt";
01056
01057 OP_Name[TOP_divxsd] = "divsd";
01058 OP_Name[TOP_divxxsd] = "divsd";
01059 OP_Name[TOP_divxxxsd]= "divsd";
01060 OP_Name[TOP_divxss] = "divss";
01061 OP_Name[TOP_divxxss] = "divss";
01062 OP_Name[TOP_divxxxss]= "divss";
01063 OP_Name[TOP_imul32] = "imull";
01064 OP_Name[TOP_imul64] = "imulq";
01065 OP_Name[TOP_imulx64] = "imulq";
01066 OP_Name[TOP_imulx32] = "imull";
01067 OP_Name[TOP_mul32] = "mull";
01068 OP_Name[TOP_mulx64] = "mulq";
01069 OP_Name[TOP_mulxss] = "mulss";
01070 OP_Name[TOP_mulxsd] = "mulsd";
01071 OP_Name[TOP_mulxxss] = "mulss";
01072 OP_Name[TOP_mulxxxss]= "mulss";
01073 OP_Name[TOP_mulxxsd] = "mulsd";
01074 OP_Name[TOP_mulxxxsd]= "mulsd";
01075 OP_Name[TOP_fmul128v32] = "mulps";
01076 OP_Name[TOP_fmulx128v32] = "mulps";
01077 OP_Name[TOP_fmulxx128v32] = "mulps";
01078 OP_Name[TOP_fmulxxx128v32] = "mulps";
01079 OP_Name[TOP_fmul128v64] = "mulpd";
01080 OP_Name[TOP_fmulx128v64] = "mulpd";
01081 OP_Name[TOP_fmulxx128v64] = "mulpd";
01082 OP_Name[TOP_fmulxxx128v64] = "mulpd";
01083 OP_Name[TOP_neg32] = "negl";
01084 OP_Name[TOP_neg64] = "negq";
01085 OP_Name[TOP_not32] = "notl";
01086 OP_Name[TOP_not64] = "notq";
01087 OP_Name[TOP_or32] = "orl";
01088 OP_Name[TOP_orx32] = "orl";
01089 OP_Name[TOP_orxx32] = "orl";
01090 OP_Name[TOP_orxxx32]= "orl";
01091 OP_Name[TOP_or64] = "orq";
01092 OP_Name[TOP_orx64] = "orq";
01093 OP_Name[TOP_orxx64] = "orq";
01094 OP_Name[TOP_orxxx64] = "orq";
01095 OP_Name[TOP_ori32] = "orl";
01096 OP_Name[TOP_ori64] = "orq";
01097 OP_Name[TOP_pmovmskb128] = "pmovmskb";
01098 OP_Name[TOP_ror8] = "rorb";
01099 OP_Name[TOP_ror16] = "rorw";
01100 OP_Name[TOP_ror32] = "rorl";
01101 OP_Name[TOP_ror64] = "rorq";
01102 OP_Name[TOP_rori8] = "rorb";
01103 OP_Name[TOP_rori16] = "rorw";
01104 OP_Name[TOP_rori32] = "rorl";
01105 OP_Name[TOP_rori64] = "rorq";
01106 OP_Name[TOP_rol8] = "rolb";
01107 OP_Name[TOP_rol16] = "rolw";
01108 OP_Name[TOP_rol32] = "roll";
01109 OP_Name[TOP_rol64] = "rolq";
01110 OP_Name[TOP_roli8] = "rolb";
01111 OP_Name[TOP_roli16] = "rolw";
01112 OP_Name[TOP_roli32] = "roll";
01113 OP_Name[TOP_roli64] = "rolq";
01114 OP_Name[TOP_store8] = "movb";
01115 OP_Name[TOP_storex8] = "movb";
01116 OP_Name[TOP_storexx8] = "movb";
01117 OP_Name[TOP_store8_n32] = "movb";
01118 OP_Name[TOP_store16] = "movw";
01119 OP_Name[TOP_storex16] = "movw";
01120 OP_Name[TOP_storexx16] = "movw";
01121 OP_Name[TOP_store16_n32] = "movw";
01122 OP_Name[TOP_store32] = "movl";
01123 OP_Name[TOP_storex32] = "movl";
01124 OP_Name[TOP_storexx32]= "movl";
01125 OP_Name[TOP_store32_n32] = "movl";
01126 OP_Name[TOP_store64] = "movq";
01127 OP_Name[TOP_store64_off] = "movq";
01128 OP_Name[TOP_storex64] = "movq";
01129 OP_Name[TOP_storexx64]= "movq";
01130 OP_Name[TOP_storenti32] = "movnti";
01131 OP_Name[TOP_storentix32] = "movnti";
01132 OP_Name[TOP_storentixx32]= "movnti";
01133 OP_Name[TOP_storenti64] = "movnti";
01134 OP_Name[TOP_storentix64] = "movnti";
01135 OP_Name[TOP_storentixx64]= "movnti";
01136 OP_Name[TOP_sar32] = "sarl";
01137 OP_Name[TOP_sar64] = "sarq";
01138 OP_Name[TOP_sari32] = "sarl";
01139 OP_Name[TOP_sari64] = "sarq";
01140 OP_Name[TOP_shld32] = "shldl";
01141 OP_Name[TOP_shldi32] = "shldl";
01142 OP_Name[TOP_shrd32] = "shrdl";
01143 OP_Name[TOP_shrdi32] = "shrdl";
01144 OP_Name[TOP_shl32] = "shll";
01145 OP_Name[TOP_shl64] = "shlq";
01146 OP_Name[TOP_shli32] = "shll";
01147 OP_Name[TOP_shli64] = "shlq";
01148 OP_Name[TOP_shr32] = "shrl";
01149 OP_Name[TOP_shr64] = "shrq";
01150 OP_Name[TOP_shri32] = "shrl";
01151 OP_Name[TOP_shri64] = "shrq";
01152 OP_Name[TOP_sub32] = "subl";
01153 OP_Name[TOP_sbb32] = "sbbl";
01154 OP_Name[TOP_sub64] = "subq";
01155 OP_Name[TOP_subx32] = "subl";
01156 OP_Name[TOP_subx64] = "subq";
01157 OP_Name[TOP_subxx32] = "subl";
01158 OP_Name[TOP_subxxx32] = "subl";
01159 OP_Name[TOP_subxx64] = "subq";
01160 OP_Name[TOP_subxxx64] = "subq";
01161 OP_Name[TOP_subi32] = "subl";
01162 OP_Name[TOP_sbbi32] = "sbbl";
01163 OP_Name[TOP_subi64] = "subq";
01164 OP_Name[TOP_subxss] = "subss";
01165 OP_Name[TOP_subxsd] = "subsd";
01166 OP_Name[TOP_subxxss] = "subss";
01167 OP_Name[TOP_subxxxss] = "subss";
01168 OP_Name[TOP_subxxsd] = "subsd";
01169 OP_Name[TOP_subxxxsd] = "subsd";
01170 OP_Name[TOP_sub128v8] = "psubb";
01171 OP_Name[TOP_subx128v8] = "psubb";
01172 OP_Name[TOP_subxx128v8] = "psubb";
01173 OP_Name[TOP_subxxx128v8] = "psubb";
01174 OP_Name[TOP_sub128v16] = "psubw";
01175 OP_Name[TOP_subx128v16] = "psubw";
01176 OP_Name[TOP_subxx128v16] = "psubw";
01177 OP_Name[TOP_subxxx128v16] = "psubw";
01178 OP_Name[TOP_sub128v32] = "psubd";
01179 OP_Name[TOP_subx128v32] = "psubd";
01180 OP_Name[TOP_subxx128v32] = "psubd";
01181 OP_Name[TOP_subxxx128v32] = "psubd";
01182 OP_Name[TOP_sub128v64] = "psubq";
01183 OP_Name[TOP_subx128v64] = "psubq";
01184 OP_Name[TOP_subxx128v64] = "psubq";
01185 OP_Name[TOP_subxxx128v64] = "psubq";
01186 OP_Name[TOP_fsub128v32] = "subps";
01187 OP_Name[TOP_fsubx128v32] = "subps";
01188 OP_Name[TOP_fsubxx128v32] = "subps";
01189 OP_Name[TOP_fsubxxx128v32] = "subps";
01190 OP_Name[TOP_fsub128v64] = "subpd";
01191 OP_Name[TOP_fsubx128v64] = "subpd";
01192 OP_Name[TOP_fsubxx128v64] = "subpd";
01193 OP_Name[TOP_fsubxxx128v64] = "subpd";
01194 OP_Name[TOP_test32] = "testl";
01195 OP_Name[TOP_testx32] = "testl";
01196 OP_Name[TOP_testxx32] = "testl";
01197 OP_Name[TOP_testxxx32] = "testl";
01198 OP_Name[TOP_test64] = "testq";
01199 OP_Name[TOP_testx64] = "testq";
01200 OP_Name[TOP_testxx64] = "testq";
01201 OP_Name[TOP_testxxx64]= "testq";
01202 OP_Name[TOP_testi32] = "testl";
01203 OP_Name[TOP_testi64] = "testq";
01204 OP_Name[TOP_xor32] = "xorl";
01205 OP_Name[TOP_xorx32] = "xorl";
01206 OP_Name[TOP_xorxx32] = "xorl";
01207 OP_Name[TOP_xorxxx32]= "xorl";
01208 OP_Name[TOP_xor64] = "xorq";
01209 OP_Name[TOP_xorx64] = "xorq";
01210 OP_Name[TOP_xorxx64] = "xorq";
01211 OP_Name[TOP_xorxxx64]= "xorq";
01212 OP_Name[TOP_xori32] = "xorl";
01213 OP_Name[TOP_xori64] = "xorq";
01214 OP_Name[TOP_ldss] = "movss";
01215 OP_Name[TOP_ldss_n32] = "movss";
01216 OP_Name[TOP_ldssx] = "movss";
01217 OP_Name[TOP_ldssxx] = "movss";
01218 OP_Name[TOP_lddqa] = "movdqa";
01219 OP_Name[TOP_lddqa_n32] = "movdqa";
01220 OP_Name[TOP_stdqa] = "movdqa";
01221 OP_Name[TOP_stdqa_n32] = "movdqa";
01222 OP_Name[TOP_stntpd]= "movntpd";
01223 OP_Name[TOP_stntps]= "movntps";
01224 if ( !Is_Target_SSE3() || ! CG_use_lddqu) {
01225 OP_Name[TOP_lddqu] = "movdqu";
01226 OP_Name[TOP_lddqu_n32] = "movdqu";
01227 }
01228 else
01229 OP_Name[TOP_lddqu_n32] = "lddqu";
01230 OP_Name[TOP_stdqu] = "movdqu";
01231 OP_Name[TOP_stdqu_n32] = "movdqu";
01232 OP_Name[TOP_ldlps] = "movlps";
01233 OP_Name[TOP_ldlps_n32] = "movlps";
01234 OP_Name[TOP_stlps] = "movlps";
01235 OP_Name[TOP_stlps_n32] = "movlps";
01236 OP_Name[TOP_ldlpd] = "movsd";
01237 OP_Name[TOP_ldlpd_n32] = "movsd";
01238 OP_Name[TOP_stlpd] = "movsd";
01239 OP_Name[TOP_stlpd_n32] = "movsd";
01240 OP_Name[TOP_ldlpsx] = "movlps";
01241 OP_Name[TOP_stlpsx] = "movlps";
01242 OP_Name[TOP_ldlpdx] = "movsd";
01243 OP_Name[TOP_stlpdx] = "movsd";
01244 OP_Name[TOP_ldlpsxx] = "movlps";
01245 OP_Name[TOP_stlpsxx] = "movlps";
01246 OP_Name[TOP_ldlpdxx] = "movsd";
01247 OP_Name[TOP_stlpdxx] = "movsd";
01248 OP_Name[TOP_ldhps] = "movhps";
01249 OP_Name[TOP_ldhps_n32] = "movhps";
01250 OP_Name[TOP_sthps] = "movhps";
01251 OP_Name[TOP_sthps_n32] = "movhps";
01252 OP_Name[TOP_ldhpd] = "movhpd";
01253 OP_Name[TOP_ldhpd_n32] = "movhpd";
01254 OP_Name[TOP_sthpd] = "movhpd";
01255 OP_Name[TOP_sthpd_n32] = "movhpd";
01256 OP_Name[TOP_lddqax] = "movdqa";
01257 OP_Name[TOP_stdqax] = "movdqa";
01258 OP_Name[TOP_stntpdx]= "movntpd";
01259 OP_Name[TOP_stntpsx]= "movntps";
01260 if ( !Is_Target_SSE3() || ! CG_use_lddqu)
01261 OP_Name[TOP_lddqux] = "movdqu";
01262 else
01263 OP_Name[TOP_lddqux] = "lddqu";
01264 OP_Name[TOP_stdqux] = "movdqu";
01265 OP_Name[TOP_ldhpsx] = "movhps";
01266 OP_Name[TOP_sthpsx] = "movhps";
01267 OP_Name[TOP_ldhpdx] = "movhpd";
01268 OP_Name[TOP_sthpdx] = "movhpd";
01269 OP_Name[TOP_lddqaxx] = "movdqa";
01270 OP_Name[TOP_stdqaxx] = "movdqa";
01271 OP_Name[TOP_stntpdxx]= "movntpd";
01272 OP_Name[TOP_stntpsxx]= "movntps";
01273 if ( !Is_Target_SSE3() || ! CG_use_lddqu)
01274 OP_Name[TOP_lddquxx] = "movdqu";
01275 else
01276 OP_Name[TOP_lddquxx] = "lddqu";
01277 OP_Name[TOP_stdquxx] = "movdqu";
01278 OP_Name[TOP_ldhpsxx] = "movhps";
01279 OP_Name[TOP_sthpsxx] = "movhps";
01280 OP_Name[TOP_ldhpdxx] = "movhpd";
01281 OP_Name[TOP_sthpdxx] = "movhpd";
01282 OP_Name[TOP_staps] = "movaps";
01283 OP_Name[TOP_staps_n32] = "movaps";
01284 OP_Name[TOP_stapd] = "movapd";
01285 OP_Name[TOP_stapd_n32] = "movapd";
01286 OP_Name[TOP_stupd] = "movupd";
01287 OP_Name[TOP_stups] = "movups";
01288 OP_Name[TOP_ldaps] = "movaps";
01289 OP_Name[TOP_ldaps_n32] = "movaps";
01290 OP_Name[TOP_ldapd] = "movapd";
01291 OP_Name[TOP_ldapd_n32] = "movapd";
01292 OP_Name[TOP_stapsx] = "movaps";
01293 OP_Name[TOP_stapdx] = "movapd";
01294 OP_Name[TOP_ldapsx] = "movaps";
01295 OP_Name[TOP_ldapdx] = "movapd";
01296 OP_Name[TOP_stapsxx] = "movaps";
01297 OP_Name[TOP_stapdxx] = "movapd";
01298 OP_Name[TOP_ldapsxx] = "movaps";
01299 OP_Name[TOP_ldapdxx] = "movapd";
01300 OP_Name[TOP_ldupd] = "movupd";
01301 OP_Name[TOP_ldupd_n32] = "movupd";
01302 OP_Name[TOP_ldups] = "movups";
01303 OP_Name[TOP_ldups_n32] = "movups";
01304 OP_Name[TOP_movss] = "movaps";
01305 OP_Name[TOP_movdq] = "movdqa";
01306 OP_Name[TOP_movg2x] = "movd";
01307 OP_Name[TOP_movg2x64] = "movd";
01308 OP_Name[TOP_movx2g] = "movd";
01309 OP_Name[TOP_movx2g64] = "movd";
01310 OP_Name[TOP_stss_n32] = "movss";
01311 OP_Name[TOP_stss] = "movss";
01312 OP_Name[TOP_stssx] = "movss";
01313 OP_Name[TOP_stssxx] = "movss";
01314
01315
01316 OP_Name[TOP_stntss] = "movntss";
01317 OP_Name[TOP_stntssx] = "movntss";
01318 OP_Name[TOP_stntssxx] = "movntss";
01319 OP_Name[TOP_stntsd] = "movntsd";
01320 OP_Name[TOP_stntsdx] = "movntsd";
01321 OP_Name[TOP_stntsdxx] = "movntsd";
01322
01323 OP_Name[TOP_fmov] = "fld";
01324 OP_Name[TOP_ld8_abs] = "movabsb";
01325 OP_Name[TOP_ld16_abs] = "movabsw";
01326 OP_Name[TOP_ld32_abs] = "movabsl";
01327 OP_Name[TOP_ld64_abs] = "movabsq";
01328 OP_Name[TOP_store8_abs] = "movabsb";
01329 OP_Name[TOP_store16_abs] = "movabsw";
01330 OP_Name[TOP_store32_abs] = "movabsl";
01331 OP_Name[TOP_store64_abs] = "movabsq";
01332
01333 OP_Name[TOP_ld32_gs_seg_off] = "movl";
01334 OP_Name[TOP_ld64_fs_seg_off] = "movq";
01335
01336 OP_Name[TOP_cvtsd2ss_x] = "cvtsd2ss";
01337 OP_Name[TOP_cvtsd2ss_xx] = "cvtsd2ss";
01338 OP_Name[TOP_cvtsd2ss_xxx] = "cvtsd2ss";
01339 OP_Name[TOP_cvtsi2sd_x] = "cvtsi2sd";
01340 OP_Name[TOP_cvtsi2sd_xx] = "cvtsi2sd";
01341 OP_Name[TOP_cvtsi2sd_xxx] = "cvtsi2sd";
01342 OP_Name[TOP_cvtsi2ss_x] = "cvtsi2ss";
01343 OP_Name[TOP_cvtsi2ss_xx] = "cvtsi2ss";
01344 OP_Name[TOP_cvtsi2ss_xxx] = "cvtsi2ss";
01345 OP_Name[TOP_cvtsi2sdq_x] = "cvtsi2sdq";
01346 OP_Name[TOP_cvtsi2sdq_xx] = "cvtsi2sdq";
01347 OP_Name[TOP_cvtsi2sdq_xxx]= "cvtsi2sdq";
01348 OP_Name[TOP_cvtsi2ssq_x] = "cvtsi2ssq";
01349 OP_Name[TOP_cvtsi2ssq_xx] = "cvtsi2ssq";
01350 OP_Name[TOP_cvtsi2ssq_xxx]= "cvtsi2ssq";
01351
01352 OP_Name[TOP_cvtdq2pd_x] = "cvtdq2pd";
01353 OP_Name[TOP_cvtdq2ps_x] = "cvtdq2ps";
01354 OP_Name[TOP_cvtps2pd_x] = "cvtps2pd";
01355 OP_Name[TOP_cvtpd2ps_x] = "cvtpd2ps";
01356 OP_Name[TOP_cvttps2dq_x] = "cvttps2dq";
01357 OP_Name[TOP_cvttpd2dq_x] = "cvttpd2dq";
01358 OP_Name[TOP_cvtdq2pd_xx] = "cvtdq2pd";
01359 OP_Name[TOP_cvtdq2ps_xx] = "cvtdq2ps";
01360 OP_Name[TOP_cvtps2pd_xx] = "cvtps2pd";
01361 OP_Name[TOP_cvtpd2ps_xx] = "cvtpd2ps";
01362 OP_Name[TOP_cvttps2dq_xx] = "cvttps2dq";
01363 OP_Name[TOP_cvttpd2dq_xx] = "cvttpd2dq";
01364 OP_Name[TOP_cvtdq2pd_xxx] = "cvtdq2pd";
01365 OP_Name[TOP_cvtdq2ps_xxx] = "cvtdq2ps";
01366 OP_Name[TOP_cvtps2pd_xxx] = "cvtps2pd";
01367 OP_Name[TOP_cvtpd2ps_xxx] = "cvtpd2ps";
01368 OP_Name[TOP_cvttps2dq_xxx] = "cvttps2dq";
01369 OP_Name[TOP_cvttpd2dq_xxx] = "cvttpd2dq";
01370
01371
01372
01373
01374
01375
01376 if (CG_use_movlpd &&
01377 !Is_Target_Pentium4() &&
01378 !Is_Target_EM64T() &&
01379 !Is_Target_Core() &&
01380 !Is_Target_Wolfdale() &&
01381 !Is_Target_Barcelona()){
01382
01383 OP_Name[TOP_ldsd] = "movlpd";
01384 OP_Name[TOP_ldsd_n32] = "movlpd";
01385 OP_Name[TOP_stsdx] = "movsd";
01386 OP_Name[TOP_stsdxx] = "movsd";
01387 OP_Name[TOP_movsd] = "movsd";
01388 OP_Name[TOP_ldsdx] = "movlpd";
01389 OP_Name[TOP_ldsdxx] = "movlpd";
01390 OP_Name[TOP_stsd] = "movsd";
01391 OP_Name[TOP_stsd_n32] = "movsd";
01392 OP_Name[TOP_storelpd] = "movlpd";
01393 }
01394 else{
01395 OP_Name[TOP_ldsd] = "movsd";
01396 OP_Name[TOP_ldsd_n32] = "movsd";
01397 OP_Name[TOP_stsdx] = "movsd";
01398 OP_Name[TOP_stsdxx] = "movsd";
01399 OP_Name[TOP_ldsdx] = "movsd";
01400 OP_Name[TOP_ldsdxx] = "movsd";
01401 OP_Name[TOP_stsd] = "movsd";
01402 OP_Name[TOP_stsd_n32] = "movsd";
01403 OP_Name[TOP_storelpd] = "movsd";
01404 if (Is_Target_Barcelona() ||
01405 Is_Target_EM64T() ||
01406 Is_Target_Wolfdale() ||
01407 Is_Target_Core()) {
01408 OP_Name[TOP_movsd] = "movapd";
01409 }
01410 }
01411
01412 OP_Name[TOP_lock_add8] = "addb";
01413 OP_Name[TOP_lock_add16] = "addw";
01414 OP_Name[TOP_lock_add32] = "addl";
01415 OP_Name[TOP_lock_adc32] = "adcl";
01416 OP_Name[TOP_lock_add64] = "addq";
01417
01418 OP_Name[TOP_lock_cmpxchg8] = "cmpxchgb";
01419 OP_Name[TOP_lock_cmpxchg16] = "cmpxchgw";
01420 OP_Name[TOP_lock_cmpxchg32] = "cmpxchgl";
01421 OP_Name[TOP_lock_cmpxchg64] = "cmpxchgq";
01422
01423 OP_Name[TOP_lock_and8] = "andb";
01424 OP_Name[TOP_lock_and16] = "andw";
01425 OP_Name[TOP_lock_and32] = "andl";
01426 OP_Name[TOP_lock_and64] = "andq";
01427
01428 OP_Name[TOP_lock_or8] = "orb";
01429 OP_Name[TOP_lock_or16] = "orw";
01430 OP_Name[TOP_lock_or32] = "orl";
01431 OP_Name[TOP_lock_or64] = "orq";
01432
01433 OP_Name[TOP_lock_xor8] = "xorb";
01434 OP_Name[TOP_lock_xor16] = "xorw";
01435 OP_Name[TOP_lock_xor32] = "xorl";
01436 OP_Name[TOP_lock_xor64] = "xorq";
01437
01438 OP_Name[TOP_lock_sub8] = "subb";
01439 OP_Name[TOP_lock_sub16] = "subw";
01440 OP_Name[TOP_lock_sub32] = "subl";
01441 OP_Name[TOP_lock_sub64] = "subq";
01442
01443 OP_Name[TOP_lock_xadd8] = "xaddb";
01444 OP_Name[TOP_lock_xadd16] = "xaddw";
01445 OP_Name[TOP_lock_xadd32] = "xaddl";
01446 OP_Name[TOP_lock_xadd64] = "xaddq";
01447
01448 OP_Name[TOP_bsf32] = "bsfl";
01449 OP_Name[TOP_bsf64] = "bsfq";
01450 OP_Name[TOP_bsr32] = "bsrl";
01451 OP_Name[TOP_bsr64] = "bsrq";
01452
01453 OP_Name[TOP_ld64_2m] = "movq";
01454 OP_Name[TOP_ld64_2m_n32] = "movq";
01455 OP_Name[TOP_store64_fm] = "movq";
01456 OP_Name[TOP_store64_fm_n32] = "movq";
01457 OP_Name[TOP_storent64_fm] = "movntq";
01458 OP_Name[TOP_ld64_2sse] = "movq";
01459 OP_Name[TOP_ld64_2sse_n32] = "movq";
01460 OP_Name[TOP_store64_fsse] = "movq";
01461 OP_Name[TOP_store64_fsse_n32] = "movq";
01462 OP_Name[TOP_mov64_m] = "movq";
01463 OP_Name[TOP_add64v8] = "paddb";
01464 OP_Name[TOP_add64v16] = "paddw";
01465 OP_Name[TOP_add64v32] = "paddd";
01466 OP_Name[TOP_sub64v8] = "psubb";
01467 OP_Name[TOP_sub64v16] = "psubw";
01468 OP_Name[TOP_sub64v32] = "psubd";
01469 OP_Name[TOP_punpckl64v8] = "punpcklbw",
01470 OP_Name[TOP_punpckl64v16] = "punpcklwd",
01471 OP_Name[TOP_punpckl64v32] = "punpckldq";
01472 OP_Name[TOP_max64v8] = "pmaxub";
01473 OP_Name[TOP_max64v16] = "pmaxsw";
01474 OP_Name[TOP_min64v8] = "pminub";
01475 OP_Name[TOP_min64v16] = "pminsw";
01476 OP_Name[TOP_movi32_2m] = "movd";
01477 OP_Name[TOP_movi64_2m] = "movd";
01478 OP_Name[TOP_movm_2i32] = "movd";
01479 OP_Name[TOP_movm_2i64] = "movd";
01480 OP_Name[TOP_psrlq128v64] = "psrlq";
01481 OP_Name[TOP_storenti128] = "movntdq";
01482 OP_Name[TOP_pshufw64v16] = "pshufw";
01483 OP_Name[TOP_psllw_mmx] = "psllw";
01484 OP_Name[TOP_pslld_mmx] = "pslld";
01485 OP_Name[TOP_psrlw_mmx] = "psrlw";
01486 OP_Name[TOP_psrld_mmx] = "psrld";
01487 OP_Name[TOP_psraw_mmx] = "psraw";
01488 OP_Name[TOP_psrad_mmx] = "psrad";
01489 OP_Name[TOP_pand_mmx] = "pand";
01490 OP_Name[TOP_pandn_mmx] = "pandn";
01491 OP_Name[TOP_por_mmx] = "por";
01492 OP_Name[TOP_pxor_mmx] = "pxor";
01493 OP_Name[TOP_extrq] = "extrq";
01494 OP_Name[TOP_insertq] = "insertq";
01495
01496 return;
01497 }
01498
01499
01500
01501
01502 #define NAME_LEN 8192
01503
01504 enum OPND_REG { BYTE_REG = 0, WORD_REG, DWORD_REG, QWORD_REG, SSE2_REG };
01505
01506 static enum OPND_REG Get_Opnd_Reg( TOP topcode, int opnd )
01507 {
01508 int num_bits = 0;
01509
01510 if( opnd >= 0 ){
01511 if( opnd == TOP_Find_Operand_Use(topcode,OU_base) ||
01512 opnd == TOP_Find_Operand_Use(topcode,OU_index) ){
01513 num_bits = Pointer_Size * 8;
01514
01515 } else {
01516
01517 const ISA_OPERAND_INFO* oinfo = ISA_OPERAND_Info(topcode);
01518 const ISA_OPERAND_VALTYP *otype = ISA_OPERAND_INFO_Operand(oinfo, opnd);
01519
01520 num_bits = ISA_OPERAND_VALTYP_Size(otype);
01521 }
01522
01523 } else {
01524 const ISA_OPERAND_INFO* oinfo = ISA_OPERAND_Info(topcode);
01525 const ISA_OPERAND_VALTYP* otype = ISA_OPERAND_INFO_Result(oinfo, 0);
01526
01527 num_bits = ISA_OPERAND_VALTYP_Size(otype);
01528 }
01529
01530
01531
01532
01533 if( Is_Target_32bit() &&
01534 ( ( TOP_is_cond_move( topcode ) &&
01535 !TOP_is_flop( topcode ) ) ||
01536 TOP_is_ijump( topcode ) ) ) {
01537 num_bits = 32;
01538 }
01539
01540 switch( num_bits ){
01541 case 8: return BYTE_REG;
01542 case 16: return WORD_REG;
01543 case 32: return DWORD_REG;
01544 case 64: return QWORD_REG;
01545 case 128: return SSE2_REG;
01546 default:
01547 FmtAssert( false, ("NYI") );
01548 }
01549
01550 return SSE2_REG;
01551 }
01552
01553
01554 static void Str_Prepend( char* str, char c )
01555 {
01556 for( int i = strlen(str) + 1; i > 0; i-- ){
01557 str[i] = str[i-1];
01558 }
01559
01560 str[0] = c;
01561 }
01562
01563 static const char* int_reg_names[4][16] = {
01564
01565 { "%al", "%bl", "%bpl", "%spl", "%dil", "%sil", "%dl", "%cl",
01566 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b" },
01567
01568 { "%ax", "%bx", "%bp", "%sp", "%di", "%si", "%dx", "%cx",
01569 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w" },
01570
01571 { "%eax", "%ebx", "%ebp", "%esp", "%edi", "%esi", "%edx", "%ecx",
01572 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d" },
01573
01574 { "%rax", "%rbx", "%rbp", "%rsp", "%rdi", "%rsi", "%rdx", "%rcx",
01575 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" },
01576 };
01577
01578 static void Adjust_Opnd_Name( OP* op, int opnd, char* name )
01579 {
01580 const TOP topcode = OP_code( op );
01581
01582 if( TOP_is_ijump( topcode ) &&
01583 ( opnd == OP_find_opnd_use(op,OU_target) ||
01584 opnd == OP_find_opnd_use(op,OU_offset) ) ){
01585 if ( Is_Target_32bit() ) {
01586 const enum OPND_REG opnd_reg = Get_Opnd_Reg( topcode, opnd );
01587 const ISA_REGISTER_CLASS rc = ISA_REGISTER_CLASS_integer;
01588
01589 for( REGISTER reg = REGISTER_MIN;
01590 reg <= REGISTER_CLASS_last_register( rc ); reg++ ){
01591 const char* n = REGISTER_name( rc, reg );
01592 if( strcmp( n, name ) == 0 ){
01593 strcpy( name, int_reg_names[opnd_reg][reg-REGISTER_MIN] );
01594 break;
01595 }
01596 }
01597 }
01598 Str_Prepend( name, '*' );
01599 return;
01600 }
01601
01602 const ISA_OPERAND_INFO* oinfo = ISA_OPERAND_Info(topcode);
01603 const ISA_OPERAND_VALTYP* vtype = opnd >= 0
01604 ? ISA_OPERAND_INFO_Operand(oinfo, opnd)
01605 : ISA_OPERAND_INFO_Result(oinfo, 0);
01606
01607
01608
01609 if( ISA_OPERAND_VALTYP_Is_Literal(vtype) ){
01610
01611 #if defined(BUILD_OS_DARWIN)
01612
01613 #else
01614
01615 if ( Gen_PIC_Shared &&
01616 !TN_is_label( OP_opnd(op,0) ) &&
01617 ( topcode == TOP_call ||
01618
01619 ( topcode == TOP_jmp && !TN_is_label( OP_opnd( op, 0))))) {
01620 ST* function = TN_var(OP_opnd(op, 0));
01621 if ( function && !ST_is_export_local(function) )
01622 strcat( name, "@PLT" );
01623 }
01624 #endif
01625
01626 if (name[0] != '$' &&
01627 (opnd != OP_find_opnd_use(op,OU_offset) &&
01628 opnd != OP_find_opnd_use(op,OU_scale) &&
01629 opnd != OP_find_opnd_use(op,OU_target)) &&
01630
01631 (!(Is_Target_32bit() &&
01632 (TN_relocs(OP_opnd(op, opnd)) == TN_RELOC_X8664_TPOFF32 ||
01633 TN_relocs(OP_opnd(op, opnd)) == TN_RELOC_X8664_GOTTPOFF)))) {
01634 Str_Prepend(name, '$');
01635 }
01636
01637
01638 {
01639 char *nl = strstr(name, "\n");
01640 if (nl) {
01641 if (strstr (name, ")") == NULL)
01642 name[nl - name] = '\0';
01643 else
01644 { name[nl - name] = ')'; name[nl - name + 1] = '\0'; }
01645 }
01646 }
01647
01648 return;
01649 }
01650
01651
01652
01653 if( !ISA_OPERAND_VALTYP_Is_Register(vtype) )
01654 return;
01655
01656 if( ISA_OPERAND_VALTYP_Register_Class(vtype) == ISA_REGISTER_CLASS_integer ){
01657 const enum OPND_REG opnd_reg = Get_Opnd_Reg( topcode, opnd );
01658 const ISA_REGISTER_CLASS rc = ISA_REGISTER_CLASS_integer;
01659
01660 for( REGISTER reg = REGISTER_MIN; reg <= REGISTER_CLASS_last_register( rc ); reg++ ){
01661 const char* n = REGISTER_name( rc, reg );
01662 if( strcmp( n, name ) == 0 ){
01663 strcpy( name, int_reg_names[opnd_reg][reg-REGISTER_MIN] );
01664 return;
01665 }
01666 }
01667 }
01668
01669 if( ISA_OPERAND_VALTYP_Register_Class(vtype) == ISA_REGISTER_CLASS_x87 ){
01670 extern int Get_OP_stack_reg( OP*, int );
01671 sprintf( name, "%%st(%d)", Get_OP_stack_reg( op, opnd ) );
01672 return;
01673 }
01674 }
01675
01676
01677
01678 static const char *
01679 Segment_Prefix (OP *op)
01680 {
01681 if (CGTARG_Is_Thread_Local_Memory_OP(op)) {
01682 return Is_Target_32bit() ? "%gs:" : "%fs:";
01683 }
01684 return "";
01685 }
01686
01687 INT CGEMIT_Print_Inst( OP* op, const char* result[], const char* opnd[], FILE* f )
01688 {
01689 Init_OP_Name();
01690
01691 char result_name[2][NAME_LEN];
01692 char opnd_name[9][NAME_LEN];
01693 const TOP topcode = OP_code(op);
01694 const ISA_PRINT_INFO* pinfo = ISA_PRINT_Info(topcode);
01695 char op_name[NAME_LEN];
01696
01697 FmtAssert( pinfo != NULL, ("no ISA_PRINT_INFO for %s", TOP_Name(topcode)) );
01698
01699
01700
01701
01702 const char* p = OP_Name[topcode] == NULL ? TOP_Name(topcode) : OP_Name[topcode];
01703
01704 if (OP_prefix_lock(op))
01705 sprintf( op_name, "lock %s", p );
01706 else
01707 strcpy( op_name, p );
01708
01709
01710 INT i = 0, opnd_i = 0, result_i = 0;
01711
01712 while( TRUE ){
01713 const INT comp = ISA_PRINT_INFO_Comp(pinfo, i);
01714
01715 switch( comp ){
01716
01717 case ISA_PRINT_COMP_opnd:
01718 case ISA_PRINT_COMP_opnd+1:
01719 case ISA_PRINT_COMP_opnd+2:
01720 case ISA_PRINT_COMP_opnd+3:
01721 case ISA_PRINT_COMP_opnd+4:
01722 case ISA_PRINT_COMP_opnd+5:
01723 Is_True(10 + strlen(opnd[comp - ISA_PRINT_COMP_opnd])
01724 < sizeof(opnd_name[opnd_i]),
01725 ("buffer size is too small") );
01726 strcpy(opnd_name[opnd_i], opnd[comp - ISA_PRINT_COMP_opnd]);
01727 Adjust_Opnd_Name(op, comp - ISA_PRINT_COMP_opnd, opnd_name[opnd_i]);
01728 opnd_i++;
01729 break;
01730
01731 case ISA_PRINT_COMP_result:
01732 case ISA_PRINT_COMP_result+1:
01733 Is_True(10 + strlen(result[comp - ISA_PRINT_COMP_result])
01734 < sizeof(result_name[result_i]),
01735 ("buffer size is too small"));
01736 strcpy(result_name[result_i], result[comp - ISA_PRINT_COMP_result]);
01737 Adjust_Opnd_Name(op, -1, result_name[result_i]);
01738 result_i++;
01739 break;
01740
01741 case ISA_PRINT_COMP_segment:
01742 {
01743 const char *segment_prefix = Segment_Prefix(op);
01744 Is_True(10 + strlen(segment_prefix) < sizeof(opnd_name[opnd_i]),
01745 ("buffer size is too small"));
01746 strcpy(opnd_name[opnd_i], segment_prefix);
01747 opnd_i++;
01748 }
01749 break;
01750
01751 case ISA_PRINT_COMP_name:
01752 case ISA_PRINT_COMP_end:
01753 break;
01754
01755 default:
01756 FmtAssert(false, ("Unhandled listing component %d for %s",
01757 comp, TOP_Name(topcode)));
01758 }
01759
01760 i++;
01761 if( comp == ISA_PRINT_COMP_end )
01762 break;
01763 }
01764
01765
01766
01767
01768 for( i = 0; i < result_i; i++ ){
01769 strcpy( opnd_name[opnd_i], result_name[i] );
01770 opnd_i++;
01771 }
01772
01773 INT st = fprintf( f, ISA_PRINT_INFO_Format(pinfo),
01774 op_name,
01775 opnd_name[0], opnd_name[1], opnd_name[2], opnd_name[3],
01776 opnd_name[4], opnd_name[5], opnd_name[6], opnd_name[7],
01777 opnd_name[8] );
01778
01779 FmtAssert( st != -1, ("fprintf failed: not enough disk space") );
01780
01781 return st;
01782 }
01783
01784
01785 void CGEMIT_Setup_Ctrl_Register( FILE* f )
01786 {
01787
01788 int x87_mask;
01789 switch (Target_x87_precision()) {
01790 case 32: x87_mask = 0; break;
01791 case 64: x87_mask = 0x200; break;
01792 case 80: x87_mask = 0x300; break;
01793 default: FmtAssert(FALSE,
01794 ("CGEMIT_Setup_Ctrl_Register: invalid x87 precision"));
01795 }
01796
01797 unsigned int x86_cntrl_mask = DEBUG_Trap_Uv ? 0xfcfe : 0xfcff;
01798 if( Is_Target_64bit() ){
01799 fprintf( f, "\taddq $-8,%%rsp\n" );
01800 fprintf( f, "\tfnstcw (%%rsp)\n" );
01801 fprintf( f, "\tandw $0x%x,(%%rsp)\n", x86_cntrl_mask);
01802 fprintf( f, "\torw $%d,(%%rsp)\n", x87_mask );
01803 fprintf( f, "\tfldcw (%%rsp)\n" );
01804 fprintf( f, "\taddq $8,%%rsp\n" );
01805 } else {
01806 fprintf( f, "\taddl $-4,%%esp\n" );
01807 fprintf( f, "\tfnstcw (%%esp)\n" );
01808 fprintf( f, "\tandw $0x%x,(%%esp)\n", x86_cntrl_mask);
01809 fprintf( f, "\torw $%d,(%%esp)\n", x87_mask );
01810 fprintf( f, "\tfldcw (%%esp)\n" );
01811 fprintf( f, "\taddl $4,%%esp\n" );
01812 }
01813
01814 BOOL is_MAIN__ = !strcmp(Cur_PU_Name, "MAIN__");
01815
01816 if (IEEE_Arithmetic <= IEEE_ACCURATE &&
01817 !is_MAIN__ &&
01818 SIMD_IMask &&
01819 SIMD_DMask &&
01820 SIMD_ZMask &&
01821 SIMD_OMask &&
01822 SIMD_UMask &&
01823 SIMD_PMask &&
01824 !DEBUG_Trap_Uv)
01825 return;
01826
01827
01828
01829
01830
01831 const int mask = 32768 ;
01832 const int simd_imask = 0xff7f;
01833 const int simd_dmask = 0xfeff;
01834 const int simd_zmask = 0xfdff;
01835 const int simd_omask = 0xfbff;
01836 const int simd_umask = 0xf7ff;
01837 const int simd_pmask = 0xefff;
01838
01839
01840 if( Is_Target_64bit() ){
01841 fprintf( f, "\t%s\n", "addq $-8,%rsp" );
01842 fprintf( f, "\t%s\n", "stmxcsr (%rsp)" );
01843 if (IEEE_Arithmetic > IEEE_ACCURATE)
01844 fprintf( f, "\torq $%d, (%%rsp)\n", mask);
01845 else if (is_MAIN__)
01846 fprintf( f, "\tandq $%d, (%%rsp)\n", ~mask);
01847 if ( !SIMD_IMask || DEBUG_Trap_Uv)
01848 fprintf( f, "\tandq $%d, (%%rsp)\n", simd_imask );
01849 if ( !SIMD_DMask )
01850 fprintf( f, "\tandq $%d, (%%rsp)\n", simd_dmask );
01851 if ( !SIMD_ZMask )
01852 fprintf( f, "\tandq $%d, (%%rsp)\n", simd_zmask );
01853 if ( !SIMD_OMask )
01854 fprintf( f, "\tandq $%d, (%%rsp)\n", simd_omask );
01855 if ( !SIMD_UMask )
01856 fprintf( f, "\tandq $%d, (%%rsp)\n", simd_umask );
01857 if ( !SIMD_PMask )
01858 fprintf( f, "\tandq $%d, (%%rsp)\n", simd_pmask );
01859 fprintf( f, "\t%s\n", "ldmxcsr (%rsp)" );
01860 fprintf( f, "\t%s\n", "addq $8,%rsp" );
01861
01862 } else {
01863 fprintf( f, "\t%s\n", "addl $-8,%esp" );
01864 fprintf( f, "\t%s\n", "stmxcsr (%esp)" );
01865 if (IEEE_Arithmetic > IEEE_ACCURATE)
01866 fprintf( f, "\torl $%d, (%%esp)\n", mask);
01867 else if (is_MAIN__)
01868 fprintf( f, "\tandl $%d, (%%esp)\n", ~mask);
01869 if ( !SIMD_IMask || DEBUG_Trap_Uv)
01870 fprintf( f, "\tandl $%d, (%%esp)\n", simd_imask );
01871 if ( !SIMD_DMask )
01872 fprintf( f, "\tandl $%d, (%%esp)\n", simd_dmask );
01873 if ( !SIMD_ZMask )
01874 fprintf( f, "\tandl $%d, (%%esp)\n", simd_zmask );
01875 if ( !SIMD_OMask )
01876 fprintf( f, "\tandl $%d, (%%esp)\n", simd_omask );
01877 if ( !SIMD_UMask )
01878 fprintf( f, "\tandl $%d, (%%esp)\n", simd_umask );
01879 if ( !SIMD_PMask)
01880 fprintf( f, "\tandl $%d, (%%esp)\n", simd_pmask );
01881 fprintf( f, "\t%s\n", "ldmxcsr (%esp)" );
01882 fprintf( f, "\t%s\n", "addl $8,%esp" );
01883 }
01884
01885 return;
01886 }
01887
01888
01889 void CGEMIT_Setup_IP_Calc (void)
01890 {
01891 fprintf (Asm_File, "\n\t.section .gnu.linkonce.t.%s,\"ax\",@progbits\n", ip_calc_funcname);
01892 fprintf (Asm_File, "\t.globl %s\n", ip_calc_funcname);
01893 fprintf (Asm_File, "\t.hidden %s\n", ip_calc_funcname);
01894 fprintf (Asm_File, "\t.type %s, @function\n", ip_calc_funcname);
01895 fprintf (Asm_File, "%s:\n", ip_calc_funcname);
01896 fprintf (Asm_File, "\tmovl (%%esp),%%ebx\n");
01897 fprintf (Asm_File, "\tret\n");
01898 }