set(GEMM_INSTANCES)
list(APPEND GEMM_INSTANCES device_gemm_xdl_f64_f64_f64_mk_kn_mn_instance.cpp
                           device_gemm_xdl_f64_f64_f64_mk_nk_mn_instance.cpp
                           device_gemm_xdl_f64_f64_f64_km_kn_mn_instance.cpp
                           device_gemm_xdl_f64_f64_f64_km_nk_mn_instance.cpp)

list(APPEND GEMM_INSTANCES device_gemm_xdl_f32_f32_f32_mk_kn_mn_instance.cpp
                           device_gemm_xdl_f32_f32_f32_mk_nk_mn_instance.cpp
                           device_gemm_xdl_f32_f32_f32_km_kn_mn_instance.cpp
                           device_gemm_xdl_f32_f32_f32_km_nk_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_f32_f32_f32_mk_kn_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_f32_f32_f32_mk_nk_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_f32_f32_f32_km_kn_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_f32_f32_f32_km_nk_mn_instance.cpp
                           device_gemm_dl_f32_f32_f32_mk_kn_mn_instance.cpp
                           device_gemm_dl_f32_f32_f32_mk_nk_mn_instance.cpp
                           device_gemm_dl_f32_f32_f32_km_kn_mn_instance.cpp
                           device_gemm_dl_f32_f32_f32_km_nk_mn_instance.cpp)

list(APPEND GEMM_INSTANCES device_gemm_dl_f16_f16_f16_mk_kn_mn_instance.cpp
                           device_gemm_dl_f16_f16_f16_mk_kn_mn_irregular_instance.cpp
                           device_gemm_dl_f16_f16_f16_mk_nk_mn_instance.cpp
                           device_gemm_dl_f16_f16_f16_mk_nk_mn_irregular_instance.cpp
                           device_gemm_dl_f16_f16_f16_km_kn_mn_instance.cpp
                           device_gemm_dl_f16_f16_f16_km_kn_mn_irregular_instance.cpp
                           device_gemm_dl_f16_f16_f16_km_nk_mn_instance.cpp
                           device_gemm_dl_f16_f16_f16_km_nk_mn_irregular_instance.cpp
                           device_gemm_dpp_f16_f16_f16_km_kn_mn_instance.cpp
                           device_gemm_dpp_f16_f16_f16_km_nk_mn_instance.cpp
                           device_gemm_dpp_f16_f16_f16_mk_kn_mn_instance.cpp
                           device_gemm_dpp_f16_f16_f16_mk_nk_mn_instance.cpp
                           device_gemm_dpp_f16_f16_f16_km_kn_mn_irregular_instance.cpp
                           device_gemm_dpp_f16_f16_f16_km_nk_mn_irregular_instance.cpp
                           device_gemm_dpp_f16_f16_f16_mk_kn_mn_irregular_instance.cpp
                           device_gemm_dpp_f16_f16_f16_mk_nk_mn_irregular_instance.cpp
                           device_gemm_xdl_c_shuffle_f16_f16_f16_mk_kn_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_f16_f16_f16_mk_nk_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_f16_f16_f16_km_kn_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_f16_f16_f16_km_nk_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_2_stage_f16_f16_f16_mk_nk_mn_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_kn_mn_add_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_kn_mn_default_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_kn_mn_default_pipeline_v2_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_kn_mn_default_pipeline_v2_opt_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_kn_mn_interwave_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_kn_mn_irregular_default_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_kn_mn_irregular_default_pipeline_v2_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_kn_mn_irregular_interwave_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_nk_mn_add_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_nk_mn_default_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_nk_mn_default_pipeline_v2_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_nk_mn_default_pipeline_v2_opt_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_nk_mn_interwave_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_nk_mn_irregular_default_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_nk_mn_irregular_default_pipeline_v2_instance.cpp
                           device_gemm_xdl_f16_f16_f16/km_nk_mn_irregular_interwave_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_kn_mn_add_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_kn_mn_default_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_kn_mn_default_pipeline_v2_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_kn_mn_default_pipeline_v2_opt_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_kn_mn_interwave_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_kn_mn_irregular_default_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_kn_mn_irregular_default_pipeline_v2_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_kn_mn_irregular_interwave_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_nk_mn_add_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_nk_mn_default_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_nk_mn_default_pipeline_v2_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_nk_mn_default_pipeline_v2_opt_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_nk_mn_interwave_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_nk_mn_irregular_default_pipeline_v1_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_nk_mn_irregular_default_pipeline_v2_instance.cpp
                           device_gemm_xdl_f16_f16_f16/mk_nk_mn_irregular_interwave_pipeline_v1_instance.cpp)

