By C/C++ type promotion rules, if t is of type float, t / 12 maps to a single-precision division. The integer 12 is converted to float prior to the division. Since it is a literal constant the conversion should happen at compile time which can easily be verified by looking at the intermediate PTX.

By the same C/C++ type promotion rules, t / 12.0 maps to a double-precision division, since 12.0 is a double, and t thus is converted to the wider type prior to the division. The double-precision division is implemented as a software subroutine that requires more temporary registers than single-precision division, with the difference more pronounced if the single-precision division is approximate. An increase of six 32-bit registers as seen here seems perfectly plausible.

In order of increasing register pressure:

(1) approximate, limited range single-precision division, div.approx.f32

(2) approximate, full range single-precision division, div.full.f32

(3) IEEE-rounded single-precision division, div.rn.f32

(4) IEEE-rounded double-precision division, div.rn.f64