The floating point support stuff is *completely* different kettle of fish than memset().
The 8051 happens to be one of the exceptions from this rule that made me prefix that statement by 'on ... many architectures'. It is so mal-adjusted to being programmed in C that standard functions like memset() must take a serious performance penalty to work correctly. The standard function has to use standard pointers, and such code tends to be slow, bloated or both.
OTOH on some 8051 derivative, if you're using just the wrong memory class, the memset() library function will actually beat direct loops at least on speed, by using special hardware features that it fails to exploit from normal C code. I've seen their specialized library version of memcpy() outperform a naive copy loop over a measly 8 bytes, by a factor of 3 (DS80C390 contiguous mode, copying from far to far memory).
And BTW, the Keil optimizer is so powerful that it could even discover all editions of an unrolled memset() and combine them back into a single subroutine anyway, if you have a recent version of it and crank it all the way up to OT(12) or so. So don't conclude too much from over all code size --- you have to look at the listing files to understand just how clever it is.