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
133