177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Library Utility Functions
277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#
377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# This should be included following 'lib_info.mk'.
477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: GetCNAVar variable-name platform-key config arch
677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#
777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Get a per-config-and-arch variable value.
877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoGetCNAVar = $(strip \
977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(or $($(2).$(1).$(3).$(4)), \
1077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $($(2).$(1).$(3)), \
1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $($(2).$(1).$(4)), \
1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $($(2).$(1))))
1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: SelectFunctionDir config arch function-name optimized
1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#
1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Choose the appropriate implementation directory to use for 'function-name' in
1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# the configuration 'config' and on given arch.
1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoSelectFunctionDir = $(strip \
1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(call Set,Tmp.SelectFunctionDir,$(call SelectFunctionDirs,$(1),$(2),$(3),$(4)))\
2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(if $(call streq,1,$(words $(Tmp.SelectFunctionDir))),\
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(Tmp.SelectFunctionDir),\
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(error SelectFunctionDir: invalid function name "$(3)" ($(strip\
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao               $(if $(call streq,0,$(words $(Tmp.SelectFunctionDir))),\
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                    no such function,\
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                    function implemented in multiple directories!!!))))))
2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Helper functions that select the entire list of subdirs where a function is
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# defined with a certain specificity.
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoSelectFunctionDirs_Opt_ConfigAndArch = $(strip \
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(foreach key,$(AvailableIn.$(3)),\
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    $(if $(and $(call streq,Optimized,$($(key).Implementation)),\
3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao               $(call contains,$($(key).OnlyConfigs),$(1)),\
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao               $(call contains,$($(key).OnlyArchs),$(2))),$(key),)))
3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoSelectFunctionDirs_Opt_Config = $(strip \
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(foreach key,$(AvailableIn.$(3)),\
3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    $(if $(and $(call streq,Optimized,$($(key).Implementation)),\
3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao               $(call contains,$($(key).OnlyConfigs),$(1))),$(key),)))
3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoSelectFunctionDirs_Opt_Arch = $(strip \
3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(foreach key,$(AvailableIn.$(3)),\
4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    $(if $(and $(call streq,Optimized,$($(key).Implementation)),\
4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao               $(call contains,$($(key).OnlyArchs),$(2))),$(key),)))
4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoSelectFunctionDirs_Gen = $(strip \
4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(foreach key,$(AvailableIn.$(3)),\
4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    $(if $(call streq,Generic,$($(key).Implementation)),$(key))))
4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Helper function to select the right set of dirs in generic priority order.
4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoSelectFunctions_Gen = \
4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(or $(call SelectFunctionDirs_Gen,$(1),$(2),$(3)),\
4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(call SelectFunctionDirs_Opt_ConfigAndArch,$(1),$(2),$(3)), \
5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(call SelectFunctionDirs_Opt_Config,$(1),$(2),$(3)), \
5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(call SelectFunctionDirs_Opt_Arch,$(1),$(2),$(3)))
5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Helper function to select the right set of dirs in optimized priority order.
5477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoSelectFunctions_Opt = \
5577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(or $(call SelectFunctionDirs_Opt_ConfigAndArch,$(1),$(2),$(3)), \
5677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(call SelectFunctionDirs_Opt_Config,$(1),$(2),$(3)), \
5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(call SelectFunctionDirs_Opt_Arch,$(1),$(2),$(3)), \
5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(call SelectFunctionDirs_Gen,$(1),$(2),$(3)))
5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Helper function to select the right set of dirs (which should be exactly one)
6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# for a function.
6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoSelectFunctionDirs = \
6377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao  $(if $(call streq,1,$(4)),\
6477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(call SelectFunctions_Opt,$(1),$(2),$(3)),\
6577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       $(call SelectFunctions_Gen,$(1),$(2),$(3)))
66