Exceeding number of available registers and data spilled to slower GPU memory

Metal shaders use two 16-bit GPU registers for one 32 float variable because A8 and later GPUs have 16-bit registers only. so if we use many variables in our metal fragment shaders then we get the issue of "exceeding registers limit and data spilling in slower GPU memory" and it causes very slow FPS. but why is this not with OpenGL shaders even though they are using many 32-bit float variables like metal shaders. any idea what trick does OpenGL ? while GPU is same in both cases Metal rendering and OpenGL rendering.

When I used simd data types for my structs in shader then data spilling decreased a lot and I unrolled "For" loops manually in my shader then my shader works faster but I am not still able to understand why simd data types decreased data spilling while normal metal data types exceeded available registers limit in GPU.

Exceeding number of available registers and data spilled to slower GPU memory
 
 
Q