1233d2500723e5594f3e7c70896ffeeef32b9c950ywan#!/usr/bin/env perl
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan
3233d2500723e5594f3e7c70896ffeeef32b9c950ywanno strict 'refs';
4233d2500723e5594f3e7c70896ffeeef32b9c950ywanuse warnings;
5233d2500723e5594f3e7c70896ffeeef32b9c950ywanuse Getopt::Long;
6233d2500723e5594f3e7c70896ffeeef32b9c950ywanGetopt::Long::Configure("auto_help");
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan
8233d2500723e5594f3e7c70896ffeeef32b9c950ywanmy %ALL_FUNCS = ();
9233d2500723e5594f3e7c70896ffeeef32b9c950ywanmy @ALL_ARCHS;
10233d2500723e5594f3e7c70896ffeeef32b9c950ywanmy @ALL_FORWARD_DECLS;
11233d2500723e5594f3e7c70896ffeeef32b9c950ywanmy @REQUIRES;
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan
13233d2500723e5594f3e7c70896ffeeef32b9c950ywanmy %opts = ();
14233d2500723e5594f3e7c70896ffeeef32b9c950ywanmy %disabled = ();
15233d2500723e5594f3e7c70896ffeeef32b9c950ywanmy %required = ();
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17233d2500723e5594f3e7c70896ffeeef32b9c950ywanmy @argv;
18233d2500723e5594f3e7c70896ffeeef32b9c950ywanforeach (@ARGV) {
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan  $disabled{$1} = 1, next if /--disable-(.*)/;
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan  $required{$1} = 1, next if /--require-(.*)/;
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan  push @argv, $_;
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan# NB: use GetOptions() instead of GetOptionsFromArray() for compatibility.
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan@ARGV = @argv;
26233d2500723e5594f3e7c70896ffeeef32b9c950ywanGetOptions(
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan  \%opts,
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan  'arch=s',
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan  'sym=s',
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan  'config=s',
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan);
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan
33233d2500723e5594f3e7c70896ffeeef32b9c950ywanforeach my $opt (qw/arch config/) {
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (!defined($opts{$opt})) {
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan    warn "--$opt is required!\n";
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Getopt::Long::HelpMessage('-exit' => 1);
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan
40233d2500723e5594f3e7c70896ffeeef32b9c950ywanforeach my $defs_file (@ARGV) {
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (!-f $defs_file) {
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan    warn "$defs_file: $!\n";
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Getopt::Long::HelpMessage('-exit' => 1);
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan
47233d2500723e5594f3e7c70896ffeeef32b9c950ywanopen CONFIG_FILE, $opts{config} or
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan  die "Error opening config file '$opts{config}': $!\n";
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan
50233d2500723e5594f3e7c70896ffeeef32b9c950ywanmy %config = ();
51233d2500723e5594f3e7c70896ffeeef32b9c950ywanwhile (<CONFIG_FILE>) {
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan  next if !/^CONFIG_/;
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan  chomp;
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan  my @pair = split /=/;
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan  $config{$pair[0]} = $pair[1];
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
57233d2500723e5594f3e7c70896ffeeef32b9c950ywanclose CONFIG_FILE;
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan#
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan# Routines for the RTCD DSL to call
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan#
62233d2500723e5594f3e7c70896ffeeef32b9c950ywansub vpx_config($) {
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return (defined $config{$_[0]}) ? $config{$_[0]} : "";
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan
66233d2500723e5594f3e7c70896ffeeef32b9c950ywansub specialize {
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan  my $fn=$_[0];
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan  shift;
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan  foreach my $opt (@_) {
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan    eval "\$${fn}_${opt}=${fn}_${opt}";
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan
74233d2500723e5594f3e7c70896ffeeef32b9c950ywansub add_proto {
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan  my $fn = splice(@_, -2, 1);
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan  $ALL_FUNCS{$fn} = \@_;
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan  specialize $fn, "c";
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan
80233d2500723e5594f3e7c70896ffeeef32b9c950ywansub require {
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan  foreach my $fn (keys %ALL_FUNCS) {
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan    foreach my $opt (@_) {
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan      my $ofn = eval "\$${fn}_${opt}";
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan      next if !$ofn;
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan      # if we already have a default, then we can disable it, as we know
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan      # we can do better.
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan      my $best = eval "\$${fn}_default";
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if ($best) {
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan        my $best_ofn = eval "\$${best}";
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if ($best_ofn && "$best_ofn" ne "$ofn") {
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan          eval "\$${best}_link = 'false'";
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan      eval "\$${fn}_default=${fn}_${opt}";
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan      eval "\$${fn}_${opt}_link='true'";
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan
101233d2500723e5594f3e7c70896ffeeef32b9c950ywansub forward_decls {
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan  push @ALL_FORWARD_DECLS, @_;
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan#
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan# Include the user's directives
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan#
108233d2500723e5594f3e7c70896ffeeef32b9c950ywanforeach my $f (@ARGV) {
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan  open FILE, "<", $f or die "cannot open $f: $!\n";
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  my $contents = join('', <FILE>);
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan  close FILE;
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan  eval $contents or warn "eval failed: $@\n";
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan#
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan# Process the directives according to the command line
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan#
118233d2500723e5594f3e7c70896ffeeef32b9c950ywansub process_forward_decls() {
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan  foreach (@ALL_FORWARD_DECLS) {
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan    $_->();
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan
124233d2500723e5594f3e7c70896ffeeef32b9c950ywansub determine_indirection {
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vpx_config("CONFIG_RUNTIME_CPU_DETECT") eq "yes" or &require(@ALL_ARCHS);
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan  foreach my $fn (keys %ALL_FUNCS) {
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $n = "";
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my @val = @{$ALL_FUNCS{$fn}};
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $args = pop @val;
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $rtyp = "@val";
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $dfn = eval "\$${fn}_default";
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan    $dfn = eval "\$${dfn}";
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan    foreach my $opt (@_) {
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan      my $ofn = eval "\$${fn}_${opt}";
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan      next if !$ofn;
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan      my $link = eval "\$${fn}_${opt}_link";
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan      next if $link && $link eq "false";
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan      $n .= "x";
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if ($n eq "x") {
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan      eval "\$${fn}_indirect = 'false'";
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan      eval "\$${fn}_indirect = 'true'";
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan
148233d2500723e5594f3e7c70896ffeeef32b9c950ywansub declare_function_pointers {
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan  foreach my $fn (sort keys %ALL_FUNCS) {
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my @val = @{$ALL_FUNCS{$fn}};
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $args = pop @val;
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $rtyp = "@val";
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $dfn = eval "\$${fn}_default";
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan    $dfn = eval "\$${dfn}";
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    foreach my $opt (@_) {
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan      my $ofn = eval "\$${fn}_${opt}";
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan      next if !$ofn;
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan      print "$rtyp ${ofn}($args);\n";
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (eval "\$${fn}_indirect" eq "false") {
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan      print "#define ${fn} ${dfn}\n";
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan      print "RTCD_EXTERN $rtyp (*${fn})($args);\n";
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan    print "\n";
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan
169233d2500723e5594f3e7c70896ffeeef32b9c950ywansub set_function_pointers {
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan  foreach my $fn (sort keys %ALL_FUNCS) {
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my @val = @{$ALL_FUNCS{$fn}};
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $args = pop @val;
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $rtyp = "@val";
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $dfn = eval "\$${fn}_default";
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    $dfn = eval "\$${dfn}";
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (eval "\$${fn}_indirect" eq "true") {
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan      print "    $fn = $dfn;\n";
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan      foreach my $opt (@_) {
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan        my $ofn = eval "\$${fn}_${opt}";
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan        next if !$ofn;
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan        next if "$ofn" eq "$dfn";
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan        my $link = eval "\$${fn}_${opt}_link";
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan        next if $link && $link eq "false";
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan        my $cond = eval "\$have_${opt}";
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan        print "    if (${cond}) $fn = $ofn;\n"
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
187233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
189233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
190233d2500723e5594f3e7c70896ffeeef32b9c950ywan
191233d2500723e5594f3e7c70896ffeeef32b9c950ywansub filter {
192233d2500723e5594f3e7c70896ffeeef32b9c950ywan  my @filtered;
193233d2500723e5594f3e7c70896ffeeef32b9c950ywan  foreach (@_) { push @filtered, $_ unless $disabled{$_}; }
194233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return @filtered;
195233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
196233d2500723e5594f3e7c70896ffeeef32b9c950ywan
197233d2500723e5594f3e7c70896ffeeef32b9c950ywan#
198233d2500723e5594f3e7c70896ffeeef32b9c950ywan# Helper functions for generating the arch specific RTCD files
199233d2500723e5594f3e7c70896ffeeef32b9c950ywan#
200233d2500723e5594f3e7c70896ffeeef32b9c950ywansub common_top() {
201233d2500723e5594f3e7c70896ffeeef32b9c950ywan  my $include_guard = uc($opts{sym})."_H_";
202233d2500723e5594f3e7c70896ffeeef32b9c950ywan  print <<EOF;
203233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef ${include_guard}
204233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ${include_guard}
205233d2500723e5594f3e7c70896ffeeef32b9c950ywan
206233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef RTCD_C
207233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define RTCD_EXTERN
208233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
209233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define RTCD_EXTERN extern
210233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
211233d2500723e5594f3e7c70896ffeeef32b9c950ywan
212233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus
213233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" {
214233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
215233d2500723e5594f3e7c70896ffeeef32b9c950ywan
216233d2500723e5594f3e7c70896ffeeef32b9c950ywanEOF
217233d2500723e5594f3e7c70896ffeeef32b9c950ywan
218233d2500723e5594f3e7c70896ffeeef32b9c950ywanprocess_forward_decls();
219233d2500723e5594f3e7c70896ffeeef32b9c950ywanprint "\n";
220233d2500723e5594f3e7c70896ffeeef32b9c950ywandeclare_function_pointers("c", @ALL_ARCHS);
221233d2500723e5594f3e7c70896ffeeef32b9c950ywan
222233d2500723e5594f3e7c70896ffeeef32b9c950ywanprint <<EOF;
223233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid $opts{sym}(void);
224233d2500723e5594f3e7c70896ffeeef32b9c950ywan
225233d2500723e5594f3e7c70896ffeeef32b9c950ywanEOF
226233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
227233d2500723e5594f3e7c70896ffeeef32b9c950ywan
228233d2500723e5594f3e7c70896ffeeef32b9c950ywansub common_bottom() {
229233d2500723e5594f3e7c70896ffeeef32b9c950ywan  print <<EOF;
230233d2500723e5594f3e7c70896ffeeef32b9c950ywan
231233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus
232233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // extern "C"
233233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
234233d2500723e5594f3e7c70896ffeeef32b9c950ywan
235233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
236233d2500723e5594f3e7c70896ffeeef32b9c950ywanEOF
237233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
238233d2500723e5594f3e7c70896ffeeef32b9c950ywan
239233d2500723e5594f3e7c70896ffeeef32b9c950ywansub x86() {
240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  determine_indirection("c", @ALL_ARCHS);
241233d2500723e5594f3e7c70896ffeeef32b9c950ywan
242233d2500723e5594f3e7c70896ffeeef32b9c950ywan  # Assign the helper variable for each enabled extension
243233d2500723e5594f3e7c70896ffeeef32b9c950ywan  foreach my $opt (@ALL_ARCHS) {
244233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $opt_uc = uc $opt;
245233d2500723e5594f3e7c70896ffeeef32b9c950ywan    eval "\$have_${opt}=\"flags & HAS_${opt_uc}\"";
246233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
247233d2500723e5594f3e7c70896ffeeef32b9c950ywan
248233d2500723e5594f3e7c70896ffeeef32b9c950ywan  common_top;
249233d2500723e5594f3e7c70896ffeeef32b9c950ywan  print <<EOF;
250233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef RTCD_C
251233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_ports/x86.h"
252233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void setup_rtcd_internal(void)
253233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
254233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int flags = x86_simd_caps();
255233d2500723e5594f3e7c70896ffeeef32b9c950ywan
256233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (void)flags;
257233d2500723e5594f3e7c70896ffeeef32b9c950ywan
258233d2500723e5594f3e7c70896ffeeef32b9c950ywanEOF
259233d2500723e5594f3e7c70896ffeeef32b9c950ywan
260233d2500723e5594f3e7c70896ffeeef32b9c950ywan  set_function_pointers("c", @ALL_ARCHS);
261233d2500723e5594f3e7c70896ffeeef32b9c950ywan
262233d2500723e5594f3e7c70896ffeeef32b9c950ywan  print <<EOF;
263233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
264233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
265233d2500723e5594f3e7c70896ffeeef32b9c950ywanEOF
266233d2500723e5594f3e7c70896ffeeef32b9c950ywan  common_bottom;
267233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
268233d2500723e5594f3e7c70896ffeeef32b9c950ywan
269233d2500723e5594f3e7c70896ffeeef32b9c950ywansub arm() {
270233d2500723e5594f3e7c70896ffeeef32b9c950ywan  determine_indirection("c", @ALL_ARCHS);
271233d2500723e5594f3e7c70896ffeeef32b9c950ywan
272233d2500723e5594f3e7c70896ffeeef32b9c950ywan  # Assign the helper variable for each enabled extension
273233d2500723e5594f3e7c70896ffeeef32b9c950ywan  foreach my $opt (@ALL_ARCHS) {
274233d2500723e5594f3e7c70896ffeeef32b9c950ywan    my $opt_uc = uc $opt;
275233d2500723e5594f3e7c70896ffeeef32b9c950ywan    eval "\$have_${opt}=\"flags & HAS_${opt_uc}\"";
276233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
277233d2500723e5594f3e7c70896ffeeef32b9c950ywan
278233d2500723e5594f3e7c70896ffeeef32b9c950ywan  common_top;
279233d2500723e5594f3e7c70896ffeeef32b9c950ywan  print <<EOF;
280233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h"
281233d2500723e5594f3e7c70896ffeeef32b9c950ywan
282233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef RTCD_C
283233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_ports/arm.h"
284233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void setup_rtcd_internal(void)
285233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
286233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int flags = arm_cpu_caps();
287233d2500723e5594f3e7c70896ffeeef32b9c950ywan
288233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (void)flags;
289233d2500723e5594f3e7c70896ffeeef32b9c950ywan
290233d2500723e5594f3e7c70896ffeeef32b9c950ywanEOF
291233d2500723e5594f3e7c70896ffeeef32b9c950ywan
292233d2500723e5594f3e7c70896ffeeef32b9c950ywan  set_function_pointers("c", @ALL_ARCHS);
293233d2500723e5594f3e7c70896ffeeef32b9c950ywan
294233d2500723e5594f3e7c70896ffeeef32b9c950ywan  print <<EOF;
295233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
296233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
297233d2500723e5594f3e7c70896ffeeef32b9c950ywanEOF
298233d2500723e5594f3e7c70896ffeeef32b9c950ywan  common_bottom;
299233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
300233d2500723e5594f3e7c70896ffeeef32b9c950ywan
301233d2500723e5594f3e7c70896ffeeef32b9c950ywansub mips() {
302233d2500723e5594f3e7c70896ffeeef32b9c950ywan  determine_indirection("c", @ALL_ARCHS);
303233d2500723e5594f3e7c70896ffeeef32b9c950ywan  common_top;
304233d2500723e5594f3e7c70896ffeeef32b9c950ywan
305233d2500723e5594f3e7c70896ffeeef32b9c950ywan  print <<EOF;
306233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h"
307233d2500723e5594f3e7c70896ffeeef32b9c950ywan
308233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef RTCD_C
309233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void setup_rtcd_internal(void)
310233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
311233d2500723e5594f3e7c70896ffeeef32b9c950ywanEOF
312233d2500723e5594f3e7c70896ffeeef32b9c950ywan
313233d2500723e5594f3e7c70896ffeeef32b9c950ywan  set_function_pointers("c", @ALL_ARCHS);
314233d2500723e5594f3e7c70896ffeeef32b9c950ywan
315233d2500723e5594f3e7c70896ffeeef32b9c950ywan  print <<EOF;
316233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_DSPR2
317233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP8
318233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid dsputil_static_init();
319233d2500723e5594f3e7c70896ffeeef32b9c950ywandsputil_static_init();
320233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
321233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_VP9
322233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_dsputil_static_init();
323233d2500723e5594f3e7c70896ffeeef32b9c950ywanvp9_dsputil_static_init();
324233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
325233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
326233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
327233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
328233d2500723e5594f3e7c70896ffeeef32b9c950ywanEOF
329233d2500723e5594f3e7c70896ffeeef32b9c950ywan  common_bottom;
330233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
331233d2500723e5594f3e7c70896ffeeef32b9c950ywan
332233d2500723e5594f3e7c70896ffeeef32b9c950ywansub unoptimized() {
333233d2500723e5594f3e7c70896ffeeef32b9c950ywan  determine_indirection "c";
334233d2500723e5594f3e7c70896ffeeef32b9c950ywan  common_top;
335233d2500723e5594f3e7c70896ffeeef32b9c950ywan  print <<EOF;
336233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h"
337233d2500723e5594f3e7c70896ffeeef32b9c950ywan
338233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef RTCD_C
339233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void setup_rtcd_internal(void)
340233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
341233d2500723e5594f3e7c70896ffeeef32b9c950ywanEOF
342233d2500723e5594f3e7c70896ffeeef32b9c950ywan
343233d2500723e5594f3e7c70896ffeeef32b9c950ywan  set_function_pointers "c";
344233d2500723e5594f3e7c70896ffeeef32b9c950ywan
345233d2500723e5594f3e7c70896ffeeef32b9c950ywan  print <<EOF;
346233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
347233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
348233d2500723e5594f3e7c70896ffeeef32b9c950ywanEOF
349233d2500723e5594f3e7c70896ffeeef32b9c950ywan  common_bottom;
350233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
351233d2500723e5594f3e7c70896ffeeef32b9c950ywan
352233d2500723e5594f3e7c70896ffeeef32b9c950ywan#
353233d2500723e5594f3e7c70896ffeeef32b9c950ywan# Main Driver
354233d2500723e5594f3e7c70896ffeeef32b9c950ywan#
355233d2500723e5594f3e7c70896ffeeef32b9c950ywan
356233d2500723e5594f3e7c70896ffeeef32b9c950ywan&require("c");
357233d2500723e5594f3e7c70896ffeeef32b9c950ywanif ($opts{arch} eq 'x86') {
358233d2500723e5594f3e7c70896ffeeef32b9c950ywan  @ALL_ARCHS = filter(qw/mmx sse sse2 sse3 ssse3 sse4_1 avx avx2/);
359233d2500723e5594f3e7c70896ffeeef32b9c950ywan  x86;
360233d2500723e5594f3e7c70896ffeeef32b9c950ywan} elsif ($opts{arch} eq 'x86_64') {
361233d2500723e5594f3e7c70896ffeeef32b9c950ywan  @ALL_ARCHS = filter(qw/mmx sse sse2 sse3 ssse3 sse4_1 avx avx2/);
362233d2500723e5594f3e7c70896ffeeef32b9c950ywan  @REQUIRES = filter(keys %required ? keys %required : qw/mmx sse sse2/);
363233d2500723e5594f3e7c70896ffeeef32b9c950ywan  &require(@REQUIRES);
364233d2500723e5594f3e7c70896ffeeef32b9c950ywan  x86;
365233d2500723e5594f3e7c70896ffeeef32b9c950ywan} elsif ($opts{arch} eq 'mips32') {
366233d2500723e5594f3e7c70896ffeeef32b9c950ywan  @ALL_ARCHS = filter(qw/mips32/);
367233d2500723e5594f3e7c70896ffeeef32b9c950ywan  open CONFIG_FILE, $opts{config} or
368233d2500723e5594f3e7c70896ffeeef32b9c950ywan    die "Error opening config file '$opts{config}': $!\n";
369233d2500723e5594f3e7c70896ffeeef32b9c950ywan  while (<CONFIG_FILE>) {
370233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (/HAVE_DSPR2=yes/) {
371233d2500723e5594f3e7c70896ffeeef32b9c950ywan      @ALL_ARCHS = filter(qw/mips32 dspr2/);
372233d2500723e5594f3e7c70896ffeeef32b9c950ywan      last;
373233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
374233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
375233d2500723e5594f3e7c70896ffeeef32b9c950ywan  close CONFIG_FILE;
376233d2500723e5594f3e7c70896ffeeef32b9c950ywan  mips;
377233d2500723e5594f3e7c70896ffeeef32b9c950ywan} elsif ($opts{arch} eq 'armv5te') {
378233d2500723e5594f3e7c70896ffeeef32b9c950ywan  @ALL_ARCHS = filter(qw/edsp/);
379233d2500723e5594f3e7c70896ffeeef32b9c950ywan  arm;
380233d2500723e5594f3e7c70896ffeeef32b9c950ywan} elsif ($opts{arch} eq 'armv6') {
381233d2500723e5594f3e7c70896ffeeef32b9c950ywan  @ALL_ARCHS = filter(qw/edsp media/);
382233d2500723e5594f3e7c70896ffeeef32b9c950ywan  arm;
383233d2500723e5594f3e7c70896ffeeef32b9c950ywan} elsif ($opts{arch} eq 'armv7') {
384233d2500723e5594f3e7c70896ffeeef32b9c950ywan  @ALL_ARCHS = filter(qw/edsp media neon/);
385233d2500723e5594f3e7c70896ffeeef32b9c950ywan  arm;
386233d2500723e5594f3e7c70896ffeeef32b9c950ywan} else {
387233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unoptimized;
388233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
389233d2500723e5594f3e7c70896ffeeef32b9c950ywan
390233d2500723e5594f3e7c70896ffeeef32b9c950ywan__END__
391233d2500723e5594f3e7c70896ffeeef32b9c950ywan
392233d2500723e5594f3e7c70896ffeeef32b9c950ywan=head1 NAME
393233d2500723e5594f3e7c70896ffeeef32b9c950ywan
394233d2500723e5594f3e7c70896ffeeef32b9c950ywanrtcd -
395233d2500723e5594f3e7c70896ffeeef32b9c950ywan
396233d2500723e5594f3e7c70896ffeeef32b9c950ywan=head1 SYNOPSIS
397233d2500723e5594f3e7c70896ffeeef32b9c950ywan
398233d2500723e5594f3e7c70896ffeeef32b9c950ywanUsage: rtcd.pl [options] FILE
399233d2500723e5594f3e7c70896ffeeef32b9c950ywan
400233d2500723e5594f3e7c70896ffeeef32b9c950ywanSee 'perldoc rtcd.pl' for more details.
401233d2500723e5594f3e7c70896ffeeef32b9c950ywan
402233d2500723e5594f3e7c70896ffeeef32b9c950ywan=head1 DESCRIPTION
403233d2500723e5594f3e7c70896ffeeef32b9c950ywan
404233d2500723e5594f3e7c70896ffeeef32b9c950ywanReads the Run Time CPU Detections definitions from FILE and generates a
405233d2500723e5594f3e7c70896ffeeef32b9c950ywanC header file on stdout.
406233d2500723e5594f3e7c70896ffeeef32b9c950ywan
407233d2500723e5594f3e7c70896ffeeef32b9c950ywan=head1 OPTIONS
408233d2500723e5594f3e7c70896ffeeef32b9c950ywan
409233d2500723e5594f3e7c70896ffeeef32b9c950ywanOptions:
410233d2500723e5594f3e7c70896ffeeef32b9c950ywan  --arch=ARCH       Architecture to generate defs for (required)
411233d2500723e5594f3e7c70896ffeeef32b9c950ywan  --disable-EXT     Disable support for EXT extensions
412233d2500723e5594f3e7c70896ffeeef32b9c950ywan  --require-EXT     Require support for EXT extensions
413233d2500723e5594f3e7c70896ffeeef32b9c950ywan  --sym=SYMBOL      Unique symbol to use for RTCD initialization function
414233d2500723e5594f3e7c70896ffeeef32b9c950ywan  --config=FILE     File with CONFIG_FOO=yes lines to parse
415