I think the primary usage case for something like that would be shifting a multi-byte quantity left or right by four bits. One could rotate a 56-bit value (e.g. the mantissa of a floating-point value) left by 4 bits by doing something like:
ld h,myThing >> 8 ; Assume it doesn't cross a page boundary
ld bc,4
and a ; Clear carry
loop:
ld l,myThing & 255
rl (hl)
inc l
rl (hl)
inc l
rl (hl)
inc l
rl (hl)
inc l
rl (hl)
inc l
rl (hl)
inc l
rl (hl)
djnz loop
but it could be done much faster as:
ld h,myThing >> 8 ; Assume it doesn't cross a page boundary
xor a ; Could use "ld a,0" if carry was important for some reason
ld l,myThing & 255
rld (hl)
inc l
rld (hl)
inc l
rld (hl)
inc l
rld (hl)
inc l
rld (hl)
inc l
rld (hl)
inc l
rld (hl)
I'm not sure the value of that is greater than the value of other features that could have been provided for the same amount of effort and silicon, but I think something like the above would be the intended usage pattern. Still, the feature would have value either in cases where things are being shifted by exactly four bits, or in performance-sensitive code (like floating-point math) where values may need to be shifted by N bits and it would not be uncommon for N to be 3, 4, or 5. I'm not sure exactly how big the thing to be shifted would need to be to make such optimizations worthwhile, but the requirement that objects be stored in RAM might limit the value of such optimizations when shifting smaller things. If a 32-bit value needed to be shifted, the first approach could be changed to:
ld hl,(myThing)
ld de,(myThing+2)
ld bc,4
and a ; Clear carry
loop:
add hl,hl
rl e
rl d
djnz loop
ld (myThing),hl
ld (myThing+2),de
greatly reducing the cost of the loop. The fact that the rld form doesn't
need the loop would likely make it more efficient than running
the loop four times, but if "rld" had allowed code to specify a register rather than (HL) it could have been much more useful in the small-objects case.