libspe-1.0.1 release

Arnd Bergmann arnd at arndb.de
Sat Nov 26 01:42:59 EST 2005


This is the latest version of libspe, which is now required
for use with spu-gdb. The changes since version 1.0 are

- add hooks for gdb to find debug info
- fix building for 64 bit (excludes c99 handlers currently)
- add a small test case suite for basic functionality testing

	Arnd <><

PS: Jordi, please upload the rpms to the bsc.es site. I think we should
also have the source tarball on the same page as the source rpm.

diff -u -rN --exclude=CVS libspe-1.0/Makefile libspe-1.0.1/Makefile
--- libspe-1.0/Makefile	2005-11-04 15:48:28.000000000 +0000
+++ libspe-1.0.1/Makefile	2005-11-25 13:29:58.000000000 +0000
@@ -43,7 +43,7 @@
 INSTALL_DIR	:= ${INSTALL} -d -m 755
 
 MAJOR_VERSION	:= 1
-MINOR_VERSION	:= 0
+MINOR_VERSION	:= 0.1
 
 libspe_SO	:= libspe.so.${MAJOR_VERSION}.${MINOR_VERSION}
 libspe_SONAME	:= libspe.so.${MAJOR_VERSION}
@@ -135,7 +135,7 @@
 
 clean: 
 	rm -f $(libspe_SO) libspe.a $(libspe_OBJS) *~ tags elfspe elfspe-register
-	rm -f $(FULLNAME)
+	rm -f elfspe.o $(TARBALL) $(FULLNAME)
 	make -C tests clean
 
 .PHONY: all clean tests tags
diff -u -rN --exclude=CVS libspe-1.0/default_c99_handler.c libspe-1.0.1/default_c99_handler.c
--- libspe-1.0/default_c99_handler.c	2005-10-17 17:55:45.000000000 +0000
+++ libspe-1.0.1/default_c99_handler.c	2005-11-25 13:22:32.000000000 +0000
@@ -206,7 +206,8 @@
     void *ptr;
 };
 #else
-#error Missing ppc64 va_list!
+#warning Missing ppc64 va_list!
+#warning Some c99 functions will not work
 #endif /* __powerpc64__ */
 
 /* TO-DO: update these to support 64b PPC-ABI. */
@@ -217,8 +218,10 @@
 
     ap.nr = 127;
     ap.ptr = (void *) vlist;
-#endif 
     return vfprintf(stream, format, (void *) &ap);
+#else
+    return 0;
+#endif 
 }
 
 static int __do_vsprintf(char *string, char *format, __va_elem * vlist)
@@ -228,8 +231,10 @@
 
     ap.nr = 127;
     ap.ptr = (void *) vlist;
-#endif 
     return vsprintf(string, format, (void *) &ap);
+#else
+    return 0;
+#endif 
 }
 
 static int __do_vsnprintf(char *string, size_t size, char *format, 
@@ -240,8 +245,10 @@
 
     ap.nr = 127;
     ap.ptr = (void *) vlist;
-#endif 
     return vsnprintf(string, size, format, (void *) &ap);
+#else
+    return 0;
+#endif 
 }
 
 static int __do_vfscanf(FILE * stream, char *format, __va_elem * vlist)
@@ -251,8 +258,10 @@
 
     ap.nr = 127;
     ap.ptr = (void *) vlist;
-#endif 
     return vfscanf(stream, format, (void *) &ap);
+#else
+    return 0;
+#endif 
 }
 
 static int __do_vsscanf(char *string, char *format, __va_elem * vlist)
@@ -262,8 +271,10 @@
 
     ap.nr = 127;
     ap.ptr = (void *) vlist;
-#endif 
     return vsscanf(string, format, (void *) &ap);
+#else
+    return 0;
+#endif 
 }
 
 static inline FILE *get_FILE(int nr)
