Skip to content

Commit

Permalink
Replace ExtractLane format with BinaryImm8
Browse files Browse the repository at this point in the history
Like #1762, this change the name of the `ExtractLane` format to the more-general `BinaryImm8` and renames its immediate argument from `lane` to `imm`.
  • Loading branch information
abrown committed May 29, 2020
1 parent b4e0cb9 commit 0b00e07
Show file tree
Hide file tree
Showing 9 changed files with 36 additions and 39 deletions.
4 changes: 2 additions & 2 deletions cranelift/codegen/meta/src/isa/x86/instructions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ pub(crate) fn define(
Packed Shuffle Doublewords -- copies data from either memory or lanes in an extended
register and re-orders the data according to the passed immediate byte.
"#,
&formats.extract_lane,
&formats.binary_imm8,
)
.operands_in(vec![a, i]) // TODO allow copying from memory here (need more permissive type than TxN)
.operands_out(vec![a]),
Expand Down Expand Up @@ -314,7 +314,7 @@ pub(crate) fn define(
The lane index, ``Idx``, is an immediate value, not an SSA value. It
must indicate a valid lane index for the type of ``x``.
"#,
&formats.extract_lane,
&formats.binary_imm8,
)
.operands_in(vec![x, Idx])
.operands_out(vec![a]),
Expand Down
16 changes: 8 additions & 8 deletions cranelift/codegen/meta/src/isa/x86/recipes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -977,20 +977,20 @@ pub(crate) fn define<'shared>(
// XX /r ib with 8-bit unsigned immediate (e.g. for pshufd)
{
recipes.add_template_inferred(
EncodingRecipeBuilder::new("r_ib_unsigned_fpr", &formats.extract_lane, 2)
EncodingRecipeBuilder::new("r_ib_unsigned_fpr", &formats.binary_imm8, 2)
.operands_in(vec![fpr])
.operands_out(vec![fpr])
.inst_predicate(InstructionPredicate::new_is_unsigned_int(
&*formats.extract_lane,
"lane",
&*formats.binary_imm8,
"imm",
8,
0,
)) // TODO if the format name is changed then "lane" should be renamed to something more appropriate--ordering mask? broadcast immediate?
))
.emit(
r#"
{{PUT_OP}}(bits, rex2(in_reg0, out_reg0), sink);
modrm_rr(in_reg0, out_reg0, sink);
let imm:i64 = lane.into();
let imm: i64 = imm.into();
sink.put1(imm as u8);
"#,
),
Expand All @@ -1001,17 +1001,17 @@ pub(crate) fn define<'shared>(
// XX /r ib with 8-bit unsigned immediate (e.g. for extractlane)
{
recipes.add_template_inferred(
EncodingRecipeBuilder::new("r_ib_unsigned_gpr", &formats.extract_lane, 2)
EncodingRecipeBuilder::new("r_ib_unsigned_gpr", &formats.binary_imm8, 2)
.operands_in(vec![fpr])
.operands_out(vec![gpr])
.inst_predicate(InstructionPredicate::new_is_unsigned_int(
&*formats.extract_lane, "lane", 8, 0,
&*formats.binary_imm8, "imm", 8, 0,
))
.emit(
r#"
{{PUT_OP}}(bits, rex2(out_reg0, in_reg0), sink);
modrm_rr(out_reg0, in_reg0, sink); // note the flipped register in the ModR/M byte
let imm:i64 = lane.into();
let imm: i64 = imm.into();
sink.put1(imm as u8);
"#,
), "size_with_inferred_rex_for_inreg0_outreg0"
Expand Down
9 changes: 3 additions & 6 deletions cranelift/codegen/meta/src/shared/formats.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ pub(crate) struct Formats {
pub(crate) cond_trap: Rc<InstructionFormat>,
pub(crate) copy_special: Rc<InstructionFormat>,
pub(crate) copy_to_ssa: Rc<InstructionFormat>,
pub(crate) extract_lane: Rc<InstructionFormat>,
pub(crate) binary_imm8: Rc<InstructionFormat>,
pub(crate) float_compare: Rc<InstructionFormat>,
pub(crate) float_cond: Rc<InstructionFormat>,
pub(crate) float_cond_trap: Rc<InstructionFormat>,
Expand Down Expand Up @@ -76,6 +76,8 @@ impl Formats {

binary: Builder::new("Binary").value().value().build(),

binary_imm8: Builder::new("BinaryImm8").value().imm(&imm.uimm8).build(),

binary_imm: Builder::new("BinaryImm").value().imm(&imm.imm64).build(),

// The select instructions are controlled by the second VALUE operand.
Expand All @@ -100,11 +102,6 @@ impl Formats {

nullary: Builder::new("NullAry").build(),

extract_lane: Builder::new("ExtractLane")
.value()
.imm_with_name("lane", &imm.uimm8)
.build(),

shuffle: Builder::new("Shuffle")
.value()
.value()
Expand Down
2 changes: 1 addition & 1 deletion cranelift/codegen/meta/src/shared/instructions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,7 @@ fn define_simd_lane_access(
may or may not be zeroed depending on the ISA but the type system should prevent using
``a`` as anything other than the extracted value.
"#,
&formats.extract_lane,
&formats.binary_imm8,
)
.operands_in(vec![x, Idx])
.operands_out(vec![a]),
Expand Down
4 changes: 2 additions & 2 deletions cranelift/codegen/src/isa/x86/enc_tables.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1181,10 +1181,10 @@ fn convert_extractlane(
let mut pos = FuncCursor::new(func).at_inst(inst);
pos.use_srcloc(inst);

if let ir::InstructionData::ExtractLane {
if let ir::InstructionData::BinaryImm8 {
opcode: ir::Opcode::Extractlane,
arg,
lane,
imm: lane,
} = pos.func.dfg[inst]
{
// NOTE: the following legalization assumes that the upper bits of the XMM register do
Expand Down
6 changes: 3 additions & 3 deletions cranelift/codegen/src/verifier/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -756,10 +756,10 @@ impl<'a> Verifier<'a> {
| UnaryIeee64 { .. }
| UnaryBool { .. }
| Binary { .. }
| BinaryImm8 { .. }
| BinaryImm { .. }
| Ternary { .. }
| TernaryImm8 { .. }
| ExtractLane { .. }
| Shuffle { .. }
| IntCompare { .. }
| IntCompareImm { .. }
Expand Down Expand Up @@ -1912,9 +1912,9 @@ impl<'a> Verifier<'a> {
Ok(())
}
}
ir::InstructionData::ExtractLane {
ir::InstructionData::BinaryImm8 {
opcode: ir::instructions::Opcode::Extractlane,
lane,
imm: lane,
arg,
..
}
Expand Down
2 changes: 1 addition & 1 deletion cranelift/codegen/src/write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,7 @@ pub fn write_operands(
constant_handle, ..
} => write!(w, " {}", constant_handle),
Binary { args, .. } => write!(w, " {}, {}", args[0], args[1]),
BinaryImm8 { arg, imm, .. } => write!(w, " {}, {}", arg, imm),
BinaryImm { arg, imm, .. } => write!(w, " {}, {}", arg, imm),
Ternary { args, .. } => write!(w, " {}, {}, {}", args[0], args[1], args[2]),
MultiAry { ref args, .. } => {
Expand All @@ -519,7 +520,6 @@ pub fn write_operands(
}
NullAry { .. } => write!(w, " "),
TernaryImm8 { imm, args, .. } => write!(w, " {}, {}, {}", args[0], args[1], imm),
ExtractLane { lane, arg, .. } => write!(w, " {}, {}", arg, lane),
Shuffle { mask, args, .. } => {
let data = dfg.immediates.get(mask).expect(
"Expected the shuffle mask to already be inserted into the immediates table",
Expand Down
12 changes: 6 additions & 6 deletions cranelift/reader/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2752,6 +2752,12 @@ impl<'a> Parser<'a> {
args: [lhs, rhs],
}
}
InstructionFormat::BinaryImm8 => {
let arg = self.match_value("expected SSA value first operand")?;
self.match_token(Token::Comma, "expected ',' between operands")?;
let imm = self.match_uimm8("expected unsigned 8-bit immediate")?;
InstructionData::BinaryImm8 { opcode, arg, imm }
}
InstructionFormat::BinaryImm => {
let lhs = self.match_value("expected SSA value first operand")?;
self.match_token(Token::Comma, "expected ',' between operands")?;
Expand Down Expand Up @@ -2899,12 +2905,6 @@ impl<'a> Parser<'a> {
args: [lhs, rhs],
}
}
InstructionFormat::ExtractLane => {
let arg = self.match_value("expected SSA value last operand")?;
self.match_token(Token::Comma, "expected ',' between operands")?;
let lane = self.match_uimm8("expected lane number")?;
InstructionData::ExtractLane { opcode, lane, arg }
}
InstructionFormat::Shuffle => {
let a = self.match_value("expected SSA value first operand")?;
self.match_token(Token::Comma, "expected ',' between operands")?;
Expand Down
20 changes: 10 additions & 10 deletions cranelift/serde/src/serde_clif_json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ pub enum SerInstData {
opcode: String,
args: [String; 2],
},
BinaryImm8 {
opcode: String,
arg: String,
imm: String,
},
BinaryImm {
opcode: String,
arg: String,
Expand All @@ -53,11 +58,6 @@ pub enum SerInstData {
NullAry {
opcode: String,
},
ExtractLane {
opcode: String,
arg: String,
lane: String,
},
Shuffle {
opcode: String,
args: [String; 2],
Expand Down Expand Up @@ -292,6 +292,11 @@ pub fn get_inst_data(inst_index: Inst, func: &Function) -> SerInstData {
args: hold_args,
}
}
InstructionData::BinaryImm8 { opcode, arg, imm } => SerInstData::BinaryImm8 {
opcode: opcode.to_string(),
arg: arg.to_string(),
imm: imm.to_string(),
},
InstructionData::BinaryImm { opcode, arg, imm } => SerInstData::BinaryImm {
opcode: opcode.to_string(),
arg: arg.to_string(),
Expand Down Expand Up @@ -331,11 +336,6 @@ pub fn get_inst_data(inst_index: Inst, func: &Function) -> SerInstData {
imm: imm.to_string(),
}
}
InstructionData::ExtractLane { opcode, arg, lane } => SerInstData::ExtractLane {
opcode: opcode.to_string(),
arg: arg.to_string(),
lane: lane.to_string(),
},
InstructionData::UnaryConst {
opcode,
constant_handle,
Expand Down

0 comments on commit 0b00e07

Please sign in to comment.