[Mesa-dev] [PATCH] gm107/ir: Add stg, ldg instructions and function for checking offset length
Mark Menzynski
mmenzyns at redhat.com
Fri Jul 19 14:57:13 UTC 2019
Nvidia actively uses these instructions, maybe they are better in
something.
Long offset checking function was made because these functions only have 24 bit
address offsets.
Signed-off-by: Mark Menzynski <mmenzyns at redhat.com>
---
.../nouveau/codegen/nv50_ir_emit_gm107.cpp | 36 +++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
index 6eefe8f0025..c01a3017ba9 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
@@ -87,6 +87,7 @@ private:
inline void emitADDR(int, int, int, int, const ValueRef &);
inline void emitCBUF(int, int, int, int, int, const ValueRef &);
inline bool longIMMD(const ValueRef &);
+ inline bool longOffset(const ValueRef &);
inline void emitIMMD(int, int, const ValueRef &);
void emitCond3(int, CondCode);
@@ -174,9 +175,11 @@ private:
void emitLDC();
void emitLDL();
void emitLDS();
+ void emitLDG();
void emitLD();
void emitSTL();
void emitSTS();
+ void emitSTG();
void emitST();
void emitALD();
void emitAST();
@@ -333,6 +336,17 @@ CodeEmitterGM107::longIMMD(const ValueRef &ref)
return false;
}
+bool
+CodeEmitterGM107::longOffset(const ValueRef &ref)
+{
+ // TODO: check for other files as well?
+ if (ref.getFile() != FILE_MEMORY_GLOBAL)
+ return false;
+
+ int32_t offset = ref.get()->reg.data.offset;
+ return offset > 0x7fffff || offset < -0x800000;
+}
+
void
CodeEmitterGM107::emitIMMD(int pos, int len, const ValueRef &ref)
{
@@ -2414,6 +2428,17 @@ CodeEmitterGM107::emitLDS()
emitGPR (0x00, insn->def(0));
}
+void
+CodeEmitterGM107::emitLDG()
+{
+ emitInsn (0xeed00000);
+ emitLDSTs(0x30, insn->dType);
+ emitLDSTc(0x2e);
+ emitField(0x2d, 1, insn->src(0).getIndirect(0)->getSize() == 8);
+ emitADDR (0x08, 0x14, 24, 0, insn->src(0));
+ emitGPR (0x00, insn->def(0));
+}
+
void
CodeEmitterGM107::emitLD()
{
@@ -2445,6 +2470,17 @@ CodeEmitterGM107::emitSTS()
emitGPR (0x00, insn->src(1));
}
+void
+CodeEmitterGM107::emitSTG()
+{
+ emitInsn (0xeed80000);
+ emitLDSTs(0x30, insn->dType);
+ emitLDSTc(0x2e);
+ emitField(0x2d, 1, insn->src(0).getIndirect(0)->getSize() == 8);
+ emitADDR (0x08, 0x14, 24, 0, insn->src(0));
+ emitGPR (0x00, insn->src(1));
+}
+
void
CodeEmitterGM107::emitST()
{
--
2.21.0
More information about the mesa-dev
mailing list