summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJin Kyu Song <jin.kyu.song@intel.com>2013-10-25 19:29:53 -0700
committerJin Kyu Song <jin.kyu.song@intel.com>2013-11-20 11:29:42 -0800
commit945b1b8f36764a159e8890d27f80eef21bd29c14 (patch)
tree521f7a0005187682738cbc920be690db3b718b64
parent267d0af79c7de8887ff1618e803cafa5a528a554 (diff)
downloadnasm-945b1b8f36764a159e8890d27f80eef21bd29c14.tar.gz
AVX-512: Add {evex} instruction prefix
For instructions that can be encoded either in VEX or EVEX, {evex} forces nasm to encode in EVEX. Signed-off-by: Jin Kyu Song <jin.kyu.song@intel.com>
-rw-r--r--assemble.c7
-rw-r--r--nasm.h2
-rw-r--r--parser.c2
-rw-r--r--tokens.dat3
4 files changed, 14 insertions, 0 deletions
diff --git a/assemble.c b/assemble.c
index e2e24c3b..100d131a 100644
--- a/assemble.c
+++ b/assemble.c
@@ -632,6 +632,9 @@ int64_t assemble(int32_t segment, int64_t offset, int bits, iflags_t cp,
case P_OSP:
c = 0x66;
break;
+ case P_EVEX:
+ /* EVEX */
+ break;
case P_none:
break;
default:
@@ -786,6 +789,7 @@ int64_t insn_size(int32_t segment, int64_t offset, int bits, iflags_t cp,
break;
case P_A64:
case P_O64:
+ case P_EVEX:
case P_none:
break;
default:
@@ -2186,6 +2190,9 @@ static enum match_result matches(const struct itemplate *itemp,
nasm_regvals[instruction->oprs[i].basereg] >= 16 &&
!(itemp->flags & IF_AVX512)) {
return MERR_ENCMISMATCH;
+ } else if (instruction->prefixes[PPS_EVEX] &&
+ !(itemp->flags & IF_AVX512)) {
+ return MERR_ENCMISMATCH;
}
}
diff --git a/nasm.h b/nasm.h
index 5ca2aa58..34adc69b 100644
--- a/nasm.h
+++ b/nasm.h
@@ -553,6 +553,7 @@ enum prefixes { /* instruction prefixes */
P_XACQUIRE,
P_XRELEASE,
P_BND,
+ P_EVEX,
PREFIX_ENUM_LIMIT
};
@@ -635,6 +636,7 @@ enum prefix_pos {
PPS_SEG, /* Segment override prefix */
PPS_OSIZE, /* Operand size prefix */
PPS_ASIZE, /* Address size prefix */
+ PPS_EVEX, /* EVEX prefix */
MAXPREFIX /* Total number of prefix slots */
};
diff --git a/parser.c b/parser.c
index e61d0a6f..700b4fc4 100644
--- a/parser.c
+++ b/parser.c
@@ -101,6 +101,8 @@ static int prefix_slot(int prefix)
case P_A64:
case P_ASP:
return PPS_ASIZE;
+ case P_EVEX:
+ return PPS_EVEX;
default:
nasm_error(ERR_PANIC, "Invalid value %d passed to prefix_slot()", prefix);
return -1;
diff --git a/tokens.dat b/tokens.dat
index 211eb099..284cf30a 100644
--- a/tokens.dat
+++ b/tokens.dat
@@ -122,3 +122,6 @@ rz-sae
% TOKEN_DECORATOR, 0, TFLAG_BRC, BRC_*
sae
z
+
+% TOKEN_PREFIX, 0, TFLAG_BRC, P_*
+evex