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