Cygwin: access: Fix X_OK behaviour for backup operators and admins
[newlib-cygwin.git] / newlib / libc / sys / mmixware / setjmp.S
blob862273dd5081942c54688094b24e0bc4ed48434d
1 /* Setjmp and longjmp for mmix.
3    Copyright (C) 2001 Hans-Peter Nilsson
5    Permission to use, copy, modify, and distribute this software is
6    freely granted, provided that the above copyright notice, this notice
7    and the following disclaimer are preserved with no changes.
9    THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
10    IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
11    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
12    PURPOSE.
14    jmp_buf[5]:
15    0:   fp
16    1:   rJ (return-address)
17    2:   sp
18    3:   rO *before* the setjmp call.
19    4:   temporary storage.  Reserved between setjmp and longjmp.  */
21 #ifdef __MMIX_ABI_GNU__
22 #define arg1 $231
23 #define arg2 $232
24 #define outret $231
25 #define popval 0
26 #else
27 #define arg1 $0
28 #define arg2 $1
29 #define outret $0
30 #define popval 1
31 #endif
33         .section .text.setjmp,"ax",@progbits
34         .global setjmp
35 setjmp:
36 % Store fp, sp and return address.  Recycle the static-chain and
37 % structure-return registers as temporary register, since we need to keep
38 % the jmp_buf (parameter 1) and the return address across a "POP".
39         SET  $251,arg1
40         STOU $253,$251,0
41         GET  $252,rJ
42         STOU $252,$251,8
43         STOU $254,$251,16
44         SETL outret,0
46 % Jump through hoops to get the value of rO *before* the setjmp call.
47         GETA $255,0f
48         PUT  rJ,$255
49         POP  popval,0
51         GET  $255,rO
52         STOU $255,$251,24
53         GO   $255,$252,0
54         .size setjmp,.-setjmp
56         .section .text.longjmp,"ax",@progbits
57         .global longjmp
58 longjmp:
59 % Reset arg2 to 1 if it is 0 (see longjmp(2)) and store it in jmp_buf.
60 % Save arg1 in a global register, since it will be destroyed by the POPs
61 % (in the mmixware ABI).
62         CSZ  arg2,arg2,1
63         STOU arg2,arg1,32
64         SET  $251,arg1
66 % Loop and "POP 0,0" until rO is the expected value, like
67 % the expansion of nonlocal_goto_receiver, except that we put the return
68 % value in the right register and make sure that the POP causes it to
69 % enter the right return-value register as seen by the caller.  For the
70 % GNU ABI, it is unnecessary to do this in the loop and perhaps the memory
71 % access can be hoisted outside the loop, but this is safe and simple and
72 % I see no need to optimize longjmps.
73         GETA $255,0f
74         PUT  rJ,$255
75         LDOU $255,$251,24
77         GET  $252,rO
78         CMPU $252,$252,$255
79         BNP  $252,1f
80         LDOU outret,$251,32
81         POP  popval,0
83         LDOU $253,$251,0
84         LDOU $255,$251,8
85         LDOU $254,$251,16
86         GO   $255,$255,0
87         .size longjmp,.-longjmp