+// trashes r0\r
+const char *TestCond(int m68k_cc, int invert)\r
+{\r
+ const char *cond="";\r
+ const char *icond="";\r
+\r
+ // ARM: NZCV\r
+ switch (m68k_cc)\r
+ {\r
+ case 0x00: // T\r
+ case 0x01: // F\r
+ break;\r
+ case 0x02: // hi\r
+ ot(" tst r10,#0x60000000 ;@ hi: !C && !Z\n");\r
+ cond="eq", icond="ne";\r
+ break;\r
+ case 0x03: // ls\r
+ ot(" tst r10,#0x60000000 ;@ ls: C || Z\n");\r
+ cond="ne", icond="eq";\r
+ break;\r
+ case 0x04: // cc\r
+ ot(" tst r10,#0x20000000 ;@ cc: !C\n");\r
+ cond="eq", icond="ne";\r
+ break;\r
+ case 0x05: // cs\r
+ ot(" tst r10,#0x20000000 ;@ cs: C\n");\r
+ cond="ne", icond="eq";\r
+ break;\r
+ case 0x06: // ne\r
+ ot(" tst r10,#0x40000000 ;@ ne: !Z\n");\r
+ cond="eq", icond="ne";\r
+ break;\r
+ case 0x07: // eq\r
+ ot(" tst r10,#0x40000000 ;@ eq: Z\n");\r
+ cond="ne", icond="eq";\r
+ break;\r
+ case 0x08: // vc\r
+ ot(" tst r10,#0x10000000 ;@ vc: !V\n");\r
+ cond="eq", icond="ne";\r
+ break;\r
+ case 0x09: // vs\r
+ ot(" tst r10,#0x10000000 ;@ vs: V\n");\r
+ cond="ne", icond="eq";\r
+ break;\r
+ case 0x0a: // pl\r
+ ot(" tst r10,r10 ;@ pl: !N\n");\r
+ cond="pl", icond="mi";\r
+ break;\r
+ case 0x0b: // mi\r
+ ot(" tst r10,r10 ;@ mi: N\n");\r
+ cond="mi", icond="pl";\r
+ break;\r
+ case 0x0c: // ge\r
+ ot(" teq r10,r10,lsl #3 ;@ ge: N == V\n");\r
+ cond="pl", icond="mi";\r
+ break;\r
+ case 0x0d: // lt\r
+ ot(" teq r10,r10,lsl #3 ;@ lt: N != V\n");\r
+ cond="mi", icond="pl";\r
+ break;\r
+ case 0x0e: // gt\r
+ ot(" eor r0,r10,r10,lsl #3 ;@ gt: !Z && N == V\n");\r
+ ot(" orrs r0,r0,r10,lsl #1\n");\r
+ cond="pl", icond="mi";\r
+ break;\r
+ case 0x0f: // le\r
+ ot(" eor r0,r10,r10,lsl #3 ;@ le: Z || N != V\n");\r
+ ot(" orrs r0,r0,r10,lsl #1\n");\r
+ cond="mi", icond="pl";\r
+ break;\r
+ default:\r
+ printf("invalid m68k_cc: %x\n", m68k_cc);\r
+ exit(1);\r
+ break;\r
+ }\r
+ return invert?icond:cond;\r
+}\r
+\r