.data B0: .fill 0x55555555 B1: .fill 0x33333333 B2: .fill 0x0F0F0F0F B3: .fill 0x001F001F B4: .fill 0x0000003F .text ;int countbits(int x) { countbits: ;x == r1 ;load address of B0 into r3 ldil r3, B0@lo; ldih r3, B0@hi; ;x = (x & B0) + ((x >> 1) & B0); ;r0 = (x >> 1) lrs r0,r1,1; ;load B0 into r2 ldw r2, 0(r3); ;(x >> 1) & B0 and r0, r0, r2; ;x & B0 and r1, r1, r2; ;x = (x & B0) + ((x >> 1) & B0); add r0, r0, r1; ;load B1 into r2, use displacment for address of B1 (or add?) ldw r2, B1-B0(r3); ;x = (x & B1) + ((x >> 2) & B1); lrs r1, r0, 2; and r1, r1, r2; and r0, r0, r2; add r0, r0, r1; ;x = (x + (x >> 4)) & B2; ldw r2, B2-B0(r3); lrs r1, r0, 4; and r1, r1, r2; and r0, r0, r2; add r0, r0, r1; ;x = (x + (x >> 8)) /*& B3 */ lrs r1, r0, 8; add r0, r0, r1; ldw r2, B4-B0(r3); ;x = (x + (x >> 16)) & B4; lrs r1, r0, 16; add r0, r0, r1; and r0, r0, r2; ;return x; ret; ;}