mirror of
https://github.com/classilla/tenfourfox.git
synced 2024-12-29 02:31:05 +00:00
#406: working vmx_memchr() in NSPR, passes JS tests, runs browser
This commit is contained in:
parent
3801f0bc4a
commit
6ee93a8030
@ -9337,6 +9337,9 @@ ac_configure_args="$ac_configure_args --prefix=$dist"
|
|||||||
if test "$MOZ_MEMORY"; then
|
if test "$MOZ_MEMORY"; then
|
||||||
ac_configure_args="$ac_configure_args --enable-jemalloc"
|
ac_configure_args="$ac_configure_args --enable-jemalloc"
|
||||||
fi
|
fi
|
||||||
|
if test "$TENFOURFOX_VMX"; then
|
||||||
|
ac_configure_args="$ac_configure_args --enable-tenfourfox-vmx"
|
||||||
|
fi
|
||||||
if test -n "$ZLIB_IN_MOZGLUE"; then
|
if test -n "$ZLIB_IN_MOZGLUE"; then
|
||||||
MOZ_ZLIB_LIBS=
|
MOZ_ZLIB_LIBS=
|
||||||
fi
|
fi
|
||||||
@ -9355,6 +9358,7 @@ export DIST
|
|||||||
export MOZ_LINKER
|
export MOZ_LINKER
|
||||||
export ZLIB_IN_MOZGLUE
|
export ZLIB_IN_MOZGLUE
|
||||||
export MOZ_MEMORY
|
export MOZ_MEMORY
|
||||||
|
export TENFOURFOX_VMX
|
||||||
|
|
||||||
if ! test -e js; then
|
if ! test -e js; then
|
||||||
mkdir js
|
mkdir js
|
||||||
|
@ -51,6 +51,9 @@
|
|||||||
#include "vm/StringObject-inl.h"
|
#include "vm/StringObject-inl.h"
|
||||||
#include "vm/TypeInference-inl.h"
|
#include "vm/TypeInference-inl.h"
|
||||||
|
|
||||||
|
#include "mozilla-config.h"
|
||||||
|
#include "plvmx.h"
|
||||||
|
|
||||||
using namespace js;
|
using namespace js;
|
||||||
using namespace js::gc;
|
using namespace js::gc;
|
||||||
using namespace js::unicode;
|
using namespace js::unicode;
|
||||||
@ -1155,10 +1158,12 @@ FirstCharMatcherUnrolled(const TextChar* text, uint32_t n, const PatChar pat)
|
|||||||
static const char*
|
static const char*
|
||||||
FirstCharMatcher8bit(const char* text, uint32_t n, const char pat)
|
FirstCharMatcher8bit(const char* text, uint32_t n, const char pat)
|
||||||
{
|
{
|
||||||
#if defined(__clang__)
|
#ifndef TENFOURFOX_VMX
|
||||||
|
#warning using non-VMX memchr
|
||||||
return FirstCharMatcherUnrolled<char, char>(text, n, pat);
|
return FirstCharMatcherUnrolled<char, char>(text, n, pat);
|
||||||
#else
|
#else
|
||||||
return reinterpret_cast<const char*>(memchr(text, pat, n));
|
#warning using VMX memchr
|
||||||
|
return reinterpret_cast<const char*>(vmx_memchr(text, pat, n));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,6 +54,7 @@ USE_N32 = @USE_N32@
|
|||||||
USE_X32 = @USE_X32@
|
USE_X32 = @USE_X32@
|
||||||
USE_64 = @USE_64@
|
USE_64 = @USE_64@
|
||||||
ENABLE_STRIP = @ENABLE_STRIP@
|
ENABLE_STRIP = @ENABLE_STRIP@
|
||||||
|
TENFOURFOX_VMX = @TENFOURFOX_VMX@
|
||||||
|
|
||||||
USE_PTHREADS = @USE_PTHREADS@
|
USE_PTHREADS = @USE_PTHREADS@
|
||||||
USE_BTHREADS = @USE_BTHREADS@
|
USE_BTHREADS = @USE_BTHREADS@
|
||||||
|
18
nsprpub/configure
vendored
18
nsprpub/configure
vendored
@ -667,6 +667,7 @@ DLL_SUFFIX
|
|||||||
LIB_SUFFIX
|
LIB_SUFFIX
|
||||||
OBJ_SUFFIX
|
OBJ_SUFFIX
|
||||||
CPU_ARCH
|
CPU_ARCH
|
||||||
|
TENFOURFOX_VMX
|
||||||
PR_MD_ARCH_DIR
|
PR_MD_ARCH_DIR
|
||||||
PR_MD_ASFILES
|
PR_MD_ASFILES
|
||||||
PR_MD_CSRCS
|
PR_MD_CSRCS
|
||||||
@ -801,6 +802,7 @@ enable_x32
|
|||||||
enable_64bit
|
enable_64bit
|
||||||
enable_mdupdate
|
enable_mdupdate
|
||||||
enable_cplus
|
enable_cplus
|
||||||
|
enable_tenfourfox_vmx
|
||||||
with_arm_kuser
|
with_arm_kuser
|
||||||
with_macos_sdk
|
with_macos_sdk
|
||||||
enable_macos_target
|
enable_macos_target
|
||||||
@ -1465,6 +1467,7 @@ Optional Features:
|
|||||||
--enable-macos-target=VER
|
--enable-macos-target=VER
|
||||||
Set the minimum MacOS version needed at runtime
|
Set the minimum MacOS version needed at runtime
|
||||||
10.2 for ppc, 10.4 for x86
|
10.2 for ppc, 10.4 for x86
|
||||||
|
--enable-tenfourfox-vmx Enable VMX SIMD features for PowerPC
|
||||||
--disable-os2-high-mem Disable high-memory support on OS/2
|
--disable-os2-high-mem Disable high-memory support on OS/2
|
||||||
|
|
||||||
--enable-strip Enable stripping of shared libs and programs
|
--enable-strip Enable stripping of shared libs and programs
|
||||||
@ -2495,6 +2498,7 @@ _HAVE_PTHREADS=
|
|||||||
USE_PTHREADS=
|
USE_PTHREADS=
|
||||||
USE_USER_PTHREADS=
|
USE_USER_PTHREADS=
|
||||||
USE_NSPR_THREADS=
|
USE_NSPR_THREADS=
|
||||||
|
TENFOURFOX_VMX=
|
||||||
USE_N32=
|
USE_N32=
|
||||||
USE_X32=
|
USE_X32=
|
||||||
USE_64=
|
USE_64=
|
||||||
@ -2904,6 +2908,16 @@ if test "${enable_n32+set}" = set; then :
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Check whether --enable-tenfourfox-vmx was given.
|
||||||
|
if test "${enable_tenfourfox_vmx+set}" = set; then :
|
||||||
|
enableval=$enable_tenfourfox_vmx; if test "$enableval" = "yes"; then
|
||||||
|
TENFOURFOX_VMX=1
|
||||||
|
else if test "$enableval" = "no"; then
|
||||||
|
TENFOURFOX_VMX=
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Check whether --enable-x32 was given.
|
# Check whether --enable-x32 was given.
|
||||||
if test "${enable_x32+set}" = set; then :
|
if test "${enable_x32+set}" = set; then :
|
||||||
@ -6524,6 +6538,10 @@ fi
|
|||||||
|
|
||||||
$as_echo "#define HAVE_SOCKLEN_T 1" >>confdefs.h
|
$as_echo "#define HAVE_SOCKLEN_T 1" >>confdefs.h
|
||||||
|
|
||||||
|
if test -n "$TENFOURFOX_VMX"; then
|
||||||
|
$as_echo "#define TENFOURFOX_VMX 1" >>confdefs.h
|
||||||
|
fi
|
||||||
|
|
||||||
AS='$(CC) -x assembler-with-cpp'
|
AS='$(CC) -x assembler-with-cpp'
|
||||||
CFLAGS="$CFLAGS -Wall -fno-common"
|
CFLAGS="$CFLAGS -Wall -fno-common"
|
||||||
case "${target_cpu}" in
|
case "${target_cpu}" in
|
||||||
|
@ -313,6 +313,15 @@ AC_ARG_ENABLE(optimize,
|
|||||||
MOZ_OPTIMIZE=
|
MOZ_OPTIMIZE=
|
||||||
fi ])
|
fi ])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(tenfourfox-vmx,
|
||||||
|
[ --enable-tenfourfox-vmx Turn on AltiVec-VMX specific options for TenFourFox ],
|
||||||
|
[ if test "$enableval" != "no"; then
|
||||||
|
AC_DEFINE(TENFOURFOX_VMX)
|
||||||
|
TENFOURFOX_VMX=1
|
||||||
|
else
|
||||||
|
TENFOURFOX_VMX=
|
||||||
|
fi ])
|
||||||
|
|
||||||
AC_ARG_ENABLE(debug,
|
AC_ARG_ENABLE(debug,
|
||||||
[ --enable-debug[=DBG] Enable debugging (using compiler flags DBG)],
|
[ --enable-debug[=DBG] Enable debugging (using compiler flags DBG)],
|
||||||
[ if test "$enableval" != "no"; then
|
[ if test "$enableval" != "no"; then
|
||||||
@ -3049,6 +3058,7 @@ AC_SUBST(PR_MD_CSRCS)
|
|||||||
AC_SUBST(PR_MD_ASFILES)
|
AC_SUBST(PR_MD_ASFILES)
|
||||||
AC_SUBST(PR_MD_ARCH_DIR)
|
AC_SUBST(PR_MD_ARCH_DIR)
|
||||||
AC_SUBST(CPU_ARCH)
|
AC_SUBST(CPU_ARCH)
|
||||||
|
AC_SUBST(TENFOURFOX_VMX)
|
||||||
|
|
||||||
AC_SUBST(OBJ_SUFFIX)
|
AC_SUBST(OBJ_SUFFIX)
|
||||||
AC_SUBST(LIB_SUFFIX)
|
AC_SUBST(LIB_SUFFIX)
|
||||||
|
@ -39,6 +39,11 @@ LIBRARY_VERSION = $(MOD_MAJOR_VERSION)
|
|||||||
|
|
||||||
RELEASE_LIBS = $(TARGETS)
|
RELEASE_LIBS = $(TARGETS)
|
||||||
|
|
||||||
|
ifeq ($(TENFOURFOX_VMX),1)
|
||||||
|
CSRCS += plvmx.c
|
||||||
|
CFLAGS += -faltivec
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(OS_ARCH),WINNT)
|
ifeq ($(OS_ARCH),WINNT)
|
||||||
RES=$(OBJDIR)/plc.res
|
RES=$(OBJDIR)/plc.res
|
||||||
RESNAME=plc.rc
|
RESNAME=plc.rc
|
||||||
|
64
nsprpub/lib/libc/src/plvmx.c
Normal file
64
nsprpub/lib/libc/src/plvmx.c
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include "plvmx.h"
|
||||||
|
|
||||||
|
void *vmx_memchr(const void *b, int c, size_t length) {
|
||||||
|
|
||||||
|
|
||||||
|
/* From:
|
||||||
|
https://github.com/ridiculousfish/HexFiend/blob/4d5bcee5715f5f288649f7471d1da5bd06376f46/framework/sources/HFFastMemchr.m
|
||||||
|
with some optimizations */
|
||||||
|
|
||||||
|
const unsigned char *haystack = (const unsigned char *)b;
|
||||||
|
unsigned char needle = (unsigned char)c;
|
||||||
|
|
||||||
|
unsigned prefixLength = (unsigned)((16 - ((unsigned long)haystack) % 16) % 16);
|
||||||
|
unsigned suffixLength = (unsigned)(((unsigned long)(haystack + length)) % 16);
|
||||||
|
// It is possible for altivecLength to be < 0 for short strings.
|
||||||
|
int altivecLength = length - prefixLength - suffixLength;
|
||||||
|
|
||||||
|
if (altivecLength < 16) {
|
||||||
|
while (length--) {
|
||||||
|
if (*haystack == needle) return (void *)haystack;
|
||||||
|
haystack++;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t numVectors = altivecLength >> 4;
|
||||||
|
while (prefixLength--) {
|
||||||
|
if (*haystack == needle) return (void *)haystack;
|
||||||
|
haystack++;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int mashedByte = (needle << 24 ) | (needle << 16) | (needle << 8) | needle;
|
||||||
|
const vector unsigned char searchVector = (vector unsigned int){mashedByte, mashedByte, mashedByte, mashedByte};
|
||||||
|
while (numVectors--) {
|
||||||
|
if (vec_any_eq(*(const vector unsigned char*)haystack, searchVector)) goto foundResult;
|
||||||
|
haystack += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (suffixLength--) {
|
||||||
|
if (*haystack == needle) return (void *)haystack;
|
||||||
|
haystack++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
foundResult:
|
||||||
|
;
|
||||||
|
/* some byte has the result - look in groups of 4 to find which it is */
|
||||||
|
unsigned numWords = 4;
|
||||||
|
unsigned int val;
|
||||||
|
while (numWords--) {
|
||||||
|
val = *(unsigned int*)haystack;
|
||||||
|
if (((val >> 24) & 0xFF) == needle) return (void *)haystack;
|
||||||
|
if (((val >> 16) & 0xFF) == needle) return (void *)(1 + haystack);
|
||||||
|
if (((val >> 8) & 0xFF) == needle) return (void *)(2 + haystack);
|
||||||
|
if ((val & 0xFF) == needle) return (void *)(3 + haystack);
|
||||||
|
haystack += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* should never get here */
|
||||||
|
fprintf(stderr, "failed vmx_memchr()\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user