Implement dot4 opcode

This commit is contained in:
Zack Rusin 2007-10-17 13:34:25 -04:00
parent e20294be11
commit 7abe3364b2
3 changed files with 35 additions and 5 deletions

View file

@ -226,3 +226,30 @@ llvm::Value * Instructions::rcp(llvm::Value *in1)
return vectorFromVals(res, res, res, res); return vectorFromVals(res, res, res, res);
} }
llvm::Value * Instructions::dp4(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(mulRes, unsigned(3),
name("extractw"),
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 *dot4 = BinaryOperator::create(Instruction::Add, xyz, w,
name("dot4"),
m_block);
return vectorFromVals(dot4, dot4, dot4, dot4);
}

View file

@ -16,6 +16,7 @@ public:
llvm::Value *add(llvm::Value *in1, llvm::Value *in2); llvm::Value *add(llvm::Value *in1, llvm::Value *in2);
llvm::Value *dp3(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 *lit(llvm::Value *in1); llvm::Value *lit(llvm::Value *in1);
llvm::Value *madd(llvm::Value *in1, llvm::Value *in2, llvm::Value *madd(llvm::Value *in1, llvm::Value *in2,
llvm::Value *in2); llvm::Value *in2);

View file

@ -205,7 +205,9 @@ translate_instruction(llvm::Module *module,
out = instr->dp3(inputs[0], inputs[1]); out = instr->dp3(inputs[0], inputs[1]);
} }
break; break;
case TGSI_OPCODE_DP4: case TGSI_OPCODE_DP4: {
out = instr->dp4(inputs[0], inputs[1]);
}
break; break;
case TGSI_OPCODE_DST: case TGSI_OPCODE_DST:
break; break;
@ -767,6 +769,10 @@ ga_llvm_from_tgsi(struct pipe_context *pipe, const struct tgsi_token *tokens)
std::cout << "Creating llvm " <<std::endl; std::cout << "Creating llvm " <<std::endl;
struct ga_llvm_prog *ga_llvm = struct ga_llvm_prog *ga_llvm =
(struct ga_llvm_prog *)malloc(sizeof(struct ga_llvm_prog)); (struct ga_llvm_prog *)malloc(sizeof(struct ga_llvm_prog));
fprintf(stderr, "DUMPX \n");
//tgsi_dump(tokens, TGSI_DUMP_VERBOSE);
tgsi_dump(tokens, 0);
fprintf(stderr, "DUMPEND \n");
llvm::Module *mod = tgsi_to_llvm(tokens); llvm::Module *mod = tgsi_to_llvm(tokens);
/* Run optimization passes over it */ /* Run optimization passes over it */
@ -789,10 +795,6 @@ ga_llvm_from_tgsi(struct pipe_context *pipe, const struct tgsi_token *tokens)
ee->addModuleProvider(mp); ee->addModuleProvider(mp);
} }
ga_llvm->module = mod; ga_llvm->module = mod;
fprintf(stderr, "DUMPX \n");
//tgsi_dump(tokens, TGSI_DUMP_VERBOSE);
tgsi_dump(tokens, 0);
fprintf(stderr, "DUMPEND \n");
Function *func = mod->getFunction("run_vertex_shader"); Function *func = mod->getFunction("run_vertex_shader");
std::cout << "run_vertex_shader = "<<func<<std::endl; std::cout << "run_vertex_shader = "<<func<<std::endl;