+2013-02-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config/tc-i386.c (_i386_insn): Add rep_prefix.
+ (md_assemble): Check if REP prefix is OK.
+ (parse_insn): Remove expecting_string_instruction. Set
+ i.rep_prefix.
+
2013-02-28 Yufeng Zhang <yufeng.zhang@arm.com>
* config/tc-aarch64.c (aarch64_features): Add the 'crc' option.
disp_encoding_32bit
} disp_encoding;
+ /* REP prefix. */
+ const char *rep_prefix;
+
/* Have HLE prefix. */
unsigned int have_hle;
if (!add_prefix (FWAIT_OPCODE))
return;
+ /* Check if REP prefix is OK. */
+ if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
+ {
+ as_bad (_("invalid instruction `%s' after `%s'"),
+ i.tm.name, i.rep_prefix);
+ return;
+ }
+
/* Check for lock without a lockable instruction. Destination operand
must be memory unless it is xchg (0x86). */
if (i.prefix[LOCK_PREFIX]
const insn_template *t;
char *dot_p = NULL;
- /* Non-zero if we found a prefix only acceptable with string insns. */
- const char *expecting_string_instruction = NULL;
-
while (1)
{
mnem_p = mnemonic;
if (current_templates->start->cpu_flags.bitfield.cpuhle)
i.have_hle = 1;
else
- expecting_string_instruction = current_templates->start->name;
+ i.rep_prefix = current_templates->start->name;
break;
default:
break;
as_warn (_("use .code16 to ensure correct addressing mode"));
}
- /* Check for rep/repne without a string (or other allowed) instruction. */
- if (expecting_string_instruction)
- {
- static templates override;
-
- for (t = current_templates->start; t < current_templates->end; ++t)
- if (t->opcode_modifier.repprefixok)
- break;
- if (t >= current_templates->end)
- {
- as_bad (_("expecting string instruction after `%s'"),
- expecting_string_instruction);
- return NULL;
- }
- for (override.start = t; t < current_templates->end; ++t)
- if (!t->opcode_modifier.repprefixok)
- break;
- override.end = t;
- current_templates = &override;
- }
-
return l;
}
+2013-02-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gas/i386/i386.exp: Run inval-rep and x86-64-inval-rep.
+
+ * gas/i386/inval-rep.l: New file.
+ * gas/i386/inval-rep.s: Likewise.
+ * gas/i386/x86-64-inval-rep.l: Likewise.
+ * gas/i386/x86-64-inval-rep.s: Likewise.
+
2013-02-28 Yufeng Zhang <yufeng.zhang@arm.com>
* gas/aarch64/crc32.s: New test.
run_dump_test "ssse3"
run_dump_test "rep"
run_dump_test "rep-suffix"
+ run_list_test "inval-rep" "-al"
run_dump_test "lock-1"
run_dump_test "lock-1-intel"
run_list_test "lockbad-1" "-al"
run_dump_test "x86-64-ssse3"
run_dump_test "x86-64-rep"
run_dump_test "x86-64-rep-suffix"
+ run_list_test "x86-64-inval-rep" "-al"
run_dump_test "x86-64-lock-1"
run_dump_test "x86-64-lock-1-intel"
run_list_test "x86-64-lockbad-1" "-al"
--- /dev/null
+.*: Assembler messages:
+.*:2: Error: .*
+.*:3: Error: .*
+.*:4: Error: .*
+.*:5: Error: .*
+.*:6: Error: .*
+GAS LISTING .*
+
+
+[ ]*1[ ]+\.text
+[ ]*2[ ]+rep add %ebx, %eax
+[ ]*3[ ]+repe add %ebx, %eax
+[ ]*4[ ]+repz add %ebx, %eax
+[ ]*5[ ]+repne add %ebx, %eax
+[ ]*6[ ]+repnz add %ebx, %eax
--- /dev/null
+ .text
+ rep add %ebx, %eax
+ repe add %ebx, %eax
+ repz add %ebx, %eax
+ repne add %ebx, %eax
+ repnz add %ebx, %eax
--- /dev/null
+.*: Assembler messages:
+.*:2: Error: .*
+.*:3: Error: .*
+.*:4: Error: .*
+.*:5: Error: .*
+.*:6: Error: .*
+GAS LISTING .*
+
+
+[ ]*1[ ]+\.text
+[ ]*2[ ]+rep add %rbx, %rax
+[ ]*3[ ]+repe add %rbx, %rax
+[ ]*4[ ]+repz add %rbx, %rax
+[ ]*5[ ]+repne add %rbx, %rax
+[ ]*6[ ]+repnz add %rbx, %rax
--- /dev/null
+ .text
+ rep add %rbx, %rax
+ repe add %rbx, %rax
+ repz add %rbx, %rax
+ repne add %rbx, %rax
+ repnz add %rbx, %rax