Skip to content

Commit

Permalink
cranelift: Add fcmp to fuzzer
Browse files Browse the repository at this point in the history
  • Loading branch information
afonso360 committed Aug 15, 2022
1 parent 1d0f6fa commit 20adda7
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 21 deletions.
45 changes: 25 additions & 20 deletions cranelift/codegen/src/ir/condcodes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,28 @@ pub enum FloatCC {
UnorderedOrGreaterThanOrEqual,
}

impl FloatCC {
/// Returns a slice with all possible [FloatCC] values.
pub fn all() -> &'static [FloatCC] {
&[
FloatCC::Ordered,
FloatCC::Unordered,
FloatCC::Equal,
FloatCC::NotEqual,
FloatCC::OrderedNotEqual,
FloatCC::UnorderedOrEqual,
FloatCC::LessThan,
FloatCC::LessThanOrEqual,
FloatCC::GreaterThan,
FloatCC::GreaterThanOrEqual,
FloatCC::UnorderedOrLessThan,
FloatCC::UnorderedOrLessThanOrEqual,
FloatCC::UnorderedOrGreaterThan,
FloatCC::UnorderedOrGreaterThanOrEqual,
]
}
}

impl CondCode for FloatCC {
fn inverse(self) -> Self {
use self::FloatCC::*;
Expand Down Expand Up @@ -363,26 +385,9 @@ mod tests {
assert_eq!("bogus".parse::<IntCC>(), Err(()));
}

static FLOAT_ALL: [FloatCC; 14] = [
FloatCC::Ordered,
FloatCC::Unordered,
FloatCC::Equal,
FloatCC::NotEqual,
FloatCC::OrderedNotEqual,
FloatCC::UnorderedOrEqual,
FloatCC::LessThan,
FloatCC::LessThanOrEqual,
FloatCC::GreaterThan,
FloatCC::GreaterThanOrEqual,
FloatCC::UnorderedOrLessThan,
FloatCC::UnorderedOrLessThanOrEqual,
FloatCC::UnorderedOrGreaterThan,
FloatCC::UnorderedOrGreaterThanOrEqual,
];

#[test]
fn float_inverse() {
for r in &FLOAT_ALL {
for r in &FloatCC::all() {
let cc = *r;
let inv = cc.inverse();
assert!(cc != inv);
Expand All @@ -392,7 +397,7 @@ mod tests {

#[test]
fn float_reverse() {
for r in &FLOAT_ALL {
for r in &FloatCC::all() {
let cc = *r;
let rev = cc.reverse();
assert_eq!(rev.reverse(), cc);
Expand All @@ -401,7 +406,7 @@ mod tests {

#[test]
fn float_display() {
for r in &FLOAT_ALL {
for r in &FloatCC::all() {
let cc = *r;
assert_eq!(cc.to_string().parse(), Ok(cc));
}
Expand Down
28 changes: 27 additions & 1 deletion cranelift/fuzzgen/src/function_generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ use cranelift::codegen::ir::{
use cranelift::codegen::isa::CallConv;
use cranelift::frontend::{FunctionBuilder, FunctionBuilderContext, Switch, Variable};
use cranelift::prelude::{
EntityRef, ExtFuncData, InstBuilder, IntCC, JumpTableData, StackSlotData, StackSlotKind,
EntityRef, ExtFuncData, FloatCC, InstBuilder, IntCC, JumpTableData, StackSlotData,
StackSlotKind,
};
use std::collections::HashMap;
use std::ops::RangeInclusive;
Expand Down Expand Up @@ -110,6 +111,28 @@ fn insert_stack_store(
Ok(())
}

fn insert_fcmp(
fgen: &mut FunctionGenerator,
builder: &mut FunctionBuilder,
_opcode: Opcode,
args: &'static [Type],
rets: &'static [Type],
) -> Result<()> {
let lhs = fgen.get_variable_of_type(args[0])?;
let lhs = builder.use_var(lhs);

let rhs = fgen.get_variable_of_type(args[1])?;
let rhs = builder.use_var(rhs);

let cc = *fgen.u.choose(FloatCC::all())?;

let res = builder.ins().fcmp(cc, lhs, rhs);

let var = fgen.get_variable_of_type(rets[0])?;
builder.def_var(var, res);
Ok(())
}

fn insert_const(
fgen: &mut FunctionGenerator,
builder: &mut FunctionBuilder,
Expand Down Expand Up @@ -391,6 +414,9 @@ const OPCODE_SIGNATURES: &'static [(
// Nearest
(Opcode::Nearest, &[F32], &[F32], insert_opcode),
(Opcode::Nearest, &[F64], &[F64], insert_opcode),
// Fcmp
(Opcode::Fcmp, &[F32, F32], &[B1], insert_fcmp),
(Opcode::Fcmp, &[F64, F64], &[B1], insert_fcmp),
// Stack Access
(Opcode::StackStore, &[I8], &[], insert_stack_store),
(Opcode::StackStore, &[I16], &[], insert_stack_store),
Expand Down

0 comments on commit 20adda7

Please sign in to comment.