xpcom/reflect/xptcall/src/md/unix/xptcinvoke_mips64.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_mips64.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,140 @@
     1.4 +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
     1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +
     1.9 +/* Platform specific code to invoke XPCOM methods on native objects */
    1.10 +
    1.11 +#include "xptcprivate.h"
    1.12 +
    1.13 +#if (_MIPS_SIM != _ABIN32)
    1.14 +#error "This code is for MIPS N32 only"
    1.15 +#endif
    1.16 +
    1.17 +extern "C" uint32_t
    1.18 +invoke_count_words(uint32_t paramCount, nsXPTCVariant* s)
    1.19 +{
    1.20 +    return paramCount;
    1.21 +}
    1.22 +
    1.23 +extern "C" void
    1.24 +invoke_copy_to_stack(uint64_t* d, uint32_t paramCount,
    1.25 +                     nsXPTCVariant* s, uint64_t *regs)
    1.26 +{
    1.27 +#define N_ARG_REGS       7       /* 8 regs minus 1 for "this" ptr */
    1.28 +
    1.29 +    for (uint32_t i = 0; i < paramCount; i++, s++)
    1.30 +    {
    1.31 +        if (s->IsPtrData()) {
    1.32 +            if (i < N_ARG_REGS)
    1.33 +                regs[i] = (uint64_t)s->ptr;
    1.34 +            else
    1.35 +                *d++ = (uint64_t)s->ptr;
    1.36 +            continue;
    1.37 +        }
    1.38 +        switch (s->type) {
    1.39 +        //
    1.40 +        // signed types first
    1.41 +        //
    1.42 +        case nsXPTType::T_I8:
    1.43 +            if (i < N_ARG_REGS)
    1.44 +                ((int64_t*)regs)[i] = s->val.i8;
    1.45 +            else
    1.46 +                *d++ = s->val.i8;
    1.47 +            break;
    1.48 +        case nsXPTType::T_I16:
    1.49 +            if (i < N_ARG_REGS)
    1.50 +                ((int64_t*)regs)[i] = s->val.i16;
    1.51 +            else
    1.52 +                *d++ = s->val.i16;
    1.53 +            break;
    1.54 +        case nsXPTType::T_I32:
    1.55 +            if (i < N_ARG_REGS)
    1.56 +                ((int64_t*)regs)[i] = s->val.i32;
    1.57 +            else
    1.58 +                *d++ = s->val.i32;
    1.59 +            break;
    1.60 +        case nsXPTType::T_I64:
    1.61 +            if (i < N_ARG_REGS)
    1.62 +                ((int64_t*)regs)[i] = s->val.i64;
    1.63 +            else
    1.64 +                *d++ = s->val.i64;
    1.65 +            break;
    1.66 +        //
    1.67 +        // unsigned types next
    1.68 +        //
    1.69 +        case nsXPTType::T_U8:
    1.70 +            if (i < N_ARG_REGS)
    1.71 +                regs[i] = s->val.u8;
    1.72 +            else
    1.73 +                *d++ = s->val.u8;
    1.74 +            break;
    1.75 +        case nsXPTType::T_U16:
    1.76 +            if (i < N_ARG_REGS)
    1.77 +                regs[i] = s->val.u16;
    1.78 +            else
    1.79 +                *d++ = s->val.u16;
    1.80 +            break;
    1.81 +        case nsXPTType::T_U32:
    1.82 +            if (i < N_ARG_REGS)
    1.83 +                regs[i] = s->val.u32;
    1.84 +            else
    1.85 +                *d++ = s->val.u32;
    1.86 +            break;
    1.87 +        case nsXPTType::T_U64:
    1.88 +            if (i < N_ARG_REGS)
    1.89 +                regs[i] = s->val.u64;
    1.90 +            else
    1.91 +                *d++ = s->val.u64;
    1.92 +            break;
    1.93 +        case nsXPTType::T_FLOAT:
    1.94 +            if (i < N_ARG_REGS)
    1.95 +                *(float*)&regs[i] = s->val.f;
    1.96 +            else
    1.97 +                *(float*)d++ = s->val.f;
    1.98 +            break;
    1.99 +        case nsXPTType::T_DOUBLE:
   1.100 +            if (i < N_ARG_REGS)
   1.101 +                *(double*)&regs[i] = s->val.d;
   1.102 +            else
   1.103 +                *(double*)d++ = s->val.d;
   1.104 +            break;
   1.105 +        case nsXPTType::T_BOOL:
   1.106 +            if (i < N_ARG_REGS)
   1.107 +                regs[i] = s->val.b;
   1.108 +            else
   1.109 +                *d++ = s->val.b;
   1.110 +            break;
   1.111 +        case nsXPTType::T_CHAR:
   1.112 +            if (i < N_ARG_REGS)
   1.113 +                regs[i] = s->val.c;
   1.114 +            else
   1.115 +                *d++ = s->val.c;
   1.116 +            break;
   1.117 +        case nsXPTType::T_WCHAR:
   1.118 +            if (i < N_ARG_REGS)
   1.119 +                regs[i] = s->val.wc;
   1.120 +            else
   1.121 +                *d++ = s->val.wc;
   1.122 +            break;
   1.123 +        default:
   1.124 +            // all the others are plain pointer types
   1.125 +            if (i < N_ARG_REGS)
   1.126 +                regs[i] = (uint64_t)s->val.p;
   1.127 +            else
   1.128 +               *d++ = (uint64_t)s->val.p;
   1.129 +            break;
   1.130 +        }
   1.131 +    }
   1.132 +}
   1.133 +
   1.134 +extern "C" nsresult _NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
   1.135 +                                        uint32_t paramCount,
   1.136 +                                        nsXPTCVariant* params);
   1.137 +
   1.138 +EXPORT_XPCOM_API(nsresult)
   1.139 +NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
   1.140 +                   uint32_t paramCount, nsXPTCVariant* params)
   1.141 +{
   1.142 +    return _NS_InvokeByIndex(that, methodIndex, paramCount, params);
   1.143 +}

mercurial