implement min/max and abstract ops on vectors
This commit is contained in:
parent
59766ac273
commit
ea1a607292
|
@ -176,14 +176,17 @@ void InstructionsSoa::createFunctionMap()
|
|||
m_functionsMap[TGSI_OPCODE_ABS] = "abs";
|
||||
m_functionsMap[TGSI_OPCODE_DP3] = "dp3";
|
||||
m_functionsMap[TGSI_OPCODE_DP4] = "dp4";
|
||||
m_functionsMap[TGSI_OPCODE_MIN] = "min";
|
||||
m_functionsMap[TGSI_OPCODE_MAX] = "max";
|
||||
m_functionsMap[TGSI_OPCODE_POWER] = "pow";
|
||||
}
|
||||
|
||||
void InstructionsSoa::createDependencies()
|
||||
{
|
||||
{
|
||||
std::vector<std::string> powDeps(1);
|
||||
std::vector<std::string> powDeps(2);
|
||||
powDeps[0] = "powf";
|
||||
powDeps[1] = "powvec";
|
||||
m_builtinDependencies["pow"] = powDeps;
|
||||
}
|
||||
{
|
||||
|
@ -191,6 +194,16 @@ void InstructionsSoa::createDependencies()
|
|||
absDeps[0] = "fabsf";
|
||||
m_builtinDependencies["abs"] = absDeps;
|
||||
}
|
||||
{
|
||||
std::vector<std::string> maxDeps(1);
|
||||
maxDeps[0] = "maxvec";
|
||||
m_builtinDependencies["max"] = maxDeps;
|
||||
}
|
||||
{
|
||||
std::vector<std::string> minDeps(1);
|
||||
minDeps[0] = "minvec";
|
||||
m_builtinDependencies["min"] = minDeps;
|
||||
}
|
||||
}
|
||||
|
||||
llvm::Function * InstructionsSoa::function(int op)
|
||||
|
@ -374,6 +387,21 @@ std::vector<llvm::Value*> InstructionsSoa::pow(const std::vector<llvm::Value*> i
|
|||
return callBuiltin(func, in1, in2);
|
||||
}
|
||||
|
||||
std::vector<llvm::Value*> InstructionsSoa::min(const std::vector<llvm::Value*> in1,
|
||||
const std::vector<llvm::Value*> in2)
|
||||
{
|
||||
llvm::Function *func = function(TGSI_OPCODE_MIN);
|
||||
return callBuiltin(func, in1, in2);
|
||||
}
|
||||
|
||||
|
||||
std::vector<llvm::Value*> InstructionsSoa::max(const std::vector<llvm::Value*> in1,
|
||||
const std::vector<llvm::Value*> in2)
|
||||
{
|
||||
llvm::Function *func = function(TGSI_OPCODE_MAX);
|
||||
return callBuiltin(func, in1, in2);
|
||||
}
|
||||
|
||||
void checkFunction(Function *func)
|
||||
{
|
||||
for (Function::const_iterator BI = func->begin(), BE = func->end();
|
||||
|
|
|
@ -59,6 +59,10 @@ public:
|
|||
std::vector<llvm::Value*> madd(const std::vector<llvm::Value*> in1,
|
||||
const std::vector<llvm::Value*> in2,
|
||||
const std::vector<llvm::Value*> in3);
|
||||
std::vector<llvm::Value*> max(const std::vector<llvm::Value*> in1,
|
||||
const std::vector<llvm::Value*> in2);
|
||||
std::vector<llvm::Value*> min(const std::vector<llvm::Value*> in1,
|
||||
const std::vector<llvm::Value*> in2);
|
||||
std::vector<llvm::Value*> mul(const std::vector<llvm::Value*> in1,
|
||||
const std::vector<llvm::Value*> in2);
|
||||
std::vector<llvm::Value*> pow(const std::vector<llvm::Value*> in1,
|
||||
|
|
|
@ -89,18 +89,73 @@ void dp4(float4 *res,
|
|||
|
||||
extern float powf(float num, float p);
|
||||
|
||||
float4 powvec(float4 vec, float4 q)
|
||||
{
|
||||
float4 p;
|
||||
p.x = powf(vec.x, q.x);
|
||||
p.y = powf(vec.y, q.y);
|
||||
p.z = powf(vec.z, q.z);
|
||||
p.w = powf(vec.w, q.w);
|
||||
return p;
|
||||
}
|
||||
|
||||
void pow(float4 *res,
|
||||
float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w,
|
||||
float4 tmp1x, float4 tmp1y, float4 tmp1z, float4 tmp1w)
|
||||
{
|
||||
float4 p;
|
||||
p.x = powf(tmp0x.x, tmp1x.x);
|
||||
p.y = powf(tmp0x.y, tmp1x.y);
|
||||
p.z = powf(tmp0x.z, tmp1x.z);
|
||||
p.w = powf(tmp0x.w, tmp1x.w);
|
||||
|
||||
res[0] = p;
|
||||
res[1] = p;
|
||||
res[2] = p;
|
||||
res[3] = p;
|
||||
res[0] = powvec(tmp0x, tmp1x);
|
||||
res[1] = res[0];
|
||||
res[2] = res[0];
|
||||
res[3] = res[0];
|
||||
}
|
||||
|
||||
void lit(float4 *res,
|
||||
float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w,
|
||||
float4 tmp1x, float4 tmp1y, float4 tmp1z, float4 tmp1w)
|
||||
{
|
||||
const float4 zerovec = (float4) {0, 0, 0, 0};
|
||||
float4 tmpx = tmp0x;
|
||||
float4 tmpy = tmp0y;
|
||||
|
||||
res[0] = (float4){1.0, 1.0, 1.0, 1.0};
|
||||
res[1] = tmpx;
|
||||
res[2] = tmpy;
|
||||
res[3] = (float4){1.0, 1.0, 1.0, 1.0};
|
||||
}
|
||||
|
||||
float4 minvec(float4 a, float4 b)
|
||||
{
|
||||
return (float4){(a.x < b.x) ? a.x : b.x,
|
||||
(a.y < b.y) ? a.y : b.y,
|
||||
(a.z < b.z) ? a.z : b.z,
|
||||
(a.w < b.w) ? a.w : b.w};
|
||||
}
|
||||
|
||||
void min(float4 *res,
|
||||
float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w,
|
||||
float4 tmp1x, float4 tmp1y, float4 tmp1z, float4 tmp1w)
|
||||
{
|
||||
res[0] = minvec(tmp0x, tmp1x);
|
||||
res[1] = minvec(tmp0y, tmp1y);
|
||||
res[2] = minvec(tmp0z, tmp1z);
|
||||
res[3] = minvec(tmp0w, tmp1w);
|
||||
}
|
||||
|
||||
|
||||
float4 maxvec(float4 a, float4 b)
|
||||
{
|
||||
return (float4){(a.x > b.x) ? a.x : b.x,
|
||||
(a.y > b.y) ? a.y : b.y,
|
||||
(a.z > b.z) ? a.z : b.z,
|
||||
(a.w > b.w) ? a.w : b.w};
|
||||
}
|
||||
|
||||
void max(float4 *res,
|
||||
float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w,
|
||||
float4 tmp1x, float4 tmp1y, float4 tmp1z, float4 tmp1w)
|
||||
{
|
||||
res[0] = maxvec(tmp0x, tmp1x);
|
||||
res[1] = maxvec(tmp0y, tmp1y);
|
||||
res[2] = maxvec(tmp0z, tmp1z);
|
||||
res[3] = maxvec(tmp0w, tmp1w);
|
||||
}
|
||||
|
|
|
@ -724,9 +724,11 @@ translate_instructionir(llvm::Module *module,
|
|||
}
|
||||
break;
|
||||
case TGSI_OPCODE_MIN: {
|
||||
out = instr->min(inputs[0], inputs[1]);
|
||||
}
|
||||
break;
|
||||
case TGSI_OPCODE_MAX: {
|
||||
out = instr->max(inputs[0], inputs[1]);
|
||||
}
|
||||
break;
|
||||
case TGSI_OPCODE_SLT: {
|
||||
|
|
Loading…
Reference in New Issue