drm/radeon: refactor register check loop
authorGrazvydas Ignotas <notasas@gmail.com>
Sun, 23 Aug 2015 00:57:37 +0000 (03:57 +0300)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 2 Oct 2015 20:08:29 +0000 (16:08 -0400)
After this patch the register check loop does the same thing as before,
except that now gcc does better job optimizing it: it now sees that
end_reg was already checked against PACKET3_SET_CONTEXT_REG_END and can
optimize REG_SAFE_BM_SIZE comparison out of evergreen_is_safe_reg()
as (PACKET3_SET_CONTEXT_REG_END >> 7) < REG_SAFE_BM_SIZE.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/evergreen_cs.c

index 4453799..e31076e 100644 (file)
@@ -2299,11 +2299,10 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
                        DRM_ERROR("bad PACKET3_SET_CONFIG_REG\n");
                        return -EINVAL;
                }
-               for (i = 0; i < pkt->count; i++) {
-                       reg = start_reg + (4 * i);
+               for (reg = start_reg, idx++; reg <= end_reg; reg += 4, idx++) {
                        if (evergreen_is_safe_reg(p, reg))
                                continue;
-                       r = evergreen_cs_handle_reg(p, reg, idx + 1 + i);
+                       r = evergreen_cs_handle_reg(p, reg, idx);
                        if (r)
                                return r;
                }
@@ -2317,11 +2316,10 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
                        DRM_ERROR("bad PACKET3_SET_CONTEXT_REG\n");
                        return -EINVAL;
                }
-               for (i = 0; i < pkt->count; i++) {
-                       reg = start_reg + (4 * i);
+               for (reg = start_reg, idx++; reg <= end_reg; reg += 4, idx++) {
                        if (evergreen_is_safe_reg(p, reg))
                                continue;
-                       r = evergreen_cs_handle_reg(p, reg, idx + 1 + i);
+                       r = evergreen_cs_handle_reg(p, reg, idx);
                        if (r)
                                return r;
                }