From: Mark Wooding Date: Sun, 11 Oct 2020 23:20:30 +0000 (+0100) Subject: base/regdump.c: Print matching condition codes along with CPU flags. X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/commitdiff_plain/05671f2db61c4f2be5e5927f65e0ef53a76a047e base/regdump.c: Print matching condition codes along with CPU flags. --- diff --git a/base/regdump.c b/base/regdump.c index 89edbcd1..0fa76df0 100644 --- a/base/regdump.c +++ b/base/regdump.c @@ -375,6 +375,14 @@ static const char *regname(char *buf, uint32 f) # define GP(gp) (gp).u64 #endif +#define CF (1 << 0) +#define PF (1 << 2) +#define AF (1 << 4) +#define ZF (1 << 6) +#define SF (1 << 7) +#define DF (1 << 10) +#define OF (1 << 11) + void regdump_init(void) { ; } static void dump_flags(const char *lbl, const char *reg, gpreg f) @@ -391,6 +399,17 @@ static void dump_flags(const char *lbl, const char *reg, gpreg f) (GP(f) >> 7)&1u ? '+' : '-', (GP(f) >> 10)&1u ? '+' : '-', (GP(f) >> 11)&1u ? '+' : '-'); + printf(";;\t\tcond:"); + if (GP(f)&CF) printf(" c/b/nae"); else printf(" nc/ae/nb"); + if (GP(f)&ZF) printf(" e/z"); else printf(" ne/nz"); + if (GP(f)&SF) printf(" s"); else printf(" ns"); + if (GP(f)&OF) printf(" o"); else printf(" no"); + if (GP(f)&PF) printf(" p"); else printf(" np"); + if ((GP(f)&CF) || (GP(f)&ZF)) printf(" be/na"); else printf(" a/nbe"); + if (!(GP(f)&OF) == !(GP(f)&SF)) printf(" ge/nl"); else printf(" l/nge"); + if (!(GP(f)&OF) == !(GP(f)&SF) && !(GP(f)&ZF)) + printf(" g/nle"); else printf(" le/ng"); + putchar('\n'); printf(";;\t\tsystem: %ctf %cif iopl=%d %cnt " "%crf %cvm %cac %cvif %cvip %cid\n", (GP(f) >> 8)&1u ? '+' : '-', @@ -549,6 +568,11 @@ void regdump_simd(const struct regmap *map) #if CPUFAM_ARMEL +#define NF (1u << 31) +#define ZF (1u << 30) +#define CF (1u << 29) +#define VF (1u << 28) + unsigned regdump__flags = 0; void regdump_init(void) @@ -557,6 +581,17 @@ void regdump_init(void) if (cpu_feature_p(CPUFEAT_ARM_D32)) regdump__flags |= REGF_D32; } +static void dump_conditions(unsigned f) +{ + if (f&NF) printf(" mi"); else printf(" pl"); + if (f&ZF) printf(" eq"); else printf(" ne"); + if (f&CF) printf(" cs/hs"); else printf(" cc/lo"); + if (f&VF) printf(" vs"); else printf(" vc"); + if ((f&CF) && !(f&ZF)) printf(" hi"); else printf(" ls"); + if (!(f&VF) == !(f&NF)) printf(" ge"); else printf(" lt"); + if (!(f&VF) == !(f&NF) && !(f&ZF)) printf(" gt"); else printf(" le"); +} + static void dump_flags(const char *lbl, unsigned f) { static const char @@ -570,7 +605,7 @@ static void dump_flags(const char *lbl, unsigned f) printf(";; "); if (lbl) printf("%s: ", lbl); printf(" cpsr = 0x%08x\n", f); - printf(";;\t\tuser: %cn %cz %cc %cv %cq ge=%c%c%c%c\n", + printf(";;\t\tuser: %cn %cz %cc %cv %cq ge=%c%c%c%c;", (f >> 31)&1u ? '+' : '-', (f >> 30)&1u ? '+' : '-', (f >> 29)&1u ? '+' : '-', @@ -580,6 +615,7 @@ static void dump_flags(const char *lbl, unsigned f) (f >> 18)&1u ? '1' : '0', (f >> 17)&1u ? '1' : '0', (f >> 16)&1u ? '1' : '0'); + dump_conditions(f); putchar('\n'); printf(";;\t\tsystem: %cj it=%s:%c%c%c%c %ce %ca %ci %cf %ct m=%s\n", (f >> 24)&1u ? '+' : '-', condtab[(f >> 12)&15u], @@ -602,12 +638,13 @@ static void dump_fpflags(const char *lbl, unsigned f) printf(";; "); if (lbl) printf("%s: ", lbl); printf(" fpscr = 0x%08x\n", f); - printf(";;\t\tcond: %cn %cz %cc %cv %cqc\n", + printf(";;\t\tcond: %cn %cz %cc %cv %cqc;", (f >> 31)&1u ? '+' : '-', (f >> 30)&1u ? '+' : '-', (f >> 29)&1u ? '+' : '-', (f >> 28)&1u ? '+' : '-', (f >> 27)&1u ? '+' : '-'); + dump_conditions(f); putchar('\n'); printf(";;\t\ttrap: %cide %cixe %cufe %cofe %cdze %cioe\n", (f >> 15)&1u ? '+' : '-', (f >> 12)&1u ? '+' : '-', @@ -674,18 +711,35 @@ void regdump_simd(const struct regmap *map) { ; } #if CPUFAM_ARM64 +#define NF (1u << 31) +#define ZF (1u << 30) +#define CF (1u << 29) +#define VF (1u << 28) + void regdump_init(void) { ; } +static void dump_conditions(unsigned f) +{ + if (f&NF) printf(" mi"); else printf(" pl"); + if (f&ZF) printf(" eq"); else printf(" ne"); + if (f&CF) printf(" cs/hs"); else printf(" cc/lo"); + if (f&VF) printf(" vs"); else printf(" vc"); + if ((f&CF) && !(f&ZF)) printf(" hi"); else printf(" ls"); + if (!(f&VF) == !(f&NF)) printf(" ge"); else printf(" lt"); + if (!(f&VF) == !(f&NF) && !(f&ZF)) printf(" gt"); else printf(" le"); +} + static void dump_flags(const char *lbl, unsigned f) { printf(";; "); if (lbl) printf("%s: ", lbl); printf(" nzcv = 0x%08x\n", f); - printf(";;\t\tuser: %cn %cz %cc %cv\n", + printf(";;\t\tuser: %cn %cz %cc %cv;", (f >> 31)&1u ? '+' : '-', (f >> 30)&1u ? '+' : '-', (f >> 29)&1u ? '+' : '-', (f >> 28)&1u ? '+' : '-'); + dump_conditions(f); putchar('\n'); } static void dump_fpflags(const char *lbl, const struct fpsave *fp) @@ -696,12 +750,13 @@ static void dump_fpflags(const char *lbl, const struct fpsave *fp) printf(";; "); if (lbl) printf("%s: ", lbl); printf(" fpsr = 0x%08x\n", fp->fpsr); - printf(";;\t\tcond: %cn %cz %cc %cv %cqc\n", + printf(";;\t\tcond_a32: %cn %cz %cc %cv %cqc;", (fp->fpsr >> 31)&1u ? '+' : '-', (fp->fpsr >> 30)&1u ? '+' : '-', (fp->fpsr >> 29)&1u ? '+' : '-', (fp->fpsr >> 28)&1u ? '+' : '-', (fp->fpsr >> 27)&1u ? '+' : '-'); + dump_conditions(fp->fpsr); putchar('\n'); printf(";;\t\terror: %cidc %cixc %cufc %cofc %cdzc %cioc\n", (fp->fpsr >> 7)&1u ? '+' : '-', (fp->fpsr >> 4)&1u ? '+' : '-',