Add regression tests for the twi and tdi instructions, and also for 
consequent SIGTRAP handling.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5618 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/none/tests/ppc32/Makefile.am b/none/tests/ppc32/Makefile.am
index 3936f51..0fc5015 100644
--- a/none/tests/ppc32/Makefile.am
+++ b/none/tests/ppc32/Makefile.am
@@ -9,10 +9,11 @@
 	test_fx.stderr.exp test_fx.stdout.exp test_fx.vgtest \
 	test_gx.stderr.exp test_gx.stdout.exp test_gx.vgtest \
 	testVMX.stderr.exp  testVMX.stdout.exp  testVMX.vgtest \
+	twi.stderr.exp twi.stdout.exp twi.vgtest \
 	xlc_dbl_u32.stderr.exp xlc_dbl_u32.stdout.exp xlc_dbl_u32.vgtest
 
 check_PROGRAMS = \
-	lsw jm-insns test_fx test_gx testVMX xlc_dbl_u32
+	lsw jm-insns test_fx test_gx testVMX twi xlc_dbl_u32
 
 AM_CFLAGS   = $(WERROR) -Winline -Wall -Wshadow -g -I$(top_srcdir)/include \
 		@FLAG_M32@
diff --git a/none/tests/ppc32/twi.c b/none/tests/ppc32/twi.c
new file mode 120000
index 0000000..e753fa9
--- /dev/null
+++ b/none/tests/ppc32/twi.c
@@ -0,0 +1 @@
+../ppc64/twi_tdi.c
\ No newline at end of file
diff --git a/none/tests/ppc32/twi.stderr.exp b/none/tests/ppc32/twi.stderr.exp
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/none/tests/ppc32/twi.stderr.exp
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/ppc32/twi.stdout.exp b/none/tests/ppc32/twi.stdout.exp
new file mode 100644
index 0000000..508391b
--- /dev/null
+++ b/none/tests/ppc32/twi.stdout.exp
@@ -0,0 +1,96 @@
+twi_0_neg100(-150) -> no trap
+twi_0_neg100(-100) -> no trap
+twi_0_neg100( -50) -> no trap
+twi_1_neg100(-150) -> no trap
+twi_1_neg100(-100) -> no trap
+twi_1_neg100( -50) -> TRAP
+twi_2_neg100(-150) -> TRAP
+twi_2_neg100(-100) -> no trap
+twi_2_neg100( -50) -> no trap
+twi_3_neg100(-150) -> TRAP
+twi_3_neg100(-100) -> no trap
+twi_3_neg100( -50) -> TRAP
+twi_4_neg100(-150) -> no trap
+twi_4_neg100(-100) -> TRAP
+twi_4_neg100( -50) -> no trap
+twi_5_neg100(-150) -> no trap
+twi_5_neg100(-100) -> TRAP
+twi_5_neg100( -50) -> TRAP
+twi_6_neg100(-150) -> TRAP
+twi_6_neg100(-100) -> TRAP
+twi_6_neg100( -50) -> no trap
+twi_7_neg100(-150) -> TRAP
+twi_7_neg100(-100) -> TRAP
+twi_7_neg100( -50) -> TRAP
+twi_8_neg100(-150) -> no trap
+twi_8_neg100(-100) -> no trap
+twi_8_neg100( -50) -> TRAP
+twi_9_neg100(-150) -> no trap
+twi_9_neg100(-100) -> no trap
+twi_9_neg100( -50) -> TRAP
+twi_10_neg100(-150) -> TRAP
+twi_10_neg100(-100) -> no trap
+twi_10_neg100( -50) -> TRAP
+twi_11_neg100(-150) -> TRAP
+twi_11_neg100(-100) -> no trap
+twi_11_neg100( -50) -> TRAP
+twi_12_neg100(-150) -> no trap
+twi_12_neg100(-100) -> TRAP
+twi_12_neg100( -50) -> TRAP
+twi_13_neg100(-150) -> no trap
+twi_13_neg100(-100) -> TRAP
+twi_13_neg100( -50) -> TRAP
+twi_14_neg100(-150) -> TRAP
+twi_14_neg100(-100) -> TRAP
+twi_14_neg100( -50) -> TRAP
+twi_15_neg100(-150) -> TRAP
+twi_15_neg100(-100) -> TRAP
+twi_15_neg100( -50) -> TRAP
+twi_16_neg100(-150) -> TRAP
+twi_16_neg100(-100) -> no trap
+twi_16_neg100( -50) -> no trap
+twi_17_neg100(-150) -> TRAP
+twi_17_neg100(-100) -> no trap
+twi_17_neg100( -50) -> TRAP
+twi_18_neg100(-150) -> TRAP
+twi_18_neg100(-100) -> no trap
+twi_18_neg100( -50) -> no trap
+twi_19_neg100(-150) -> TRAP
+twi_19_neg100(-100) -> no trap
+twi_19_neg100( -50) -> TRAP
+twi_20_neg100(-150) -> TRAP
+twi_20_neg100(-100) -> TRAP
+twi_20_neg100( -50) -> no trap
+twi_21_neg100(-150) -> TRAP
+twi_21_neg100(-100) -> TRAP
+twi_21_neg100( -50) -> TRAP
+twi_22_neg100(-150) -> TRAP
+twi_22_neg100(-100) -> TRAP
+twi_22_neg100( -50) -> no trap
+twi_23_neg100(-150) -> TRAP
+twi_23_neg100(-100) -> TRAP
+twi_23_neg100( -50) -> TRAP
+twi_24_neg100(-150) -> TRAP
+twi_24_neg100(-100) -> no trap
+twi_24_neg100( -50) -> TRAP
+twi_25_neg100(-150) -> TRAP
+twi_25_neg100(-100) -> no trap
+twi_25_neg100( -50) -> TRAP
+twi_26_neg100(-150) -> TRAP
+twi_26_neg100(-100) -> no trap
+twi_26_neg100( -50) -> TRAP
+twi_27_neg100(-150) -> TRAP
+twi_27_neg100(-100) -> no trap
+twi_27_neg100( -50) -> TRAP
+twi_28_neg100(-150) -> TRAP
+twi_28_neg100(-100) -> TRAP
+twi_28_neg100( -50) -> TRAP
+twi_29_neg100(-150) -> TRAP
+twi_29_neg100(-100) -> TRAP
+twi_29_neg100( -50) -> TRAP
+twi_30_neg100(-150) -> TRAP
+twi_30_neg100(-100) -> TRAP
+twi_30_neg100( -50) -> TRAP
+twi_31_neg100(-150) -> TRAP
+twi_31_neg100(-100) -> TRAP
+twi_31_neg100( -50) -> TRAP
diff --git a/none/tests/ppc32/twi.vgtest b/none/tests/ppc32/twi.vgtest
new file mode 100644
index 0000000..596b90d
--- /dev/null
+++ b/none/tests/ppc32/twi.vgtest
@@ -0,0 +1 @@
+prog: twi
diff --git a/none/tests/ppc64/Makefile.am b/none/tests/ppc64/Makefile.am
index 3b654a7..61cb411 100644
--- a/none/tests/ppc64/Makefile.am
+++ b/none/tests/ppc64/Makefile.am
@@ -5,10 +5,11 @@
 	jm-int.stderr.exp jm-int.stdout.exp jm-int.vgtest \
 	jm-fp.stderr.exp  jm-fp.stdout.exp  jm-fp.vgtest \
 	jm-vmx.stderr.exp jm-vmx.stdout.exp jm-vmx.vgtest \
