summaryrefslogtreecommitdiff
path: root/www
diff options
context:
space:
mode:
authorsekiya <sekiya>2004-05-30 14:02:01 +0000
committersekiya <sekiya>2004-05-30 14:02:01 +0000
commit88b2cadc6b9127550580cca0fcac5f24e296ab5f (patch)
treeaed2e5ae379133e405ae0a703e68eaf353f1d2bd /www
parentcc806c18fff3b9a356dde158e60ee4862b8f4fa7 (diff)
downloadpkgsrc-88b2cadc6b9127550580cca0fcac5f24e296ab5f.tar.gz
Add (tested) amd64 support. From FreeBSD, mostly.
Diffstat (limited to 'www')
-rw-r--r--www/mozilla/distinfo12
-rw-r--r--www/mozilla/patches/patch-ac23
-rw-r--r--www/mozilla/patches/patch-ba63
-rw-r--r--www/mozilla/patches/patch-bb21
-rw-r--r--www/mozilla/patches/patch-bs14
-rw-r--r--www/mozilla/patches/patch-bt16
-rw-r--r--www/mozilla/patches/patch-bu179
-rw-r--r--www/mozilla/patches/patch-bv211
8 files changed, 516 insertions, 23 deletions
diff --git a/www/mozilla/distinfo b/www/mozilla/distinfo
index fa136e01fcc..3c8e85fe05f 100644
--- a/www/mozilla/distinfo
+++ b/www/mozilla/distinfo
@@ -1,10 +1,10 @@
-$NetBSD: distinfo,v 1.54 2004/04/29 14:39:23 adam Exp $
+$NetBSD: distinfo,v 1.55 2004/05/30 14:02:01 sekiya Exp $
SHA1 (mozilla-source-1.6.tar.bz2) = baecca0ecec35704049ab6debaec6c96adbade35
Size (mozilla-source-1.6.tar.bz2) = 31037452 bytes
SHA1 (patch-aa) = 03f158fe673a54b8060d541c80f9ebda2977afc5
SHA1 (patch-ab) = 9db4b88f3cc0feb267f8715c2e2238fd80b49f62
-SHA1 (patch-ac) = 4cddfd0bfc8acd97db3b974289a79c9ae41c9edf
+SHA1 (patch-ac) = d5e3f5833860cd3404030eff76c993ab48c0d8df
SHA1 (patch-ad) = 5408db4b7585dcf5855f64a342cc721a23aec449
SHA1 (patch-ae) = e10936ff84d8f5b631c5c9f18271f21e902ea351
SHA1 (patch-af) = 8fcedb0bdd48f9527fff8c9b970a0e6ea68711e4
@@ -19,11 +19,15 @@ SHA1 (patch-an) = 78b448a64c2a46bc3a1d458bdbcb5d64be1ed9f4
SHA1 (patch-ao) = 7048e3a06d1569e31d2350c2473887a50aa81498
SHA1 (patch-aw) = 5beeefa214a3003a74ccc68776a97a414c6acff1
SHA1 (patch-ax) = 070c88dee0446b093ab1c2a9120dc1747642d46f
-SHA1 (patch-ba) = e11ab3e2baa19c9db9e320868a9860fedf5c8cec
-SHA1 (patch-bb) = c5350823464250546f95d1c0962ba7ba6a16aa2f
+SHA1 (patch-ba) = cff5e12280379546688ca556259e2265a1542ab8
+SHA1 (patch-bb) = 8fc197bc5b0b53e8ed7c3e8295bf459b42c2c384
SHA1 (patch-bm) = f557aa3ce9a25c91884cfd42bb505422e52ac958
SHA1 (patch-bn) = 07573c79b22821873954d7c70821a382ea42fe4e
SHA1 (patch-bo) = a6bba31568b60818455911279e7db01c49c94498
SHA1 (patch-bp) = 5f5eed098d2763ca6a4987d012c9377b81300aa3
SHA1 (patch-bq) = 0c520287d97027da06a5aa65cbd038bf19a49dde
SHA1 (patch-br) = 560d738c648b864711d663323bdd1478b7d28103
+SHA1 (patch-bs) = e9434aadc52b0120dcfc80e57002152d2bd47605
+SHA1 (patch-bt) = a033b83ee633391ffc138442697fbe754ec92902
+SHA1 (patch-bu) = db33b8651e3cb1fbf9a18dbe78e1e8288cfda0ee
+SHA1 (patch-bv) = 4f23dfd885131ea866f31370f1421e7c19706860
diff --git a/www/mozilla/patches/patch-ac b/www/mozilla/patches/patch-ac
index 0d14ed74ae9..7edd3f20bd8 100644
--- a/www/mozilla/patches/patch-ac
+++ b/www/mozilla/patches/patch-ac
@@ -1,9 +1,18 @@
-$NetBSD: patch-ac,v 1.21 2004/01/17 00:04:49 taya Exp $
+$NetBSD: patch-ac,v 1.22 2004/05/30 14:02:01 sekiya Exp $
-diff -ru ../Orig/mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in ./xpcom/reflect/xptcall/src/md/unix/Makefile.in
---- ../Orig/mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in 2003-08-15 13:00:23.000000000 +0900
-+++ ./xpcom/reflect/xptcall/src/md/unix/Makefile.in 2004-01-16 23:17:21.000000000 +0900
-@@ -135,7 +135,7 @@
+--- xpcom/reflect/xptcall/src/md/unix/Makefile.in.orig 2003-08-15 13:00:23.000000000 +0900
++++ xpcom/reflect/xptcall/src/md/unix/Makefile.in 2004-05-30 21:36:44.000000000 +0900
+@@ -49,6 +49,9 @@
+ ifeq (86,$(findstring 86,$(OS_TEST)))
+ CPPSRCS := xptcinvoke_unixish_x86.cpp xptcstubs_unixish_x86.cpp
+ endif
++ifeq (amd64,$(OS_TEST))
++CPPSRCS := xptcinvoke_unixish_amd64.cpp xptcstubs_unixish_amd64.cpp
++endif
+ endif
+ #
+ # New code for Linux, et. al., with gcc
+@@ -135,7 +138,7 @@
# NetBSD/ARM
#
ifeq ($(OS_ARCH),NetBSD)
@@ -12,7 +21,7 @@ diff -ru ../Orig/mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in ./xpcom/r
CPPSRCS := xptcinvoke_arm_netbsd.cpp xptcstubs_arm_netbsd.cpp
endif
endif
-@@ -169,7 +169,7 @@
+@@ -169,7 +172,7 @@
# NetBSD/m68k
#
ifeq ($(OS_ARCH),NetBSD)
@@ -21,7 +30,7 @@ diff -ru ../Orig/mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in ./xpcom/r
CPPSRCS := xptcinvoke_netbsd_m68k.cpp xptcstubs_netbsd_m68k.cpp
endif
endif
-@@ -295,6 +295,13 @@
+@@ -295,6 +298,13 @@
CPPSRCS := xptcinvoke_sparc_netbsd.cpp xptcstubs_sparc_netbsd.cpp
ASFILES := xptcinvoke_asm_sparc_netbsd.s xptcstubs_asm_sparc_netbsd.s
endif
diff --git a/www/mozilla/patches/patch-ba b/www/mozilla/patches/patch-ba
index cb645640e97..355dd8382a4 100644
--- a/www/mozilla/patches/patch-ba
+++ b/www/mozilla/patches/patch-ba
@@ -1,8 +1,7 @@
-$NetBSD: patch-ba,v 1.15 2004/01/17 00:04:49 taya Exp $
+$NetBSD: patch-ba,v 1.16 2004/05/30 14:02:01 sekiya Exp $
-diff -ru ../Orig/mozilla/nsprpub/pr/include/md/_netbsd.cfg ./nsprpub/pr/include/md/_netbsd.cfg
---- ../Orig/mozilla/nsprpub/pr/include/md/_netbsd.cfg 2000-12-02 06:29:17.000000000 +0900
-+++ ./nsprpub/pr/include/md/_netbsd.cfg 2004-01-16 23:17:44.000000000 +0900
+--- nsprpub/pr/include/md/_netbsd.cfg.orig 2000-12-02 06:29:17.000000000 +0900
++++ nsprpub/pr/include/md/_netbsd.cfg 2004-05-30 11:20:29.000000000 +0900
@@ -45,7 +45,8 @@
#define PR_AF_INET6 24 /* same as AF_INET6 */
@@ -68,3 +67,59 @@ diff -ru ../Orig/mozilla/nsprpub/pr/include/md/_netbsd.cfg ./nsprpub/pr/include/
#undef IS_LITTLE_ENDIAN
#define IS_BIG_ENDIAN 1
+@@ -184,6 +231,55 @@
+ #define PR_BYTES_PER_WORD_LOG2 3
+ #define PR_BYTES_PER_DWORD_LOG2 3
+
++#elif defined(__amd64__)
++#define IS_LITTLE_ENDIAN 1
++#undef IS_BIG_ENDIAN
++#define IS_64
++
++#define PR_BYTES_PER_BYTE 1
++#define PR_BYTES_PER_SHORT 2
++#define PR_BYTES_PER_INT 4
++#define PR_BYTES_PER_INT64 8
++#define PR_BYTES_PER_LONG 8
++#define PR_BYTES_PER_FLOAT 4
++#define PR_BYTES_PER_DOUBLE 8
++#define PR_BYTES_PER_WORD 8
++#define PR_BYTES_PER_DWORD 8
++
++#define PR_BITS_PER_BYTE 8
++#define PR_BITS_PER_SHORT 16
++#define PR_BITS_PER_INT 32
++#define PR_BITS_PER_INT64 64
++#define PR_BITS_PER_LONG 64
++#define PR_BITS_PER_FLOAT 32
++#define PR_BITS_PER_DOUBLE 64
++#define PR_BITS_PER_WORD 64
++
++#define PR_BITS_PER_BYTE_LOG2 3
++#define PR_BITS_PER_SHORT_LOG2 4
++#define PR_BITS_PER_INT_LOG2 5
++#define PR_BITS_PER_INT64_LOG2 6
++#define PR_BITS_PER_LONG_LOG2 6
++#define PR_BITS_PER_FLOAT_LOG2 5
++#define PR_BITS_PER_DOUBLE_LOG2 6
++#define PR_BITS_PER_WORD_LOG2 6
++
++#define PR_ALIGN_OF_SHORT 2
++#define PR_ALIGN_OF_INT 4
++#define PR_ALIGN_OF_LONG 8
++#define PR_ALIGN_OF_INT64 8
++#define PR_ALIGN_OF_FLOAT 4
++#define PR_ALIGN_OF_DOUBLE 8
++#define PR_ALIGN_OF_POINTER 8
++#define PR_ALIGN_OF_WORD 8
++
++#define PR_BYTES_PER_WORD_LOG2 3
++#define PR_BYTES_PER_DWORD_LOG2 3
++
++#define HAVE_LONG_LONG
++#define HAVE_ALIGNED_DOUBLES
++#define HAVE_ALIGNED_LONGLONGS
++
+ #elif defined(__powerpc__) || defined(__m68k__)
+
+ #undef IS_LITTLE_ENDIAN
diff --git a/www/mozilla/patches/patch-bb b/www/mozilla/patches/patch-bb
index ce4346ac25a..abcf7f98170 100644
--- a/www/mozilla/patches/patch-bb
+++ b/www/mozilla/patches/patch-bb
@@ -1,9 +1,14 @@
-$NetBSD: patch-bb,v 1.16 2004/02/22 12:02:55 taya Exp $
+$NetBSD: patch-bb,v 1.17 2004/05/30 14:02:01 sekiya Exp $
-diff -ru ../Orig/mozilla/nsprpub/pr/include/md/_netbsd.h ./nsprpub/pr/include/md/_netbsd.h
---- ../Orig/mozilla/nsprpub/pr/include/md/_netbsd.h 2003-09-12 02:24:53.000000000 +0900
-+++ ./nsprpub/pr/include/md/_netbsd.h 2004-02-21 16:47:07.000000000 +0900
-@@ -48,12 +48,20 @@
+--- nsprpub/pr/include/md/_netbsd.h.orig 2003-09-12 02:24:53.000000000 +0900
++++ nsprpub/pr/include/md/_netbsd.h 2004-05-30 14:36:16.000000000 +0900
+@@ -44,16 +44,26 @@
+ #define _PR_SI_ARCHITECTURE "x86"
+ #elif defined(__alpha__)
+ #define _PR_SI_ARCHITECTURE "alpha"
++#elif defined(__amd64__)
++#define _PR_SI_ARCHITECTURE "amd64"
+ #elif defined(__m68k__)
#define _PR_SI_ARCHITECTURE "m68k"
#elif defined(__powerpc__)
#define _PR_SI_ARCHITECTURE "powerpc"
@@ -24,7 +29,7 @@ diff -ru ../Orig/mozilla/nsprpub/pr/include/md/_netbsd.h ./nsprpub/pr/include/md
#endif
#if defined(__ELF__)
-@@ -86,6 +94,12 @@
+@@ -86,6 +96,12 @@
#define _PR_INET6_PROBE
#endif
@@ -37,7 +42,7 @@ diff -ru ../Orig/mozilla/nsprpub/pr/include/md/_netbsd.h ./nsprpub/pr/include/md
#define USE_SETJMP
#ifndef _PR_PTHREADS
-@@ -108,7 +122,17 @@
+@@ -108,7 +124,17 @@
}
#define _MD_GET_SP(_thread) CONTEXT(_thread)[2]
#endif
@@ -56,7 +61,7 @@ diff -ru ../Orig/mozilla/nsprpub/pr/include/md/_netbsd.h ./nsprpub/pr/include/md
#define _MD_INIT_CONTEXT(_thread, _sp, _main, status) \
{ \
sigsetjmp(CONTEXT(_thread), 1); \
-@@ -150,7 +174,7 @@
+@@ -150,7 +176,7 @@
}
#define _MD_GET_SP(_thread) CONTEXT(_thread)[32]
#endif
diff --git a/www/mozilla/patches/patch-bs b/www/mozilla/patches/patch-bs
new file mode 100644
index 00000000000..00f1b5202e4
--- /dev/null
+++ b/www/mozilla/patches/patch-bs
@@ -0,0 +1,14 @@
+$NetBSD: patch-bs,v 1.1 2004/05/30 14:02:01 sekiya Exp $
+
+--- config/mkdepend/imakemdep.h.orig 2004-05-30 11:16:09.000000000 +0900
++++ config/mkdepend/imakemdep.h 2004-05-30 11:17:01.000000000 +0900
+@@ -277,6 +277,9 @@
+ # ifdef __i386__
+ "-D__i386__",
+ # endif
++#if defined(__amd64__) || defined(__x86_64__)
++ "-D__amd64__ -D__x86_64__",
++# endif
+ # ifdef __GNUC__
+ "-traditional",
+ # endif
diff --git a/www/mozilla/patches/patch-bt b/www/mozilla/patches/patch-bt
new file mode 100644
index 00000000000..1bef920a2b7
--- /dev/null
+++ b/www/mozilla/patches/patch-bt
@@ -0,0 +1,16 @@
+$NetBSD: patch-bt,v 1.1 2004/05/30 14:02:01 sekiya Exp $
+
+--- nsprpub/pr/src/io/prprf.c.orig 2003-02-27 08:53:42.000000000 +0900
++++ nsprpub/pr/src/io/prprf.c 2004-05-30 14:47:15.000000000 +0900
+@@ -51,7 +51,10 @@
+ ** Note: on some platforms va_list is defined as an array,
+ ** and requires array notation.
+ */
+-#if (defined(LINUX) && defined(__powerpc__)) || \
++#if defined(__amd64__)
++#include <stdarg.h>
++#define VARARGS_ASSIGN(foo, bar) va_copy((foo), (bar))
++#elif (defined(LINUX) && defined(__powerpc__)) || \
+ (defined(LINUX) && defined(__s390__)) || \
+ (defined(LINUX) && defined(__s390x__)) || \
+ defined(WIN16) || defined(QNX) || \
diff --git a/www/mozilla/patches/patch-bu b/www/mozilla/patches/patch-bu
new file mode 100644
index 00000000000..1cd809091e4
--- /dev/null
+++ b/www/mozilla/patches/patch-bu
@@ -0,0 +1,179 @@
+$NetBSD: patch-bu,v 1.1 2004/05/30 14:02:01 sekiya Exp $
+
+--- xpcom/reflect/xptcall/src/md/unix/xptcinvoke_unixish_amd64.cpp.orig 2004-05-30 21:38:13.000000000 +0900
++++ xpcom/reflect/xptcall/src/md/unix/xptcinvoke_unixish_amd64.cpp 2004-05-30 21:37:22.000000000 +0900
+@@ -0,0 +1,174 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
++// Platform specific code to invoke XPCOM methods on native objects
++
++#include "xptcprivate.h"
++
++// 6 integral parameters are passed in registers
++const PRUint32 GPR_COUNT = 6;
++
++// 8 floating point parameters are passed in SSE registers
++const PRUint32 FPR_COUNT = 8;
++
++// Remember that these 'words' are 64-bit long
++static inline void
++invoke_count_words(PRUint32 paramCount, nsXPTCVariant * s,
++ PRUint32 & nr_gpr, PRUint32 & nr_fpr, PRUint32 & nr_stack)
++{
++ nr_gpr = 1; // skip one GP register for 'that'
++ nr_fpr = 0;
++ nr_stack = 0;
++
++ /* Compute number of eightbytes of class MEMORY. */
++ for (uint32 i = 0; i < paramCount; i++, s++) {
++ if (!s->IsPtrData()
++ && (s->type == nsXPTType::T_FLOAT || s->type == nsXPTType::T_DOUBLE)) {
++ if (nr_fpr < FPR_COUNT)
++ nr_fpr++;
++ else
++ nr_stack++;
++ }
++ else {
++ if (nr_gpr < GPR_COUNT)
++ nr_gpr++;
++ else
++ nr_stack++;
++ }
++ }
++}
++
++static void
++invoke_copy_to_stack(PRUint64 * d, PRUint32 paramCount, nsXPTCVariant * s,
++ PRUint64 * gpregs, double * fpregs)
++{
++ PRUint32 nr_gpr = 1; // skip one GP register for 'that'
++ PRUint32 nr_fpr = 0;
++ PRUint64 value;
++
++ for (uint32 i = 0; i < paramCount; i++, s++) {
++ if (s->IsPtrData())
++ value = (PRUint64) s->ptr;
++ else {
++ switch (s->type) {
++ case nsXPTType::T_FLOAT: break;
++ case nsXPTType::T_DOUBLE: break;
++ case nsXPTType::T_I8: value = s->val.i8; break;
++ case nsXPTType::T_I16: value = s->val.i16; break;
++ case nsXPTType::T_I32: value = s->val.i32; break;
++ case nsXPTType::T_I64: value = s->val.i64; break;
++ case nsXPTType::T_U8: value = s->val.u8; break;
++ case nsXPTType::T_U16: value = s->val.u16; break;
++ case nsXPTType::T_U32: value = s->val.u32; break;
++ case nsXPTType::T_U64: value = s->val.u64; break;
++ case nsXPTType::T_BOOL: value = s->val.b; break;
++ case nsXPTType::T_CHAR: value = s->val.c; break;
++ case nsXPTType::T_WCHAR: value = s->val.wc; break;
++ default: value = (PRUint64) s->val.p; break;
++ }
++ }
++
++ if (!s->IsPtrData() && s->type == nsXPTType::T_DOUBLE) {
++ if (nr_fpr < FPR_COUNT)
++ fpregs[nr_fpr++] = s->val.d;
++ else {
++ *((double *)d) = s->val.d;
++ d++;
++ }
++ }
++ else if (!s->IsPtrData() && s->type == nsXPTType::T_FLOAT) {
++ if (nr_fpr < FPR_COUNT)
++ // The value in %xmm register is already prepared to
++ // be retrieved as a float. Therefore, we pass the
++ // value verbatim, as a double without conversion.
++ fpregs[nr_fpr++] = s->val.d;
++ else {
++ *((float *)d) = s->val.f;
++ d++;
++ }
++ }
++ else {
++ if (nr_gpr < GPR_COUNT)
++ gpregs[nr_gpr++] = value;
++ else
++ *d++ = value;
++ }
++ }
++}
++
++extern "C"
++XPTC_PUBLIC_API(nsresult)
++XPTC_InvokeByIndex(nsISupports * that, PRUint32 methodIndex,
++ PRUint32 paramCount, nsXPTCVariant * params)
++{
++ PRUint32 nr_gpr, nr_fpr, nr_stack;
++ invoke_count_words(paramCount, params, nr_gpr, nr_fpr, nr_stack);
++
++ // Stack, if used, must be 16-bytes aligned
++ if (nr_stack)
++ nr_stack = (nr_stack + 1) & ~1;
++
++ // Load parameters to stack, if necessary
++ PRUint64 *stack = (PRUint64 *) __builtin_alloca(nr_stack * 8);
++ PRUint64 gpregs[GPR_COUNT];
++ double fpregs[FPR_COUNT];
++ invoke_copy_to_stack(stack, paramCount, params, gpregs, fpregs);
++
++ // Load FPR registers from fpregs[]
++ register double d0 asm("xmm0");
++ register double d1 asm("xmm1");
++ register double d2 asm("xmm2");
++ register double d3 asm("xmm3");
++ register double d4 asm("xmm4");
++ register double d5 asm("xmm5");
++ register double d6 asm("xmm6");
++ register double d7 asm("xmm7");
++
++ switch (nr_fpr) {
++#define ARG_FPR(N) \
++ case N+1: d##N = fpregs[N];
++ ARG_FPR(7);
++ ARG_FPR(6);
++ ARG_FPR(5);
++ ARG_FPR(4);
++ ARG_FPR(3);
++ ARG_FPR(2);
++ ARG_FPR(1);
++ ARG_FPR(0);
++ case 0:;
++#undef ARG_FPR
++ }
++
++ // Load GPR registers from gpregs[]
++ register PRUint64 a0 asm("rdi");
++ register PRUint64 a1 asm("rsi");
++ register PRUint64 a2 asm("rdx");
++ register PRUint64 a3 asm("rcx");
++ register PRUint64 a4 asm("r8");
++ register PRUint64 a5 asm("r9");
++
++ switch (nr_gpr) {
++#define ARG_GPR(N) \
++ case N+1: a##N = gpregs[N];
++ ARG_GPR(5);
++ ARG_GPR(4);
++ ARG_GPR(3);
++ ARG_GPR(2);
++ ARG_GPR(1);
++ case 1: a0 = (PRUint64) that;
++ case 0:;
++#undef ARG_GPR
++ }
++
++ // Ensure that assignments to SSE registers won't be optimized away
++ asm("" ::
++ "x" (d0), "x" (d1), "x" (d2), "x" (d3),
++ "x" (d4), "x" (d5), "x" (d6), "x" (d7));
++
++ // Get pointer to method
++ PRUint64 methodAddress = *((PRUint64 *)that);
++ methodAddress += 8 * methodIndex;
++ methodAddress = *((PRUint64 *)methodAddress);
++
++ typedef PRUint32 (*Method)(PRUint64, PRUint64, PRUint64, PRUint64, PRUint64, PRUint64);
++ PRUint32 result = ((Method)methodAddress)(a0, a1, a2, a3, a4, a5);
++ return result;
++}
diff --git a/www/mozilla/patches/patch-bv b/www/mozilla/patches/patch-bv
new file mode 100644
index 00000000000..b6c62b65bce
--- /dev/null
+++ b/www/mozilla/patches/patch-bv
@@ -0,0 +1,211 @@
+$NetBSD: patch-bv,v 1.1 2004/05/30 14:02:01 sekiya Exp $
+
+--- xpcom/reflect/xptcall/src/md/unix/xptcstubs_unixish_amd64.cpp.orig 2004-05-30 21:38:22.000000000 +0900
++++ xpcom/reflect/xptcall/src/md/unix/xptcstubs_unixish_amd64.cpp 2004-05-30 21:37:22.000000000 +0900
+@@ -0,0 +1,206 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
++
++// Implement shared vtbl methods.
++
++#include "xptcprivate.h"
++
++// The Linux/x86-64 ABI passes the first 6 integral parameters and the
++// first 8 floating point parameters in registers (rdi, rsi, rdx, rcx,
++// r8, r9 and xmm0-xmm7), no stack space is allocated for these by the
++// caller. The rest of the parameters are passed in the callers stack
++// area.
++
++const PRUint32 PARAM_BUFFER_COUNT = 16;
++const PRUint32 GPR_COUNT = 6;
++const PRUint32 FPR_COUNT = 8;
++
++// PrepareAndDispatch() is called by SharedStub() and calls the actual method.
++//
++// - 'args[]' contains the arguments passed on stack
++// - 'gpregs[]' contains the arguments passed in integer registers
++// - 'fpregs[]' contains the arguments passed in floating point registers
++//
++// The parameters are mapped into an array of type 'nsXPTCMiniVariant'
++// and then the method gets called.
++
++extern "C" nsresult
++PrepareAndDispatch(nsXPTCStubBase * self, PRUint32 methodIndex,
++ PRUint64 * args, PRUint64 * gpregs, double *fpregs)
++{
++ nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT];
++ nsXPTCMiniVariant* dispatchParams = NULL;
++ nsIInterfaceInfo* iface_info = NULL;
++ const nsXPTMethodInfo* info;
++ PRUint32 paramCount;
++ PRUint32 i;
++ nsresult result = NS_ERROR_FAILURE;
++
++ NS_ASSERTION(self,"no self");
++
++ self->GetInterfaceInfo(&iface_info);
++ NS_ASSERTION(iface_info,"no interface info");
++ if (! iface_info)
++ return NS_ERROR_UNEXPECTED;
++
++ iface_info->GetMethodInfo(PRUint16(methodIndex), &info);
++ NS_ASSERTION(info,"no method info");
++ if (! info)
++ return NS_ERROR_UNEXPECTED;
++
++ paramCount = info->GetParamCount();
++
++ // setup variant array pointer
++ if(paramCount > PARAM_BUFFER_COUNT)
++ dispatchParams = new nsXPTCMiniVariant[paramCount];
++ else
++ dispatchParams = paramBuffer;
++
++ NS_ASSERTION(dispatchParams,"no place for params");
++ if (! dispatchParams)
++ return NS_ERROR_OUT_OF_MEMORY;
++
++ PRUint64* ap = args;
++ PRUint32 nr_gpr = 1; // skip one GPR register for 'that'
++ PRUint32 nr_fpr = 0;
++ PRUint64 value;
++
++ for(i = 0; i < paramCount; i++) {
++ const nsXPTParamInfo& param = info->GetParam(i);
++ const nsXPTType& type = param.GetType();
++ nsXPTCMiniVariant* dp = &dispatchParams[i];
++
++ if (!param.IsOut() && type == nsXPTType::T_DOUBLE) {
++ if (nr_fpr < FPR_COUNT)
++ dp->val.d = fpregs[nr_fpr++];
++ else
++ dp->val.d = *(double*) ap++;
++ continue;
++ }
++ else if (!param.IsOut() && type == nsXPTType::T_FLOAT) {
++ if (nr_fpr < FPR_COUNT)
++ // The value in %xmm register is already prepared to
++ // be retrieved as a float. Therefore, we pass the
++ // value verbatim, as a double without conversion.
++ dp->val.d = *(double*) ap++;
++ else
++ dp->val.f = *(float*) ap++;
++ continue;
++ }
++ else {
++ if (nr_gpr < GPR_COUNT)
++ value = gpregs[nr_gpr++];
++ else
++ value = *ap++;
++ }
++
++ if (param.IsOut() || !type.IsArithmetic()) {
++ dp->val.p = (void*) value;
++ continue;
++ }
++
++ switch (type) {
++ case nsXPTType::T_I8: dp->val.i8 = (PRInt8) value; break;
++ case nsXPTType::T_I16: dp->val.i16 = (PRInt16) value; break;
++ case nsXPTType::T_I32: dp->val.i32 = (PRInt32) value; break;
++ case nsXPTType::T_I64: dp->val.i64 = (PRInt64) value; break;
++ case nsXPTType::T_U8: dp->val.u8 = (PRUint8) value; break;
++ case nsXPTType::T_U16: dp->val.u16 = (PRUint16) value; break;
++ case nsXPTType::T_U32: dp->val.u32 = (PRUint32) value; break;
++ case nsXPTType::T_U64: dp->val.u64 = (PRUint64) value; break;
++ case nsXPTType::T_BOOL: dp->val.b = (PRBool) value; break;
++ case nsXPTType::T_CHAR: dp->val.c = (char) value; break;
++ case nsXPTType::T_WCHAR: dp->val.wc = (wchar_t) value; break;
++
++ default:
++ NS_ASSERTION(0, "bad type");
++ break;
++ }
++ }
++
++ result = self->CallMethod((PRUint16) methodIndex, info, dispatchParams);
++
++ NS_RELEASE(iface_info);
++
++ if (dispatchParams != paramBuffer)
++ delete [] dispatchParams;
++
++ return result;
++}
++
++#if defined(__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100 /* G++ V3 ABI */
++// Linux/x86-64 uses gcc >= 3.1
++#define STUB_ENTRY(n) \
++asm(".section \".text\"\n\t" \
++ ".align 2\n\t" \
++ ".if " #n " < 10\n\t" \
++ ".globl _ZN14nsXPTCStubBase5Stub" #n "Ev\n\t" \
++ ".type _ZN14nsXPTCStubBase5Stub" #n "Ev,@function\n" \
++ "_ZN14nsXPTCStubBase5Stub" #n "Ev:\n\t" \
++ ".elseif " #n " < 100\n\t" \
++ ".globl _ZN14nsXPTCStubBase6Stub" #n "Ev\n\t" \
++ ".type _ZN14nsXPTCStubBase6Stub" #n "Ev,@function\n" \
++ "_ZN14nsXPTCStubBase6Stub" #n "Ev:\n\t" \
++ ".elseif " #n " < 1000\n\t" \
++ ".globl _ZN14nsXPTCStubBase7Stub" #n "Ev\n\t" \
++ ".type _ZN14nsXPTCStubBase7Stub" #n "Ev,@function\n" \
++ "_ZN14nsXPTCStubBase7Stub" #n "Ev:\n\t" \
++ ".else\n\t" \
++ ".err \"stub number " #n " >= 1000 not yet supported\"\n\t" \
++ ".endif\n\t" \
++ "movl $" #n ", %eax\n\t" \
++ "jmp SharedStub\n\t" \
++ ".if " #n " < 10\n\t" \
++ ".size _ZN14nsXPTCStubBase5Stub" #n "Ev,.-_ZN14nsXPTCStubBase5Stub" #n "Ev\n\t" \
++ ".elseif " #n " < 100\n\t" \
++ ".size _ZN14nsXPTCStubBase6Stub" #n "Ev,.-_ZN14nsXPTCStubBase6Stub" #n "Ev\n\t" \
++ ".else\n\t" \
++ ".size _ZN14nsXPTCStubBase7Stub" #n "Ev,.-_ZN14nsXPTCStubBase7Stub" #n "Ev\n\t" \
++ ".endif");
++
++// static nsresult SharedStub(PRUint32 methodIndex)
++asm(".section \".text\"\n\t"
++ ".align 2\n\t"
++ ".type SharedStub,@function\n\t"
++ "SharedStub:\n\t"
++ // make room for gpregs (48), fpregs (64)
++ "pushq %rbp\n\t"
++ "movq %rsp,%rbp\n\t"
++ "subq $112,%rsp\n\t"
++ // save GP registers
++ "movq %rdi,-112(%rbp)\n\t"
++ "movq %rsi,-104(%rbp)\n\t"
++ "movq %rdx, -96(%rbp)\n\t"
++ "movq %rcx, -88(%rbp)\n\t"
++ "movq %r8 , -80(%rbp)\n\t"
++ "movq %r9 , -72(%rbp)\n\t"
++ "leaq -112(%rbp),%rcx\n\t"
++ // save FP registers
++ "movsd %xmm0,-64(%rbp)\n\t"
++ "movsd %xmm1,-56(%rbp)\n\t"
++ "movsd %xmm2,-48(%rbp)\n\t"
++ "movsd %xmm3,-40(%rbp)\n\t"
++ "movsd %xmm4,-32(%rbp)\n\t"
++ "movsd %xmm5,-24(%rbp)\n\t"
++ "movsd %xmm6,-16(%rbp)\n\t"
++ "movsd %xmm7, -8(%rbp)\n\t"
++ "leaq -64(%rbp),%r8\n\t"
++ // rdi has the 'self' pointer already
++ "movl %eax,%esi\n\t"
++ "leaq 16(%rbp),%rdx\n\t"
++ "call PrepareAndDispatch\n\t"
++ "leave\n\t"
++ "ret\n\t"
++ ".size SharedStub,.-SharedStub");
++
++#define SENTINEL_ENTRY(n) \
++nsresult nsXPTCStubBase::Sentinel##n() \
++{ \
++ NS_ASSERTION(0,"nsXPTCStubBase::Sentinel called"); \
++ return NS_ERROR_NOT_IMPLEMENTED; \
++}
++
++#include "xptcstubsdef.inc"
++
++#else
++#error "can't find a compiler to use"
++#endif /* __GNUC__ */