author | Rich Burridge <rich.burridge@oracle.com> |
Tue, 02 May 2017 17:33:26 -0700 | |
changeset 7964 | d9801318ed3d |
parent 6157 | f1976f698680 |
permissions | -rw-r--r-- |
6157
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
1 |
Patch origin: in-house |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
2 |
Patch status: Solaris-specific; not suitable for upstream |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
3 |
|
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
4 |
--- zlib-1.2.8/inflate.c |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
5 |
+++ zlib-1.2.8/inflate.c |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
6 |
@@ -976,8 +976,15 @@ int flush; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
7 |
state->mode = BAD; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
8 |
break; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
9 |
} |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
10 |
- while (copy--) |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
11 |
- state->lens[state->have++] = (unsigned short)len; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
12 |
+ //while (copy--) |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
13 |
+ // state->lens[state->have++] = (unsigned short)len; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
14 |
+ |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
15 |
+ unsigned state_have=state->have; // Make local copy of state->have to eliminate RAW |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
16 |
+ // Change from while to for loop and make local copy of "copy" so it can be unrolled: |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
17 |
+ for (unsigned copy_copy=copy; copy_copy>0; copy_copy--, (state_have)++) { |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
18 |
+ state->lens[state_have] = (unsigned short)len; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
19 |
+ } |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
20 |
+ state->have = state_have; // Copy back value |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
21 |
} |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
22 |
} |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
23 |
|
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
24 |
--- zlib-1.2.8/inftrees.c |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
25 |
+++ zlib-1.2.8/inftrees.c |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
26 |
@@ -230,12 +230,22 @@ |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
27 |
} |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
28 |
|
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
29 |
/* replicate for those indices with low len bits equal to huff */ |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
30 |
+ // KPG: Create local variables so the compiler won't access via a pointer |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
31 |
+ unsigned char op_copy = here.op; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
32 |
+ unsigned char bits_copy = here.bits; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
33 |
+ unsigned short val_copy = here.val; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
34 |
+ |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
35 |
incr = 1U << (len - drop); |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
36 |
fill = 1U << curr; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
37 |
min = fill; /* save offset to next table */ |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
38 |
do { |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
39 |
fill -= incr; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
40 |
- next[(huff >> drop) + fill] = here; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
41 |
+ //next[(huff >> drop) + fill] = here; // RAW read |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
42 |
+ |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
43 |
+ // Instead of the above, storing individual elements eliminates RAW: |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
44 |
+ next[(huff >> drop) + fill].op = op_copy; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
45 |
+ next[(huff >> drop) + fill].bits = bits_copy; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
46 |
+ next[(huff >> drop) + fill].val = val_copy; |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
47 |
} while (fill != 0); |
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
48 |
|
f1976f698680
23527357 Remove RAW hazards in inflate() and inflate_table()
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
49 |
/* backwards increment the len-bit code huff */ |