[PATCH v4] opcodes: Fix BMASKI disassembly for immediate 32 on M*Core

Michal Sobon msobon@hex-rays.com
Tue Jan 20 16:13:55 GMT 2026


The BMASKI instruction has three encoding variants (OMa, OMb, OMc).
The OMa encoding (0x2C00, mask 0xFFF0) specifically represents
BMASKI with immediate 32, encoded as IMM5=0.

Per Motorola M*Core specification: "An IMM5 value of 0 is interpreted
as a value of 32."

Previously, all three variants extracted the immediate the same way,
causing OMa to incorrectly display 0 instead of 32.

Before: 0x2c04 -> bmaski r4, 0
After:  0x2c04 -> bmaski r4, 32

opcodes/
	* mcore-dis.c (print_insn_mcore): Handle OMa encoding to display
	immediate 32 instead of 0 for BMASKI.

gas/testsuite/
	* gas/mcore/allinsn.s: Add test for bmaski with immediate 32.
	Replace two clrc padding instructions with one for 4-byte alignment.
	Fix missing newline at end of file.
	* gas/mcore/allinsn.d: Update expected output.

Signed-off-by: Michal Sobon <msobon@hex-rays.com>
---
 gas/testsuite/gas/mcore/allinsn.d | 4 +++-
 gas/testsuite/gas/mcore/allinsn.s | 5 ++---
 opcodes/mcore-dis.c               | 5 ++++-
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/gas/testsuite/gas/mcore/allinsn.d b/gas/testsuite/gas/mcore/allinsn.d
index cf3b0ff6339..01a873f7865 100644
--- a/gas/testsuite/gas/mcore/allinsn.d
+++ b/gas/testsuite/gas/mcore/allinsn.d
@@ -394,5 +394,7 @@ Disassembly of section \.text:
 
 0+0106 <zexth>:
  106:	0164      	zexth	r4
- 108:	0f00      	cmpne	r0, r0
+
+0+0108 <Bmaski>:
+ 108:	2c04      	bmaski	r4, 32
  10a:	0f00      	cmpne	r0, r0
diff --git a/gas/testsuite/gas/mcore/allinsn.s b/gas/testsuite/gas/mcore/allinsn.s
index 7f21e514f58..b32782d3bee 100644
--- a/gas/testsuite/gas/mcore/allinsn.s
+++ b/gas/testsuite/gas/mcore/allinsn.s
@@ -141,6 +141,5 @@ foolit:
 	test xtrb3  "r1, r13"
 	test zextb  r8
 	test zexth  r4
-	clrc			// These two instructions pad the object file
-	clrc			// out to a 16 byte boundary.
-	
\ No newline at end of file
+	test Bmaski "r4, 32"
+	clrc			// Pad to 4-byte boundary
diff --git a/opcodes/mcore-dis.c b/opcodes/mcore-dis.c
index 2cf84270014..a3e7d0b9e95 100644
--- a/opcodes/mcore-dis.c
+++ b/opcodes/mcore-dis.c
@@ -179,12 +179,15 @@ print_insn_mcore (bfd_vma memaddr,
 	case OBRc:
 	case SI:
 	case SIa:
-	case OMa:
 	case OMb:
 	case OMc:
 	  (*print_func) (stream, "\t%s, %d", name, (inst >> 4) & 0x1F);
 	  break;
 
+	case OMa:
+	  (*print_func) (stream, "\t%s, %d", name, 32);
+	  break;
+
 	case I7:
 	  (*print_func) (stream, "\t%s, %d", name, (inst >> 4) & 0x7F);
 	  break;
-- 
2.43.0



More information about the Binutils mailing list