1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009 Nicolai Haehnle.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Tom Stellard <tstellar@gmail.com>
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a copy of this software and associated documentation files (the
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sublicense, and/or sell copies of the Software, and to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * portions of the Software.
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef RADEON_DATAFLOW_H
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RADEON_DATAFLOW_H
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_program_constants.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct radeon_compiler;
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_instruction;
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_swizzle_caps;
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_src_register;
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_pair_instruction_arg;
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_pair_instruction_source;
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_pair_sub_instruction;
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_compiler;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Help analyze and modify the register accesses of instructions.
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (*rc_read_write_chan_fn)(void * userdata, struct rc_instruction * inst,
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			rc_register_file file, unsigned int index, unsigned int chan);
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_for_all_reads_chan(struct rc_instruction * inst, rc_read_write_chan_fn cb, void * userdata);
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_for_all_writes_chan(struct rc_instruction * inst, rc_read_write_chan_fn cb, void * userdata);
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (*rc_read_write_mask_fn)(void * userdata, struct rc_instruction * inst,
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			rc_register_file file, unsigned int index, unsigned int mask);
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_for_all_reads_mask(struct rc_instruction * inst, rc_read_write_mask_fn cb, void * userdata);
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_for_all_writes_mask(struct rc_instruction * inst, rc_read_write_mask_fn cb, void * userdata);
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (*rc_read_src_fn)(void * userdata, struct rc_instruction * inst,
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct rc_src_register * src);
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_for_all_reads_src(struct rc_instruction * inst, rc_read_src_fn cb,
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			void * userdata);
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (*rc_pair_read_arg_fn)(void * userdata,
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_instruction * inst, struct rc_pair_instruction_arg * arg,
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_pair_instruction_source * src);
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_pair_for_all_reads_arg(struct rc_instruction * inst,
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					rc_pair_read_arg_fn cb, void * userdata);
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (*rc_remap_register_fn)(void * userdata, struct rc_instruction * inst,
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			rc_register_file * pfile, unsigned int * pindex);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_remap_registers(struct rc_instruction * inst, rc_remap_register_fn cb, void * userdata);
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_reader {
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_instruction * Inst;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int WriteMask;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	union {
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct {
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct rc_src_register * Src;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} I;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct {
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct rc_pair_instruction_arg * Arg;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct rc_pair_instruction_source * Src;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} P;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} U;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_reader_data {
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int Abort;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int AbortOnRead;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int AbortOnWrite;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int LoopDepth;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int InElse;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_instruction * Writer;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int ReaderCount;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int ReadersReserved;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_reader * Readers;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* If this flag is enabled, rc_get_readers will exit as soon possbile
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * after the Abort flag is set.*/
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int ExitOnAbort;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	void * CbData;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_get_readers(
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_compiler * c,
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_instruction * writer,
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_reader_data * data,
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rc_read_src_fn read_normal_cb,
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rc_pair_read_arg_fn read_pair_cb,
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rc_read_write_mask_fn write_cb);
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_get_readers_sub(
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_compiler * c,
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_instruction * writer,
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_pair_sub_instruction * sub_writer,
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_reader_data * data,
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rc_read_src_fn read_normal_cb,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rc_pair_read_arg_fn read_pair_cb,
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rc_read_write_mask_fn write_cb);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compiler passes based on dataflow analysis.
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (*rc_dataflow_mark_outputs_fn)(void * userdata, void * data,
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			void (*mark_fn)(void * data, unsigned int index, unsigned int mask));
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_dataflow_deadcode(struct radeon_compiler * c, void *user);
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_dataflow_swizzles(struct radeon_compiler * c, void *user);
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_optimize(struct radeon_compiler * c, void *user);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_inline_literals(struct radeon_compiler *c, void *user);
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* RADEON_DATAFLOW_H */
136