1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2012 Intel Corporation 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 10*61046927SAndroid Build Coastguard Worker * 11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 13*61046927SAndroid Build Coastguard Worker * Software. 14*61046927SAndroid Build Coastguard Worker * 15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE. 22*61046927SAndroid Build Coastguard Worker */ 23*61046927SAndroid Build Coastguard Worker 24*61046927SAndroid Build Coastguard Worker #ifndef IR_BUILDER_H 25*61046927SAndroid Build Coastguard Worker #define IR_BUILDER_H 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker #include "ir.h" 28*61046927SAndroid Build Coastguard Worker 29*61046927SAndroid Build Coastguard Worker namespace ir_builder { 30*61046927SAndroid Build Coastguard Worker 31*61046927SAndroid Build Coastguard Worker /** 32*61046927SAndroid Build Coastguard Worker * This little class exists to let the helper expression generators 33*61046927SAndroid Build Coastguard Worker * take either an ir_rvalue * or an ir_variable * to be automatically 34*61046927SAndroid Build Coastguard Worker * dereferenced, while still providing compile-time type checking. 35*61046927SAndroid Build Coastguard Worker * 36*61046927SAndroid Build Coastguard Worker * You don't have to explicitly call the constructor -- C++ will see 37*61046927SAndroid Build Coastguard Worker * that you passed an ir_variable, and silently call the 38*61046927SAndroid Build Coastguard Worker * operand(ir_variable *var) constructor behind your back. 39*61046927SAndroid Build Coastguard Worker */ 40*61046927SAndroid Build Coastguard Worker class operand { 41*61046927SAndroid Build Coastguard Worker public: operand(ir_rvalue * val)42*61046927SAndroid Build Coastguard Worker operand(ir_rvalue *val) 43*61046927SAndroid Build Coastguard Worker : val(val) 44*61046927SAndroid Build Coastguard Worker { 45*61046927SAndroid Build Coastguard Worker } 46*61046927SAndroid Build Coastguard Worker operand(ir_variable * var)47*61046927SAndroid Build Coastguard Worker operand(ir_variable *var) 48*61046927SAndroid Build Coastguard Worker { 49*61046927SAndroid Build Coastguard Worker void *mem_ctx = ralloc_parent(var); 50*61046927SAndroid Build Coastguard Worker val = new(mem_ctx) ir_dereference_variable(var); 51*61046927SAndroid Build Coastguard Worker } 52*61046927SAndroid Build Coastguard Worker 53*61046927SAndroid Build Coastguard Worker ir_rvalue *val; 54*61046927SAndroid Build Coastguard Worker }; 55*61046927SAndroid Build Coastguard Worker 56*61046927SAndroid Build Coastguard Worker /** Automatic generator for ir_dereference_variable on assignment LHS. 57*61046927SAndroid Build Coastguard Worker * 58*61046927SAndroid Build Coastguard Worker * \sa operand 59*61046927SAndroid Build Coastguard Worker */ 60*61046927SAndroid Build Coastguard Worker class deref { 61*61046927SAndroid Build Coastguard Worker public: deref(ir_dereference * val)62*61046927SAndroid Build Coastguard Worker deref(ir_dereference *val) 63*61046927SAndroid Build Coastguard Worker : val(val) 64*61046927SAndroid Build Coastguard Worker { 65*61046927SAndroid Build Coastguard Worker } 66*61046927SAndroid Build Coastguard Worker deref(ir_variable * var)67*61046927SAndroid Build Coastguard Worker deref(ir_variable *var) 68*61046927SAndroid Build Coastguard Worker { 69*61046927SAndroid Build Coastguard Worker void *mem_ctx = ralloc_parent(var); 70*61046927SAndroid Build Coastguard Worker val = new(mem_ctx) ir_dereference_variable(var); 71*61046927SAndroid Build Coastguard Worker } 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker 74*61046927SAndroid Build Coastguard Worker ir_dereference *val; 75*61046927SAndroid Build Coastguard Worker }; 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Worker class ir_factory { 78*61046927SAndroid Build Coastguard Worker public: 79*61046927SAndroid Build Coastguard Worker ir_factory(exec_list *instructions = NULL, void *mem_ctx = NULL) instructions(instructions)80*61046927SAndroid Build Coastguard Worker : instructions(instructions), 81*61046927SAndroid Build Coastguard Worker mem_ctx(mem_ctx) 82*61046927SAndroid Build Coastguard Worker { 83*61046927SAndroid Build Coastguard Worker return; 84*61046927SAndroid Build Coastguard Worker } 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker void emit(ir_instruction *ir); 87*61046927SAndroid Build Coastguard Worker ir_variable *make_temp(const glsl_type *type, const char *name); 88*61046927SAndroid Build Coastguard Worker 89*61046927SAndroid Build Coastguard Worker ir_constant* constant(float f)90*61046927SAndroid Build Coastguard Worker constant(float f) 91*61046927SAndroid Build Coastguard Worker { 92*61046927SAndroid Build Coastguard Worker return new(mem_ctx) ir_constant(f); 93*61046927SAndroid Build Coastguard Worker } 94*61046927SAndroid Build Coastguard Worker 95*61046927SAndroid Build Coastguard Worker ir_constant* constant(int i)96*61046927SAndroid Build Coastguard Worker constant(int i) 97*61046927SAndroid Build Coastguard Worker { 98*61046927SAndroid Build Coastguard Worker return new(mem_ctx) ir_constant(i); 99*61046927SAndroid Build Coastguard Worker } 100*61046927SAndroid Build Coastguard Worker 101*61046927SAndroid Build Coastguard Worker ir_constant* constant(unsigned u)102*61046927SAndroid Build Coastguard Worker constant(unsigned u) 103*61046927SAndroid Build Coastguard Worker { 104*61046927SAndroid Build Coastguard Worker return new(mem_ctx) ir_constant(u); 105*61046927SAndroid Build Coastguard Worker } 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard Worker ir_constant* constant(bool b)108*61046927SAndroid Build Coastguard Worker constant(bool b) 109*61046927SAndroid Build Coastguard Worker { 110*61046927SAndroid Build Coastguard Worker return new(mem_ctx) ir_constant(b); 111*61046927SAndroid Build Coastguard Worker } 112*61046927SAndroid Build Coastguard Worker 113*61046927SAndroid Build Coastguard Worker exec_list *instructions; 114*61046927SAndroid Build Coastguard Worker void *mem_ctx; 115*61046927SAndroid Build Coastguard Worker }; 116*61046927SAndroid Build Coastguard Worker 117*61046927SAndroid Build Coastguard Worker ir_assignment *assign(deref lhs, operand rhs); 118*61046927SAndroid Build Coastguard Worker ir_assignment *assign(deref lhs, operand rhs, int writemask); 119*61046927SAndroid Build Coastguard Worker 120*61046927SAndroid Build Coastguard Worker ir_return *ret(operand retval); 121*61046927SAndroid Build Coastguard Worker 122*61046927SAndroid Build Coastguard Worker ir_expression *expr(ir_expression_operation op, operand a); 123*61046927SAndroid Build Coastguard Worker ir_expression *expr(ir_expression_operation op, operand a, operand b); 124*61046927SAndroid Build Coastguard Worker ir_expression *expr(ir_expression_operation op, operand a, operand b, operand c); 125*61046927SAndroid Build Coastguard Worker ir_expression *add(operand a, operand b); 126*61046927SAndroid Build Coastguard Worker ir_expression *sub(operand a, operand b); 127*61046927SAndroid Build Coastguard Worker ir_expression *mul(operand a, operand b); 128*61046927SAndroid Build Coastguard Worker ir_expression *imul_high(operand a, operand b); 129*61046927SAndroid Build Coastguard Worker ir_expression *div(operand a, operand b); 130*61046927SAndroid Build Coastguard Worker ir_expression *carry(operand a, operand b); 131*61046927SAndroid Build Coastguard Worker ir_expression *borrow(operand a, operand b); 132*61046927SAndroid Build Coastguard Worker ir_expression *trunc(operand a); 133*61046927SAndroid Build Coastguard Worker ir_expression *round_even(operand a); 134*61046927SAndroid Build Coastguard Worker ir_expression *fract(operand a); 135*61046927SAndroid Build Coastguard Worker ir_expression *dot(operand a, operand b); 136*61046927SAndroid Build Coastguard Worker ir_expression *clamp(operand a, operand b, operand c); 137*61046927SAndroid Build Coastguard Worker ir_expression *saturate(operand a); 138*61046927SAndroid Build Coastguard Worker ir_expression *abs(operand a); 139*61046927SAndroid Build Coastguard Worker ir_expression *neg(operand a); 140*61046927SAndroid Build Coastguard Worker ir_expression *sin(operand a); 141*61046927SAndroid Build Coastguard Worker ir_expression *cos(operand a); 142*61046927SAndroid Build Coastguard Worker ir_expression *exp(operand a); 143*61046927SAndroid Build Coastguard Worker ir_expression *rcp(operand a); 144*61046927SAndroid Build Coastguard Worker ir_expression *rsq(operand a); 145*61046927SAndroid Build Coastguard Worker ir_expression *sqrt(operand a); 146*61046927SAndroid Build Coastguard Worker ir_expression *log(operand a); 147*61046927SAndroid Build Coastguard Worker ir_expression *sign(operand a); 148*61046927SAndroid Build Coastguard Worker 149*61046927SAndroid Build Coastguard Worker ir_expression *subr_to_int(operand a); 150*61046927SAndroid Build Coastguard Worker ir_expression *equal(operand a, operand b); 151*61046927SAndroid Build Coastguard Worker ir_expression *nequal(operand a, operand b); 152*61046927SAndroid Build Coastguard Worker ir_expression *less(operand a, operand b); 153*61046927SAndroid Build Coastguard Worker ir_expression *greater(operand a, operand b); 154*61046927SAndroid Build Coastguard Worker ir_expression *lequal(operand a, operand b); 155*61046927SAndroid Build Coastguard Worker ir_expression *gequal(operand a, operand b); 156*61046927SAndroid Build Coastguard Worker 157*61046927SAndroid Build Coastguard Worker ir_expression *logic_not(operand a); 158*61046927SAndroid Build Coastguard Worker ir_expression *logic_and(operand a, operand b); 159*61046927SAndroid Build Coastguard Worker ir_expression *logic_or(operand a, operand b); 160*61046927SAndroid Build Coastguard Worker 161*61046927SAndroid Build Coastguard Worker ir_expression *bit_not(operand a); 162*61046927SAndroid Build Coastguard Worker ir_expression *bit_or(operand a, operand b); 163*61046927SAndroid Build Coastguard Worker ir_expression *bit_and(operand a, operand b); 164*61046927SAndroid Build Coastguard Worker ir_expression *bit_xor(operand a, operand b); 165*61046927SAndroid Build Coastguard Worker ir_expression *lshift(operand a, operand b); 166*61046927SAndroid Build Coastguard Worker ir_expression *rshift(operand a, operand b); 167*61046927SAndroid Build Coastguard Worker 168*61046927SAndroid Build Coastguard Worker ir_expression *f2i(operand a); 169*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_f2i(operand a); 170*61046927SAndroid Build Coastguard Worker ir_expression *i2f(operand a); 171*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_i2f(operand a); 172*61046927SAndroid Build Coastguard Worker ir_expression *f2u(operand a); 173*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_f2u(operand a); 174*61046927SAndroid Build Coastguard Worker ir_expression *u2f(operand a); 175*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_u2f(operand a); 176*61046927SAndroid Build Coastguard Worker ir_expression *i2u(operand a); 177*61046927SAndroid Build Coastguard Worker ir_expression *u2i(operand a); 178*61046927SAndroid Build Coastguard Worker ir_expression *b2i(operand a); 179*61046927SAndroid Build Coastguard Worker ir_expression *i2b(operand a); 180*61046927SAndroid Build Coastguard Worker ir_expression *f2b(operand a); 181*61046927SAndroid Build Coastguard Worker ir_expression *b2f(operand a); 182*61046927SAndroid Build Coastguard Worker 183*61046927SAndroid Build Coastguard Worker ir_expression *f2f16(operand a); 184*61046927SAndroid Build Coastguard Worker 185*61046927SAndroid Build Coastguard Worker ir_expression *f2d(operand a); 186*61046927SAndroid Build Coastguard Worker ir_expression *i2d(operand a); 187*61046927SAndroid Build Coastguard Worker ir_expression *u2d(operand a); 188*61046927SAndroid Build Coastguard Worker 189*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_d2i64(operand a); 190*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_d2u64(operand a); 191*61046927SAndroid Build Coastguard Worker 192*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_i642d(operand a); 193*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_u642d(operand a); 194*61046927SAndroid Build Coastguard Worker 195*61046927SAndroid Build Coastguard Worker ir_expression *min2(operand a, operand b); 196*61046927SAndroid Build Coastguard Worker ir_expression *max2(operand a, operand b); 197*61046927SAndroid Build Coastguard Worker 198*61046927SAndroid Build Coastguard Worker ir_expression *interpolate_at_centroid(operand a); 199*61046927SAndroid Build Coastguard Worker ir_expression *interpolate_at_offset(operand a, operand b); 200*61046927SAndroid Build Coastguard Worker ir_expression *interpolate_at_sample(operand a, operand b); 201*61046927SAndroid Build Coastguard Worker 202*61046927SAndroid Build Coastguard Worker ir_expression *fma(operand a, operand b, operand c); 203*61046927SAndroid Build Coastguard Worker ir_expression *lrp(operand x, operand y, operand a); 204*61046927SAndroid Build Coastguard Worker ir_expression *csel(operand a, operand b, operand c); 205*61046927SAndroid Build Coastguard Worker ir_expression *bitfield_extract(operand a, operand b, operand c); 206*61046927SAndroid Build Coastguard Worker ir_expression *bitfield_insert(operand a, operand b, operand c, operand d); 207*61046927SAndroid Build Coastguard Worker 208*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle(operand a, int swizzle, int components); 209*61046927SAndroid Build Coastguard Worker /** 210*61046927SAndroid Build Coastguard Worker * Swizzle away later components, but preserve the ordering. 211*61046927SAndroid Build Coastguard Worker */ 212*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_for_size(operand a, unsigned components); 213*61046927SAndroid Build Coastguard Worker 214*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_xxxx(operand a); 215*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_yyyy(operand a); 216*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_zzzz(operand a); 217*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_wwww(operand a); 218*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_x(operand a); 219*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_y(operand a); 220*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_z(operand a); 221*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_w(operand a); 222*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_xy(operand a); 223*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_xyz(operand a); 224*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_xyzw(operand a); 225*61046927SAndroid Build Coastguard Worker 226*61046927SAndroid Build Coastguard Worker ir_if *if_tree(operand condition, 227*61046927SAndroid Build Coastguard Worker ir_instruction *then_branch); 228*61046927SAndroid Build Coastguard Worker ir_if *if_tree(operand condition, 229*61046927SAndroid Build Coastguard Worker ir_instruction *then_branch, 230*61046927SAndroid Build Coastguard Worker ir_instruction *else_branch); 231*61046927SAndroid Build Coastguard Worker 232*61046927SAndroid Build Coastguard Worker } /* namespace ir_builder */ 233*61046927SAndroid Build Coastguard Worker 234*61046927SAndroid Build Coastguard Worker #endif 235