Implement dph opcode
authorZack Rusin <zack@tungstengraphics.com>
Wed, 17 Oct 2007 17:38:53 +0000 (13:38 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Wed, 24 Oct 2007 15:21:04 +0000 (11:21 -0400)
src/mesa/pipe/llvm/instructions.cpp
src/mesa/pipe/llvm/instructions.h
src/mesa/pipe/llvm/llvmtgsi.cpp

index 9e3b989600b685a62e07cfb17d25ef2f711523bf..62289ba62af6e207db4aeb627ca0edcdb5ddcd7c 100644 (file)
@@ -253,3 +253,30 @@ llvm::Value * Instructions::dp4(llvm::Value *in1, llvm::Value *in2)
    return vectorFromVals(dot4, dot4, dot4, dot4);
 }
 
+llvm::Value * Instructions::dph(llvm::Value *in1, llvm::Value *in2)
+{
+   Value *mulRes = mul(in1, in2);
+   ExtractElementInst *x = new ExtractElementInst(mulRes, unsigned(0),
+                                                  name("extractx"),
+                                                  m_block);
+   ExtractElementInst *y = new ExtractElementInst(mulRes, unsigned(1),
+                                                  name("extracty"),
+                                                  m_block);
+   ExtractElementInst *z = new ExtractElementInst(mulRes, unsigned(2),
+                                                  name("extractz"),
+                                                  m_block);
+   ExtractElementInst *w = new ExtractElementInst(in2, unsigned(3),
+                                                  name("val2w"),
+                                                  m_block);
+   BinaryOperator *xy = BinaryOperator::create(Instruction::Add, x, y,
+                                                name("xy"),
+                                                m_block);
+   BinaryOperator *xyz = BinaryOperator::create(Instruction::Add, xy, z,
+                                                name("xyz"),
+                                                m_block);
+   BinaryOperator *dph = BinaryOperator::create(Instruction::Add, xyz, w,
+                                                name("dph"),
+                                                m_block);
+   return vectorFromVals(dph, dph, dph, dph);
+}
+
index c35cdb75f01f8cceb1bce335f103081d5283c96e..fb8ac9b8cdc24c059cb3f402eb5294983e709b1d 100644 (file)
@@ -17,6 +17,7 @@ public:
    llvm::Value *add(llvm::Value *in1, llvm::Value *in2);
    llvm::Value *dp3(llvm::Value *in1, llvm::Value *in2);
    llvm::Value *dp4(llvm::Value *in1, llvm::Value *in2);
+   llvm::Value *dph(llvm::Value *in1, llvm::Value *in2);
    llvm::Value *lit(llvm::Value *in1);
    llvm::Value *madd(llvm::Value *in1, llvm::Value *in2,
                      llvm::Value *in2);
index 45bc96cb1afdae2eb1df3b24c234511a430ed56d..9a5d3b8d9c7f0e9a06ceb823004b0578a9fc61ed 100644 (file)
@@ -263,7 +263,9 @@ translate_instruction(llvm::Module *module,
       break;
    case TGSI_OPCODE_RCC:
       break;
-   case TGSI_OPCODE_DPH:
+   case TGSI_OPCODE_DPH: {
+      out = instr->dph(inputs[0], inputs[1]);
+   }
       break;
    case TGSI_OPCODE_COS:
       break;