.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  |