+// 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