@@ -4927,18 +4927,33 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
49274927 }
49284928 }
49294929 }
4930- Opcode :: ExtendedPairwiseAddSigned | Opcode :: ExtendedPairwiseAddUnsigned => {
4931- // Extended pairwise addition instructions computes extended sums within adjacent
4932- // pairs of lanes of a SIMD vector, producing a SIMD vector with half as many lanes.
4933- // Instruction sequences taken from instruction SPEC PR https://github.com/WebAssembly/simd/pull/380
4934- /*
4935- let input_ty = ctx.input_ty(insn, 0);
4936- let output_ty = ctx.output_ty(insn, 0);
4937- let src = put_input_in_reg(ctx, inputs[0]);
4938- let dst = get_output_reg(ctx, outputs[0]).only_reg().unwrap();
4939- unreachable!();
4940- match op {
4941- Opcode::ExtendedPairwiseAddSigned => match (input_ty, output_ty) {
4930+ Opcode :: IaddPairwise => {
4931+ if let ( Some ( swiden_low) , Some ( swiden_high) ) = (
4932+ matches_input ( ctx, inputs[ 0 ] , Opcode :: SwidenLow ) ,
4933+ matches_input ( ctx, inputs[ 1 ] , Opcode :: SwidenHigh ) ,
4934+ ) {
4935+ let swiden_input = & [
4936+ InsnInput {
4937+ insn : swiden_low,
4938+ input : 0 ,
4939+ } ,
4940+ InsnInput {
4941+ insn : swiden_high,
4942+ input : 0 ,
4943+ } ,
4944+ ] ;
4945+
4946+ let input0_ty = ctx. input_ty ( swiden_low, 0 ) ;
4947+ let output_ty = ctx. output_ty ( insn, 0 ) ;
4948+ let src0 = put_input_in_reg ( ctx, swiden_input[ 0 ] ) ;
4949+ let src1 = put_input_in_reg ( ctx, swiden_input[ 1 ] ) ;
4950+ let dst = get_output_reg ( ctx, outputs[ 0 ] ) . only_reg ( ) . unwrap ( ) ;
4951+ if src0 != src1 {
4952+ unimplemented ! (
4953+ "iadd_pairwise not implemented for general case with different inputs"
4954+ ) ;
4955+ }
4956+ match ( input0_ty, output_ty) {
49424957 ( types:: I8X16 , types:: I16X8 ) => {
49434958 static MUL_CONST : [ u8 ; 16 ] = [ 0x01 ; 16 ] ;
49444959 let mul_const = ctx. use_constant ( VCodeConstantData :: WellKnown ( & MUL_CONST ) ) ;
@@ -4949,7 +4964,7 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
49494964 RegMem :: reg ( mul_const_reg. to_reg ( ) ) ,
49504965 dst,
49514966 ) ) ;
4952- ctx.emit(Inst::xmm_rm_r(SseOpcode::Pmaddubsw, RegMem::reg(src ), dst));
4967+ ctx. emit ( Inst :: xmm_rm_r ( SseOpcode :: Pmaddubsw , RegMem :: reg ( src0 ) , dst) ) ;
49534968 }
49544969 ( types:: I16X8 , types:: I32X4 ) => {
49554970 static MUL_CONST : [ u8 ; 16 ] = [
@@ -4959,25 +4974,49 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
49594974 let mul_const = ctx. use_constant ( VCodeConstantData :: WellKnown ( & MUL_CONST ) ) ;
49604975 let mul_const_reg = ctx. alloc_tmp ( types:: I16X8 ) . only_reg ( ) . unwrap ( ) ;
49614976 ctx. emit ( Inst :: xmm_load_const ( mul_const, mul_const_reg, types:: I16X8 ) ) ;
4962- ctx.emit(Inst::xmm_mov(SseOpcode::Movdqa, RegMem::reg(src ), dst));
4977+ ctx. emit ( Inst :: xmm_mov ( SseOpcode :: Movdqa , RegMem :: reg ( src0 ) , dst) ) ;
49634978 ctx. emit ( Inst :: xmm_rm_r (
49644979 SseOpcode :: Pmaddwd ,
49654980 RegMem :: reg ( mul_const_reg. to_reg ( ) ) ,
49664981 dst,
49674982 ) ) ;
49684983 }
4969- _ => unreachable!(
4970- "Type pattern not supported {:?}-{:?} not supported for {:?}.",
4971- input_ty, output_ty, op
4972- ),
4973- },
4974- Opcode::ExtendedPairwiseAddUnsigned => match (input_ty, output_ty) {
4984+ _ => {
4985+ unimplemented ! ( "Type not supported for {:?}" , op) ;
4986+ }
4987+ }
4988+ } else if let ( Some ( uwiden_low) , Some ( uwiden_high) ) = (
4989+ matches_input ( ctx, inputs[ 0 ] , Opcode :: UwidenLow ) ,
4990+ matches_input ( ctx, inputs[ 1 ] , Opcode :: UwidenHigh ) ,
4991+ ) {
4992+ let uwiden_input = & [
4993+ InsnInput {
4994+ insn : uwiden_low,
4995+ input : 0 ,
4996+ } ,
4997+ InsnInput {
4998+ insn : uwiden_high,
4999+ input : 0 ,
5000+ } ,
5001+ ] ;
5002+
5003+ let input0_ty = ctx. input_ty ( uwiden_low, 0 ) ;
5004+ let output_ty = ctx. output_ty ( insn, 0 ) ;
5005+ let src0 = put_input_in_reg ( ctx, uwiden_input[ 0 ] ) ;
5006+ let src1 = put_input_in_reg ( ctx, uwiden_input[ 1 ] ) ;
5007+ let dst = get_output_reg ( ctx, outputs[ 0 ] ) . only_reg ( ) . unwrap ( ) ;
5008+ if src0 != src1 {
5009+ unimplemented ! (
5010+ "iadd_pairwise not implemented for general case with different inputs"
5011+ ) ;
5012+ }
5013+ match ( input0_ty, output_ty) {
49755014 ( types:: I8X16 , types:: I16X8 ) => {
49765015 static MUL_CONST : [ u8 ; 16 ] = [ 0x01 ; 16 ] ;
49775016 let mul_const = ctx. use_constant ( VCodeConstantData :: WellKnown ( & MUL_CONST ) ) ;
49785017 let mul_const_reg = ctx. alloc_tmp ( types:: I8X16 ) . only_reg ( ) . unwrap ( ) ;
49795018 ctx. emit ( Inst :: xmm_load_const ( mul_const, mul_const_reg, types:: I8X16 ) ) ;
4980- ctx.emit(Inst::xmm_mov(SseOpcode::Movdqa, RegMem::reg(src ), dst));
5019+ ctx. emit ( Inst :: xmm_mov ( SseOpcode :: Movdqa , RegMem :: reg ( src0 ) , dst) ) ;
49815020 ctx. emit ( Inst :: xmm_rm_r (
49825021 SseOpcode :: Pmaddubsw ,
49835022 RegMem :: reg ( mul_const_reg. to_reg ( ) ) ,
@@ -4997,7 +5036,7 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
49975036 pxor_const_reg,
49985037 types:: I16X8 ,
49995038 ) ) ;
5000- ctx.emit(Inst::xmm_mov(SseOpcode::Movdqa, RegMem::reg(src ), dst));
5039+ ctx. emit ( Inst :: xmm_mov ( SseOpcode :: Movdqa , RegMem :: reg ( src0 ) , dst) ) ;
50015040 ctx. emit ( Inst :: xmm_rm_r (
50025041 SseOpcode :: Pxor ,
50035042 RegMem :: reg ( pxor_const_reg. to_reg ( ) ) ,
@@ -5021,7 +5060,6 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
50215060 RegMem :: reg ( madd_const_reg. to_reg ( ) ) ,
50225061 dst,
50235062 ) ) ;
5024-
50255063 static ADDD_CONST2 : [ u8 ; 16 ] = [
50265064 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 ,
50275065 0x00 , 0x00 , 0x01 , 0x00 ,
@@ -5040,14 +5078,13 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
50405078 dst,
50415079 ) ) ;
50425080 }
5043- _ => unreachable!(
5044- "Type pattern not supported {:?}-{:?} not supported for {:?}.",
5045- input_ty, output_ty, op
5046- ),
5047- },
5048- _ => unreachable !("{:?} not supported. ", op),
5081+ _ => {
5082+ unimplemented ! ( "Type not supported for {:?}" , op ) ;
5083+ }
5084+ }
5085+ } else {
5086+ unimplemented ! ( "Operands not supported for {:?} " , op) ;
50495087 }
5050- */
50515088 }
50525089 Opcode :: UwidenHigh | Opcode :: UwidenLow | Opcode :: SwidenHigh | Opcode :: SwidenLow => {
50535090 let input_ty = ctx. input_ty ( insn, 0 ) ;
0 commit comments