1599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt/*
2599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * Copyright © 2012 Intel Corporation
3599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt *
4599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
5599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * copy of this software and associated documentation files (the "Software"),
6599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * to deal in the Software without restriction, including without limitation
7599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * and/or sell copies of the Software, and to permit persons to whom the
9599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * Software is furnished to do so, subject to the following conditions:
10599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt *
11599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * The above copyright notice and this permission notice (including the next
12599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * paragraph) shall be included in all copies or substantial portions of the
13599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * Software.
14599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt *
15599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt * IN THE SOFTWARE.
22599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt */
23599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
24599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt#include "ir_builder.h"
25b782352745d322596a9122969f5c0e57ea032c1bEric Anholt#include "program/prog_instruction.h"
26599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
27599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholtusing namespace ir_builder;
28599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
29599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholtnamespace ir_builder {
30599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
317e88f8ce8f9d72bbda248554e0630b4aca7e1154Eric Anholtvoid
327e88f8ce8f9d72bbda248554e0630b4aca7e1154Eric Anholtir_factory::emit(ir_instruction *ir)
337e88f8ce8f9d72bbda248554e0630b4aca7e1154Eric Anholt{
347e88f8ce8f9d72bbda248554e0630b4aca7e1154Eric Anholt   instructions->push_tail(ir);
357e88f8ce8f9d72bbda248554e0630b4aca7e1154Eric Anholt}
367e88f8ce8f9d72bbda248554e0630b4aca7e1154Eric Anholt
378bb0091e6838aeee2a5819850c334fde71b5a439Eric Anholtir_variable *
388bb0091e6838aeee2a5819850c334fde71b5a439Eric Anholtir_factory::make_temp(const glsl_type *type, const char *name)
398bb0091e6838aeee2a5819850c334fde71b5a439Eric Anholt{
408bb0091e6838aeee2a5819850c334fde71b5a439Eric Anholt   ir_variable *var;
418bb0091e6838aeee2a5819850c334fde71b5a439Eric Anholt
428bb0091e6838aeee2a5819850c334fde71b5a439Eric Anholt   var = new(mem_ctx) ir_variable(type, name, ir_var_temporary);
438bb0091e6838aeee2a5819850c334fde71b5a439Eric Anholt   emit(var);
448bb0091e6838aeee2a5819850c334fde71b5a439Eric Anholt
458bb0091e6838aeee2a5819850c334fde71b5a439Eric Anholt   return var;
468bb0091e6838aeee2a5819850c334fde71b5a439Eric Anholt}
478bb0091e6838aeee2a5819850c334fde71b5a439Eric Anholt
48d32780d5041a6d241834fe565739104f86300425Eric Anholtir_assignment *
49d32780d5041a6d241834fe565739104f86300425Eric Anholtassign(deref lhs, operand rhs, int writemask)
50d32780d5041a6d241834fe565739104f86300425Eric Anholt{
51d32780d5041a6d241834fe565739104f86300425Eric Anholt   void *mem_ctx = ralloc_parent(lhs.val);
52d32780d5041a6d241834fe565739104f86300425Eric Anholt
53d32780d5041a6d241834fe565739104f86300425Eric Anholt   ir_assignment *assign = new(mem_ctx) ir_assignment(lhs.val,
54d32780d5041a6d241834fe565739104f86300425Eric Anholt						      rhs.val,
55d32780d5041a6d241834fe565739104f86300425Eric Anholt						      NULL, writemask);
56d32780d5041a6d241834fe565739104f86300425Eric Anholt
57d32780d5041a6d241834fe565739104f86300425Eric Anholt   return assign;
58d32780d5041a6d241834fe565739104f86300425Eric Anholt}
59d32780d5041a6d241834fe565739104f86300425Eric Anholt
60d32780d5041a6d241834fe565739104f86300425Eric Anholtir_assignment *
61d32780d5041a6d241834fe565739104f86300425Eric Anholtassign(deref lhs, operand rhs)
62d32780d5041a6d241834fe565739104f86300425Eric Anholt{
63d32780d5041a6d241834fe565739104f86300425Eric Anholt   return assign(lhs, rhs, (1 << lhs.val->type->vector_elements) - 1);
64d32780d5041a6d241834fe565739104f86300425Eric Anholt}
65d32780d5041a6d241834fe565739104f86300425Eric Anholt
66b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
67b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle(operand a, int swizzle, int components)
68b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
69b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   void *mem_ctx = ralloc_parent(a.val);
70b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
71b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return new(mem_ctx) ir_swizzle(a.val,
72b782352745d322596a9122969f5c0e57ea032c1bEric Anholt				  GET_SWZ(swizzle, 0),
73b782352745d322596a9122969f5c0e57ea032c1bEric Anholt				  GET_SWZ(swizzle, 1),
74b782352745d322596a9122969f5c0e57ea032c1bEric Anholt				  GET_SWZ(swizzle, 2),
75b782352745d322596a9122969f5c0e57ea032c1bEric Anholt				  GET_SWZ(swizzle, 3),
76b782352745d322596a9122969f5c0e57ea032c1bEric Anholt				  components);
77b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
78b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
79b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
80d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunkeswizzle_for_size(operand a, int components)
81d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke{
82d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke   void *mem_ctx = ralloc_parent(a.val);
83d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke
84d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke   if (a.val->type->vector_elements < components)
85d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke      components = a.val->type->vector_elements;
86d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke
87d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke   unsigned s[4] = { 0, 1, 2, 3 };
88d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke   for (int i = components; i < 4; i++)
89d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke      s[i] = components - 1;
90d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke
91d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke   return new(mem_ctx) ir_swizzle(a.val, s, components);
92d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke}
93d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunke
94d9da350a8334201400a43d105b92fce2bd6a5f32Kenneth Graunkeir_swizzle *
95b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle_xxxx(operand a)
96b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
97b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return swizzle(a, SWIZZLE_XXXX, 4);
98b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
99b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
100b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
101b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle_yyyy(operand a)
102b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
103b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return swizzle(a, SWIZZLE_YYYY, 4);
104b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
105b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
106b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
107b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle_zzzz(operand a)
108b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
109b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return swizzle(a, SWIZZLE_ZZZZ, 4);
110b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
111b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
112b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
113b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle_wwww(operand a)
114b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
115b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return swizzle(a, SWIZZLE_WWWW, 4);
116b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
117b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
118b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
119b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle_x(operand a)
120b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
121b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return swizzle(a, SWIZZLE_XXXX, 1);
122b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
123b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
124b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
125b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle_y(operand a)
126b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
127b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return swizzle(a, SWIZZLE_YYYY, 1);
128b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
129b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
130b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
131b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle_z(operand a)
132b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
133b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return swizzle(a, SWIZZLE_ZZZZ, 1);
134b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
135b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
136b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
137b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle_w(operand a)
138b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
139b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return swizzle(a, SWIZZLE_WWWW, 1);
140b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
141b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
142b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
143b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle_xy(operand a)
144b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
145b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return swizzle(a, SWIZZLE_XYZW, 2);
146b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
147b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
148b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
149b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle_xyz(operand a)
150b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
151b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return swizzle(a, SWIZZLE_XYZW, 3);
152b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
153b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
154b782352745d322596a9122969f5c0e57ea032c1bEric Anholtir_swizzle *
155b782352745d322596a9122969f5c0e57ea032c1bEric Anholtswizzle_xyzw(operand a)
156b782352745d322596a9122969f5c0e57ea032c1bEric Anholt{
157b782352745d322596a9122969f5c0e57ea032c1bEric Anholt   return swizzle(a, SWIZZLE_XYZW, 4);
158b782352745d322596a9122969f5c0e57ea032c1bEric Anholt}
159b782352745d322596a9122969f5c0e57ea032c1bEric Anholt
160599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholtir_expression *
1610bb3d4ba54f98f4d45abe598dabc905f08055cd5Kenneth Graunkeexpr(ir_expression_operation op, operand a)
1620bb3d4ba54f98f4d45abe598dabc905f08055cd5Kenneth Graunke{
1630bb3d4ba54f98f4d45abe598dabc905f08055cd5Kenneth Graunke   void *mem_ctx = ralloc_parent(a.val);
1640bb3d4ba54f98f4d45abe598dabc905f08055cd5Kenneth Graunke
1650bb3d4ba54f98f4d45abe598dabc905f08055cd5Kenneth Graunke   return new(mem_ctx) ir_expression(op, a.val);
1660bb3d4ba54f98f4d45abe598dabc905f08055cd5Kenneth Graunke}
1670bb3d4ba54f98f4d45abe598dabc905f08055cd5Kenneth Graunke
1680bb3d4ba54f98f4d45abe598dabc905f08055cd5Kenneth Graunkeir_expression *
169d6e6566206029ace72ba037a3ef7950876eeb88bEric Anholtexpr(ir_expression_operation op, operand a, operand b)
170599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt{
171d6e6566206029ace72ba037a3ef7950876eeb88bEric Anholt   void *mem_ctx = ralloc_parent(a.val);
172599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
173d6e6566206029ace72ba037a3ef7950876eeb88bEric Anholt   return new(mem_ctx) ir_expression(op, a.val, b.val);
174599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt}
175599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
176d6e6566206029ace72ba037a3ef7950876eeb88bEric Anholtir_expression *add(operand a, operand b)
177599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt{
178599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt   return expr(ir_binop_add, a, b);
179599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt}
180599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
181d6e6566206029ace72ba037a3ef7950876eeb88bEric Anholtir_expression *sub(operand a, operand b)
182599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt{
183599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt   return expr(ir_binop_sub, a, b);
184599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt}
185599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
186d6e6566206029ace72ba037a3ef7950876eeb88bEric Anholtir_expression *mul(operand a, operand b)
187599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt{
188599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt   return expr(ir_binop_mul, a, b);
189599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt}
190599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
191d6e6566206029ace72ba037a3ef7950876eeb88bEric Anholtir_expression *dot(operand a, operand b)
192599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt{
193599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt   return expr(ir_binop_dot, a, b);
194599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt}
195599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
196599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholtir_expression *
197d6e6566206029ace72ba037a3ef7950876eeb88bEric Anholtsaturate(operand a)
198599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt{
199d6e6566206029ace72ba037a3ef7950876eeb88bEric Anholt   void *mem_ctx = ralloc_parent(a.val);
200599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
201599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt   return expr(ir_binop_max,
202599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt	       expr(ir_binop_min, a, new(mem_ctx) ir_constant(1.0f)),
203599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt	       new(mem_ctx) ir_constant(0.0f));
204599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt}
205599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt
206599aac95ff2149d881177ed75a48d97d3dcf47bdEric Anholt} /* namespace ir_builder */
207