PPC_FALTIVEC = 0x00050000,
PPC_MISC = 0x00060000,
PPC_SH_ALGEBRAIC = 0x00070000,
+ PPC_MFSPR = 0x00080000,
PPC_FAMILY = 0x000F0000,
/* Flags: these may be combined, so use separate bitfields. */
PPC_CR = 0x01000000,
#endif // #ifdef __powerpc64__
{ NULL, NULL, },
};
+static test_t tests_il_ops_mfspr[] = {
+ { &test_mfspr , " mfspr", },
+ { &test_mtspr , " mtspr", },
+ { NULL, NULL, },
+};
+
static test_t tests_il_ops_spe[] = {
{ &test_rlwimi , " rlwimi", },
{ &test_rlwinm , " rlwinm", },
{ &test_rlwnm , " rlwnm", },
{ &test_mfcr , " mfcr", },
- { &test_mfspr , " mfspr", },
- { &test_mtspr , " mtspr", },
#ifdef __powerpc64__
{ &test_rldcl , " rldcl", },
{ &test_rldcr , " rldcr", },
"PPC integer logical insns with one arg with flags update",
0x01010201,
},
+ {
+ tests_il_ops_mfspr ,
+ "PPC mfspr instructions",
+ 0x00080207,
+ },
{
tests_il_ops_spe ,
"PPC logical insns with special forms",
&test_int_special,
};
-static test_loop_t int_loops[] = {
+static test_loop_t int_mfspr[] = {
+ &test_int_special,
+};
+
+ static test_loop_t int_loops[] = {
&test_int_one_arg,
&test_int_two_args,
&test_int_three_args,
typedef struct insn_sel_flags_t_struct {
int one_arg, two_args, three_args;
int arith, logical, compare, ldst;
- int integer, floats, p405, altivec, faltivec, misc, sh_algebraic;
+ int integer, floats, p405, altivec, faltivec, misc, sh_algebraic, mfspr;
int cr;
} insn_sel_flags_t;
(family == PPC_ALTIVEC && !seln_flags.altivec) ||
(family == PPC_MISC && !seln_flags.misc) ||
(family == PPC_SH_ALGEBRAIC && !seln_flags.sh_algebraic) ||
+ (family == PPC_MFSPR && !seln_flags.mfspr) ||
(family == PPC_FALTIVEC && !seln_flags.faltivec))
continue;
/* Check flags update */
case PPC_SH_ALGEBRAIC:
loop = &int_sh_algebraic[0];
break;
+ case PPC_MFSPR:
+ loop = &int_mfspr[0];
+ break;
case PPC_MISC:
loop = &misc_loops[0];
break;
"\t-a: test altivec instructions\n"
"\t-m: test miscellaneous instructions\n"
"\t-s: test shift algebraic (sraw, srawi, srad, sradi) instructions\n"
+ "\t-M: test mfspr instructions\n"
"\t-A: test all (int, fp, altivec) instructions\n"
"\t-v: be verbose\n"
"\t-h: display this help and exit\n"
flags.faltivec = 0;
flags.cr = -1;
flags.sh_algebraic = 0;
+ flags.mfspr = 0;
while ((c = getopt(argc, argv, "123t:f:n:r:uvh")) != -1) {
switch (c) {
flags.altivec = 1;
flags.faltivec = 1;
flags.algebraic = 1;
+ flags.mfspr = 1;
}
// Default cr update
if (flags.cr == -1)
flags.altivec = 0;
flags.faltivec = 0;
flags.sh_algebraic = 0;
+ flags.mfspr = 0;
// Flags
flags.cr = 2;
- while ((c = getopt(argc, argv, "ilcLfmsahvA")) != -1) {
+ while ((c = getopt(argc, argv, "ilcLfmMsahvA")) != -1) {
switch (c) {
case 'i':
flags.arith = 1;
flags.logical = 1;
flags.sh_algebraic = 1;
break;
+ case 'M':
+ flags.logical = 1;
+ flags.mfspr = 1;
+ break;
case 'l':
flags.logical = 1;
flags.integer = 1;
printf(" altivec = %d\n", flags.altivec);
printf(" faltivec = %d\n", flags.faltivec);
printf(" sh_algebraic = %d\n", flags.sh_algebraic);
+ printf(" mfspr = %d\n", flags.mfspr);
printf(" cr update: \n");
printf(" cr = %d\n", flags.cr);
printf("\n");
mfcr (0000001cbe991def) => 00000000be991def (be991def 00000000)
mfcr (ffffffffffffffff) => 00000000ffffffff (ffffffff 00000000)
- mfspr 1 (00000000) -> mtxer -> mfxer => 0000000000000000
- mfspr 1 (be991def) -> mtxer -> mfxer => 00000000a000006f
- mfspr 1 (ffffffff) -> mtxer -> mfxer => 00000000e000007f
- mfspr 8 (00000000) -> mtlr -> mflr => 0000000000000000
- mfspr 8 (be991def) -> mtlr -> mflr => ffffffffbe991def
- mfspr 8 (ffffffff) -> mtlr -> mflr => ffffffffffffffff
- mfspr 9 (00000000) -> mtctr -> mfctr => 0000000000000000
- mfspr 9 (be991def) -> mtctr -> mfctr => ffffffffbe991def
- mfspr 9 (ffffffff) -> mtctr -> mfctr => ffffffffffffffff
-
-
rldcl 0000000000000000, 0000000000000000, 0 => 0000000000000000 (00000000 00000000)
rldcl 0000000000000000, 0000000000000000, 7 => 0000000000000000 (00000000 00000000)
rldcl 0000000000000000, 0000000000000000, 14 => 0000000000000000 (00000000 00000000)
stdux 0000001cbe991def, 8 => 0000001cbe991def, 8 (00000000 00000000)
stdux ffffffffffffffff, 16 => ffffffffffffffff, 16 (00000000 00000000)
-All done. Tested 123 different instructions
+All done. Tested 121 different instructions