support a few ARMv6 instructions
[cyclone68000.git] / OpAny.cpp
index 8cb8c09..64e2bfe 100644 (file)
--- a/OpAny.cpp
+++ b/OpAny.cpp
@@ -165,6 +165,52 @@ void OpGetFlagsNZ(int rd)
   ot("  orreq r10,r10,#0x40000000 ;@ get NZ, clear CV\n");\r
 }\r
 \r
+// size 0=8bit, 1=16bit\r
+void SignExtend(int rd, int rs, int size)\r
+{\r
+  if (size >= 2)\r
+  {\r
+    if (rd != rs)\r
+      ot("  mov r%d,r%d\n", rd, rs);\r
+    return;\r
+  }\r
+#if defined(HAVE_ARMv6) && (HAVE_ARMv6)\r
+  if (size == 1)\r
+    ot("  sxth r%d,r%d ;@ sign extend\n", rd, rs);\r
+  else\r
+    ot("  sxtb r%d,r%d ;@ sign extend\n", rd, rs);\r
+#else\r
+  int shift = size ? 16 : 24;\r
+  ot("  mov r%d,r%d,asl #%d\n", rd, rs, shift);\r
+  ot("  mov r%d,r%d,asr #%d ;@ sign extend\n", rd, rd, shift);\r
+#endif\r
+}\r
+\r
+void ZeroExtend(int rd, int rs, int size)\r
+{\r
+  if (size >= 2)\r
+  {\r
+    if (rd != rs)\r
+      ot("  mov r%d,r%d\n", rd, rs);\r
+    return;\r
+  }\r
+#if defined(HAVE_ARMv6) && (HAVE_ARMv6)\r
+  if (size == 1)\r
+    ot("  uxth r%d,r%d ;@ zero extend\n", rd, rs);\r
+  else\r
+#else\r
+  if (size == 1)\r
+  {\r
+    ot("  mov r%d,r%d,lsl #16\n", rd, rs);\r
+    ot("  mov r%d,r%d,lsr #16 ;@ zero extend\n", rd, rd);\r
+  }\r
+  else\r
+#endif\r
+  {\r
+    ot("  and r%d,r%d,#0xff ;@ zero extend\n", rd, rs);\r
+  }\r
+}\r
+\r
 // -----------------------------------------------------------------\r
 \r
 int g_op;\r