/*****************************************************************************
* memcpyaltivec.c : AltiVec memcpy module
*****************************************************************************
- * Copyright (C) 2001 VideoLAN
- * $Id: memcpyaltivec.c,v 1.1 2002/08/04 17:23:43 sam Exp $
+ * Copyright (C) 2001 the VideoLAN team
+ * $Id$
*
- * Authors: Christophe Massiot <massiot@via.ecp.fr>
+ * Author: Christophe Massiot <massiot@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program 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
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef __BUILD_ALTIVEC_ASM__
/*****************************************************************************
* Preamble
*****************************************************************************/
-#include <stdlib.h>
-#include <string.h>
-#include <vlc/vlc.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+
+#ifdef HAVE_ALTIVEC_H
+# include <altivec.h>
+#endif
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
static int Activate ( vlc_object_t *p_this )
{
- p_this->p_vlc->pf_memcpy = fast_memcpy;
+ vlc_fastmem_register( fast_memcpy, NULL );
return VLC_SUCCESS;
}
* Module descriptor.
*****************************************************************************/
vlc_module_begin();
- set_description( _("AltiVec memcpy module") );
+ set_description( N_("AltiVec memcpy") );
+ set_category( CAT_ADVANCED );
+ set_subcategory( SUBCAT_ADVANCED_MISC );
+ add_requirement( ALTIVEC );
set_capability( "memcpy", 100 );
set_callbacks( Activate, NULL );
add_shortcut( "altivec" );
static void * fast_memcpy( void * _to, const void * _from, size_t len )
{
- asm (" \n"
- " cmplwi %cr0, %r5, 16 \n"
- " mr %r9, %r3 \n"
- " bc 4, 1, ._L3 \n"
- " andi. %r0, %r3, 15 \n"
- " bc 12, 2, ._L4 \n"
- " subfic %r0, %r0, 16 \n"
- " add %r11, %r3, %r0 \n"
- " cmplw %cr0, %r3, %r11 \n"
- " subf %r5, %r0, %r5 \n"
- " bc 4, 0, ._L4 \n"
- " ._L7: \n"
- " lbz %r0, 0(%r4) \n"
- " stb %r0, 0(%r9) \n"
- " addi %r9, %r9, 1 \n"
- " cmplw %cr0, %r9, %r11 \n"
- " addi %r4, %r4, 1 \n"
- " bc 12, 0, ._L7 \n"
- " ._L4: \n"
- " rlwinm. %r0, %r5, 0, 0, 27 \n"
- " bc 12, 2, ._L3 \n"
- " addi %r5, %r5, -16 \n"
- " li %r11, 15 \n"
- " lvsl %v12, 0, %r4 \n"
- " lvx %v1, 0, %r4 \n"
- " lvx %v0, %r11, %r4 \n"
- " rlwinm. %r0, %r5, 0, 0, 27 \n"
- " vperm %v13, %v1, %v0, %v12 \n"
- " addi %r4, %r4, 16 \n"
- " bc 12, 2, ._L11 \n"
- " ._L12: \n"
- " addi %r5, %r5, -16 \n"
- " li %r11, 15 \n"
- " lvx %v1, 0, %r4 \n"
- " lvx %v0, %r11, %r4 \n"
- " rlwinm. %r0, %r5, 0, 0, 27 \n"
- " stvx %v13, 0, %r9 \n"
- " vperm %v13, %v1, %v0, %v12 \n"
- " addi %r4, %r4, 16 \n"
- " addi %r9, %r9, 16 \n"
- " bc 4, 2, ._L12 \n"
- " ._L11: \n"
- " stvx %v13, 0, %r9 \n"
- " addi %r9, %r9, 16 \n"
- " ._L3: \n"
- " cmpwi %cr0, %r5, 0 \n"
- " bclr 12, 2 \n"
- " add %r5, %r9, %r5 \n"
- " cmplw %cr0, %r9, %r5 \n"
- " bclr 4, 0 \n"
- " ._L17: \n"
- " lbz %r0, 0(%r4) \n"
- " stb %r0, 0(%r9) \n"
- " addi %r9, %r9, 1 \n"
- " cmplw %cr0, %r9, %r5 \n"
- " addi %r4, %r4, 1 \n"
- " bc 12, 0, ._L17 \n"
+ asm (" \n"
+ " cmplwi %cr0, %r5, 16 \n"
+ " mr %r9, %r3 \n"
+ " bc 4, 1, ._L3 \n"
+ " andi. %r0, %r3, 15 \n"
+ " bc 12, 2, ._L4 \n"
+ " subfic %r0, %r0, 16 \n"
+ " add %r11, %r3, %r0 \n"
+ " cmplw %cr0, %r3, %r11 \n"
+ " subf %r5, %r0, %r5 \n"
+ " bc 4, 0, ._L4 \n"
+ " ._L7: \n"
+ " lbz %r0, 0(%r4) \n"
+ " stb %r0, 0(%r9) \n"
+ " addi %r9, %r9, 1 \n"
+ " cmplw %cr0, %r9, %r11 \n"
+ " addi %r4, %r4, 1 \n"
+ " bc 12, 0, ._L7 \n"
+ " ._L4: \n"
+ " rlwinm. %r0, %r5, 0, 0, 27 \n"
+ " bc 12, 2, ._L3 \n"
+ " addi %r5, %r5, -16 \n"
+ " li %r11, 15 \n"
+ " lvsl %v12, 0, %r4 \n"
+ " lvx %v1, 0, %r4 \n"
+ " lvx %v0, %r11, %r4 \n"
+ " rlwinm. %r0, %r5, 0, 0, 27 \n"
+ " vperm %v13, %v1, %v0, %v12 \n"
+ " addi %r4, %r4, 16 \n"
+ " bc 12, 2, ._L11 \n"
+ " ._L12: \n"
+ " addi %r5, %r5, -16 \n"
+ " li %r11, 15 \n"
+ " lvx %v1, 0, %r4 \n"
+ " lvx %v0, %r11, %r4 \n"
+ " rlwinm. %r0, %r5, 0, 0, 27 \n"
+ " stvx %v13, 0, %r9 \n"
+ " vperm %v13, %v1, %v0, %v12 \n"
+ " addi %r4, %r4, 16 \n"
+ " addi %r9, %r9, 16 \n"
+ " bc 4, 2, ._L12 \n"
+ " ._L11: \n"
+ " stvx %v13, 0, %r9 \n"
+ " addi %r9, %r9, 16 \n"
+ " ._L3: \n"
+ " cmpwi %cr0, %r5, 0 \n"
+ " bclr 12, 2 \n"
+ " add %r5, %r9, %r5 \n"
+ " cmplw %cr0, %r9, %r5 \n"
+ " bclr 4, 0 \n"
+ " ._L17: \n"
+ " lbz %r0, 0(%r4) \n"
+ " stb %r0, 0(%r9) \n"
+ " addi %r9, %r9, 1 \n"
+ " cmplw %cr0, %r9, %r5 \n"
+ " addi %r4, %r4, 1 \n"
+ " bc 12, 0, ._L17 \n"
);
}