i dont see why this is necessary, gcm->X is already unsigned char*
btw, technically it's UB to cast unsigned char* to LTC_FAST_TYPE*.
the correct way would be to define gcm_data.X as union { unsigned char* X[sizeof(LTC_FAST_TYPE]; LTC_FAST_TYPE XF[1];}[16 / sizeof(LTC_FAST_TYPE)] and then access the XF member in the loop.
the alternative is to define LTC_FAST_TYPE with the gnu extension __attribute__((may_alias)).