xref: /aosp_15_r20/external/libaom/build/cmake/rtcd.pl (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1*77c1e3ccSAndroid Build Coastguard Worker#!/usr/bin/env perl
2*77c1e3ccSAndroid Build Coastguard Worker##
3*77c1e3ccSAndroid Build Coastguard Worker## Copyright (c) 2017, Alliance for Open Media. All rights reserved.
4*77c1e3ccSAndroid Build Coastguard Worker##
5*77c1e3ccSAndroid Build Coastguard Worker## This source code is subject to the terms of the BSD 2 Clause License and
6*77c1e3ccSAndroid Build Coastguard Worker## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
7*77c1e3ccSAndroid Build Coastguard Worker## was not distributed with this source code in the LICENSE file, you can
8*77c1e3ccSAndroid Build Coastguard Worker## obtain it at www.aomedia.org/license/software. If the Alliance for Open
9*77c1e3ccSAndroid Build Coastguard Worker## Media Patent License 1.0 was not distributed with this source code in the
10*77c1e3ccSAndroid Build Coastguard Worker## PATENTS file, you can obtain it at www.aomedia.org/license/patent.
11*77c1e3ccSAndroid Build Coastguard Worker##
12*77c1e3ccSAndroid Build Coastguard Workerno strict 'refs';
13*77c1e3ccSAndroid Build Coastguard Workeruse warnings;
14*77c1e3ccSAndroid Build Coastguard Workeruse Getopt::Long;
15*77c1e3ccSAndroid Build Coastguard WorkerGetopt::Long::Configure("auto_help") if $Getopt::Long::VERSION > 2.32;
16*77c1e3ccSAndroid Build Coastguard Worker
17*77c1e3ccSAndroid Build Coastguard Workermy %ALL_FUNCS = ();
18*77c1e3ccSAndroid Build Coastguard Workermy @ALL_ARCHS;
19*77c1e3ccSAndroid Build Coastguard Workermy @ALL_FORWARD_DECLS;
20*77c1e3ccSAndroid Build Coastguard Workermy @REQUIRES;
21*77c1e3ccSAndroid Build Coastguard Worker
22*77c1e3ccSAndroid Build Coastguard Workermy %opts = ();
23*77c1e3ccSAndroid Build Coastguard Workermy %disabled = ();
24*77c1e3ccSAndroid Build Coastguard Workermy %required = ();
25*77c1e3ccSAndroid Build Coastguard Worker
26*77c1e3ccSAndroid Build Coastguard Workermy @argv;
27*77c1e3ccSAndroid Build Coastguard Workerforeach (@ARGV) {
28*77c1e3ccSAndroid Build Coastguard Worker  $disabled{$1} = 1, next if /--disable-(.*)/;
29*77c1e3ccSAndroid Build Coastguard Worker  $required{$1} = 1, next if /--require-(.*)/;
30*77c1e3ccSAndroid Build Coastguard Worker  push @argv, $_;
31*77c1e3ccSAndroid Build Coastguard Worker}
32*77c1e3ccSAndroid Build Coastguard Worker
33*77c1e3ccSAndroid Build Coastguard Worker# NB: use GetOptions() instead of GetOptionsFromArray() for compatibility.
34*77c1e3ccSAndroid Build Coastguard Worker@ARGV = @argv;
35*77c1e3ccSAndroid Build Coastguard WorkerGetOptions(
36*77c1e3ccSAndroid Build Coastguard Worker  \%opts,
37*77c1e3ccSAndroid Build Coastguard Worker  'arch=s',
38*77c1e3ccSAndroid Build Coastguard Worker  'sym=s',
39*77c1e3ccSAndroid Build Coastguard Worker  'config=s',
40*77c1e3ccSAndroid Build Coastguard Worker);
41*77c1e3ccSAndroid Build Coastguard Worker
42*77c1e3ccSAndroid Build Coastguard Workerforeach my $opt (qw/arch config/) {
43*77c1e3ccSAndroid Build Coastguard Worker  if (!defined($opts{$opt})) {
44*77c1e3ccSAndroid Build Coastguard Worker    warn "--$opt is required!\n";
45*77c1e3ccSAndroid Build Coastguard Worker    Getopt::Long::HelpMessage('-exit' => 1);
46*77c1e3ccSAndroid Build Coastguard Worker  }
47*77c1e3ccSAndroid Build Coastguard Worker}
48*77c1e3ccSAndroid Build Coastguard Worker
49*77c1e3ccSAndroid Build Coastguard Workerforeach my $defs_file (@ARGV) {
50*77c1e3ccSAndroid Build Coastguard Worker  if (!-f $defs_file) {
51*77c1e3ccSAndroid Build Coastguard Worker    warn "$defs_file: $!\n";
52*77c1e3ccSAndroid Build Coastguard Worker    Getopt::Long::HelpMessage('-exit' => 1);
53*77c1e3ccSAndroid Build Coastguard Worker  }
54*77c1e3ccSAndroid Build Coastguard Worker}
55*77c1e3ccSAndroid Build Coastguard Worker
56*77c1e3ccSAndroid Build Coastguard Workeropen CONFIG_FILE, $opts{config} or
57*77c1e3ccSAndroid Build Coastguard Worker  die "Error opening config file '$opts{config}': $!\n";
58*77c1e3ccSAndroid Build Coastguard Worker
59*77c1e3ccSAndroid Build Coastguard Workermy %config = ();
60*77c1e3ccSAndroid Build Coastguard Workerwhile (<CONFIG_FILE>) {
61*77c1e3ccSAndroid Build Coastguard Worker  # TODO(aomedia:349428506,349436249,349450845,349455146): remove AOM_ARCH_
62*77c1e3ccSAndroid Build Coastguard Worker  # after armv7 SIGBUS issues are fixed.
63*77c1e3ccSAndroid Build Coastguard Worker  next if !/^#define\s+(?:AOM_ARCH_|CONFIG_|HAVE_)/;
64*77c1e3ccSAndroid Build Coastguard Worker  chomp;
65*77c1e3ccSAndroid Build Coastguard Worker  my @line_components = split /\s/;
66*77c1e3ccSAndroid Build Coastguard Worker  scalar @line_components > 2 or
67*77c1e3ccSAndroid Build Coastguard Worker    die "Invalid input passed to rtcd.pl via $opts{config}.";
68*77c1e3ccSAndroid Build Coastguard Worker  # $line_components[0] = #define
69*77c1e3ccSAndroid Build Coastguard Worker  # $line_components[1] = flag name ({AOM_ARCH,CONFIG,HAVE}_SOMETHING)
70*77c1e3ccSAndroid Build Coastguard Worker  # $line_components[2] = flag value (0 or 1)
71*77c1e3ccSAndroid Build Coastguard Worker  $config{$line_components[1]} = "$line_components[2]" eq "1" ? "yes" : "";
72*77c1e3ccSAndroid Build Coastguard Worker}
73*77c1e3ccSAndroid Build Coastguard Workerclose CONFIG_FILE;
74*77c1e3ccSAndroid Build Coastguard Worker
75*77c1e3ccSAndroid Build Coastguard Worker#
76*77c1e3ccSAndroid Build Coastguard Worker# Routines for the RTCD DSL to call
77*77c1e3ccSAndroid Build Coastguard Worker#
78*77c1e3ccSAndroid Build Coastguard Workersub aom_config($) {
79*77c1e3ccSAndroid Build Coastguard Worker  return (defined $config{$_[0]}) ? $config{$_[0]} : "";
80*77c1e3ccSAndroid Build Coastguard Worker}
81*77c1e3ccSAndroid Build Coastguard Worker
82*77c1e3ccSAndroid Build Coastguard Workersub specialize {
83*77c1e3ccSAndroid Build Coastguard Worker  if (@_ <= 1) {
84*77c1e3ccSAndroid Build Coastguard Worker    die "'specialize' must be called with a function name and at least one ",
85*77c1e3ccSAndroid Build Coastguard Worker        "architecture ('C' is implied): \n@_\n";
86*77c1e3ccSAndroid Build Coastguard Worker  }
87*77c1e3ccSAndroid Build Coastguard Worker  my $fn=$_[0];
88*77c1e3ccSAndroid Build Coastguard Worker  shift;
89*77c1e3ccSAndroid Build Coastguard Worker  foreach my $opt (@_) {
90*77c1e3ccSAndroid Build Coastguard Worker    eval "\$${fn}_${opt}=${fn}_${opt}";
91*77c1e3ccSAndroid Build Coastguard Worker  }
92*77c1e3ccSAndroid Build Coastguard Worker}
93*77c1e3ccSAndroid Build Coastguard Worker
94*77c1e3ccSAndroid Build Coastguard Workersub add_proto {
95*77c1e3ccSAndroid Build Coastguard Worker  my $fn = splice(@_, -2, 1);
96*77c1e3ccSAndroid Build Coastguard Worker  my @proto = @_;
97*77c1e3ccSAndroid Build Coastguard Worker  foreach (@proto) { tr/\t/ / }
98*77c1e3ccSAndroid Build Coastguard Worker  $ALL_FUNCS{$fn} = \@proto;
99*77c1e3ccSAndroid Build Coastguard Worker  specialize $fn, "c";
100*77c1e3ccSAndroid Build Coastguard Worker}
101*77c1e3ccSAndroid Build Coastguard Worker
102*77c1e3ccSAndroid Build Coastguard Workersub require {
103*77c1e3ccSAndroid Build Coastguard Worker  foreach my $fn (keys %ALL_FUNCS) {
104*77c1e3ccSAndroid Build Coastguard Worker    foreach my $opt (@_) {
105*77c1e3ccSAndroid Build Coastguard Worker      my $ofn = eval "\$${fn}_${opt}";
106*77c1e3ccSAndroid Build Coastguard Worker      next if !$ofn;
107*77c1e3ccSAndroid Build Coastguard Worker
108*77c1e3ccSAndroid Build Coastguard Worker      # if we already have a default, then we can disable it, as we know
109*77c1e3ccSAndroid Build Coastguard Worker      # we can do better.
110*77c1e3ccSAndroid Build Coastguard Worker      my $best = eval "\$${fn}_default";
111*77c1e3ccSAndroid Build Coastguard Worker      if ($best) {
112*77c1e3ccSAndroid Build Coastguard Worker        my $best_ofn = eval "\$${best}";
113*77c1e3ccSAndroid Build Coastguard Worker        if ($best_ofn && "$best_ofn" ne "$ofn") {
114*77c1e3ccSAndroid Build Coastguard Worker          eval "\$${best}_link = 'false'";
115*77c1e3ccSAndroid Build Coastguard Worker        }
116*77c1e3ccSAndroid Build Coastguard Worker      }
117*77c1e3ccSAndroid Build Coastguard Worker      eval "\$${fn}_default=${fn}_${opt}";
118*77c1e3ccSAndroid Build Coastguard Worker      eval "\$${fn}_${opt}_link='true'";
119*77c1e3ccSAndroid Build Coastguard Worker    }
120*77c1e3ccSAndroid Build Coastguard Worker  }
121*77c1e3ccSAndroid Build Coastguard Worker}
122*77c1e3ccSAndroid Build Coastguard Worker
123*77c1e3ccSAndroid Build Coastguard Workersub forward_decls {
124*77c1e3ccSAndroid Build Coastguard Worker  push @ALL_FORWARD_DECLS, @_;
125*77c1e3ccSAndroid Build Coastguard Worker}
126*77c1e3ccSAndroid Build Coastguard Worker
127*77c1e3ccSAndroid Build Coastguard Worker#
128*77c1e3ccSAndroid Build Coastguard Worker# Include the user's directives
129*77c1e3ccSAndroid Build Coastguard Worker#
130*77c1e3ccSAndroid Build Coastguard Workerforeach my $f (@ARGV) {
131*77c1e3ccSAndroid Build Coastguard Worker  open FILE, "<", $f or die "cannot open $f: $!\n";
132*77c1e3ccSAndroid Build Coastguard Worker  my $contents = join('', <FILE>);
133*77c1e3ccSAndroid Build Coastguard Worker  close FILE;
134*77c1e3ccSAndroid Build Coastguard Worker  eval $contents or warn "eval failed: $@\n";
135*77c1e3ccSAndroid Build Coastguard Worker}
136*77c1e3ccSAndroid Build Coastguard Worker
137*77c1e3ccSAndroid Build Coastguard Worker#
138*77c1e3ccSAndroid Build Coastguard Worker# Process the directives according to the command line
139*77c1e3ccSAndroid Build Coastguard Worker#
140*77c1e3ccSAndroid Build Coastguard Workersub process_forward_decls() {
141*77c1e3ccSAndroid Build Coastguard Worker  foreach (@ALL_FORWARD_DECLS) {
142*77c1e3ccSAndroid Build Coastguard Worker    $_->();
143*77c1e3ccSAndroid Build Coastguard Worker  }
144*77c1e3ccSAndroid Build Coastguard Worker}
145*77c1e3ccSAndroid Build Coastguard Worker
146*77c1e3ccSAndroid Build Coastguard Workersub determine_indirection {
147*77c1e3ccSAndroid Build Coastguard Worker  aom_config("CONFIG_RUNTIME_CPU_DETECT") eq "yes" or &require(@ALL_ARCHS);
148*77c1e3ccSAndroid Build Coastguard Worker  foreach my $fn (keys %ALL_FUNCS) {
149*77c1e3ccSAndroid Build Coastguard Worker    my $n = "";
150*77c1e3ccSAndroid Build Coastguard Worker    my @val = @{$ALL_FUNCS{$fn}};
151*77c1e3ccSAndroid Build Coastguard Worker    my $args = pop @val;
152*77c1e3ccSAndroid Build Coastguard Worker    my $rtyp = "@val";
153*77c1e3ccSAndroid Build Coastguard Worker    my $dfn = eval "\$${fn}_default";
154*77c1e3ccSAndroid Build Coastguard Worker    $dfn = eval "\$${dfn}";
155*77c1e3ccSAndroid Build Coastguard Worker    foreach my $opt (@_) {
156*77c1e3ccSAndroid Build Coastguard Worker      my $ofn = eval "\$${fn}_${opt}";
157*77c1e3ccSAndroid Build Coastguard Worker      next if !$ofn;
158*77c1e3ccSAndroid Build Coastguard Worker      my $link = eval "\$${fn}_${opt}_link";
159*77c1e3ccSAndroid Build Coastguard Worker      next if $link && $link eq "false";
160*77c1e3ccSAndroid Build Coastguard Worker      $n .= "x";
161*77c1e3ccSAndroid Build Coastguard Worker    }
162*77c1e3ccSAndroid Build Coastguard Worker    if ($n eq "x") {
163*77c1e3ccSAndroid Build Coastguard Worker      eval "\$${fn}_indirect = 'false'";
164*77c1e3ccSAndroid Build Coastguard Worker    } else {
165*77c1e3ccSAndroid Build Coastguard Worker      eval "\$${fn}_indirect = 'true'";
166*77c1e3ccSAndroid Build Coastguard Worker    }
167*77c1e3ccSAndroid Build Coastguard Worker  }
168*77c1e3ccSAndroid Build Coastguard Worker}
169*77c1e3ccSAndroid Build Coastguard Worker
170*77c1e3ccSAndroid Build Coastguard Workersub declare_function_pointers {
171*77c1e3ccSAndroid Build Coastguard Worker  foreach my $fn (sort keys %ALL_FUNCS) {
172*77c1e3ccSAndroid Build Coastguard Worker    my @val = @{$ALL_FUNCS{$fn}};
173*77c1e3ccSAndroid Build Coastguard Worker    my $args = pop @val;
174*77c1e3ccSAndroid Build Coastguard Worker    my $rtyp = "@val";
175*77c1e3ccSAndroid Build Coastguard Worker    my $dfn = eval "\$${fn}_default";
176*77c1e3ccSAndroid Build Coastguard Worker    $dfn = eval "\$${dfn}";
177*77c1e3ccSAndroid Build Coastguard Worker    foreach my $opt (@_) {
178*77c1e3ccSAndroid Build Coastguard Worker      my $ofn = eval "\$${fn}_${opt}";
179*77c1e3ccSAndroid Build Coastguard Worker      next if !$ofn;
180*77c1e3ccSAndroid Build Coastguard Worker      print "$rtyp ${ofn}($args);\n";
181*77c1e3ccSAndroid Build Coastguard Worker    }
182*77c1e3ccSAndroid Build Coastguard Worker    if (eval "\$${fn}_indirect" eq "false") {
183*77c1e3ccSAndroid Build Coastguard Worker      print "#define ${fn} ${dfn}\n";
184*77c1e3ccSAndroid Build Coastguard Worker    } else {
185*77c1e3ccSAndroid Build Coastguard Worker      print "RTCD_EXTERN $rtyp (*${fn})($args);\n";
186*77c1e3ccSAndroid Build Coastguard Worker    }
187*77c1e3ccSAndroid Build Coastguard Worker    print "\n";
188*77c1e3ccSAndroid Build Coastguard Worker  }
189*77c1e3ccSAndroid Build Coastguard Worker}
190*77c1e3ccSAndroid Build Coastguard Worker
191*77c1e3ccSAndroid Build Coastguard Workersub set_function_pointers {
192*77c1e3ccSAndroid Build Coastguard Worker  foreach my $fn (sort keys %ALL_FUNCS) {
193*77c1e3ccSAndroid Build Coastguard Worker    my @val = @{$ALL_FUNCS{$fn}};
194*77c1e3ccSAndroid Build Coastguard Worker    my $args = pop @val;
195*77c1e3ccSAndroid Build Coastguard Worker    my $rtyp = "@val";
196*77c1e3ccSAndroid Build Coastguard Worker    my $dfn = eval "\$${fn}_default";
197*77c1e3ccSAndroid Build Coastguard Worker    $dfn = eval "\$${dfn}";
198*77c1e3ccSAndroid Build Coastguard Worker    if (eval "\$${fn}_indirect" eq "true") {
199*77c1e3ccSAndroid Build Coastguard Worker      print "    $fn = $dfn;\n";
200*77c1e3ccSAndroid Build Coastguard Worker      foreach my $opt (@_) {
201*77c1e3ccSAndroid Build Coastguard Worker        my $ofn = eval "\$${fn}_${opt}";
202*77c1e3ccSAndroid Build Coastguard Worker        next if !$ofn;
203*77c1e3ccSAndroid Build Coastguard Worker        next if "$ofn" eq "$dfn";
204*77c1e3ccSAndroid Build Coastguard Worker        my $link = eval "\$${fn}_${opt}_link";
205*77c1e3ccSAndroid Build Coastguard Worker        next if $link && $link eq "false";
206*77c1e3ccSAndroid Build Coastguard Worker        my $cond = eval "\$have_${opt}";
207*77c1e3ccSAndroid Build Coastguard Worker        print "    if (${cond}) $fn = $ofn;\n"
208*77c1e3ccSAndroid Build Coastguard Worker      }
209*77c1e3ccSAndroid Build Coastguard Worker    }
210*77c1e3ccSAndroid Build Coastguard Worker  }
211*77c1e3ccSAndroid Build Coastguard Worker}
212*77c1e3ccSAndroid Build Coastguard Worker
213*77c1e3ccSAndroid Build Coastguard Workersub filter {
214*77c1e3ccSAndroid Build Coastguard Worker  my @filtered;
215*77c1e3ccSAndroid Build Coastguard Worker  foreach (@_) { push @filtered, $_ unless $disabled{$_}; }
216*77c1e3ccSAndroid Build Coastguard Worker  return @filtered;
217*77c1e3ccSAndroid Build Coastguard Worker}
218*77c1e3ccSAndroid Build Coastguard Worker
219*77c1e3ccSAndroid Build Coastguard Worker#
220*77c1e3ccSAndroid Build Coastguard Worker# Helper functions for generating the arch specific RTCD files
221*77c1e3ccSAndroid Build Coastguard Worker#
222*77c1e3ccSAndroid Build Coastguard Workersub common_top() {
223*77c1e3ccSAndroid Build Coastguard Worker  my $include_guard = uc($opts{sym})."_H_";
224*77c1e3ccSAndroid Build Coastguard Worker  my @time = localtime;
225*77c1e3ccSAndroid Build Coastguard Worker  my $year = $time[5] + 1900;
226*77c1e3ccSAndroid Build Coastguard Worker  print <<EOF;
227*77c1e3ccSAndroid Build Coastguard Worker/*
228*77c1e3ccSAndroid Build Coastguard Worker * Copyright (c) ${year}, Alliance for Open Media. All rights reserved.
229*77c1e3ccSAndroid Build Coastguard Worker *
230*77c1e3ccSAndroid Build Coastguard Worker * This source code is subject to the terms of the BSD 2 Clause License and
231*77c1e3ccSAndroid Build Coastguard Worker * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
232*77c1e3ccSAndroid Build Coastguard Worker * was not distributed with this source code in the LICENSE file, you can
233*77c1e3ccSAndroid Build Coastguard Worker * obtain it at www.aomedia.org/license/software. If the Alliance for Open
234*77c1e3ccSAndroid Build Coastguard Worker * Media Patent License 1.0 was not distributed with this source code in the
235*77c1e3ccSAndroid Build Coastguard Worker * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
236*77c1e3ccSAndroid Build Coastguard Worker */
237*77c1e3ccSAndroid Build Coastguard Worker
238*77c1e3ccSAndroid Build Coastguard Worker// This file is generated. Do not edit.
239*77c1e3ccSAndroid Build Coastguard Worker#ifndef ${include_guard}
240*77c1e3ccSAndroid Build Coastguard Worker#define ${include_guard}
241*77c1e3ccSAndroid Build Coastguard Worker
242*77c1e3ccSAndroid Build Coastguard Worker#ifdef RTCD_C
243*77c1e3ccSAndroid Build Coastguard Worker#define RTCD_EXTERN
244*77c1e3ccSAndroid Build Coastguard Worker#else
245*77c1e3ccSAndroid Build Coastguard Worker#define RTCD_EXTERN extern
246*77c1e3ccSAndroid Build Coastguard Worker#endif
247*77c1e3ccSAndroid Build Coastguard Worker
248*77c1e3ccSAndroid Build Coastguard WorkerEOF
249*77c1e3ccSAndroid Build Coastguard Worker
250*77c1e3ccSAndroid Build Coastguard Workerprocess_forward_decls();
251*77c1e3ccSAndroid Build Coastguard Workerprint <<EOF;
252*77c1e3ccSAndroid Build Coastguard Worker
253*77c1e3ccSAndroid Build Coastguard Worker#ifdef __cplusplus
254*77c1e3ccSAndroid Build Coastguard Workerextern "C" {
255*77c1e3ccSAndroid Build Coastguard Worker#endif
256*77c1e3ccSAndroid Build Coastguard Worker
257*77c1e3ccSAndroid Build Coastguard WorkerEOF
258*77c1e3ccSAndroid Build Coastguard Workerdeclare_function_pointers("c", @ALL_ARCHS);
259*77c1e3ccSAndroid Build Coastguard Worker
260*77c1e3ccSAndroid Build Coastguard Workerprint <<EOF;
261*77c1e3ccSAndroid Build Coastguard Workervoid $opts{sym}(void);
262*77c1e3ccSAndroid Build Coastguard Worker
263*77c1e3ccSAndroid Build Coastguard WorkerEOF
264*77c1e3ccSAndroid Build Coastguard Worker}
265*77c1e3ccSAndroid Build Coastguard Worker
266*77c1e3ccSAndroid Build Coastguard Workersub common_bottom() {
267*77c1e3ccSAndroid Build Coastguard Worker  my $include_guard = uc($opts{sym})."_H_";
268*77c1e3ccSAndroid Build Coastguard Worker  print <<EOF;
269*77c1e3ccSAndroid Build Coastguard Worker
270*77c1e3ccSAndroid Build Coastguard Worker#ifdef __cplusplus
271*77c1e3ccSAndroid Build Coastguard Worker}  // extern "C"
272*77c1e3ccSAndroid Build Coastguard Worker#endif
273*77c1e3ccSAndroid Build Coastguard Worker
274*77c1e3ccSAndroid Build Coastguard Worker#endif  // ${include_guard}
275*77c1e3ccSAndroid Build Coastguard WorkerEOF
276*77c1e3ccSAndroid Build Coastguard Worker}
277*77c1e3ccSAndroid Build Coastguard Worker
278*77c1e3ccSAndroid Build Coastguard Workersub x86() {
279*77c1e3ccSAndroid Build Coastguard Worker  determine_indirection("c", @ALL_ARCHS);
280*77c1e3ccSAndroid Build Coastguard Worker
281*77c1e3ccSAndroid Build Coastguard Worker  # Assign the helper variable for each enabled extension
282*77c1e3ccSAndroid Build Coastguard Worker  foreach my $opt (@ALL_ARCHS) {
283*77c1e3ccSAndroid Build Coastguard Worker    my $opt_uc = uc $opt;
284*77c1e3ccSAndroid Build Coastguard Worker    eval "\$have_${opt}=\"flags & HAS_${opt_uc}\"";
285*77c1e3ccSAndroid Build Coastguard Worker  }
286*77c1e3ccSAndroid Build Coastguard Worker
287*77c1e3ccSAndroid Build Coastguard Worker  common_top;
288*77c1e3ccSAndroid Build Coastguard Worker  print <<EOF;
289*77c1e3ccSAndroid Build Coastguard Worker#ifdef RTCD_C
290*77c1e3ccSAndroid Build Coastguard Worker#include "aom_ports/x86.h"
291*77c1e3ccSAndroid Build Coastguard Workerstatic void setup_rtcd_internal(void)
292*77c1e3ccSAndroid Build Coastguard Worker{
293*77c1e3ccSAndroid Build Coastguard Worker    int flags = x86_simd_caps();
294*77c1e3ccSAndroid Build Coastguard Worker
295*77c1e3ccSAndroid Build Coastguard Worker    (void)flags;
296*77c1e3ccSAndroid Build Coastguard Worker
297*77c1e3ccSAndroid Build Coastguard WorkerEOF
298*77c1e3ccSAndroid Build Coastguard Worker
299*77c1e3ccSAndroid Build Coastguard Worker  set_function_pointers("c", @ALL_ARCHS);
300*77c1e3ccSAndroid Build Coastguard Worker
301*77c1e3ccSAndroid Build Coastguard Worker  print <<EOF;
302*77c1e3ccSAndroid Build Coastguard Worker}
303*77c1e3ccSAndroid Build Coastguard Worker#endif
304*77c1e3ccSAndroid Build Coastguard WorkerEOF
305*77c1e3ccSAndroid Build Coastguard Worker  common_bottom;
306*77c1e3ccSAndroid Build Coastguard Worker}
307*77c1e3ccSAndroid Build Coastguard Worker
308*77c1e3ccSAndroid Build Coastguard Workersub arm() {
309*77c1e3ccSAndroid Build Coastguard Worker  determine_indirection("c", @ALL_ARCHS);
310*77c1e3ccSAndroid Build Coastguard Worker
311*77c1e3ccSAndroid Build Coastguard Worker  # Assign the helper variable for each enabled extension
312*77c1e3ccSAndroid Build Coastguard Worker  foreach my $opt (@ALL_ARCHS) {
313*77c1e3ccSAndroid Build Coastguard Worker    my $opt_uc = uc $opt;
314*77c1e3ccSAndroid Build Coastguard Worker    eval "\$have_${opt}=\"flags & HAS_${opt_uc}\"";
315*77c1e3ccSAndroid Build Coastguard Worker  }
316*77c1e3ccSAndroid Build Coastguard Worker
317*77c1e3ccSAndroid Build Coastguard Worker  common_top;
318*77c1e3ccSAndroid Build Coastguard Worker  print <<EOF;
319*77c1e3ccSAndroid Build Coastguard Worker#include "config/aom_config.h"
320*77c1e3ccSAndroid Build Coastguard Worker
321*77c1e3ccSAndroid Build Coastguard Worker#ifdef RTCD_C
322*77c1e3ccSAndroid Build Coastguard Worker#include "aom_ports/arm.h"
323*77c1e3ccSAndroid Build Coastguard Workerstatic void setup_rtcd_internal(void)
324*77c1e3ccSAndroid Build Coastguard Worker{
325*77c1e3ccSAndroid Build Coastguard Worker    int flags = aom_arm_cpu_caps();
326*77c1e3ccSAndroid Build Coastguard Worker
327*77c1e3ccSAndroid Build Coastguard Worker    (void)flags;
328*77c1e3ccSAndroid Build Coastguard Worker
329*77c1e3ccSAndroid Build Coastguard WorkerEOF
330*77c1e3ccSAndroid Build Coastguard Worker
331*77c1e3ccSAndroid Build Coastguard Worker  set_function_pointers("c", @ALL_ARCHS);
332*77c1e3ccSAndroid Build Coastguard Worker
333*77c1e3ccSAndroid Build Coastguard Worker  print <<EOF;
334*77c1e3ccSAndroid Build Coastguard Worker}
335*77c1e3ccSAndroid Build Coastguard Worker#endif
336*77c1e3ccSAndroid Build Coastguard WorkerEOF
337*77c1e3ccSAndroid Build Coastguard Worker  common_bottom;
338*77c1e3ccSAndroid Build Coastguard Worker}
339*77c1e3ccSAndroid Build Coastguard Worker
340*77c1e3ccSAndroid Build Coastguard Workersub ppc() {
341*77c1e3ccSAndroid Build Coastguard Worker  determine_indirection("c", @ALL_ARCHS);
342*77c1e3ccSAndroid Build Coastguard Worker
343*77c1e3ccSAndroid Build Coastguard Worker  # Assign the helper variable for each enabled extension
344*77c1e3ccSAndroid Build Coastguard Worker  foreach my $opt (@ALL_ARCHS) {
345*77c1e3ccSAndroid Build Coastguard Worker    my $opt_uc = uc $opt;
346*77c1e3ccSAndroid Build Coastguard Worker    eval "\$have_${opt}=\"flags & HAS_${opt_uc}\"";
347*77c1e3ccSAndroid Build Coastguard Worker  }
348*77c1e3ccSAndroid Build Coastguard Worker
349*77c1e3ccSAndroid Build Coastguard Worker  common_top;
350*77c1e3ccSAndroid Build Coastguard Worker
351*77c1e3ccSAndroid Build Coastguard Worker  print <<EOF;
352*77c1e3ccSAndroid Build Coastguard Worker#include "config/aom_config.h"
353*77c1e3ccSAndroid Build Coastguard Worker
354*77c1e3ccSAndroid Build Coastguard Worker#ifdef RTCD_C
355*77c1e3ccSAndroid Build Coastguard Worker#include "aom_ports/ppc.h"
356*77c1e3ccSAndroid Build Coastguard Workerstatic void setup_rtcd_internal(void)
357*77c1e3ccSAndroid Build Coastguard Worker{
358*77c1e3ccSAndroid Build Coastguard Worker  int flags = ppc_simd_caps();
359*77c1e3ccSAndroid Build Coastguard Worker
360*77c1e3ccSAndroid Build Coastguard Worker  (void)flags;
361*77c1e3ccSAndroid Build Coastguard Worker
362*77c1e3ccSAndroid Build Coastguard WorkerEOF
363*77c1e3ccSAndroid Build Coastguard Worker
364*77c1e3ccSAndroid Build Coastguard Worker  set_function_pointers("c", @ALL_ARCHS);
365*77c1e3ccSAndroid Build Coastguard Worker
366*77c1e3ccSAndroid Build Coastguard Worker  print <<EOF;
367*77c1e3ccSAndroid Build Coastguard Worker}
368*77c1e3ccSAndroid Build Coastguard Worker#endif
369*77c1e3ccSAndroid Build Coastguard WorkerEOF
370*77c1e3ccSAndroid Build Coastguard Worker  common_bottom;
371*77c1e3ccSAndroid Build Coastguard Worker}
372*77c1e3ccSAndroid Build Coastguard Worker
373*77c1e3ccSAndroid Build Coastguard Workersub unoptimized() {
374*77c1e3ccSAndroid Build Coastguard Worker  determine_indirection "c";
375*77c1e3ccSAndroid Build Coastguard Worker  common_top;
376*77c1e3ccSAndroid Build Coastguard Worker  print <<EOF;
377*77c1e3ccSAndroid Build Coastguard Worker#include "config/aom_config.h"
378*77c1e3ccSAndroid Build Coastguard Worker
379*77c1e3ccSAndroid Build Coastguard Worker#ifdef RTCD_C
380*77c1e3ccSAndroid Build Coastguard Workerstatic void setup_rtcd_internal(void)
381*77c1e3ccSAndroid Build Coastguard Worker{
382*77c1e3ccSAndroid Build Coastguard WorkerEOF
383*77c1e3ccSAndroid Build Coastguard Worker
384*77c1e3ccSAndroid Build Coastguard Worker  set_function_pointers "c";
385*77c1e3ccSAndroid Build Coastguard Worker
386*77c1e3ccSAndroid Build Coastguard Worker  print <<EOF;
387*77c1e3ccSAndroid Build Coastguard Worker}
388*77c1e3ccSAndroid Build Coastguard Worker#endif
389*77c1e3ccSAndroid Build Coastguard WorkerEOF
390*77c1e3ccSAndroid Build Coastguard Worker  common_bottom;
391*77c1e3ccSAndroid Build Coastguard Worker}
392*77c1e3ccSAndroid Build Coastguard Worker
393*77c1e3ccSAndroid Build Coastguard Worker#
394*77c1e3ccSAndroid Build Coastguard Worker# Main Driver
395*77c1e3ccSAndroid Build Coastguard Worker#
396*77c1e3ccSAndroid Build Coastguard Worker
397*77c1e3ccSAndroid Build Coastguard Worker&require("c");
398*77c1e3ccSAndroid Build Coastguard Worker&require(keys %required);
399*77c1e3ccSAndroid Build Coastguard Workerif ($opts{arch} eq 'x86') {
400*77c1e3ccSAndroid Build Coastguard Worker  @ALL_ARCHS = filter(qw/mmx sse sse2 sse3 ssse3 sse4_1 sse4_2 avx avx2/);
401*77c1e3ccSAndroid Build Coastguard Worker  x86;
402*77c1e3ccSAndroid Build Coastguard Worker} elsif ($opts{arch} eq 'x86_64') {
403*77c1e3ccSAndroid Build Coastguard Worker  @ALL_ARCHS = filter(qw/mmx sse sse2 sse3 ssse3 sse4_1 sse4_2 avx avx2/);
404*77c1e3ccSAndroid Build Coastguard Worker  @REQUIRES = filter(qw/mmx sse sse2/);
405*77c1e3ccSAndroid Build Coastguard Worker  &require(@REQUIRES);
406*77c1e3ccSAndroid Build Coastguard Worker  x86;
407*77c1e3ccSAndroid Build Coastguard Worker} elsif ($opts{arch} =~ /armv[78]\w?/) {
408*77c1e3ccSAndroid Build Coastguard Worker  @ALL_ARCHS = filter(qw/neon/);
409*77c1e3ccSAndroid Build Coastguard Worker  arm;
410*77c1e3ccSAndroid Build Coastguard Worker} elsif ($opts{arch} eq 'arm64' ) {
411*77c1e3ccSAndroid Build Coastguard Worker  @ALL_ARCHS = filter(qw/neon arm_crc32 neon_dotprod neon_i8mm sve sve2/);
412*77c1e3ccSAndroid Build Coastguard Worker  @REQUIRES = filter(qw/neon/);
413*77c1e3ccSAndroid Build Coastguard Worker  &require(@REQUIRES);
414*77c1e3ccSAndroid Build Coastguard Worker  arm;
415*77c1e3ccSAndroid Build Coastguard Worker} elsif ($opts{arch} eq 'ppc') {
416*77c1e3ccSAndroid Build Coastguard Worker  @ALL_ARCHS = filter(qw/vsx/);
417*77c1e3ccSAndroid Build Coastguard Worker  ppc;
418*77c1e3ccSAndroid Build Coastguard Worker} else {
419*77c1e3ccSAndroid Build Coastguard Worker  unoptimized;
420*77c1e3ccSAndroid Build Coastguard Worker}
421*77c1e3ccSAndroid Build Coastguard Worker
422*77c1e3ccSAndroid Build Coastguard Worker__END__
423*77c1e3ccSAndroid Build Coastguard Worker
424*77c1e3ccSAndroid Build Coastguard Worker=head1 NAME
425*77c1e3ccSAndroid Build Coastguard Worker
426*77c1e3ccSAndroid Build Coastguard Workerrtcd -
427*77c1e3ccSAndroid Build Coastguard Worker
428*77c1e3ccSAndroid Build Coastguard Worker=head1 SYNOPSIS
429*77c1e3ccSAndroid Build Coastguard Worker
430*77c1e3ccSAndroid Build Coastguard WorkerUsage: rtcd.pl [options] FILE
431*77c1e3ccSAndroid Build Coastguard Worker
432*77c1e3ccSAndroid Build Coastguard WorkerSee 'perldoc rtcd.pl' for more details.
433*77c1e3ccSAndroid Build Coastguard Worker
434*77c1e3ccSAndroid Build Coastguard Worker=head1 DESCRIPTION
435*77c1e3ccSAndroid Build Coastguard Worker
436*77c1e3ccSAndroid Build Coastguard WorkerReads the Run Time CPU Detections definitions from FILE and generates a
437*77c1e3ccSAndroid Build Coastguard WorkerC header file on stdout.
438*77c1e3ccSAndroid Build Coastguard Worker
439*77c1e3ccSAndroid Build Coastguard Worker=head1 OPTIONS
440*77c1e3ccSAndroid Build Coastguard Worker
441*77c1e3ccSAndroid Build Coastguard WorkerOptions:
442*77c1e3ccSAndroid Build Coastguard Worker  --arch=ARCH       Architecture to generate defs for (required)
443*77c1e3ccSAndroid Build Coastguard Worker  --disable-EXT     Disable support for EXT extensions
444*77c1e3ccSAndroid Build Coastguard Worker  --require-EXT     Require support for EXT extensions
445*77c1e3ccSAndroid Build Coastguard Worker  --sym=SYMBOL      Unique symbol to use for RTCD initialization function
446*77c1e3ccSAndroid Build Coastguard Worker  --config=FILE     Path to file containing C preprocessor directives to parse
447