14639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca/************************************************************************** 24639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * 34639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * Copyright 2009 VMware, Inc. 44639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * All Rights Reserved. 54639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * 64639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 74639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * copy of this software and associated documentation files (the 84639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * "Software"), to deal in the Software without restriction, including 94639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish, 104639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to 114639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to 124639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * the following conditions: 134639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * 144639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * The above copyright notice and this permission notice (including the 154639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * next paragraph) shall be included in all copies or substantial portions 164639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * of the Software. 174639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * 184639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 194639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 204639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 214639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 224639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 234639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 244639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 254639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca * 264639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca **************************************************************************/ 274639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca 284639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca 295811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca/** 305811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @file 315811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Blend LLVM IR generation -- logic ops. 325811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * 335811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @author Jose Fonseca <jfonseca@vmware.com> 345811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca */ 355811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca 365811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca 374639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca#include "pipe/p_state.h" 3838f6f23fcf37247fd709d1c612d08bfa9b124e69José Fonseca#include "util/u_debug.h" 394639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca 404a414d8f876031ffd299e8e0417da1ea7bf9b96bJosé Fonseca#include "lp_bld_blend.h" 414639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca 424639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca 434639f8aad5db08cf9386a910c02a4dc205740d8bJosé FonsecaLLVMValueRef 444639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonsecalp_build_logicop(LLVMBuilderRef builder, 454639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca unsigned logicop_func, 464639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca LLVMValueRef src, 474639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca LLVMValueRef dst) 484639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca{ 494639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca LLVMTypeRef type; 504639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca LLVMValueRef res; 514639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca 524639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca type = LLVMTypeOf(src); 534639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca 544639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca switch (logicop_func) { 554639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_CLEAR: 564639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMConstNull(type); 574639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 584639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_NOR: 594639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildNot(builder, LLVMBuildOr(builder, src, dst, ""), ""); 604639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 614639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_AND_INVERTED: 624639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildAnd(builder, LLVMBuildNot(builder, src, ""), dst, ""); 634639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 644639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_COPY_INVERTED: 654639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildNot(builder, src, ""); 664639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 674639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_AND_REVERSE: 684639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildAnd(builder, src, LLVMBuildNot(builder, dst, ""), ""); 694639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 704639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_INVERT: 714639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildNot(builder, dst, ""); 724639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 734639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_XOR: 744639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildXor(builder, src, dst, ""); 754639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 764639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_NAND: 774639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildNot(builder, LLVMBuildAnd(builder, src, dst, ""), ""); 784639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 794639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_AND: 804639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildAnd(builder, src, dst, ""); 814639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 824639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_EQUIV: 834639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildNot(builder, LLVMBuildXor(builder, src, dst, ""), ""); 844639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 854639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_NOOP: 864639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = dst; 874639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 884639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_OR_INVERTED: 894639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildOr(builder, LLVMBuildNot(builder, src, ""), dst, ""); 904639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 914639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_COPY: 924639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = src; 934639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 944639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_OR_REVERSE: 954639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildOr(builder, src, LLVMBuildNot(builder, dst, ""), ""); 964639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 974639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_OR: 984639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMBuildOr(builder, src, dst, ""); 994639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 1004639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca case PIPE_LOGICOP_SET: 1014639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = LLVMConstAllOnes(type); 1024639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca break; 1034639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca default: 1044639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca assert(0); 1054639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca res = src; 1064639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca } 1074639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca 1084639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca return res; 1094639f8aad5db08cf9386a910c02a4dc205740d8bJosé Fonseca} 110