2018-11-10 17:05:59 +00:00
|
|
|
# Copyright © 2018 Rob Clark
|
|
|
|
|
|
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
|
|
# in the Software without restriction, including without limitation the rights
|
|
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
# copies of the Software, and to permit persons to whom the Software is
|
|
|
|
# furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
# The above copyright notice and this permission notice shall be included in
|
|
|
|
# all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
# SOFTWARE.
|
|
|
|
|
|
|
|
ir3_nir_trig_c = custom_target(
|
|
|
|
'ir3_nir_trig.c',
|
|
|
|
input : 'ir3_nir_trig.py',
|
|
|
|
output : 'ir3_nir_trig.c',
|
|
|
|
command : [
|
|
|
|
prog_python, '@INPUT@',
|
|
|
|
'-p', join_paths(meson.source_root(), 'src/compiler/nir/'),
|
|
|
|
],
|
|
|
|
capture : true,
|
|
|
|
depend_files : nir_algebraic_py,
|
|
|
|
)
|
|
|
|
|
ir3/nir: Add new NIR AlgebraicPass for lowering imul
Currently, ir3 backend compiler is lowering integer multiplication from:
dst = a * b
to:
dst = (al * bl) + (ah * bl << 16) + (al * bh << 16)
by emitting this code:
mull.u tmp0, a, b ; mul low, i.e. al * bl
madsh.m16 tmp1, a, b, tmp0 ; mul-add shift high mix, i.e. ah * bl << 16
madsh.m16 dst, b, a, tmp1 ; i.e. al * bh << 16
which at that point has very low chances of being optimized.
This patch adds a new nir_algebraic.AlgebraicPass to performs this
lowering during NIR algebraic optimization passes, giving it a better
chance for optimizing the resulting code.
Reviewed-by: Eric Anholt <eric@anholt.net>
2019-05-12 23:23:58 +01:00
|
|
|
ir3_nir_imul_c = custom_target(
|
|
|
|
'ir3_nir_imul.c',
|
|
|
|
input : 'ir3_nir_imul.py',
|
|
|
|
output : 'ir3_nir_imul.c',
|
|
|
|
command : [
|
|
|
|
prog_python, '@INPUT@',
|
|
|
|
'-p', join_paths(meson.source_root(), 'src/compiler/nir/'),
|
|
|
|
],
|
|
|
|
capture : true,
|
|
|
|
depend_files : nir_algebraic_py,
|
|
|
|
)
|
|
|
|
|
2018-11-10 17:05:59 +00:00
|
|
|
libfreedreno_ir3_files = files(
|
|
|
|
'disasm-a3xx.c',
|
|
|
|
'instr-a3xx.h',
|
|
|
|
'ir3.c',
|
2018-11-14 20:20:13 +00:00
|
|
|
'ir3_a4xx.c',
|
2018-11-14 20:49:49 +00:00
|
|
|
'ir3_a6xx.c',
|
2018-11-10 17:05:59 +00:00
|
|
|
'ir3_compiler_nir.c',
|
|
|
|
'ir3_compiler.c',
|
|
|
|
'ir3_compiler.h',
|
2018-11-08 19:50:56 +00:00
|
|
|
'ir3_context.c',
|
|
|
|
'ir3_context.h',
|
2018-11-10 17:05:59 +00:00
|
|
|
'ir3_cp.c',
|
2019-12-18 19:10:12 +00:00
|
|
|
'ir3_delay.c',
|
2018-11-10 17:05:59 +00:00
|
|
|
'ir3_depth.c',
|
|
|
|
'ir3_group.c',
|
2018-11-14 19:54:44 +00:00
|
|
|
'ir3_image.c',
|
|
|
|
'ir3_image.h',
|
2018-11-10 17:05:59 +00:00
|
|
|
'ir3.h',
|
|
|
|
'ir3_legalize.c',
|
|
|
|
'ir3_nir.c',
|
|
|
|
'ir3_nir.h',
|
2019-03-26 17:31:54 +00:00
|
|
|
'ir3_nir_analyze_ubo_ranges.c',
|
2019-04-19 19:12:34 +01:00
|
|
|
'ir3_nir_lower_load_barycentric_at_sample.c',
|
2019-04-19 19:15:40 +01:00
|
|
|
'ir3_nir_lower_load_barycentric_at_offset.c',
|
2019-01-13 19:10:34 +00:00
|
|
|
'ir3_nir_lower_io_offsets.c',
|
2019-10-11 01:17:10 +01:00
|
|
|
'ir3_nir_lower_tess.c',
|
2019-08-05 07:09:23 +01:00
|
|
|
'ir3_nir_lower_tex_prefetch.c',
|
2018-11-10 17:05:59 +00:00
|
|
|
'ir3_nir_lower_tg4_to_tex.c',
|
2019-03-26 15:28:34 +00:00
|
|
|
'ir3_nir_move_varying_inputs.c',
|
2018-11-10 17:05:59 +00:00
|
|
|
'ir3_print.c',
|
|
|
|
'ir3_ra.c',
|
|
|
|
'ir3_sched.c',
|
|
|
|
'ir3_shader.c',
|
|
|
|
'ir3_shader.h',
|
2018-11-24 17:18:08 +00:00
|
|
|
'ir3_sun.c',
|
2018-11-10 17:05:59 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
libfreedreno_ir3 = static_library(
|
|
|
|
'freedreno_ir3',
|
ir3/nir: Add new NIR AlgebraicPass for lowering imul
Currently, ir3 backend compiler is lowering integer multiplication from:
dst = a * b
to:
dst = (al * bl) + (ah * bl << 16) + (al * bh << 16)
by emitting this code:
mull.u tmp0, a, b ; mul low, i.e. al * bl
madsh.m16 tmp1, a, b, tmp0 ; mul-add shift high mix, i.e. ah * bl << 16
madsh.m16 dst, b, a, tmp1 ; i.e. al * bh << 16
which at that point has very low chances of being optimized.
This patch adds a new nir_algebraic.AlgebraicPass to performs this
lowering during NIR algebraic optimization passes, giving it a better
chance for optimizing the resulting code.
Reviewed-by: Eric Anholt <eric@anholt.net>
2019-05-12 23:23:58 +01:00
|
|
|
[libfreedreno_ir3_files, ir3_nir_trig_c, ir3_nir_imul_c],
|
2018-11-10 17:05:59 +00:00
|
|
|
include_directories : [inc_freedreno, inc_common],
|
|
|
|
c_args : [c_vis_args, no_override_init_args],
|
|
|
|
cpp_args : [cpp_vis_args],
|
|
|
|
dependencies : idep_nir_headers,
|
|
|
|
build_by_default : false,
|
|
|
|
)
|
|
|
|
|