1 
2 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 
8 #include "xptcprivate.h"
9 
10 #include <iostream.h>
11 
12 // "This code is for IA64 only"
13 
14 
15 /* invoke_copy_to_stack() will copy from variant array 's' to
16  * the stack argument area 'mloc', the integer register area 'iloc', and
17  * the float register area 'floc'.
18  *
19  */
20 extern "C" void
invoke_copy_to_stack(uint64_t * mloc,uint64_t * iloc,uint64_t * floc,const uint32_t paramCount,nsXPTCVariant * s)21 invoke_copy_to_stack(uint64_t* mloc, uint64_t* iloc, uint64_t* floc,
22   const uint32_t paramCount, nsXPTCVariant* s)
23 {
24   uint64_t* dest = mloc;
25   uint32_t len = paramCount;
26   nsXPTCVariant* source = s;
27 
28   uint32_t indx;
29   uint32_t endlen;
30   endlen = (len > 7) ? 7 : len;
31   /* handle the memory arguments */
32   for (indx = 7; indx < len; ++indx)
33   {
34     if (source[indx].IsPtrData())
35     {
36 #ifdef __LP64__
37       /* 64 bit pointer mode */
38       *((void**) dest) = source[indx].ptr;
39 #else
40       /* 32 bit pointer mode */
41       uint32_t* adr = (uint32_t*) dest;
42       *(adr) = 0;
43       *(adr+1) = (uint32_t) source[indx].ptr;
44 #endif
45     }
46     else
47     switch (source[indx].type)
48     {
49     case nsXPTType::T_I8    : *(dest) = source[indx].val.i8;  break;
50     case nsXPTType::T_I16   : *(dest) = source[indx].val.i16; break;
51     case nsXPTType::T_I32   : *(dest) = source[indx].val.i32; break;
52     case nsXPTType::T_I64   : *(dest) = source[indx].val.i64; break;
53     case nsXPTType::T_U8    : *(dest) = source[indx].val.u8;  break;
54     case nsXPTType::T_U16   : *(dest) = source[indx].val.u16; break;
55     case nsXPTType::T_U32   : *(dest) = source[indx].val.u32; break;
56     case nsXPTType::T_U64   : *(dest) = source[indx].val.u64; break;
57     case nsXPTType::T_FLOAT : *(dest) = source[indx].val.u32; break;
58     case nsXPTType::T_DOUBLE: *(dest) = source[indx].val.u64; break;
59     case nsXPTType::T_BOOL  : *(dest) = source[indx].val.b; break;
60     case nsXPTType::T_CHAR  : *(dest) = source[indx].val.c; break;
61     case nsXPTType::T_WCHAR : *(dest) = source[indx].val.wc; break;
62     default:
63     // all the others are plain pointer types
64 #ifdef __LP64__
65       /* 64 bit pointer mode */
66       *((void**) dest) = source[indx].val.p;
67 #else
68       {
69       /* 32 bit pointer mode */
70       uint32_t* adr = (uint32_t*) dest;
71       *(adr) = 0;
72       *(adr+1) = (uint32_t) source[indx].val.p;
73       }
74 #endif
75     }
76     ++dest;
77   }
78   /* process register arguments */
79   dest = iloc;
80   for (indx = 0; indx < endlen; ++indx)
81   {
82     if (source[indx].IsPtrData())
83     {
84 #ifdef __LP64__
85       /* 64 bit pointer mode */
86       *((void**) dest) = source[indx].ptr;
87 #else
88       /* 32 bit pointer mode */
89       uint32_t* adr = (uint32_t*) dest;
90       *(adr) = 0;
91       *(adr+1) = (uint32_t) source[indx].ptr;
92 #endif
93     }
94     else
95     switch (source[indx].type)
96     {
97     case nsXPTType::T_I8    : *(dest) = source[indx].val.i8; break;
98     case nsXPTType::T_I16   : *(dest) = source[indx].val.i16; break;
99     case nsXPTType::T_I32   : *(dest) = source[indx].val.i32; break;
100     case nsXPTType::T_I64   : *(dest) = source[indx].val.i64; break;
101     case nsXPTType::T_U8    : *(dest) = source[indx].val.u8; break;
102     case nsXPTType::T_U16   : *(dest) = source[indx].val.u16; break;
103     case nsXPTType::T_U32   : *(dest) = source[indx].val.u32; break;
104     case nsXPTType::T_U64   : *(dest) = source[indx].val.u64; break;
105     case nsXPTType::T_FLOAT :
106       *((double*) (floc++)) = (double) source[indx].val.f;
107       break;
108     case nsXPTType::T_DOUBLE:
109       *((double*) (floc++)) = source[indx].val.d;
110       break;
111     case nsXPTType::T_BOOL  : *(dest) = source[indx].val.b; break;
112     case nsXPTType::T_CHAR  : *(dest) = source[indx].val.c; break;
113     case nsXPTType::T_WCHAR : *(dest) = source[indx].val.wc; break;
114     default:
115     // all the others are plain pointer types
116 #ifdef __LP64__
117       /* 64 bit pointer mode */
118       *((void**) dest) = source[indx].val.p;
119 #else
120       {
121       /* 32 bit pointer mode */
122       uint32_t* adr = (uint32_t*) dest;
123       *(adr) = 0;
124       *(adr+1) = (uint32_t) source[indx].val.p;
125       }
126 #endif
127     }
128     ++dest;
129   }
130 
131 }
132