192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri/**************************************************************************
292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Copyright 2010 Luca Barbieri
492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Permission is hereby granted, free of charge, to any person obtaining
692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * a copy of this software and associated documentation files (the
792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * "Software"), to deal in the Software without restriction, including
892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * without limitation the rights to use, copy, modify, merge, publish,
992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * distribute, sublicense, and/or sell copies of the Software, and to
1092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * permit persons to whom the Software is furnished to do so, subject to
1192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * the following conditions:
1292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
1392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * The above copyright notice and this permission notice (including the
1492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * next paragraph) shall be included in all copies or substantial
1592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * portions of the Software.
1692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
1792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
2192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
2292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
2392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
2592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri **************************************************************************/
2692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
27e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#include "sm4.h"
2892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
29e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri// TODO: we should fix this to output the same syntax as fxc, if sm4_dump_short_syntax is set
3092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
31e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieribool sm4_dump_short_syntax = true;
3292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
33e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristd::ostream& operator <<(std::ostream& out, const sm4_op& op)
3492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
3592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	if(op.neg)
3692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << '-';
3792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	if(op.abs)
3892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << '|';
39e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	if(op.file == SM4_FILE_IMMEDIATE32)
4092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
4192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << "l(";
4292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < op.comps; ++i)
4392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
4492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(i)
4592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				out << ", ";
4692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			out << op.imm_values[i].f32;
4792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
4892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << ")";
4992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
50e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	else if(op.file == SM4_FILE_IMMEDIATE64)
5192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
5292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << "d(";
5392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < op.comps; ++i)
5492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
5592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(i)
5692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				out << ", ";
5792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			out << op.imm_values[i].f64;
5892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
5992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << ")";
6092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return out;
6192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
6292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	else
6392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
6492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		bool naked = false;
65e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		if(sm4_dump_short_syntax)
6692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
6792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			switch(op.file)
6892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
69e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_FILE_TEMP:
70e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_FILE_INPUT:
71e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_FILE_OUTPUT:
72e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_FILE_CONSTANT_BUFFER:
73e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_FILE_INDEXABLE_TEMP:
74e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_FILE_UNORDERED_ACCESS_VIEW:
75e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_FILE_THREAD_GROUP_SHARED_MEMORY:
7692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				naked = true;
7792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
7892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			default:
7992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				naked = false;
8092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
8192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
8292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
8392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
84e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		out << (sm4_dump_short_syntax ? sm4_shortfile_names : sm4_file_names)[op.file];
8592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
8692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(op.indices[0].reg.get())
8792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			naked = false;
8892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
8992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < op.num_indices; ++i)
9092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
9192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(!naked || i)
9292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				out << '[';
9392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(op.indices[i].reg.get())
9492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
9592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				out << *op.indices[i].reg;
9692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(op.indices[i].disp)
9792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					out << '+' << op.indices[i].disp;
9892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
9992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			else
10092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				out << op.indices[i].disp;
10192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(!naked || i)
10292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				out << ']';
10392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
10492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(op.comps)
10592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
10692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			switch(op.mode)
10792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
108e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPERAND_MODE_MASK:
109e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				out << (sm4_dump_short_syntax ? '.' : '!');
11092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				for(unsigned i = 0; i < op.comps; ++i)
11192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
11292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					if(op.mask & (1 << i))
11392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri						out << "xyzw"[i];
11492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
11592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
116e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPERAND_MODE_SWIZZLE:
11792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				out << '.';
11892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				for(unsigned i = 0; i < op.comps; ++i)
11992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					out << "xyzw"[op.swizzle[i]];
12092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
121e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri			case SM4_OPERAND_MODE_SCALAR:
122e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri				out << (sm4_dump_short_syntax ? '.' : ':');
12392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				out << "xyzw"[op.swizzle[0]];
12492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
12592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
12692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
12792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
12892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	if(op.abs)
12992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << '|';
13092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	return out;
13192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
13292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
133e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristd::ostream& operator <<(std::ostream& out, const sm4_dcl& dcl)
13492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
135e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	out << sm4_opcode_names[dcl.opcode];
13692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	switch(dcl.opcode)
13792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
138e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_GLOBAL_FLAGS:
13992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(dcl.dcl_global_flags.allow_refactoring)
14092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			out << " refactoringAllowed";
14192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(dcl.dcl_global_flags.early_depth_stencil)
14292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			out << " forceEarlyDepthStencil";
14392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(dcl.dcl_global_flags.fp64)
14492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			out << " enableDoublePrecisionFloatOps";
14592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(dcl.dcl_global_flags.enable_raw_and_structured_in_non_cs)
14692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			out << " enableRawAndStructuredBuffers";
14792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		break;
148e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_INPUT_PS:
149e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_INPUT_PS_SIV:
150e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_INPUT_PS_SGV:
151e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		out << ' ' << sm4_interpolation_names[dcl.dcl_input_ps.interpolation];
15292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		break;
153e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_TEMPS:
15492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << ' ' << dcl.num;
15592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		break;
15692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	default:
15792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		break;
15892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
15992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	if(dcl.op.get())
16092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << ' ' << *dcl.op;
16192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	switch(dcl.opcode)
16292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
163e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_CONSTANT_BUFFER:
16492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << ", " << (dcl.dcl_constant_buffer.dynamic ? "dynamicIndexed" : "immediateIndexed");
16592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		break;
166e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_INPUT_SIV:
167e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_INPUT_SGV:
168e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_OUTPUT_SIV:
169e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_OUTPUT_SGV:
170e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_INPUT_PS_SIV:
171e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	case SM4_OPCODE_DCL_INPUT_PS_SGV:
172e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri		out << ", " << sm4_sv_names[dcl.num];
17392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		break;
17492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
17592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
17692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	return out;
17792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
17892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
179e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristd::ostream& operator <<(std::ostream& out, const sm4_insn& insn)
18092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
181e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri	out << sm4_opcode_names[insn.opcode];
18292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	if(insn.insn.sat)
18392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << "_sat";
18492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	for(unsigned i = 0; i < insn.num_ops; ++i)
18592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
18692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(i)
18792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			out << ',';
18892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << ' ' << *insn.ops[i];
18992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
19092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	return out;
19192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
19292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
193e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristd::ostream& operator <<(std::ostream& out, const sm4_program& program)
19492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
19592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	out << "pvghdc"[program.version.type] << "s_" << program.version.major << "_" << program.version.minor << "\n";
19692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	for(unsigned i = 0; i < program.dcls.size(); ++i)
19792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << *program.dcls[i] << "\n";
19892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
19992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	for(unsigned i = 0; i < program.insns.size(); ++i)
20092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		out << *program.insns[i] << "\n";
20192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	return out;
20292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
20392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
204e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbierivoid sm4_op::dump()
20592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
20692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::cout << *this;
20792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
20892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
209e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbierivoid sm4_insn::dump()
21092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
21192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::cout << *this;
21292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
21392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
214e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbierivoid sm4_dcl::dump()
21592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
21692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::cout << *this;
21792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
21892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
219e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbierivoid sm4_program::dump()
22092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
22192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::cout << *this;
22292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
223