ISLE: implement x64 lowering for band_not in ISLE
This commit is contained in:
@@ -1198,6 +1198,39 @@ pub fn constructor_punpcklwd<C: Context>(ctx: &mut C, arg0: Reg, arg1: &RegMem)
|
||||
return Some(expr2_0);
|
||||
}
|
||||
|
||||
// Generated as internal constructor for term andnps.
|
||||
pub fn constructor_andnps<C: Context>(ctx: &mut C, arg0: Reg, arg1: &RegMem) -> Option<Reg> {
|
||||
let pattern0_0 = arg0;
|
||||
let pattern1_0 = arg1;
|
||||
// Rule at src/isa/x64/inst.isle line 853.
|
||||
let expr0_0: Type = F32X4;
|
||||
let expr1_0 = SseOpcode::Andnps;
|
||||
let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
|
||||
return Some(expr2_0);
|
||||
}
|
||||
|
||||
// Generated as internal constructor for term andnpd.
|
||||
pub fn constructor_andnpd<C: Context>(ctx: &mut C, arg0: Reg, arg1: &RegMem) -> Option<Reg> {
|
||||
let pattern0_0 = arg0;
|
||||
let pattern1_0 = arg1;
|
||||
// Rule at src/isa/x64/inst.isle line 858.
|
||||
let expr0_0: Type = F64X2;
|
||||
let expr1_0 = SseOpcode::Andnpd;
|
||||
let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
|
||||
return Some(expr2_0);
|
||||
}
|
||||
|
||||
// Generated as internal constructor for term pandn.
|
||||
pub fn constructor_pandn<C: Context>(ctx: &mut C, arg0: Reg, arg1: &RegMem) -> Option<Reg> {
|
||||
let pattern0_0 = arg0;
|
||||
let pattern1_0 = arg1;
|
||||
// Rule at src/isa/x64/inst.isle line 863.
|
||||
let expr0_0: Type = F64X2;
|
||||
let expr1_0 = SseOpcode::Pandn;
|
||||
let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
|
||||
return Some(expr2_0);
|
||||
}
|
||||
|
||||
// Generated as internal constructor for term xmm_rm_r_imm.
|
||||
pub fn constructor_xmm_rm_r_imm<C: Context>(
|
||||
ctx: &mut C,
|
||||
@@ -1212,7 +1245,7 @@ pub fn constructor_xmm_rm_r_imm<C: Context>(
|
||||
let pattern2_0 = arg2;
|
||||
let pattern3_0 = arg3;
|
||||
let pattern4_0 = arg4;
|
||||
// Rule at src/isa/x64/inst.isle line 853.
|
||||
// Rule at src/isa/x64/inst.isle line 868.
|
||||
let expr0_0: Type = I8X16;
|
||||
let expr1_0 = C::temp_writable_reg(ctx, expr0_0);
|
||||
let expr2_0 = MInst::XmmRmRImm {
|
||||
@@ -1240,7 +1273,7 @@ pub fn constructor_palignr<C: Context>(
|
||||
let pattern1_0 = arg1;
|
||||
let pattern2_0 = arg2;
|
||||
let pattern3_0 = arg3;
|
||||
// Rule at src/isa/x64/inst.isle line 865.
|
||||
// Rule at src/isa/x64/inst.isle line 880.
|
||||
let expr0_0 = SseOpcode::Palignr;
|
||||
let expr1_0 = constructor_xmm_rm_r_imm(
|
||||
ctx, &expr0_0, pattern0_0, pattern1_0, pattern2_0, pattern3_0,
|
||||
@@ -1258,7 +1291,7 @@ pub fn constructor_pshufd<C: Context>(
|
||||
let pattern0_0 = arg0;
|
||||
let pattern1_0 = arg1;
|
||||
let pattern2_0 = arg2;
|
||||
// Rule at src/isa/x64/inst.isle line 874.
|
||||
// Rule at src/isa/x64/inst.isle line 889.
|
||||
let expr0_0: Type = I8X16;
|
||||
let expr1_0 = C::temp_writable_reg(ctx, expr0_0);
|
||||
let expr2_0 = C::writable_reg_to_reg(ctx, expr1_0);
|
||||
@@ -1283,7 +1316,7 @@ pub fn constructor_xmm_unary_rm_r<C: Context>(
|
||||
) -> Option<Reg> {
|
||||
let pattern0_0 = arg0;
|
||||
let pattern1_0 = arg1;
|
||||
// Rule at src/isa/x64/inst.isle line 887.
|
||||
// Rule at src/isa/x64/inst.isle line 902.
|
||||
let expr0_0: Type = I8X16;
|
||||
let expr1_0 = C::temp_writable_reg(ctx, expr0_0);
|
||||
let expr2_0 = MInst::XmmUnaryRmR {
|
||||
@@ -1299,7 +1332,7 @@ pub fn constructor_xmm_unary_rm_r<C: Context>(
|
||||
// Generated as internal constructor for term pmovsxbw.
|
||||
pub fn constructor_pmovsxbw<C: Context>(ctx: &mut C, arg0: &RegMem) -> Option<Reg> {
|
||||
let pattern0_0 = arg0;
|
||||
// Rule at src/isa/x64/inst.isle line 894.
|
||||
// Rule at src/isa/x64/inst.isle line 909.
|
||||
let expr0_0 = SseOpcode::Pmovsxbw;
|
||||
let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
|
||||
return Some(expr1_0);
|
||||
@@ -1308,7 +1341,7 @@ pub fn constructor_pmovsxbw<C: Context>(ctx: &mut C, arg0: &RegMem) -> Option<Re
|
||||
// Generated as internal constructor for term pmovzxbw.
|
||||
pub fn constructor_pmovzxbw<C: Context>(ctx: &mut C, arg0: &RegMem) -> Option<Reg> {
|
||||
let pattern0_0 = arg0;
|
||||
// Rule at src/isa/x64/inst.isle line 899.
|
||||
// Rule at src/isa/x64/inst.isle line 914.
|
||||
let expr0_0 = SseOpcode::Pmovzxbw;
|
||||
let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
|
||||
return Some(expr1_0);
|
||||
@@ -1324,7 +1357,7 @@ pub fn constructor_xmm_rm_r_evex<C: Context>(
|
||||
let pattern0_0 = arg0;
|
||||
let pattern1_0 = arg1;
|
||||
let pattern2_0 = arg2;
|
||||
// Rule at src/isa/x64/inst.isle line 904.
|
||||
// Rule at src/isa/x64/inst.isle line 919.
|
||||
let expr0_0: Type = I8X16;
|
||||
let expr1_0 = C::temp_writable_reg(ctx, expr0_0);
|
||||
let expr2_0 = MInst::XmmRmREvex {
|
||||
@@ -1342,7 +1375,7 @@ pub fn constructor_xmm_rm_r_evex<C: Context>(
|
||||
pub fn constructor_vpmullq<C: Context>(ctx: &mut C, arg0: &RegMem, arg1: Reg) -> Option<Reg> {
|
||||
let pattern0_0 = arg0;
|
||||
let pattern1_0 = arg1;
|
||||
// Rule at src/isa/x64/inst.isle line 916.
|
||||
// Rule at src/isa/x64/inst.isle line 931.
|
||||
let expr0_0 = Avx512Opcode::Vpmullq;
|
||||
let expr1_0 = constructor_xmm_rm_r_evex(ctx, &expr0_0, pattern0_0, pattern1_0)?;
|
||||
return Some(expr1_0);
|
||||
@@ -1358,7 +1391,7 @@ pub fn constructor_xmm_rmi_reg<C: Context>(
|
||||
let pattern0_0 = arg0;
|
||||
let pattern1_0 = arg1;
|
||||
let pattern2_0 = arg2;
|
||||
// Rule at src/isa/x64/inst.isle line 923.
|
||||
// Rule at src/isa/x64/inst.isle line 938.
|
||||
let expr0_0: Type = I8X16;
|
||||
let expr1_0 = C::temp_writable_reg(ctx, expr0_0);
|
||||
let expr2_0 = MInst::XmmRmiReg {
|
||||
@@ -1376,7 +1409,7 @@ pub fn constructor_xmm_rmi_reg<C: Context>(
|
||||
pub fn constructor_psllq<C: Context>(ctx: &mut C, arg0: Reg, arg1: &RegMemImm) -> Option<Reg> {
|
||||
let pattern0_0 = arg0;
|
||||
let pattern1_0 = arg1;
|
||||
// Rule at src/isa/x64/inst.isle line 933.
|
||||
// Rule at src/isa/x64/inst.isle line 948.
|
||||
let expr0_0 = SseOpcode::Psllq;
|
||||
let expr1_0 = constructor_xmm_rmi_reg(ctx, &expr0_0, pattern0_0, pattern1_0)?;
|
||||
return Some(expr1_0);
|
||||
@@ -1386,7 +1419,7 @@ pub fn constructor_psllq<C: Context>(ctx: &mut C, arg0: Reg, arg1: &RegMemImm) -
|
||||
pub fn constructor_psrlq<C: Context>(ctx: &mut C, arg0: Reg, arg1: &RegMemImm) -> Option<Reg> {
|
||||
let pattern0_0 = arg0;
|
||||
let pattern1_0 = arg1;
|
||||
// Rule at src/isa/x64/inst.isle line 938.
|
||||
// Rule at src/isa/x64/inst.isle line 953.
|
||||
let expr0_0 = SseOpcode::Psrlq;
|
||||
let expr1_0 = constructor_xmm_rmi_reg(ctx, &expr0_0, pattern0_0, pattern1_0)?;
|
||||
return Some(expr1_0);
|
||||
@@ -1404,7 +1437,7 @@ pub fn constructor_mul_hi<C: Context>(
|
||||
let pattern1_0 = arg1;
|
||||
let pattern2_0 = arg2;
|
||||
let pattern3_0 = arg3;
|
||||
// Rule at src/isa/x64/inst.isle line 945.
|
||||
// Rule at src/isa/x64/inst.isle line 960.
|
||||
let expr0_0 = C::temp_writable_reg(ctx, pattern0_0);
|
||||
let expr1_0 = C::temp_writable_reg(ctx, pattern0_0);
|
||||
let expr2_0 = C::operand_size_of_type(ctx, pattern0_0);
|
||||
@@ -1433,7 +1466,7 @@ pub fn constructor_mulhi_u<C: Context>(
|
||||
let pattern0_0 = arg0;
|
||||
let pattern1_0 = arg1;
|
||||
let pattern2_0 = arg2;
|
||||
// Rule at src/isa/x64/inst.isle line 961.
|
||||
// Rule at src/isa/x64/inst.isle line 976.
|
||||
let expr0_0: bool = false;
|
||||
let expr1_0 = constructor_mul_hi(ctx, pattern0_0, expr0_0, pattern1_0, pattern2_0)?;
|
||||
return Some(expr1_0);
|
||||
@@ -1800,6 +1833,15 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<ValueReg
|
||||
let expr3_0 = C::value_reg(ctx, expr2_0);
|
||||
return Some(expr3_0);
|
||||
}
|
||||
&Opcode::BandNot => {
|
||||
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1);
|
||||
// Rule at src/isa/x64/lower.isle line 940.
|
||||
let expr0_0 = C::put_in_reg(ctx, pattern7_1);
|
||||
let expr1_0 = C::put_in_reg_mem(ctx, pattern7_0);
|
||||
let expr2_0 = constructor_andnps(ctx, expr0_0, &expr1_0)?;
|
||||
let expr3_0 = C::value_reg(ctx, expr2_0);
|
||||
return Some(expr3_0);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
@@ -1839,6 +1881,15 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<ValueReg
|
||||
let expr3_0 = C::value_reg(ctx, expr2_0);
|
||||
return Some(expr3_0);
|
||||
}
|
||||
&Opcode::BandNot => {
|
||||
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1);
|
||||
// Rule at src/isa/x64/lower.isle line 943.
|
||||
let expr0_0 = C::put_in_reg(ctx, pattern7_1);
|
||||
let expr1_0 = C::put_in_reg_mem(ctx, pattern7_0);
|
||||
let expr2_0 = constructor_andnpd(ctx, expr0_0, &expr1_0)?;
|
||||
let expr3_0 = C::value_reg(ctx, expr2_0);
|
||||
return Some(expr3_0);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
@@ -3010,6 +3061,15 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<ValueReg
|
||||
let expr3_0 = C::value_reg(ctx, expr2_0);
|
||||
return Some(expr3_0);
|
||||
}
|
||||
&Opcode::BandNot => {
|
||||
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1);
|
||||
// Rule at src/isa/x64/lower.isle line 946.
|
||||
let expr0_0 = C::put_in_reg(ctx, pattern7_1);
|
||||
let expr1_0 = C::put_in_reg_mem(ctx, pattern7_0);
|
||||
let expr2_0 = constructor_pandn(ctx, expr0_0, &expr1_0)?;
|
||||
let expr3_0 = C::value_reg(ctx, expr2_0);
|
||||
return Some(expr3_0);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user