1 #include "gc.h" 2 3 /* 4 Bits 5 bor(Bits a, Bits b) 6 { 7 Bits c; 8 int i; 9 10 for(i=0; i<BITS; i++) 11 c.b[i] = a.b[i] | b.b[i]; 12 return c; 13 } 14 */ 15 16 /* 17 Bits 18 band(Bits a, Bits b) 19 { 20 Bits c; 21 int i; 22 23 for(i=0; i<BITS; i++) 24 c.b[i] = a.b[i] & b.b[i]; 25 return c; 26 } 27 */ 28 29 /* 30 Bits 31 bnot(Bits a) 32 { 33 Bits c; 34 int i; 35 36 for(i=0; i<BITS; i++) 37 c.b[i] = ~a.b[i]; 38 return c; 39 } 40 */ 41 42 int 43 bany(Bits *a) 44 { 45 int i; 46 47 for(i=0; i<BITS; i++) 48 if(a->b[i]) 49 return 1; 50 return 0; 51 } 52 53 /* 54 int 55 beq(Bits a, Bits b) 56 { 57 int i; 58 59 for(i=0; i<BITS; i++) 60 if(a.b[i] != b.b[i]) 61 return 0; 62 return 1; 63 } 64 */ 65 66 int 67 bnum(Bits a) 68 { 69 int i; 70 long b; 71 72 for(i=0; i<BITS; i++) 73 if(b = a.b[i]) 74 return 32*i + bitno(b); 75 diag(Z, "bad in bnum"); 76 return 0; 77 } 78 79 Bits 80 blsh(unsigned n) 81 { 82 Bits c; 83 84 c = zbits; 85 c.b[n/32] = 1L << (n%32); 86 return c; 87 } 88 89 /* 90 int 91 bset(Bits a, unsigned n) 92 { 93 int i; 94 95 if(a.b[n/32] & (1L << (n%32))) 96 return 1; 97 return 0; 98 } 99 */ 100 101 int 102 Bconv(void *o, Fconv *fp) 103 { 104 char str[STRINGSZ], ss[STRINGSZ], *s; 105 Bits bits; 106 int i; 107 108 str[0] = 0; 109 bits = *(Bits*)o; 110 while(bany(&bits)) { 111 i = bnum(bits); 112 if(str[0]) 113 strcat(str, " "); 114 if(var[i].sym == S) { 115 sprint(ss, "$%ld", var[i].offset); 116 s = ss; 117 } else 118 s = var[i].sym->name; 119 if(strlen(str) + strlen(s) + 1 >= STRINGSZ) 120 break; 121 strcat(str, s); 122 bits.b[i/32] &= ~(1L << (i%32)); 123 } 124 strconv(str, fp); 125 return sizeof(bits); 126 } 127