function setElementHoverStyle(el, hoverStl) {
    // For performance consideration, it might be better to make the "hover style" only the
    // difference properties from the "normal style", but not a entire copy of all styles.
    hoverStl = el.__hoverStl = hoverStl !== false && (el.hoverStyle || hoverStl || {});
    el.__hoverStlDirty = true;

    // FIXME
    // It is not completely right to save "normal"/"emphasis" flag on elements.
    // It probably should be saved on `data` of series. Consider the cases:
    // (1) A highlighted elements are moved out of the view port and re-enter
    // again by dataZoom.
    // (2) call `setOption` and replace elements totally when they are highlighted.
    if (el.__highlighted) {
        // Consider the case:
        // The styles of a highlighted `el` is being updated. The new "emphasis style"
        // should be adapted to the `el`. Notice here new "normal styles" should have
        // been set outside and the cached "normal style" is out of date.
        el.__cachedNormalStl = null;
        // Do not clear `__cachedNormalZ2` here, because setting `z2` is not a constraint
        // of this method. In most cases, `z2` is not set and hover style should be able
        // to rollback. Of course, that would bring bug, but only in a rare case, see
        // `doSingleLeaveHover` for details.
        singleEnterNormal(el);

        singleEnterEmphasis(el);
    }
}
Set hover style (namely "emphasis style") of element,
based on the current style of the given `el`.

(1)
**CONSTRAINTS** for this method:
<A> This method MUST be called after all of the normal styles having been adopted
to the `el`.
<B> The input `hoverStyle` (that is, "emphasis style") MUST be the subset of the
"normal style" having been set to the el.
<C> `color` MUST be one of the "normal styles" (because color might be lifted as
a default hover style).

The reason: this method treat the current style of the `el` as the "normal style"
and cache them when enter/update the "emphasis style". Consider the case: the `el`
is in "emphasis" state and `setOption`/`dispatchAction` trigger the style updating
logic, where the el should shift from the original emphasis style to the new
"emphasis style" and should be able to "downplay" back to the new "normal style".

Indeed, it is error-prone to make a interface has so many constraints, but I have
not found a better solution yet to fit the backward compatibility, performance and
the current programming style.

(2)
Call the method for a "root" element once. Do not call it for each descendants.
If the descendants elemenets of a group has itself hover style different from the
root group, we can simply mount the style on `el.hoverStyle` for them, but should
not call this method for them.

(3) These input parameters can be set directly on `el`:

@param {module:zrender/Element} el
@param {Object} [el.hoverStyle] See `graphic.setElementHoverStyle`.
@param {boolean} [el.highDownSilentOnTouch=false] See `graphic.setAsHighDownDispatcher`.
@param {Function} [el.highDownOnUpdate] See `graphic.setAsHighDownDispatcher`.
@param {Object|boolean} [hoverStyle] See `graphic.setElementHoverStyle`.