2008-12-31 Ulrich Drepper <drepper@redhat.com>
+ * i386_disasm.c (i386_disasm): Minor optimizations.
+
+ * i386_parse.y (instrtable_out): No need to emit index, the reader can
+ keep track.
+ * i386_disasm.c (i386_disasm): The index is not emitted anymore, no
+ need to skip it.
+
* i386_disasm.c (amd3dnow): Mark as const.
* defs/i386: Add blendvpd and blendvps opcodes.
bufcnt = 0;
size_t cnt = 0;
+ next_match:
while (curr < match_end)
{
- const uint8_t *start = curr;
-
uint_fast8_t len = *curr++;
+ const uint8_t *start = curr;
assert (len > 0);
- assert (curr + 2 * len + 2 <= match_end);
+ assert (curr + 2 * len <= match_end);
const uint8_t *codep = data;
- size_t avail = len;
int correct_prefix = 0;
int opoff = 0;
{
/* We match a prefix byte. This is exactly one byte and
is matched exactly, without a mask. */
- --avail;
-
--len;
start += 2;
opoff = 8;
correct_prefix = last_prefix_bit;
}
+ size_t avail = len;
while (avail > 0)
{
uint_fast8_t masked = *codep++ & *curr++;
if (masked != *curr++)
- break;
+ {
+ not:
+ curr = start + 2 * len;
+ ++cnt;
+ goto next_match;
+ }
--avail;
if (codep == end && avail > 0)
goto do_ret;
}
- if (avail != 0)
- {
- not:
- curr = start + 1 + 2 * len + 2;
- ++cnt;
- continue;
- }
-
if (len > end - data)
/* There is not enough data for the entire instruction. The
caller can figure this out by looking at the pointer into
b = b->next;
}
- fprintf (outfile, " %#zx, %#zx,\n", cnt & 0xff, cnt >> 8);
+ fputc_unlocked ('\n', outfile);
}
fputs ("};\n", outfile);
}