nv50: handle TGSI_OPCODE_ROUND
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 27 Aug 2011 19:00:39 +0000 (21:00 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Tue, 30 Aug 2011 11:55:07 +0000 (13:55 +0200)
Will round to nearest-even.

src/gallium/drivers/nv50/nv50_pc.c
src/gallium/drivers/nv50/nv50_pc.h
src/gallium/drivers/nv50/nv50_pc_emit.c
src/gallium/drivers/nv50/nv50_pc_print.c
src/gallium/drivers/nv50/nv50_tgsi_to_nc.c

index 7900bf811dfe85d3259e8eb4acf7186aacee114f..9137f871f5a7be643cded5daa994cc782be875c9 100644 (file)
@@ -102,6 +102,7 @@ nv50_nvi_can_load(struct nv_instruction *nvi, int s, struct nv_value *value)
    case NV_OP_FLOOR:
    case NV_OP_TRUNC:
    case NV_OP_CVT:
+   case NV_OP_ROUND:
    case NV_OP_NEG:
    case NV_OP_MAD:
    case NV_OP_MUL:
index 5bb0e1296bb2a0dfd409b0b5b3c2982f73491892..45804d3a913518539ed8affc26d7a109ae2d93a9 100644 (file)
@@ -86,7 +86,8 @@
 #define NV_OP_SELECT    54
 #define NV_OP_EXPORT    55
 #define NV_OP_JOIN      56
-#define NV_OP_COUNT     57
+#define NV_OP_ROUND     57
+#define NV_OP_COUNT     58
 
 #define NV_FILE_GPR      0
 #define NV_FILE_OUT      1
index 600850da011cc13519603d6263e6728a97e3fc5a..2b177c6cb2f4d66b5a25f64479d99060fb358876 100644 (file)
@@ -94,7 +94,7 @@ const ubyte nv50_inst_min_size_tab[NV_OP_COUNT] =
    0, 0, 0, 8, 8, 4, 4, 4, 8, 4, 4, 8, 8, 8, 8, 8, /* 15 */
    8, 8, 8, 4, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, /* 31 */
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, /* 47 */
-   4, 8, 8, 8, 8, 8, 0, 0, 8
+   4, 8, 8, 8, 8, 8, 0, 0, 8, 8
 };
 
 unsigned
@@ -1009,13 +1009,14 @@ emit_cvt(struct nv_pc *pc, struct nv_instruction *nvi)
    }
    if (pc->emit[1] == CVT_F32_F32 &&
        (nvi->opcode == NV_OP_CEIL || nvi->opcode == NV_OP_FLOOR ||
-       nvi->opcode == NV_OP_TRUNC))
+        nvi->opcode == NV_OP_TRUNC || nvi->opcode == NV_OP_ROUND))
        pc->emit[1] |= CVT_RI;
 
    switch (nvi->opcode) {
    case NV_OP_CEIL:  pc->emit[1] |= CVT_CEIL; break;
    case NV_OP_FLOOR: pc->emit[1] |= CVT_FLOOR; break;
    case NV_OP_TRUNC: pc->emit[1] |= CVT_TRUNC; break;
+   case NV_OP_ROUND: pc->emit[1] |= CVT_RN; break;
 
    case NV_OP_ABS: pc->emit[1] |= CVT_ABS; break;
    case NV_OP_SAT: pc->emit[1] |= CVT_SAT; break;
@@ -1163,6 +1164,7 @@ nv50_emit_instruction(struct nv_pc *pc, struct nv_instruction *i)
    case NV_OP_CEIL:
    case NV_OP_FLOOR:
    case NV_OP_TRUNC:
+   case NV_OP_ROUND:
       emit_cvt(pc, i);
       break;
    case NV_OP_DFDX:
index 984f6cbe172674e6a537548bc56710565694e773..dabbb836aa4f146dcd752cd14fd4d9e469396d70 100644 (file)
@@ -96,6 +96,7 @@ static const char *nv_opcode_names[NV_OP_COUNT + 1] = {
    "select",
    "export",
    "join",
+   "round",
    "BAD_OP"
 };
 
index 15aa40cddd10ecb8dacac450b64a6f4ce783ef1e..4b11ae1e6264de08785d7b3c2e952457777d5da0 100644 (file)
@@ -803,6 +803,7 @@ translate_opcode(uint opcode)
    case TGSI_OPCODE_CEIL: return NV_OP_CEIL;
    case TGSI_OPCODE_FLR: return NV_OP_FLOOR;
    case TGSI_OPCODE_TRUNC: return NV_OP_TRUNC;
+   case TGSI_OPCODE_ROUND: return NV_OP_ROUND;
    case TGSI_OPCODE_COS: return NV_OP_COS;
    case TGSI_OPCODE_SIN: return NV_OP_SIN;
    case TGSI_OPCODE_DDX: return NV_OP_DFDX;
@@ -1819,6 +1820,7 @@ bld_instruction(struct bld_context *bld,
    case TGSI_OPCODE_CEIL:
    case TGSI_OPCODE_FLR:
    case TGSI_OPCODE_TRUNC:
+   case TGSI_OPCODE_ROUND:
    case TGSI_OPCODE_DDX:
    case TGSI_OPCODE_DDY:
       FOR_EACH_DST0_ENABLED_CHANNEL(c, insn) {