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