|
|
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_COPYRIGHT@
24: *
25: */
26:
27: #include <ppc/asm.h>
28: #include <ppc/proc_reg.h>
29:
30: #
31: # void setbit(int bitno, int *s)
32: #
33: # Set indicated bit in bit string.
34: # Note: being big-endian, bit 0 is 0x80000000.
35:
36: ENTRY(setbit,TAG_NO_FRAME_USED)
37:
38: rlwinm r8,r3,29,3,31 /* Get byte displacement */
39: rlwinm r9,r3,0,29,31 /* Get bit within byte */
40: li r6,0x80 /* Start with bit 0 */
41: lbzx r5,r4,r8 /* Grab target byte */
42: srw r6,r6,r9 /* Get the right bit (fits right into the load cycle) */
43: or r5,r5,r6 /* Turn on the right bit */
44: stbx r5,r4,r8 /* Save the byte back */
45: blr
46:
47: #
48: # void clrbit(int bitno, int *s)
49: #
50: # Clear indicated bit in bit string.
51: # Note: being big-endian, bit 0 is 0x80000000.
52:
53: ENTRY(clrbit,TAG_NO_FRAME_USED)
54:
55: rlwinm r8,r3,29,3,31 /* Get byte displacement */
56: rlwinm r9,r3,0,29,31 /* Get bit within byte */
57: li r6,0x80 /* Start with bit 0 */
58: lbzx r5,r4,r8 /* Grab target byte */
59: srw r6,r6,r9 /* Get the right bit (fits right into the load cycle) */
60: andc r5,r5,r6 /* Turn off the right bit */
61: stbx r5,r4,r8 /* Save the byte back */
62: blr
63:
64:
65: # /*
66: # * Find first bit set in bit string.
67: # */
68: # int
69: # ffsbit(int *s)
70: #
71: # Returns the bit index of the first bit set (starting from 0)
72: # Assumes pointer is word-aligned
73:
74: ENTRY(ffsbit, TAG_NO_FRAME_USED)
75: lwz r0, 0(ARG0)
76: mr ARG1, ARG0 /* Free up ARG0 for result */
77:
78: cmpwi r0, 0 /* Check against zero... */
79: cntlzw ARG0, r0 /* Free inst... find the set bit... */
80: bnelr+ /* Return if bit in first word */
81:
82: .L_ffsbit_lp:
83: lwz r0, 4(ARG1)
84: addi ARG1, ARG1, 4
85: cmpwi r0, 0 /* Check against zero... */
86: cntlzw r12, r0
87: add ARG0, ARG0, r12 /* ARG0 keeps bit count */
88: beq+ .L_ffsbit_lp
89: blr
90:
91: /*
92: * int tstbit(int bitno, int *s)
93: *
94: * Test indicated bit in bit string.
95: * Note: being big-endian, bit 0 is 0x80000000.
96: */
97:
98: ENTRY2(tstbit, testbit, TAG_NO_FRAME_USED)
99:
100: rlwinm r8,r3,29,3,31 /* Get byte displacement */
101: rlwinm r9,r3,0,29,31 /* Get bit within byte */
102: lbzx r5,r4,r8 /* Grab target byte */
103: addi r9,r9,25 /* Get actual shift value */
104: rlwnm r3,r5,r9,31,31 /* Pass the bit back */
105: blr
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.