+#ifdef __ALTIVEC__
+
+#ifndef PTRACE_GETVRREGS
+#define PTRACE_GETVRREGS 18
+#define PTRACE_SETVRREGS 19
+#endif
+
+#define SIZEOF_VRREGS 33*16+4
+
+static void
+ppc_fill_vrregset (void *buf)
+{
+ int i, base;
+ char *regset = buf;
+
+ base = find_regno ("vr0");
+ for (i = 0; i < 32; i++)
+ collect_register (base + i, ®set[i * 16]);
+
+ collect_register_by_name ("vscr", ®set[32 * 16 + 12]);
+ collect_register_by_name ("vrsave", ®set[33 * 16]);
+}
+
+static void
+ppc_store_vrregset (const void *buf)
+{
+ int i, base;
+ const char *regset = buf;
+
+ base = find_regno ("vr0");
+ for (i = 0; i < 32; i++)
+ supply_register (base + i, ®set[i * 16]);
+
+ supply_register_by_name ("vscr", ®set[32 * 16 + 12]);
+ supply_register_by_name ("vrsave", ®set[33 * 16]);
+}
+
+#endif /* __ALTIVEC__ */
+
+#ifdef __SPE__
+
+#ifndef PTRACE_GETEVRREGS
+#define PTRACE_GETEVRREGS 20
+#define PTRACE_SETEVRREGS 21
+#endif
+
+struct gdb_evrregset_t
+{
+ unsigned long evr[32];
+ unsigned long long acc;
+ unsigned long spefscr;
+};
+
+static void
+ppc_fill_evrregset (void *buf)
+{
+ int i, ev0;
+ struct gdb_evrregset_t *regset = buf;
+
+ ev0 = find_regno ("ev0h");
+ for (i = 0; i < 32; i++)
+ collect_register (ev0 + i, ®set->evr[i]);
+
+ collect_register_by_name ("acc", ®set->acc);
+ collect_register_by_name ("spefscr", ®set->spefscr);
+}
+
+static void
+ppc_store_evrregset (const void *buf)
+{
+ int i, ev0;
+ const struct gdb_evrregset_t *regset = buf;
+
+ ev0 = find_regno ("ev0h");
+ for (i = 0; i < 32; i++)
+ supply_register (ev0 + i, ®set->evr[i]);
+
+ supply_register_by_name ("acc", ®set->acc);
+ supply_register_by_name ("spefscr", ®set->spefscr);
+}
+#endif /* __SPE__ */
+