diff -u -rN --exclude=CVS libspe-1.0/libspe.spec libspe-1.0.1/libspe.spec
--- libspe-1.0/libspe.spec	2005-11-04 15:48:28.000000000 +0000
+++ libspe-1.0.1/libspe.spec	2005-11-25 13:42:13.000000000 +0000
@@ -1,6 +1,6 @@
 Name: libspe
-Version: 1.0
-Release: 1
+Version: 1.0.1
+Release: 2
 License: LGPL
 Group: System Environment/Base
 Source: %{name}-%{version}.tar.gz
@@ -45,7 +45,7 @@
 %install
 rm -rf $RPM_BUILD_ROOT%{sysroot}
 
-make install DESTDIR=$RPM_BUILD_ROOT SYSROOT=%{sysroot} prefix=%{_prefix}
+make install DESTDIR=$RPM_BUILD_ROOT SYSROOT=%{sysroot} prefix=%{_prefix} libdir=%{_libdir}
 
 %clean
 rm -rf $RPM_BUILD_ROOT
diff -u -rN --exclude=CVS libspe-1.0/spe.c libspe-1.0.1/spe.c
--- libspe-1.0/spe.c	2005-11-07 12:56:31.000000000 +0000
+++ libspe-1.0.1/spe.c	2005-11-23 20:04:14.000000000 +0000
@@ -34,6 +34,7 @@
 #include <sys/select.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/syscall.h>
 
 #include <sys/spe.h>
 #include "libspe.h"
@@ -62,7 +63,7 @@
 void env_check(void);
 static int __env_spu_debug_start = 0;
 static int __env_spu_info = 0;
-static int check_env = 0; /* set to 1 when ready to act on env settings. */
+static int check_env = 1;
 
 
 /*Default SPE group options
@@ -321,6 +322,16 @@
 {
 	pthread_mutex_lock(&grp_list.mutex);
 	
+	if (gid->numListSize == 1)
+	{	
+		struct grpListElem *p=gid->grp_members;
+		gid->numListSize--;
+		free(p);
+		gid->grp_members = NULL;
+		pthread_mutex_unlock(&grp_list.mutex);
+		return 0;
+	}
+
 	for (struct grpListElem *p=gid->grp_members; p->next!=NULL; p=p->next)
 	{
 		struct grpListElem *np=p->next;
@@ -465,6 +476,8 @@
 		  return NULL;
 	  }
 
+	thread_store->handle = *handle;
+
 	/* Add SPE exec program */
 
 	DEBUG_PRINTF ("Add exec prog dst:0x%04x size:0x%04x\n",
@@ -600,6 +613,8 @@
 	munmap(thread_store->mem_mmap_base,LS_SIZE);
 	close (thread_store->fd_mem);
 #endif
+	close (thread_store->ev_pipe[0]);
+        close (thread_store->ev_pipe[1]);
 
 #if defined(NOSYSCALL) && !defined(NODIRREMOVE)
 	rmdir (pathname);
@@ -965,6 +980,28 @@
 static void *
 spe_thread (void *ptr)
 {
+	/* If the SPU_INFO (or SPU_DEBUG_START) environment variable is set,
+	   output a message to stderr telling the user how to attach a debugger
+	   to the new SPE thread.  */
+	if (__env_spu_debug_start || __env_spu_info)
+	  {
+		int tid = syscall (__NR_gettid);
+		fprintf (stderr, "Starting SPE thread %p, to attach debugger use: spu-gdb -p %d\n",
+			 ptr, tid);
+
+		/* In the case of SPU_DEBUG_START, actually wait until the user *has*
+		   attached a debugger to this thread.  This is done here by doing an
+		   sigwait on the empty set, which will return with EINTR after the
+		   debugger has attached.  */
+		if (__env_spu_debug_start)
+		  {
+			sigset_t set;
+			int sig;
+			sigemptyset (&set);
+			sigwait (&set, &sig);
+		  }
+	  }
+
 	return (void *) (unsigned long) do_spe_run (ptr);
 }
 
@@ -1369,6 +1406,7 @@
 		for(i=0; i < group->numListSize ; i++)
 		{
 			spe_ids[i] = elem->thread;
+			elem=elem->next;
 			
 		}
 	}
