From 6a2535452046d89ce002084297602fc59a34bc63 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Mon, 15 Apr 2019 16:51:15 +0200 Subject: [PATCH] [meta-python] Use named predicates for x86 encodings instead of anonymous predicates; And generate those in a deterministic order that the Rust crate can reproduce easily. --- cranelift/codegen/meta-python/cdsl/settings.py | 11 ++++++++++- .../codegen/meta-python/isa/x86/encodings.py | 18 +++++++++--------- .../codegen/meta-python/isa/x86/settings.py | 9 ++++++++- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/cranelift/codegen/meta-python/cdsl/settings.py b/cranelift/codegen/meta-python/cdsl/settings.py index 28ff0f0b3e..fe79024221 100644 --- a/cranelift/codegen/meta-python/cdsl/settings.py +++ b/cranelift/codegen/meta-python/cdsl/settings.py @@ -229,16 +229,25 @@ class SettingGroup(object): .format(self, SettingGroup._current)) SettingGroup._current = None if globs: + # Ensure that named predicates are ordered in a deterministic way + # that the Rust crate may simply reproduce, by pushing entries into + # a vector that we'll sort by name later. + named_predicates = [] + for name, obj in globs.items(): if isinstance(obj, Setting): assert obj.name is None, obj.name obj.name = name if isinstance(obj, Predicate): - self.named_predicates[name] = obj + named_predicates.append((name, obj)) if isinstance(obj, Preset): assert obj.name is None, obj.name obj.name = name + named_predicates.sort(key=lambda x: x[0]) + for (name, obj) in named_predicates: + self.named_predicates[name] = obj + self.layout() @staticmethod diff --git a/cranelift/codegen/meta-python/isa/x86/encodings.py b/cranelift/codegen/meta-python/isa/x86/encodings.py index 051b312167..a032c11898 100644 --- a/cranelift/codegen/meta-python/isa/x86/encodings.py +++ b/cranelift/codegen/meta-python/isa/x86/encodings.py @@ -3,7 +3,7 @@ x86 Encodings. """ from __future__ import absolute_import from cdsl.predicates import IsZero32BitFloat, IsZero64BitFloat -from cdsl.predicates import IsUnsignedInt, Not, And +from cdsl.predicates import IsUnsignedInt from base.predicates import IsColocatedFunc, IsColocatedData, LengthEquals from base import instructions as base from base import types @@ -15,8 +15,8 @@ from . import settings as cfg from . import instructions as x86 from .legalize import x86_expand from base.legalize import narrow, widen, expand_flags -from base.settings import allones_funcaddrs, is_pic -from .settings import use_sse41 +from .settings import use_sse41, not_all_ones_funcaddrs_and_not_is_pic, \ + all_ones_funcaddrs_and_not_is_pic, is_pic, not_is_pic try: from typing import TYPE_CHECKING, Any # noqa @@ -407,15 +407,15 @@ enc_both(base.regspill.f64, r.fregspill32, 0xf2, 0x0f, 0x11) # Non-PIC, all-ones funcaddresses. X86_32.enc(base.func_addr.i32, *r.fnaddr4(0xb8), - isap=And(Not(allones_funcaddrs), Not(is_pic))) + isap=not_all_ones_funcaddrs_and_not_is_pic) X86_64.enc(base.func_addr.i64, *r.fnaddr8.rex(0xb8, w=1), - isap=And(Not(allones_funcaddrs), Not(is_pic))) + isap=not_all_ones_funcaddrs_and_not_is_pic) # Non-PIC, all-zeros funcaddresses. X86_32.enc(base.func_addr.i32, *r.allones_fnaddr4(0xb8), - isap=And(allones_funcaddrs, Not(is_pic))) + isap=all_ones_funcaddrs_and_not_is_pic) X86_64.enc(base.func_addr.i64, *r.allones_fnaddr8.rex(0xb8, w=1), - isap=And(allones_funcaddrs, Not(is_pic))) + isap=all_ones_funcaddrs_and_not_is_pic) # 64-bit, colocated, both PIC and non-PIC. Use the lea instruction's # pc-relative field. @@ -432,9 +432,9 @@ X86_64.enc(base.func_addr.i64, *r.got_fnaddr8.rex(0x8b, w=1), # Non-PIC X86_32.enc(base.symbol_value.i32, *r.gvaddr4(0xb8), - isap=Not(is_pic)) + isap=not_is_pic) X86_64.enc(base.symbol_value.i64, *r.gvaddr8.rex(0xb8, w=1), - isap=Not(is_pic)) + isap=not_is_pic) # PIC, colocated X86_64.enc(base.symbol_value.i64, *r.pcrel_gvaddr8.rex(0x8d, w=1), diff --git a/cranelift/codegen/meta-python/isa/x86/settings.py b/cranelift/codegen/meta-python/isa/x86/settings.py index 76aee65ddd..74633349e2 100644 --- a/cranelift/codegen/meta-python/isa/x86/settings.py +++ b/cranelift/codegen/meta-python/isa/x86/settings.py @@ -3,7 +3,7 @@ x86 settings. """ from __future__ import absolute_import from cdsl.settings import SettingGroup, BoolSetting, Preset -from cdsl.predicates import And +from cdsl.predicates import And, Not import base.settings as shared from .defs import ISA @@ -35,6 +35,13 @@ use_popcnt = And(has_popcnt, has_sse42) use_bmi1 = And(has_bmi1) use_lzcnt = And(has_lzcnt) +is_pic = And(shared.is_pic) +not_is_pic = Not(shared.is_pic) +all_ones_funcaddrs_and_not_is_pic = And(shared.allones_funcaddrs, + Not(shared.is_pic)) +not_all_ones_funcaddrs_and_not_is_pic = And(Not(shared.allones_funcaddrs), + Not(shared.is_pic)) + # Presets corresponding to x86 CPUs. baseline = Preset()