summaryrefslogtreecommitdiff
path: root/gas/config/tc-i386-intel.c
diff options
context:
space:
mode:
Diffstat (limited to 'gas/config/tc-i386-intel.c')
-rw-r--r--gas/config/tc-i386-intel.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c
index 9080861834..3f6b057613 100644
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -63,6 +63,8 @@ intel_state;
#define O_xmmword_ptr O_md21
/* ymmword ptr X_add_symbol */
#define O_ymmword_ptr O_md20
+/* zmmword ptr X_add_symbol */
+#define O_zmmword_ptr O_md19
static struct
{
@@ -108,6 +110,7 @@ const i386_types[] =
I386_TYPE(oword, 16),
I386_TYPE(xmmword, 16),
I386_TYPE(ymmword, 32),
+ I386_TYPE(zmmword, 64),
#undef I386_TYPE
{ "near", O_near_ptr, { 0xff04, 0xff02, 0xff08 } },
{ "far", O_far_ptr, { 0xff06, 0xff05, 0xff06 } },
@@ -280,7 +283,8 @@ i386_intel_simplify_register (expressionS *e)
}
else if (!intel_state.index
&& (i386_regtab[reg_num].reg_type.bitfield.regxmm
- || i386_regtab[reg_num].reg_type.bitfield.regymm))
+ || i386_regtab[reg_num].reg_type.bitfield.regymm
+ || i386_regtab[reg_num].reg_type.bitfield.regzmm))
intel_state.index = i386_regtab + reg_num;
else if (!intel_state.base && !intel_state.in_scale)
intel_state.base = i386_regtab + reg_num;
@@ -371,6 +375,7 @@ static int i386_intel_simplify (expressionS *e)
case O_oword_ptr:
case O_xmmword_ptr:
case O_ymmword_ptr:
+ case O_zmmword_ptr:
case O_near_ptr:
case O_far_ptr:
if (intel_state.op_modifier == O_absent)
@@ -529,6 +534,10 @@ i386_intel_operand (char *operand_string, int got_a_float)
char suffix = 0;
int ret;
+ /* Handle vector immediates. */
+ if (RC_SAE_immediate (operand_string))
+ return 1;
+
/* Initialize state structure. */
intel_state.op_modifier = O_absent;
intel_state.is_mem = 0;
@@ -552,6 +561,17 @@ i386_intel_operand (char *operand_string, int got_a_float)
intel_syntax = 1;
SKIP_WHITESPACE ();
+
+ /* Handle vector operations. */
+ if (*input_line_pointer == '{')
+ {
+ char *end = check_VecOperations (input_line_pointer, NULL);
+ if (end)
+ input_line_pointer = end;
+ else
+ ret = 0;
+ }
+
if (!is_end_of_line[(unsigned char) *input_line_pointer])
{
as_bad (_("junk `%s' after expression"), input_line_pointer);
@@ -666,6 +686,11 @@ i386_intel_operand (char *operand_string, int got_a_float)
suffix = YMMWORD_MNEM_SUFFIX;
break;
+ case O_zmmword_ptr:
+ i.types[this_operand].bitfield.zmmword = 1;
+ suffix = ZMMWORD_MNEM_SUFFIX;
+ break;
+
case O_far_ptr:
suffix = LONG_DOUBLE_MNEM_SUFFIX;
/* FALLTHROUGH */