summaryrefslogtreecommitdiff
path: root/x86/insns-iflags.ph
diff options
context:
space:
mode:
authorH. Peter Anvin (Intel) <hpa@zytor.com>2019-08-09 02:41:37 -0700
committerH. Peter Anvin (Intel) <hpa@zytor.com>2019-08-09 02:41:37 -0700
commit602e67f93261fd61e73a3b37e25d9be68c6bbffe (patch)
tree89fcbba50612f22ef3b7c8186cfcb633c0ab5ef4 /x86/insns-iflags.ph
parent1c21a53e4ed03371df5d9f16359545862bb4820e (diff)
downloadnasm-602e67f93261fd61e73a3b37e25d9be68c6bbffe.tar.gz
insns.pl: use less cantankerous string expansion; better error info
The flags massaging in insns.pl could end up with things like double commas in some pathological cases, which would make insns_flag_index() very unhappy due to the appearance of an empty argument. Fix this by processing the flags as a list already in insns.pl. Be more explicit and consistent in error messages. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Diffstat (limited to 'x86/insns-iflags.ph')
-rw-r--r--x86/insns-iflags.ph20
1 files changed, 11 insertions, 9 deletions
diff --git a/x86/insns-iflags.ph b/x86/insns-iflags.ph
index 208c1eed..a539974b 100644
--- a/x86/insns-iflags.ph
+++ b/x86/insns-iflags.ph
@@ -80,10 +80,11 @@ my $iflag_words;
sub if_($$) {
my($name, $def) = @_;
- my $v = [$n_iflags++, $name, $def];
+ my $num = $n_iflags++;
+ my $v = [$num, $name, $def];
$flag_byname{$name} = $v;
- $flag_bynum[$v->[0]] = $v;
+ $flag_bynum[$num] = $v;
return 1;
}
@@ -122,24 +123,25 @@ sub insns_flag_index(@) {
my @prekey = sort(@_);
my $key = join(',', @prekey);
+ my $flag_index = $insns_flag_hash{$key};
- if (not defined($insns_flag_hash{$key})) {
+ unless (defined($flag_index)) {
my @newkey = (0) x $iflag_words;
- for my $i (@prekey) {
- die "No key for $i\n" if not defined($flag_byname{$i});
- $newkey[$flag_byname{$i}->[0] >> 5] |=
- (1 << ($flag_byname{$i}->[0] & 31));
+ foreach my $i (@prekey) {
+ my $flag = $flag_byname{$i};
+ die "No key for $i (in $key)\n" if not defined($flag);
+ $newkey[$flag->[0] >> 5] |= (1 << ($flag->[0] & 31));
}
my $str = join(',', map { sprintf("UINT32_C(0x%08x)",$_) } @newkey);
push @insns_flag_values, $str;
push @insns_flag_lists, $key;
- $insns_flag_hash{$key} = $#insns_flag_values;
+ $insns_flag_hash{$key} = $flag_index = $#insns_flag_values;
}
- return $insns_flag_hash{$key};
+ return $flag_index;
}
sub write_iflaggen_h() {