This commit is contained in:
mgleeson1%netscape.com 1999-08-19 20:36:06 +00:00
Родитель f9c6f80a72
Коммит 179ca27661
5 изменённых файлов: 528 добавлений и 0 удалений

Просмотреть файл

@ -103,6 +103,18 @@ CPPSRCS = \
endif
endif
# HP-UX/PA32
ifeq ($(OS_ARCH),HP-UX)
CPPSRCS = \
xptcinvoke_pa32.cpp \
xptcstubs_pa32.cpp \
$(NULL)
ASFILES = \
xptcstubs_asm_pa32.s \
xptcinvoke_asm_pa32.s \
$(NULL)
endif
# AIX/PPC
ifeq ($(OS_ARCH),AIX)
CPPSRCS = \

Просмотреть файл

@ -0,0 +1,131 @@
.LEVEL 1.1
framesz .EQU 128
; XPTC_InvokeByIndex(nsISuppots* that, PRUint32 methodIndex,
; PRUint32 paramCount, nsXPTCVariant* params);
; g++ need to compile everything with -fvtable-thunks !
.SPACE $TEXT$,SORT=8
.SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=0x2c,CODE_ONLY,SORT=24
XPTC_InvokeByIndex
.PROC
.CALLINFO CALLER,FRAME=72,ENTRY_GR=%r3,SAVE_RP,SAVE_SP,ARGS_SAVED,ALLOCA_FRAME
; frame marker takes 48 bytes,
; register spill area takes 8 bytes,
; local stack area takes 72 bytes result in 128 bytes total
.ENTRY
STW %rp,-20(%sp)
STW,MA %r3,128(%sp)
LDO -framesz(%r30),%r28
STW %r28,-4(%r30) ; save previous sp
STW %r19,-32(%r30)
STW %r26,-36-framesz(%r30) ; save argument registers in
STW %r25,-40-framesz(%r30) ; in PREVIOUS frame
STW %r24,-44-framesz(%r30) ;
STW %r23,-48-framesz(%r30) ;
B,L .+8,%r2
ADDIL L'invoke_count_bytes-$PIC_pcrel$1+4,%r2,%r1
LDO R'invoke_count_bytes-$PIC_pcrel$2+8(%r1),%r1
$PIC_pcrel$1
LDSID (%r1),%r31
$PIC_pcrel$2
MTSP %r31,%sr0
.CALL ARGW0=GR,ARGW1=GR,ARGW2=GR ;in=24,25,26;out=28
BE,L 0(%sr0,%r1),%r31
COPY %r31,%r2
CMPIB,>= 0,%r28, .+76
COPY %r30,%r3 ; copy stack ptr to saved stack ptr
ADD %r30,%r28,%r30 ; extend stack frame
LDW -4(%r3),%r28 ; move frame
STW %r28,-4(%r30)
LDW -8(%r3),%r28
STW %r28,-8(%r30)
LDW -12(%r3),%r28
STW %r28,-12(%r30)
LDW -16(%r3),%r28
STW %r28,-16(%r30)
LDW -20(%r3),%r28
STW %r28,-20(%r30)
LDW -24(%r3),%r28
STW %r28,-24(%r30)
LDW -28(%r3),%r28
STW %r28,-28(%r30)
LDW -32(%r3),%r28
STW %r28,-32(%r30)
LDO -40(%r30),%r26 ; load copy address
LDW -44-framesz(%r3),%r25 ; load rest of 2 arguments
LDW -48-framesz(%r3),%r24 ;
LDW -32(%r30),%r19 ; shared lib call destroys r19; reload
B,L .+8,%r2
ADDIL L'invoke_copy_to_stack-$PIC_pcrel$3+4,%r2,%r1
LDO R'invoke_copy_to_stack-$PIC_pcrel$4+8(%r1),%r1
$PIC_pcrel$3
LDSID (%r1),%r31
$PIC_pcrel$4
MTSP %r31,%sr0
.CALL ARGW0=GR,ARGW1=GR,ARGW2=GR ;in=24,25,26
BE,L 0(%sr0,%r1),%r31
COPY %r31,%r2
LDO -48(%r30),%r20
EXTRW,U,= %r28,31,1,%r22
FLDD 0(%r20),%fr7 ; load double arg 1
EXTRW,U,= %r28,30,1,%r22
FLDW 8(%r20),%fr5L ; load float arg 1
EXTRW,U,= %r28,29,1,%r22
FLDW 4(%r20),%fr6L ; load float arg 2
EXTRW,U,= %r28,28,1,%r22
FLDW 0(%r20),%fr7L ; load float arg 3
LDW -36-framesz(%r3),%r26 ; load ptr to 'that'
LDW -40(%r30),%r25 ; load the rest of dispatch argument registers
LDW -44(%r30),%r24
LDW -48(%r30),%r23
LDW -36-framesz(%r3),%r20 ; load vtable addr
LDW -40-framesz(%r3),%r28 ; load index
LDW 0(%r20),%r20 ; follow vtable
LDO 16(%r20),%r20 ; offset vtable by 16 bytes (g++: 8, aCC: 16)
SH2ADDL %r28,%r20,%r28 ; add 4*index to vtable entry
LDW 0(%r28),%r22 ; load vtable entry
B,L .+8,%r2
ADDIL L'$$dyncall_external-$PIC_pcrel$5+4,%r2,%r1
LDO R'$$dyncall_external-$PIC_pcrel$6+8(%r1),%r1
$PIC_pcrel$5
LDSID (%r1),%r31
$PIC_pcrel$6
MTSP %r31,%sr0
.CALL ARGW0=GR,ARGW1=GR,ARGW2=GR,ARGW3=GR,RTNVAL=GR
;in=22-26;out=28;
BE,L 0(%sr0,%r1),%r31
COPY %r31,%r2
LDW -32(%r30),%r19
COPY %r3,%r30 ; restore saved stack ptr
LDW -148(%sp),%rp
BVE (%rp)
.EXIT
LDW,MB -128(%sp),%r3
.PROCEND ;in=23,24,25,26;
.ALIGN 8
.SPACE $TEXT$
.SUBSPA $CODE$
.IMPORT $$dyncall_external,MILLICODE
.IMPORT invoke_count_bytes,CODE
.IMPORT invoke_copy_to_stack,CODE
.EXPORT XPTC_InvokeByIndex,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,ARGW2=GR,ARGW3=GR,RTNVAL=GR,LONG_RETURN
.END

