mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 09:28:07 +02:00
gm107/ir: add emission for ATOMS
This allows to perform atomic operations on shared memory. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
7f8565f0b2
commit
8f99c1bbce
1 changed files with 44 additions and 1 deletions
|
|
@ -177,6 +177,7 @@ private:
|
|||
void emitAL2P();
|
||||
void emitIPA();
|
||||
void emitATOM();
|
||||
void emitATOMS();
|
||||
void emitCCTL();
|
||||
|
||||
void emitPIXLD();
|
||||
|
|
@ -2373,6 +2374,45 @@ CodeEmitterGM107::emitATOM()
|
|||
emitGPR (0x00, insn->def(0));
|
||||
}
|
||||
|
||||
void
|
||||
CodeEmitterGM107::emitATOMS()
|
||||
{
|
||||
unsigned dType, subOp;
|
||||
|
||||
if (insn->subOp == NV50_IR_SUBOP_ATOM_CAS) {
|
||||
switch (insn->dType) {
|
||||
case TYPE_U32: dType = 0; break;
|
||||
case TYPE_U64: dType = 1; break;
|
||||
default: assert(!"unexpected dType"); dType = 0; break;
|
||||
}
|
||||
subOp = 4;
|
||||
|
||||
emitInsn (0xee000000);
|
||||
emitField(0x34, 1, dType);
|
||||
} else {
|
||||
switch (insn->dType) {
|
||||
case TYPE_U32: dType = 0; break;
|
||||
case TYPE_S32: dType = 1; break;
|
||||
case TYPE_U64: dType = 2; break;
|
||||
case TYPE_S64: dType = 3; break;
|
||||
default: assert(!"unexpected dType"); dType = 0; break;
|
||||
}
|
||||
|
||||
if (insn->subOp == NV50_IR_SUBOP_ATOM_EXCH)
|
||||
subOp = 8;
|
||||
else
|
||||
subOp = insn->subOp;
|
||||
|
||||
emitInsn (0xec000000);
|
||||
emitField(0x1c, 3, dType);
|
||||
}
|
||||
|
||||
emitField(0x34, 4, subOp);
|
||||
emitGPR (0x14, insn->src(1));
|
||||
emitADDR (0x08, 0x12, 22, 0, insn->src(0));
|
||||
emitGPR (0x00, insn->def(0));
|
||||
}
|
||||
|
||||
void
|
||||
CodeEmitterGM107::emitCCTL()
|
||||
{
|
||||
|
|
@ -2967,7 +3007,10 @@ CodeEmitterGM107::emitInstruction(Instruction *i)
|
|||
}
|
||||
break;
|
||||
case OP_ATOM:
|
||||
emitATOM();
|
||||
if (insn->src(0).getFile() == FILE_MEMORY_SHARED)
|
||||
emitATOMS();
|
||||
else
|
||||
emitATOM();
|
||||
break;
|
||||
case OP_CCTL:
|
||||
emitCCTL();
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue