From c3d979dfb163ead1bd17eefcb7c0b879fb2efea2 Mon Sep 17 00:00:00 2001 From: "Andrew M. B. Boktor" Date: Wed, 9 May 2012 00:31:43 -0800 Subject: Adding support for a big number of instructions and modifiers that were not supported before [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 12372] --- cuobjdump_to_ptxplus/cuobjdumpInst.cc | 107 +++++++++++++++++++++++++++++----- cuobjdump_to_ptxplus/sass.l | 16 ++++- cuobjdump_to_ptxplus/sass.y | 22 ++++--- 3 files changed, 121 insertions(+), 24 deletions(-) (limited to 'cuobjdump_to_ptxplus') diff --git a/cuobjdump_to_ptxplus/cuobjdumpInst.cc b/cuobjdump_to_ptxplus/cuobjdumpInst.cc index b392aa1..fa011ab 100644 --- a/cuobjdump_to_ptxplus/cuobjdumpInst.cc +++ b/cuobjdump_to_ptxplus/cuobjdumpInst.cc @@ -154,8 +154,6 @@ void cuobjdumpInst::printCuobjdumpBaseModifiers() output(".ne"); else if( strcmp(modString, "NEU")==0 ) output(".neu"); - else if( strcmp(modString, ".exit")==0 ) - output(modString); else if( strcmp(modString, ".abs")==0 ) { if((strcmp(m_base, "F2F")!=0) && (strcmp(m_base, "I2I")!=0)) @@ -163,14 +161,16 @@ void cuobjdumpInst::printCuobjdumpBaseModifiers() output(modString); } } - else if( strcmp(modString, "ex2")==0 ) - output(modString); - else if( strcmp(modString, "sin")==0 ) - output(modString); - else if( strcmp(modString, "cos")==0 ) - output(modString); - else if( strcmp(modString, ".rz")==0 ) - output(modString); + else if( strcmp(modString, "ex2")==0 || + strcmp(modString, ".exit")==0 || + strcmp(modString, "sin")==0 || + strcmp(modString, "cos")==0 || + strcmp(modString, ".rz")==0 || + strcmp(modString, ".rp")==0 || + strcmp(modString, ".rm")==0 || + strcmp(modString, ".any")==0 || + strcmp(modString, ".all")==0 ) + output(modString); else if( strcmp(modString, ".bext")==0 ) { //".bext" is a modifier that indicated u8 to u16 type conversion, I think @@ -323,6 +323,8 @@ void cuobjdumpInst::printCuobjdumpOperand(stringListPiece* currentPiece, std::st output("%%ctaid.x"); } else if(mod == "g [0x7].u16") {//handling special register case: %ctaid.y output("%%ctaid.y"); + } else if(mod == "sr1") {//handling special register case: %clock + output("%%clock"); } else if(mod[0]=='r') { //basic register if( (strcmp(m_base, "DADD")==0) || (strcmp(m_base, "DMUL")==0) || @@ -576,13 +578,12 @@ void cuobjdumpInst::printCuobjdumpPtxPlus(std::list labelList, std: //output(" //cos"); output("cos"); printCuobjdumpBaseModifiers(); - if(m_typeModifiers->getSize() == 0) output(".f32"); //TODO: setting default type modifier but I'm not sure if this is right. else printCuobjdumpTypeModifiers(); - printCuobjdumpOperands(); + output(";"); } else if(strcmp(m_base, "DADD")==0) { @@ -598,6 +599,37 @@ void cuobjdumpInst::printCuobjdumpPtxPlus(std::list labelList, std: printCuobjdumpOperands(); output(";"); } + else if(strcmp(m_base, "DMIN")==0) + { + printCuobjdumpPredicate(); + output("min"); + printCuobjdumpBaseModifiers(); + + if(m_typeModifiers->getSize() == 0) + output(".f64"); //TODO: setting default type modifier but I'm not sure if this is right. + else + printCuobjdumpTypeModifiers(); + + printCuobjdumpOperands(); + output(";"); + } + else if(strcmp(m_base, "DMAX")==0) + { + printCuobjdumpPredicate(); + output("max"); + printCuobjdumpBaseModifiers(); + + if(m_typeModifiers->getSize() == 0) + output(".f64"); //TODO: setting default type modifier but I'm not sure if this is right. + else + printCuobjdumpTypeModifiers(); + + printCuobjdumpOperands(); + output(";"); + } + + + /* else if(strcmp(m_base, "DFMA")==0) { printCuobjdumpPredicate(); @@ -612,6 +644,7 @@ void cuobjdumpInst::printCuobjdumpPtxPlus(std::list labelList, std: printCuobjdumpOperands(); output(";"); } + */ else if(strcmp(m_base, "DMUL")==0) { printCuobjdumpPredicate(); @@ -765,7 +798,23 @@ void cuobjdumpInst::printCuobjdumpPtxPlus(std::list labelList, std: if(m_typeModifiers->getSize() == 0) { - output(".f32"); output(".f32"); + output(".f32.f32"); + } + else + printCuobjdumpTypeModifiers(); + + printCuobjdumpOperands(); + output(";"); + } + else if(strcmp(m_base, "DSET")==0) + { + printCuobjdumpPredicate(); + output("set"); + printCuobjdumpBaseModifiers(); + + if(m_typeModifiers->getSize() == 0) + { + output(".f64.f64"); } else printCuobjdumpTypeModifiers(); @@ -1009,6 +1058,21 @@ void cuobjdumpInst::printCuobjdumpPtxPlus(std::list labelList, std: printCuobjdumpOperands(); output(";"); } + else if(strcmp(m_base, "ISAD")==0) + { + printCuobjdumpPredicate(); + output("sad"); + printCuobjdumpBaseModifiers(); + + if(m_typeModifiers->getSize() == 0) + output(int_default_mod()); //TODO: setting default type modifier but I'm not sure if this is right. + else + printCuobjdumpTypeModifiers(); + + printCuobjdumpOperands(); + output(";"); + } + else if(strcmp(m_base, "IMAD.U24")==0) { printCuobjdumpPredicate(); @@ -1523,6 +1587,7 @@ void cuobjdumpInst::printCuobjdumpPtxPlus(std::list labelList, std: printCuobjdumpTypeModifiers(); printCuobjdumpOperands(); + output(";"); } else if(strcmp(m_base, "S2R")==0) { @@ -1535,6 +1600,7 @@ void cuobjdumpInst::printCuobjdumpPtxPlus(std::list labelList, std: else printCuobjdumpTypeModifiers(); printCuobjdumpOperands(); + output(";"); } else if(strcmp(m_base, "LD")==0) { @@ -1706,6 +1772,21 @@ void cuobjdumpInst::printCuobjdumpPtxPlus(std::list labelList, std: output("mov.pred"); printCuobjdumpOperands(); output(";"); + } else if(strcmp(m_base, "VOTE")==0) { + printCuobjdumpPredicate(); + output("vote"); + printCuobjdumpBaseModifiers(); + printCuobjdumpTypeModifiers(); + printCuobjdumpOperands(); + output(";"); + } + else if(strcmp(m_base, "DFMA")==0) + { + printCuobjdumpPredicate(); + output("fma.rz.f64"); + printCuobjdumpBaseModifiers(); + printCuobjdumpOperands(); + output(";"); } else { diff --git a/cuobjdump_to_ptxplus/sass.l b/cuobjdump_to_ptxplus/sass.l index 88187f5..e665770 100644 --- a/cuobjdump_to_ptxplus/sass.l +++ b/cuobjdump_to_ptxplus/sass.l @@ -54,6 +54,8 @@ BRA yylval.string_value = strdup(yytext); return BRA; CAL yylval.string_value = strdup(yytext); return CAL; COS yylval.string_value = strdup(yytext); return COS; DADD yylval.string_value = strdup(yytext); return DADD; +DMIN yylval.string_value = strdup(yytext); return DMIN; +DMAX yylval.string_value = strdup(yytext); return DMAX; DFMA yylval.string_value = strdup(yytext); return DFMA; DMUL yylval.string_value = strdup(yytext); return DMUL; EX2 yylval.string_value = strdup(yytext); return EX2; @@ -68,6 +70,7 @@ FMUL yylval.string_value = strdup(yytext); return FMUL; FMUL32 yylval.string_value = strdup(yytext); return FMUL32; FMUL32I yylval.string_value = strdup(yytext); return FMUL32I; FSET yylval.string_value = strdup(yytext); return FSET; +DSET yylval.string_value = strdup(yytext); return DSET; G2R yylval.string_value = strdup(yytext); return G2R; GLD yylval.string_value = strdup(yytext); return GLD; GST yylval.string_value = strdup(yytext); return GST; @@ -82,6 +85,7 @@ IADD\.CARRY{numeric} yylval.string_value = strdup(yytext); return IADDCARRY; IADD32 yylval.string_value = strdup(yytext); return IADD32; IADD32I yylval.string_value = strdup(yytext); return IADD32I; IMAD yylval.string_value = strdup(yytext); return IMAD; +ISAD yylval.string_value = strdup(yytext); return ISAD; IMAD\.U24 yylval.string_value = strdup(yytext); return IMAD24; IMAD\.S24 yylval.string_value = strdup(yytext); return IMAD24; IMAD32 yylval.string_value = strdup(yytext); return IMAD32; @@ -140,6 +144,7 @@ GRED yylval.string_value = strdup(yytext); return GRED; GATOM yylval.string_value = strdup(yytext); return GATOM; PBK yylval.string_value = strdup(yytext); return PBK; BRK yylval.string_value = strdup(yytext); return BRK; +VOTE yylval.string_value = strdup(yytext); return VOTE; /*instruction modifiers*/ EQ yylval.string_value = strdup(yytext); return EQ; @@ -158,10 +163,16 @@ NEU yylval.string_value = strdup(yytext); return NEU; \.S yylval.string_value = strdup(yytext); return DOTS; \.SFU yylval.string_value = strdup(yytext); return DOTSFU; \.TRUNC yylval.string_value = strdup(yytext); return DOTTRUNC; -\.IR yylval.string_value = strdup(yytext); /*return DOTIR;*/ +\.CEIL yylval.string_value = strdup(yytext); return DOTCEIL; +\.FLOOR yylval.string_value = strdup(yytext); return DOTFLOOR; +\.IR yylval.string_value = strdup(yytext); /*unknown*/ \.UN yylval.string_value = strdup(yytext); return DOTUN; \.NODEP yylval.string_value = strdup(yytext); return DOTNODEP; -\.SAT yylval.string_value = strdup(yytext); +\.SAT yylval.string_value = strdup(yytext); /*unknown*/ +\.ANY yylval.string_value = strdup(yytext); return DOTANY; +\.ALL yylval.string_value = strdup(yytext); return DOTALL; +\.MAD yylval.string_value = strdup(yytext); /*unknown*/ + /* comparison operators */ @@ -180,6 +191,7 @@ NEU yylval.string_value = strdup(yytext); return NEU; \.NOT_SIGN yylval.string_value = strdup(yytext); return DOTNSF; \.SIGN yylval.string_value = strdup(yytext); return DOTSF; \.CARRY yylval.string_value = strdup(yytext); return DOTCARRY; +\.CARRY{numeric} yylval.string_value = strdup(yytext); /*unknown*/ \.CC yylval.string_value = strdup(yytext); return DOTCC; \.X yylval.string_value = strdup(yytext); return DOTX; \.E yylval.string_value = strdup(yytext); return DOTE; diff --git a/cuobjdump_to_ptxplus/sass.y b/cuobjdump_to_ptxplus/sass.y index 33785a0..7d23765 100644 --- a/cuobjdump_to_ptxplus/sass.y +++ b/cuobjdump_to_ptxplus/sass.y @@ -20,18 +20,18 @@ cuobjdumpInst *instEntry; } %token BAR -%token ADA AND ANDS BRA CAL COS DADD DFMA DMUL EX2 F2F F2I FADD -%token FADD32 FADD32I FMAD FMAD32I FMUL FMUL32 FMUL32I FSET G2R -%token GLD GST I2F I2I IADD IADD32 IADD32I IMAD IMAD24 IMAD32I IMAD32 IADDCARRY +%token ADA AND ANDS BRA CAL COS DADD DMIN DMAX DFMA DMUL EX2 F2F F2I FADD +%token FADD32 FADD32I FMAD FMAD32I FMUL FMUL32 FMUL32I FSET DSET G2R +%token GLD GST I2F I2I IADD IADD32 IADD32I IMAD ISAD IMAD24 IMAD32I IMAD32 IADDCARRY %token IMUL IMUL24 IMULS24 IMUL32 IMUL32S24 IMUL32U24 IMUL32I IMUL32I24 IMUL32IS24 %token ISET LG2 LLD LST MOV MOV32 MVC MVI NOP NOT NOTS OR ORS %token R2A R2G R2GU16U8 RCP RCP32 RET RRO RSQ SIN SHL SHR SSY XOR XORS %token S2R SASS_LD STS LDS SASS_ST IMIN IMAX A2R FMAX FMIN TEX TEX32 C2R EXIT -%token GRED PBK BRK R2C GATOM +%token GRED PBK BRK R2C GATOM VOTE %token EQ EQU GE GEU GT GTU LE LEU LT LTU NE NEU %token DOTBEXT DOTS DOTSFU -%token DOTTRUNC DOTIR DOTUN DOTNODEP DOTSAT +%token DOTTRUNC DOTCEIL DOTFLOOR DOTIR DOTUN DOTNODEP DOTSAT DOTANY DOTALL %token DOTF16 DOTF32 DOTF64 DOTS8 DOTS16 DOTS32 DOTS64 DOTS128 DOTU8 DOTU16 DOTU32 DOTU24 DOTU64 %token DOTHI DOTNOINC %token DOTEQ DOTEQU DOTGE DOTGEU DOTGT DOTGTU DOTLE DOTLEU DOTLT DOTLTU DOTNE DOTNEU DOTNSF DOTSF DOTCARRY @@ -137,17 +137,17 @@ baseInstruction : simpleInstructions { printf($1); instEntry->setBase($1); g_ins | pbkInstruction ; -simpleInstructions : ADA | AND | ANDS | COS | DADD | DFMA | DMUL | EX2 | F2F +simpleInstructions : ADA | AND | ANDS | COS | DADD | DMIN | DMAX | DFMA | DMUL | EX2 | F2F | F2I | FADD | FADD32 | FADD32I | FMAD | FMAD32I | FMUL - | FMUL32 | FMUL32I | FSET | G2R | GLD | GST | I2F | I2I - | IADD | IADD32 | IADD32I | IMAD | IMAD24 | IMAD32I | IMAD32 | IMUL + | FMUL32 | FMUL32I | FSET | DSET | G2R | GLD | GST | I2F | I2I + | IADD | IADD32 | IADD32I | IMAD | ISAD | IMAD24 | IMAD32I | IMAD32 | IMUL | IMUL24 | IMULS24 | IMUL32 | IMUL32S24 | IMUL32I | IMUL32I24 | IMUL32IS24 | IMUL32U24 | ISET | LG2 | LLD | LST | MOV | MOV32 | MVC | MVI | NOP | NOT | NOTS | OR | ORS | R2A | R2G | R2GU16U8 | RCP | RCP32 | RET | RRO | RSQ | SHL | SHR | SIN | SSY | XOR | XORS | S2R | SASS_LD | STS | LDS | SASS_ST | EXIT | BAR | IMIN | IMAX | A2R | FMAX | FMIN - | TEX | TEX32 | C2R | BRK | R2C | IADDCARRY + | TEX | TEX32 | C2R | BRK | R2C | IADDCARRY | VOTE ; pbkInstruction : PBK { @@ -258,6 +258,8 @@ modifier : opTypes { printf($1); g_instList->getListEnd().addTypeModifier($1);} | DOTS { g_instList->getListEnd().addBaseModifier(".s"); } | DOTSFU { g_instList->getListEnd().addBaseModifier(".sfu"); } | DOTTRUNC { g_instList->getListEnd().addBaseModifier(".rz"); } + | DOTCEIL { g_instList->getListEnd().addBaseModifier(".rp"); } + | DOTFLOOR { g_instList->getListEnd().addBaseModifier(".rm"); } | DOTX { g_instList->getListEnd().addBaseModifier(".x"); } | DOTE { g_instList->getListEnd().addBaseModifier(".e"); } | DOTRED { g_instList->getListEnd().addBaseModifier(".red"); } @@ -265,6 +267,8 @@ modifier : opTypes { printf($1); g_instList->getListEnd().addTypeModifier($1);} | DOTIR { g_instList->getListEnd().addBaseModifier(".ir"); } | DOTUN { /*g_instList->getListEnd().addBaseModifier(".un"); */} | DOTNODEP { /*g_instList->getListEnd().addBaseModifier(".nodep"); */} + | DOTANY { g_instList->getListEnd().addBaseModifier(".any"); } + | DOTALL { g_instList->getListEnd().addBaseModifier(".all"); } ; opTypes : DOTF16 //{ printf($1); g_instList->getListEnd().addTypeModifier($1);} -- cgit v1.3