-	lsw.stderr.exp lsw.stdout.exp lsw.vgtest
+	lsw.stderr.exp lsw.stdout.exp lsw.vgtest \
+	twi_tdi.stderr.exp twi_tdi.stdout.exp twi_tdi.vgtest
 
 check_PROGRAMS = \
-	jm-insns lsw
+	jm-insns lsw twi_tdi
 
 AM_CFLAGS   = $(WERROR) -Winline -Wall -Wshadow -g -I$(top_srcdir)/include \
 		@FLAG_M64@
diff --git a/none/tests/ppc64/twi_tdi.c b/none/tests/ppc64/twi_tdi.c
new file mode 100644
index 0000000..fb42870
--- /dev/null
+++ b/none/tests/ppc64/twi_tdi.c
@@ -0,0 +1,374 @@
+
+#include <stdio.h>
+#include <signal.h>
+#include <setjmp.h>
+#include <string.h>
+#include <assert.h>
+
+static jmp_buf env_sigtrap;
+static void handler_sigtrap ( int x ) { longjmp(env_sigtrap,1); }
+
+void try ( char* who, void(*maybe_traps)(long), long arg )
+{
+   struct sigaction tmp_act;
+   int r, trapped = 0;
+   memset(&tmp_act, 0, sizeof(tmp_act));
+   tmp_act.sa_handler = handler_sigtrap;
+   sigemptyset(&tmp_act.sa_mask);
+   tmp_act.sa_flags = SA_NODEFER;
+   r = sigaction(SIGTRAP, &tmp_act, NULL);
+   assert(r == 0);
+   if (setjmp(env_sigtrap)) {
+      trapped = 1;
+   } else {
+      maybe_traps(arg);
+   }
+   signal(SIGTRAP, SIG_DFL);
+
+   printf("%s(%4lld) -> %s\n", who, (long long int)arg, 
+	  trapped ? "TRAP" : "no trap" );
+}
+
+static void twi_0_neg100 ( long n ) {
+  __asm__ __volatile__("twi 0, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_1_neg100 ( long n ) {
+  __asm__ __volatile__("twi 1, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_2_neg100 ( long n ) {
+  __asm__ __volatile__("twi 2, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_3_neg100 ( long n ) {
+  __asm__ __volatile__("twi 3, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_4_neg100 ( long n ) {
+  __asm__ __volatile__("twi 4, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_5_neg100 ( long n ) {
+  __asm__ __volatile__("twi 5, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_6_neg100 ( long n ) {
+  __asm__ __volatile__("twi 6, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_7_neg100 ( long n ) {
+  __asm__ __volatile__("twi 7, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_8_neg100 ( long n ) {
+  __asm__ __volatile__("twi 8, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_9_neg100 ( long n ) {
+  __asm__ __volatile__("twi 9, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_10_neg100 ( long n ) {
+  __asm__ __volatile__("twi 10, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_11_neg100 ( long n ) {
+  __asm__ __volatile__("twi 11, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_12_neg100 ( long n ) {
+  __asm__ __volatile__("twi 12, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_13_neg100 ( long n ) {
+  __asm__ __volatile__("twi 13, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_14_neg100 ( long n ) {
+  __asm__ __volatile__("twi 14, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_15_neg100 ( long n ) {
+  __asm__ __volatile__("twi 15, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_16_neg100 ( long n ) {
+  __asm__ __volatile__("twi 16, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_17_neg100 ( long n ) {
+  __asm__ __volatile__("twi 17, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_18_neg100 ( long n ) {
+  __asm__ __volatile__("twi 18, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_19_neg100 ( long n ) {
+  __asm__ __volatile__("twi 19, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_20_neg100 ( long n ) {
+  __asm__ __volatile__("twi 20, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_21_neg100 ( long n ) {
+  __asm__ __volatile__("twi 21, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_22_neg100 ( long n ) {
+  __asm__ __volatile__("twi 22, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_23_neg100 ( long n ) {
+  __asm__ __volatile__("twi 23, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_24_neg100 ( long n ) {
+  __asm__ __volatile__("twi 24, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_25_neg100 ( long n ) {
+  __asm__ __volatile__("twi 25, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_26_neg100 ( long n ) {
+  __asm__ __volatile__("twi 26, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_27_neg100 ( long n ) {
+  __asm__ __volatile__("twi 27, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_28_neg100 ( long n ) {
+  __asm__ __volatile__("twi 28, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_29_neg100 ( long n ) {
+  __asm__ __volatile__("twi 29, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_30_neg100 ( long n ) {
+  __asm__ __volatile__("twi 30, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void twi_31_neg100 ( long n ) {
+  __asm__ __volatile__("twi 31, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+
+#if defined(__powerpc64__)
+
+static void tdi_0_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 0, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_1_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 1, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_2_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 2, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_3_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 3, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_4_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 4, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_5_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 5, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_6_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 6, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_7_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 7, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_8_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 8, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_9_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 9, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_10_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 10, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_11_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 11, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_12_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 12, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_13_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 13, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_14_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 14, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_15_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 15, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_16_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 16, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_17_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 17, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_18_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 18, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_19_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 19, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_20_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 20, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_21_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 21, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_22_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 22, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_23_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 23, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_24_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 24, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_25_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 25, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_26_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 26, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_27_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 27, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_28_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 28, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_29_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 29, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_30_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 30, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+static void tdi_31_neg100 ( long n ) {
+  __asm__ __volatile__("tdi 31, %0,-100"
+		       : /*out*/ : /*in*/ "r" (n) );
+}
+
+#endif
+
+
+int main ( void )
+{
+#define TWI_GROUP(cmp) \
+   try("twi_" #cmp "_neg100", twi_##cmp##_neg100, -150); \
+   try("twi_" #cmp "_neg100", twi_##cmp##_neg100, -100); \
+   try("twi_" #cmp "_neg100", twi_##cmp##_neg100,  -50);
+
+   TWI_GROUP(0);
+   TWI_GROUP(1);
+   TWI_GROUP(2);
+   TWI_GROUP(3);
+   TWI_GROUP(4);
+   TWI_GROUP(5);
+   TWI_GROUP(6);
+   TWI_GROUP(7);
+   TWI_GROUP(8);
+   TWI_GROUP(9);
+   TWI_GROUP(10);
+   TWI_GROUP(11);
+   TWI_GROUP(12);
+   TWI_GROUP(13);
+   TWI_GROUP(14);
+   TWI_GROUP(15);
+   TWI_GROUP(16);
+   TWI_GROUP(17);
+   TWI_GROUP(18);
+   TWI_GROUP(19);
+   TWI_GROUP(20);
+   TWI_GROUP(21);
+   TWI_GROUP(22);
+   TWI_GROUP(23);
+   TWI_GROUP(24);
+   TWI_GROUP(25);
+   TWI_GROUP(26);
+   TWI_GROUP(27);
+   TWI_GROUP(28);
+   TWI_GROUP(29);
+   TWI_GROUP(30);
+   TWI_GROUP(31);
+#if defined(__powerpc64__)
+#define TDI_GROUP(cmp) \
+   try("tdi_" #cmp "_neg100", tdi_##cmp##_neg100, -150); \
+   try("tdi_" #cmp "_neg100", tdi_##cmp##_neg100, -100); \
+   try("tdi_" #cmp "_neg100", tdi_##cmp##_neg100,  -50);
+
+   TDI_GROUP(0);
+   TDI_GROUP(1);
+   TDI_GROUP(2);
+   TDI_GROUP(3);
+   TDI_GROUP(4);
+   TDI_GROUP(5);
+   TDI_GROUP(6);
+   TDI_GROUP(7);
+   TDI_GROUP(8);
+   TDI_GROUP(9);
+   TDI_GROUP(10);
+   TDI_GROUP(11);
+   TDI_GROUP(12);
+   TDI_GROUP(13);
+   TDI_GROUP(14);
+   TDI_GROUP(15);
+   TDI_GROUP(16);
+   TDI_GROUP(17);
+   TDI_GROUP(18);
+   TDI_GROUP(19);
+   TDI_GROUP(20);
+   TDI_GROUP(21);
+   TDI_GROUP(22);
+   TDI_GROUP(23);
+   TDI_GROUP(24);
+   TDI_GROUP(25);
+   TDI_GROUP(26);
+   TDI_GROUP(27);
+   TDI_GROUP(28);
+   TDI_GROUP(29);
+   TDI_GROUP(30);
+   TDI_GROUP(31);
+#endif
+   return 0;
+}
diff --git a/none/tests/ppc64/twi_tdi.stderr.exp b/none/tests/ppc64/twi_tdi.stderr.exp
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/none/tests/ppc64/twi_tdi.stderr.exp
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/ppc64/twi_tdi.stdout.exp b/none/tests/ppc64/twi_tdi.stdout.exp
new file mode 100644
index 0000000..809d06a
--- /dev/null
+++ b/none/tests/ppc64/twi_tdi.stdout.exp
@@ -0,0 +1,192 @@
+twi_0_neg100(-150) -> no trap
+twi_0_neg100(-100) -> no trap
+twi_0_neg100( -50) -> no trap
+twi_1_neg100(-150) -> no trap
+twi_1_neg100(-100) -> no trap
+twi_1_neg100( -50) -> TRAP
+twi_2_neg100(-150) -> TRAP
+twi_2_neg100(-100) -> no trap
+twi_2_neg100( -50) -> no trap
+twi_3_neg100(-150) -> TRAP
+twi_3_neg100(-100) -> no trap
+twi_3_neg100( -50) -> TRAP
+twi_4_neg100(-150) -> no trap
+twi_4_neg100(-100) -> TRAP
+twi_4_neg100( -50) -> no trap
+twi_5_neg100(-150) -> no trap
+twi_5_neg100(-100) -> TRAP
+twi_5_neg100( -50) -> TRAP
+twi_6_neg100(-150) -> TRAP
+twi_6_neg100(-100) -> TRAP
+twi_6_neg100( -50) -> no trap
+twi_7_neg100(-150) -> TRAP
+twi_7_neg100(-100) -> TRAP
+twi_7_neg100( -50) -> TRAP
+twi_8_neg100(-150) -> no trap
+twi_8_neg100(-100) -> no trap
+twi_8_neg100( -50) -> TRAP
+twi_9_neg100(-150) -> no trap
+twi_9_neg100(-100) -> no trap
+twi_9_neg100( -50) -> TRAP
+twi_10_neg100(-150) -> TRAP
+twi_10_neg100(-100) -> no trap
+twi_10_neg100( -50) -> TRAP
+twi_11_neg100(-150) -> TRAP
+twi_11_neg100(-100) -> no trap
+twi_11_neg100( -50) -> TRAP
+twi_12_neg100(-150) -> no trap
+twi_12_neg100(-100) -> TRAP
+twi_12_neg100( -50) -> TRAP
+twi_13_neg100(-150) -> no trap
+twi_13_neg100(-100) -> TRAP
+twi_13_neg100( -50) -> TRAP
+twi_14_neg100(-150) -> TRAP
+twi_14_neg100(-100) -> TRAP
+twi_14_neg100( -50) -> TRAP
+twi_15_neg100(-150) -> TRAP
+twi_15_neg100(-100) -> TRAP
+twi_15_neg100( -50) -> TRAP
+twi_16_neg100(-150) -> TRAP
+twi_16_neg100(-100) -> no trap
+twi_16_neg100( -50) -> no trap
+twi_17_neg100(-150) -> TRAP
+twi_17_neg100(-100) -> no trap
+twi_17_neg100( -50) -> TRAP
+twi_18_neg100(-150) -> TRAP
+twi_18_neg100(-100) -> no trap
+twi_18_neg100( -50) -> no trap
+twi_19_neg100(-150) -> TRAP
+twi_19_neg100(-100) -> no trap
+twi_19_neg100( -50) -> TRAP
+twi_20_neg100(-150) -> TRAP
+twi_20_neg100(-100) -> TRAP
+twi_20_neg100( -50) -> no trap
+twi_21_neg100(-150) -> TRAP
+twi_21_neg100(-100) -> TRAP
+twi_21_neg100( -50) -> TRAP
+twi_22_neg100(-150) -> TRAP
+twi_22_neg100(-100) -> TRAP
+twi_22_neg100( -50) -> no trap
+twi_23_neg100(-150) -> TRAP
+twi_23_neg100(-100) -> TRAP
+twi_23_neg100( -50) -> TRAP
+twi_24_neg100(-150) -> TRAP
+twi_24_neg100(-100) -> no trap
+twi_24_neg100( -50) -> TRAP
+twi_25_neg100(-150) -> TRAP
+twi_25_neg100(-100) -> no trap
+twi_25_neg100( -50) -> TRAP
+twi_26_neg100(-150) -> TRAP
+twi_26_neg100(-100) -> no trap
+twi_26_neg100( -50) -> TRAP
+twi_27_neg100(-150) -> TRAP
+twi_27_neg100(-100) -> no trap
+twi_27_neg100( -50) -> TRAP
+twi_28_neg100(-150) -> TRAP
+twi_28_neg100(-100) -> TRAP
+twi_28_neg100( -50) -> TRAP
+twi_29_neg100(-150) -> TRAP
+twi_29_neg100(-100) -> TRAP
+twi_29_neg100( -50) -> TRAP
+twi_30_neg100(-150) -> TRAP
+twi_30_neg100(-100) -> TRAP
+twi_30_neg100( -50) -> TRAP
+twi_31_neg100(-150) -> TRAP
+twi_31_neg100(-100) -> TRAP
+twi_31_neg100( -50) -> TRAP
+tdi_0_neg100(-150) -> no trap
+tdi_0_neg100(-100) -> no trap
+tdi_0_neg100( -50) -> no trap
+tdi_1_neg100(-150) -> no trap
+tdi_1_neg100(-100) -> no trap
+tdi_1_neg100( -50) -> TRAP
+tdi_2_neg100(-150) -> TRAP
+tdi_2_neg100(-100) -> no trap
+tdi_2_neg100( -50) -> no trap
+tdi_3_neg100(-150) -> TRAP
+tdi_3_neg100(-100) -> no trap
+tdi_3_neg100( -50) -> TRAP
+tdi_4_neg100(-150) -> no trap
+tdi_4_neg100(-100) -> TRAP
+tdi_4_neg100( -50) -> no trap
+tdi_5_neg100(-150) -> no trap
+tdi_5_neg100(-100) -> TRAP
+tdi_5_neg100( -50) -> TRAP
+tdi_6_neg100(-150) -> TRAP
+tdi_6_neg100(-100) -> TRAP
+tdi_6_neg100( -50) -> no trap
+tdi_7_neg100(-150) -> TRAP
+tdi_7_neg100(-100) -> TRAP
+tdi_7_neg100( -50) -> TRAP
+tdi_8_neg100(-150) -> no trap
+tdi_8_neg100(-100) -> no trap
+tdi_8_neg100( -50) -> TRAP
+tdi_9_neg100(-150) -> no trap
+tdi_9_neg100(-100) -> no trap
+tdi_9_neg100( -50) -> TRAP
+tdi_10_neg100(-150) -> TRAP
+tdi_10_neg100(-100) -> no trap
+tdi_10_neg100( -50) -> TRAP
+tdi_11_neg100(-150) -> TRAP
+tdi_11_neg100(-100) -> no trap
+tdi_11_neg100( -50) -> TRAP
+tdi_12_neg100(-150) -> no trap
+tdi_12_neg100(-100) -> TRAP
+tdi_12_neg100( -50) -> TRAP
+tdi_13_neg100(-150) -> no trap
+tdi_13_neg100(-100) -> TRAP
+tdi_13_neg100( -50) -> TRAP
+tdi_14_neg100(-150) -> TRAP
+tdi_14_neg100(-100) -> TRAP
+tdi_14_neg100( -50) -> TRAP
+tdi_15_neg100(-150) -> TRAP
+tdi_15_neg100(-100) -> TRAP
+tdi_15_neg100( -50) -> TRAP
+tdi_16_neg100(-150) -> TRAP
+tdi_16_neg100(-100) -> no trap
+tdi_16_neg100( -50) -> no trap
+tdi_17_neg100(-150) -> TRAP
+tdi_17_neg100(-100) -> no trap
+tdi_17_neg100( -50) -> TRAP
+tdi_18_neg100(-150) -> TRAP
+tdi_18_neg100(-100) -> no trap
+tdi_18_neg100( -50) -> no trap
+tdi_19_neg100(-150) -> TRAP
+tdi_19_neg100(-100) -> no trap
+tdi_19_neg100( -50) -> TRAP
+tdi_20_neg100(-150) -> TRAP
+tdi_20_neg100(-100) -> TRAP
+tdi_20_neg100( -50) -> no trap
+tdi_21_neg100(-150) -> TRAP
+tdi_21_neg100(-100) -> TRAP
+tdi_21_neg100( -50) -> TRAP
+tdi_22_neg100(-150) -> TRAP
+tdi_22_neg100(-100) -> TRAP
+tdi_22_neg100( -50) -> no trap
+tdi_23_neg100(-150) -> TRAP
+tdi_23_neg100(-100) -> TRAP
+tdi_23_neg100( -50) -> TRAP
+tdi_24_neg100(-150) -> TRAP
+tdi_24_neg100(-100) -> no trap
+tdi_24_neg100( -50) -> TRAP
+tdi_25_neg100(-150) -> TRAP
+tdi_25_neg100(-100) -> no trap
+tdi_25_neg100( -50) -> TRAP
+tdi_26_neg100(-150) -> TRAP
+tdi_26_neg100(-100) -> no trap
+tdi_26_neg100( -50) -> TRAP
+tdi_27_neg100(-150) -> TRAP
+tdi_27_neg100(-100) -> no trap
+tdi_27_neg100( -50) -> TRAP
+tdi_28_neg100(-150) -> TRAP
+tdi_28_neg100(-100) -> TRAP
+tdi_28_neg100( -50) -> TRAP
+tdi_29_neg100(-150) -> TRAP
+tdi_29_neg100(-100) -> TRAP
+tdi_29_neg100( -50) -> TRAP
+tdi_30_neg100(-150) -> TRAP
+tdi_30_neg100(-100) -> TRAP
+tdi_30_neg100( -50) -> TRAP
+tdi_31_neg100(-150) -> TRAP
+tdi_31_neg100(-100) -> TRAP
+tdi_31_neg100( -50) -> TRAP
diff --git a/none/tests/ppc64/twi_tdi.vgtest b/none/tests/ppc64/twi_tdi.vgtest
new file mode 100644
index 0000000..45b587c
--- /dev/null
+++ b/none/tests/ppc64/twi_tdi.vgtest
@@ -0,0 +1 @@
+prog: twi_tdi