Home | History | Annotate | Download | only in libvpx
      1 # Rules to generate assembly.
      2 # Input variables:
      3 #   libvpx_2nd_arch
      4 #   libvpx_source_dir
      5 #   libvpx_config_dir_<arch>
      6 #   libvpx_codec_srcs_asm_<arch>
      7 #
      8 # Output variables:
      9 #   LOCAL_GENERATED_SOURCES_<arch>
     10 #   LOCAL_C_INCLUDES_<arch>
     11 #
     12 
     13 # ARM and x86 use an 'offsets' file in the assembly. It is generated by
     14 # tricking the compiler and generating non-functional output which is then
     15 # processed with grep. For ARM, this must be additionally converted from
     16 # RVCT (ARM's in-house compiler) format to GNU Assembler Format for gcc.
     17 
     18 # Offset files are currently used in vpx_scale for NEON and some encoder
     19 # functions used in both ARM and x86. These files can not be compiled and need
     20 # to be named accordingly to avoid auto-build rules. The encoder files are not
     21 # used yet but are included in the comments for future reference.
     22 
     23 libvpx_asm_offsets_intermediates := \
     24     vp8/encoder/vp8_asm_enc_offsets.intermediate \
     25     vpx_scale/vpx_scale_asm_offsets.intermediate \
     26 
     27 libvpx_asm_offsets_files := \
     28     vp8/encoder/vp8_asm_enc_offsets.asm \
     29     vpx_scale/vpx_scale_asm_offsets.asm \
     30 
     31 libvpx_intermediates := $(call local-intermediates-dir,,$(libvpx_2nd_arch))
     32 # Build the S files with inline assembly.
     33 COMPILE_TO_S := $(addprefix $(libvpx_intermediates)/, $(libvpx_asm_offsets_intermediates))
     34 $(COMPILE_TO_S) : PRIVATE_2ND_ARCH := $(libvpx_2nd_arch)
     35 $(COMPILE_TO_S) : PRIVATE_INTERMEDIATES := $(libvpx_intermediates)
     36 $(COMPILE_TO_S) : PRIVATE_SOURCE_DIR := $(libvpx_source_dir)
     37 $(COMPILE_TO_S) : PRIVATE_CONFIG_DIR := $(libvpx_config_dir_$(TARGET_$(libvpx_2nd_arch)ARCH))
     38 $(COMPILE_TO_S) : PRIVATE_CUSTOM_TOOL = $($(PRIVATE_2ND_ARCH)TARGET_CC) -S $(addprefix -I, $($(PRIVATE_2ND_ARCH)TARGET_C_INCLUDES)) -I $(PRIVATE_INTERMEDIATES) -I $(PRIVATE_SOURCE_DIR) -I $(PRIVATE_CONFIG_DIR) -DINLINE_ASM -o $@ $<
     39 $(COMPILE_TO_S) : $(libvpx_intermediates)/%.intermediate : $(libvpx_source_dir)/%.c
     40 	$(transform-generated-source)
     41 
     42 # Extract the offsets from the inline assembly.
     43 OFFSETS_GEN := $(addprefix $(libvpx_intermediates)/, $(libvpx_asm_offsets_files))
     44 $(OFFSETS_GEN) : PRIVATE_OFFSET_PATTERN := '^[a-zA-Z0-9_]* EQU'
     45 $(OFFSETS_GEN) : PRIVATE_SOURCE_DIR := $(libvpx_source_dir)
     46 $(OFFSETS_GEN) : PRIVATE_CUSTOM_TOOL = grep $(PRIVATE_OFFSET_PATTERN) $< | tr -d '$$\#' | perl $(PRIVATE_SOURCE_DIR)/build/make/ads2gas.pl > $@
     47 $(OFFSETS_GEN) : %.asm : %.intermediate
     48 	$(transform-generated-source)
     49 
     50 LOCAL_GENERATED_SOURCES_$(TARGET_$(libvpx_2nd_arch)ARCH) += $(OFFSETS_GEN)
     51 
     52 ifneq ($(strip $(libvpx_codec_srcs_asm_$(TARGET_$(libvpx_2nd_arch)ARCH))),)
     53 # This step is only required for ARM. MIPS uses intrinsics and x86 requires an
     54 # assembler to pre-process its assembly files.
     55 # The ARM assembly sources must be converted from ADS to GAS compatible format.
     56 VPX_GEN := $(addprefix $(libvpx_intermediates)/, $(libvpx_codec_srcs_asm_$(TARGET_$(libvpx_2nd_arch)ARCH)))
     57 $(VPX_GEN) : PRIVATE_SOURCE_DIR := $(libvpx_source_dir)
     58 $(VPX_GEN) : PRIVATE_CUSTOM_TOOL = cat $< | perl $(PRIVATE_SOURCE_DIR)/build/make/ads2gas.pl > $@
     59 $(VPX_GEN) : $(libvpx_intermediates)/%.s : $(libvpx_source_dir)/%
     60 	$(transform-generated-source)
     61 
     62 LOCAL_GENERATED_SOURCES_$(TARGET_$(libvpx_2nd_arch)ARCH) += $(VPX_GEN)
     63 endif
     64 
     65 LOCAL_C_INCLUDES_$(TARGET_$(libvpx_2nd_arch)ARCH) += \
     66     $(libvpx_intermediates)/vp8/common \
     67     $(libvpx_intermediates)/vp8/decoder \
     68     $(libvpx_intermediates)/vp8/encoder \
     69     $(libvpx_intermediates)/vpx_scale
     70