source: trunk/source/lisp-kernel/arm-asmutils.s @ 15425

Last change on this file since 15425 was 15425, checked in by gb, 7 years ago

armcl. armcl.image: new binaries
compiler/ARM/arm-arch.lisp: add tcr.architecture-version. Bump fasl version,

image version.

compiler/ARM/arm-asm.lisp: don't define ARMv7-specific instructions.
compiler/ARM/arm-lap.lisp: new :opcode directive, assembles arbitrary word

in code section.

compiler/ARM/arm-lapmacros.lisp: don't use v7-specific instructions. Define

clrex, dmb as macros which test architecture version at runtime. Remove
some unused things.

compiler/ARM/arm-vinsns.lisp: don't use v7-specific instructions. Remove

some more unused things.

compiler/ARM/arm2.lisp: Remove still more unused things.
level-0/ARM/arm-bignum.lisp: don't use v7-specific instructions.
level-0/l0-cfm-support.lisp: hack to try to avoid treating dynamic linker

as a shared library on Linux. (Different dynamic linkers are used for
softfp/hard float on ARM; we don't a saved image to try to re-open the
wrong one.

level-1/arm-callback-support.lisp: don't use movw instruction in callback

trampolines.

lisp-kernel/arm-asmutils.s: don't use v7-specific instructions (unless we're

sure that we're on v7 or later.)

lisp-kernel/arm-constants.h: tcr.architecture_version. Bump image version.

Define ARM CPU architecture constants.

lisp-kernel/arm-constants.s: tcr.architecture_version.
lisp-kernel/arm-macros.s: define _clrex and _dmb macros which test

tcr.arm_architecture_version at runtime.

lisp-kernel/arm-spentry.s: use _clrex macro. In _SPcheck_fpu_exception,

look for offending instuction 4 bytes further before lr (change in
subprim call mechanism.)

lisp-kernel/linuxarm/Makefile: compile/assemble for ARMv6.
lisp-kernel/lisp_globals.s: don't need to define NUM_LISP_GLOBALS anymore.
lisp-kernel/pmcl-kernel.c: check_arm_cpu() accepts ARMv6 or later.
lisp-kernel/thread-manager.c: when creating a TCR on ARM, set

tcr.architecture_version to fixnum representation of architecture - 7 (so
ARMv6 is -1, ARMv7 is 0, etc.)

File size: 5.4 KB
RevLine 
[14119]1/*   Copyright (C) 2009 Clozure Associates */
2/*   Copyright (C) 1994-2001 Digitool, Inc */
3/*   This file is part of Clozure CL. */
4
5/*   Clozure CL is licensed under the terms of the Lisp Lesser GNU Public */
6/*   License , known as the LLGPL and distributed with Clozure CL as the */
7/*   file "LICENSE".  The LLGPL consists of a preamble and the LGPL, */
8/*   which is distributed with Clozure CL as the file "LGPL".  Where these */
9/*   conflict, the preamble takes precedence. */
10
11/*   Clozure CL is referenced in the preamble as the "LIBRARY." */
12
13/*   The LLGPL is also available online at */
14/*   http://opensource.franz.com/preamble.html */
15
16
17        .syntax unified
18        .arm   
19
20        include(lisp.s)
21
22        _beginfile
23
[14184]24/* Force data from r0, size r1 into the icache */       
[14119]25_exportfn(C(flush_cache_lines))
26        __ifdef(`LINUX')
[14184]27        __(add r1,r1,r0)
[14119]28        __(mov r2,#0)           /* options.  Pass as 0 until we know better */
29        __(mov r12,r7)          /* preserve r7 ;  r12 saved by syscall */
30        __(mov r7,#0x0f0000)     /* __ARM_NR_cacheflush */
31        __(add r7,r7,#2)
32        __(svc #0)
33        __(mov r7,r12)
34        __endif
[14184]35        __ifdef(`DARWIN')
36        __(mov r3,#0)
37        __(mov r12,#0x80000000)
38        __(svc #0)
[15093]39        __endif   
[14119]40        __(bx lr)
41
42_exportfn(C(touch_page))
43        __(str r0,[r0,#0])
44        __(mov r1,#0)
45        __(str r1,[r0,#0])
46        __(mov r0,#1)
47        .globl C(touch_page_end)
48C(touch_page_end):     
49        __(bx lr)
50_endfn       
51                               
52_exportfn(C(current_stack_pointer))
53        __(mov r0,sp)
54        __(bx lr)
55_endfn
56       
57_exportfn(C(count_leading_zeros))
58        __(clz r0,r0)
59        __(bx lr)
60_endfn
61
62_exportfn(C(noop))
63        __(bx lr)
64_endfn
65
66
67
68
69
70/* Atomically store new value (r2) in *r0, if old value == expected (r1). */
71/* Return actual old value. */
[15425]72        .globl C(arm_architecture_version)
[14119]73_exportfn(C(store_conditional))
740:      __(ldrex r3,[r0])
75        __(cmp r3,r1)
76        __(bne 1f)
77        __(strex ip,r2,[r0])
78        __(cmp ip,#0)
79        __(bne 0b)
80        __(b 2f)
[15425]811:      __(adr ip,3f)
82        __(ldr ip,[ip])
83        __(ldr ip,[ip])
84        __(cmp ip,#7)
85        __(blt 2f)
86        .long 0xf57ff01f
[14119]872:      __(mov r0,r3)
[15425]88        __(bx lr)   
893:      .long C(arm_architecture_version)                     
[14119]90_endfn
91
92/* Atomically store new_value(r1) in *r0 ;  return previous contents */
93/* of *r0. */
94
95_exportfn(C(atomic_swap))
96        __(mov r2,r0)
[14949]970:      __(ldrex r0,[r2])
[14950]98        __(strex r3,r1,[r2])
[14949]99        __(cmp r3,#0)
100        __(bne 0b)       
[14119]101        __(bx lr)
102_endfn
103
104/* Logior the value in *r0 with the value in r1 (presumably a bitmask with exactly 1 */
105/* bit set.)  Return non-zero if any of the bits in that bitmask were already set. */
106       
107_exportfn(C(atomic_ior))
108        __(stmdb sp!,{r4,lr})
1090:      __(ldrex r2,[r0])
110        __(orr r3,r2,r1)
111        __(strex r4,r3,[r0])
112        __(cmp r4,#0)
113        __(bne 0b)
114        __(mov r0,r2)
115        __(ldmia sp!,{r4,pc})
116_endfn
117
118
119/* Logand the value in *r0 with the value in r1 (presumably a bitmask with exactly 1 */
120/* bit set.)  Return the value now in *r0 (for some value of "now" */
121
122_exportfn(C(atomic_and))
1230:      __(ldrex r2,[r0])
124        __(and r2,r2,r1)
125        __(strex r3,r2,[r0])
126        __(cmp r3,#0)
127        __(bne 0b)
128        __(mov r0,r2)
129        __(bx lr)
130_endfn
131               
132       
133        __ifdef(`DARWIN')
134_exportfn(C(enable_fp_exceptions))
135        __(.long 0)
136        __(bx lr)
137_endfn
138       
139_exportfn(C(disable_fp_exceptions))
140        __(.long 0)
141        __(bx lr)
142_endfn
143
144_exportfn(C(pseudo_sigreturn))
[14169]145        __(uuo_pseudo_sigreturn())
[14119]146        __(b C(pseudo_sigreturn))
147_endfn
148        __endif
149       
150_exportfn(C(save_fp_context))
151        __(uuo_debug_trap(al))
152_endfn         
153_exportfn(C(restore_fp_context))
154        __(uuo_debug_trap(al))
155_endfn         
156_exportfn(C(put_vector_registers))
157        __(uuo_debug_trap(al))
158_endfn         
159_exportfn(C(get_vector_registers))
160        __(uuo_debug_trap(al))
[14549]161_endfn
162       
163        __ifdef(`ANDROID')
164_exportfn(rt_sigprocmask)
165        __(stmdb sp!,{r7,lr})
166        __(mov r7,#175)
167        __(svc #0)
168        __(ldmia sp!,{r7,pc})
169_endfn
170        __endif
171       
[14119]172
173        __ifdef(`DARWIN')
[14169]174/* divide the 64-bit unsigned integer in r0/r1 by the 64-bit unsigned
175   integer in r2/r3; return the 64-bit quotient in r0/r1 and the 64-bit
176   remainder in r2/r3.  Implement this in terms of the libgcc function: 
177
178   unsigned long long __udivti3 (unsigned long long a, 
179                                 unsigned long long b, 
180                                 unsigned long long *c)
181*/       
[14119]182_exportfn(C(__aeabi_uldivmod))
[14169]183        __(stmdb sp!,{r7,lr})
184        __(mov r7,sp)
185        __(sub sp,sp,#8)
186        __(mov ip,sp)
187        __(push1(ip,sp))
188        __(push1(ip,sp))
189        __(bl C(__udivmoddi4))
190        __(add sp,sp,#8)
191        __(ldmia sp!,{r2,r3})
192        __(ldmia sp!,{r7,pc})
[14119]193_endfn               
194        __endif
195
196_exportfn(call_handler_on_main_stack)
197        __(ldr ip,[sp])
198        __(mov lr,r3)
199        __(mov sp,r1)
200        __(bx ip)
201_endfn               
[14549]202
[15229]203/* zero N (r1) dnodes, starting at the dnode-aligned address in r0 */
204_exportfn(C(zero_dnodes))
205        __(cmp r1,#0)
206        __(adr r2,2f)
207        __(fldd d0,[r2,#0])
208        __(b 1f)
2090:      __(subs r1,r1,#1)
210        __(fstd d0,[r0])
211        __(add r0,r0,#dnode_size)       
2121:      __(bne 0b)
213        __(bx lr)
214        .align 3
2152:      .long 0
216        .long 0       
217_endfn                       
[14549]218                               
[14119]219        _endfile
220
Note: See TracBrowser for help on using the repository browser.