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