Remove special handling in codegen for some AVX and SSE2 shift by immediate intrinsics
Those were removed from stdarch in https://github.com/rust-lang/stdarch/pull/1463 (`simd_shl` and `simd_shr` are used instead)
This commit is contained in:
parent
c3edc57981
commit
0b6ee86d37
@ -177,244 +177,6 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
|||||||
bool_to_zero_or_max_uint(fx, res_lane_ty, res_lane)
|
bool_to_zero_or_max_uint(fx, res_lane_ty, res_lane)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
"llvm.x86.sse2.psrli.d" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.sse2.psrli.d imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 32 => fx.bcx.ins().ushr_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.sse2.psrai.d" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.sse2.psrai.d imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 32 => fx.bcx.ins().sshr_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.sse2.pslli.d" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.sse2.pslli.d imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 32 => fx.bcx.ins().ishl_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.sse2.psrli.w" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.sse2.psrli.d imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 16 => fx.bcx.ins().ushr_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.sse2.psrai.w" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.sse2.psrai.d imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 16 => fx.bcx.ins().sshr_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.sse2.pslli.w" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.sse2.pslli.d imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 16 => fx.bcx.ins().ishl_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.avx.psrli.d" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.avx.psrli.d imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 32 => fx.bcx.ins().ushr_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.avx.psrai.d" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.avx.psrai.d imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 32 => fx.bcx.ins().sshr_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.sse2.psrli.q" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.avx.psrli.q imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 64 => fx.bcx.ins().ushr_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.sse2.pslli.q" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.avx.pslli.q imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 64 => fx.bcx.ins().ishl_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.avx.pslli.d" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.avx.pslli.d imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 32 => fx.bcx.ins().ishl_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.avx2.psrli.w" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.avx.psrli.w imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 16 => fx.bcx.ins().ushr_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.avx2.psrai.w" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.avx.psrai.w imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 16 => fx.bcx.ins().sshr_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.avx2.pslli.w" => {
|
|
||||||
let (a, imm8) = match args {
|
|
||||||
[a, imm8] => (a, imm8),
|
|
||||||
_ => bug!("wrong number of args for intrinsic {intrinsic}"),
|
|
||||||
};
|
|
||||||
let a = codegen_operand(fx, a);
|
|
||||||
let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8)
|
|
||||||
.expect("llvm.x86.avx.pslli.w imm8 not const");
|
|
||||||
|
|
||||||
simd_for_each_lane(fx, a, ret, &|fx, _lane_ty, _res_lane_ty, lane| match imm8
|
|
||||||
.try_to_bits(Size::from_bytes(4))
|
|
||||||
.unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8))
|
|
||||||
{
|
|
||||||
imm8 if imm8 < 16 => fx.bcx.ins().ishl_imm(lane, i64::from(imm8 as u8)),
|
|
||||||
_ => fx.bcx.ins().iconst(types::I32, 0),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"llvm.x86.ssse3.pshuf.b.128" | "llvm.x86.avx2.pshuf.b" => {
|
"llvm.x86.ssse3.pshuf.b.128" | "llvm.x86.avx2.pshuf.b" => {
|
||||||
let (a, b) = match args {
|
let (a, b) = match args {
|
||||||
[a, b] => (a, b),
|
[a, b] => (a, b),
|
||||||
@ -563,8 +325,6 @@ fn select4(
|
|||||||
// llvm.x86.avx2.vperm2i128
|
// llvm.x86.avx2.vperm2i128
|
||||||
// llvm.x86.ssse3.pshuf.b.128
|
// llvm.x86.ssse3.pshuf.b.128
|
||||||
// llvm.x86.avx2.pshuf.b
|
// llvm.x86.avx2.pshuf.b
|
||||||
// llvm.x86.avx2.psrli.w
|
|
||||||
// llvm.x86.sse2.psrli.w
|
|
||||||
|
|
||||||
fn llvm_add_sub<'tcx>(
|
fn llvm_add_sub<'tcx>(
|
||||||
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
||||||
|
Loading…
Reference in New Issue
Block a user