aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/utils/beam_makeops
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2017-08-23 12:46:42 +0200
committerBjörn Gustavsson <[email protected]>2017-08-23 12:46:42 +0200
commiteb8ffa6a071c3fe532389ba1907fc89aa9ea15eb (patch)
treec054d1717badc9fabecb66b238d3384d5decb069 /erts/emulator/utils/beam_makeops
parent5bf73db9fd77bce195b7e78a8754730263068fb1 (diff)
downloadotp-eb8ffa6a071c3fe532389ba1907fc89aa9ea15eb.tar.gz
otp-eb8ffa6a071c3fe532389ba1907fc89aa9ea15eb.tar.bz2
otp-eb8ffa6a071c3fe532389ba1907fc89aa9ea15eb.zip
Eliminate the beam_instrs.h file
The beam_instrs.h file serves no useful purpose. Put the instructions in beam_hot.h instead.
Diffstat (limited to 'erts/emulator/utils/beam_makeops')
-rwxr-xr-xerts/emulator/utils/beam_makeops59
1 files changed, 21 insertions, 38 deletions
diff --git a/erts/emulator/utils/beam_makeops b/erts/emulator/utils/beam_makeops
index ee8b12681f..c12073d943 100755
--- a/erts/emulator/utils/beam_makeops
+++ b/erts/emulator/utils/beam_makeops
@@ -92,10 +92,9 @@ my %c_code_used; # Used or not.
# Definitions for instructions combined from micro instructions.
my %combined_instrs;
-my %combined_code; # Combined micro instructions.
-my %hot_code;
-my %cold_code;
+my @generated_code; # Generated code.
+my %sort_order;
my @unnumbered_generic;
my %unnumbered;
@@ -384,7 +383,7 @@ while (<>) {
# micro instructions.
#
if (/^(\w+)\s*:=\s*([\w.]+)\s*;\s*$/) {
- $combined_instrs{$1} = ["$ARGV($.)","beam_instrs.h",$2];
+ $combined_instrs{$1} = ["$ARGV($.)",$2];
next;
}
@@ -586,11 +585,8 @@ sub emulator_output {
# Save the generated $code for later.
#
if (defined $code) {
- if ($hot) {
- push(@{$hot_code{$code}}, $instr);
- } else {
- push(@{$cold_code{$code}}, $instr);
- }
+ $code = "OpCase($instr):\n$code";
+ push @generated_code, [$hot,$code,($instr)];
}
#
@@ -805,19 +801,12 @@ sub emulator_output {
$name = "$outdir/beam_hot.h";
open(STDOUT, ">$name") || die "Failed to open $name for writing: $!\n";
comment('C');
- print_code(\%hot_code);
+ print_code(1);
$name = "$outdir/beam_cold.h";
open(STDOUT, ">$name") || die "Failed to open $name for writing: $!\n";
comment('C');
- print_code(\%cold_code);
-
- foreach my $key (keys %combined_code) {
- my $name = "$outdir/$key";
- open(STDOUT, ">$name") || die "Failed to open $name for writing: $!\n";
- comment('C');
- print_indented_code(@{$combined_code{$key}});
- }
+ print_code(0);
}
sub init_item {
@@ -845,19 +834,14 @@ sub q {
}
sub print_code {
- my($ref) = @_;
- my(%sorted);
- my($key, $label); # Loop variables.
-
- foreach $key (keys %$ref) {
- my($sort_key);
- my($code) = '';
- foreach $label (@{$ref->{$key}}) {
- $code .= "OpCase($label):\n";
- $sort_key = $label;
- }
- $code .= "$key\n";
- $sorted{$sort_key} = $code;
+ my($include_hot) = @_;
+ my %sorted;
+
+ foreach my $ref (@generated_code) {
+ my($hot,$code,@labels) = @$ref;
+ next unless $hot == $include_hot;
+ my($sort_key) = @labels; # Use the first label as sort key.
+ $sorted{$sort_key} = $code;
}
foreach (sort keys %sorted) {
@@ -1034,12 +1018,11 @@ sub comment {
#
sub combine_micro_instructions {
my %groups;
- my %group_file;
# Sanity check, normalize micro instructions.
foreach my $instr (keys %combined_instrs) {
my $ref = $combined_instrs{$instr};
- my($def_loc,$outfile,$def) = @$ref;
+ my($def_loc,$def) = @$ref;
my($group,@subs) = split /[.]/, $def;
my $arity = 0;
@subs = map { "$group.$_" } @subs;
@@ -1052,14 +1035,12 @@ sub combine_micro_instructions {
$arity += scalar(@c_args);
}
push @{$groups{$group}}, [$instr,$arity,@subs];
- $group_file{$group} = $outfile;
}
# Now generate code for each group.
foreach my $group (sort keys %groups) {
- my $code = combine_instruction_group($group, @{$groups{$group}});
- my $outfile = $group_file{$group};
- push @{$combined_code{$outfile}}, $code;
+ my($code,@labels) = combine_instruction_group($group, @{$groups{$group}});
+ push @generated_code, [1,$code,@labels];
}
}
@@ -1151,6 +1132,7 @@ sub combine_instruction_group {
# Now generate the code for the entire group.
my $offset = 0;
+ my @opcase_labels;
for(my $i = 0; $i < @slots; $i++) {
my $key = $slots[$i];
@@ -1174,6 +1156,7 @@ sub combine_instruction_group {
if ($opcase ne '') {
$gcode .= "OpCase($opcase):\n";
+ push @opcase_labels, $opcase;
}
if ($num_references{$label}) {
$gcode .= "$label:\n";
@@ -1199,7 +1182,7 @@ sub combine_instruction_group {
$offset = $order_to_offset{$slots[$i+1]} if $i < $#slots;
}
- "{\n$gcode\n}\n\n";
+ ("{\n$gcode\n}\n\n",@opcase_labels);
}
sub micro_label {