LCOV - code coverage report
Current view: top level - xpcom/reflect/xptcall/md/unix - xptcinvoke_x86_64_unix.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 25 36 69.4 %
Date: 2017-07-14 16:53:18 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
       2             :  *
       3             :  * This Source Code Form is subject to the terms of the Mozilla Public
       4             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       5             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
       6             : 
       7             : // Platform specific code to invoke XPCOM methods on native objects
       8             : 
       9             : #include "xptcprivate.h"
      10             : 
      11             : // 6 integral parameters are passed in registers, but 1 is |this| which isn't
      12             : // considered here.
      13             : const uint32_t GPR_COUNT = 5;
      14             : 
      15             : // 8 floating point parameters are passed in SSE registers
      16             : const uint32_t FPR_COUNT = 8;
      17             : 
      18             : extern "C" void
      19       11872 : InvokeCopyToStack(uint64_t * gpregs, double * fpregs,
      20             :                      uint32_t paramCount, nsXPTCVariant * s,
      21             :                      uint64_t* d)
      22             : {
      23       11872 :     uint32_t nr_gpr = 0u;
      24       11872 :     uint32_t nr_fpr = 0u;
      25       11872 :     uint64_t value = 0u;
      26             : 
      27       40320 :     for (uint32_t i = 0; i < paramCount; i++, s++) {
      28       28448 :         if (s->IsPtrData())
      29       11593 :             value = (uint64_t) s->ptr;
      30             :         else {
      31       16855 :             switch (s->type) {
      32           4 :             case nsXPTType::T_FLOAT:                                break;
      33           0 :             case nsXPTType::T_DOUBLE:                               break;
      34           0 :             case nsXPTType::T_I8:     value = s->val.i8;            break;
      35           6 :             case nsXPTType::T_I16:    value = s->val.i16;           break;
      36          86 :             case nsXPTType::T_I32:    value = s->val.i32;           break;
      37           0 :             case nsXPTType::T_I64:    value = s->val.i64;           break;
      38        1925 :             case nsXPTType::T_U8:     value = s->val.u8;            break;
      39           6 :             case nsXPTType::T_U16:    value = s->val.u16;           break;
      40         115 :             case nsXPTType::T_U32:    value = s->val.u32;           break;
      41           0 :             case nsXPTType::T_U64:    value = s->val.u64;           break;
      42        1484 :             case nsXPTType::T_BOOL:   value = s->val.b;             break;
      43           0 :             case nsXPTType::T_CHAR:   value = s->val.c;             break;
      44           1 :             case nsXPTType::T_WCHAR:  value = s->val.wc;            break;
      45       13228 :             default:                  value = (uint64_t) s->val.p;  break;
      46             :             }
      47             :         }
      48             : 
      49       28448 :         if (!s->IsPtrData() && s->type == nsXPTType::T_DOUBLE) {
      50           0 :             if (nr_fpr < FPR_COUNT)
      51           0 :                 fpregs[nr_fpr++] = s->val.d;
      52             :             else {
      53           0 :                 *((double *)d) = s->val.d;
      54           0 :                 d++;
      55             :             }
      56             :         }
      57       28448 :         else if (!s->IsPtrData() && s->type == nsXPTType::T_FLOAT) {
      58           4 :             if (nr_fpr < FPR_COUNT)
      59             :                 // The value in %xmm register is already prepared to
      60             :                 // be retrieved as a float. Therefore, we pass the
      61             :                 // value verbatim, as a double without conversion.
      62           4 :                 fpregs[nr_fpr++] = s->val.d;
      63             :             else {
      64           0 :                 *((float *)d) = s->val.f;
      65           0 :                 d++;
      66             :             }
      67             :         }
      68             :         else {
      69       28444 :             if (nr_gpr < GPR_COUNT)
      70       28329 :                 gpregs[nr_gpr++] = value;
      71             :             else
      72         115 :                 *d++ = value;
      73             :         }
      74             :     }
      75       11872 : }

Generated by: LCOV version 1.13