I was able to reproduce your problem on IDA 6.95 but it seems like this bug was fixed in IDA 7 since it works for me just fine. The solution below will be relevant to IDA 6.95 though it would probably be valid to earlier versions of IDA Pro.
Let's start by describing the deadlock we're facing with:
The problematic function,
GetMnem, is declared in
IDA 6.95\Python\idc.py:L2280 and looks like this:
Get instruction mnemonics
@param ea: linear address of instruction
@return: "" - no instruction at the specified location
@note: this function may not return exactly the same mnemonics
as you see on the screen.
res = ida_ua.ua_mnem(ea)
if not res:
Pay attention to the following disclaimer in the function:
@note: this function may not return exactly the same mnemonics as you see on the screen.
Seems like our problems fits the disclaimer -- we don't see the same mnemonics as we see on the screen.
As you can see,
GetMnem is basically a wrapper to another function --
ua_mnem which is declared in
ua_mnem(ea) -> char const *
Well, seems like
ua_mnem is a wrapper to another function which is located in
IDA 6.95\python\lib\python2.7\lib-dynload\ida_64\_ida_ua.pyd. A
pyd file is actually a DLL file and should not be easy-peasy to reverse. Therefore, we can't see, nor edit, the source code so we can't fix the problem.
Here comes the workaround: instead of using
GetMnem you can simply mimic it by using
GetDisasm and split the line to get only the instruction:
for seg_ea in Segments():
for head in Heads(seg_ea, SegEnd(seg_ea)):
mnem = GetMnem(head)
mnem = GetDisasm(head).split()
In this case we check whether the mnemonics is a branch instruction (begins with "B") and if so, we use the mnemonics from
GetDisasm and not from
GetMnem. Of course you would need to test this solution better and maybe handle some specific cases.