1129198Scognet/* $NetBSD: bus_space_asm_generic.S,v 1.3 2003/03/27 19:46:14 mycroft Exp $ */ 2129198Scognet 3139735Simp/*- 4129198Scognet * Copyright (c) 1997 Causality Limited. 5129198Scognet * Copyright (c) 1997 Mark Brinicombe. 6129198Scognet * All rights reserved. 7129198Scognet * 8129198Scognet * Redistribution and use in source and binary forms, with or without 9129198Scognet * modification, are permitted provided that the following conditions 10129198Scognet * are met: 11129198Scognet * 1. Redistributions of source code must retain the above copyright 12129198Scognet * notice, this list of conditions and the following disclaimer. 13129198Scognet * 2. Redistributions in binary form must reproduce the above copyright 14129198Scognet * notice, this list of conditions and the following disclaimer in the 15129198Scognet * documentation and/or other materials provided with the distribution. 16129198Scognet * 3. All advertising materials mentioning features or use of this software 17129198Scognet * must display the following acknowledgement: 18129198Scognet * This product includes software developed by Mark Brinicombe 19129198Scognet * for the NetBSD Project. 20129198Scognet * 4. The name of the company nor the name of the author may be used to 21129198Scognet * endorse or promote products derived from this software without specific 22129198Scognet * prior written permission. 23129198Scognet * 24129198Scognet * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 25129198Scognet * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 26129198Scognet * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27129198Scognet * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 28129198Scognet * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29129198Scognet * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 30129198Scognet * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31129198Scognet * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32129198Scognet * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33129198Scognet * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34129198Scognet * SUCH DAMAGE. 35129198Scognet * 36129198Scognet */ 37129198Scognet 38129198Scognet#include <machine/asm.h> 39129198Scognet#include <machine/cpuconf.h> 40129198Scognet__FBSDID("$FreeBSD$"); 41129198Scognet 42129198Scognet/* 43129198Scognet * Generic bus_space functions. 44129198Scognet */ 45129198Scognet 46129198Scognet/* 47129198Scognet * read single 48129198Scognet */ 49129198Scognet 50129198ScognetENTRY(generic_bs_r_1) 51129198Scognet ldrb r0, [r1, r2] 52137463Scognet RET 53129198Scognet 54129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 55129198ScognetENTRY(generic_armv4_bs_r_2) 56129198Scognet ldrh r0, [r1, r2] 57137463Scognet RET 58129198Scognet#endif 59129198Scognet 60129198ScognetENTRY(generic_bs_r_4) 61129198Scognet ldr r0, [r1, r2] 62137463Scognet RET 63129198Scognet 64129198Scognet/* 65129198Scognet * write single 66129198Scognet */ 67129198Scognet 68129198ScognetENTRY(generic_bs_w_1) 69129198Scognet strb r3, [r1, r2] 70137463Scognet RET 71129198Scognet 72129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 73129198ScognetENTRY(generic_armv4_bs_w_2) 74129198Scognet strh r3, [r1, r2] 75137463Scognet RET 76129198Scognet#endif 77129198Scognet 78129198ScognetENTRY(generic_bs_w_4) 79129198Scognet str r3, [r1, r2] 80137463Scognet RET 81129198Scognet 82129198Scognet/* 83129198Scognet * read multiple 84129198Scognet */ 85129198Scognet 86129198ScognetENTRY(generic_bs_rm_1) 87129198Scognet add r0, r1, r2 88129198Scognet mov r1, r3 89129198Scognet ldr r2, [sp, #0] 90129198Scognet teq r2, #0 91137463Scognet RETeq 92129198Scognet 93129198Scognet1: ldrb r3, [r0] 94129198Scognet strb r3, [r1], #1 95129198Scognet subs r2, r2, #1 96129198Scognet bne 1b 97129198Scognet 98137463Scognet RET 99129198Scognet 100129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 101129198ScognetENTRY(generic_armv4_bs_rm_2) 102129198Scognet add r0, r1, r2 103129198Scognet mov r1, r3 104129198Scognet ldr r2, [sp, #0] 105129198Scognet teq r2, #0 106137463Scognet RETeq 107129198Scognet 108129198Scognet1: ldrh r3, [r0] 109129198Scognet strh r3, [r1], #2 110129198Scognet subs r2, r2, #1 111129198Scognet bne 1b 112129198Scognet 113137463Scognet RET 114129198Scognet#endif 115129198Scognet 116129198ScognetENTRY(generic_bs_rm_4) 117129198Scognet add r0, r1, r2 118129198Scognet mov r1, r3 119129198Scognet ldr r2, [sp, #0] 120129198Scognet teq r2, #0 121137463Scognet RETeq 122129198Scognet 123129198Scognet1: ldr r3, [r0] 124129198Scognet str r3, [r1], #4 125129198Scognet subs r2, r2, #1 126129198Scognet bne 1b 127129198Scognet 128137463Scognet RET 129129198Scognet 130129198Scognet/* 131129198Scognet * write multiple 132129198Scognet */ 133129198Scognet 134129198ScognetENTRY(generic_bs_wm_1) 135129198Scognet add r0, r1, r2 136129198Scognet mov r1, r3 137129198Scognet ldr r2, [sp, #0] 138129198Scognet teq r2, #0 139137463Scognet RETeq 140129198Scognet 141129198Scognet1: ldrb r3, [r1], #1 142129198Scognet strb r3, [r0] 143129198Scognet subs r2, r2, #1 144129198Scognet bne 1b 145129198Scognet 146137463Scognet RET 147129198Scognet 148129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 149129198ScognetENTRY(generic_armv4_bs_wm_2) 150129198Scognet add r0, r1, r2 151129198Scognet mov r1, r3 152129198Scognet ldr r2, [sp, #0] 153129198Scognet teq r2, #0 154137463Scognet RETeq 155129198Scognet 156129198Scognet1: ldrh r3, [r1], #2 157129198Scognet strh r3, [r0] 158129198Scognet subs r2, r2, #1 159129198Scognet bne 1b 160129198Scognet 161137463Scognet RET 162129198Scognet#endif 163129198Scognet 164129198ScognetENTRY(generic_bs_wm_4) 165129198Scognet add r0, r1, r2 166129198Scognet mov r1, r3 167129198Scognet ldr r2, [sp, #0] 168129198Scognet teq r2, #0 169137463Scognet RETeq 170129198Scognet 171129198Scognet1: ldr r3, [r1], #4 172129198Scognet str r3, [r0] 173129198Scognet subs r2, r2, #1 174129198Scognet bne 1b 175129198Scognet 176137463Scognet RET 177129198Scognet 178129198Scognet/* 179129198Scognet * read region 180129198Scognet */ 181129198Scognet 182129198ScognetENTRY(generic_bs_rr_1) 183129198Scognet add r0, r1, r2 184129198Scognet mov r1, r3 185129198Scognet ldr r2, [sp, #0] 186129198Scognet teq r2, #0 187137463Scognet RETeq 188129198Scognet 189129198Scognet1: ldrb r3, [r0], #1 190129198Scognet strb r3, [r1], #1 191129198Scognet subs r2, r2, #1 192129198Scognet bne 1b 193129198Scognet 194137463Scognet RET 195129198Scognet 196129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 197129198ScognetENTRY(generic_armv4_bs_rr_2) 198129198Scognet add r0, r1, r2 199129198Scognet mov r1, r3 200129198Scognet ldr r2, [sp, #0] 201129198Scognet teq r2, #0 202137463Scognet RETeq 203129198Scognet 204129198Scognet1: ldrh r3, [r0], #2 205129198Scognet strh r3, [r1], #2 206129198Scognet subs r2, r2, #1 207129198Scognet bne 1b 208129198Scognet 209137463Scognet RET 210129198Scognet#endif 211129198Scognet 212129198ScognetENTRY(generic_bs_rr_4) 213129198Scognet add r0, r1, r2 214129198Scognet mov r1, r3 215129198Scognet ldr r2, [sp, #0] 216129198Scognet teq r2, #0 217137463Scognet RETeq 218129198Scognet 219129198Scognet1: ldr r3, [r0], #4 220129198Scognet str r3, [r1], #4 221129198Scognet subs r2, r2, #1 222129198Scognet bne 1b 223129198Scognet 224137463Scognet RET 225129198Scognet 226129198Scognet/* 227129198Scognet * write region. 228129198Scognet */ 229129198Scognet 230129198ScognetENTRY(generic_bs_wr_1) 231129198Scognet add r0, r1, r2 232129198Scognet mov r1, r3 233129198Scognet ldr r2, [sp, #0] 234129198Scognet teq r2, #0 235137463Scognet RETeq 236129198Scognet 237129198Scognet1: ldrb r3, [r1], #1 238129198Scognet strb r3, [r0], #1 239129198Scognet subs r2, r2, #1 240129198Scognet bne 1b 241129198Scognet 242137463Scognet RET 243129198Scognet 244129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 245129198ScognetENTRY(generic_armv4_bs_wr_2) 246129198Scognet add r0, r1, r2 247129198Scognet mov r1, r3 248129198Scognet ldr r2, [sp, #0] 249129198Scognet teq r2, #0 250137463Scognet RETeq 251129198Scognet 252129198Scognet1: ldrh r3, [r1], #2 253129198Scognet strh r3, [r0], #2 254129198Scognet subs r2, r2, #1 255129198Scognet bne 1b 256129198Scognet 257137463Scognet RET 258129198Scognet#endif 259129198Scognet 260129198ScognetENTRY(generic_bs_wr_4) 261129198Scognet add r0, r1, r2 262129198Scognet mov r1, r3 263129198Scognet ldr r2, [sp, #0] 264129198Scognet teq r2, #0 265137463Scognet RETeq 266129198Scognet 267129198Scognet1: ldr r3, [r1], #4 268129198Scognet str r3, [r0], #4 269129198Scognet subs r2, r2, #1 270129198Scognet bne 1b 271129198Scognet 272137463Scognet RET 273129198Scognet 274129198Scognet/* 275129198Scognet * set region 276129198Scognet */ 277129198Scognet 278129198ScognetENTRY(generic_bs_sr_1) 279129198Scognet add r0, r1, r2 280129198Scognet mov r1, r3 281129198Scognet ldr r2, [sp, #0] 282129198Scognet teq r2, #0 283137463Scognet RETeq 284129198Scognet 285129198Scognet1: strb r1, [r0], #1 286129198Scognet subs r2, r2, #1 287129198Scognet bne 1b 288129198Scognet 289137463Scognet RET 290129198Scognet 291129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 292129198ScognetENTRY(generic_armv4_bs_sr_2) 293129198Scognet add r0, r1, r2 294129198Scognet mov r1, r3 295129198Scognet ldr r2, [sp, #0] 296129198Scognet teq r2, #0 297137463Scognet RETeq 298129198Scognet 299129198Scognet1: strh r1, [r0], #2 300129198Scognet subs r2, r2, #1 301129198Scognet bne 1b 302129198Scognet 303137463Scognet RET 304129198Scognet#endif 305129198Scognet 306129198ScognetENTRY(generic_bs_sr_4) 307129198Scognet add r0, r1, r2 308129198Scognet mov r1, r3 309129198Scognet ldr r2, [sp, #0] 310129198Scognet teq r2, #0 311137463Scognet RETeq 312129198Scognet 313129198Scognet1: str r1, [r0], #4 314129198Scognet subs r2, r2, #1 315129198Scognet bne 1b 316129198Scognet 317137463Scognet RET 318129198Scognet 319129198Scognet/* 320129198Scognet * copy region 321129198Scognet */ 322129198Scognet 323129198Scognet#if (ARM_ARCH_4 + ARM_ARCH_5) > 0 324129198ScognetENTRY(generic_armv4_bs_c_2) 325129198Scognet add r0, r1, r2 326129198Scognet ldr r2, [sp, #0] 327129198Scognet add r1, r2, r3 328129198Scognet ldr r2, [sp, #4] 329129198Scognet teq r2, #0 330137463Scognet RETeq 331129198Scognet 332129198Scognet cmp r0, r1 333129198Scognet blt 2f 334129198Scognet 335129198Scognet1: ldrh r3, [r0], #2 336129198Scognet strh r3, [r1], #2 337129198Scognet subs r2, r2, #1 338129198Scognet bne 1b 339129198Scognet 340137463Scognet RET 341129198Scognet 342129198Scognet2: add r0, r0, r2, lsl #1 343129198Scognet add r1, r1, r2, lsl #1 344129198Scognet sub r0, r0, #2 345129198Scognet sub r1, r1, #2 346129198Scognet 347129198Scognet3: ldrh r3, [r0], #-2 348129198Scognet strh r3, [r1], #-2 349129198Scognet subs r2, r2, #1 350129198Scognet bne 3b 351129198Scognet 352137463Scognet RET 353129198Scognet#endif 354