• Clemens Hammacher's avatar
    [assembler] Make Register et al. real classes · 9e995e12
    Clemens Hammacher authored
    Up to now, each architecture defined all Register types as structs,
    with lots of redundancy. An often found comment noted that they cannot
    be classes due to initialization order problems. As these problems are
    gone with C++11 constexpr constants, I now tried making Registers
    classes again.
    All register types now inherit from RegisterBase, which provides a
    default set of methods and named constructors (like ::from_code,
    code(), bit(), is_valid(), ...).
    This design allows to guarantee an interesting property: Each register
    is either valid, or it's the no_reg register. There are no other
    invalid registers. This is guaranteed statically by the constexpr
    constructor, and dynamically by ::from_code.
    
    I decided to disallow the default constructor completely, so instead of
    "Register reg;" you now need "Register reg = no_reg;". This makes
    explicit how the Register is initialized.
    
    I did this change to the x64, ia32, arm, arm64, mips and mips64 ports.
    Overall, code got much more compact and more safe. In theory, it should
    also increase performance (since the is_valid() check is simpler), but
    this is probably not measurable.
    
    R=mstarzinger@chromium.org
    
    Change-Id: I5ccfa4050daf4e146a557970e9d37fd3d2788d4a
    Reviewed-on: https://chromium-review.googlesource.com/650927Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
    Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
    Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
    Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#47847}
    9e995e12
assembler-x64-inl.h 14.4 KB