mirror of
https://github.com/netwide-assembler/nasm
synced 2026-08-26 16:23:04 -04:00
insns.dat: use explict macro flags for arithmetic flags
Instead of do more ad hoc hacks in preinsns.pl, add explicit macro flags for the arithmetic instructions. This also allows folding CMP back into the standard arithmetic instructions. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
This commit is contained in:
parent
f0efb28d98
commit
9aecb094a8
2 changed files with 22 additions and 40 deletions
|
|
@ -97,8 +97,13 @@ $bwdq MOVRS reg#,mem# [rm: evex.nf0.nd0.l0.m4.o# 8a# /r] FUTURE,SM
|
|||
$wdq LEA reg#,mem [rm: o# 8d /r] 8086
|
||||
$wdq LEA reg#,imm# [rm: o# 8d /r] 8086,ND
|
||||
|
||||
;# The basic 7 arithmetic operations
|
||||
$arith ADD OR ADC SBB AND SUB XOR
|
||||
;# The basic 8 arithmetic operations
|
||||
$arith nf=nf ADD OR nf=,ADC nf=,SBB AND SUB XOR nf=,!evex,CMP
|
||||
|
||||
;# Bitwise testing
|
||||
$bwdq TEST rm#,reg# [mr: o# 84# /r ] 8086,SM
|
||||
$bwdq TEST ax#,imm# [-i: o# a8# i# ] 8086,SM,NOAPX
|
||||
$bwdq TEST rm#,imm# [mi: o# f6# /0 i# ] 8086,SM
|
||||
|
||||
;# The basic shift and rotate operations
|
||||
$shift ROL ROR RCL RCR SHL,SAL SHR - SAR
|
||||
|
|
@ -964,17 +969,6 @@ FWAIT void [ wait] 8086
|
|||
XLATB void [ d7] 8086
|
||||
XLAT void [ d7] 8086,ND
|
||||
|
||||
;# Comparing and testing
|
||||
$bwdq CMP rm#,reg# [mr: o# 38# /r ] 8086,SM
|
||||
$bwdq CMP reg#,rm# [rm: o# 3a# /r ] 8086,SM
|
||||
$wdq CMP rm#,sbyte# [mi: o# 83 /7 ib,s ] 8086,SM
|
||||
$bwdq CMP ax#,imm# [mi: o# 3c# i# ] 8086,SM
|
||||
$bwdq CMP rm#,imm# [mi: o# 80# /7 i# ] 8086,SM
|
||||
|
||||
$bwdq TEST rm#,reg# [mr: o# 84# /r ] 8086,SM
|
||||
$bwdq TEST ax#,imm# [-i: o# a8# i# ] 8086,SM,NOAPX
|
||||
$bwdq TEST rm#,imm# [mi: o# f6# /0 i# ] 8086,SM
|
||||
|
||||
$bwdq CCMPscc spec4,rm#,reg# [vmr: evex.scc.dfv.l0.m4.o# 38# /r ] APX,SM1-2
|
||||
$bwdq CCMPscc spec4,reg#,rm# [vrm: evex.scc.dfv.l0.m4.o# 3a# /r ] APX,SM1-2
|
||||
$wdq CCMPscc spec4,rm#,sbyte# [vmi: evex.scc.dfv.l0.m4.o# 83 /7 ib,s ] APX,SM1-2
|
||||
|
|
|
|||
|
|
@ -22,15 +22,15 @@ our($macro, $outfile, $infile, $line); # Public for error messages
|
|||
$macros{'arith'} = {
|
||||
'def' => *def_eightfold,
|
||||
'txt' => <<'EOL'
|
||||
$$bwdq $op rm#,reg# [mr: $hle o# $00# /r ] 8086,SM,$lock
|
||||
$$bwdq $op reg#,rm# [rm: o# $02# /r ] 8086,SM
|
||||
$$wdq $op rm#,sbyte# [mi: $hle o# 83 /$n ib,s ] 8086,SM,$lock
|
||||
$$bwdq $op ax#,imm# [-i: o# $04# i# ] 8086,SM
|
||||
$$bwdq $op rm#,imm# [mi: $hle o# 80# /$n i# ] 8086,SM,$lock
|
||||
$$bwdq $op reg#?,reg#,rm# [vrm: evex.ndx.nf.l0.m4.o# $02# /r ] $apx,SM
|
||||
$$bwdq $op reg#?,rm#,reg# [vmr: evex.ndx.nf.l0.m4.o# $00# /r ] $apx,SM
|
||||
$$wdq $op reg#?,rm#,sbyte# [vmi: evex.ndx.nf.l0.m4.o# 83 /$n ib,s ] $apx,SM
|
||||
$$bwdq $op reg#?,rm#,imm# [vmi: evex.ndx.nf.l0.m4.o# 80# /$n i# ] $apx,SM
|
||||
$$bwdq $op rm#,reg# [mr: $hle o# $00# /r ] 8086,FL,SM,$lock
|
||||
$$bwdq $op reg#,rm# [rm: o# $02# /r ] 8086,FL,SM
|
||||
$$wdq $op rm#,sbyte# [mi: $hle o# 83 /$n ib,s ] 8086,FL,SM,$lock
|
||||
$$bwdq $op ax#,imm# [-i: o# $04# i# ] 8086,FL,SM
|
||||
$$bwdq $op rm#,imm# [mi: $hle o# 80# /$n i# ] 8086,FL,SM,$lock
|
||||
$$bwdq $op reg#?,reg#,rm# [vrm: evex.ndx.$nf.l0.m4.o# $02# /r ] $evex,FL,APX,SM
|
||||
$$bwdq $op reg#?,rm#,reg# [vmr: evex.ndx.$nf.l0.m4.o# $00# /r ] $evex,FL,APX,SM
|
||||
$$wdq $op reg#?,rm#,sbyte# [vmi: evex.ndx.$nf.l0.m4.o# 83 /$n ib,s ] $evex,FL,APX,SM
|
||||
$$bwdq $op reg#?,rm#,imm# [vmi: evex.ndx.$nf.l0.m4.o# 80# /$n i# ] $evex,FL,APX,SM
|
||||
EOL
|
||||
};
|
||||
|
||||
|
|
@ -38,12 +38,12 @@ EOL
|
|||
$macros{'shift'} = {
|
||||
'def' => *def_eightfold,
|
||||
'txt' => <<'EOL'
|
||||
$$bwdq $op rm#,unity [m-: o# d0# /$n] ] 8086
|
||||
$$bwdq $op rm#,reg_cl [m-: o# d2# /$n] ] 8086
|
||||
$$bwdq $op rm#,imm8 [mi: o# c0# /$n ib,u] ] 186
|
||||
$$bwdq $op reg#?,rm#,unity [vm-: evex.ndx.nf.l0.m4.o# d0# /$n ] $apx,SM0-1
|
||||
$$bwdq $op reg#?,rm#,reg_cl [vm-: evex.ndx.nf.l0.m4.o# d2# /$n ] $apx,SM0-1
|
||||
$$bwdq $op reg#?,rm#,imm8 [vmi: evex.ndx.nf.l0.m4.o# c0# /$n ib,u ] $apx,SM0-1
|
||||
$$bwdq $op rm#,unity [m-: o# d0# /$n] ] 8086,FL
|
||||
$$bwdq $op rm#,reg_cl [m-: o# d2# /$n] ] 8086,FL
|
||||
$$bwdq $op rm#,imm8 [mi: o# c0# /$n ib,u] ] 186,FL
|
||||
$$bwdq $op reg#?,rm#,unity [vm-: evex.ndx.nf.l0.m4.o# d0# /$n ] $apx,FL,SM0-1
|
||||
$$bwdq $op reg#?,rm#,reg_cl [vm-: evex.ndx.nf.l0.m4.o# d2# /$n ] $apx,FL,SM0-1
|
||||
$$bwdq $op reg#?,rm#,imm8 [vmi: evex.ndx.nf.l0.m4.o# c0# /$n ib,u ] $apx,FL,SM0-1
|
||||
EOL
|
||||
};
|
||||
|
||||
|
|
@ -441,8 +441,6 @@ umwait|ver[rw]|vtestp[ps]|xadd|xor|xtest|getsec|rsm|sbb|cmps[bwdq]|hint_.*)$';
|
|||
my $nozero = '^(jmp|call|bt|test|cmp|ud[012].*|ptwrite|tpause|u?monitor.*|u?mwait.*|incssp.*|\
|
||||
enqcmds?|senduipi|hint_.*|jmpe|nop|inv.*|push2?p?|vmwrite|clzero|clflush|clwb|lkgs)$';
|
||||
|
||||
my $nonf = '^(adc|sbb)$';
|
||||
|
||||
sub add_flag($@) {
|
||||
my $flags = shift(@_);
|
||||
|
||||
|
|
@ -459,15 +457,6 @@ sub has_flag($@) {
|
|||
return undef;
|
||||
}
|
||||
|
||||
sub adjust_fl_nf(@) {
|
||||
my($opcode, $operands, $encoding, $flags) = @_;
|
||||
|
||||
if ($opcode =~ /$nonf/io) {
|
||||
add_flag($flags, 'NF_N');
|
||||
}
|
||||
return $flags;
|
||||
}
|
||||
|
||||
sub adjust_fl_zu(@) {
|
||||
my($opcode, $operands, $encoding, $flags) = @_;
|
||||
|
||||
|
|
@ -500,7 +489,6 @@ sub adjust_instruction_flags(@) {
|
|||
my @i = @_;
|
||||
|
||||
$i[3] = adjust_fl_zu(@i);
|
||||
$i[3] = adjust_fl_nf(@i);
|
||||
|
||||
return undef unless (defined($i[3]));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue