diff --git a/sim/mcore/interp.c b/sim/mcore/interp.c
index 53cfdad050b..48d9ff8645a 100644
--- a/sim/mcore/interp.c
+++ b/sim/mcore/interp.c
@@ -641,8 +641,8 @@ step_once (SIM_DESC sd, SIM_CPU *cpu)
 	      {
 		long tmp;
 		tmp = gr[RD];
-		tmp <<= 24;
-		tmp >>= 24;
+		tmp <<= (sizeof (tmp) * 8) - 8;
+		tmp >>= (sizeof (tmp) * 8) - 8;
 		gr[RD] = tmp;
 	      }
 	      break;
@@ -653,8 +653,8 @@ step_once (SIM_DESC sd, SIM_CPU *cpu)
 	      {
 		long tmp;
 		tmp = gr[RD];
-		tmp <<= 16;
-		tmp >>= 16;
+		tmp <<= (sizeof (tmp) * 8) - 16;
+		tmp >>= (sizeof (tmp) * 8) - 16;
 		gr[RD] = tmp;
 	      }
 	      break;
diff --git a/sim/testsuite/mcore/sextb.s b/sim/testsuite/mcore/sextb.s
new file mode 100644
index 00000000000..5500f7abe67
--- /dev/null
+++ b/sim/testsuite/mcore/sextb.s
@@ -0,0 +1,25 @@
+# check that sext.b/sext.h work correctly
+# mach: mcore
+
+.include "testutils.inc"
+
+	start
+	# Construct -120 using bgeni+addi+sext
+	bgeni	r2, 7
+	addi	r2,8
+	sextb	r2
+
+	# Construct -120 using movi+not
+	movi	r7,119
+	not	r7
+
+	# Compare them, they should be equal
+	cmpne	r2,r7
+	jbt	.L1
+	pass
+.L1:
+	fail
+
+
+
+
diff --git a/sim/testsuite/mcore/sexth.s b/sim/testsuite/mcore/sexth.s
new file mode 100644
index 00000000000..97279c49ed4
--- /dev/null
+++ b/sim/testsuite/mcore/sexth.s
@@ -0,0 +1,27 @@
+# check that sext.b/sext.h work correctly
+# mach: mcore
+
+.include "testutils.inc"
+
+	start
+	# Construct -32760 using bgeni+addi+sext
+	bgeni	r2, 15
+	addi	r2,8
+	sexth	r2
+
+	# Construct -32760 using bmask+subi+not
+        bmaski  r7,15
+        subi    r7,8    // 32759 0x7ff7
+	not	r7
+
+
+	# Compare them, they should be equal
+	cmpne	r2,r7
+	jbt	.L1
+	pass
+.L1:
+	fail
+
+
+
+
