Allow settings::Builder to be reused.
When constructing the Flags object from the Builder, don't consume it, but take a reference instead. This makes it possible for the parser to accept multiple 'set' lines and apply them to different ISA specifications.
This commit is contained in:
@@ -183,18 +183,18 @@ def gen_constructor(sgrp, parent, fmt):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
with fmt.indented('impl Flags {', '}'):
|
with fmt.indented('impl Flags {', '}'):
|
||||||
args = 'builder: Builder'
|
args = 'builder: &Builder'
|
||||||
if sgrp.parent:
|
if sgrp.parent:
|
||||||
p = sgrp.parent
|
p = sgrp.parent
|
||||||
args = '{}: &{}::Flags, {}'.format(p.name, p.qual_mod, args)
|
args = '{}: &{}::Flags, {}'.format(p.name, p.qual_mod, args)
|
||||||
with fmt.indented(
|
with fmt.indented(
|
||||||
'pub fn new({}) -> Flags {{'.format(args), '}'):
|
'pub fn new({}) -> Flags {{'.format(args), '}'):
|
||||||
fmt.line('let bvec = builder.finish("{}");'.format(sgrp.name))
|
fmt.line('let bvec = builder.state_for("{}");'.format(sgrp.name))
|
||||||
fmt.line('let mut bytes = [0; {}];'.format(sgrp.byte_size()))
|
fmt.line('let mut bytes = [0; {}];'.format(sgrp.byte_size()))
|
||||||
fmt.line('assert_eq!(bvec.len(), {});'.format(sgrp.settings_size))
|
fmt.line('assert_eq!(bvec.len(), {});'.format(sgrp.settings_size))
|
||||||
with fmt.indented(
|
with fmt.indented(
|
||||||
'for (i, b) in bvec.into_iter().enumerate() {', '}'):
|
'for (i, b) in bvec.iter().enumerate() {', '}'):
|
||||||
fmt.line('bytes[i] = b;')
|
fmt.line('bytes[i] = *b;')
|
||||||
|
|
||||||
# Stop here without predicates.
|
# Stop here without predicates.
|
||||||
if len(sgrp.predicate_number) == sgrp.boolean_settings:
|
if len(sgrp.predicate_number) == sgrp.boolean_settings:
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
//! use cretonne::isa;
|
//! use cretonne::isa;
|
||||||
//!
|
//!
|
||||||
//! let shared_builder = settings::builder();
|
//! let shared_builder = settings::builder();
|
||||||
//! let shared_flags = settings::Flags::new(shared_builder);
|
//! let shared_flags = settings::Flags::new(&shared_builder);
|
||||||
//!
|
//!
|
||||||
//! match isa::lookup("riscv") {
|
//! match isa::lookup("riscv") {
|
||||||
//! None => {
|
//! None => {
|
||||||
@@ -66,14 +66,14 @@ fn riscv_builder() -> Option<Builder> {
|
|||||||
/// Modify the ISA-specific settings before creating the `TargetIsa` trait object with `finish`.
|
/// Modify the ISA-specific settings before creating the `TargetIsa` trait object with `finish`.
|
||||||
pub struct Builder {
|
pub struct Builder {
|
||||||
setup: settings::Builder,
|
setup: settings::Builder,
|
||||||
constructor: fn(settings::Flags, settings::Builder) -> Box<TargetIsa>,
|
constructor: fn(settings::Flags, &settings::Builder) -> Box<TargetIsa>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Builder {
|
impl Builder {
|
||||||
/// Combine the ISA-specific settings with the provided ISA-independent settings and allocate a
|
/// Combine the ISA-specific settings with the provided ISA-independent settings and allocate a
|
||||||
/// fully configured `TargetIsa` trait object.
|
/// fully configured `TargetIsa` trait object.
|
||||||
pub fn finish(self, shared_flags: settings::Flags) -> Box<TargetIsa> {
|
pub fn finish(self, shared_flags: settings::Flags) -> Box<TargetIsa> {
|
||||||
(self.constructor)(shared_flags, self.setup)
|
(self.constructor)(shared_flags, &self.setup)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ pub fn isa_builder() -> IsaBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn isa_constructor(shared_flags: shared_settings::Flags,
|
fn isa_constructor(shared_flags: shared_settings::Flags,
|
||||||
builder: shared_settings::Builder)
|
builder: &shared_settings::Builder)
|
||||||
-> Box<TargetIsa> {
|
-> Box<TargetIsa> {
|
||||||
let level1 = if shared_flags.is_64bit() {
|
let level1 = if shared_flags.is_64bit() {
|
||||||
&enc_tables::LEVEL1_RV64[..]
|
&enc_tables::LEVEL1_RV64[..]
|
||||||
@@ -72,7 +72,7 @@ mod tests {
|
|||||||
fn test_64bitenc() {
|
fn test_64bitenc() {
|
||||||
let mut shared_builder = settings::builder();
|
let mut shared_builder = settings::builder();
|
||||||
shared_builder.set_bool("is_64bit", true).unwrap();
|
shared_builder.set_bool("is_64bit", true).unwrap();
|
||||||
let shared_flags = settings::Flags::new(shared_builder);
|
let shared_flags = settings::Flags::new(&shared_builder);
|
||||||
let isa = isa::lookup("riscv").unwrap().finish(shared_flags);
|
let isa = isa::lookup("riscv").unwrap().finish(shared_flags);
|
||||||
|
|
||||||
let mut dfg = DataFlowGraph::new();
|
let mut dfg = DataFlowGraph::new();
|
||||||
@@ -119,7 +119,7 @@ mod tests {
|
|||||||
fn test_32bitenc() {
|
fn test_32bitenc() {
|
||||||
let mut shared_builder = settings::builder();
|
let mut shared_builder = settings::builder();
|
||||||
shared_builder.set_bool("is_64bit", false).unwrap();
|
shared_builder.set_bool("is_64bit", false).unwrap();
|
||||||
let shared_flags = settings::Flags::new(shared_builder);
|
let shared_flags = settings::Flags::new(&shared_builder);
|
||||||
let isa = isa::lookup("riscv").unwrap().finish(shared_flags);
|
let isa = isa::lookup("riscv").unwrap().finish(shared_flags);
|
||||||
|
|
||||||
let mut dfg = DataFlowGraph::new();
|
let mut dfg = DataFlowGraph::new();
|
||||||
@@ -174,7 +174,7 @@ mod tests {
|
|||||||
fn test_rv32m() {
|
fn test_rv32m() {
|
||||||
let mut shared_builder = settings::builder();
|
let mut shared_builder = settings::builder();
|
||||||
shared_builder.set_bool("is_64bit", false).unwrap();
|
shared_builder.set_bool("is_64bit", false).unwrap();
|
||||||
let shared_flags = settings::Flags::new(shared_builder);
|
let shared_flags = settings::Flags::new(&shared_builder);
|
||||||
|
|
||||||
// Set the supports_m stting which in turn enables the use_m predicate that unlocks
|
// Set the supports_m stting which in turn enables the use_m predicate that unlocks
|
||||||
// encodings for imul.
|
// encodings for imul.
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn display_default() {
|
fn display_default() {
|
||||||
let shared = settings::Flags::new(settings::builder());
|
let shared = settings::Flags::new(&settings::builder());
|
||||||
let b = builder();
|
let b = builder();
|
||||||
let f = Flags::new(&shared, b);
|
let f = Flags::new(&shared, &b);
|
||||||
assert_eq!(f.to_string(),
|
assert_eq!(f.to_string(),
|
||||||
"[riscv]\n\
|
"[riscv]\n\
|
||||||
supports_m = false\n\
|
supports_m = false\n\
|
||||||
@@ -30,20 +30,20 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn predicates() {
|
fn predicates() {
|
||||||
let shared = settings::Flags::new(settings::builder());
|
let shared = settings::Flags::new(&settings::builder());
|
||||||
let mut b = builder();
|
let mut b = builder();
|
||||||
b.set_bool("supports_f", true).unwrap();
|
b.set_bool("supports_f", true).unwrap();
|
||||||
b.set_bool("supports_d", true).unwrap();
|
b.set_bool("supports_d", true).unwrap();
|
||||||
let f = Flags::new(&shared, b);
|
let f = Flags::new(&shared, &b);
|
||||||
assert_eq!(f.full_float(), true);
|
assert_eq!(f.full_float(), true);
|
||||||
|
|
||||||
let mut sb = settings::builder();
|
let mut sb = settings::builder();
|
||||||
sb.set_bool("enable_simd", false).unwrap();
|
sb.set_bool("enable_simd", false).unwrap();
|
||||||
let shared = settings::Flags::new(sb);
|
let shared = settings::Flags::new(&sb);
|
||||||
let mut b = builder();
|
let mut b = builder();
|
||||||
b.set_bool("supports_f", true).unwrap();
|
b.set_bool("supports_f", true).unwrap();
|
||||||
b.set_bool("supports_d", true).unwrap();
|
b.set_bool("supports_d", true).unwrap();
|
||||||
let f = Flags::new(&shared, b);
|
let f = Flags::new(&shared, &b);
|
||||||
assert_eq!(f.full_float(), false);
|
assert_eq!(f.full_float(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
//! let mut b = settings::builder();
|
//! let mut b = settings::builder();
|
||||||
//! b.set("opt_level", "fastest");
|
//! b.set("opt_level", "fastest");
|
||||||
//!
|
//!
|
||||||
//! let f = settings::Flags::new(b);
|
//! let f = settings::Flags::new(&b);
|
||||||
//! assert_eq!(f.opt_level(), settings::OptLevel::Fastest);
|
//! assert_eq!(f.opt_level(), settings::OptLevel::Fastest);
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
@@ -57,9 +57,9 @@ impl Builder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Extract contents of builder once everything is configured.
|
/// Extract contents of builder once everything is configured.
|
||||||
pub fn finish(self, name: &str) -> Vec<u8> {
|
pub fn state_for(&self, name: &str) -> &[u8] {
|
||||||
assert_eq!(name, self.template.name);
|
assert_eq!(name, self.template.name);
|
||||||
self.bytes
|
&self.bytes[..]
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the value of a single bit.
|
/// Set the value of a single bit.
|
||||||
@@ -256,7 +256,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn display_default() {
|
fn display_default() {
|
||||||
let b = builder();
|
let b = builder();
|
||||||
let f = Flags::new(b);
|
let f = Flags::new(&b);
|
||||||
assert_eq!(f.to_string(),
|
assert_eq!(f.to_string(),
|
||||||
"[shared]\n\
|
"[shared]\n\
|
||||||
opt_level = \"default\"\n\
|
opt_level = \"default\"\n\
|
||||||
@@ -275,7 +275,7 @@ mod tests {
|
|||||||
assert_eq!(b.set_bool("enable_simd", true), Ok(()));
|
assert_eq!(b.set_bool("enable_simd", true), Ok(()));
|
||||||
assert_eq!(b.set_bool("enable_simd", false), Ok(()));
|
assert_eq!(b.set_bool("enable_simd", false), Ok(()));
|
||||||
|
|
||||||
let f = Flags::new(b);
|
let f = Flags::new(&b);
|
||||||
assert_eq!(f.enable_simd(), false);
|
assert_eq!(f.enable_simd(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,7 +289,7 @@ mod tests {
|
|||||||
assert_eq!(b.set("opt_level", "best"), Ok(()));
|
assert_eq!(b.set("opt_level", "best"), Ok(()));
|
||||||
assert_eq!(b.set("enable_simd", "0"), Ok(()));
|
assert_eq!(b.set("enable_simd", "0"), Ok(()));
|
||||||
|
|
||||||
let f = Flags::new(b);
|
let f = Flags::new(&b);
|
||||||
assert_eq!(f.enable_simd(), false);
|
assert_eq!(f.enable_simd(), false);
|
||||||
assert_eq!(f.opt_level(), super::OptLevel::Best);
|
assert_eq!(f.opt_level(), super::OptLevel::Best);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user