diff options
author | Jin Kyu Song <jin.kyu.song@intel.com> | 2013-10-25 19:29:53 -0700 |
---|---|---|
committer | Jin Kyu Song <jin.kyu.song@intel.com> | 2013-11-20 11:29:42 -0800 |
commit | 945b1b8f36764a159e8890d27f80eef21bd29c14 (patch) | |
tree | 521f7a0005187682738cbc920be690db3b718b64 | |
parent | 267d0af79c7de8887ff1618e803cafa5a528a554 (diff) | |
download | nasm-945b1b8f36764a159e8890d27f80eef21bd29c14.tar.gz nasm-945b1b8f36764a159e8890d27f80eef21bd29c14.tar.bz2 nasm-945b1b8f36764a159e8890d27f80eef21bd29c14.zip |
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.c | 7 | ||||
-rw-r--r-- | nasm.h | 2 | ||||
-rw-r--r-- | parser.c | 2 | ||||
-rw-r--r-- | tokens.dat | 3 |
4 files changed, 14 insertions, 0 deletions
@@ -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; } } @@ -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 */ }; @@ -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; @@ -122,3 +122,6 @@ rz-sae % TOKEN_DECORATOR, 0, TFLAG_BRC, BRC_* sae z + +% TOKEN_PREFIX, 0, TFLAG_BRC, P_* +evex |