• 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
Name
Last commit
Last update
benchmarks Loading commit data...
build_overrides Loading commit data...
docs Loading commit data...
gni Loading commit data...
gypfiles Loading commit data...
include Loading commit data...
infra Loading commit data...
samples Loading commit data...
src Loading commit data...
test Loading commit data...
testing Loading commit data...
third_party Loading commit data...
tools Loading commit data...
.clang-format Loading commit data...
.editorconfig Loading commit data...
.gitignore Loading commit data...
.gn Loading commit data...
.ycm_extra_conf.py Loading commit data...
AUTHORS Loading commit data...
BUILD.gn Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
ChangeLog Loading commit data...
DEPS Loading commit data...
LICENSE Loading commit data...
LICENSE.fdlibm Loading commit data...
LICENSE.strongtalk Loading commit data...
LICENSE.v8 Loading commit data...
LICENSE.valgrind Loading commit data...
Makefile Loading commit data...
Makefile.android Loading commit data...
OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
README.md Loading commit data...
WATCHLISTS Loading commit data...
codereview.settings Loading commit data...
snapshot_toolchain.gni Loading commit data...