Imported from ../bash-1.14.7.tar.gz.
[platform/upstream/bash.git] / lib / malloclib / x386-alloca.s
1 ;; alloca386.s 1.2
2 ;; GNU-compatible stack allocation function for Xenix/386.
3 ;; Written by Chip Salzenberg at ComDev.
4 ;; Last modified 90/01/11
5 ;;> Is your alloca clearly better than the one in i386-alloca.s?  I haven't
6 ;;> looked at either.
7 ;;
8 ;;They're different because Xenix/386 has a different assembler.  SCO
9 ;;Xenix has the Microsoft C compiler and the Microsoft macro assembler,
10 ;;called "masm".  MASM's assembler syntax is quite different from AT&T's
11 ;;in all sorts of ways.  Xenix people can't use the AT&T version.
12 ;;-- 
13 ;;Chip Salzenberg at ComDev/TCT     <chip@tct.uucp>, <uunet!ateng!tct!chip>
14
15         TITLE   $alloca386
16
17         .386
18 DGROUP  GROUP   CONST, _BSS, _DATA
19 _DATA   SEGMENT  DWORD USE32 PUBLIC 'DATA'
20 _DATA      ENDS
21 _BSS    SEGMENT  DWORD USE32 PUBLIC 'BSS'
22 _BSS      ENDS
23 CONST   SEGMENT  DWORD USE32 PUBLIC 'CONST'
24 CONST      ENDS
25 _TEXT   SEGMENT  DWORD USE32 PUBLIC 'CODE'
26         ASSUME   CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
27
28         PUBLIC  _alloca
29 _alloca PROC NEAR
30
31 ; Get argument.
32         pop     edx             ; edx -> return address
33         pop     eax             ; eax = amount to allocate
34
35 ; Validate allocation amount.
36         add     eax,3
37         and     eax,not 3
38         cmp     eax,0
39         jg      aa_size_ok
40         mov     eax,4
41 aa_size_ok:
42
43 ; Allocate stack space.
44         mov     ecx,esp         ; ecx -> old stack pointer
45         sub     esp,eax         ; perform allocation
46         mov     eax,esp         ; eax -> new stack pointer
47
48 ; Copy the three saved register variables from old stack top to new stack top.
49 ; They may not be there.  So we waste twelve bytes.  Big fat hairy deal.
50         push    DWORD PTR 8[ecx]
51         push    DWORD PTR 4[ecx]
52         push    DWORD PTR 0[ecx]
53
54 ; Push something so the caller can pop it off.
55         push    eax
56
57 ; Return to caller.
58         jmp     edx
59
60 _alloca ENDP
61
62 _TEXT   ENDS
63         END