VHDL libraries are typically using for loops to realize shifters and similar functions. To be synthesizable, the number of iterations must be finite (and not too large to produce meaningful code). It's also easy to write a wrapper function, that allows a shift operation on std_logic_vectors, based on the respective numeric lib.
Generally, it's important to understand the difference between a shift by a fixed amount and a variable parameter. A fixed shift is nothing but a simple assignment of bits. You can write it as such without using libraries.
res <= worda(worda'left-2 downto 0) & "00"; -- I use worda'left, cause I don't know the actual size
A variable shift in contrast involves a multiplexer for each target bit, the effort depend on the possible range of the shift parameter.