3 #include "bambooalign.h"
5 extern unsigned int markmappingarray[];
6 extern unsigned int bitmarkmappingarray[];
7 extern unsigned int revmarkmappingarray[];
9 #define CONVERTTABLEINDEXTOPTR(x) (((unsigned INTPTR)((x)<<(ALIGNMENTSHIFT+4)))+gcbaseva)
10 //Minimum alignment unit
14 #define OBJMASK 0x40000000UL //set towhatever smallest object mark is
15 #define MARKMASK 0xc0000000UL //set towhatever smallest object mark is
18 The bitmap mark array uses 2 mark bits per alignment unit.
20 The clever trick is that we encode the length of the object (in
21 units of alignment units) using just these two bits. The basic
22 idea is to generate a variable length encoding of the length in
23 which the length of the encoding is shorter than number of mark
24 bits taken up by the object.
26 To make this efficient, it is table driven for objects that are
27 less than 16 alignment units in length. For larger objects, we
31 /* Return length in units of ALIGNSIZE */
33 static inline unsigned int getMarkedLength(void *ptr) {
34 unsigned INTPTR alignsize=ALIGNOBJSIZE((unsigned INTPTR)(ptr-gcbaseva));
35 unsigned INTPTR hibits=alignsize>>4;
36 unsigned INTPTR lobits=(alignsize&15)<<1;
39 val=gcmarktbl[hibits];
41 unsigned INTPTR revlobits=32-lobits;
42 val=(gcmarktbl[hibits]<<lobits)|(gcmarktbl[hibits+1]>>(revlobits));
44 unsigned int index=val>>26;
46 return (val-0xc4000000)+16;
48 return markmappingarray[index];
51 /* Return non-zero value if the object is marked */
53 static inline unsigned int checkMark(void *ptr) {
54 unsigned INTPTR alignsize=ALIGNOBJSIZE((unsigned INTPTR)(ptr-gcbaseva));
55 unsigned INTPTR hibits=alignsize>>4;
56 unsigned INTPTR lobits=(alignsize&15)<<1;
58 return (gcmarktbl[hibits]<<lobits)&MARKMASK;
61 /* Return non-zero value if the object is marked */
63 static inline unsigned int checkAndCondSetMark(void *ptr) {
64 unsigned INTPTR alignsize=ALIGNOBJSIZE((unsigned INTPTR)(ptr-gcbaseva));
65 unsigned INTPTR hibits=alignsize>>4;
66 unsigned INTPTR lobits=(alignsize&15)<<1;
67 unsigned INTPTR mask=MARKMASK>>lobits;
68 BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
69 unsigned INTPTR mark=(gcmarktbl[hibits])&mask;
71 gcmarktbl[hibits]|=(OBJMASK>>lobits);
73 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
77 /* Set length in units of ALIGNSIZE */
79 static inline void setLength(void *ptr, unsigned int length) {
80 unsigned INTPTR alignsize=ALIGNOBJSIZE((unsigned INTPTR)(ptr-gcbaseva));
81 unsigned INTPTR hibits=alignsize>>4;
82 unsigned INTPTR lobits=(alignsize&15)<<1;
83 unsigned int ormask=(length>=16)?0xc4000000+(length-16):revmarkmappingarray[length];
85 gcmarktbl[hibits]|=ormask;
87 gcmarktbl[hibits]|=ormask>>lobits;
88 unsigned INTPTR lowormask=ormask<<(32-lobits);
90 gcmarktbl[hibits+1]|=lowormask;
94 /* Set length for premarked object */
96 static inline void setLengthMarked_I(void *ptr, unsigned int length) {
97 unsigned INTPTR alignsize=ALIGNOBJSIZE((unsigned INTPTR)(ptr-gcbaseva));
98 unsigned INTPTR hibits=alignsize>>4;
99 unsigned INTPTR lobits=(alignsize&15)<<1;
100 unsigned int ormask=(length>=16)?0xc4000000+(length-16):revmarkmappingarray[length];
102 gcmarktbl[hibits]=(gcmarktbl[hibits]^(OBJMASK))|ormask;
104 gcmarktbl[hibits]=(gcmarktbl[hibits]^(OBJMASK>>lobits))|(ormask>>lobits);
105 unsigned INTPTR lowormask=ormask<<(32-lobits);
107 gcmarktbl[hibits+1]|=lowormask;
111 static inline void setLengthMarked(void *ptr, unsigned int length) {
112 BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
113 setLengthMarked_I(ptr, length);
114 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
117 /* Set length in units of ALIGNSIZE */
119 static inline void setMark_I(void *ptr) {
120 unsigned INTPTR alignsize=ALIGNOBJSIZE((unsigned INTPTR)(ptr-gcbaseva));
121 unsigned INTPTR hibits=alignsize>>4;
122 unsigned INTPTR lobits=(alignsize&15)<<1;
123 gcmarktbl[hibits]|=(OBJMASK>>lobits);
126 static inline void setMark(void *ptr) {
127 BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
129 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
132 static inline void clearMark(void *ptr) {
133 unsigned INTPTR alignsize=ALIGNOBJSIZE((unsigned INTPTR)(ptr-gcbaseva));
134 unsigned INTPTR hibits=alignsize>>4;
135 unsigned INTPTR lobits=(alignsize&15)<<1;
138 unsigned int hipart=gcmarktbl[hibits];
139 unsigned int index=hipart>>26;
140 unsigned int bits=(index>48)?32:bitmarkmappingarray[index];
141 unsigned int bitstotoss=32-bits;
142 gcmarktbl[hibits]^=((hipart>>(bitstotoss))<<(bitstotoss));
144 unsigned int orighi=gcmarktbl[hibits];
145 unsigned int hipart=orighi<<lobits;
146 unsigned INTPTR revlobits=32-lobits;
147 unsigned int lowpart=gcmarktbl[hibits+1]>>revlobits;
148 unsigned INTPTR val=hipart|lowpart;
150 unsigned int index=val>>26;
151 unsigned int bits=(index>48)?32:bitmarkmappingarray[index];
153 unsigned int bitstotoss=32-bits;
155 if ((bits+lobits)<32) {
156 unsigned int bitstotossminuslobits=bitstotoss-lobits;
157 gcmarktbl[hibits]^=(hipart>>bitstotoss)<<bitstotossminuslobits;
159 gcmarktbl[hibits]^=hipart>>lobits;
160 unsigned int xormask=(lowpart>>bitstotoss)<<(bitstotoss+revlobits);
162 gcmarktbl[hibits+1]^=xormask;