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