Implement sin opcode.
authorZack Rusin <zack@tungstengraphics.com>
Fri, 2 Nov 2007 16:09:23 +0000 (12:09 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Fri, 2 Nov 2007 16:09:23 +0000 (12:09 -0400)
Seems to have similar rounding border problems as cos.

src/mesa/pipe/llvm/gallivm.cpp
src/mesa/pipe/llvm/gallivm_builtins.cpp
src/mesa/pipe/llvm/instructions.cpp
src/mesa/pipe/llvm/instructions.h
src/mesa/pipe/llvm/llvm_builtins.c

index 7e91f8c556c15532e103d43070cbe932805a7e56..bd8bfac2085057e2f2818c45a0db3ddba088c2b8 100644 (file)
@@ -452,7 +452,9 @@ translate_instruction(llvm::Module *module,
       out = instr->sgt(inputs[0], inputs[1]);
    }
       break;
-   case TGSI_OPCODE_SIN:
+   case TGSI_OPCODE_SIN: {
+      out = instr->sin(inputs[0]);
+   }
       break;
    case TGSI_OPCODE_SLE:
       break;
index b06629265a6d30b09f6cf83bb533e703b58ca344..da1e6ae1de438f57f5673f0a6e350ebe4b3b4d0b 100644 (file)
@@ -126,6 +126,12 @@ Function* func_sinf = new Function(
   /*Name=*/"sinf", mod); // (external, no body)
 func_sinf->setCallingConv(CallingConv::C);
 
+Function* func_vsin = new Function(
+  /*Type=*/FuncTy_5,
+  /*Linkage=*/GlobalValue::ExternalLinkage,
+  /*Name=*/"vsin", mod); 
+func_vsin->setCallingConv(CallingConv::C);
+
 // Global Variable Declarations
 
 
@@ -428,6 +434,27 @@ gvar_array__str1->setInitializer(const_array_14);
   
 }
 
+// Function: vsin (func_vsin)
+{
+  Function::arg_iterator args = func_vsin->arg_begin();
+  Value* packed_val_59 = args++;
+  packed_val_59->setName("val");
+  
+  BasicBlock* label_entry_60 = new BasicBlock("entry",func_vsin,0);
+  
+  // Block entry (label_entry_60)
+  ExtractElementInst* float_tmp2_61 = new ExtractElementInst(packed_val_59, const_int32_18, "tmp2", label_entry_60);
+  CallInst* float_call_62 = new CallInst(func_sinf, float_tmp2_61, "call", label_entry_60);
+  float_call_62->setCallingConv(CallingConv::C);
+  float_call_62->setTailCall(true);
+  InsertElementInst* packed_tmp6 = new InsertElementInst(const_packed_34, float_call_62, const_int32_18, "tmp6", label_entry_60);
+  InsertElementInst* packed_tmp9_63 = new InsertElementInst(packed_tmp6, float_call_62, const_int32_22, "tmp9", label_entry_60);
+  InsertElementInst* packed_tmp12_64 = new InsertElementInst(packed_tmp9_63, float_call_62, const_int32_24, "tmp12", label_entry_60);
+  InsertElementInst* packed_tmp15_65 = new InsertElementInst(packed_tmp12_64, float_call_62, const_int32_23, "tmp15", label_entry_60);
+  new ReturnInst(packed_tmp15_65, label_entry_60);
+  
+}
+
 return mod;
 
 }
index c4a1b2d5c1d4b15002e39655209795c5617bb92a..232dd9cd5dec67b4dcb6b322083276b966cf9cba 100644 (file)
@@ -874,5 +874,15 @@ llvm::Value * Instructions::scs(llvm::Value *in)
    return call;
 }
 
+
+llvm::Value * Instructions::sin(llvm::Value *in)
+{
+   llvm::Function *func = m_mod->getFunction("vsin");
+   assert(func);
+
+   CallInst *call = m_builder.CreateCall(func, in, name("sinres"));
+   call->setTailCall(false);
+   return call;
+}
 #endif //MESA_LLVM
 
index 95c845e8623e97cb379db75119835c0f6cc716d9..e9bfc9d740bbd07cb82a47d56b481fc3547ff774 100644 (file)
@@ -95,6 +95,7 @@ public:
    llvm::Value *scs(llvm::Value *in);
    llvm::Value *sge(llvm::Value *in1, llvm::Value *in2);
    llvm::Value *sgt(llvm::Value *in1, llvm::Value *in2);
+   llvm::Value *sin(llvm::Value *in);
    llvm::Value *slt(llvm::Value *in1, llvm::Value *in2);
    llvm::Value *sub(llvm::Value *in1, llvm::Value *in2);
    llvm::Value *trunc(llvm::Value *in);
index ca159955570e99a1bbef0dbc20d7911b57d3e99a..517aa2e84bdc1dbddaf0d427206f4405a350c510 100644 (file)
@@ -93,3 +93,16 @@ inline float4 scs(float4 val)
    result.y = sinf(tmp);
    return result;
 }
+
+
+inline float4 vsin(float4 val)
+{
+   float4 result;
+   float tmp = val.x;
+   float res = sinf(tmp);
+   result.x = res;
+   result.y = res;
+   result.z = res;
+   result.w = res;
+   return result;
+}