.CODE .EXPORT post ; ; This procedure calculates the highest bit position ; set in the word passed in as the first argument. ; If passed parameter is non-zero, the algorithm ; starts by assuming it is one. ; A binary search for a set bit is then used ; to enhance performance. ; ; The calculated bit position is returned to the caller. ; .PROC post .CALLINFO SAVE_RP .ENTER COMB,=,N %r0,%arg0,all_zeros ; No bits set LDI 31,%ret0 ; assume 2 to the 0 power ; ; if extracted bits non-zero, fall thru to change assumption ; else set up 16 low order bits and keep assumption ; EXTRU,<> %arg0,15,16,%r0 ; check 16 high order bits SHD,TR %arg0,%r0,16,%arg0 ; left shift arg0 16 bits ADDI -16,%ret0,%ret0 ; assume 2 to the 16 power ; ; if extracted bits non-zero, fall thru to change assumption ; else set up 8 low order bits and keep assumption ; EXTRU,<> %arg0,7,8,%r0 ; check next 8 high order bits SHD,TR %arg0,%r0,24,%arg0 ; left shift arg0 8 bits ADDI -8,%ret0,%ret0 ; assume 8 higher power of 2 ; ; if extracted bits non-zero, fall thru to change assumption ; else set up 4 low order bits and keep assumption ; EXTRU,<> %arg0,3,4,%r0 ; check next 4 high order bits SHD,TR %arg0,%r0,28,%arg0 ; left shift arg0 4 bits ADDI -4,%ret0,%ret0 ; assume 4 higher power of 2 ; ; if extracted bits non-zero, fall thru to change assumption ; else set up 2 low order bits and keep assumption ; EXTRU,<> %arg0,1,2,%r0 ; check next 2 high order bits SHD,TR %arg0,%r0,30,%arg0 ; left shift arg0 2 bits ADDI -2,%ret0,%ret0 ; assume 2 higher power of 2 ; ; if extracted bit is zero, fall thru and keep assumption ; else make conclusion ; EXTRU,= %arg0,0,1,%r0 ; check next bit ADDI -1,%ret0,%ret0 ; next higher power of 2 B,N tally all_zeros LDI -1,%ret0 tally .LEAVE .PROCEND |