Просмотреть файл

@ -0,0 +1,161 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "xptcprivate.h"
#if _HPUX
#error "This code is for HP-PA RISC 32 bit mode only"
#endif
#include <alloca.h>
typedef unsigned nsXPCVariant;
extern "C" PRInt32
invoke_count_bytes(nsISupports* that,
const PRUint32 paramCount, const nsXPTCVariant* s)
{
PRInt32 result = 4; /* variant records do not include self pointer */
/* counts the number of bytes required by the argument stack,
64 bit integer, and double requires 8 bytes. All else requires
4 bytes.
*/
{
PRUint32 indx;
for (indx = paramCount; indx > 0; --indx, ++s)
{
if (! s->IsPtrData())
{
if (s->type == nsXPTType::T_I64 || s->type == nsXPTType::T_U64 ||
s->type == nsXPTType::T_DOUBLE)
{
/* 64 bit integer and double aligned on 8 byte boundaries */
result += (result & 4) + 8;
continue;
}
}
result += 4; /* all other cases use 4 bytes */
}
}
result -= 72; /* existing stack buffer is 72 bytes */
if (result < 0)
return 0;
{
/* round up to 64 bytes boundary */
PRInt32 remainder = result & 63;
return (remainder == 0) ? result : (result + 64 - remainder);
}
}
extern "C" PRUint32
invoke_copy_to_stack(PRUint32* d,
const PRUint32 paramCount, nsXPTCVariant* s)
{
typedef struct
{
PRUint32 hi;
PRUint32 lo;
} DU;
PRUint32* dest = d;
nsXPTCVariant* source = s;
/* we clobber param vars by copying stuff on stack, have to use local var */
PRUint32 floatflags = 0;
/* flag indicating which floating point registers to load */
PRUint32 regwords = 1; /* register 26 is reserved for ptr to 'that' */
PRUint32 indx;
for (indx = paramCount; indx > 0; --indx, --dest, ++source)
{
if (source->IsPtrData())
{
*((void**) dest) = source->ptr;
++regwords;
continue;
}
switch (source->type)
{
case nsXPTType::T_I8 : *((PRInt32*) dest) = source->val.i8; break;
case nsXPTType::T_I16 : *((PRInt32*) dest) = source->val.i16; break;
case nsXPTType::T_I32 : *((PRInt32*) dest) = source->val.i32; break;
case nsXPTType::T_I64 :
case nsXPTType::T_U64 :
if (regwords & 1)
{
/* align on double word boundary */
--dest;
++regwords;
}
*((uint32*) dest) = ((DU *) source)->lo;
*((uint32*) --dest) = ((DU *) source)->hi;
/* big endian - hi word in low addr */
regwords += 2;
continue;
case nsXPTType::T_DOUBLE :
if (regwords & 1)
{
/* align on double word boundary */
--dest;
++regwords;
}
switch (regwords) /* load double precision float register */
{
case 2:
floatflags |= 1;
}
*((uint32*) dest) = ((DU *) source)->lo;
*((uint32*) --dest) = ((DU *) source)->hi;
/* big endian - hi word in low addr */
regwords += 2;
continue;
case nsXPTType::T_FLOAT :
switch (regwords) /* load single precision float register */
{
case 1:
floatflags |= 2;
break;
case 2:
floatflags |= 4;
break;
case 3:
floatflags |= 8;
}
*((float*) dest) = source->val.f;
break;
case nsXPTType::T_U8 : *((PRUint32*) (dest)) = source->val.u8; break;
case nsXPTType::T_U16 : *((PRUint32*) (dest)) = source->val.u16; break;
case nsXPTType::T_U32 : *((PRUint32*) (dest)) = source->val.u32; break;
case nsXPTType::T_BOOL : *((PRBool*) (dest)) = source->val.b; break;
case nsXPTType::T_CHAR : *((PRUint32*) (dest)) = source->val.c; break;
case nsXPTType::T_WCHAR : *((PRInt32*) (dest)) = source->val.wc; break;
default:
// all the others are plain pointer types
*((void**) dest) = source->val.p;
}
++regwords;
}
return floatflags;
}

