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 <stdint.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 /* 64 bit pointer mode */
37 *((void**) dest) = source[indx].ptr;
38 }
39 else
40 switch (source[indx].type)
41 {
42 case nsXPTType::T_I8 : *(dest) = source[indx].val.i8; break;
43 case nsXPTType::T_I16 : *(dest) = source[indx].val.i16; break;
44 case nsXPTType::T_I32 : *(dest) = source[indx].val.i32; break;
45 case nsXPTType::T_I64 : *(dest) = source[indx].val.i64; break;
46 case nsXPTType::T_U8 : *(dest) = source[indx].val.u8; break;
47 case nsXPTType::T_U16 : *(dest) = source[indx].val.u16; break;
48 case nsXPTType::T_U32 : *(dest) = source[indx].val.u32; break;
49 case nsXPTType::T_U64 : *(dest) = source[indx].val.u64; break;
50 case nsXPTType::T_FLOAT : *(dest) = source[indx].val.u32; break;
51 case nsXPTType::T_DOUBLE: *(dest) = source[indx].val.u64; break;
52 case nsXPTType::T_BOOL : *(dest) = source[indx].val.b; break;
53 case nsXPTType::T_CHAR : *(dest) = source[indx].val.c; break;
54 case nsXPTType::T_WCHAR : *(dest) = source[indx].val.wc; break;
55 default:
56 // all the others are plain pointer types
57 /* 64 bit pointer mode */
58 *((void**) dest) = source[indx].val.p;
59 }
60 ++dest;
61 }
62 /* process register arguments */
63 dest = iloc;
64 for (indx = 0; indx < endlen; ++indx)
65 {
66 if (source[indx].IsPtrData())
67 {
68 /* 64 bit pointer mode */
69 *((void**) dest) = source[indx].ptr;
70 }
71 else
72 switch (source[indx].type)
73 {
74 case nsXPTType::T_I8 : *(dest) = source[indx].val.i8; break;
75 case nsXPTType::T_I16 : *(dest) = source[indx].val.i16; break;
76 case nsXPTType::T_I32 : *(dest) = source[indx].val.i32; break;
77 case nsXPTType::T_I64 : *(dest) = source[indx].val.i64; break;
78 case nsXPTType::T_U8 : *(dest) = source[indx].val.u8; break;
79 case nsXPTType::T_U16 : *(dest) = source[indx].val.u16; break;
80 case nsXPTType::T_U32 : *(dest) = source[indx].val.u32; break;
81 case nsXPTType::T_U64 : *(dest) = source[indx].val.u64; break;
82 case nsXPTType::T_FLOAT :
83 *((double*) (floc++)) = (double) source[indx].val.f;
84 break;
85 case nsXPTType::T_DOUBLE:
86 *((double*) (floc++)) = source[indx].val.d;
87 break;
88 case nsXPTType::T_BOOL : *(dest) = source[indx].val.b; break;
89 case nsXPTType::T_CHAR : *(dest) = source[indx].val.c; break;
90 case nsXPTType::T_WCHAR : *(dest) = source[indx].val.wc; break;
91 default:
92 // all the others are plain pointer types
93 /* 64 bit pointer mode */
94 *((void**) dest) = source[indx].val.p;
95 }
96 ++dest;
97 }
98
99 }
100