Added doc comment
And removed an accidental code move. Copyright (c) 2021, Arm Limited.
This commit is contained in:
1
build.rs
1
build.rs
@@ -225,6 +225,7 @@ fn ignore(testsuite: &str, testname: &str, strategy: &str) -> bool {
|
|||||||
// These are new instructions that are not really implemented in any backend.
|
// These are new instructions that are not really implemented in any backend.
|
||||||
("simd", "simd_i16x8_extadd_pairwise_i8x16")
|
("simd", "simd_i16x8_extadd_pairwise_i8x16")
|
||||||
| ("simd", "simd_i32x4_extadd_pairwise_i16x8") => return true,
|
| ("simd", "simd_i32x4_extadd_pairwise_i16x8") => return true,
|
||||||
|
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
_ => panic!("unrecognized strategy"),
|
_ => panic!("unrecognized strategy"),
|
||||||
|
|||||||
@@ -1253,6 +1253,9 @@ pub(crate) fn maybe_input_insn_via_conv<C: LowerCtx<I = Inst>>(
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Pattern match an extending vector multiplication.
|
||||||
|
/// Returns a tuple of the opcode to use, the two input registers and whether
|
||||||
|
/// it's the 'high half' version of the instruction.
|
||||||
pub(crate) fn match_vec_long_mul<C: LowerCtx<I = Inst>>(
|
pub(crate) fn match_vec_long_mul<C: LowerCtx<I = Inst>>(
|
||||||
c: &mut C,
|
c: &mut C,
|
||||||
insn: IRInst,
|
insn: IRInst,
|
||||||
|
|||||||
@@ -1879,6 +1879,37 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
|||||||
let a = pop1_with_bitcast(state, I32X4, builder);
|
let a = pop1_with_bitcast(state, I32X4, builder);
|
||||||
state.push1(builder.ins().uwiden_high(a))
|
state.push1(builder.ins().uwiden_high(a))
|
||||||
}
|
}
|
||||||
|
Operator::F32x4Ceil | Operator::F64x2Ceil => {
|
||||||
|
// This is something of a misuse of `type_of`, because that produces the return type
|
||||||
|
// of `op`. In this case we want the arg type, but we know it's the same as the
|
||||||
|
// return type. Same for the 3 cases below.
|
||||||
|
let arg = pop1_with_bitcast(state, type_of(op), builder);
|
||||||
|
state.push1(builder.ins().ceil(arg));
|
||||||
|
}
|
||||||
|
Operator::F32x4Floor | Operator::F64x2Floor => {
|
||||||
|
let arg = pop1_with_bitcast(state, type_of(op), builder);
|
||||||
|
state.push1(builder.ins().floor(arg));
|
||||||
|
}
|
||||||
|
Operator::F32x4Trunc | Operator::F64x2Trunc => {
|
||||||
|
let arg = pop1_with_bitcast(state, type_of(op), builder);
|
||||||
|
state.push1(builder.ins().trunc(arg));
|
||||||
|
}
|
||||||
|
Operator::F32x4Nearest | Operator::F64x2Nearest => {
|
||||||
|
let arg = pop1_with_bitcast(state, type_of(op), builder);
|
||||||
|
state.push1(builder.ins().nearest(arg));
|
||||||
|
}
|
||||||
|
Operator::I32x4DotI16x8S => {
|
||||||
|
let (a, b) = pop2_with_bitcast(state, I16X8, builder);
|
||||||
|
state.push1(builder.ins().widening_pairwise_dot_product_s(a, b));
|
||||||
|
}
|
||||||
|
Operator::I8x16Popcnt => {
|
||||||
|
let arg = pop1_with_bitcast(state, type_of(op), builder);
|
||||||
|
state.push1(builder.ins().popcnt(arg));
|
||||||
|
}
|
||||||
|
Operator::I16x8Q15MulrSatS => {
|
||||||
|
let (a, b) = pop2_with_bitcast(state, I16X8, builder);
|
||||||
|
state.push1(builder.ins().sqmul_round_sat(a, b))
|
||||||
|
}
|
||||||
Operator::I16x8ExtMulLowI8x16S => {
|
Operator::I16x8ExtMulLowI8x16S => {
|
||||||
let (a, b) = pop2_with_bitcast(state, I8X16, builder);
|
let (a, b) = pop2_with_bitcast(state, I8X16, builder);
|
||||||
let a_low = builder.ins().swiden_low(a);
|
let a_low = builder.ins().swiden_low(a);
|
||||||
@@ -1951,37 +1982,6 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
|||||||
let b_high = builder.ins().uwiden_high(b);
|
let b_high = builder.ins().uwiden_high(b);
|
||||||
state.push1(builder.ins().imul(a_high, b_high));
|
state.push1(builder.ins().imul(a_high, b_high));
|
||||||
}
|
}
|
||||||
Operator::F32x4Ceil | Operator::F64x2Ceil => {
|
|
||||||
// This is something of a misuse of `type_of`, because that produces the return type
|
|
||||||
// of `op`. In this case we want the arg type, but we know it's the same as the
|
|
||||||
// return type. Same for the 3 cases below.
|
|
||||||
let arg = pop1_with_bitcast(state, type_of(op), builder);
|
|
||||||
state.push1(builder.ins().ceil(arg));
|
|
||||||
}
|
|
||||||
Operator::F32x4Floor | Operator::F64x2Floor => {
|
|
||||||
let arg = pop1_with_bitcast(state, type_of(op), builder);
|
|
||||||
state.push1(builder.ins().floor(arg));
|
|
||||||
}
|
|
||||||
Operator::F32x4Trunc | Operator::F64x2Trunc => {
|
|
||||||
let arg = pop1_with_bitcast(state, type_of(op), builder);
|
|
||||||
state.push1(builder.ins().trunc(arg));
|
|
||||||
}
|
|
||||||
Operator::F32x4Nearest | Operator::F64x2Nearest => {
|
|
||||||
let arg = pop1_with_bitcast(state, type_of(op), builder);
|
|
||||||
state.push1(builder.ins().nearest(arg));
|
|
||||||
}
|
|
||||||
Operator::I32x4DotI16x8S => {
|
|
||||||
let (a, b) = pop2_with_bitcast(state, I16X8, builder);
|
|
||||||
state.push1(builder.ins().widening_pairwise_dot_product_s(a, b));
|
|
||||||
}
|
|
||||||
Operator::I8x16Popcnt => {
|
|
||||||
let arg = pop1_with_bitcast(state, type_of(op), builder);
|
|
||||||
state.push1(builder.ins().popcnt(arg));
|
|
||||||
}
|
|
||||||
Operator::I16x8Q15MulrSatS => {
|
|
||||||
let (a, b) = pop2_with_bitcast(state, I16X8, builder);
|
|
||||||
state.push1(builder.ins().sqmul_round_sat(a, b))
|
|
||||||
}
|
|
||||||
Operator::I16x8ExtAddPairwiseI8x16S
|
Operator::I16x8ExtAddPairwiseI8x16S
|
||||||
| Operator::I16x8ExtAddPairwiseI8x16U
|
| Operator::I16x8ExtAddPairwiseI8x16U
|
||||||
| Operator::I32x4ExtAddPairwiseI16x8S
|
| Operator::I32x4ExtAddPairwiseI16x8S
|
||||||
|
|||||||
Reference in New Issue
Block a user