| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 #!/bin/sh |  | 
| 2 self=$0 |  | 
| 3 |  | 
| 4 usage() { |  | 
| 5   cat <<EOF >&2 |  | 
| 6 Usage: $self [options] FILE |  | 
| 7 |  | 
| 8 Reads the Run Time CPU Detections definitions from FILE and generates a |  | 
| 9 C header file on stdout. |  | 
| 10 |  | 
| 11 Options: |  | 
| 12   --arch=ARCH   Architecture to generate defs for (required) |  | 
| 13   --disable-EXT Disable support for EXT extensions |  | 
| 14   --require-EXT Require support for EXT extensions |  | 
| 15   --sym=SYMBOL  Unique symbol to use for RTCD initialization function |  | 
| 16   --config=FILE File with CONFIG_FOO=yes lines to parse |  | 
| 17 EOF |  | 
| 18   exit 1 |  | 
| 19 } |  | 
| 20 |  | 
| 21 die() { |  | 
| 22   echo "$@" >&2 |  | 
| 23   exit 1 |  | 
| 24 } |  | 
| 25 |  | 
| 26 die_argument_required() { |  | 
| 27   die "Option $opt requires argument" |  | 
| 28 } |  | 
| 29 |  | 
| 30 for opt; do |  | 
| 31   optval="${opt#*=}" |  | 
| 32   case "$opt" in |  | 
| 33     --arch) die_argument_required;; |  | 
| 34     --arch=*) arch=${optval};; |  | 
| 35     --disable-*) eval "disable_${opt#--disable-}=true";; |  | 
| 36     --require-*) REQUIRES="${REQUIRES}${opt#--require-} ";; |  | 
| 37     --sym) die_argument_required;; |  | 
| 38     --sym=*) symbol=${optval};; |  | 
| 39     --config=*) config_file=${optval};; |  | 
| 40     -h|--help) |  | 
| 41       usage |  | 
| 42       ;; |  | 
| 43     -*) |  | 
| 44       die "Unrecognized option: ${opt%%=*}" |  | 
| 45       ;; |  | 
| 46     *) |  | 
| 47       defs_file="$defs_file $opt" |  | 
| 48       ;; |  | 
| 49   esac |  | 
| 50   shift |  | 
| 51 done |  | 
| 52 for f in $defs_file; do [ -f "$f" ] || usage; done |  | 
| 53 [ -n "$arch" ] || usage |  | 
| 54 |  | 
| 55 # Import the configuration |  | 
| 56 [ -f "$config_file" ] && eval $(grep CONFIG_ "$config_file") |  | 
| 57 |  | 
| 58 # |  | 
| 59 # Routines for the RTCD DSL to call |  | 
| 60 # |  | 
| 61 prototype() { |  | 
| 62   rtyp="" |  | 
| 63   case "$1" in |  | 
| 64     unsigned) rtyp="$1 "; shift;; |  | 
| 65   esac |  | 
| 66   rtyp="${rtyp}$1" |  | 
| 67   fn="$2" |  | 
| 68   args="$3" |  | 
| 69 |  | 
| 70   eval "${2}_rtyp='$rtyp'" |  | 
| 71   eval "${2}_args='$3'" |  | 
| 72   ALL_FUNCS="$ALL_FUNCS $fn" |  | 
| 73   specialize $fn c |  | 
| 74 } |  | 
| 75 |  | 
| 76 specialize() { |  | 
| 77   fn="$1" |  | 
| 78   shift |  | 
| 79   for opt in "$@"; do |  | 
| 80     eval "${fn}_${opt}=${fn}_${opt}" |  | 
| 81   done |  | 
| 82 } |  | 
| 83 |  | 
| 84 require() { |  | 
| 85   for fn in $ALL_FUNCS; do |  | 
| 86     for opt in "$@"; do |  | 
| 87       ofn=$(eval "echo \$${fn}_${opt}") |  | 
| 88       [ -z "$ofn" ] && continue |  | 
| 89 |  | 
| 90       # if we already have a default, then we can disable it, as we know |  | 
| 91       # we can do better. |  | 
| 92       best=$(eval "echo \$${fn}_default") |  | 
| 93       best_ofn=$(eval "echo \$${best}") |  | 
| 94       [ -n "$best" ] && [ "$best_ofn" != "$ofn" ] && eval "${best}_link=false" |  | 
| 95       eval "${fn}_default=${fn}_${opt}" |  | 
| 96       eval "${fn}_${opt}_link=true" |  | 
| 97     done |  | 
| 98   done |  | 
| 99 } |  | 
| 100 |  | 
| 101 forward_decls() { |  | 
| 102   ALL_FORWARD_DECLS="$ALL_FORWARD_DECLS $1" |  | 
| 103 } |  | 
| 104 |  | 
| 105 # |  | 
| 106 # Include the user's directives |  | 
| 107 # |  | 
| 108 for f in $defs_file; do |  | 
| 109   . $f |  | 
| 110 done |  | 
| 111 |  | 
| 112 # |  | 
| 113 # Process the directives according to the command line |  | 
| 114 # |  | 
| 115 process_forward_decls() { |  | 
| 116   for fn in $ALL_FORWARD_DECLS; do |  | 
| 117     eval $fn |  | 
| 118   done |  | 
| 119 } |  | 
| 120 |  | 
| 121 determine_indirection() { |  | 
| 122   [ "$CONFIG_RUNTIME_CPU_DETECT" = "yes" ] || require $ALL_ARCHS |  | 
| 123   for fn in $ALL_FUNCS; do |  | 
| 124     n="" |  | 
| 125     rtyp="$(eval "echo \$${fn}_rtyp")" |  | 
| 126     args="$(eval "echo \"\$${fn}_args\"")" |  | 
| 127     dfn="$(eval "echo \$${fn}_default")" |  | 
| 128     dfn=$(eval "echo \$${dfn}") |  | 
| 129     for opt in "$@"; do |  | 
| 130       ofn=$(eval "echo \$${fn}_${opt}") |  | 
| 131       [ -z "$ofn" ] && continue |  | 
| 132       link=$(eval "echo \$${fn}_${opt}_link") |  | 
| 133       [ "$link" = "false" ] && continue |  | 
| 134       n="${n}x" |  | 
| 135     done |  | 
| 136     if [ "$n" = "x" ]; then |  | 
| 137       eval "${fn}_indirect=false" |  | 
| 138     else |  | 
| 139       eval "${fn}_indirect=true" |  | 
| 140     fi |  | 
| 141   done |  | 
| 142 } |  | 
| 143 |  | 
| 144 declare_function_pointers() { |  | 
| 145   for fn in $ALL_FUNCS; do |  | 
| 146     rtyp="$(eval "echo \$${fn}_rtyp")" |  | 
| 147     args="$(eval "echo \"\$${fn}_args\"")" |  | 
| 148     dfn="$(eval "echo \$${fn}_default")" |  | 
| 149     dfn=$(eval "echo \$${dfn}") |  | 
| 150     for opt in "$@"; do |  | 
| 151       ofn=$(eval "echo \$${fn}_${opt}") |  | 
| 152       [ -z "$ofn" ] && continue |  | 
| 153       echo "$rtyp ${ofn}($args);" |  | 
| 154     done |  | 
| 155     if [ "$(eval "echo \$${fn}_indirect")" = "false" ]; then |  | 
| 156       echo "#define ${fn} ${dfn}" |  | 
| 157     else |  | 
| 158       echo "RTCD_EXTERN $rtyp (*${fn})($args);" |  | 
| 159     fi |  | 
| 160     echo |  | 
| 161   done |  | 
| 162 } |  | 
| 163 |  | 
| 164 set_function_pointers() { |  | 
| 165   for fn in $ALL_FUNCS; do |  | 
| 166     n="" |  | 
| 167     rtyp="$(eval "echo \$${fn}_rtyp")" |  | 
| 168     args="$(eval "echo \"\$${fn}_args\"")" |  | 
| 169     dfn="$(eval "echo \$${fn}_default")" |  | 
| 170     dfn=$(eval "echo \$${dfn}") |  | 
| 171     if $(eval "echo \$${fn}_indirect"); then |  | 
| 172       echo "    $fn = $dfn;" |  | 
| 173       for opt in "$@"; do |  | 
| 174         ofn=$(eval "echo \$${fn}_${opt}") |  | 
| 175         [ -z "$ofn" ] && continue |  | 
| 176         [ "$ofn" = "$dfn" ] && continue; |  | 
| 177         link=$(eval "echo \$${fn}_${opt}_link") |  | 
| 178         [ "$link" = "false" ] && continue |  | 
| 179         cond="$(eval "echo \$have_${opt}")" |  | 
| 180         echo "    if (${cond}) $fn = $ofn;" |  | 
| 181       done |  | 
| 182     fi |  | 
| 183     echo |  | 
| 184   done |  | 
| 185 } |  | 
| 186 |  | 
| 187 filter() { |  | 
| 188   filtered="" |  | 
| 189   for opt in "$@"; do |  | 
| 190     [ -z $(eval "echo \$disable_${opt}") ] && filtered="$filtered $opt" |  | 
| 191   done |  | 
| 192   echo $filtered |  | 
| 193 } |  | 
| 194 |  | 
| 195 # |  | 
| 196 # Helper functions for generating the arch specific RTCD files |  | 
| 197 # |  | 
| 198 common_top() { |  | 
| 199   outfile_basename=$(basename ${symbol:-rtcd}) |  | 
| 200   include_guard=$(echo $outfile_basename | tr '[a-z]' '[A-Z]' | \ |  | 
| 201     tr -c '[A-Z0-9]' _)H_ |  | 
| 202   cat <<EOF |  | 
| 203 #ifndef ${include_guard} |  | 
| 204 #define ${include_guard} |  | 
| 205 |  | 
| 206 #ifdef RTCD_C |  | 
| 207 #define RTCD_EXTERN |  | 
| 208 #else |  | 
| 209 #define RTCD_EXTERN extern |  | 
| 210 #endif |  | 
| 211 |  | 
| 212 #ifdef __cplusplus |  | 
| 213 extern "C" { |  | 
| 214 #endif |  | 
| 215 |  | 
| 216 $(process_forward_decls) |  | 
| 217 |  | 
| 218 $(declare_function_pointers c $ALL_ARCHS) |  | 
| 219 |  | 
| 220 void ${symbol:-rtcd}(void); |  | 
| 221 EOF |  | 
| 222 } |  | 
| 223 |  | 
| 224 common_bottom() { |  | 
| 225   cat <<EOF |  | 
| 226 |  | 
| 227 #ifdef __cplusplus |  | 
| 228 }  // extern "C" |  | 
| 229 #endif |  | 
| 230 |  | 
| 231 #endif |  | 
| 232 EOF |  | 
| 233 } |  | 
| 234 |  | 
| 235 x86() { |  | 
| 236   determine_indirection c $ALL_ARCHS |  | 
| 237 |  | 
| 238   # Assign the helper variable for each enabled extension |  | 
| 239   for opt in $ALL_ARCHS; do |  | 
| 240     uc=$(echo $opt | tr '[a-z]' '[A-Z]') |  | 
| 241     eval "have_${opt}=\"flags & HAS_${uc}\"" |  | 
| 242   done |  | 
| 243 |  | 
| 244   cat <<EOF |  | 
| 245 $(common_top) |  | 
| 246 |  | 
| 247 #ifdef RTCD_C |  | 
| 248 #include "vpx_ports/x86.h" |  | 
| 249 static void setup_rtcd_internal(void) |  | 
| 250 { |  | 
| 251     int flags = x86_simd_caps(); |  | 
| 252 |  | 
| 253     (void)flags; |  | 
| 254 |  | 
| 255 $(set_function_pointers c $ALL_ARCHS) |  | 
| 256 } |  | 
| 257 #endif |  | 
| 258 $(common_bottom) |  | 
| 259 EOF |  | 
| 260 } |  | 
| 261 |  | 
| 262 arm() { |  | 
| 263   determine_indirection c $ALL_ARCHS |  | 
| 264 |  | 
| 265   # Assign the helper variable for each enabled extension |  | 
| 266   for opt in $ALL_ARCHS; do |  | 
| 267     uc=$(echo $opt | tr '[a-z]' '[A-Z]') |  | 
| 268     eval "have_${opt}=\"flags & HAS_${uc}\"" |  | 
| 269   done |  | 
| 270 |  | 
| 271   cat <<EOF |  | 
| 272 $(common_top) |  | 
| 273 #include "vpx_config.h" |  | 
| 274 |  | 
| 275 #ifdef RTCD_C |  | 
| 276 #include "vpx_ports/arm.h" |  | 
| 277 static void setup_rtcd_internal(void) |  | 
| 278 { |  | 
| 279     int flags = arm_cpu_caps(); |  | 
| 280 |  | 
| 281     (void)flags; |  | 
| 282 |  | 
| 283 $(set_function_pointers c $ALL_ARCHS) |  | 
| 284 } |  | 
| 285 #endif |  | 
| 286 $(common_bottom) |  | 
| 287 EOF |  | 
| 288 } |  | 
| 289 |  | 
| 290 |  | 
| 291 mips() { |  | 
| 292   determine_indirection c $ALL_ARCHS |  | 
| 293   cat <<EOF |  | 
| 294 $(common_top) |  | 
| 295 #include "vpx_config.h" |  | 
| 296 |  | 
| 297 #ifdef RTCD_C |  | 
| 298 static void setup_rtcd_internal(void) |  | 
| 299 { |  | 
| 300 $(set_function_pointers c $ALL_ARCHS) |  | 
| 301 #if HAVE_DSPR2 |  | 
| 302 #if CONFIG_VP8 |  | 
| 303 void dsputil_static_init(); |  | 
| 304 dsputil_static_init(); |  | 
| 305 #endif |  | 
| 306 #if CONFIG_VP9 |  | 
| 307 void vp9_dsputil_static_init(); |  | 
| 308 vp9_dsputil_static_init(); |  | 
| 309 #endif |  | 
| 310 #endif |  | 
| 311 } |  | 
| 312 #endif |  | 
| 313 $(common_bottom) |  | 
| 314 EOF |  | 
| 315 } |  | 
| 316 |  | 
| 317 unoptimized() { |  | 
| 318   determine_indirection c |  | 
| 319   cat <<EOF |  | 
| 320 $(common_top) |  | 
| 321 #include "vpx_config.h" |  | 
| 322 |  | 
| 323 #ifdef RTCD_C |  | 
| 324 static void setup_rtcd_internal(void) |  | 
| 325 { |  | 
| 326 $(set_function_pointers c) |  | 
| 327 } |  | 
| 328 #endif |  | 
| 329 $(common_bottom) |  | 
| 330 EOF |  | 
| 331 |  | 
| 332 } |  | 
| 333 # |  | 
| 334 # Main Driver |  | 
| 335 # |  | 
| 336 ALL_FUNCS=$(export LC_ALL=C; echo $ALL_FUNCS | tr ' ' '\n' | sort |tr '\n' ' ') |  | 
| 337 require c |  | 
| 338 case $arch in |  | 
| 339   x86) |  | 
| 340     ALL_ARCHS=$(filter mmx sse sse2 sse3 ssse3 sse4_1 avx avx2) |  | 
| 341     x86 |  | 
| 342     ;; |  | 
| 343   x86_64) |  | 
| 344     ALL_ARCHS=$(filter mmx sse sse2 sse3 ssse3 sse4_1 avx avx2) |  | 
| 345     REQUIRES=${REQUIRES:-mmx sse sse2} |  | 
| 346     require $(filter $REQUIRES) |  | 
| 347     x86 |  | 
| 348     ;; |  | 
| 349   mips32) |  | 
| 350     ALL_ARCHS=$(filter mips32) |  | 
| 351     dspr2=$([ -f "$config_file" ] && eval echo $(grep HAVE_DSPR2 "$config_file")
     ) |  | 
| 352     HAVE_DSPR2="${dspr2#*=}" |  | 
| 353     if [ "$HAVE_DSPR2" = "yes" ]; then |  | 
| 354         ALL_ARCHS=$(filter mips32 dspr2) |  | 
| 355     fi |  | 
| 356     mips |  | 
| 357     ;; |  | 
| 358   armv5te) |  | 
| 359     ALL_ARCHS=$(filter edsp) |  | 
| 360     arm |  | 
| 361     ;; |  | 
| 362   armv6) |  | 
| 363     ALL_ARCHS=$(filter edsp media) |  | 
| 364     arm |  | 
| 365     ;; |  | 
| 366   armv7) |  | 
| 367     ALL_ARCHS=$(filter edsp media neon) |  | 
| 368     arm |  | 
| 369     ;; |  | 
| 370   *) |  | 
| 371     unoptimized |  | 
| 372     ;; |  | 
| 373 esac |  | 
| OLD | NEW | 
|---|