Skip to content

Commit 20b5d3b

Browse files
Added constraint mapping
1 parent 9cd1cb0 commit 20b5d3b

File tree

3 files changed

+28
-4
lines changed

3 files changed

+28
-4
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use crate::common::constraint::Constraint;
2+
3+
pub fn map_constraints(imm_type: &String) -> Option<Constraint> {
4+
match imm_type.as_str() {
5+
"_MM_FROUND" => Some(Constraint::Range(0..4)),
6+
"_MM_INDEX_SCALE" => Some(Constraint::Set(vec![1, 2, 4, 8])),
7+
"_MM_CMPINT" => Some(Constraint::Range(0..8)),
8+
"_MM_REDUCE" => Some(Constraint::Range(0..8)),
9+
"_MM_FROUND_SAE" => Some(Constraint::Range(0..8)),
10+
"_MM_MANTISSA_NORM" => Some(Constraint::Range(0..4)),
11+
"_MM_MANTISSA_NORM_ENUM" => Some(Constraint::Range(0..4)),
12+
"_MM_MANTISSA_SIGN" => Some(Constraint::Range(0..3)),
13+
"_MM_PERM" => Some(Constraint::Range(0..256)),
14+
"_MM_PERM_ENUM" => Some(Constraint::Range(0..256)),
15+
"_MM_CMPINT_ENUM" => Some(Constraint::Range(0..8)),
16+
"_MM_ROUND_MODE" => Some(Constraint::Set(vec![0, 0x2000, 0x4000, 0x6000])),
17+
"_CMP_" => Some(Constraint::Range(0..32)),
18+
_ => None,
19+
}
20+
}

crates/intrinsic-test/src/x86/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
mod config;
2+
mod constraint;
23
mod intrinsic;
34
mod types;
45
mod xml_parser;

crates/intrinsic-test/src/x86/xml_parser.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::common::argument::{Argument, ArgumentList};
22
use crate::common::intrinsic::Intrinsic;
33
use crate::common::intrinsic_helpers::TypeKind;
4+
use crate::x86::constraint::map_constraints;
45

56
use serde::{Deserialize, Deserializer};
67
use std::path::Path;
@@ -13,7 +14,7 @@ where
1314
D: Deserializer<'de>,
1415
{
1516
let s = String::deserialize(deserializer)?;
16-
return s.as_str().parse::<u32>().or(Ok(0u16));
17+
return s.as_str().parse::<u32>().or(Ok(0u32));
1718
}
1819

1920
#[derive(Deserialize)]
@@ -38,14 +39,16 @@ struct XMLIntrinsic {
3839

3940
#[derive(Deserialize)]
4041
pub struct Parameter {
42+
#[serde(rename = "@varname")]
43+
pub var_name: String,
4144
#[serde(rename = "@type")]
4245
pub type_data: String,
4346
#[serde(rename = "@etype", default)]
4447
pub etype: String,
4548
#[serde(rename = "@memwidth", default, deserialize_with = "string_to_u32")]
4649
pub memwidth: u32,
47-
#[serde(rename = "@varname", default)]
48-
pub var_name: String,
50+
#[serde(rename = "@immtype", default)]
51+
pub imm_type: String,
4952
}
5053

5154
pub fn get_xml_intrinsics(
@@ -78,7 +81,7 @@ fn xml_to_intrinsic(
7881
if ty.is_err() {
7982
None
8083
} else {
81-
let constraint = None;
84+
let constraint = map_constraints(&param.imm_type);
8285
let arg = Argument::<X86IntrinsicType>::new(
8386
i,
8487
param.var_name.clone(),

0 commit comments

Comments
 (0)