list(APPEND GEMM_INSTANCES device_gemm_dl_i8_i8_i8_mk_kn_mn_instance.cpp
                           device_gemm_dl_i8_i8_i8_mk_kn_mn_irregular_instance.cpp
                           device_gemm_dl_i8_i8_i8_mk_nk_mn_instance.cpp
                           device_gemm_dl_i8_i8_i8_mk_nk_mn_irregular_instance.cpp
                           device_gemm_dl_i8_i8_i8_km_kn_mn_instance.cpp
                           device_gemm_dl_i8_i8_i8_km_kn_mn_irregular_instance.cpp
                           device_gemm_dl_i8_i8_i8_km_nk_mn_instance.cpp
                           device_gemm_dl_i8_i8_i8_km_nk_mn_irregular_instance.cpp
                           device_gemm_xdl_c_shuffle_i8_i8_i8_mk_kn_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_i8_i8_i8_mk_nk_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_i8_i8_i8_km_kn_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_i8_i8_i8_km_nk_mn_instance.cpp)

list(APPEND GEMM_INSTANCES device_gemm_xdl_c_shuffle_bf16_bf16_bf16_mk_kn_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_bf16_bf16_bf16_mk_nk_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_bf16_bf16_bf16_km_kn_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_bf16_bf16_bf16_km_nk_mn_instance.cpp)

list(APPEND GEMM_INSTANCES device_gemm_xdl_c_shuffle_fp8_fp8_fp8_mk_kn_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_fp8_fp8_fp8_mk_nk_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_fp8_fp8_fp8_km_kn_mn_instance.cpp
                           device_gemm_xdl_c_shuffle_fp8_fp8_fp8_km_nk_mn_instance.cpp)

add_instance_library(device_gemm_instance ${GEMM_INSTANCES})

set(ENABLE_PIPELINE_V2_OPT OFF)

if (ENABLE_PIPELINE_V2_OPT)
    set(MAX_ILP_OPTS
       -mllvm
       -amdgpu-enable-max-ilp-scheduling-strategy
    )
    set(WAVES_PER_EU_DEFS
       CK_USE_WAVES_PER_EU=1
       CK_MIN_WAVES_PER_EU=1
       CK_MAX_WAVES_PER_EU=1
    )
    set(IGLP_OPT_DEFS
       CK_EXPERIMENTAL_PIPELINE_V2_IGLP_OPT=1
    )

    # layout=NT
    set_source_files_properties(device_gemm_xdl_f16_f16_f16/km_kn_mn_default_pipeline_v2_opt_instance.cpp PROPERTIES
       COMPILE_OPTIONS ";;"
       COMPILE_DEFINITIONS "${WAVES_PER_EU_DEFS};${IGLP_OPT_DEFS}")
    # layout=NN
    set_source_files_properties(device_gemm_xdl_f16_f16_f16/km_nk_mn_default_pipeline_v2_opt_instance.cpp PROPERTIES
       COMPILE_OPTIONS "${MAX_ILP_OPTS}"
       COMPILE_DEFINITIONS "${WAVES_PER_EU_DEFS};${IGLP_OPT_DEFS}")
    # layout=TT
    set_source_files_properties(device_gemm_xdl_f16_f16_f16/mk_kn_mn_default_pipeline_v2_opt_instance.cpp PROPERTIES
       COMPILE_OPTIONS ";;"
       COMPILE_DEFINITIONS "${WAVES_PER_EU_DEFS};${IGLP_OPT_DEFS}")
    # layout=TN
    set_source_files_properties(device_gemm_xdl_f16_f16_f16/mk_nk_mn_default_pipeline_v2_opt_instance.cpp PROPERTIES
       COMPILE_OPTIONS "${MAX_ILP_OPTS}"
       COMPILE_DEFINITIONS "${WAVES_PER_EU_DEFS};${IGLP_OPT_DEFS}")
endif(ENABLE_PIPELINE_V2_OPT)

