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