Artifact afde7bf5224cf956501db5c74cb10f03514d5233:


0000: 23 69 66 6e 64 65 66 20 5f 61 76 63 61 6c 6c 5f  #ifndef _avcall_
0010: 73 70 61 72 63 5f 63 09 09 09 09 2f 2a 2d 2a 2d  sparc_c..../*-*-
0020: 20 43 20 2d 2a 2d 2a 2f 0a 23 64 65 66 69 6e 65   C -*-*/.#define
0030: 20 5f 61 76 63 61 6c 6c 5f 73 70 61 72 63 5f 63   _avcall_sparc_c
0040: 0a 2f 2a 2a 0a 20 20 43 6f 70 79 72 69 67 68 74  ./**.  Copyright
0050: 20 31 39 39 33 20 42 69 6c 6c 20 54 72 69 67 67   1993 Bill Trigg
0060: 73 2c 20 3c 42 69 6c 6c 2e 54 72 69 67 67 73 40  s, <Bill.Triggs@
0070: 69 6e 72 69 61 6c 70 65 73 2e 66 72 3e 0a 20 20  inrialpes.fr>.  
0080: 43 6f 70 79 72 69 67 68 74 20 31 39 39 35 2d 31  Copyright 1995-1
0090: 39 39 39 20 42 72 75 6e 6f 20 48 61 69 62 6c 65  999 Bruno Haible
00a0: 2c 20 3c 62 72 75 6e 6f 40 63 6c 69 73 70 2e 6f  , <bruno@clisp.o
00b0: 72 67 3e 0a 0a 20 20 54 68 69 73 20 69 73 20 66  rg>..  This is f
00c0: 72 65 65 20 73 6f 66 74 77 61 72 65 20 64 69 73  ree software dis
00d0: 74 72 69 62 75 74 65 64 20 75 6e 64 65 72 20 74  tributed under t
00e0: 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50  he GNU General P
00f0: 75 62 6c 69 63 0a 20 20 4c 69 63 65 6e 63 65 20  ublic.  Licence 
0100: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
0110: 20 66 69 6c 65 20 43 4f 50 59 49 4e 47 2e 20 43   file COPYING. C
0120: 6f 6e 74 61 63 74 20 74 68 65 20 61 75 74 68 6f  ontact the autho
0130: 72 20 69 66 0a 20 20 79 6f 75 20 64 6f 6e 27 74  r if.  you don't
0140: 20 68 61 76 65 20 74 68 69 73 20 6f 72 20 63 61   have this or ca
0150: 6e 27 74 20 6c 69 76 65 20 77 69 74 68 20 69 74  n't live with it
0160: 2e 20 54 68 65 72 65 20 69 73 20 41 42 53 4f 4c  . There is ABSOL
0170: 55 54 45 4c 59 0a 20 20 4e 4f 20 57 41 52 52 41  UTELY.  NO WARRA
0180: 4e 54 59 2c 20 65 78 70 6c 69 63 69 74 20 6f 72  NTY, explicit or
0190: 20 69 6d 70 6c 69 65 64 2c 20 6f 6e 20 74 68 69   implied, on thi
01a0: 73 20 73 6f 66 74 77 61 72 65 2e 0a 2a 2a 2f 0a  s software..**/.
01b0: 2f 2a 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 2d 2d 0a 20 20 21 21 21 20 54  --------.  !!! T
0200: 48 49 53 20 52 4f 55 54 49 4e 45 20 4d 55 53 54  HIS ROUTINE MUST
0210: 20 42 45 20 43 4f 4d 50 49 4c 45 44 20 67 63 63   BE COMPILED gcc
0220: 20 2d 4f 20 21 21 21 0a 0a 20 20 46 6f 72 65 69   -O !!!..  Forei
0230: 67 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74 65  gn function inte
0240: 72 66 61 63 65 20 66 6f 72 20 61 20 53 75 6e 34  rface for a Sun4
0250: 20 53 70 61 72 63 20 77 69 74 68 20 67 63 63 2f   Sparc with gcc/
0260: 73 75 6e 2d 63 63 2e 0a 0a 20 20 54 68 69 73 20  sun-cc...  This 
0270: 63 61 6c 6c 73 20 61 20 43 20 66 75 6e 63 74 69  calls a C functi
0280: 6f 6e 20 77 69 74 68 20 61 6e 20 61 72 67 75 6d  on with an argum
0290: 65 6e 74 20 6c 69 73 74 20 62 75 69 6c 74 20 75  ent list built u
02a0: 70 20 75 73 69 6e 67 20 6d 61 63 72 6f 73 0a 20  p using macros. 
02b0: 20 64 65 66 69 6e 65 64 20 69 6e 20 61 76 5f 63   defined in av_c
02c0: 61 6c 6c 2e 68 2e 0a 0a 20 20 53 70 61 72 63 20  all.h...  Sparc 
02d0: 41 72 67 75 6d 65 6e 74 20 50 61 73 73 69 6e 67  Argument Passing
02e0: 20 43 6f 6e 76 65 6e 74 69 6f 6e 73 0a 0a 20 20   Conventions..  
02f0: 54 68 65 20 66 69 72 73 74 20 36 20 77 6f 72 64  The first 6 word
0300: 73 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61  s of arguments a
0310: 72 65 20 70 61 73 73 65 64 20 69 6e 20 69 6e 74  re passed in int
0320: 65 67 65 72 20 72 65 67 69 73 74 65 72 73 20 6f  eger registers o
0330: 30 2d 6f 35 0a 20 20 72 65 67 61 72 64 6c 65 73  0-o5.  regardles
0340: 73 20 6f 66 20 74 79 70 65 20 6f 72 20 61 6c 69  s of type or ali
0350: 67 6e 6d 65 6e 74 2e 20 20 28 52 65 67 69 73 74  gnment.  (Regist
0360: 65 72 73 20 61 72 65 20 77 69 6e 64 6f 77 65 64  ers are windowed
0370: 3a 20 6f 30 2d 6f 35 20 62 65 63 6f 6d 65 0a 20  : o0-o5 become. 
0380: 20 69 30 2d 69 35 20 69 66 20 74 68 65 20 63 61   i0-i5 if the ca
0390: 6c 6c 65 64 20 66 75 6e 63 74 69 6f 6e 20 65 78  lled function ex
03a0: 65 63 75 74 65 73 20 61 20 60 73 61 76 65 27 20  ecutes a `save' 
03b0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 29 20 20 52  instruction.)  R
03c0: 65 6d 61 69 6e 69 6e 67 0a 20 20 61 72 67 75 6d  emaining.  argum
03d0: 65 6e 74 73 20 61 72 65 20 70 75 73 68 65 64 20  ents are pushed 
03e0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 73  onto the stack s
03f0: 74 61 72 74 69 6e 67 20 61 74 20 61 20 66 69 78  tarting at a fix
0400: 65 64 20 6f 66 66 73 65 74 0a 20 20 28 22 61 72  ed offset.  ("ar
0410: 67 66 72 61 6d 65 22 29 2e 20 53 70 61 63 65 20  gframe"). Space 
0420: 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
0430: 74 61 63 6b 20 66 72 61 6d 65 20 66 6f 72 20 74  tack frame for t
0440: 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
0450: 20 6f 66 0a 20 20 74 68 65 20 72 65 67 69 73 74   of.  the regist
0460: 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 73 20  er arguments as 
0470: 77 65 6c 6c 2e 0a 0a 20 20 44 6f 75 62 6c 65 73  well...  Doubles
0480: 20 6d 61 79 20 62 65 20 63 75 74 20 69 6e 20 68   may be cut in h
0490: 61 6c 66 20 61 6e 64 20 6d 69 73 61 6c 69 67 6e  alf and misalign
04a0: 65 64 2e 20 20 53 68 6f 72 74 65 72 20 69 6e 74  ed.  Shorter int
04b0: 65 67 65 72 73 20 61 72 65 0a 20 20 61 6c 77 61  egers are.  alwa
04c0: 79 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 77  ys promoted to w
04d0: 6f 72 64 2d 6c 65 6e 67 74 68 2e 20 20 46 75 6e  ord-length.  Fun
04e0: 63 74 69 6f 6e 73 20 77 69 74 68 20 4b 26 52 2d  ctions with K&R-
04f0: 73 74 79 6c 65 20 64 65 63 6c 61 72 61 74 69 6f  style declaratio
0500: 6e 73 0a 20 20 61 6e 64 20 66 6c 6f 61 74 20 61  ns.  and float a
0510: 72 67 73 20 70 61 73 73 20 74 68 65 6d 20 61 73  rgs pass them as
0520: 20 64 6f 75 62 6c 65 73 20 61 6e 64 20 74 72 75   doubles and tru
0530: 6e 63 61 74 65 20 74 68 65 6d 20 6f 6e 20 66 75  ncate them on fu
0540: 6e 63 74 69 6f 6e 20 65 6e 74 72 79 2e 0a 20 20  nction entry..  
0550: 53 74 72 75 63 74 75 72 65 73 20 61 72 65 20 70  Structures are p
0560: 61 73 73 65 64 20 61 73 20 70 6f 69 6e 74 65 72  assed as pointer
0570: 73 20 74 6f 20 61 20 6c 6f 63 61 6c 20 63 6f 70  s to a local cop
0580: 79 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  y of the structu
0590: 72 65 20 6d 61 64 65 0a 20 20 62 79 20 74 68 65  re made.  by the
05a0: 20 63 61 6c 6c 65 72 2e 0a 0a 20 20 49 6e 74 65   caller...  Inte
05b0: 67 65 72 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  gers and pointer
05c0: 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 69  s are returned i
05d0: 6e 20 6f 30 2c 20 66 6c 6f 61 74 73 20 69 6e 20  n o0, floats in 
05e0: 66 30 2c 20 64 6f 75 62 6c 65 73 20 69 6e 0a 20  f0, doubles in. 
05f0: 20 66 30 2f 66 31 2e 20 20 49 66 20 74 68 65 20   f0/f1.  If the 
0600: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
0610: 20 61 20 73 74 72 75 63 74 75 72 65 20 61 20 70   a structure a p
0620: 6f 69 6e 74 65 72 20 74 6f 20 73 70 61 63 65 0a  ointer to space.
0630: 20 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74    allocated by t
0640: 68 65 20 63 61 6c 6c 65 72 20 69 73 20 70 75 73  he caller is pus
0650: 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  hed onto the sta
0660: 63 6b 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20  ck immediately. 
0670: 20 62 65 66 6f 72 65 20 74 68 65 20 66 75 6e 63   before the func
0680: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20  tion arguments. 
0690: 47 63 63 20 77 69 74 68 6f 75 74 20 2d 66 70 63  Gcc without -fpc
06a0: 63 2d 73 74 72 75 63 74 2d 72 65 74 75 72 6e 20  c-struct-return 
06b0: 72 65 74 75 72 6e 73 0a 20 20 3c 3d 20 34 20 62  returns.  <= 4 b
06c0: 79 74 65 20 73 74 72 75 63 74 75 72 65 73 20 61  yte structures a
06d0: 73 20 69 6e 74 65 67 65 72 73 2e 0a 0a 20 20 53  s integers...  S
06e0: 75 6e 20 63 63 20 61 6c 6c 6f 63 61 74 65 73 20  un cc allocates 
06f0: 74 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  temporary space 
0700: 66 6f 72 20 61 20 72 65 74 75 72 6e 65 64 20 73  for a returned s
0710: 74 72 75 63 74 75 72 65 20 6a 75 73 74 20 62 65  tructure just be
0720: 6c 6f 77 0a 20 20 74 68 65 20 63 75 72 72 65 6e  low.  the curren
0730: 74 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20  t frame pointer 
0740: 24 66 70 20 28 74 68 65 20 24 73 70 20 6f 66 20  $fp (the $sp of 
0750: 74 68 65 20 63 61 6c 6c 65 72 29 2c 20 61 6e 64  the caller), and
0760: 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 6d 75   the caller.  mu
0770: 73 74 20 63 6f 70 79 20 74 68 65 6d 20 66 72 6f  st copy them fro
0780: 6d 20 74 68 65 72 65 2e 20 49 74 20 61 6c 73 6f  m there. It also
0790: 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 65 6d   returns the tem
07a0: 70 20 61 64 64 72 65 73 73 20 69 6e 20 24 6f 30  p address in $o0
07b0: 2c 20 62 75 74 0a 20 20 74 68 61 74 20 67 65 74  , but.  that get
07c0: 73 20 6e 75 6b 65 64 20 69 6e 20 74 68 65 20 72  s nuked in the r
07d0: 65 74 75 72 6e 20 69 6e 20 74 68 65 20 63 6f 64  eturn in the cod
07e0: 65 20 62 65 6c 6f 77 20 73 6f 20 77 65 20 63 61  e below so we ca
07f0: 6e 27 74 20 75 73 65 20 69 74 2e 0a 20 20 2a 2a  n't use it..  **
0800: 54 68 65 20 53 75 6e 20 63 63 20 73 74 72 75 63  The Sun cc struc
0810: 74 20 72 65 74 75 72 6e 20 73 74 75 66 66 20 62  t return stuff b
0820: 65 6c 6f 77 20 69 73 20 61 20 6b 6c 75 64 67 65  elow is a kludge
0830: 2a 2a 2c 20 62 75 74 20 73 65 65 6d 73 20 74 6f  **, but seems to
0840: 20 77 6f 72 6b 0a 20 20 6f 6e 20 74 68 65 20 74   work.  on the t
0850: 65 73 74 20 63 61 73 65 73 2e 2e 2e 0a 0a 20 20  est cases.....  
0860: 43 6f 6d 70 69 6c 65 20 74 68 69 73 20 72 6f 75  Compile this rou
0870: 74 69 6e 65 20 77 69 74 68 20 67 63 63 20 66 6f  tine with gcc fo
0880: 72 20 74 68 65 20 5f 5f 61 73 6d 5f 5f 20 65 78  r the __asm__ ex
0890: 74 65 6e 73 69 6f 6e 73 20 61 6e 64 20 77 69 74  tensions and wit
08a0: 68 0a 20 20 6f 70 74 69 6d 69 73 61 74 69 6f 6e  h.  optimisation
08b0: 20 6f 6e 20 28 2d 4f 20 6f 72 20 2d 4f 32 20 6f   on (-O or -O2 o
08c0: 72 20 2d 67 20 2d 4f 29 20 73 6f 20 74 68 61 74  r -g -O) so that
08d0: 20 61 72 67 66 72 61 6d 65 20 69 73 20 73 65 74   argframe is set
08e0: 20 74 6f 20 74 68 65 0a 20 20 63 6f 72 72 65 63   to the.  correc
08f0: 74 20 6f 66 66 73 65 74 2e 20 28 25 73 70 20 69  t offset. (%sp i
0900: 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74  s used different
0910: 6c 79 20 69 6e 20 6e 6f 6e 2d 6f 70 74 69 6d 69  ly in non-optimi
0920: 7a 65 64 20 63 6f 64 65 29 2e 0a 20 20 46 6f 72  zed code)..  For
0930: 20 53 75 6e 20 63 63 2c 20 75 73 65 20 74 68 65   Sun cc, use the
0940: 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 61 73   pre-compiled as
0950: 73 65 6d 62 6c 65 72 20 76 65 72 73 69 6f 6e 20  sembler version 
0960: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  of this routine.
0970: 0a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  -------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 2f 0a 23 69 6e 63  ---------*/.#inc
09c0: 6c 75 64 65 20 22 61 76 63 61 6c 6c 2e 68 2e 69  lude "avcall.h.i
09d0: 6e 22 0a 0a 23 64 65 66 69 6e 65 20 52 45 54 55  n"..#define RETU
09e0: 52 4e 28 54 59 50 45 2c 56 41 4c 29 09 28 2a 28  RN(TYPE,VAL).(*(
09f0: 54 59 50 45 2a 29 6c 2d 3e 72 61 64 64 72 20 3d  TYPE*)l->raddr =
0a00: 20 28 54 59 50 45 29 28 56 41 4c 29 29 0a 0a 72   (TYPE)(VAL))..r
0a10: 65 67 69 73 74 65 72 20 76 6f 69 64 2a 20 63 61  egister void* ca
0a20: 6c 6c 65 65 09 5f 5f 61 73 6d 5f 5f 28 22 25 67  llee.__asm__("%g
0a30: 32 22 29 3b 20 20 2f 2a 20 61 6e 79 20 67 6c 6f  2");  /* any glo
0a40: 62 61 6c 20 6f 72 20 6c 6f 63 61 6c 20 72 65 67  bal or local reg
0a50: 69 73 74 65 72 20 2a 2f 0a 72 65 67 69 73 74 65  ister */.registe
0a60: 72 20 5f 5f 61 76 77 6f 72 64 20 6f 30 09 5f 5f  r __avword o0.__
0a70: 61 73 6d 5f 5f 28 22 25 6f 30 22 29 3b 0a 72 65  asm__("%o0");.re
0a80: 67 69 73 74 65 72 20 5f 5f 61 76 77 6f 72 64 20  gister __avword 
0a90: 6f 31 09 5f 5f 61 73 6d 5f 5f 28 22 25 6f 31 22  o1.__asm__("%o1"
0aa0: 29 3b 0a 72 65 67 69 73 74 65 72 20 5f 5f 61 76  );.register __av
0ab0: 77 6f 72 64 20 6f 32 09 5f 5f 61 73 6d 5f 5f 28  word o2.__asm__(
0ac0: 22 25 6f 32 22 29 3b 0a 72 65 67 69 73 74 65 72  "%o2");.register
0ad0: 20 5f 5f 61 76 77 6f 72 64 20 6f 33 09 5f 5f 61   __avword o3.__a
0ae0: 73 6d 5f 5f 28 22 25 6f 33 22 29 3b 0a 72 65 67  sm__("%o3");.reg
0af0: 69 73 74 65 72 20 5f 5f 61 76 77 6f 72 64 20 6f  ister __avword o
0b00: 34 09 5f 5f 61 73 6d 5f 5f 28 22 25 6f 34 22 29  4.__asm__("%o4")
0b10: 3b 0a 72 65 67 69 73 74 65 72 20 5f 5f 61 76 77  ;.register __avw
0b20: 6f 72 64 20 6f 35 09 5f 5f 61 73 6d 5f 5f 28 22  ord o5.__asm__("
0b30: 25 6f 35 22 29 3b 0a 0a 69 6e 74 0a 5f 5f 62 75  %o5");..int.__bu
0b40: 69 6c 74 69 6e 5f 61 76 63 61 6c 6c 28 61 76 5f  iltin_avcall(av_
0b50: 61 6c 69 73 74 2a 20 6c 29 0a 7b 0a 20 20 2f 2a  alist* l).{.  /*
0b60: 3f 3f 20 57 65 20 70 72 6f 62 61 62 6c 79 20 6e  ?? We probably n
0b70: 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  eed to make spac
0b80: 65 20 66 6f 72 20 53 75 6e 20 63 63 0a 20 20 20  e for Sun cc.   
0b90: 20 73 74 72 75 63 74 20 72 65 74 75 72 6e 20 73   struct return s
0ba0: 6f 6d 65 77 68 65 72 65 20 68 65 72 65 2e 20 2a  omewhere here. *
0bb0: 2f 0a 20 20 72 65 67 69 73 74 65 72 20 5f 5f 61  /.  register __a
0bc0: 76 77 6f 72 64 2a 20 73 70 09 5f 5f 61 73 6d 5f  vword* sp.__asm_
0bd0: 5f 28 22 25 73 70 22 29 3b 20 20 2f 2a 20 43 20  _("%sp");  /* C 
0be0: 6e 61 6d 65 73 20 66 6f 72 20 72 65 67 69 73 74  names for regist
0bf0: 65 72 73 20 2a 2f 0a 20 20 72 65 67 69 73 74 65  ers */.  registe
0c00: 72 20 66 6c 6f 61 74 20 66 72 65 74 09 5f 5f 61  r float fret.__a
0c10: 73 6d 5f 5f 28 22 25 66 30 22 29 3b 20 20 2f 2a  sm__("%f0");  /*
0c20: 20 25 66 30 20 2a 2f 0a 20 20 72 65 67 69 73 74   %f0 */.  regist
0c30: 65 72 20 64 6f 75 62 6c 65 20 64 72 65 74 09 5f  er double dret._
0c40: 5f 61 73 6d 5f 5f 28 22 25 66 30 22 29 3b 20 20  _asm__("%f0");  
0c50: 2f 2a 20 25 66 30 2c 25 66 31 20 2a 2f 0a 0a 20  /* %f0,%f1 */.. 
0c60: 20 5f 5f 61 76 77 6f 72 64 20 74 72 61 6d 70 6f   __avword trampo
0c70: 6c 69 6e 65 5b 36 5d 3b 09 09 2f 2a 20 72 6f 6f  line[6];../* roo
0c80: 6d 20 66 6f 72 20 61 20 74 72 61 6d 70 6f 6c 69  m for a trampoli
0c90: 6e 65 20 2a 2f 0a 20 20 5f 5f 61 76 77 6f 72 64  ne */.  __avword
0ca0: 20 73 70 61 63 65 5b 5f 5f 41 56 5f 41 4c 49 53   space[__AV_ALIS
0cb0: 54 5f 57 4f 52 44 53 5d 3b 09 2f 2a 20 73 70 61  T_WORDS];./* spa
0cc0: 63 65 20 66 6f 72 20 63 61 6c 6c 65 65 27 73 20  ce for callee's 
0cd0: 73 74 61 63 6b 20 66 72 61 6d 65 20 2a 2f 0a 20  stack frame */. 
0ce0: 20 5f 5f 61 76 77 6f 72 64 20 2a 61 72 67 66 72   __avword *argfr
0cf0: 61 6d 65 20 3d 20 73 70 20 2b 20 31 37 3b 09 09  ame = sp + 17;..
0d00: 2f 2a 20 73 74 61 63 6b 20 6f 66 66 73 65 74 20  /* stack offset 
0d10: 66 6f 72 20 61 72 67 75 6d 65 6e 74 20 6c 69 73  for argument lis
0d20: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 6c 65  t */.  int argle
0d30: 6e 20 3d 20 6c 2d 3e 61 70 74 72 20 2d 20 6c 2d  n = l->aptr - l-
0d40: 3e 61 72 67 73 3b 0a 20 20 5f 5f 61 76 77 6f 72  >args;.  __avwor
0d50: 64 20 69 3b 0a 0a 20 20 69 66 20 28 28 6c 2d 3e  d i;..  if ((l->
0d60: 72 74 79 70 65 20 3d 3d 20 5f 5f 41 56 73 74 72  rtype == __AVstr
0d70: 75 63 74 29 20 26 26 20 21 28 6c 2d 3e 66 6c 61  uct) && !(l->fla
0d80: 67 73 20 26 20 5f 5f 41 56 5f 53 55 4e 43 43 5f  gs & __AV_SUNCC_
0d90: 53 54 52 55 43 54 5f 52 45 54 55 52 4e 29 29 0a  STRUCT_RETURN)).
0da0: 20 20 20 20 61 72 67 66 72 61 6d 65 5b 2d 31 5d      argframe[-1]
0db0: 20 3d 20 28 5f 5f 61 76 77 6f 72 64 29 6c 2d 3e   = (__avword)l->
0dc0: 72 61 64 64 72 3b 09 2f 2a 20 70 75 73 68 20 73  raddr;./* push s
0dd0: 74 72 75 63 74 20 72 65 74 75 72 6e 20 61 64 64  truct return add
0de0: 72 65 73 73 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20  ress */..  {.   
0df0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 20   int i;.    for 
0e00: 28 69 20 3d 20 36 3b 20 69 20 3c 20 61 72 67 6c  (i = 6; i < argl
0e10: 65 6e 3b 20 69 2b 2b 29 09 2f 2a 20 70 75 73 68  en; i++)./* push
0e20: 20 65 78 63 65 73 73 20 66 75 6e 63 74 69 6f 6e   excess function
0e30: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 20 20 61   args */.      a
0e40: 72 67 66 72 61 6d 65 5b 69 5d 20 3d 20 6c 2d 3e  rgframe[i] = l->
0e50: 61 72 67 73 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20  args[i];.  }..  
0e60: 69 66 20 28 28 6c 2d 3e 72 74 79 70 65 20 3d 3d  if ((l->rtype ==
0e70: 20 5f 5f 41 56 73 74 72 75 63 74 29 20 26 26 20   __AVstruct) && 
0e80: 28 6c 2d 3e 66 6c 61 67 73 20 26 20 5f 5f 41 56  (l->flags & __AV
0e90: 5f 53 55 4e 50 52 4f 43 43 5f 53 54 52 55 43 54  _SUNPROCC_STRUCT
0ea0: 5f 52 45 54 55 52 4e 29 29 0a 20 20 20 20 2f 2a  _RETURN)).    /*
0eb0: 20 53 55 4e 57 73 70 72 6f 20 63 63 20 63 6f 6d   SUNWspro cc com
0ec0: 70 69 6c 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  piled functions 
0ed0: 64 6f 6e 27 74 20 63 6f 70 79 20 74 68 65 20 73  don't copy the s
0ee0: 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20  tructure to the 
0ef0: 61 72 65 61 0a 20 20 20 20 20 2a 20 70 6f 69 6e  area.     * poin
0f00: 74 65 64 20 74 6f 20 62 79 20 61 72 67 66 72 61  ted to by argfra
0f10: 6d 65 5b 2d 31 5d 20 75 6e 6c 65 73 73 20 74 68  me[-1] unless th
0f20: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 20 70  e caller has a p
0f30: 72 6f 70 65 72 20 22 75 6e 69 6d 70 20 6e 22 0a  roper "unimp n".
0f40: 20 20 20 20 20 2a 20 69 6e 73 74 72 75 63 74 69       * instructi
0f50: 6f 6e 2e 20 57 65 20 67 65 6e 65 72 61 74 65 20  on. We generate 
0f60: 74 68 65 20 63 61 6c 6c 69 6e 67 20 69 6e 73 74  the calling inst
0f70: 72 75 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  ructions on the 
0f80: 73 74 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 7b 0a  stack. */.    {.
0f90: 20 20 20 20 20 20 74 72 61 6d 70 6f 6c 69 6e 65        trampoline
0fa0: 5b 30 5d 20 3d 20 30 78 39 46 43 30 38 30 30 30  [0] = 0x9FC08000
0fb0: 3b 09 2f 2a 20 63 61 6c 6c 20 25 67 32 09 2a 2f  ;./* call %g2.*/
0fc0: 0a 20 20 20 20 20 20 74 72 61 6d 70 6f 6c 69 6e  .      trampolin
0fd0: 65 5b 31 5d 20 3d 20 30 78 30 31 30 30 30 30 30  e[1] = 0x0100000
0fe0: 30 3b 09 2f 2a 20 6e 6f 70 09 09 2a 2f 0a 20 20  0;./* nop..*/.  
0ff0: 20 20 20 20 74 72 61 6d 70 6f 6c 69 6e 65 5b 32      trampoline[2
1000: 5d 20 3d 20 6c 2d 3e 72 73 69 7a 65 20 26 20 30  ] = l->rsize & 0
1010: 78 46 46 46 3b 09 2f 2a 20 75 6e 69 6d 70 20 6e  xFFF;./* unimp n
1020: 09 2a 2f 0a 20 20 20 20 20 20 74 72 61 6d 70 6f  .*/.      trampo
1030: 6c 69 6e 65 5b 33 5d 20 3d 20 30 78 42 30 31 30  line[3] = 0xB010
1040: 32 30 30 30 3b 20 20 20 20 20 20 20 2f 2a 20 6d  2000;       /* m
1050: 6f 76 20 30 2c 25 69 30 20 20 20 20 2a 2f 0a 20  ov 0,%i0    */. 
1060: 20 20 20 20 20 74 72 61 6d 70 6f 6c 69 6e 65 5b       trampoline[
1070: 34 5d 20 3d 20 30 78 38 31 43 37 45 30 30 38 3b  4] = 0x81C7E008;
1080: 20 20 20 20 20 20 20 2f 2a 20 72 65 74 20 20 20         /* ret   
1090: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10a0: 74 72 61 6d 70 6f 6c 69 6e 65 5b 35 5d 20 3d 20  trampoline[5] = 
10b0: 30 78 38 31 45 38 30 30 30 30 3b 20 20 20 20 20  0x81E80000;     
10c0: 20 20 2f 2a 20 72 65 73 74 6f 72 65 20 20 20 20    /* restore    
10d0: 20 20 2a 2f 0a 20 20 20 20 20 20 5f 5f 61 73 6d    */.      __asm
10e0: 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20  __ __volatile__ 
10f0: 28 22 69 66 6c 75 73 68 20 25 30 22 20 3a 20 3a  ("iflush %0" : :
1100: 20 22 72 22 20 28 26 74 72 61 6d 70 6f 6c 69 6e   "r" (&trampolin
1110: 65 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 5f 5f  e[0]));.      __
1120: 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65  asm__ __volatile
1130: 5f 5f 20 28 22 69 66 6c 75 73 68 20 25 30 22 20  __ ("iflush %0" 
1140: 3a 20 3a 20 22 72 22 20 28 26 74 72 61 6d 70 6f  : : "r" (&trampo
1150: 6c 69 6e 65 5b 32 5d 29 29 3b 0a 20 20 20 20 20  line[2]));.     
1160: 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74   __asm__ __volat
1170: 69 6c 65 5f 5f 20 28 22 69 66 6c 75 73 68 20 25  ile__ ("iflush %
1180: 30 22 20 3a 20 3a 20 22 72 22 20 28 26 74 72 61  0" : : "r" (&tra
1190: 6d 70 6f 6c 69 6e 65 5b 34 5d 29 29 3b 0a 20 20  mpoline[4]));.  
11a0: 20 20 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f      __asm__ __vo
11b0: 6c 61 74 69 6c 65 5f 5f 20 28 22 69 66 6c 75 73  latile__ ("iflus
11c0: 68 20 25 30 22 20 3a 20 3a 20 22 72 22 20 28 26  h %0" : : "r" (&
11d0: 74 72 61 6d 70 6f 6c 69 6e 65 5b 35 5d 29 29 3b  trampoline[5]));
11e0: 0a 20 20 20 20 20 20 6f 30 20 3d 20 6c 2d 3e 61  .      o0 = l->a
11f0: 72 67 73 5b 30 5d 3b 20 6f 31 20 3d 20 6c 2d 3e  rgs[0]; o1 = l->
1200: 61 72 67 73 5b 31 5d 3b 20 6f 32 20 3d 20 6c 2d  args[1]; o2 = l-
1210: 3e 61 72 67 73 5b 32 5d 3b 0a 20 20 20 20 20 20  >args[2];.      
1220: 6f 33 20 3d 20 6c 2d 3e 61 72 67 73 5b 33 5d 3b  o3 = l->args[3];
1230: 20 6f 34 20 3d 20 6c 2d 3e 61 72 67 73 5b 34 5d   o4 = l->args[4]
1240: 3b 20 6f 35 20 3d 20 6c 2d 3e 61 72 67 73 5b 35  ; o5 = l->args[5
1250: 5d 3b 0a 20 20 20 20 20 20 63 61 6c 6c 65 65 20  ];.      callee 
1260: 3d 20 6c 2d 3e 66 75 6e 63 3b 0a 20 20 20 20 20  = l->func;.     
1270: 20 67 6f 74 6f 20 2a 28 76 6f 69 64 2a 29 74 72   goto *(void*)tr
1280: 61 6d 70 6f 6c 69 6e 65 3b 0a 20 20 20 20 7d 0a  ampoline;.    }.
1290: 0a 09 09 09 09 09 2f 2a 20 63 61 6c 6c 20 66 75  ....../* call fu
12a0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 31 73 74 20  nction with 1st 
12b0: 36 20 61 72 67 73 20 2a 2f 0a 20 20 69 20 3d 20  6 args */.  i = 
12c0: 28 7b 20 5f 5f 61 76 77 6f 72 64 20 69 72 65 74  ({ __avword iret
12d0: 3b 09 2f 2a 20 25 6f 30 20 2a 2f 0a 20 20 20 20  ;./* %o0 */.    
12e0: 20 20 20 20 20 69 72 65 74 20 3d 20 28 2a 6c 2d       iret = (*l-
12f0: 3e 66 75 6e 63 29 28 6c 2d 3e 61 72 67 73 5b 30  >func)(l->args[0
1300: 5d 2c 20 6c 2d 3e 61 72 67 73 5b 31 5d 2c 20 6c  ], l->args[1], l
1310: 2d 3e 61 72 67 73 5b 32 5d 2c 0a 09 09 09 20 20  ->args[2],....  
1320: 20 6c 2d 3e 61 72 67 73 5b 33 5d 2c 20 6c 2d 3e   l->args[3], l->
1330: 61 72 67 73 5b 34 5d 2c 20 6c 2d 3e 61 72 67 73  args[4], l->args
1340: 5b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 61  [5]);.         a
1350: 73 6d 20 28 22 6e 6f 70 22 29 3b 09 2f 2a 20 73  sm ("nop");./* s
1360: 74 72 75 63 74 20 72 65 74 75 72 6e 69 6e 67 20  truct returning 
1370: 66 75 6e 63 74 69 6f 6e 73 20 73 6b 69 70 20 74  functions skip t
1380: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
1390: 2a 2f 0a 20 20 20 20 20 20 20 20 20 69 72 65 74  */.         iret
13a0: 3b 0a 20 20 20 20 20 20 20 7d 29 3b 0a 0a 20 20  ;.       });..  
13b0: 2f 2a 20 73 61 76 65 20 72 65 74 75 72 6e 20 76  /* save return v
13c0: 61 6c 75 65 20 2a 2f 0a 20 20 69 66 20 28 6c 2d  alue */.  if (l-
13d0: 3e 72 74 79 70 65 20 3d 3d 20 5f 5f 41 56 76 6f  >rtype == __AVvo
13e0: 69 64 29 20 7b 0a 20 20 7d 20 65 6c 73 65 0a 20  id) {.  } else. 
13f0: 20 69 66 20 28 6c 2d 3e 72 74 79 70 65 20 3d 3d   if (l->rtype ==
1400: 20 5f 5f 41 56 77 6f 72 64 29 20 7b 0a 20 20 20   __AVword) {.   
1410: 20 52 45 54 55 52 4e 28 5f 5f 61 76 77 6f 72 64   RETURN(__avword
1420: 2c 20 69 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 20  , i);.  } else. 
1430: 20 69 66 20 28 6c 2d 3e 72 74 79 70 65 20 3d 3d   if (l->rtype ==
1440: 20 5f 5f 41 56 63 68 61 72 29 20 7b 0a 20 20 20   __AVchar) {.   
1450: 20 52 45 54 55 52 4e 28 63 68 61 72 2c 20 69 29   RETURN(char, i)
1460: 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20 69 66 20  ;.  } else.  if 
1470: 28 6c 2d 3e 72 74 79 70 65 20 3d 3d 20 5f 5f 41  (l->rtype == __A
1480: 56 73 63 68 61 72 29 20 7b 0a 20 20 20 20 52 45  Vschar) {.    RE
1490: 54 55 52 4e 28 73 69 67 6e 65 64 20 63 68 61 72  TURN(signed char
14a0: 2c 20 69 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 20  , i);.  } else. 
14b0: 20 69 66 20 28 6c 2d 3e 72 74 79 70 65 20 3d 3d   if (l->rtype ==
14c0: 20 5f 5f 41 56 75 63 68 61 72 29 20 7b 0a 20 20   __AVuchar) {.  
14d0: 20 20 52 45 54 55 52 4e 28 75 6e 73 69 67 6e 65    RETURN(unsigne
14e0: 64 20 63 68 61 72 2c 20 69 29 3b 0a 20 20 7d 20  d char, i);.  } 
14f0: 65 6c 73 65 0a 20 20 69 66 20 28 6c 2d 3e 72 74  else.  if (l->rt
1500: 79 70 65 20 3d 3d 20 5f 5f 41 56 73 68 6f 72 74  ype == __AVshort
1510: 29 20 7b 0a 20 20 20 20 52 45 54 55 52 4e 28 73  ) {.    RETURN(s
1520: 68 6f 72 74 2c 20 69 29 3b 0a 20 20 7d 20 65 6c  hort, i);.  } el
1530: 73 65 0a 20 20 69 66 20 28 6c 2d 3e 72 74 79 70  se.  if (l->rtyp
1540: 65 20 3d 3d 20 5f 5f 41 56 75 73 68 6f 72 74 29  e == __AVushort)
1550: 20 7b 0a 20 20 20 20 52 45 54 55 52 4e 28 75 6e   {.    RETURN(un
1560: 73 69 67 6e 65 64 20 73 68 6f 72 74 2c 20 69 29  signed short, i)
1570: 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20 69 66 20  ;.  } else.  if 
1580: 28 6c 2d 3e 72 74 79 70 65 20 3d 3d 20 5f 5f 41  (l->rtype == __A
1590: 56 69 6e 74 29 20 7b 0a 20 20 20 20 52 45 54 55  Vint) {.    RETU
15a0: 52 4e 28 69 6e 74 2c 20 69 29 3b 0a 20 20 7d 20  RN(int, i);.  } 
15b0: 65 6c 73 65 0a 20 20 69 66 20 28 6c 2d 3e 72 74  else.  if (l->rt
15c0: 79 70 65 20 3d 3d 20 5f 5f 41 56 75 69 6e 74 29  ype == __AVuint)
15d0: 20 7b 0a 20 20 20 20 52 45 54 55 52 4e 28 75 6e   {.    RETURN(un
15e0: 73 69 67 6e 65 64 20 69 6e 74 2c 20 69 29 3b 0a  signed int, i);.
15f0: 20 20 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c    } else.  if (l
1600: 2d 3e 72 74 79 70 65 20 3d 3d 20 5f 5f 41 56 6c  ->rtype == __AVl
1610: 6f 6e 67 29 20 7b 0a 20 20 20 20 52 45 54 55 52  ong) {.    RETUR
1620: 4e 28 6c 6f 6e 67 2c 20 69 29 3b 0a 20 20 7d 20  N(long, i);.  } 
1630: 65 6c 73 65 0a 20 20 69 66 20 28 6c 2d 3e 72 74  else.  if (l->rt
1640: 79 70 65 20 3d 3d 20 5f 5f 41 56 75 6c 6f 6e 67  ype == __AVulong
1650: 29 20 7b 0a 20 20 20 20 52 45 54 55 52 4e 28 75  ) {.    RETURN(u
1660: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 2c 20 69 29  nsigned long, i)
1670: 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20 69 66 20  ;.  } else.  if 
1680: 28 6c 2d 3e 72 74 79 70 65 20 3d 3d 20 5f 5f 41  (l->rtype == __A
1690: 56 6c 6f 6e 67 6c 6f 6e 67 20 7c 7c 20 6c 2d 3e  Vlonglong || l->
16a0: 72 74 79 70 65 20 3d 3d 20 5f 5f 41 56 75 6c 6f  rtype == __AVulo
16b0: 6e 67 6c 6f 6e 67 29 20 7b 0a 20 20 20 20 28 28  nglong) {.    ((
16c0: 5f 5f 61 76 77 6f 72 64 2a 29 6c 2d 3e 72 61 64  __avword*)l->rad
16d0: 64 72 29 5b 30 5d 20 3d 20 69 3b 0a 20 20 20 20  dr)[0] = i;.    
16e0: 28 28 5f 5f 61 76 77 6f 72 64 2a 29 6c 2d 3e 72  ((__avword*)l->r
16f0: 61 64 64 72 29 5b 31 5d 20 3d 20 6f 31 3b 0a 20  addr)[1] = o1;. 
1700: 20 7d 20 65 6c 73 65 0a 20 20 69 66 20 28 6c 2d   } else.  if (l-
1710: 3e 72 74 79 70 65 20 3d 3d 20 5f 5f 41 56 66 6c  >rtype == __AVfl
1720: 6f 61 74 29 20 7b 0a 20 20 20 20 2f 2a 20 6f 6c  oat) {.    /* ol
1730: 64 20 53 75 6e 20 63 63 20 72 65 74 75 72 6e 73  d Sun cc returns
1740: 20 66 6c 6f 61 74 73 20 61 73 20 64 6f 75 62 6c   floats as doubl
1750: 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 2d  es */.    if (l-
1760: 3e 66 6c 61 67 73 20 26 20 5f 5f 41 56 5f 53 55  >flags & __AV_SU
1770: 4e 43 43 5f 46 4c 4f 41 54 5f 52 45 54 55 52 4e  NCC_FLOAT_RETURN
1780: 29 20 7b 0a 20 20 20 20 20 20 52 45 54 55 52 4e  ) {.      RETURN
1790: 28 66 6c 6f 61 74 2c 20 28 66 6c 6f 61 74 29 64  (float, (float)d
17a0: 72 65 74 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ret);.    } else
17b0: 20 7b 0a 20 20 20 20 20 20 52 45 54 55 52 4e 28   {.      RETURN(
17c0: 66 6c 6f 61 74 2c 20 66 72 65 74 29 3b 0a 20 20  float, fret);.  
17d0: 20 20 7d 0a 20 20 7d 20 65 6c 73 65 0a 20 20 69    }.  } else.  i
17e0: 66 20 28 6c 2d 3e 72 74 79 70 65 20 3d 3d 20 5f  f (l->rtype == _
17f0: 5f 41 56 64 6f 75 62 6c 65 29 20 7b 0a 20 20 20  _AVdouble) {.   
1800: 20 52 45 54 55 52 4e 28 64 6f 75 62 6c 65 2c 20   RETURN(double, 
1810: 64 72 65 74 29 3b 0a 20 20 7d 20 65 6c 73 65 0a  dret);.  } else.
1820: 20 20 69 66 20 28 6c 2d 3e 72 74 79 70 65 20 3d    if (l->rtype =
1830: 3d 20 5f 5f 41 56 76 6f 69 64 70 29 20 7b 0a 20  = __AVvoidp) {. 
1840: 20 20 20 52 45 54 55 52 4e 28 76 6f 69 64 2a 2c     RETURN(void*,
1850: 20 69 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20   i);.  } else.  
1860: 69 66 20 28 6c 2d 3e 72 74 79 70 65 20 3d 3d 20  if (l->rtype == 
1870: 5f 5f 41 56 73 74 72 75 63 74 29 20 7b 0a 20 20  __AVstruct) {.  
1880: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6b    /* This is a k
1890: 6c 75 64 67 65 20 66 6f 72 20 6f 6c 64 20 53 75  ludge for old Su
18a0: 6e 20 63 63 20 61 6e 64 20 69 73 20 70 72 6f 62  n cc and is prob
18b0: 61 62 6c 79 20 66 72 61 67 69 6c 65 2e 20 2a 2f  ably fragile. */
18c0: 0a 20 20 20 20 69 66 20 28 6c 2d 3e 66 6c 61 67  .    if (l->flag
18d0: 73 20 26 20 5f 5f 41 56 5f 53 55 4e 43 43 5f 53  s & __AV_SUNCC_S
18e0: 54 52 55 43 54 5f 52 45 54 55 52 4e 29 20 7b 0a  TRUCT_RETURN) {.
18f0: 20 20 20 20 20 20 2f 2a 20 53 75 6e 20 63 63 20        /* Sun cc 
1900: 73 74 72 75 63 74 20 72 65 74 75 72 6e 20 63 6f  struct return co
1910: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nvention */.    
1920: 20 20 69 66 20 28 6c 2d 3e 72 73 69 7a 65 20 3d    if (l->rsize =
1930: 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29 20  = sizeof(char)) 
1940: 7b 0a 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  {.        RETURN
1950: 28 63 68 61 72 2c 20 28 28 63 68 61 72 2a 29 73  (char, ((char*)s
1960: 70 29 5b 2d 31 5d 29 3b 0a 20 20 20 20 20 20 7d  p)[-1]);.      }
1970: 20 65 6c 73 65 0a 20 20 20 20 20 20 69 66 20 28   else.      if (
1980: 6c 2d 3e 72 73 69 7a 65 20 3d 3d 20 73 69 7a 65  l->rsize == size
1990: 6f 66 28 73 68 6f 72 74 29 29 20 7b 0a 20 20 20  of(short)) {.   
19a0: 20 20 20 20 20 52 45 54 55 52 4e 28 73 68 6f 72       RETURN(shor
19b0: 74 2c 20 28 28 73 68 6f 72 74 2a 29 73 70 29 5b  t, ((short*)sp)[
19c0: 2d 31 5d 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  -1]);.      } el
19d0: 73 65 0a 20 20 20 20 20 20 69 66 20 28 6c 2d 3e  se.      if (l->
19e0: 72 73 69 7a 65 20 3d 3d 20 73 69 7a 65 6f 66 28  rsize == sizeof(
19f0: 69 6e 74 29 29 20 7b 0a 20 20 20 20 20 20 20 20  int)) {.        
1a00: 52 45 54 55 52 4e 28 69 6e 74 2c 20 28 28 69 6e  RETURN(int, ((in
1a10: 74 2a 29 73 70 29 5b 2d 31 5d 29 3b 0a 20 20 20  t*)sp)[-1]);.   
1a20: 20 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 20 20     } else.      
1a30: 69 66 20 28 6c 2d 3e 72 73 69 7a 65 20 3d 3d 20  if (l->rsize == 
1a40: 73 69 7a 65 6f 66 28 64 6f 75 62 6c 65 29 29 20  sizeof(double)) 
1a50: 7b 0a 20 20 20 20 20 20 20 20 28 28 69 6e 74 2a  {.        ((int*
1a60: 29 6c 2d 3e 72 61 64 64 72 29 5b 30 5d 20 3d 20  )l->raddr)[0] = 
1a70: 28 28 69 6e 74 2a 29 73 70 29 5b 2d 32 5d 3b 0a  ((int*)sp)[-2];.
1a80: 20 20 20 20 20 20 20 20 28 28 69 6e 74 2a 29 6c          ((int*)l
1a90: 2d 3e 72 61 64 64 72 29 5b 31 5d 20 3d 20 28 28  ->raddr)[1] = ((
1aa0: 69 6e 74 2a 29 73 70 29 5b 2d 31 5d 3b 0a 20 20  int*)sp)[-1];.  
1ab0: 20 20 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 20      } else.     
1ac0: 20 69 66 20 28 6c 2d 3e 72 73 69 7a 65 20 25 20   if (l->rsize % 
1ad0: 34 29 20 7b 0a 20 20 20 20 20 20 20 20 63 68 61  4) {.        cha
1ae0: 72 2a 20 64 73 74 61 64 64 72 20 3d 20 28 63 68  r* dstaddr = (ch
1af0: 61 72 2a 29 6c 2d 3e 72 61 64 64 72 3b 0a 20 20  ar*)l->raddr;.  
1b00: 20 20 20 20 20 20 63 68 61 72 2a 20 73 72 63 61        char* srca
1b10: 64 64 72 20 3d 20 28 63 68 61 72 2a 29 28 28 6c  ddr = (char*)((l
1b20: 6f 6e 67 29 73 70 20 2d 20 6c 2d 3e 72 73 69 7a  ong)sp - l->rsiz
1b30: 65 29 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  e);.        unsi
1b40: 67 6e 65 64 20 69 6e 74 20 63 6f 75 6e 74 20 3d  gned int count =
1b50: 20 6c 2d 3e 72 73 69 7a 65 3b 0a 20 20 20 20 20   l->rsize;.     
1b60: 20 20 20 69 66 20 28 63 6f 75 6e 74 20 3e 20 34     if (count > 4
1b70: 29 0a 20 20 20 20 20 20 20 20 20 20 73 72 63 61  ).          srca
1b80: 64 64 72 20 3d 20 28 63 68 61 72 2a 29 28 28 6c  ddr = (char*)((l
1b90: 6f 6e 67 29 73 72 63 61 64 64 72 20 26 20 2d 34  ong)srcaddr & -4
1ba0: 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
1bb0: 20 28 63 6f 75 6e 74 20 3e 20 30 29 20 7b 0a 20   (count > 0) {. 
1bc0: 20 20 20 20 20 20 20 20 20 2a 64 73 74 61 64 64           *dstadd
1bd0: 72 2b 2b 20 3d 20 2a 73 72 63 61 64 64 72 2b 2b  r++ = *srcaddr++
1be0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 75 6e  ;.          coun
1bf0: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t--;.        }. 
1c00: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
1c10: 20 20 20 20 20 20 5f 5f 61 76 77 6f 72 64 2a 20        __avword* 
1c20: 64 73 74 61 64 64 72 20 3d 20 28 5f 5f 61 76 77  dstaddr = (__avw
1c30: 6f 72 64 2a 29 6c 2d 3e 72 61 64 64 72 3b 0a 20  ord*)l->raddr;. 
1c40: 20 20 20 20 20 20 20 5f 5f 61 76 77 6f 72 64 2a         __avword*
1c50: 20 73 72 63 61 64 64 72 20 3d 20 28 5f 5f 61 76   srcaddr = (__av
1c60: 77 6f 72 64 2a 29 28 28 6c 6f 6e 67 29 73 70 20  word*)((long)sp 
1c70: 2d 20 6c 2d 3e 72 73 69 7a 65 29 3b 0a 20 20 20  - l->rsize);.   
1c80: 20 20 20 20 20 77 68 69 6c 65 20 28 73 72 63 61       while (srca
1c90: 64 64 72 20 3c 20 73 70 29 0a 20 20 20 20 20 20  ddr < sp).      
1ca0: 20 20 20 20 2a 64 73 74 61 64 64 72 2b 2b 20 3d      *dstaddr++ =
1cb0: 20 2a 73 72 63 61 64 64 72 2b 2b 3b 0a 20 20 20   *srcaddr++;.   
1cc0: 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
1cd0: 7b 0a 20 20 20 20 20 20 69 66 20 28 6c 2d 3e 66  {.      if (l->f
1ce0: 6c 61 67 73 20 26 20 5f 5f 41 56 5f 50 43 43 5f  lags & __AV_PCC_
1cf0: 53 54 52 55 43 54 5f 52 45 54 55 52 4e 29 20 7b  STRUCT_RETURN) {
1d00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 63 63 20  .        /* pcc 
1d10: 73 74 72 75 63 74 20 72 65 74 75 72 6e 20 63 6f  struct return co
1d20: 6e 76 65 6e 74 69 6f 6e 3a 20 6e 65 65 64 20 61  nvention: need a
1d30: 20 20 2a 28 54 59 50 45 2a 29 6c 2d 3e 72 61 64    *(TYPE*)l->rad
1d40: 64 72 20 3d 20 2a 28 54 59 50 45 2a 29 69 3b 20  dr = *(TYPE*)i; 
1d50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28   */.        if (
1d60: 6c 2d 3e 72 73 69 7a 65 20 3d 3d 20 73 69 7a 65  l->rsize == size
1d70: 6f 66 28 63 68 61 72 29 29 20 7b 0a 20 20 20 20  of(char)) {.    
1d80: 20 20 20 20 20 20 52 45 54 55 52 4e 28 63 68 61        RETURN(cha
1d90: 72 2c 20 2a 28 63 68 61 72 2a 29 69 29 3b 0a 20  r, *(char*)i);. 
1da0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 0a 20 20         } else.  
1db0: 20 20 20 20 20 20 69 66 20 28 6c 2d 3e 72 73 69        if (l->rsi
1dc0: 7a 65 20 3d 3d 20 73 69 7a 65 6f 66 28 73 68 6f  ze == sizeof(sho
1dd0: 72 74 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  rt)) {.         
1de0: 20 52 45 54 55 52 4e 28 73 68 6f 72 74 2c 20 2a   RETURN(short, *
1df0: 28 73 68 6f 72 74 2a 29 69 29 3b 0a 20 20 20 20  (short*)i);.    
1e00: 20 20 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 20      } else.     
1e10: 20 20 20 69 66 20 28 6c 2d 3e 72 73 69 7a 65 20     if (l->rsize 
1e20: 3d 3d 20 73 69 7a 65 6f 66 28 69 6e 74 29 29 20  == sizeof(int)) 
1e30: 7b 0a 20 20 20 20 20 20 20 20 20 20 52 45 54 55  {.          RETU
1e40: 52 4e 28 69 6e 74 2c 20 2a 28 69 6e 74 2a 29 69  RN(int, *(int*)i
1e50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  );.        } els
1e60: 65 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c 2d  e.        if (l-
1e70: 3e 72 73 69 7a 65 20 3d 3d 20 73 69 7a 65 6f 66  >rsize == sizeof
1e80: 28 64 6f 75 62 6c 65 29 29 20 7b 0a 20 20 20 20  (double)) {.    
1e90: 20 20 20 20 20 20 28 28 69 6e 74 2a 29 6c 2d 3e        ((int*)l->
1ea0: 72 61 64 64 72 29 5b 30 5d 20 3d 20 28 28 69 6e  raddr)[0] = ((in
1eb0: 74 2a 29 69 29 5b 30 5d 3b 0a 20 20 20 20 20 20  t*)i)[0];.      
1ec0: 20 20 20 20 28 28 69 6e 74 2a 29 6c 2d 3e 72 61      ((int*)l->ra
1ed0: 64 64 72 29 5b 31 5d 20 3d 20 28 28 69 6e 74 2a  ddr)[1] = ((int*
1ee0: 29 69 29 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  )i)[1];.        
1ef0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
1f00: 20 20 20 69 6e 74 20 6e 20 3d 20 28 6c 2d 3e 72     int n = (l->r
1f10: 73 69 7a 65 20 2b 20 73 69 7a 65 6f 66 28 5f 5f  size + sizeof(__
1f20: 61 76 77 6f 72 64 29 2d 31 29 2f 73 69 7a 65 6f  avword)-1)/sizeo
1f30: 66 28 5f 5f 61 76 77 6f 72 64 29 3b 0a 20 20 20  f(__avword);.   
1f40: 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 2d 2d         while (--
1f50: 6e 20 3e 3d 20 30 29 0a 20 20 20 20 20 20 20 20  n >= 0).        
1f60: 20 20 20 20 28 28 5f 5f 61 76 77 6f 72 64 2a 29      ((__avword*)
1f70: 6c 2d 3e 72 61 64 64 72 29 5b 6e 5d 20 3d 20 28  l->raddr)[n] = (
1f80: 28 5f 5f 61 76 77 6f 72 64 2a 29 69 29 5b 6e 5d  (__avword*)i)[n]
1f90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fa0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1fb0: 20 20 20 2f 2a 20 6e 6f 72 6d 61 6c 20 73 74 72     /* normal str
1fc0: 75 63 74 20 72 65 74 75 72 6e 20 63 6f 6e 76 65  uct return conve
1fd0: 6e 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ntion */.       
1fe0: 20 69 66 20 28 6c 2d 3e 66 6c 61 67 73 20 26 20   if (l->flags & 
1ff0: 5f 5f 41 56 5f 53 4d 41 4c 4c 5f 53 54 52 55 43  __AV_SMALL_STRUC
2000: 54 5f 52 45 54 55 52 4e 29 20 7b 0a 20 20 20 20  T_RETURN) {.    
2010: 20 20 20 20 20 20 69 66 20 28 6c 2d 3e 72 73 69        if (l->rsi
2020: 7a 65 20 3d 3d 20 73 69 7a 65 6f 66 28 63 68 61  ze == sizeof(cha
2030: 72 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  r)) {.          
2040: 20 20 52 45 54 55 52 4e 28 63 68 61 72 2c 20 69    RETURN(char, i
2050: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  );.          } e
2060: 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 69 66  lse.          if
2070: 20 28 6c 2d 3e 72 73 69 7a 65 20 3d 3d 20 73 69   (l->rsize == si
2080: 7a 65 6f 66 28 73 68 6f 72 74 29 29 20 7b 0a 20  zeof(short)) {. 
2090: 20 20 20 20 20 20 20 20 20 20 20 52 45 54 55 52             RETUR
20a0: 4e 28 73 68 6f 72 74 2c 20 69 29 3b 0a 20 20 20  N(short, i);.   
20b0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 0a 20 20         } else.  
20c0: 20 20 20 20 20 20 20 20 69 66 20 28 6c 2d 3e 72          if (l->r
20d0: 73 69 7a 65 20 3d 3d 20 73 69 7a 65 6f 66 28 69  size == sizeof(i
20e0: 6e 74 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  nt)) {.         
20f0: 20 20 20 52 45 54 55 52 4e 28 69 6e 74 2c 20 69     RETURN(int, i
2100: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2110: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2120: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2130: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66  urn 0;.}..#endif
2140: 20 2f 2a 5f 61 76 63 61 6c 6c 5f 73 70 61 72 63   /*_avcall_sparc
2150: 5f 63 20 2a 2f 0a                                _c */.