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 */.