avcall-sparc64.c
上传用户:shenzhenrh
上传日期:2013-05-12
资源大小:2904k
文件大小:23k
源码类别:

信息检索与抽取

开发平台:

Unix_Linux

  1. #ifndef _avcall_sparc64_c /*-*- C -*-*/
  2. #define _avcall_sparc64_c
  3. /**
  4.   Copyright 1993 Bill Triggs, <Bill.Triggs@inrialpes.fr>
  5.   Copyright 1995-1999 Bruno Haible, <haible@clisp.cons.org>
  6.   This is free software distributed under the GNU General Public
  7.   Licence described in the file COPYING. Contact the author if
  8.   you don't have this or can't live with it. There is ABSOLUTELY
  9.   NO WARRANTY, explicit or implied, on this software.
  10. **/
  11. /*----------------------------------------------------------------------
  12.   !!! THIS ROUTINE MUST BE COMPILED gcc -O !!!
  13.   Foreign function interface for a Sparc v9 in 64-bit mode with gcc.
  14.   This calls a C function with an argument list built up using macros
  15.   defined in av_call.h.
  16.   Sparc 64-bit Argument Passing Conventions
  17.   The argument registers are laid out as an array of 16 elements
  18.   and arguments are added sequentially.  The first 6 int args and up to the
  19.   first 16 fp args (depending on size) are passed in regs.
  20.   Slot    Stack   Integral   Float   Float in structure   Double   Long Double
  21.   ----    -----   --------   -----   ------------------   ------   -----------
  22.    15   [SP+248]              %f31       %f30,%f31         %d30
  23.    14   [SP+240]              %f29       %f28,%f29         %d28       %q28
  24.    13   [SP+232]              %f27       %f26,%f27         %d26
  25.    12   [SP+224]              %f25       %f24,%f25         %d24       %q24
  26.    11   [SP+216]              %f23       %f22,%f23         %d22
  27.    10   [SP+208]              %f21       %f20,%f21         %d20       %q20
  28.     9   [SP+200]              %f19       %f18,%f19         %d18
  29.     8   [SP+192]              %f17       %f16,%f17         %d16       %q16
  30.     7   [SP+184]              %f15       %f14,%f15         %d14
  31.     6   [SP+176]              %f13       %f12,%f13         %d12       %q12
  32.     5   [SP+168]     %o5      %f11       %f10,%f11         %d10
  33.     4   [SP+160]     %o4       %f9        %f8,%f9           %d8        %q8
  34.     3   [SP+152]     %o3       %f7        %f6,%f7           %d6
  35.     2   [SP+144]     %o2       %f5        %f4,%f5           %d4        %q4
  36.     1   [SP+136]     %o1       %f3        %f2,%f3           %d2
  37.     0   [SP+128]     %o0       %f1        %f0,%f1           %d0        %q0
  38.   Here SP = %sp if -mno-stack-bias or %sp+stack_bias otherwise.
  39.   Integral arguments are always passed as 64 bit quantities appropriately
  40.   extended.
  41.   Passing of floating point values is handled as follows.
  42.   If a prototype is in scope:
  43.     If the value is in a named argument (i.e. not a stdarg function or a
  44.     value not part of the `...') then the value is passed in the appropriate
  45.     fp reg.
  46.     If the value is part of the `...' and is passed in one of the first 6
  47.     slots then the value is passed in the appropriate int reg.
  48.     If the value is part of the `...' and is not passed in one of the first 6
  49.     slots then the value is passed in memory.
  50.   If a prototype is not in scope:
  51.     If the value is one of the first 6 arguments the value is passed in the
  52.     appropriate integer reg and the appropriate fp reg.
  53.     If the value is not one of the first 6 arguments the value is passed in
  54.     the appropriate fp reg and in memory.
  55.   Remaining arguments are pushed onto the stack starting at a fixed offset
  56.   Space is left on the stack frame for temporary storage of the register
  57.   arguments as well.
  58.   Integers shorter than `long' are always promoted to word-length
  59.   (zero-extended or sign-extended, according to their type). Structures
  60.   <= 16 bytes are passed embedded in the argument sequence; bigger structures
  61.   are passed by reference.
  62.   Integers and pointers are returned in o0, floats in f0, doubles in
  63.   f0/f1.  If the function returns a structure a pointer to space
  64.   allocated by the caller is pushed onto the stack immediately
  65.   before the function arguments. Structures <= 32 bytes are returned in
  66.   registers (integer/float/double registers, as appropriate).
  67.   Long doubles are 16-byte aligned, but we don't deal with this here, so
  68.   we assume 8-byte alignment for everything.
  69.   ----------------------------------------------------------------------*/
  70. #include "avcall.h.in"
  71. #define RETURN(TYPE,VAL) (*(TYPE*)l->raddr = (TYPE)(VAL))
  72. #define OFFSETOF(struct,member) ((int)&(((struct*)0)->member))
  73. register void* callee __asm__("%g2");  /* any global or local register */
  74. register __avword o0 __asm__("%o0");
  75. register __avword o1 __asm__("%o1");
  76. register __avword o2 __asm__("%o2");
  77. register __avword o3 __asm__("%o3");
  78. register __avword o4 __asm__("%o4");
  79. register __avword o5 __asm__("%o5");
  80. int
  81. __builtin_avcall(av_alist* l)
  82. {
  83.   register __avword* sp __asm__("%sp");  /* C names for registers */
  84.   register float fret __asm__("%f0");  /* %f0 */
  85.   register double dret __asm__("%f0");  /* %f0,%f1 */
  86.   __avword trampoline[6]; /* room for a trampoline */
  87.   __avword space[__AV_ALIST_WORDS]; /* space for callee's stack frame */
  88.   __avword *argframe = sp + 17; /* stack offset for argument list */
  89.   int arglen = l->aptr - l->args;
  90.   __avword i;
  91.   if (l->farg_mask) {
  92.     /* push leading float args */
  93.     if (l->farg_mask & (1<<0))
  94.       __asm__("ld %1(%0),%%f1" : : "p" (l), "i" OFFSETOF(av_alist,args[0]));
  95.     if (l->farg_mask & (1<<1))
  96.       __asm__("ld %1(%0),%%f3" : : "p" (l), "i" OFFSETOF(av_alist,args[1]));
  97.     if (l->farg_mask & (1<<2))
  98.       __asm__("ld %1(%0),%%f5" : : "p" (l), "i" OFFSETOF(av_alist,args[2]));
  99.     if (l->farg_mask & (1<<3))
  100.       __asm__("ld %1(%0),%%f7" : : "p" (l), "i" OFFSETOF(av_alist,args[3]));
  101.     if (l->farg_mask & (1<<4))
  102.       __asm__("ld %1(%0),%%f9" : : "p" (l), "i" OFFSETOF(av_alist,args[4]));
  103.     if (l->farg_mask & (1<<5))
  104.       __asm__("ld %1(%0),%%f11" : : "p" (l), "i" OFFSETOF(av_alist,args[5]));
  105.     if (l->farg_mask & (1<<6))
  106.       __asm__("ld %1(%0),%%f13" : : "p" (l), "i" OFFSETOF(av_alist,args[6]));
  107.     if (l->farg_mask & (1<<7))
  108.       __asm__("ld %1(%0),%%f15" : : "p" (l), "i" OFFSETOF(av_alist,args[7]));
  109.     if (l->farg_mask & (1<<8))
  110.       __asm__("ld %1(%0),%%f17" : : "p" (l), "i" OFFSETOF(av_alist,args[8]));
  111.     if (l->farg_mask & (1<<9))
  112.       __asm__("ld %1(%0),%%f19" : : "p" (l), "i" OFFSETOF(av_alist,args[9]));
  113.     if (l->farg_mask & (1<<10))
  114.       __asm__("ld %1(%0),%%f21" : : "p" (l), "i" OFFSETOF(av_alist,args[10]));
  115.     if (l->farg_mask & (1<<11))
  116.       __asm__("ld %1(%0),%%f23" : : "p" (l), "i" OFFSETOF(av_alist,args[11]));
  117.     if (l->farg_mask & (1<<12))
  118.       __asm__("ld %1(%0),%%f25" : : "p" (l), "i" OFFSETOF(av_alist,args[12]));
  119.     if (l->farg_mask & (1<<13))
  120.       __asm__("ld %1(%0),%%f27" : : "p" (l), "i" OFFSETOF(av_alist,args[13]));
  121.     if (l->farg_mask & (1<<14))
  122.       __asm__("ld %1(%0),%%f29" : : "p" (l), "i" OFFSETOF(av_alist,args[14]));
  123.     if (l->farg_mask & (1<<15))
  124.       __asm__("ld %1(%0),%%f31" : : "p" (l), "i" OFFSETOF(av_alist,args[15]));
  125.   }
  126.   if (l->darg_mask) {
  127.     /* push leading double args */
  128.     if (l->darg_mask & (1<<0))
  129.       __asm__("ldd %1(%0),%%f0" : : "p" (l), "i" OFFSETOF(av_alist,args[0]));
  130.     if (l->darg_mask & (1<<1))
  131.       __asm__("ldd %1(%0),%%f2" : : "p" (l), "i" OFFSETOF(av_alist,args[1]));
  132.     if (l->darg_mask & (1<<2))
  133.       __asm__("ldd %1(%0),%%f4" : : "p" (l), "i" OFFSETOF(av_alist,args[2]));
  134.     if (l->darg_mask & (1<<3))
  135.       __asm__("ldd %1(%0),%%f6" : : "p" (l), "i" OFFSETOF(av_alist,args[3]));
  136.     if (l->darg_mask & (1<<4))
  137.       __asm__("ldd %1(%0),%%f8" : : "p" (l), "i" OFFSETOF(av_alist,args[4]));
  138.     if (l->darg_mask & (1<<5))
  139.       __asm__("ldd %1(%0),%%f10" : : "p" (l), "i" OFFSETOF(av_alist,args[5]));
  140.     if (l->darg_mask & (1<<6))
  141.       __asm__("ldd %1(%0),%%f12" : : "p" (l), "i" OFFSETOF(av_alist,args[6]));
  142.     if (l->darg_mask & (1<<7))
  143.       __asm__("ldd %1(%0),%%f14" : : "p" (l), "i" OFFSETOF(av_alist,args[7]));
  144.     if (l->darg_mask & (1<<8))
  145.       __asm__("ldd %1(%0),%%f16" : : "p" (l), "i" OFFSETOF(av_alist,args[8]));
  146.     if (l->darg_mask & (1<<9))
  147.       __asm__("ldd %1(%0),%%f18" : : "p" (l), "i" OFFSETOF(av_alist,args[9]));
  148.     if (l->darg_mask & (1<<10))
  149.       __asm__("ldd %1(%0),%%f20" : : "p" (l), "i" OFFSETOF(av_alist,args[10]));
  150.     if (l->darg_mask & (1<<11))
  151.       __asm__("ldd %1(%0),%%f22" : : "p" (l), "i" OFFSETOF(av_alist,args[11]));
  152.     if (l->darg_mask & (1<<12))
  153.       __asm__("ldd %1(%0),%%f24" : : "p" (l), "i" OFFSETOF(av_alist,args[12]));
  154.     if (l->darg_mask & (1<<13))
  155.       __asm__("ldd %1(%0),%%f26" : : "p" (l), "i" OFFSETOF(av_alist,args[13]));
  156.     if (l->darg_mask & (1<<14))
  157.       __asm__("ldd %1(%0),%%f28" : : "p" (l), "i" OFFSETOF(av_alist,args[14]));
  158.     if (l->darg_mask & (1<<15))
  159.       __asm__("ldd %1(%0),%%f30" : : "p" (l), "i" OFFSETOF(av_alist,args[15]));
  160.   }
  161.   {
  162.     int i;
  163.     for (i = 6; i < arglen; i++) /* push excess function args */
  164.       argframe[i] = l->args[i];
  165.   }
  166. /* call function with 1st 6 args */
  167.   i = ({ __avword iret; /* %o0 */
  168.          iret = (*l->func)(l->args[0], l->args[1], l->args[2],
  169.    l->args[3], l->args[4], l->args[5]);
  170.          asm ("nop"); /* struct returning functions skip this instruction */
  171.          iret;
  172.        });
  173.   /* save return value */
  174.   if (l->rtype == __AVvoid) {
  175.   } else
  176.   if (l->rtype == __AVword) {
  177.     RETURN(__avword, i);
  178.   } else
  179.   if (l->rtype == __AVchar) {
  180.     RETURN(char, i);
  181.   } else
  182.   if (l->rtype == __AVschar) {
  183.     RETURN(signed char, i);
  184.   } else
  185.   if (l->rtype == __AVuchar) {
  186.     RETURN(unsigned char, i);
  187.   } else
  188.   if (l->rtype == __AVshort) {
  189.     RETURN(short, i);
  190.   } else
  191.   if (l->rtype == __AVushort) {
  192.     RETURN(unsigned short, i);
  193.   } else
  194.   if (l->rtype == __AVint) {
  195.     RETURN(int, i);
  196.   } else
  197.   if (l->rtype == __AVuint) {
  198.     RETURN(unsigned int, i);
  199.   } else
  200.   if (l->rtype == __AVlong) {
  201.     RETURN(long, i);
  202.   } else
  203.   if (l->rtype == __AVulong) {
  204.     RETURN(unsigned long, i);
  205.   } else
  206.   if (l->rtype == __AVlonglong) {
  207.     RETURN(long long, i);
  208.   } else
  209.   if (l->rtype == __AVulonglong) {
  210.     RETURN(unsigned long long, i);
  211.   } else
  212.   if (l->rtype == __AVfloat) {
  213.     RETURN(float, fret);
  214.   } else
  215.   if (l->rtype == __AVdouble) {
  216.     RETURN(double, dret);
  217.   } else
  218.   if (l->rtype == __AVvoidp) {
  219.     RETURN(void*, i);
  220.   } else
  221.   if (l->rtype == __AVstruct) {
  222.     if (l->flags & __AV_PCC_STRUCT_RETURN) {
  223.       /* pcc struct return convention: need a  *(TYPE*)l->raddr = *(TYPE*)i;  */
  224.       if (l->rsize == sizeof(char)) {
  225.         RETURN(char, *(char*)i);
  226.       } else
  227.       if (l->rsize == sizeof(short)) {
  228.         RETURN(short, *(short*)i);
  229.       } else
  230.       if (l->rsize == sizeof(int)) {
  231.         RETURN(int, *(int*)i);
  232.       } else
  233.       if (l->rsize == sizeof(long)) {
  234.         RETURN(long, *(long*)i);
  235.       } else {
  236.         int n = (l->rsize + sizeof(__avword)-1)/sizeof(__avword);
  237.         while (--n >= 0)
  238.           ((__avword*)l->raddr)[n] = ((__avword*)i)[n];
  239.       }
  240.     } else {
  241.       /* normal struct return convention */
  242.       if (l->flags & __AV_REGISTER_STRUCT_RETURN) {
  243.         /* Return structs of size <= 32 in registers. */
  244.         if (l->rsize > 0 && l->rsize <= 32) {
  245.           if (l->rsize == 1) {
  246.             ((unsigned char *)l->raddr)[0] = (unsigned char)(i>>56);
  247.           } else
  248.           if (l->rsize == 2) {
  249.             ((unsigned char *)l->raddr)[0] = (unsigned char)(i>>56);
  250.             ((unsigned char *)l->raddr)[1] = (unsigned char)(i>>48);
  251.           } else
  252.           if (l->rsize == 3) {
  253.             ((unsigned char *)l->raddr)[0] = (unsigned char)(i>>56);
  254.             ((unsigned char *)l->raddr)[1] = (unsigned char)(i>>48);
  255.             ((unsigned char *)l->raddr)[2] = (unsigned char)(i>>40);
  256.           } else
  257.           if (l->rsize == 4) {
  258.             ((unsigned char *)l->raddr)[0] = (unsigned char)(i>>56);
  259.             ((unsigned char *)l->raddr)[1] = (unsigned char)(i>>48);
  260.             ((unsigned char *)l->raddr)[2] = (unsigned char)(i>>40);
  261.             ((unsigned char *)l->raddr)[3] = (unsigned char)(i>>32);
  262.           } else
  263.           if (l->rsize == 5) {
  264.             ((unsigned char *)l->raddr)[0] = (unsigned char)(i>>56);
  265.             ((unsigned char *)l->raddr)[1] = (unsigned char)(i>>48);
  266.             ((unsigned char *)l->raddr)[2] = (unsigned char)(i>>40);
  267.             ((unsigned char *)l->raddr)[3] = (unsigned char)(i>>32);
  268.             ((unsigned char *)l->raddr)[4] = (unsigned char)(i>>24);
  269.           } else
  270.           if (l->rsize == 6) {
  271.             ((unsigned char *)l->raddr)[0] = (unsigned char)(i>>56);
  272.             ((unsigned char *)l->raddr)[1] = (unsigned char)(i>>48);
  273.             ((unsigned char *)l->raddr)[2] = (unsigned char)(i>>40);
  274.             ((unsigned char *)l->raddr)[3] = (unsigned char)(i>>32);
  275.             ((unsigned char *)l->raddr)[4] = (unsigned char)(i>>24);
  276.             ((unsigned char *)l->raddr)[5] = (unsigned char)(i>>16);
  277.           } else
  278.           if (l->rsize == 7) {
  279.             ((unsigned char *)l->raddr)[0] = (unsigned char)(i>>56);
  280.             ((unsigned char *)l->raddr)[1] = (unsigned char)(i>>48);
  281.             ((unsigned char *)l->raddr)[2] = (unsigned char)(i>>40);
  282.             ((unsigned char *)l->raddr)[3] = (unsigned char)(i>>32);
  283.             ((unsigned char *)l->raddr)[4] = (unsigned char)(i>>24);
  284.             ((unsigned char *)l->raddr)[5] = (unsigned char)(i>>16);
  285.             ((unsigned char *)l->raddr)[6] = (unsigned char)(i>>8);
  286.           } else
  287.           if (l->rsize >= 8 && l->rsize <= 32) {
  288.             ((unsigned char *)l->raddr)[0] = (unsigned char)(i>>56);
  289.             ((unsigned char *)l->raddr)[1] = (unsigned char)(i>>48);
  290.             ((unsigned char *)l->raddr)[2] = (unsigned char)(i>>40);
  291.             ((unsigned char *)l->raddr)[3] = (unsigned char)(i>>32);
  292.             ((unsigned char *)l->raddr)[4] = (unsigned char)(i>>24);
  293.             ((unsigned char *)l->raddr)[5] = (unsigned char)(i>>16);
  294.             ((unsigned char *)l->raddr)[6] = (unsigned char)(i>>8);
  295.             ((unsigned char *)l->raddr)[7] = (unsigned char)(i);
  296.             if (l->rsize == 8) {
  297.             } else
  298.             if (l->rsize == 9) {
  299.               ((unsigned char *)l->raddr)[8+0] = (unsigned char)(o1>>56);
  300.             } else
  301.             if (l->rsize == 10) {
  302.               ((unsigned char *)l->raddr)[8+0] = (unsigned char)(o1>>56);
  303.               ((unsigned char *)l->raddr)[8+1] = (unsigned char)(o1>>48);
  304.             } else
  305.             if (l->rsize == 11) {
  306.               ((unsigned char *)l->raddr)[8+0] = (unsigned char)(o1>>56);
  307.               ((unsigned char *)l->raddr)[8+1] = (unsigned char)(o1>>48);
  308.               ((unsigned char *)l->raddr)[8+2] = (unsigned char)(o1>>40);
  309.             } else
  310.             if (l->rsize == 12) {
  311.               ((unsigned char *)l->raddr)[8+0] = (unsigned char)(o1>>56);
  312.               ((unsigned char *)l->raddr)[8+1] = (unsigned char)(o1>>48);
  313.               ((unsigned char *)l->raddr)[8+2] = (unsigned char)(o1>>40);
  314.               ((unsigned char *)l->raddr)[8+3] = (unsigned char)(o1>>32);
  315.             } else
  316.             if (l->rsize == 13) {
  317.               ((unsigned char *)l->raddr)[8+0] = (unsigned char)(o1>>56);
  318.               ((unsigned char *)l->raddr)[8+1] = (unsigned char)(o1>>48);
  319.               ((unsigned char *)l->raddr)[8+2] = (unsigned char)(o1>>40);
  320.               ((unsigned char *)l->raddr)[8+3] = (unsigned char)(o1>>32);
  321.               ((unsigned char *)l->raddr)[8+4] = (unsigned char)(o1>>24);
  322.             } else
  323.             if (l->rsize == 14) {
  324.               ((unsigned char *)l->raddr)[8+0] = (unsigned char)(o1>>56);
  325.               ((unsigned char *)l->raddr)[8+1] = (unsigned char)(o1>>48);
  326.               ((unsigned char *)l->raddr)[8+2] = (unsigned char)(o1>>40);
  327.               ((unsigned char *)l->raddr)[8+3] = (unsigned char)(o1>>32);
  328.               ((unsigned char *)l->raddr)[8+4] = (unsigned char)(o1>>24);
  329.               ((unsigned char *)l->raddr)[8+5] = (unsigned char)(o1>>16);
  330.             } else
  331.             if (l->rsize == 15) {
  332.               ((unsigned char *)l->raddr)[8+0] = (unsigned char)(o1>>56);
  333.               ((unsigned char *)l->raddr)[8+1] = (unsigned char)(o1>>48);
  334.               ((unsigned char *)l->raddr)[8+2] = (unsigned char)(o1>>40);
  335.               ((unsigned char *)l->raddr)[8+3] = (unsigned char)(o1>>32);
  336.               ((unsigned char *)l->raddr)[8+4] = (unsigned char)(o1>>24);
  337.               ((unsigned char *)l->raddr)[8+5] = (unsigned char)(o1>>16);
  338.               ((unsigned char *)l->raddr)[8+6] = (unsigned char)(o1>>8);
  339.             } else
  340.             if (l->rsize >= 16 && l->rsize <= 32) {
  341.               ((unsigned char *)l->raddr)[8+0] = (unsigned char)(o1>>56);
  342.               ((unsigned char *)l->raddr)[8+1] = (unsigned char)(o1>>48);
  343.               ((unsigned char *)l->raddr)[8+2] = (unsigned char)(o1>>40);
  344.               ((unsigned char *)l->raddr)[8+3] = (unsigned char)(o1>>32);
  345.               ((unsigned char *)l->raddr)[8+4] = (unsigned char)(o1>>24);
  346.               ((unsigned char *)l->raddr)[8+5] = (unsigned char)(o1>>16);
  347.               ((unsigned char *)l->raddr)[8+6] = (unsigned char)(o1>>8);
  348.               ((unsigned char *)l->raddr)[8+7] = (unsigned char)(o1);
  349.               if (l->rsize == 16) {
  350.               } else
  351.               if (l->rsize == 17) {
  352.                 ((unsigned char *)l->raddr)[16+0] = (unsigned char)(o2>>56);
  353.               } else
  354.               if (l->rsize == 18) {
  355.                 ((unsigned char *)l->raddr)[16+0] = (unsigned char)(o2>>56);
  356.                 ((unsigned char *)l->raddr)[16+1] = (unsigned char)(o2>>48);
  357.               } else
  358.               if (l->rsize == 19) {
  359.                 ((unsigned char *)l->raddr)[16+0] = (unsigned char)(o2>>56);
  360.                 ((unsigned char *)l->raddr)[16+1] = (unsigned char)(o2>>48);
  361.                 ((unsigned char *)l->raddr)[16+2] = (unsigned char)(o2>>40);
  362.               } else
  363.               if (l->rsize == 20) {
  364.                 ((unsigned char *)l->raddr)[16+0] = (unsigned char)(o2>>56);
  365.                 ((unsigned char *)l->raddr)[16+1] = (unsigned char)(o2>>48);
  366.                 ((unsigned char *)l->raddr)[16+2] = (unsigned char)(o2>>40);
  367.                 ((unsigned char *)l->raddr)[16+3] = (unsigned char)(o2>>32);
  368.               } else
  369.               if (l->rsize == 21) {
  370.                 ((unsigned char *)l->raddr)[16+0] = (unsigned char)(o2>>56);
  371.                 ((unsigned char *)l->raddr)[16+1] = (unsigned char)(o2>>48);
  372.                 ((unsigned char *)l->raddr)[16+2] = (unsigned char)(o2>>40);
  373.                 ((unsigned char *)l->raddr)[16+3] = (unsigned char)(o2>>32);
  374.                 ((unsigned char *)l->raddr)[16+4] = (unsigned char)(o2>>24);
  375.               } else
  376.               if (l->rsize == 22) {
  377.                 ((unsigned char *)l->raddr)[16+0] = (unsigned char)(o2>>56);
  378.                 ((unsigned char *)l->raddr)[16+1] = (unsigned char)(o2>>48);
  379.                 ((unsigned char *)l->raddr)[16+2] = (unsigned char)(o2>>40);
  380.                 ((unsigned char *)l->raddr)[16+3] = (unsigned char)(o2>>32);
  381.                 ((unsigned char *)l->raddr)[16+4] = (unsigned char)(o2>>24);
  382.                 ((unsigned char *)l->raddr)[16+5] = (unsigned char)(o2>>16);
  383.               } else
  384.               if (l->rsize == 23) {
  385.                 ((unsigned char *)l->raddr)[16+0] = (unsigned char)(o2>>56);
  386.                 ((unsigned char *)l->raddr)[16+1] = (unsigned char)(o2>>48);
  387.                 ((unsigned char *)l->raddr)[16+2] = (unsigned char)(o2>>40);
  388.                 ((unsigned char *)l->raddr)[16+3] = (unsigned char)(o2>>32);
  389.                 ((unsigned char *)l->raddr)[16+4] = (unsigned char)(o2>>24);
  390.                 ((unsigned char *)l->raddr)[16+5] = (unsigned char)(o2>>16);
  391.                 ((unsigned char *)l->raddr)[16+6] = (unsigned char)(o2>>8);
  392.               } else
  393.               if (l->rsize >= 24 && l->rsize <= 32) {
  394.                 ((unsigned char *)l->raddr)[16+0] = (unsigned char)(o2>>56);
  395.                 ((unsigned char *)l->raddr)[16+1] = (unsigned char)(o2>>48);
  396.                 ((unsigned char *)l->raddr)[16+2] = (unsigned char)(o2>>40);
  397.                 ((unsigned char *)l->raddr)[16+3] = (unsigned char)(o2>>32);
  398.                 ((unsigned char *)l->raddr)[16+4] = (unsigned char)(o2>>24);
  399.                 ((unsigned char *)l->raddr)[16+5] = (unsigned char)(o2>>16);
  400.                 ((unsigned char *)l->raddr)[16+6] = (unsigned char)(o2>>8);
  401.                 ((unsigned char *)l->raddr)[16+7] = (unsigned char)(o2);
  402.                 if (l->rsize == 24) {
  403.                 } else
  404.                 if (l->rsize == 25) {
  405.                   ((unsigned char *)l->raddr)[24+0] = (unsigned char)(o3>>56);
  406.                 } else
  407.                 if (l->rsize == 26) {
  408.                   ((unsigned char *)l->raddr)[24+0] = (unsigned char)(o3>>56);
  409.                   ((unsigned char *)l->raddr)[24+1] = (unsigned char)(o3>>48);
  410.                 } else
  411.                 if (l->rsize == 27) {
  412.                   ((unsigned char *)l->raddr)[24+0] = (unsigned char)(o3>>56);
  413.                   ((unsigned char *)l->raddr)[24+1] = (unsigned char)(o3>>48);
  414.                   ((unsigned char *)l->raddr)[24+2] = (unsigned char)(o3>>40);
  415.                 } else
  416.                 if (l->rsize == 28) {
  417.                   ((unsigned char *)l->raddr)[24+0] = (unsigned char)(o3>>56);
  418.                   ((unsigned char *)l->raddr)[24+1] = (unsigned char)(o3>>48);
  419.                   ((unsigned char *)l->raddr)[24+2] = (unsigned char)(o3>>40);
  420.                   ((unsigned char *)l->raddr)[24+3] = (unsigned char)(o3>>32);
  421.                 } else
  422.                 if (l->rsize == 29) {
  423.                   ((unsigned char *)l->raddr)[24+0] = (unsigned char)(o3>>56);
  424.                   ((unsigned char *)l->raddr)[24+1] = (unsigned char)(o3>>48);
  425.                   ((unsigned char *)l->raddr)[24+2] = (unsigned char)(o3>>40);
  426.                   ((unsigned char *)l->raddr)[24+3] = (unsigned char)(o3>>32);
  427.                   ((unsigned char *)l->raddr)[24+4] = (unsigned char)(o3>>24);
  428.                 } else
  429.                 if (l->rsize == 30) {
  430.                   ((unsigned char *)l->raddr)[24+0] = (unsigned char)(o3>>56);
  431.                   ((unsigned char *)l->raddr)[24+1] = (unsigned char)(o3>>48);
  432.                   ((unsigned char *)l->raddr)[24+2] = (unsigned char)(o3>>40);
  433.                   ((unsigned char *)l->raddr)[24+3] = (unsigned char)(o3>>32);
  434.                   ((unsigned char *)l->raddr)[24+4] = (unsigned char)(o3>>24);
  435.                   ((unsigned char *)l->raddr)[24+5] = (unsigned char)(o3>>16);
  436.                 } else
  437.                 if (l->rsize == 31) {
  438.                   ((unsigned char *)l->raddr)[24+0] = (unsigned char)(o3>>56);
  439.                   ((unsigned char *)l->raddr)[24+1] = (unsigned char)(o3>>48);
  440.                   ((unsigned char *)l->raddr)[24+2] = (unsigned char)(o3>>40);
  441.                   ((unsigned char *)l->raddr)[24+3] = (unsigned char)(o3>>32);
  442.                   ((unsigned char *)l->raddr)[24+4] = (unsigned char)(o3>>24);
  443.                   ((unsigned char *)l->raddr)[24+5] = (unsigned char)(o3>>16);
  444.                   ((unsigned char *)l->raddr)[24+6] = (unsigned char)(o3>>8);
  445.                 } else
  446.                 if (l->rsize == 32) {
  447.                   ((unsigned char *)l->raddr)[24+0] = (unsigned char)(o3>>56);
  448.                   ((unsigned char *)l->raddr)[24+1] = (unsigned char)(o3>>48);
  449.                   ((unsigned char *)l->raddr)[24+2] = (unsigned char)(o3>>40);
  450.                   ((unsigned char *)l->raddr)[24+3] = (unsigned char)(o3>>32);
  451.                   ((unsigned char *)l->raddr)[24+4] = (unsigned char)(o3>>24);
  452.                   ((unsigned char *)l->raddr)[24+5] = (unsigned char)(o3>>16);
  453.                   ((unsigned char *)l->raddr)[24+6] = (unsigned char)(o3>>8);
  454.                   ((unsigned char *)l->raddr)[24+7] = (unsigned char)(o3);
  455.                 }
  456.               }
  457.             }
  458.           }
  459.         }
  460.       }
  461.     }
  462.   }
  463.   return 0;
  464. }
  465. #endif /*_avcall_sparc64_c */