summaryrefslogtreecommitdiff
path: root/cuobjdump_to_ptxplus/cuobjdumpInst.cc
diff options
context:
space:
mode:
authorWilson Fung <[email protected]>2012-06-30 11:15:07 -0800
committerAndrew Boktor <[email protected]>2014-08-14 13:47:33 -0700
commitbb96888d31d37760c86fa1aed3bbf203792185e7 (patch)
tree14e54644793e7b46299b5a21d67865c5a194d5fc /cuobjdump_to_ptxplus/cuobjdumpInst.cc
parente763b57bf5e79e73359fe9b8fd346ae52d382834 (diff)
Fixing one of the problems discovered for bug 154 (internal).
- Output of 16-bit integer multiplication (IMUL.U16) writes to the entire 32-bit register if a full register (i.e. not half register such as R1L) is specified as the destination. Before, it was only storing the lower 16-bit of the product into the full register. - Modified function header to declare at least 4 predicates in cuobjdump_to_ptxplus. This will mask out the problem with the predicate registers used before initialized. - Modified register value print out: now unsigned integers display their decimal values as well. [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 13246]
Diffstat (limited to 'cuobjdump_to_ptxplus/cuobjdumpInst.cc')
-rw-r--r--cuobjdump_to_ptxplus/cuobjdumpInst.cc21
1 files changed, 20 insertions, 1 deletions
diff --git a/cuobjdump_to_ptxplus/cuobjdumpInst.cc b/cuobjdump_to_ptxplus/cuobjdumpInst.cc
index fac53b4..2bdac6d 100644
--- a/cuobjdump_to_ptxplus/cuobjdumpInst.cc
+++ b/cuobjdump_to_ptxplus/cuobjdumpInst.cc
@@ -721,6 +721,24 @@ void cuobjdumpInst::printCuobjdumpOperands()
}
}
+void cuobjdumpInst::printCuobjdumpOutputModifiers(const char* defaultMod)
+{
+ std::list<std::string>::iterator typemod = m_typeModifiers->begin();
+ if (*typemod == ".U16" or *typemod == ".S16") {
+ std::list<std::string>::iterator dest_op = m_operands->begin();
+ std::string& destination = *dest_op;
+ if (destination[destination.length()-1] == 'l') {
+ output(".lo"); // write to the lower 16-bits
+ } else if (destination[destination.length()-1] == 'h') {
+ output(".hi"); // write to the upper 16-bits
+ } else {
+ output(".wide"); // write to the whole 32-bits
+ }
+ return;
+ }
+ output(defaultMod); // default output modifier for mul
+}
+
std::string int_default_mod () { return ".u32" ;}
@@ -1309,7 +1327,8 @@ void cuobjdumpInst::printCuobjdumpPtxPlus(std::list<std::string> labelList, std:
else if(m_base == "IMUL" || m_base == "IMUL32I")
{
printCuobjdumpPredicate();
- output("mul.lo");
+ output("mul");
+ printCuobjdumpOutputModifiers(".lo");
printCuobjdumpBaseModifiers();
if(m_typeModifiers->size() == 0)