Просмотреть файл

@ -0,0 +1,68 @@
.LEVEL 1.1
curframesz .EQU 128
; SharedStub has stack size of 128 bytes
lastframesz .EQU 64
; the StubN C++ function has a small stack size of 64 bytes
.SPACE $TEXT$,SORT=8
.SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=0x2c,CODE_ONLY,SORT=24
SharedStub
.PROC
.CALLINFO CALLER,FRAME=80,SAVE_RP,ARGS_SAVED
.ENTRY
STW %rp,-20(%sp)
LDO 128(%sp),%sp
STW %r19,-32(%r30)
STW %r26,-36-curframesz(%r30) ; save arg0 in previous frame
LDO -80(%r30),%r28
FSTD,MA %fr5,8(%r28) ; save darg0
FSTD,MA %fr7,8(%r28) ; save darg1
FSTW,MA %fr4L,4(%r28) ; save farg0
FSTW,MA %fr5L,4(%r28) ; save farg1
FSTW,MA %fr6L,4(%r28) ; save farg2
FSTW,MA %fr7L,4(%r28) ; save farg3
; Former value of register 26 is already properly saved by StubN,
; but register 25-23 are not because of the arguments mismatch
STW %r25,-40-curframesz-lastframesz(%r30) ; save r25
STW %r24,-44-curframesz-lastframesz(%r30) ; save r24
STW %r23,-48-curframesz-lastframesz(%r30) ; save r23
COPY %r26,%r25 ; method index is arg1
LDW -36-curframesz-lastframesz(%r30),%r26 ; self is arg0
LDO -40-curframesz-lastframesz(%r30),%r24 ; normal args is arg2
LDO -80(%r30),%r23 ; floating args is arg3
BL .+8,%r2
ADDIL L'PrepareAndDispatch-$PIC_pcrel$0+4,%r2
LDO R'PrepareAndDispatch-$PIC_pcrel$1+8(%r1),%r1
$PIC_pcrel$0
LDSID (%r1),%r31
$PIC_pcrel$1
MTSP %r31,%sr0
.CALL ARGW0=GR,ARGW1=GR,ARGW2=GR,ARGW3=GR,RTNVAL=GR
;in=23-26;out=28;
BLE 0(%sr0,%r1)
COPY %r31,%r2
LDW -32(%r30),%r19
LDW -148(%sp),%rp
BVE (%rp)
.EXIT
LDO -128(%sp),%sp
.PROCEND ;in=26;out=28;
.ALIGN 8
.SPACE $TEXT$
.SUBSPA $CODE$
.IMPORT PrepareAndDispatch,CODE
.EXPORT SharedStub,ENTRY,PRIV_LEV=3,ARGW0=GR,RTNVAL=GR,LONG_RETURN
.END

