|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * @OSF_FREE_COPYRIGHT@ ! 24: * ! 25: */ ! 26: ! 27: /* Routines to perform high-speed scrolling, assuming that the memory is ! 28: * non-cached, and that the amount of memory to be scrolled is a multiple ! 29: * of (at least) 16. ! 30: */ ! 31: ! 32: #include <ppc/asm.h> ! 33: #include <ppc/proc_reg.h> ! 34: ! 35: /* ! 36: * void video_scroll_up(unsigned long start, ! 37: * unsigned long end, ! 38: * unsigned long dest) ! 39: */ ! 40: ! 41: ENTRY(video_scroll_up, TAG_NO_FRAME_USED) ! 42: ! 43: mfmsr r0 /* Get the MSR */ ! 44: mflr r6 /* Get the LR */ ! 45: ori r7,r0,1<<(31-MSR_FP_BIT) /* Turn on floating point */ ! 46: stwu r1,-(FM_SIZE+16)(r1) /* Get space for a couple of registers on stack */ ! 47: rlwinm r7,r7,0,MSR_EE_BIT+1,MSR_EE_BIT-1 /* Turn off interrupts */ ! 48: stw r6,(FM_SIZE+16+FM_LR_SAVE)(r1) /* Save the return */ ! 49: ! 50: mtmsr r7 /* Turn on FPU */ ! 51: isync /* Wait for it */ ! 52: ! 53: vsufpuon1: stfd f0,(FM_SIZE+0)(r1) /* Save one register */ ! 54: stfd f1,(FM_SIZE+8)(r1) /* and the second */ ! 55: ! 56: stw r0,(FM_SIZE+FM_LR_SAVE)(r1) /* Save return */ ! 57: ! 58: /* ok, now we can use the FPU registers to do some fast copying ! 59: */ ! 60: ! 61: .L_vscr_up_loop: ! 62: lfd f0, 0(r3) ! 63: lfd f1, 8(r3) ! 64: ! 65: addi r3, r3, 16 ! 66: ! 67: stfd f0, 0(r5) ! 68: ! 69: cmpl cr0, r3, r4 ! 70: ! 71: stfd f1, 8(r5) ! 72: ! 73: addi r5, r5, 16 ! 74: ! 75: blt+ cr0, .L_vscr_up_loop ! 76: ! 77: lfd f0,(FM_SIZE+0)(r1) /* Load back one register */ ! 78: lfd f1,(FM_SIZE+8)(r1) /* and the second */ ! 79: lwz r1,0(r1) /* Pop the stack */ ! 80: ! 81: mtmsr r0 /* Turn off FPU again */ ! 82: isync /* Wait for it */ ! 83: blr /* Go away, don't bother me... */ ! 84: ! 85: ! 86: /* ! 87: * void video_scroll_down(unsigned long start, HIGH address to scroll from ! 88: * unsigned long end, LOW address ! 89: * unsigned long dest) HIGH address ! 90: */ ! 91: ! 92: ENTRY(video_scroll_down, TAG_NO_FRAME_USED) ! 93: ! 94: /* Save off the link register, we want to call fpu_save. ! 95: */ ! 96: ! 97: ! 98: mfmsr r0 /* Get the MSR */ ! 99: mflr r6 /* Get the LR */ ! 100: ori r7,r0,1<<(31-MSR_FP_BIT) /* Turn on floating point */ ! 101: stwu r1,-(FM_SIZE+16)(r1) /* Get space for a couple of registers on stack */ ! 102: rlwinm r7,r7,0,MSR_EE_BIT+1,MSR_EE_BIT-1 /* Turn off interrupts */ ! 103: stw r6,(FM_SIZE+16+FM_LR_SAVE)(r1) /* Save the return */ ! 104: ! 105: mtmsr r7 /* Turn on FPU */ ! 106: isync /* Wait for it */ ! 107: ! 108: vsdfpuon1: stfd f0,(FM_SIZE+0)(r1) /* Save one register */ ! 109: stfd f1,(FM_SIZE+8)(r1) /* and the second */ ! 110: ! 111: stw r0,(FM_SIZE+FM_LR_SAVE)(r1) /* Save return */ ! 112: ! 113: /* ok, now we can use the FPU registers to do some fast copying */ ! 114: ! 115: .L_vscr_down_loop: ! 116: lfd f0, -16(r3) ! 117: lfd f1, -8(r3) ! 118: ! 119: subi r3, r3, 16 ! 120: ! 121: stfd f0, -16(r5) ! 122: ! 123: cmpl cr0, r3, r4 ! 124: ! 125: stfd f1, -8(r5) ! 126: ! 127: subi r5, r5, 16 ! 128: ! 129: bgt+ cr0, .L_vscr_down_loop ! 130: ! 131: ! 132: lfd f0,(FM_SIZE+0)(r1) /* Load back one register */ ! 133: lfd f1,(FM_SIZE+8)(r1) /* and the second */ ! 134: lwz r1,0(r1) /* Pop the stack */ ! 135: ! 136: mtmsr r0 /* Turn off FPU again */ ! 137: isync /* Wait for it */ ! 138: blr /* Go away, don't bother me... */ ! 139:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.