Rich,
If you look in gr-filter/lib/fir_filter.cc you'll see all the filter kernel implementations. Since it looks like you're only interested in floats (and therefore, I assume real - not complex - signals and taps), if you look at fir_filter_fff::filter(const float input[]) you can see that it really is just a wrapper for the volk_32f_x2_dot_prod_32f kernel from VOLK. Note that this call is the inner kernel, which gets called either by filterN (for the non-decimating case) or filterNdec (for the decimating case) inside the work(...) function by the corresponding block (i.e. fir_filter_fff_impl.cc for the all-floats case). If you are interested in complex signals/taps, fir_filter.cc has all the other variants as well, but you'll notice that pretty much all the filter(...) calls are just wrappers for VOLK functions (e.g. volk_32fc_x2_dot_prod_32fc for the all complex float case). All the rest of the code relating to the FIR filters has to do with setup and things like updating taps, so if all you need is a simple dot product function for implementing your own FIR filter, I highly recommend looking through the VOLK documentation. Note that if you have lots of taps, it becomes desirable at some point to move into the Fourier domain, and do a simple element-wise multiply rather than a time domain convolution. I'll leave walking through fft_filter.cc as an exercise for the reader...
Regards,
Doug