Просмотреть файл

@ -0,0 +1,156 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
* Reserved.
*/
/* Implement shared vtbl methods. */
#include "xptcprivate.h"
#if _HPUX
#error "This code is for HP-PA RISC 32 bit mode only"
#endif
extern "C" nsresult
PrepareAndDispatch(nsXPTCStubBase* self, PRUint32 methodIndex,
PRUint32* args, PRUint32* floatargs)
{
typedef struct {
uint32 hi;
uint32 lo;
} DU;
#define PARAM_BUFFER_COUNT 16
nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT];
nsXPTCMiniVariant* dispatchParams = NULL;
nsIInterfaceInfo* iface_info = NULL;
const nsXPTMethodInfo* info;
PRInt32 regwords = 1; /* self pointer is not in the variant records */
nsresult result = NS_ERROR_FAILURE;
PRUint8 paramCount;
PRUint8 i;
NS_ASSERTION(self,"no self");
self->GetInterfaceInfo(&iface_info);
NS_ASSERTION(iface_info,"no interface info");
iface_info->GetMethodInfo(PRUint16(methodIndex), &info);
NS_ASSERTION(info,"no interface info");
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");
for(i = 0; i < paramCount; ++i, --args)
{
const nsXPTParamInfo& param = info->GetParam(i);
const nsXPTType& type = param.GetType();
nsXPTCMiniVariant* dp = &dispatchParams[i];
if(param.IsOut() || !type.IsArithmetic())
{
dp->val.p = (void*) *args;
++regwords;
continue;
}
switch(type)
{
case nsXPTType::T_I8 : dp->val.i8 = *((PRInt32*) args); break;
case nsXPTType::T_I16 : dp->val.i16 = *((PRInt32*) args); break;
case nsXPTType::T_I32 : dp->val.i32 = *((PRInt32*) args); break;
case nsXPTType::T_DOUBLE :
if (regwords & 1)
{
++regwords; /* align on double word */
--args;
}
if (regwords == 0 || regwords == 2)
{
dp->val.d=*((double*) (floatargs + regwords));
--args;
}
else
{
dp->val.d = *((double*) --args);
}
regwords += 2;
continue;
case nsXPTType::T_U64 :
case nsXPTType::T_I64 :
if (regwords & 1)
{
++regwords; /* align on double word */
--args;
}
((DU *)dp)->lo = *((PRUint32*) args);
((DU *)dp)->hi = *((PRUint32*) --args);
regwords += 2;
continue;
case nsXPTType::T_FLOAT :
if (regwords >= 4)
dp->val.f = *((float*) args);
else
dp->val.f = *((float*) floatargs+4+regwords);
break;
case nsXPTType::T_U8 : dp->val.u8 = *((PRUint32*) args); break;
case nsXPTType::T_U16 : dp->val.u16 = *((PRUint32*) args); break;
case nsXPTType::T_U32 : dp->val.u32 = *((PRUint32*) args); break;
case nsXPTType::T_BOOL : dp->val.b = *((PRBool*) args); break;
case nsXPTType::T_CHAR : dp->val.c = *((PRUint32*) args); break;
case nsXPTType::T_WCHAR : dp->val.wc = *((PRInt32*) args); break;
default:
NS_ASSERTION(0, "bad type");
break;
}
++regwords;
}
result = self->CallMethod((PRUint16) methodIndex, info, dispatchParams);
NS_RELEASE(iface_info);
if(dispatchParams != paramBuffer)
delete [] dispatchParams;
return result;
}
extern "C" int SharedStub(int);
#define STUB_ENTRY(n) \
nsresult nsXPTCStubBase::Stub##n() \
{ \
return SharedStub(n); \
}
#define SENTINEL_ENTRY(n) \
nsresult nsXPTCStubBase::Sentinel##n() \
{ \
NS_ASSERTION(0,"nsXPTCStubBase::Sentinel called"); \
return NS_ERROR_NOT_IMPLEMENTED; \
}
#include "xptcstubsdef.inc"