X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-i386.c;h=cc08efb97df8ca2142fa4ddd5241bd5364ab20ad;hb=8f3bae45202d47cc88273b0060a458841cd46282;hp=e80b9939e257a17ad6194b27ce3c37db58aa225e;hpb=40a9833c82a0a497ebd8913c5755cb660225bade;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index e80b9939e2..cc08efb97d 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -132,9 +132,11 @@ typedef struct enum processor_type type; /* arch type */ i386_cpu_flags flags; /* cpu feature flags */ unsigned int skip; /* show_arch should skip this. */ + unsigned int negated; /* turn off indicated flags. */ } arch_entry; +static void update_code_flag (int, int); static void set_code_flag (int); static void set_16bit_gcc_code_flag (int); static void set_intel_syntax (int); @@ -562,142 +564,154 @@ const relax_typeS md_relax_table[] = static const arch_entry cpu_arch[] = { + /* Do not replace the first two entries - i386_target_format() + relies on them being there in this order. */ { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32, - CPU_GENERIC32_FLAGS, 0 }, + CPU_GENERIC32_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64, - CPU_GENERIC64_FLAGS, 0 }, + CPU_GENERIC64_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN, - CPU_NONE_FLAGS, 0 }, + CPU_NONE_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN, - CPU_I186_FLAGS, 0 }, + CPU_I186_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN, - CPU_I286_FLAGS, 0 }, + CPU_I286_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("i386"), PROCESSOR_I386, - CPU_I386_FLAGS, 0 }, + CPU_I386_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("i486"), PROCESSOR_I486, - CPU_I486_FLAGS, 0 }, + CPU_I486_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM, - CPU_I586_FLAGS, 0 }, + CPU_I586_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO, - CPU_I686_FLAGS, 0 }, + CPU_I686_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM, - CPU_I586_FLAGS, 0 }, + CPU_I586_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO, - CPU_I686_FLAGS, 0 }, + CPU_PENTIUMPRO_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO, - CPU_P2_FLAGS, 0 }, + CPU_P2_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO, - CPU_P3_FLAGS, 0 }, + CPU_P3_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4, - CPU_P4_FLAGS, 0 }, + CPU_P4_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA, - CPU_CORE_FLAGS, 0 }, + CPU_CORE_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA, - CPU_NOCONA_FLAGS, 0 }, + CPU_NOCONA_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE, - CPU_CORE_FLAGS, 1 }, + CPU_CORE_FLAGS, 1, 0 }, { STRING_COMMA_LEN ("core"), PROCESSOR_CORE, - CPU_CORE_FLAGS, 0 }, + CPU_CORE_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2, - CPU_CORE2_FLAGS, 1 }, + CPU_CORE2_FLAGS, 1, 0 }, { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2, - CPU_CORE2_FLAGS, 0 }, + CPU_CORE2_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7, - CPU_COREI7_FLAGS, 0 }, + CPU_COREI7_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM, - CPU_L1OM_FLAGS, 0 }, + CPU_L1OM_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("k6"), PROCESSOR_K6, - CPU_K6_FLAGS, 0 }, + CPU_K6_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6, - CPU_K6_2_FLAGS, 0 }, + CPU_K6_2_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON, - CPU_ATHLON_FLAGS, 0 }, + CPU_ATHLON_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8, - CPU_K8_FLAGS, 1 }, + CPU_K8_FLAGS, 1, 0 }, { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8, - CPU_K8_FLAGS, 0 }, + CPU_K8_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("k8"), PROCESSOR_K8, - CPU_K8_FLAGS, 0 }, + CPU_K8_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10, - CPU_AMDFAM10_FLAGS, 0 }, + CPU_AMDFAM10_FLAGS, 0, 0 }, { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BDVER1, - CPU_BDVER1_FLAGS, 0 }, + CPU_BDVER1_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN, - CPU_8087_FLAGS, 0 }, + CPU_8087_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN, - CPU_287_FLAGS, 0 }, + CPU_287_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN, - CPU_387_FLAGS, 0 }, + CPU_387_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".no87"), PROCESSOR_UNKNOWN, - CPU_ANY87_FLAGS, 0 }, + CPU_ANY87_FLAGS, 0, 1 }, { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN, - CPU_MMX_FLAGS, 0 }, + CPU_MMX_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".nommx"), PROCESSOR_UNKNOWN, - CPU_3DNOWA_FLAGS, 0 }, + CPU_3DNOWA_FLAGS, 0, 1 }, { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN, - CPU_SSE_FLAGS, 0 }, + CPU_SSE_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN, - CPU_SSE2_FLAGS, 0 }, + CPU_SSE2_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN, - CPU_SSE3_FLAGS, 0 }, + CPU_SSE3_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN, - CPU_SSSE3_FLAGS, 0 }, + CPU_SSSE3_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN, - CPU_SSE4_1_FLAGS, 0 }, + CPU_SSE4_1_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN, - CPU_SSE4_2_FLAGS, 0 }, + CPU_SSE4_2_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN, - CPU_SSE4_2_FLAGS, 0 }, + CPU_SSE4_2_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".nosse"), PROCESSOR_UNKNOWN, - CPU_ANY_SSE_FLAGS, 0 }, + CPU_ANY_SSE_FLAGS, 0, 1 }, { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN, - CPU_AVX_FLAGS, 0 }, + CPU_AVX_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".noavx"), PROCESSOR_UNKNOWN, - CPU_ANY_AVX_FLAGS, 0 }, + CPU_ANY_AVX_FLAGS, 0, 1 }, { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN, - CPU_VMX_FLAGS, 0 }, + CPU_VMX_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN, - CPU_SMX_FLAGS, 0 }, + CPU_SMX_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN, - CPU_XSAVE_FLAGS, 0 }, + CPU_XSAVE_FLAGS, 0, 0 }, + { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN, + CPU_XSAVEOPT_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN, - CPU_AES_FLAGS, 0 }, + CPU_AES_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN, - CPU_PCLMUL_FLAGS, 0 }, + CPU_PCLMUL_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN, - CPU_PCLMUL_FLAGS, 1 }, + CPU_PCLMUL_FLAGS, 1, 0 }, + { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN, + CPU_FSGSBASE_FLAGS, 0, 0 }, + { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN, + CPU_RDRND_FLAGS, 0, 0 }, + { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN, + CPU_F16C_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN, - CPU_FMA_FLAGS, 0 }, + CPU_FMA_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN, - CPU_FMA4_FLAGS, 0 }, + CPU_FMA4_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN, - CPU_XOP_FLAGS, 0 }, + CPU_XOP_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN, - CPU_LWP_FLAGS, 0 }, + CPU_LWP_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN, - CPU_MOVBE_FLAGS, 0 }, + CPU_MOVBE_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN, - CPU_EPT_FLAGS, 0 }, + CPU_EPT_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN, - CPU_CLFLUSH_FLAGS, 0 }, + CPU_CLFLUSH_FLAGS, 0, 0 }, + { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN, + CPU_NOP_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN, - CPU_SYSCALL_FLAGS, 0 }, + CPU_SYSCALL_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN, - CPU_RDTSCP_FLAGS, 0 }, + CPU_RDTSCP_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN, - CPU_3DNOW_FLAGS, 0 }, + CPU_3DNOW_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN, - CPU_3DNOWA_FLAGS, 0 }, + CPU_3DNOWA_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN, - CPU_PADLOCK_FLAGS, 0 }, + CPU_PADLOCK_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN, - CPU_SVME_FLAGS, 1 }, + CPU_SVME_FLAGS, 1, 0 }, { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN, - CPU_SVME_FLAGS, 0 }, + CPU_SVME_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN, - CPU_SSE4A_FLAGS, 0 }, + CPU_SSE4A_FLAGS, 0, 0 }, { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN, - CPU_ABM_FLAGS, 0 }, + CPU_ABM_FLAGS, 0, 0 }, }; #ifdef I386COFF @@ -987,7 +1001,7 @@ i386_align_code (fragS *fragP, int count) will be used. When -mtune= isn't used, alt_long_patt will be used if - cpu_arch_isa_flags has Cpu686. Otherwise, f32_patt will + cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will be used. When -march= or .arch is used, we can't use anything beyond @@ -1017,8 +1031,8 @@ i386_align_code (fragS *fragP, int count) { case PROCESSOR_UNKNOWN: /* We use cpu_arch_isa_flags to check if we SHOULD - optimize for Cpu686. */ - if (fragP->tc_frag_data.isa_flags.bitfield.cpui686) + optimize with nops. */ + if (fragP->tc_frag_data.isa_flags.bitfield.cpunop) patt = alt_long_patt; else patt = f32_patt; @@ -1068,8 +1082,8 @@ i386_align_code (fragS *fragP, int count) case PROCESSOR_BDVER1: case PROCESSOR_GENERIC32: /* We use cpu_arch_isa_flags to check if we CAN optimize - for Cpu686. */ - if (fragP->tc_frag_data.isa_flags.bitfield.cpui686) + with nops. */ + if (fragP->tc_frag_data.isa_flags.bitfield.cpunop) patt = alt_short_patt; else patt = f32_patt; @@ -1081,7 +1095,7 @@ i386_align_code (fragS *fragP, int count) case PROCESSOR_CORE2: case PROCESSOR_COREI7: case PROCESSOR_L1OM: - if (fragP->tc_frag_data.isa_flags.bitfield.cpui686) + if (fragP->tc_frag_data.isa_flags.bitfield.cpunop) patt = alt_long_patt; else patt = f32_patt; @@ -1920,8 +1934,10 @@ add_prefix (unsigned int prefix) } static void -set_code_flag (int value) +update_code_flag (int value, int check) { + PRINTF_LIKE ((*as_error)); + flag_code = (enum flag_code) value; if (flag_code == CODE_64BIT) { @@ -1935,15 +1951,31 @@ set_code_flag (int value) } if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm ) { - as_bad (_("64bit mode not supported on this CPU.")); + if (check) + as_error = as_fatal; + else + as_error = as_bad; + (*as_error) (_("64bit mode not supported on `%s'."), + cpu_arch_name ? cpu_arch_name : default_arch); } if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386) { - as_bad (_("32bit mode not supported on this CPU.")); + if (check) + as_error = as_fatal; + else + as_error = as_bad; + (*as_error) (_("32bit mode not supported on `%s'."), + cpu_arch_name ? cpu_arch_name : default_arch); } stackop_size = '\0'; } +static void +set_code_flag (int value) +{ + update_code_flag (value, 0); +} + static void set_16bit_gcc_code_flag (int new_code_flag) { @@ -2102,7 +2134,7 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED) break; } - if (strncmp (string + 1, "no", 2)) + if (!cpu_arch[j].negated) flags = cpu_flags_or (cpu_arch_flags, cpu_arch[j].flags); else @@ -2341,7 +2373,7 @@ static void ps (symbolS *); static void pi (char *line, i386_insn *x) { - unsigned int i; + unsigned int j; fprintf (stdout, "%s: template ", line); pte (&x->tm); @@ -2358,35 +2390,35 @@ pi (char *line, i386_insn *x) (x->rex & REX_R) != 0, (x->rex & REX_X) != 0, (x->rex & REX_B) != 0); - for (i = 0; i < x->operands; i++) + for (j = 0; j < x->operands; j++) { - fprintf (stdout, " #%d: ", i + 1); - pt (x->types[i]); + fprintf (stdout, " #%d: ", j + 1); + pt (x->types[j]); fprintf (stdout, "\n"); - if (x->types[i].bitfield.reg8 - || x->types[i].bitfield.reg16 - || x->types[i].bitfield.reg32 - || x->types[i].bitfield.reg64 - || x->types[i].bitfield.regmmx - || x->types[i].bitfield.regxmm - || x->types[i].bitfield.regymm - || x->types[i].bitfield.sreg2 - || x->types[i].bitfield.sreg3 - || x->types[i].bitfield.control - || x->types[i].bitfield.debug - || x->types[i].bitfield.test) - fprintf (stdout, "%s\n", x->op[i].regs->reg_name); - if (operand_type_check (x->types[i], imm)) - pe (x->op[i].imms); - if (operand_type_check (x->types[i], disp)) - pe (x->op[i].disps); + if (x->types[j].bitfield.reg8 + || x->types[j].bitfield.reg16 + || x->types[j].bitfield.reg32 + || x->types[j].bitfield.reg64 + || x->types[j].bitfield.regmmx + || x->types[j].bitfield.regxmm + || x->types[j].bitfield.regymm + || x->types[j].bitfield.sreg2 + || x->types[j].bitfield.sreg3 + || x->types[j].bitfield.control + || x->types[j].bitfield.debug + || x->types[j].bitfield.test) + fprintf (stdout, "%s\n", x->op[j].regs->reg_name); + if (operand_type_check (x->types[j], imm)) + pe (x->op[j].imms); + if (operand_type_check (x->types[j], disp)) + pe (x->op[j].disps); } } static void pte (insn_template *t) { - unsigned int i; + unsigned int j; fprintf (stdout, " %d operands ", t->operands); fprintf (stdout, "opcode %x ", t->base_opcode); if (t->extension_opcode != None) @@ -2396,10 +2428,10 @@ pte (insn_template *t) if (t->opcode_modifier.w) fprintf (stdout, "W"); fprintf (stdout, "\n"); - for (i = 0; i < t->operands; i++) + for (j = 0; j < t->operands; j++) { - fprintf (stdout, " #%d type ", i + 1); - pt (t->operand_types[i]); + fprintf (stdout, " #%d type ", j + 1); + pt (t->operand_types[j]); fprintf (stdout, "\n"); } } @@ -2771,6 +2803,7 @@ build_vex_prefix (const insn_template *t) /* Use 2-byte VEX prefix if possible. */ if (i.tm.opcode_modifier.vexopcode == VEX0F + && i.tm.opcode_modifier.vexw != VEXW1 && (i.rex & (REX_W | REX_X | REX_B)) == 0) { /* 2-byte VEX prefix. */ @@ -3757,7 +3790,7 @@ optimize_disp (void) } } -/* Check if operands are valid for the instrucrtion. Update VEX +/* Check if operands are valid for the instruction. Update VEX operand types. */ static int @@ -3819,12 +3852,13 @@ match_template (void) else if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX) suffix_check.no_ldsuf = 1; + /* Must have right number of operands. */ + i.error = number_of_operands_mismatch; + for (t = current_templates->start; t < current_templates->end; t++) { addr_prefix_disp = -1; - /* Must have right number of operands. */ - i.error = number_of_operands_mismatch; if (i.operands != t->operands) continue; @@ -5231,15 +5265,15 @@ build_modrm_byte (void) && i.imm_operands == 1 && (i.types[0].bitfield.imm8 || i.types[i.operands - 1].bitfield.imm8))); - if (i.tm.opcode_modifier.vexvvvv == VEXXDS) + if (i.imm_operands == 2) + source = 2; + else { if (i.types[0].bitfield.imm8) source = 1; else source = 0; } - else - source = 2; break; case 5: break; @@ -6593,8 +6627,8 @@ i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp, { /* Size it properly later. */ i.types[this_operand].bitfield.imm64 = 1; - /* If BFD64, sign extend val. */ - if (!use_rela_relocations + /* If not 64bit, sign extend val. */ + if (flag_code != CODE_64BIT && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0) exp->X_add_number = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31); @@ -6849,7 +6883,8 @@ i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp, goto inv_disp; if (S_IS_LOCAL (exp->X_add_symbol) - && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section) + && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section + && S_GET_SEGMENT (exp->X_add_symbol) != expr_section) section_symbol (S_GET_SEGMENT (exp->X_add_symbol)); exp->X_op = O_subtract; exp->X_op_symbol = GOT_symbol; @@ -8166,6 +8201,9 @@ md_parse_option (int c, char *arg) if (strcmp (arch, cpu_arch [j].name) == 0) { /* Processor. */ + if (! cpu_arch[j].flags.bitfield.cpui386) + continue; + cpu_arch_name = cpu_arch[j].name; cpu_sub_arch_name = NULL; cpu_arch_flags = cpu_arch[j].flags; @@ -8184,7 +8222,7 @@ md_parse_option (int c, char *arg) /* ISA entension. */ i386_cpu_flags flags; - if (strncmp (arch, "no", 2)) + if (!cpu_arch[j].negated) flags = cpu_flags_or (cpu_arch_flags, cpu_arch[j].flags); else @@ -8297,7 +8335,7 @@ md_parse_option (int c, char *arg) " " static void -show_arch (FILE *stream, int ext) +show_arch (FILE *stream, int ext, int check) { static char message[] = MESSAGE_TEMPLATE; char *start = message + 27; @@ -8334,6 +8372,11 @@ show_arch (FILE *stream, int ext) /* It is an processor. Skip if we show only extension. */ continue; } + else if (check && ! cpu_arch[j].flags.bitfield.cpui386) + { + /* It is an impossible processor - skip. */ + continue; + } /* Reserve 2 spaces for ", " or ",\0" */ left -= len + 2; @@ -8398,13 +8441,13 @@ md_show_usage (FILE *stream) fprintf (stream, _("\ -march=CPU[,+EXTENSION...]\n\ generate code for CPU and EXTENSION, CPU is one of:\n")); - show_arch (stream, 0); + show_arch (stream, 0, 1); fprintf (stream, _("\ EXTENSION is combination of:\n")); - show_arch (stream, 1); + show_arch (stream, 1, 0); fprintf (stream, _("\ -mtune=CPU optimize for CPU, CPU is one of:\n")); - show_arch (stream, 0); + show_arch (stream, 0, 0); fprintf (stream, _("\ -msse2avx encode SSE instructions with VEX prefix\n")); fprintf (stream, _("\ @@ -8435,54 +8478,17 @@ const char * i386_target_format (void) { if (!strcmp (default_arch, "x86_64")) - { - set_code_flag (CODE_64BIT); - if (cpu_flags_all_zero (&cpu_arch_isa_flags)) - { - cpu_arch_isa_flags.bitfield.cpui186 = 1; - cpu_arch_isa_flags.bitfield.cpui286 = 1; - cpu_arch_isa_flags.bitfield.cpui386 = 1; - cpu_arch_isa_flags.bitfield.cpui486 = 1; - cpu_arch_isa_flags.bitfield.cpui586 = 1; - cpu_arch_isa_flags.bitfield.cpui686 = 1; - cpu_arch_isa_flags.bitfield.cpuclflush = 1; - cpu_arch_isa_flags.bitfield.cpummx= 1; - cpu_arch_isa_flags.bitfield.cpusse = 1; - cpu_arch_isa_flags.bitfield.cpusse2 = 1; - cpu_arch_isa_flags.bitfield.cpulm = 1; - } - if (cpu_flags_all_zero (&cpu_arch_tune_flags)) - { - cpu_arch_tune_flags.bitfield.cpui186 = 1; - cpu_arch_tune_flags.bitfield.cpui286 = 1; - cpu_arch_tune_flags.bitfield.cpui386 = 1; - cpu_arch_tune_flags.bitfield.cpui486 = 1; - cpu_arch_tune_flags.bitfield.cpui586 = 1; - cpu_arch_tune_flags.bitfield.cpui686 = 1; - cpu_arch_tune_flags.bitfield.cpuclflush = 1; - cpu_arch_tune_flags.bitfield.cpummx= 1; - cpu_arch_tune_flags.bitfield.cpusse = 1; - cpu_arch_tune_flags.bitfield.cpusse2 = 1; - } - } + update_code_flag (CODE_64BIT, 1); else if (!strcmp (default_arch, "i386")) - { - set_code_flag (CODE_32BIT); - if (cpu_flags_all_zero (&cpu_arch_isa_flags)) - { - cpu_arch_isa_flags.bitfield.cpui186 = 1; - cpu_arch_isa_flags.bitfield.cpui286 = 1; - cpu_arch_isa_flags.bitfield.cpui386 = 1; - } - if (cpu_flags_all_zero (&cpu_arch_tune_flags)) - { - cpu_arch_tune_flags.bitfield.cpui186 = 1; - cpu_arch_tune_flags.bitfield.cpui286 = 1; - cpu_arch_tune_flags.bitfield.cpui386 = 1; - } - } + update_code_flag (CODE_32BIT, 1); else as_fatal (_("Unknown architecture")); + + if (cpu_flags_all_zero (&cpu_arch_isa_flags)) + cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags; + if (cpu_flags_all_zero (&cpu_arch_tune_flags)) + cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags; + switch (OUTPUT_FLAVOR) { #if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT) @@ -8943,10 +8949,10 @@ x86_64_section_letter (int letter, char **ptr_msg) if (letter == 'l') return SHF_X86_64_LARGE; - *ptr_msg = _("Bad .section directive: want a,l,w,x,M,S,G,T in string"); + *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string"); } else - *ptr_msg = _("Bad .section directive: want a,w,x,M,S,G,T in string"); + *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string"); return -1; }