1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation
2425bb815Sopenharmony_ci *
3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License.
5425bb815Sopenharmony_ci * You may obtain a copy of the License at
6425bb815Sopenharmony_ci *
7425bb815Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8425bb815Sopenharmony_ci *
9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS
11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and
13425bb815Sopenharmony_ci * limitations under the License.
14425bb815Sopenharmony_ci */
15425bb815Sopenharmony_ci
16425bb815Sopenharmony_ci.syntax unified
17425bb815Sopenharmony_ci
18425bb815Sopenharmony_ci.macro func _name
19425bb815Sopenharmony_ci.global \_name
20425bb815Sopenharmony_ci.type \_name, %function
21425bb815Sopenharmony_ci\_name:
22425bb815Sopenharmony_ci.endm
23425bb815Sopenharmony_ci.macro endfunc _name
24425bb815Sopenharmony_ci.size \_name, .-\_name
25425bb815Sopenharmony_ci.endm
26425bb815Sopenharmony_ci
27425bb815Sopenharmony_ci/**
28425bb815Sopenharmony_ci * setjmp (jmp_buf env)
29425bb815Sopenharmony_ci *
30425bb815Sopenharmony_ci * See also:
31425bb815Sopenharmony_ci *          longjmp
32425bb815Sopenharmony_ci *
33425bb815Sopenharmony_ci * @return 0 - if returns from direct call,
34425bb815Sopenharmony_ci *         nonzero - if returns after longjmp.
35425bb815Sopenharmony_ci */
36425bb815Sopenharmony_cifunc setjmp
37425bb815Sopenharmony_ci  stmia r0!, {r4 - r11, lr}
38425bb815Sopenharmony_ci  str sp, [r0], #4
39425bb815Sopenharmony_ci  vstm r0, {s16 - s31}
40425bb815Sopenharmony_ci  mov r0, #0
41425bb815Sopenharmony_ci  bx lr
42425bb815Sopenharmony_ciendfunc setjmp
43425bb815Sopenharmony_ci
44425bb815Sopenharmony_ci/**
45425bb815Sopenharmony_ci * longjmp (jmp_buf env, int val)
46425bb815Sopenharmony_ci *
47425bb815Sopenharmony_ci * Note:
48425bb815Sopenharmony_ci *      if val is not 0, then it would be returned from setjmp,
49425bb815Sopenharmony_ci *      otherwise - 0 would be returned.
50425bb815Sopenharmony_ci *
51425bb815Sopenharmony_ci * See also:
52425bb815Sopenharmony_ci *          setjmp
53425bb815Sopenharmony_ci */
54425bb815Sopenharmony_cifunc longjmp
55425bb815Sopenharmony_ci  ldmia r0!, {r4 - r11, lr}
56425bb815Sopenharmony_ci  ldr sp, [r0]
57425bb815Sopenharmony_ci  add r0, r0, #4
58425bb815Sopenharmony_ci  vldm r0, {s16 - s31}
59425bb815Sopenharmony_ci  mov r0, r1
60425bb815Sopenharmony_ci  cmp r0, #0
61425bb815Sopenharmony_ci  bne 1f
62425bb815Sopenharmony_ci  mov r0, #1
63425bb815Sopenharmony_ci  1:
64425bb815Sopenharmony_ci  bx lr
65425bb815Sopenharmony_ciendfunc longjmp
66