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:
H. Peter Anvin 2025-09-19 12:28:07 -07:00
parent f0efb28d98
commit 9aecb094a8
2 changed files with 22 additions and 40 deletions

View file

@ -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

View file

@ -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]));