diff -u -rN --exclude=CVS libspe-1.0/spe.h libspe-1.0.1/spe.h
--- libspe-1.0/spe.h	2005-10-21 17:44:41.000000000 +0000
+++ libspe-1.0.1/spe.h	2005-11-23 20:04:14.000000000 +0000
@@ -24,6 +24,12 @@
 
 struct thread_store
 {
+	/* Note: The debugger accesses this data structure, and assumes it
+	   starts out with an spe_program_handle_t identifying the SPE
+	   executable running within this SPE thread.  Everything below
+	   is private to libspe.  */
+	spe_program_handle_t handle;
+
         pthread_t 	spe_thread;
 	pthread_cond_t 	event_deliver;
 	pthread_mutex_t event_lock;
diff -u -rN --exclude=CVS libspe-1.0/tests/Makefile libspe-1.0.1/tests/Makefile
--- libspe-1.0/tests/Makefile	2005-10-21 17:44:41.000000000 +0000
+++ libspe-1.0.1/tests/Makefile	2005-11-08 16:31:31.000000000 +0000
@@ -21,8 +21,10 @@
 	make -C start-stop
 	make -C dma
 	make -C event
+	make -C ft
 
 clean: 
 	make -C start-stop clean
 	make -C dma clean
 	make -C event clean
+	make -C ft clean
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/Makefile libspe-1.0.1/tests/ft/Makefile
--- libspe-1.0/tests/ft/Makefile	1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/Makefile	2005-11-10 16:06:51.000000000 +0000
@@ -0,0 +1,47 @@
+#*
+#* libspe - A wrapper library to adapt the JSRE SPU usage model to SPUFS
+#* Copyright (C) 2005 IBM Corp.
+#*
+#* This library is free software; you can redistribute it and/or modify it
+#* under the terms of the GNU Lesser General Public License as published by
+#* the Free Software Foundation; either version 2.1 of the License,
+#* or (at your option) any later version.
+#*
+#*  This library is distributed in the hope that it will be useful, but
+#*  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#*  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+#*  License for more details.
+#*
+#*   You should have received a copy of the GNU Lesser General Public License
+#*   along with this library; if not, write to the Free Software Foundation,
+#*   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#*
+
+CC := gcc
+SPECC := spu-gcc
+CTAGS = ctags
+
+CFLAGS := -O2 -m32 -Wall -I../.. -I../../include -g
+SPECFLAGS := -O2 -Wall -I../../include
+
+LDFLAGS := -m32
+LIBS := -L../.. -lspe -lpthread
+
+SPE_OBJS := spe-test-pause spe-test-start-stop
+OBJS := ft
+
+all: $(OBJS) $(SPE_OBJS)
+
+clean:
+	rm -f $(OBJS) $(SPE_OBJS)
+
+ft: ft.c
+	$(CC) -o $@ $< $(CFLAGS) $(LDFLAGS) $(LIBS)
+
+spe-test-pause: spe-test-pause.c
+	$(SPECC) $(SPECFLAGS) -o $@ $<
+
+spe-test-start-stop: spe-test-start-stop.c
+	$(SPECC) $(SPECFLAGS) -o $@ $<
+
+
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/ft.c libspe-1.0.1/tests/ft/ft.c
--- libspe-1.0/tests/ft/ft.c	1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/ft.c	2005-11-10 16:06:51.000000000 +0000
@@ -0,0 +1,261 @@
+/*
+ * libspe - A wrapper library to adapt the JSRE SPU usage model to SPUFS
+ * Copyright (C) 2005 IBM Corp.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License,
+ * or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ *  License for more details.
+ *
+ *   You should have received a copy of the GNU Lesser General Public License
+ *   along with this library; if not, write to the Free Software Foundation,
+ *   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <sched.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <libspe.h>
+
+int main(int argc, char *argv[])
+{
+	spe_program_handle_t *binary[16];
+	speid_t spe_thread[16];
+	spe_gid_t spe_group;
+	int result = 0;
+	int i, j, max_spe, threads, status, ret;
+
+	static int test_result __attribute__ ((aligned(128)));
+
+	/* Basic Test */
+
+	printf("\nStep 1: spe_create_group() ");
+	
+	spe_group = spe_create_group(SCHED_OTHER, 0, 0);
+	if (!spe_group) 
+	{
+		printf("error: create_group.\n");
+		result++;
+	}
+	printf(" OK.\n");
+	printf("  spe_group=%p.\n",spe_group);
+ 
+	printf("\nStep 2: spe_group_max() returns:");
+	
+	max_spe = spe_group_max(spe_group);
+	printf("%i\n", max_spe);
+
+	printf("\nStep 3: spe_get_threads(spe_gid_t,NULL) returns:");
+	threads = spe_get_threads(spe_group,NULL);
+	printf("%i ", threads);
+	if(threads)
+	{
+		printf(" ERROR.\n");
+		result++;
+	}
+	else
+		printf(" OK.\n");
+	
+	printf("\nStep 4a: spe_open_image(\"spe-test-pause\") ");
+	binary[0] = spe_open_image("spe-test-pause");
+	if (!binary[0])
+	{
+		printf(" ERROR.\n");
+		exit(2);
+	}
+	printf(" OK.\n");
+
+
+	printf("\nStep 4b: spe_open_image(\"spe-test-pause\") (again) ");
+	binary[1] = spe_open_image("spe-test-pause");
+	if (!binary[1])
+	{
+		printf(" ERROR.\n");
+		exit(2);
+	}
+	printf(" OK.\n");
+
+
+	printf("\nStep 5a: spe_create_thread() ");
+	spe_thread[0] = spe_create_thread(spe_group, binary[0], &test_result, NULL, 0, 0);
+	if (!spe_thread[0])
+	{
+		printf(" ERROR.\n");
+		exit(2);
+	}
+	else
+	{
+		printf("OK.\n");
+		printf("  Returned speid=%p\n",spe_thread[0]);
+	}
+	
+	usleep(500000);
+
+	printf("\nStep 5b: spe_create_thread() (again) ");
+	spe_thread[1] = spe_create_thread(spe_group, binary[1], &test_result, NULL, 0, 0);
+	if (!spe_thread[1])
+	{
+		printf(" ERROR.\n");
+		exit(2);
+	}
+	else
+	{
+		printf("OK.\n");
+		printf("  Returned speid=%p\n",spe_thread[1]);
+	}
+
+	printf("\nStep 6: spe_get_threads(spe_gid_t,NULL) returns:");
+	threads = spe_get_threads(spe_group,NULL);
+	printf("%i ", threads);
+	if (threads != 2)
+	{
+		printf(" ERROR.\n");
+		result++;
+	}
+	else
+	{
+		speid_t speids[16];
+		int i;
+		
+		printf(" OK.\n");
+		
+		threads=spe_get_threads(spe_group,speids);
+		for (i=0 ; i<threads ; i++)
+		{
+			printf("  Thread[%i] = %p\n",i,speids[i]);
+		}
+		
+	}
+
+	printf("\nStep 7a: spe_wait() ");
+	ret = spe_wait(spe_thread[0], &status, 0);
+	if(!ret && status== 0)
+	{
+		speid_t speids[16];
+		int i;
+		
+		printf("OK.\n");
+		printf("  Thread returned status=%i\n",status);
+		printf("  Remaining threads:\n");
+		
+		threads=spe_get_threads(spe_group,speids);
+		for (i=0 ; i<threads ; i++)
+		{
+			printf("  Thread[%i] = %p\n",i,speids[i]);
+		}
+
+	}
+	else
+	{
+		printf("ERROR.\n");
+		result++;
+	
+	}
+
+	printf("\nStep 7b: spe_wait() ");
+	ret = spe_wait(spe_thread[1], &status, 0);
+	if(!ret && status== 0)
+	{
+		speid_t speids[16];
+		int i;
+		
+		printf("OK.\n");
+		printf("  Thread returned status=%i\n",status);
+		printf("  Remaining threads:\n");
+		
+		threads=spe_get_threads(spe_group,speids);
+		for (i=0 ; i<threads ; i++)
+		{
+			printf("  Thread[%i] = %p\n",i,speids[i]);
+		}
+
+	}
+	else
+	{
+		printf("ERROR.\n");
+		result++;
+	
+	}
+	
+	printf("\nStep 8: spe_get_threads(spe_gid_t,NULL) returns:");
+	threads = spe_get_threads(spe_group,NULL);
+	printf("%i ", threads);
+	if(threads)
+	{
+		printf(" ERROR.\n");
+		result++;
+	}
+	else
+		printf(" OK.\n");
+
+	spe_close_image(binary[0]);
+	spe_close_image(binary[1]);
+
+	printf("\nStep 9: Load tests\n");
+
+	printf("  a.) lots of threads seqentially.");
+	
+	binary[0] = spe_open_image("spe-test-start-stop");
+
+	for (i=0; i< 1024; i++)
+	{
+		spe_thread[0] = spe_create_thread(spe_group, binary[1], 
+						  &test_result, NULL, 0, 0);
+
+		if (!spe_thread[0])
+               	{
+			printf("\n    failed to create load thread %i.",i);
+			result++;
+			break;
+		}
+		spe_wait(spe_thread[0], &status, 0);
+	}
+	if (i==1024)
+		printf(" OK.\n");
+
+	printf("  b.) lots of threads seqentially and parallel in groups.");
+	
+	binary[0] = spe_open_image("spe-test-start-stop");
+
+	for (i=0; i< 1024; i++)
+	{
+		for (j=0; j< 8; j++)
+		{
+			spe_thread[j] = spe_create_thread(spe_group, binary[1], 
+						  &test_result, NULL, 0, 0);
+
+			if (!spe_thread[j])
+               		{
+				printf("\n    failed to create load thread %i,%i.",i,j);
+				result++;
+				break;
+			}
+		}
+		for (j=0; j< 8; j++)
+		{
+			spe_wait(spe_thread[j], &status, 0);
+		}
+	}
+	if (i==1024)
+		printf(" OK.\n");
+
+	printf("\n\n\nTEST RESULT:.\n");
+	printf("-------------\n");
+	if (!result)
+	{
+		printf("All tests completed ok.\n");
+	}
+	else
+	{
+		printf("Errors were encountered - check your installation.\n");
+	}
+
+	return 0;
+}
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/spe-test-dma-write.c libspe-1.0.1/tests/ft/spe-test-dma-write.c
--- libspe-1.0/tests/ft/spe-test-dma-write.c	1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/spe-test-dma-write.c	2005-11-08 13:22:06.000000000 +0000
@@ -0,0 +1,24 @@
+#include "spu_intrinsics.h"
+
+typedef union {
+        unsigned long long      ull;
+        unsigned int            vp[2];
+} addr64;
+
+int result __attribute__ ((aligned (128)));
+
+int main ( int spuid, addr64 argp, addr64 envp)
+{
+        unsigned long long argAddress = argp.ull;
+
+        /* Write to specified address */
+        result = 42;
+
+       spu_mfcdma32 (&result, argAddress, 4, 0, (((0) << 24) | ((0) << 16) | (0x20)
+				));
+	__builtin_si_wrch((22),__builtin_si_from_uint(1));
+        spu_mfcstat(0x2);
+
+        /* Done */
+        return 0;
+}
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/spe-test-event.c libspe-1.0.1/tests/ft/spe-test-event.c
--- libspe-1.0/tests/ft/spe-test-event.c	1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/spe-test-event.c	2005-11-08 13:22:06.000000000 +0000
@@ -0,0 +1,60 @@
+/*
+ * libspe - A wrapper library to adapt the JSRE SPU usage model to SPUFS
+ * Copyright (C) 2005 IBM Corp.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License,
+ * or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ *  License for more details.
+ *
+ *   You should have received a copy of the GNU Lesser General Public License
+ *   along with this library; if not, write to the Free Software Foundation,
+ *   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <spu_intrinsics.h>
+
+int main(void)
+{
+	int i,j,a[128];
+	
+	for(i=0; i< 1500000 ; i++)
+	{
+		for(j=0; j< 128; j++)
+		{
+			a[j] += i;
+		}
+		
+	}
+
+	si_stop(0x1199);
+	
+	for(i=0; i< 1500000 ; i++)
+	{
+		for(j=0; j< 128; j++)
+		{
+			a[j] += i;
+		}
+		
+	}
+	
+//	spu_writech(mfc_wr_intr_mailbox, 0xaabd);
+	spu_writech(SPU_WrOutIntrMbox, 0xaabd);
+	
+	for(i=0; i< 1500000 ; i++)
+	{
+		for(j=0; j< 128; j++)
+		{
+			a[j] += i;
+		}
+		
+	}
+	si_stop(0x119A);
+	
+	return 0;
+}
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/spe-test-pause.c libspe-1.0.1/tests/ft/spe-test-pause.c
--- libspe-1.0/tests/ft/spe-test-pause.c	1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/spe-test-pause.c	2005-11-08 13:22:06.000000000 +0000
@@ -0,0 +1,36 @@
+/*
+ * libspe - A wrapper library to adapt the JSRE SPU usage model to SPUFS
+ * Copyright (C) 2005 IBM Corp.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License,
+ * or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ *  License for more details.
+ *
+ *   You should have received a copy of the GNU Lesser General Public License
+ *   along with this library; if not, write to the Free Software Foundation,
+ *   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <spu_intrinsics.h>
+
+int main(void)
+{
+	int i,j,a[128];
+	
+	for(i=0; i< 1500000 ; i++)
+	{
+		for(j=0; j< 128; j++)
+		{
+			a[j] += i;
+		}
+		
+	}
+
+	return 0;
+}
diff -u -rN --exclude=CVS libspe-1.0/tests/ft/spe-test-start-stop.c libspe-1.0.1/tests/ft/spe-test-start-stop.c
--- libspe-1.0/tests/ft/spe-test-start-stop.c	1970-01-01 00:00:00.000000000 +0000
+++ libspe-1.0.1/tests/ft/spe-test-start-stop.c	2005-11-10 16:06:51.000000000 +0000
@@ -0,0 +1,25 @@
+/*
+ * libspe - A wrapper library to adapt the JSRE SPU usage model to SPUFS
+ * Copyright (C) 2005 IBM Corp.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License,
+ * or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ *  License for more details.
+ *
+ *   You should have received a copy of the GNU Lesser General Public License
+ *   along with this library; if not, write to the Free Software Foundation,
+ *   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <spu_intrinsics.h>
+
+int main(void)
+{
+	return 0;
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: libspe-1.0.1.tar.gz
Type: application/x-tgz
Size: 35886 bytes
Desc: not available
Url : http://ozlabs.org/pipermail/linuxppc64-dev/attachments/20051125/6678f511/attachment.bin 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://ozlabs.org/pipermail/linuxppc64-dev/attachments/20051125/6678f511/attachment.pgp 


More information about the Linuxppc64-dev mailing list