mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-09-22 10:43:39 -04:00
Fix control/debug register patterns
The control and debug registers are always using the default operand size. It is probably easiest to just encode it explicitly for now. Control registers are particularly weird because of the AMD "lock as REX.R" hack... Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
This commit is contained in:
@@ -2343,7 +2343,7 @@ static inline void emit_rex(struct out_data *data, insn *ins)
|
||||
} else if (rex & REX_P) {
|
||||
buf[n++] = rex;
|
||||
} else {
|
||||
nasm_assert(!rex);
|
||||
nasm_assert(!(rex & ~REX_L));
|
||||
}
|
||||
|
||||
if (ins->vex_cm) {
|
||||
|
@@ -469,10 +469,14 @@ $dq RDPID reg# [m: f3 !osp o# 0f c7 /7] RDPID
|
||||
SMSW reg64 [m: o64nw 0f 01 /4] X86_64,LONG,ND
|
||||
$wdq SMSW reg# [m: o# 0f 01 /4] 286
|
||||
|
||||
$dq MOV reg#,reg_creg [mr: nw w# rex.l 0f 20 /r] 386,PRIV
|
||||
$dq MOV reg_creg,reg# [rm: nw w# rex.l 0f 22 /r] 386,PRIV
|
||||
$dq MOV reg#,reg_dreg [mr: nw w# 0f 21 /r] 386,PRIV
|
||||
$dq MOV reg_dreg,reg# [rm: nw w# 0f 23 /r] 386,PRIV,NOLONG
|
||||
MOV reg32,reg_creg [mr: rex.l 0f 20 /r] 386,NOLONG,PRIV
|
||||
MOV reg_creg,reg32 [rm: rex.l 0f 22 /r] 386,NOLONG,PRIV
|
||||
MOV reg64,reg_creg [mr: o64nw 0f 20 /r] X86_64,LONG,PRIV
|
||||
MOV reg_creg,reg64 [rm: o64nw 0f 22 /r] X86_64,LONG,PRIV
|
||||
MOV reg32,reg_dreg [mr: 0f 21 /r] 386,NOLONG,PRIV
|
||||
MOV reg_dreg,reg32 [rm: 0f 23 /r] 386,NOLONG,PRIV
|
||||
MOV reg64,reg_dreg [mr: o64nw 0f 21 /r] X86_64,LONG,PRIV
|
||||
MOV reg_dreg,reg64 [rm: o64nw 0f 23 /r] X86_64,LONG,PRIV
|
||||
MOV reg32,reg_treg [mr: 0f 24 /r] 386,NOLONG,ND,OBSOLETE
|
||||
MOV reg_treg,reg32 [rm: 0f 26 /r] 386,NOLONG,ND,OBSOLETE
|
||||
|
||||
|
@@ -204,7 +204,9 @@ sub func_multisize($$$) {
|
||||
$o .= ',NOLONG' if ($long & 2);
|
||||
$o .= ',ND' if ($nd);
|
||||
|
||||
$o .= ',386' if ($s >= 32 && $o !~ /\B\!386\b/);
|
||||
if ($s >= 32 && $o !~ /\B\!386\b/ && $o =~ /\b(8086|[12]86)\b/) {
|
||||
$o .= ',386';
|
||||
}
|
||||
|
||||
push(@ol, $o);
|
||||
}
|
||||
@@ -499,10 +501,9 @@ sub adjust_instruction_flags(@) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
if ($i[2] =~ /\ba16\b/) {
|
||||
if ($i[2] =~ /\b(a16|rex\.l)\b/) {
|
||||
add_flag($i[3], 'NOLONG');
|
||||
}
|
||||
if ($i[2] =~ /\b(o64(nw)?\b|rex2?|a64\b)/) {
|
||||
} elsif ($i[2] =~ /\b(o64(nw)?\b|rex2?|a64\b)/) {
|
||||
add_flag($i[3], 'LONG');
|
||||
}
|
||||
if (has_flag($i[3], 'NOLONG') && has_flag($i[3], 'LONG')) {
|
||||
|
Reference in New Issue
Block a user