Artifact 444aa37a38ba78dd1bb4933c932888d82afa255f:


0000: 23 69 66 6e 64 65 66 20 5f 61 76 63 61 6c 6c 5f  #ifndef _avcall_
0010: 6d 38 38 6b 5f 63 09 09 09 09 2f 2a 2d 2a 2d 20  m88k_c..../*-*- 
0020: 43 20 2d 2a 2d 2a 2f 0a 23 64 65 66 69 6e 65 20  C -*-*/.#define 
0030: 5f 61 76 63 61 6c 6c 5f 6d 38 38 6b 5f 63 0a 2f  _avcall_m88k_c./
0040: 2a 2a 0a 20 20 43 6f 70 79 72 69 67 68 74 20 31  **.  Copyright 1
0050: 39 39 33 20 42 69 6c 6c 20 54 72 69 67 67 73 2c  993 Bill Triggs,
0060: 20 3c 42 69 6c 6c 2e 54 72 69 67 67 73 40 69 6e   <Bill.Triggs@in
0070: 72 69 61 6c 70 65 73 2e 66 72 3e 0a 20 20 43 6f  rialpes.fr>.  Co
0080: 70 79 72 69 67 68 74 20 31 39 39 35 2d 31 39 39  pyright 1995-199
0090: 39 20 42 72 75 6e 6f 20 48 61 69 62 6c 65 2c 20  9 Bruno Haible, 
00a0: 3c 62 72 75 6e 6f 40 63 6c 69 73 70 2e 6f 72 67  <bruno@clisp.org
00b0: 3e 0a 0a 20 20 54 68 69 73 20 69 73 20 66 72 65  >..  This is fre
00c0: 65 20 73 6f 66 74 77 61 72 65 20 64 69 73 74 72  e software distr
00d0: 69 62 75 74 65 64 20 75 6e 64 65 72 20 74 68 65  ibuted under the
00e0: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00f0: 6c 69 63 0a 20 20 4c 69 63 65 6e 63 65 20 64 65  lic.  Licence de
0100: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 66  scribed in the f
0110: 69 6c 65 20 43 4f 50 59 49 4e 47 2e 20 43 6f 6e  ile COPYING. Con
0120: 74 61 63 74 20 74 68 65 20 61 75 74 68 6f 72 20  tact the author 
0130: 69 66 0a 20 20 79 6f 75 20 64 6f 6e 27 74 20 68  if.  you don't h
0140: 61 76 65 20 74 68 69 73 20 6f 72 20 63 61 6e 27  ave this or can'
0150: 74 20 6c 69 76 65 20 77 69 74 68 20 69 74 2e 20  t live with it. 
0160: 54 68 65 72 65 20 69 73 20 41 42 53 4f 4c 55 54  There is ABSOLUT
0170: 45 4c 59 0a 20 20 4e 4f 20 57 41 52 52 41 4e 54  ELY.  NO WARRANT
0180: 59 2c 20 65 78 70 6c 69 63 69 74 20 6f 72 20 69  Y, explicit or i
0190: 6d 70 6c 69 65 64 2c 20 6f 6e 20 74 68 69 73 20  mplied, on this 
01a0: 73 6f 66 74 77 61 72 65 2e 0a 2a 2a 2f 0a 2f 2a  software..**/./*
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01f0: 2d 2d 2d 2d 2d 2d 0a 20 20 21 21 21 20 54 48 49  ------.  !!! THI
0200: 53 20 52 4f 55 54 49 4e 45 20 4d 55 53 54 20 42  S ROUTINE MUST B
0210: 45 20 43 4f 4d 50 49 4c 45 44 20 67 63 63 20 2d  E COMPILED gcc -
0220: 4f 20 2d 66 6e 6f 2d 6f 6d 69 74 2d 66 72 61 6d  O -fno-omit-fram
0230: 65 2d 70 6f 69 6e 74 65 72 20 21 21 21 0a 0a 20  e-pointer !!!.. 
0240: 20 46 6f 72 65 69 67 6e 20 66 75 6e 63 74 69 6f   Foreign functio
0250: 6e 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  n interface for 
0260: 61 20 4d 38 38 30 30 30 20 77 69 74 68 20 67 63  a M88000 with gc
0270: 63 2e 0a 0a 20 20 54 68 69 73 20 63 61 6c 6c 73  c...  This calls
0280: 20 61 20 43 20 66 75 6e 63 74 69 6f 6e 20 77 69   a C function wi
0290: 74 68 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c  th an argument l
02a0: 69 73 74 20 62 75 69 6c 74 20 75 70 20 75 73 69  ist built up usi
02b0: 6e 67 20 6d 61 63 72 6f 73 0a 20 20 64 65 66 69  ng macros.  defi
02c0: 6e 65 64 20 69 6e 20 61 76 5f 63 61 6c 6c 2e 68  ned in av_call.h
02d0: 2e 0a 0a 20 20 4d 38 38 6b 20 41 72 67 75 6d 65  ...  M88k Argume
02e0: 6e 74 20 50 61 73 73 69 6e 67 20 43 6f 6e 76 65  nt Passing Conve
02f0: 6e 74 69 6f 6e 73 3a 0a 0a 20 20 41 6c 6c 20 61  ntions:..  All a
0300: 72 67 75 6d 65 6e 74 73 2c 20 65 78 63 65 70 74  rguments, except
0310: 20 74 68 65 20 6e 6f 6e 2d 73 74 72 75 63 74 73   the non-structs
0320: 20 61 6d 6f 6e 67 20 74 68 65 20 66 69 72 73 74   among the first
0330: 20 38 20 77 6f 72 64 73 2c 20 61 72 65 20 70 61   8 words, are pa
0340: 73 73 65 64 0a 20 20 6f 6e 20 74 68 65 20 73 74  ssed.  on the st
0350: 61 63 6b 20 77 69 74 68 20 77 6f 72 64 20 61 6c  ack with word al
0360: 69 67 6e 6d 65 6e 74 2e 20 44 6f 75 62 6c 65 73  ignment. Doubles
0370: 20 74 61 6b 65 20 74 77 6f 20 77 6f 72 64 73 20   take two words 
0380: 61 6e 64 20 66 6f 72 63 65 20 64 6f 75 62 6c 65  and force double
0390: 0a 20 20 61 6c 69 67 6e 6d 65 6e 74 2e 20 53 63  .  alignment. Sc
03a0: 61 6c 61 72 73 20 61 6d 6f 6e 67 20 74 68 65 20  alars among the 
03b0: 66 69 72 73 74 20 38 20 77 6f 72 64 73 20 61 72  first 8 words ar
03c0: 65 20 70 61 73 73 65 64 20 69 6e 20 72 65 67 69  e passed in regi
03d0: 73 74 65 72 73 2e 0a 20 20 53 74 72 75 63 74 75  sters..  Structu
03e0: 72 65 20 61 72 67 73 20 61 72 65 20 61 72 65 20  re args are are 
03f0: 70 61 73 73 65 64 20 61 73 20 74 72 75 65 20 73  passed as true s
0400: 74 72 75 63 74 75 72 65 73 20 65 6d 62 65 64 64  tructures embedd
0410: 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ed in the argume
0420: 6e 74 0a 20 20 73 74 61 63 6b 2e 0a 0a 20 20 54  nt.  stack...  T
0430: 6f 20 72 65 74 75 72 6e 20 61 20 73 74 72 75 63  o return a struc
0440: 74 75 72 65 2c 20 74 68 65 20 63 61 6c 6c 65 64  ture, the called
0450: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
0460: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
0470: 65 20 74 6f 20 74 68 65 0a 20 20 61 64 64 72 65  e to the.  addre
0480: 73 73 20 73 75 70 70 6c 69 65 64 20 69 6e 20 72  ss supplied in r
0490: 65 67 69 73 74 65 72 20 22 72 31 32 22 2e 0a 0a  egister "r12"...
04a0: 20 20 43 6f 6d 70 69 6c 65 20 74 68 69 73 20 72    Compile this r
04b0: 6f 75 74 69 6e 65 20 77 69 74 68 20 67 63 63 20  outine with gcc 
04c0: 2d 4f 20 28 6f 72 20 2d 4f 32 20 2d 66 6e 6f 2d  -O (or -O2 -fno-
04d0: 6f 6d 69 74 2d 66 72 61 6d 65 2d 70 6f 69 6e 74  omit-frame-point
04e0: 65 72 20 6f 72 20 2d 67 20 2d 4f 29 0a 20 20 74  er or -g -O).  t
04f0: 6f 20 67 65 74 20 74 68 65 20 72 69 67 68 74 20  o get the right 
0500: 72 65 67 69 73 74 65 72 20 76 61 72 69 61 62 6c  register variabl
0510: 65 73 2e 20 46 6f 72 20 6f 74 68 65 72 20 63 6f  es. For other co
0520: 6d 70 69 6c 65 72 73 20 75 73 65 20 74 68 65 0a  mpilers use the.
0530: 20 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 61    pre-compiled a
0540: 73 73 65 6d 62 6c 65 72 20 76 65 72 73 69 6f 6e  ssembler version
0550: 2e 0a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..  ------------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 2f 0a 23 69 6e  ----------*/.#in
05a0: 63 6c 75 64 65 20 22 61 76 63 61 6c 6c 2e 68 2e  clude "avcall.h.
05b0: 69 6e 22 0a 0a 23 64 65 66 69 6e 65 20 52 45 54  in"..#define RET
05c0: 55 52 4e 28 54 59 50 45 2c 56 41 4c 29 09 28 2a  URN(TYPE,VAL).(*
05d0: 28 54 59 50 45 2a 29 6c 2d 3e 72 61 64 64 72 20  (TYPE*)l->raddr 
05e0: 3d 20 28 54 59 50 45 29 28 56 41 4c 29 29 0a 0a  = (TYPE)(VAL))..
05f0: 72 65 67 69 73 74 65 72 20 5f 5f 61 76 77 6f 72  register __avwor
0600: 64 2a 09 73 72 65 74 09 5f 5f 61 73 6d 5f 5f 28  d*.sret.__asm__(
0610: 22 72 31 32 22 29 3b 20 20 2f 2a 20 73 74 72 75  "r12");  /* stru
0620: 63 74 75 72 65 20 72 65 74 75 72 6e 20 70 6f 69  cture return poi
0630: 6e 74 65 72 20 2a 2f 0a 0a 69 6e 74 0a 5f 5f 62  nter */..int.__b
0640: 75 69 6c 74 69 6e 5f 61 76 63 61 6c 6c 28 61 76  uiltin_avcall(av
0650: 5f 61 6c 69 73 74 2a 20 6c 29 0a 7b 0a 20 20 72  _alist* l).{.  r
0660: 65 67 69 73 74 65 72 20 5f 5f 61 76 77 6f 72 64  egister __avword
0670: 2a 09 73 70 09 5f 5f 61 73 6d 5f 5f 28 22 72 33  *.sp.__asm__("r3
0680: 31 22 29 3b 09 2f 2a 20 43 20 6e 61 6d 65 73 20  1");./* C names 
0690: 66 6f 72 20 72 65 67 69 73 74 65 72 73 20 2a 2f  for registers */
06a0: 0a 2f 2a 72 65 67 69 73 74 65 72 20 5f 5f 61 76  ./*register __av
06b0: 77 6f 72 64 09 69 72 65 74 09 5f 5f 61 73 6d 5f  word.iret.__asm_
06c0: 5f 28 22 72 32 22 29 3b 20 2a 2f 0a 20 20 72 65  _("r2"); */.  re
06d0: 67 69 73 74 65 72 20 5f 5f 61 76 77 6f 72 64 09  gister __avword.
06e0: 69 72 65 74 32 09 5f 5f 61 73 6d 5f 5f 28 22 72  iret2.__asm__("r
06f0: 33 22 29 3b 0a 20 20 72 65 67 69 73 74 65 72 20  3");.  register 
0700: 66 6c 6f 61 74 09 66 72 65 74 09 5f 5f 61 73 6d  float.fret.__asm
0710: 5f 5f 28 22 72 32 22 29 3b 0a 20 20 72 65 67 69  __("r2");.  regi
0720: 73 74 65 72 20 64 6f 75 62 6c 65 09 64 72 65 74  ster double.dret
0730: 09 5f 5f 61 73 6d 5f 5f 28 22 72 32 22 29 3b 0a  .__asm__("r2");.
0740: 0a 20 20 5f 5f 61 76 77 6f 72 64 2a 20 61 72 67  .  __avword* arg
0750: 66 72 61 6d 65 20 3d 20 28 73 70 20 2d 3d 20 5f  frame = (sp -= _
0760: 5f 41 56 5f 41 4c 49 53 54 5f 57 4f 52 44 53 29  _AV_ALIST_WORDS)
0770: 3b 20 2f 2a 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  ; /* make room f
0780: 6f 72 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74  or argument list
0790: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 6c 65 6e   */.  int arglen
07a0: 20 3d 20 6c 2d 3e 61 70 74 72 20 2d 20 6c 2d 3e   = l->aptr - l->
07b0: 61 72 67 73 3b 0a 20 20 5f 5f 61 76 77 6f 72 64  args;.  __avword
07c0: 20 69 3b 0a 0a 20 20 66 6f 72 20 28 69 20 3d 20   i;..  for (i = 
07d0: 30 3b 20 69 20 3c 20 61 72 67 6c 65 6e 3b 20 69  0; i < arglen; i
07e0: 2b 2b 29 09 09 2f 2a 20 70 75 73 68 20 66 75 6e  ++)../* push fun
07f0: 63 74 69 6f 6e 20 61 72 67 73 20 6f 6e 74 6f 20  ction args onto 
0800: 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 61 72 67  stack */.    arg
0810: 66 72 61 6d 65 5b 69 5d 20 3d 20 6c 2d 3e 61 72  frame[i] = l->ar
0820: 67 73 5b 69 5d 3b 0a 0a 20 20 69 66 20 28 6c 2d  gs[i];..  if (l-
0830: 3e 72 74 79 70 65 20 3d 3d 20 5f 5f 41 56 73 74  >rtype == __AVst
0840: 72 75 63 74 29 09 09 2f 2a 20 70 61 73 73 20 73  ruct)../* pass s
0850: 74 72 75 63 74 20 72 65 74 75 72 6e 20 61 64 64  truct return add
0860: 72 65 73 73 20 2a 2f 0a 20 20 20 20 73 72 65 74  ress */.    sret
0870: 20 3d 20 6c 2d 3e 72 61 64 64 72 3b 0a 0a 09 09   = l->raddr;....
0880: 09 09 2f 2a 20 63 61 6c 6c 20 66 75 6e 63 74 69  ../* call functi
0890: 6f 6e 2c 20 70 61 73 73 20 38 20 61 72 67 73 20  on, pass 8 args 
08a0: 69 6e 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  in registers */.
08b0: 20 20 69 20 3d 20 28 2a 6c 2d 3e 66 75 6e 63 29    i = (*l->func)
08c0: 28 6c 2d 3e 61 72 67 73 5b 30 5d 2c 20 6c 2d 3e  (l->args[0], l->
08d0: 61 72 67 73 5b 31 5d 2c 20 6c 2d 3e 61 72 67 73  args[1], l->args
08e0: 5b 32 5d 2c 20 6c 2d 3e 61 72 67 73 5b 33 5d 2c  [2], l->args[3],
08f0: 0a 09 09 20 6c 2d 3e 61 72 67 73 5b 34 5d 2c 20  ... l->args[4], 
0900: 6c 2d 3e 61 72 67 73 5b 35 5d 2c 20 6c 2d 3e 61  l->args[5], l->a
0910: 72 67 73 5b 36 5d 2c 20 6c 2d 3e 61 72 67 73 5b  rgs[6], l->args[
0920: 37 5d 29 3b 0a 0a 20 20 2f 2a 20 73 61 76 65 20  7]);..  /* save 
0930: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  return value */.
0940: 20 20 69 66 20 28 6c 2d 3e 72 74 79 70 65 20 3d    if (l->rtype =
0950: 3d 20 5f 5f 41 56 76 6f 69 64 29 20 7b 0a 20 20  = __AVvoid) {.  
0960: 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c 2d 3e  } else.  if (l->
0970: 72 74 79 70 65 20 3d 3d 20 5f 5f 41 56 77 6f 72  rtype == __AVwor
0980: 64 29 20 7b 0a 20 20 20 20 52 45 54 55 52 4e 28  d) {.    RETURN(
0990: 5f 5f 61 76 77 6f 72 64 2c 20 69 29 3b 0a 20 20  __avword, i);.  
09a0: 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c 2d 3e  } else.  if (l->
09b0: 72 74 79 70 65 20 3d 3d 20 5f 5f 41 56 63 68 61  rtype == __AVcha
09c0: 72 29 20 7b 0a 20 20 20 20 52 45 54 55 52 4e 28  r) {.    RETURN(
09d0: 63 68 61 72 2c 20 69 29 3b 0a 20 20 7d 20 65 6c  char, i);.  } el
09e0: 73 65 0a 20 20 69 66 20 28 6c 2d 3e 72 74 79 70  se.  if (l->rtyp
09f0: 65 20 3d 3d 20 5f 5f 41 56 73 63 68 61 72 29 20  e == __AVschar) 
0a00: 7b 0a 20 20 20 20 52 45 54 55 52 4e 28 73 69 67  {.    RETURN(sig
0a10: 6e 65 64 20 63 68 61 72 2c 20 69 29 3b 0a 20 20  ned char, i);.  
0a20: 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c 2d 3e  } else.  if (l->
0a30: 72 74 79 70 65 20 3d 3d 20 5f 5f 41 56 75 63 68  rtype == __AVuch
0a40: 61 72 29 20 7b 0a 20 20 20 20 52 45 54 55 52 4e  ar) {.    RETURN
0a50: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2c 20  (unsigned char, 
0a60: 69 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20 69  i);.  } else.  i
0a70: 66 20 28 6c 2d 3e 72 74 79 70 65 20 3d 3d 20 5f  f (l->rtype == _
0a80: 5f 41 56 73 68 6f 72 74 29 20 7b 0a 20 20 20 20  _AVshort) {.    
0a90: 52 45 54 55 52 4e 28 73 68 6f 72 74 2c 20 69 29  RETURN(short, i)
0aa0: 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20 69 66 20  ;.  } else.  if 
0ab0: 28 6c 2d 3e 72 74 79 70 65 20 3d 3d 20 5f 5f 41  (l->rtype == __A
0ac0: 56 75 73 68 6f 72 74 29 20 7b 0a 20 20 20 20 52  Vushort) {.    R
0ad0: 45 54 55 52 4e 28 75 6e 73 69 67 6e 65 64 20 73  ETURN(unsigned s
0ae0: 68 6f 72 74 2c 20 69 29 3b 0a 20 20 7d 20 65 6c  hort, i);.  } el
0af0: 73 65 0a 20 20 69 66 20 28 6c 2d 3e 72 74 79 70  se.  if (l->rtyp
0b00: 65 20 3d 3d 20 5f 5f 41 56 69 6e 74 29 20 7b 0a  e == __AVint) {.
0b10: 20 20 20 20 52 45 54 55 52 4e 28 69 6e 74 2c 20      RETURN(int, 
0b20: 69 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20 69  i);.  } else.  i
0b30: 66 20 28 6c 2d 3e 72 74 79 70 65 20 3d 3d 20 5f  f (l->rtype == _
0b40: 5f 41 56 75 69 6e 74 29 20 7b 0a 20 20 20 20 52  _AVuint) {.    R
0b50: 45 54 55 52 4e 28 75 6e 73 69 67 6e 65 64 20 69  ETURN(unsigned i
0b60: 6e 74 2c 20 69 29 3b 0a 20 20 7d 20 65 6c 73 65  nt, i);.  } else
0b70: 0a 20 20 69 66 20 28 6c 2d 3e 72 74 79 70 65 20  .  if (l->rtype 
0b80: 3d 3d 20 5f 5f 41 56 6c 6f 6e 67 29 20 7b 0a 20  == __AVlong) {. 
0b90: 20 20 20 52 45 54 55 52 4e 28 6c 6f 6e 67 2c 20     RETURN(long, 
0ba0: 69 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20 69  i);.  } else.  i
0bb0: 66 20 28 6c 2d 3e 72 74 79 70 65 20 3d 3d 20 5f  f (l->rtype == _
0bc0: 5f 41 56 75 6c 6f 6e 67 29 20 7b 0a 20 20 20 20  _AVulong) {.    
0bd0: 52 45 54 55 52 4e 28 75 6e 73 69 67 6e 65 64 20  RETURN(unsigned 
0be0: 6c 6f 6e 67 2c 20 69 29 3b 0a 20 20 7d 20 65 6c  long, i);.  } el
0bf0: 73 65 0a 20 20 69 66 20 28 6c 2d 3e 72 74 79 70  se.  if (l->rtyp
0c00: 65 20 3d 3d 20 5f 5f 41 56 6c 6f 6e 67 6c 6f 6e  e == __AVlonglon
0c10: 67 20 7c 7c 20 6c 2d 3e 72 74 79 70 65 20 3d 3d  g || l->rtype ==
0c20: 20 5f 5f 41 56 75 6c 6f 6e 67 6c 6f 6e 67 29 20   __AVulonglong) 
0c30: 7b 0a 20 20 20 20 28 28 5f 5f 61 76 77 6f 72 64  {.    ((__avword
0c40: 2a 29 6c 2d 3e 72 61 64 64 72 29 5b 30 5d 20 3d  *)l->raddr)[0] =
0c50: 20 69 3b 0a 20 20 20 20 28 28 5f 5f 61 76 77 6f   i;.    ((__avwo
0c60: 72 64 2a 29 6c 2d 3e 72 61 64 64 72 29 5b 31 5d  rd*)l->raddr)[1]
0c70: 20 3d 20 69 72 65 74 32 3b 0a 20 20 7d 20 65 6c   = iret2;.  } el
0c80: 73 65 0a 20 20 69 66 20 28 6c 2d 3e 72 74 79 70  se.  if (l->rtyp
0c90: 65 20 3d 3d 20 5f 5f 41 56 66 6c 6f 61 74 29 20  e == __AVfloat) 
0ca0: 7b 0a 20 20 20 20 52 45 54 55 52 4e 28 66 6c 6f  {.    RETURN(flo
0cb0: 61 74 2c 20 66 72 65 74 29 3b 0a 20 20 7d 20 65  at, fret);.  } e
0cc0: 6c 73 65 0a 20 20 69 66 20 28 6c 2d 3e 72 74 79  lse.  if (l->rty
0cd0: 70 65 20 3d 3d 20 5f 5f 41 56 64 6f 75 62 6c 65  pe == __AVdouble
0ce0: 29 20 7b 0a 20 20 20 20 52 45 54 55 52 4e 28 64  ) {.    RETURN(d
0cf0: 6f 75 62 6c 65 2c 20 64 72 65 74 29 3b 0a 20 20  ouble, dret);.  
0d00: 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c 2d 3e  } else.  if (l->
0d10: 72 74 79 70 65 20 3d 3d 20 5f 5f 41 56 76 6f 69  rtype == __AVvoi
0d20: 64 70 29 20 7b 0a 20 20 20 20 52 45 54 55 52 4e  dp) {.    RETURN
0d30: 28 76 6f 69 64 2a 2c 20 69 29 3b 0a 20 20 7d 20  (void*, i);.  } 
0d40: 65 6c 73 65 0a 20 20 69 66 20 28 6c 2d 3e 72 74  else.  if (l->rt
0d50: 79 70 65 20 3d 3d 20 5f 5f 41 56 73 74 72 75 63  ype == __AVstruc
0d60: 74 29 20 7b 0a 20 20 20 20 69 66 20 28 6c 2d 3e  t) {.    if (l->
0d70: 66 6c 61 67 73 20 26 20 5f 5f 41 56 5f 50 43 43  flags & __AV_PCC
0d80: 5f 53 54 52 55 43 54 5f 52 45 54 55 52 4e 29 20  _STRUCT_RETURN) 
0d90: 7b 0a 20 20 20 20 20 20 2f 2a 20 70 63 63 20 73  {.      /* pcc s
0da0: 74 72 75 63 74 20 72 65 74 75 72 6e 20 63 6f 6e  truct return con
0db0: 76 65 6e 74 69 6f 6e 3a 20 6e 65 65 64 20 61 20  vention: need a 
0dc0: 20 2a 28 54 59 50 45 2a 29 6c 2d 3e 72 61 64 64   *(TYPE*)l->radd
0dd0: 72 20 3d 20 2a 28 54 59 50 45 2a 29 69 3b 20 20  r = *(TYPE*)i;  
0de0: 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 6c 2d 3e  */.      if (l->
0df0: 72 73 69 7a 65 20 3d 3d 20 73 69 7a 65 6f 66 28  rsize == sizeof(
0e00: 63 68 61 72 29 29 20 7b 0a 20 20 20 20 20 20 20  char)) {.       
0e10: 20 52 45 54 55 52 4e 28 63 68 61 72 2c 20 2a 28   RETURN(char, *(
0e20: 63 68 61 72 2a 29 69 29 3b 0a 20 20 20 20 20 20  char*)i);.      
0e30: 7d 20 65 6c 73 65 0a 20 20 20 20 20 20 69 66 20  } else.      if 
0e40: 28 6c 2d 3e 72 73 69 7a 65 20 3d 3d 20 73 69 7a  (l->rsize == siz
0e50: 65 6f 66 28 73 68 6f 72 74 29 29 20 7b 0a 20 20  eof(short)) {.  
0e60: 20 20 20 20 20 20 52 45 54 55 52 4e 28 73 68 6f        RETURN(sho
0e70: 72 74 2c 20 2a 28 73 68 6f 72 74 2a 29 69 29 3b  rt, *(short*)i);
0e80: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 0a 20 20  .      } else.  
0e90: 20 20 20 20 69 66 20 28 6c 2d 3e 72 73 69 7a 65      if (l->rsize
0ea0: 20 3d 3d 20 73 69 7a 65 6f 66 28 69 6e 74 29 29   == sizeof(int))
0eb0: 20 7b 0a 20 20 20 20 20 20 20 20 52 45 54 55 52   {.        RETUR
0ec0: 4e 28 69 6e 74 2c 20 2a 28 69 6e 74 2a 29 69 29  N(int, *(int*)i)
0ed0: 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 0a 20  ;.      } else. 
0ee0: 20 20 20 20 20 69 66 20 28 6c 2d 3e 72 73 69 7a       if (l->rsiz
0ef0: 65 20 3d 3d 20 73 69 7a 65 6f 66 28 64 6f 75 62  e == sizeof(doub
0f00: 6c 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 28  le)) {.        (
0f10: 28 69 6e 74 2a 29 6c 2d 3e 72 61 64 64 72 29 5b  (int*)l->raddr)[
0f20: 30 5d 20 3d 20 28 28 69 6e 74 2a 29 69 29 5b 30  0] = ((int*)i)[0
0f30: 5d 3b 0a 20 20 20 20 20 20 20 20 28 28 69 6e 74  ];.        ((int
0f40: 2a 29 6c 2d 3e 72 61 64 64 72 29 5b 31 5d 20 3d  *)l->raddr)[1] =
0f50: 20 28 28 69 6e 74 2a 29 69 29 5b 31 5d 3b 0a 20   ((int*)i)[1];. 
0f60: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
0f70: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 6c        int n = (l
0f80: 2d 3e 72 73 69 7a 65 20 2b 20 73 69 7a 65 6f 66  ->rsize + sizeof
0f90: 28 5f 5f 61 76 77 6f 72 64 29 2d 31 29 2f 73 69  (__avword)-1)/si
0fa0: 7a 65 6f 66 28 5f 5f 61 76 77 6f 72 64 29 3b 0a  zeof(__avword);.
0fb0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 2d          while (-
0fc0: 2d 6e 20 3e 3d 20 30 29 0a 20 20 20 20 20 20 20  -n >= 0).       
0fd0: 20 20 20 28 28 5f 5f 61 76 77 6f 72 64 2a 29 6c     ((__avword*)l
0fe0: 2d 3e 72 61 64 64 72 29 5b 6e 5d 20 3d 20 28 28  ->raddr)[n] = ((
0ff0: 5f 5f 61 76 77 6f 72 64 2a 29 69 29 5b 6e 5d 3b  __avword*)i)[n];
1000: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
1010: 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  lse {.      /* n
1020: 6f 72 6d 61 6c 20 73 74 72 75 63 74 20 72 65 74  ormal struct ret
1030: 75 72 6e 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a  urn convention *
1040: 2f 0a 20 20 20 20 20 20 69 66 20 28 6c 2d 3e 66  /.      if (l->f
1050: 6c 61 67 73 20 26 20 5f 5f 41 56 5f 53 4d 41 4c  lags & __AV_SMAL
1060: 4c 5f 53 54 52 55 43 54 5f 52 45 54 55 52 4e 29  L_STRUCT_RETURN)
1070: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c   {.        if (l
1080: 2d 3e 72 73 69 7a 65 20 3d 3d 20 73 69 7a 65 6f  ->rsize == sizeo
1090: 66 28 63 68 61 72 29 29 20 7b 0a 20 20 20 20 20  f(char)) {.     
10a0: 20 20 20 20 20 52 45 54 55 52 4e 28 63 68 61 72       RETURN(char
10b0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 20  , i);.        } 
10c0: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 20  else.        if 
10d0: 28 6c 2d 3e 72 73 69 7a 65 20 3d 3d 20 73 69 7a  (l->rsize == siz
10e0: 65 6f 66 28 73 68 6f 72 74 29 29 20 7b 0a 20 20  eof(short)) {.  
10f0: 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 28 73          RETURN(s
1100: 68 6f 72 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  hort, i);.      
1110: 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 20 20 20    } else.       
1120: 20 69 66 20 28 6c 2d 3e 72 73 69 7a 65 20 3d 3d   if (l->rsize ==
1130: 20 73 69 7a 65 6f 66 28 69 6e 74 29 29 20 7b 0a   sizeof(int)) {.
1140: 20 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e            RETURN
1150: 28 69 6e 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  (int, i);.      
1160: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1170: 7d 0a 20 20 7d 0a 20 20 73 70 20 2b 3d 20 5f 5f  }.  }.  sp += __
1180: 41 56 5f 41 4c 49 53 54 5f 57 4f 52 44 53 3b 0a  AV_ALIST_WORDS;.
1190: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
11a0: 65 6e 64 69 66 20 2f 2a 5f 61 76 63 61 6c 6c 5f  endif /*_avcall_
11b0: 6d 38 38 6b 5f 63 20 2a 2f 0a                    m88k_c */.