[llvm-commits] [llvm] r81220 - in /llvm/trunk: lib/Target/ARM/ARMBaseInstrInfo.cpp lib/Target/ARM/ARMInstrNEON.td lib/Target/ARM/ARMRegisterInfo.td test/CodeGen/ARM/vmlal_lane.ll test/CodeGen/ARM/vmlsl_lane.ll test/CodeGen/ARM/vmul_lane.ll test/CodeGen/ARM/vmull_lane.ll test/CodeGen/ARM/vqRdmulh_lane.ll test/CodeGen/ARM/vqdmlal_lanes.ll test/CodeGen/ARM/vqdmlsl_lanes.ll test/CodeGen/ARM/vqdmulh_lane.ll test/CodeGen/ARM/vqdmull_lane.ll

Xerxes RĂ„nby xerxes at zafena.se
Tue Sep 8 11:37:39 PDT 2009


Hi Anton!

I belive this changeset caused about 230 CodeGen regression failures on
the llvm-arm-linux buildbot

compare the builds
http://google1.osuosl.org:8011/builders/llvm-arm-linux/builds/111   
and
http://google1.osuosl.org:8011/builders/llvm-arm-linux/builds/110

could you look into this?
cheers
Xerxes


Den 2009-09-08 17:22, Anton Korobeynikov skrev:
> Author: asl
> Date: Tue Sep  8 10:22:32 2009
> New Revision: 81220
>
> URL: http://llvm.org/viewvc/llvm-project?rev=81220&view=rev
> Log:
> Add NEON 'laned' operations. This fixes another bunch of gcc testsuite fails and
> makes the code faster.
>
> Added:
>     llvm/trunk/test/CodeGen/ARM/vmlal_lane.ll
>     llvm/trunk/test/CodeGen/ARM/vmlsl_lane.ll
>     llvm/trunk/test/CodeGen/ARM/vmul_lane.ll
>     llvm/trunk/test/CodeGen/ARM/vmull_lane.ll
>     llvm/trunk/test/CodeGen/ARM/vqRdmulh_lane.ll
>     llvm/trunk/test/CodeGen/ARM/vqdmlal_lanes.ll
>     llvm/trunk/test/CodeGen/ARM/vqdmlsl_lanes.ll
>     llvm/trunk/test/CodeGen/ARM/vqdmulh_lane.ll
>     llvm/trunk/test/CodeGen/ARM/vqdmull_lane.ll
> Modified:
>     llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
>     llvm/trunk/lib/Target/ARM/ARMInstrNEON.td
>     llvm/trunk/lib/Target/ARM/ARMRegisterInfo.td
>
> Modified: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp?rev=81220&r1=81219&r2=81220&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp Tue Sep  8 10:22:32 2009
> @@ -612,14 +612,24 @@
>    if (I != MBB.end()) DL = I->getDebugLoc();
>  
>    if (DestRC != SrcRC) {
> -    if (((DestRC == ARM::DPRRegisterClass) &&
> -         (SrcRC == ARM::DPR_VFP2RegisterClass)) ||
> -        ((SrcRC == ARM::DPRRegisterClass) &&
> -         (DestRC == ARM::DPR_VFP2RegisterClass))) {
> -      // Allow copy between DPR and DPR_VFP2.
> -    } else {
> +    // Allow DPR / DPR_VFP2 / DPR_8 cross-class copies
> +    if (DestRC == ARM::DPRRegisterClass) {
> +      if (SrcRC == ARM::DPR_VFP2RegisterClass ||
> +          SrcRC == ARM::DPR_8RegisterClass) {
> +      } else
> +        return false;
> +    } else if (DestRC == ARM::DPR_VFP2RegisterClass) {
> +      if (SrcRC == ARM::DPRRegisterClass ||
> +          SrcRC == ARM::DPR_8RegisterClass) {
> +      } else
> +        return false;
> +    } else if (DestRC == ARM::DPR_8RegisterClass) {
> +      if (SrcRC == ARM::DPRRegisterClass ||
> +          SrcRC == ARM::DPR_VFP2RegisterClass) {
> +      } else
> +        return false;
> +    } else
>        return false;
> -    }
>    }
>  
>    if (DestRC == ARM::GPRRegisterClass) {
> @@ -629,7 +639,8 @@
>      AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::FCPYS), DestReg)
>                     .addReg(SrcReg));
>    } else if ((DestRC == ARM::DPRRegisterClass) ||
> -             (DestRC == ARM::DPR_VFP2RegisterClass)) {
> +             (DestRC == ARM::DPR_VFP2RegisterClass) ||
> +             (DestRC == ARM::DPR_8RegisterClass)) {
>      AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::FCPYD), DestReg)
>                     .addReg(SrcReg));
>    } else if (DestRC == ARM::QPRRegisterClass) {
> @@ -652,7 +663,9 @@
>      AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::STR))
>                     .addReg(SrcReg, getKillRegState(isKill))
>                     .addFrameIndex(FI).addReg(0).addImm(0));
> -  } else if (RC == ARM::DPRRegisterClass || RC == ARM::DPR_VFP2RegisterClass) {
> +  } else if (RC == ARM::DPRRegisterClass ||
> +             RC == ARM::DPR_VFP2RegisterClass ||
> +             RC == ARM::DPR_8RegisterClass) {
>      AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::FSTD))
>                     .addReg(SrcReg, getKillRegState(isKill))
>                     .addFrameIndex(FI).addImm(0));
> @@ -678,7 +691,9 @@
>    if (RC == ARM::GPRRegisterClass) {
>      AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::LDR), DestReg)
>                     .addFrameIndex(FI).addReg(0).addImm(0));
> -  } else if (RC == ARM::DPRRegisterClass || RC == ARM::DPR_VFP2RegisterClass) {
> +  } else if (RC == ARM::DPRRegisterClass ||
> +             RC == ARM::DPR_VFP2RegisterClass ||
> +             RC == ARM::DPR_8RegisterClass) {
>      AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::FLDD), DestReg)
>                     .addFrameIndex(FI).addImm(0));
>    } else if (RC == ARM::SPRRegisterClass) {
>
> Modified: llvm/trunk/lib/Target/ARM/ARMInstrNEON.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrNEON.td?rev=81220&r1=81219&r2=81220&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMInstrNEON.td (original)
> +++ llvm/trunk/lib/Target/ARM/ARMInstrNEON.td Tue Sep  8 10:22:32 2009
> @@ -475,6 +475,31 @@
>          [(set DPR:$dst, (ResTy (OpNode (OpTy DPR:$src1), (OpTy DPR:$src2))))]> {
>    let isCommutable = Commutable;
>  }
> +class N3VDSL<bits<2> op21_20, bits<4> op11_8, 
> +             string OpcodeStr, ValueType Ty, SDNode ShOp>
> +  : N3V<0, 1, op21_20, op11_8, 1, 0,
> +        (outs DPR:$dst), (ins DPR:$src1, DPR_VFP2:$src2, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src1, $src2[$lane]"), "",
> +        [(set (Ty DPR:$dst),
> +              (Ty (ShOp (Ty DPR:$src1),
> +                        (Ty (NEONvduplane (Ty DPR_VFP2:$src2),
> +                                          imm:$lane)))))]> {
> +  let isCommutable = 0;
> +}
> +class N3VDSL16<bits<2> op21_20, bits<4> op11_8, 
> +               string OpcodeStr, ValueType Ty, SDNode ShOp>
> +  : N3V<0, 1, op21_20, op11_8, 1, 0,
> +        (outs DPR:$dst), (ins DPR:$src1, DPR_8:$src2, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src1, $src2[$lane]"), "",
> +        [(set (Ty DPR:$dst),
> +              (Ty (ShOp (Ty DPR:$src1),
> +                        (Ty (NEONvduplane (Ty DPR_8:$src2),
> +                                          imm:$lane)))))]> {
> +  let isCommutable = 0;
> +}
> +
>  class N3VQ<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
>             string OpcodeStr, ValueType ResTy, ValueType OpTy,
>             SDNode OpNode, bit Commutable>
> @@ -484,6 +509,30 @@
>          [(set QPR:$dst, (ResTy (OpNode (OpTy QPR:$src1), (OpTy QPR:$src2))))]> {
>    let isCommutable = Commutable;
>  }
> +class N3VQSL<bits<2> op21_20, bits<4> op11_8, 
> +             string OpcodeStr, ValueType ResTy, ValueType OpTy, SDNode ShOp>
> +  : N3V<1, 1, op21_20, op11_8, 1, 0,
> +        (outs QPR:$dst), (ins QPR:$src1, DPR_VFP2:$src2, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src1, $src2[$lane]"), "",
> +        [(set (ResTy QPR:$dst),
> +              (ResTy (ShOp (ResTy QPR:$src1),
> +                           (ResTy (NEONvduplane (OpTy DPR_VFP2:$src2),
> +                                                imm:$lane)))))]> {
> +  let isCommutable = 0;
> +}
> +class N3VQSL16<bits<2> op21_20, bits<4> op11_8, 
> +               string OpcodeStr, ValueType ResTy, ValueType OpTy, SDNode ShOp>
> +  : N3V<1, 1, op21_20, op11_8, 1, 0,
> +        (outs QPR:$dst), (ins QPR:$src1, DPR_8:$src2, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src1, $src2[$lane]"), "",
> +        [(set (ResTy QPR:$dst),
> +              (ResTy (ShOp (ResTy QPR:$src1),
> +                           (ResTy (NEONvduplane (OpTy DPR_8:$src2),
> +                                                imm:$lane)))))]> {
> +  let isCommutable = 0;
> +}
>  
>  // Basic 3-register operations, scalar single-precision
>  class N3VDs<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
> @@ -511,6 +560,31 @@
>          [(set DPR:$dst, (ResTy (IntOp (OpTy DPR:$src1), (OpTy DPR:$src2))))]> {
>    let isCommutable = Commutable;
>  }
> +class N3VDIntSL<bits<2> op21_20, bits<4> op11_8, 
> +                string OpcodeStr, ValueType Ty, Intrinsic IntOp>
> +  : N3V<0, 1, op21_20, op11_8, 1, 0,
> +        (outs DPR:$dst), (ins DPR:$src1, DPR_VFP2:$src2, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src1, $src2[$lane]"), "",
> +        [(set (Ty DPR:$dst),
> +              (Ty (IntOp (Ty DPR:$src1),
> +                         (Ty (NEONvduplane (Ty DPR_VFP2:$src2),
> +                                           imm:$lane)))))]> {
> +  let isCommutable = 0;
> +}
> +class N3VDIntSL16<bits<2> op21_20, bits<4> op11_8, 
> +                  string OpcodeStr, ValueType Ty, Intrinsic IntOp>
> +  : N3V<0, 1, op21_20, op11_8, 1, 0,
> +        (outs DPR:$dst), (ins DPR:$src1, DPR_8:$src2, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src1, $src2[$lane]"), "",
> +        [(set (Ty DPR:$dst),
> +              (Ty (IntOp (Ty DPR:$src1),
> +                         (Ty (NEONvduplane (Ty DPR_8:$src2),
> +                                           imm:$lane)))))]> {
> +  let isCommutable = 0;
> +}
> +
>  class N3VQInt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
>                string OpcodeStr, ValueType ResTy, ValueType OpTy,
>                Intrinsic IntOp, bit Commutable>
> @@ -520,6 +594,30 @@
>          [(set QPR:$dst, (ResTy (IntOp (OpTy QPR:$src1), (OpTy QPR:$src2))))]> {
>    let isCommutable = Commutable;
>  }
> +class N3VQIntSL<bits<2> op21_20, bits<4> op11_8, 
> +                string OpcodeStr, ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
> +  : N3V<1, 1, op21_20, op11_8, 1, 0,
> +        (outs QPR:$dst), (ins QPR:$src1, DPR_VFP2:$src2, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src1, $src2[$lane]"), "",
> +        [(set (ResTy QPR:$dst),
> +              (ResTy (IntOp (ResTy QPR:$src1),
> +                            (ResTy (NEONvduplane (OpTy DPR_VFP2:$src2),
> +                                                 imm:$lane)))))]> {
> +  let isCommutable = 0;
> +}
> +class N3VQIntSL16<bits<2> op21_20, bits<4> op11_8, 
> +                  string OpcodeStr, ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
> +  : N3V<1, 1, op21_20, op11_8, 1, 0,
> +        (outs QPR:$dst), (ins QPR:$src1, DPR_8:$src2, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src1, $src2[$lane]"), "",
> +        [(set (ResTy QPR:$dst),
> +              (ResTy (IntOp (ResTy QPR:$src1),
> +                            (ResTy (NEONvduplane (OpTy DPR_8:$src2),
> +                                                 imm:$lane)))))]> {
> +  let isCommutable = 0;
> +}
>  
>  // Multiply-Add/Sub operations, both double- and quad-register.
>  class N3VDMulOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
> @@ -529,6 +627,31 @@
>          !strconcat(OpcodeStr, "\t$dst, $src2, $src3"), "$src1 = $dst",
>          [(set DPR:$dst, (Ty (OpNode DPR:$src1,
>                               (Ty (MulOp DPR:$src2, DPR:$src3)))))]>;
> +class N3VDMulOpSL<bits<2> op21_20, bits<4> op11_8,
> +                  string OpcodeStr, ValueType Ty, SDNode MulOp, SDNode ShOp>
> +  : N3V<0, 1, op21_20, op11_8, 1, 0,
> +        (outs DPR:$dst),
> +        (ins DPR:$src1, DPR:$src2, DPR_VFP2:$src3, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src2, $src3[$lane]"), "$src1 = $dst",
> +        [(set (Ty DPR:$dst),
> +              (Ty (ShOp (Ty DPR:$src1),
> +                        (Ty (MulOp DPR:$src2,
> +                                   (Ty (NEONvduplane (Ty DPR_VFP2:$src3),
> +                                                     imm:$lane)))))))]>;
> +class N3VDMulOpSL16<bits<2> op21_20, bits<4> op11_8,
> +                    string OpcodeStr, ValueType Ty, SDNode MulOp, SDNode ShOp>
> +  : N3V<0, 1, op21_20, op11_8, 1, 0,
> +        (outs DPR:$dst),
> +        (ins DPR:$src1, DPR:$src2, DPR_8:$src3, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src2, $src3[$lane]"), "$src1 = $dst",
> +        [(set (Ty DPR:$dst),
> +              (Ty (ShOp (Ty DPR:$src1),
> +                        (Ty (MulOp DPR:$src2,
> +                                   (Ty (NEONvduplane (Ty DPR_8:$src3),
> +                                                     imm:$lane)))))))]>;
> +
>  class N3VQMulOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
>                  string OpcodeStr, ValueType Ty, SDNode MulOp, SDNode OpNode>
>    : N3V<op24, op23, op21_20, op11_8, 1, op4,
> @@ -536,6 +659,32 @@
>          !strconcat(OpcodeStr, "\t$dst, $src2, $src3"), "$src1 = $dst",
>          [(set QPR:$dst, (Ty (OpNode QPR:$src1,
>                               (Ty (MulOp QPR:$src2, QPR:$src3)))))]>;
> +class N3VQMulOpSL<bits<2> op21_20, bits<4> op11_8,
> +                  string OpcodeStr, ValueType ResTy, ValueType OpTy,
> +                  SDNode MulOp, SDNode ShOp>
> +  : N3V<1, 1, op21_20, op11_8, 1, 0,
> +        (outs QPR:$dst),
> +        (ins QPR:$src1, QPR:$src2, DPR_VFP2:$src3, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src2, $src3[$lane]"), "$src1 = $dst",
> +        [(set (ResTy QPR:$dst),
> +              (ResTy (ShOp (ResTy QPR:$src1),
> +                           (ResTy (MulOp QPR:$src2,
> +                                         (ResTy (NEONvduplane (OpTy DPR_VFP2:$src3),
> +                                                              imm:$lane)))))))]>;
> +class N3VQMulOpSL16<bits<2> op21_20, bits<4> op11_8,
> +                    string OpcodeStr, ValueType ResTy, ValueType OpTy,
> +                    SDNode MulOp, SDNode ShOp>
> +  : N3V<1, 1, op21_20, op11_8, 1, 0,
> +        (outs QPR:$dst),
> +        (ins QPR:$src1, QPR:$src2, DPR_8:$src3, nohash_imm:$lane),
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src2, $src3[$lane]"), "$src1 = $dst",
> +        [(set (ResTy QPR:$dst),
> +              (ResTy (ShOp (ResTy QPR:$src1),
> +                           (ResTy (MulOp QPR:$src2,
> +                                         (ResTy (NEONvduplane (OpTy DPR_8:$src3),
> +                                                              imm:$lane)))))))]>;
>  
>  // Multiply-Add/Sub operations, scalar single-precision
>  class N3VDMulOps<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
> @@ -581,6 +730,32 @@
>          !strconcat(OpcodeStr, "\t$dst, $src2, $src3"), "$src1 = $dst",
>          [(set QPR:$dst,
>            (TyQ (IntOp (TyQ QPR:$src1), (TyD DPR:$src2), (TyD DPR:$src3))))]>;
> +class N3VLInt3SL<bit op24, bits<2> op21_20, bits<4> op11_8,
> +                 string OpcodeStr, ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
> +  : N3V<op24, 1, op21_20, op11_8, 1, 0,
> +        (outs QPR:$dst),
> +        (ins QPR:$src1, DPR:$src2, DPR_VFP2:$src3, nohash_imm:$lane), 
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src2, $src3[$lane]"), "$src1 = $dst",
> +        [(set (ResTy QPR:$dst),
> +              (ResTy (IntOp (ResTy QPR:$src1),
> +                            (OpTy DPR:$src2),
> +                            (OpTy (NEONvduplane (OpTy DPR_VFP2:$src3),
> +                                                imm:$lane)))))]>;
> +class N3VLInt3SL16<bit op24, bits<2> op21_20, bits<4> op11_8,
> +                   string OpcodeStr, ValueType ResTy, ValueType OpTy,
> +                   Intrinsic IntOp>
> +  : N3V<op24, 1, op21_20, op11_8, 1, 0,
> +        (outs QPR:$dst),
> +        (ins QPR:$src1, DPR:$src2, DPR_8:$src3, nohash_imm:$lane), 
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src2, $src3[$lane]"), "$src1 = $dst",
> +        [(set (ResTy QPR:$dst),
> +              (ResTy (IntOp (ResTy QPR:$src1),
> +                            (OpTy DPR:$src2),
> +                            (OpTy (NEONvduplane (OpTy DPR_8:$src3),
> +                                                imm:$lane)))))]>;
> +
>  
>  // Narrowing 3-register intrinsics.
>  class N3VNInt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
> @@ -603,6 +778,27 @@
>          [(set QPR:$dst, (TyQ (IntOp (TyD DPR:$src1), (TyD DPR:$src2))))]> {
>    let isCommutable = Commutable;
>  }
> +class N3VLIntSL<bit op24, bits<2> op21_20, bits<4> op11_8,
> +                string OpcodeStr, ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
> +  : N3V<op24, 1, op21_20, op11_8, 1, 0,
> +        (outs QPR:$dst), (ins DPR:$src1, DPR_VFP2:$src2, nohash_imm:$lane), 
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src1, $src2[$lane]"), "",
> +        [(set (ResTy QPR:$dst),
> +              (ResTy (IntOp (OpTy DPR:$src1),
> +                            (OpTy (NEONvduplane (OpTy DPR_VFP2:$src2),
> +                                                imm:$lane)))))]>;
> +class N3VLIntSL16<bit op24, bits<2> op21_20, bits<4> op11_8,
> +                  string OpcodeStr, ValueType ResTy, ValueType OpTy, 
> +                  Intrinsic IntOp>
> +  : N3V<op24, 1, op21_20, op11_8, 1, 0,
> +        (outs QPR:$dst), (ins DPR:$src1, DPR_8:$src2, nohash_imm:$lane), 
> +        NoItinerary,
> +        !strconcat(OpcodeStr, "\t$dst, $src1, $src2[$lane]"), "",
> +        [(set (ResTy QPR:$dst),
> +              (ResTy (IntOp (OpTy DPR:$src1),
> +                            (OpTy (NEONvduplane (OpTy DPR_8:$src2),
> +                                                imm:$lane)))))]>;
>  
>  // Wide 3-register intrinsics.
>  class N3VWInt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
> @@ -761,6 +957,13 @@
>                     v4i32, v4i32, OpNode, Commutable>;
>  }
>  
> +multiclass N3VSL_HS<bits<4> op11_8, string OpcodeStr, SDNode ShOp> {
> +  def v4i16 : N3VDSL16<0b01, op11_8, !strconcat(OpcodeStr, "16"), v4i16, ShOp>;
> +  def v2i32 : N3VDSL<0b10, op11_8, !strconcat(OpcodeStr, "32"), v2i32, ShOp>;
> +  def v8i16 : N3VQSL16<0b01, op11_8, !strconcat(OpcodeStr, "16"), v8i16, v4i16, ShOp>;
> +  def v4i32 : N3VQSL<0b10, op11_8, !strconcat(OpcodeStr, "32"), v4i32, v2i32, ShOp>;
> +}
> +
>  // ....then also with element size 64 bits:
>  multiclass N3V_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
>                      string OpcodeStr, SDNode OpNode, bit Commutable = 0>
> @@ -817,6 +1020,13 @@
>                        v4i32, v4i32, IntOp, Commutable>;
>  }
>  
> +multiclass N3VIntSL_HS<bits<4> op11_8, string OpcodeStr, Intrinsic IntOp> {
> +  def v4i16 : N3VDIntSL16<0b01, op11_8, !strconcat(OpcodeStr, "16"), v4i16, IntOp>;
> +  def v2i32 : N3VDIntSL<0b10, op11_8, !strconcat(OpcodeStr, "32"), v2i32, IntOp>;
> +  def v8i16 : N3VQIntSL16<0b01, op11_8, !strconcat(OpcodeStr, "16"), v8i16, v4i16, IntOp>;
> +  def v4i32 : N3VQIntSL<0b10, op11_8, !strconcat(OpcodeStr, "32"), v4i32, v2i32, IntOp>;
> +}
> +
>  // ....then also with element size of 8 bits:
>  multiclass N3VInt_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
>                        string OpcodeStr, Intrinsic IntOp, bit Commutable = 0>
> @@ -862,6 +1072,14 @@
>                        v2i64, v2i32, IntOp, Commutable>;
>  }
>  
> +multiclass N3VLIntSL_HS<bit op24, bits<4> op11_8,
> +                        string OpcodeStr, Intrinsic IntOp> {
> +  def v4i16 : N3VLIntSL16<op24, 0b01, op11_8, 
> +                          !strconcat(OpcodeStr, "16"), v4i32, v4i16, IntOp>;
> +  def v2i32 : N3VLIntSL<op24, 0b10, op11_8, 
> +                        !strconcat(OpcodeStr, "32"), v2i64, v2i32, IntOp>;
> +}
> +
>  // ....then also with element size of 8 bits:
>  multiclass N3VLInt_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
>                         string OpcodeStr, Intrinsic IntOp, bit Commutable = 0>
> @@ -905,6 +1123,16 @@
>                          !strconcat(OpcodeStr, "32"), v4i32, mul, OpNode>;
>  }
>  
> +multiclass N3VMulOpSL_HS<bits<4> op11_8, string OpcodeStr, SDNode ShOp> {
> +  def v4i16 : N3VDMulOpSL16<0b01, op11_8,
> +                            !strconcat(OpcodeStr, "16"), v4i16, mul, ShOp>;
> +  def v2i32 : N3VDMulOpSL<0b10, op11_8,
> +                          !strconcat(OpcodeStr, "32"), v2i32, mul, ShOp>;
> +  def v8i16 : N3VQMulOpSL16<0b01, op11_8,
> +                            !strconcat(OpcodeStr, "16"), v8i16, v4i16, mul, ShOp>;
> +  def v4i32 : N3VQMulOpSL<0b10, op11_8,
> +                          !strconcat(OpcodeStr, "32"), v4i32, v2i32, mul, ShOp>;
> +}
>  
>  // Neon 3-argument intrinsics,
>  //   element sizes of 8, 16 and 32 bits:
> @@ -939,6 +1167,14 @@
>                         !strconcat(OpcodeStr, "32"), v2i64, v2i32, IntOp>;
>  }
>  
> +multiclass N3VLInt3SL_HS<bit op24, bits<4> op11_8,
> +                         string OpcodeStr, Intrinsic IntOp> {
> +  def v4i16 : N3VLInt3SL16<op24, 0b01, op11_8,
> +                           !strconcat(OpcodeStr, "16"), v4i32, v4i16, IntOp>;
> +  def v2i32 : N3VLInt3SL<op24, 0b10, op11_8,
> +                         !strconcat(OpcodeStr, "32"), v2i64, v2i32, IntOp>;
> +}
> +
>  // ....then also with element size of 8 bits:
>  multiclass N3VLInt3_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
>                          string OpcodeStr, Intrinsic IntOp>
> @@ -1134,17 +1370,71 @@
>                          int_arm_neon_vmulp, 1>;
>  def  VMULfd   : N3VD<1, 0, 0b00, 0b1101, 1, "vmul.f32", v2f32, v2f32, fmul, 1>;
>  def  VMULfq   : N3VQ<1, 0, 0b00, 0b1101, 1, "vmul.f32", v4f32, v4f32, fmul, 1>;
> +defm VMULsl  : N3VSL_HS<0b1000, "vmul.i", mul>;
> +def VMULslfd : N3VDSL<0b10, 0b1001, "vmul.f32", v2f32, fmul>;
> +def VMULslfq : N3VQSL<0b10, 0b1001, "vmul.f32", v4f32, v2f32, fmul>;
> +def : Pat<(v8i16 (mul (v8i16 QPR:$src1),
> +                      (v8i16 (NEONvduplane (v8i16 QPR:$src2), imm:$lane)))),
> +          (v8i16 (VMULslv8i16 (v8i16 QPR:$src1),
> +                              (v4i16 (EXTRACT_SUBREG QPR:$src2,
> +                                                     (DSubReg_i16_reg imm:$lane))),
> +                              (SubReg_i16_lane imm:$lane)))>;
> +def : Pat<(v4i32 (mul (v4i32 QPR:$src1),
> +                      (v4i32 (NEONvduplane (v4i32 QPR:$src2), imm:$lane)))),
> +          (v4i32 (VMULslv4i32 (v4i32 QPR:$src1),
> +                              (v2i32 (EXTRACT_SUBREG QPR:$src2,
> +                                                     (DSubReg_i32_reg imm:$lane))),
> +                              (SubReg_i32_lane imm:$lane)))>;
> +def : Pat<(v4f32 (fmul (v4f32 QPR:$src1),
> +                       (v4f32 (NEONvduplane (v4f32 QPR:$src2), imm:$lane)))),
> +          (v4f32 (VMULslfq (v4f32 QPR:$src1),
> +                           (v2f32 (EXTRACT_SUBREG QPR:$src2,
> +                                                  (DSubReg_i32_reg imm:$lane))),
> +                           (SubReg_i32_lane imm:$lane)))>;
> +
>  //   VQDMULH  : Vector Saturating Doubling Multiply Returning High Half
>  defm VQDMULH  : N3VInt_HS<0,0,0b1011,0, "vqdmulh.s", int_arm_neon_vqdmulh, 1>;
> +defm VQDMULHsl: N3VIntSL_HS<0b1100, "vqdmulh.s",  int_arm_neon_vqdmulh>;
> +def : Pat<(v8i16 (int_arm_neon_vqdmulh (v8i16 QPR:$src1),
> +                                       (v8i16 (NEONvduplane (v8i16 QPR:$src2), imm:$lane)))),
> +          (v8i16 (VQDMULHslv8i16 (v8i16 QPR:$src1),
> +                                 (v4i16 (EXTRACT_SUBREG QPR:$src2,
> +                                                        (DSubReg_i16_reg imm:$lane))),
> +                                 (SubReg_i16_lane imm:$lane)))>;
> +def : Pat<(v4i32 (int_arm_neon_vqdmulh (v4i32 QPR:$src1),
> +                                       (v4i32 (NEONvduplane (v4i32 QPR:$src2), imm:$lane)))),
> +          (v4i32 (VQDMULHslv4i32 (v4i32 QPR:$src1),
> +                                 (v2i32 (EXTRACT_SUBREG QPR:$src2,
> +                                                        (DSubReg_i32_reg imm:$lane))),
> +                                 (SubReg_i32_lane imm:$lane)))>;
> +
>  //   VQRDMULH : Vector Rounding Saturating Doubling Multiply Returning High Half
> -defm VQRDMULH : N3VInt_HS<1,0,0b1011,0, "vqrdmulh.s", int_arm_neon_vqrdmulh, 1>;
> +defm VQRDMULH   : N3VInt_HS<1,0,0b1011,0, "vqrdmulh.s", int_arm_neon_vqrdmulh, 1>;
> +defm VQRDMULHsl : N3VIntSL_HS<0b1101, "vqrdmulh.s",  int_arm_neon_vqrdmulh>;
> +def : Pat<(v8i16 (int_arm_neon_vqrdmulh (v8i16 QPR:$src1),
> +                                        (v8i16 (NEONvduplane (v8i16 QPR:$src2), imm:$lane)))),
> +          (v8i16 (VQRDMULHslv8i16 (v8i16 QPR:$src1),
> +                                  (v4i16 (EXTRACT_SUBREG QPR:$src2,
> +                                                         (DSubReg_i16_reg imm:$lane))),
> +                                  (SubReg_i16_lane imm:$lane)))>;
> +def : Pat<(v4i32 (int_arm_neon_vqrdmulh (v4i32 QPR:$src1),
> +                                        (v4i32 (NEONvduplane (v4i32 QPR:$src2), imm:$lane)))),
> +          (v4i32 (VQRDMULHslv4i32 (v4i32 QPR:$src1),
> +                                  (v2i32 (EXTRACT_SUBREG QPR:$src2,
> +                                                         (DSubReg_i32_reg imm:$lane))),
> +                                  (SubReg_i32_lane imm:$lane)))>;
> +
>  //   VMULL    : Vector Multiply Long (integer and polynomial) (Q = D * D)
>  defm VMULLs   : N3VLInt_QHS<0,1,0b1100,0, "vmull.s", int_arm_neon_vmulls, 1>;
>  defm VMULLu   : N3VLInt_QHS<1,1,0b1100,0, "vmull.u", int_arm_neon_vmullu, 1>;
>  def  VMULLp   : N3VLInt<0, 1, 0b00, 0b1110, 0, "vmull.p8", v8i16, v8i8,
>                          int_arm_neon_vmullp, 1>;
> +defm VMULLsls : N3VLIntSL_HS<0, 0b1010, "vmull.s", int_arm_neon_vmulls>;
> +defm VMULLslu : N3VLIntSL_HS<1, 0b1010, "vmull.u", int_arm_neon_vmullu>;
> +
>  //   VQDMULL  : Vector Saturating Doubling Multiply Long (Q = D * D)
>  defm VQDMULL  : N3VLInt_HS<0,1,0b1101,0, "vqdmull.s", int_arm_neon_vqdmull, 1>;
> +defm VQDMULLsl: N3VLIntSL_HS<0, 0b1011, "vqdmull.s", int_arm_neon_vqdmull>;
>  
>  // Vector Multiply-Accumulate and Multiply-Subtract Operations.
>  
> @@ -1152,20 +1442,93 @@
>  defm VMLA     : N3VMulOp_QHS<0, 0, 0b1001, 0, "vmla.i", add>;
>  def  VMLAfd   : N3VDMulOp<0, 0, 0b00, 0b1101, 1, "vmla.f32", v2f32, fmul, fadd>;
>  def  VMLAfq   : N3VQMulOp<0, 0, 0b00, 0b1101, 1, "vmla.f32", v4f32, fmul, fadd>;
> +defm VMLAsl   : N3VMulOpSL_HS<0b0000, "vmla.i", add>;
> +def  VMLAslfd : N3VDMulOpSL<0b10, 0b0001, "vmla.f32", v2f32, fmul, fadd>;
> +def  VMLAslfq : N3VQMulOpSL<0b10, 0b0001, "vmla.f32", v4f32, v2f32, fmul, fadd>;
> +
> +def : Pat<(v8i16 (add (v8i16 QPR:$src1),
> +                      (mul (v8i16 QPR:$src2),
> +                           (v8i16 (NEONvduplane (v8i16 QPR:$src3), imm:$lane))))),
> +          (v8i16 (VMLAslv8i16 (v8i16 QPR:$src1),
> +                              (v8i16 QPR:$src2),
> +                              (v4i16 (EXTRACT_SUBREG QPR:$src3,
> +                                                     (DSubReg_i16_reg imm:$lane))),
> +                              (SubReg_i16_lane imm:$lane)))>;
> +
> +def : Pat<(v4i32 (add (v4i32 QPR:$src1),
> +                      (mul (v4i32 QPR:$src2),
> +                           (v4i32 (NEONvduplane (v4i32 QPR:$src3), imm:$lane))))),
> +          (v4i32 (VMLAslv4i32 (v4i32 QPR:$src1),
> +                              (v4i32 QPR:$src2),
> +                              (v2i32 (EXTRACT_SUBREG QPR:$src3,
> +                                                     (DSubReg_i32_reg imm:$lane))),
> +                              (SubReg_i32_lane imm:$lane)))>;
> +
> +def : Pat<(v4f32 (fadd (v4f32 QPR:$src1),
> +                       (fmul (v4f32 QPR:$src2),
> +                             (v4f32 (NEONvduplane (v4f32 QPR:$src3), imm:$lane))))),
> +          (v4f32 (VMLAslfq (v4f32 QPR:$src1),
> +                           (v4f32 QPR:$src2),
> +                           (v2f32 (EXTRACT_SUBREG QPR:$src3,
> +                                                  (DSubReg_i32_reg imm:$lane))),
> +                           (SubReg_i32_lane imm:$lane)))>;
> +
>  //   VMLAL    : Vector Multiply Accumulate Long (Q += D * D)
>  defm VMLALs   : N3VLInt3_QHS<0,1,0b1000,0, "vmlal.s", int_arm_neon_vmlals>;
>  defm VMLALu   : N3VLInt3_QHS<1,1,0b1000,0, "vmlal.u", int_arm_neon_vmlalu>;
> +
> +defm VMLALsls : N3VLInt3SL_HS<0, 0b0010, "vmlal.s", int_arm_neon_vmlals>;
> +defm VMLALslu : N3VLInt3SL_HS<1, 0b0010, "vmlal.u", int_arm_neon_vmlalu>;
> +
>  //   VQDMLAL  : Vector Saturating Doubling Multiply Accumulate Long (Q += D * D)
>  defm VQDMLAL  : N3VLInt3_HS<0, 1, 0b1001, 0, "vqdmlal.s", int_arm_neon_vqdmlal>;
> +defm VQDMLALsl: N3VLInt3SL_HS<0, 0b0011, "vqdmlal.s", int_arm_neon_vqdmlal>;
> +
>  //   VMLS     : Vector Multiply Subtract (integer and floating-point)
>  defm VMLS     : N3VMulOp_QHS<0, 0, 0b1001, 0, "vmls.i", sub>;
>  def  VMLSfd   : N3VDMulOp<0, 0, 0b10, 0b1101, 1, "vmls.f32", v2f32, fmul, fsub>;
>  def  VMLSfq   : N3VQMulOp<0, 0, 0b10, 0b1101, 1, "vmls.f32", v4f32, fmul, fsub>;
> +defm VMLSsl   : N3VMulOpSL_HS<0b0100, "vmls.i", sub>;
> +def  VMLSslfd : N3VDMulOpSL<0b10, 0b0101, "vmls.f32", v2f32, fmul, fsub>;
> +def  VMLSslfq : N3VQMulOpSL<0b10, 0b0101, "vmls.f32", v4f32, v2f32, fmul, fsub>;
> +
> +def : Pat<(v8i16 (sub (v8i16 QPR:$src1),
> +                      (mul (v8i16 QPR:$src2),
> +                           (v8i16 (NEONvduplane (v8i16 QPR:$src3), imm:$lane))))),
> +          (v8i16 (VMLSslv8i16 (v8i16 QPR:$src1),
> +                              (v8i16 QPR:$src2),
> +                              (v4i16 (EXTRACT_SUBREG QPR:$src3,
> +                                                     (DSubReg_i16_reg imm:$lane))),
> +                              (SubReg_i16_lane imm:$lane)))>;
> +
> +def : Pat<(v4i32 (sub (v4i32 QPR:$src1),
> +                      (mul (v4i32 QPR:$src2),
> +                           (v4i32 (NEONvduplane (v4i32 QPR:$src3), imm:$lane))))),
> +          (v4i32 (VMLSslv4i32 (v4i32 QPR:$src1),
> +                              (v4i32 QPR:$src2),
> +                              (v2i32 (EXTRACT_SUBREG QPR:$src3,
> +                                                     (DSubReg_i32_reg imm:$lane))),
> +                              (SubReg_i32_lane imm:$lane)))>;
> +
> +def : Pat<(v4f32 (fsub (v4f32 QPR:$src1),
> +                       (fmul (v4f32 QPR:$src2),
> +                             (v4f32 (NEONvduplane (v4f32 QPR:$src3), imm:$lane))))),
> +          (v4f32 (VMLSslfq (v4f32 QPR:$src1),
> +                           (v4f32 QPR:$src2),
> +                           (v2f32 (EXTRACT_SUBREG QPR:$src3,
> +                                                  (DSubReg_i32_reg imm:$lane))),
> +                           (SubReg_i32_lane imm:$lane)))>;
> +
>  //   VMLSL    : Vector Multiply Subtract Long (Q -= D * D)
>  defm VMLSLs   : N3VLInt3_QHS<0,1,0b1010,0, "vmlsl.s", int_arm_neon_vmlsls>;
>  defm VMLSLu   : N3VLInt3_QHS<1,1,0b1010,0, "vmlsl.u", int_arm_neon_vmlslu>;
> +
> +defm VMLSLsls : N3VLInt3SL_HS<0, 0b0110, "vmlsl.s", int_arm_neon_vmlsls>;
> +defm VMLSLslu : N3VLInt3SL_HS<1, 0b0110, "vmlsl.u", int_arm_neon_vmlslu>;
> +
>  //   VQDMLSL  : Vector Saturating Doubling Multiply Subtract Long (Q -= D * D)
>  defm VQDMLSL  : N3VLInt3_HS<0, 1, 0b1011, 0, "vqdmlsl.s", int_arm_neon_vqdmlsl>;
> +defm VQDMLSLsl: N3VLInt3SL_HS<0, 0b111, "vqdmlsl.s", int_arm_neon_vqdmlsl>;
>  
>  // Vector Subtract Operations.
>  
>
> Modified: llvm/trunk/lib/Target/ARM/ARMRegisterInfo.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMRegisterInfo.td?rev=81220&r1=81219&r2=81220&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMRegisterInfo.td (original)
> +++ llvm/trunk/lib/Target/ARM/ARMRegisterInfo.td Tue Sep  8 10:22:32 2009
> @@ -61,7 +61,7 @@
>  
>  // Aliases of the F* registers used to hold 64-bit fp values (doubles)
>  def D0  : ARMReg< 0,  "d0", [S0,   S1]>;
> -def D1  : ARMReg< 1,  "d1", [S2,   S3]>; 
> +def D1  : ARMReg< 1,  "d1", [S2,   S3]>;
>  def D2  : ARMReg< 2,  "d2", [S4,   S5]>;
>  def D3  : ARMReg< 3,  "d3", [S6,   S7]>;
>  def D4  : ARMReg< 4,  "d4", [S8,   S9]>;
> @@ -89,7 +89,7 @@
>  
>  // Advanced SIMD (NEON) defines 16 quad-word aliases
>  def Q0  : ARMReg< 0,  "q0", [D0,   D1]>;
> -def Q1  : ARMReg< 1,  "q1", [D2,   D3]>; 
> +def Q1  : ARMReg< 1,  "q1", [D2,   D3]>;
>  def Q2  : ARMReg< 2,  "q2", [D4,   D5]>;
>  def Q3  : ARMReg< 3,  "q3", [D6,   D7]>;
>  def Q4  : ARMReg< 4,  "q4", [D8,   D9]>;
> @@ -269,16 +269,16 @@
>    }];
>    let MethodBodies = [{
>      // VFP2
> -    static const unsigned ARM_DPR_VFP2[] = { 
> -      ARM::D0,  ARM::D1,  ARM::D2,  ARM::D3, 
> -      ARM::D4,  ARM::D5,  ARM::D6,  ARM::D7, 
> -      ARM::D8,  ARM::D9,  ARM::D10, ARM::D11, 
> +    static const unsigned ARM_DPR_VFP2[] = {
> +      ARM::D0,  ARM::D1,  ARM::D2,  ARM::D3,
> +      ARM::D4,  ARM::D5,  ARM::D6,  ARM::D7,
> +      ARM::D8,  ARM::D9,  ARM::D10, ARM::D11,
>        ARM::D12, ARM::D13, ARM::D14, ARM::D15 };
>      // VFP3
>      static const unsigned ARM_DPR_VFP3[] = {
> -      ARM::D0,  ARM::D1,  ARM::D2,  ARM::D3, 
> -      ARM::D4,  ARM::D5,  ARM::D6,  ARM::D7, 
> -      ARM::D8,  ARM::D9,  ARM::D10, ARM::D11, 
> +      ARM::D0,  ARM::D1,  ARM::D2,  ARM::D3,
> +      ARM::D4,  ARM::D5,  ARM::D6,  ARM::D7,
> +      ARM::D8,  ARM::D9,  ARM::D10, ARM::D11,
>        ARM::D12, ARM::D13, ARM::D14, ARM::D15,
>        ARM::D16, ARM::D17, ARM::D18, ARM::D19,
>        ARM::D20, ARM::D21, ARM::D22, ARM::D23,
> @@ -307,12 +307,19 @@
>  
>  // Subset of DPR that are accessible with VFP2 (and so that also have
>  // 32-bit SPR subregs).
> -def DPR_VFP2 : RegisterClass<"ARM", [f64, v2f32], 64,
> +def DPR_VFP2 : RegisterClass<"ARM", [f64, v2i32, v2f32], 64,
>                               [D0,  D1,  D2,  D3,  D4,  D5,  D6,  D7,
>                                D8,  D9,  D10, D11, D12, D13, D14, D15]> {
>    let SubRegClassList = [SPR, SPR];
>  }
>  
> +// Subset of DPR which can be used as a source of NEON scalars for 16-bit
> +// operations
> +def DPR_8 : RegisterClass<"ARM", [f64, v4i16, v2f32], 64,
> +                          [D0,  D1,  D2,  D3,  D4,  D5,  D6,  D7]> {
> +  let SubRegClassList = [SPR, SPR];
> +}
> +
>  // Generic 128-bit vector register class.
>  def QPR : RegisterClass<"ARM", [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], 128,
>                          [Q0,  Q1,  Q2,  Q3,  Q4,  Q5,  Q6,  Q7,
> @@ -364,4 +371,3 @@
>                      Q8,  Q9,  Q10, Q11, Q12, Q13, Q14, Q15],
>                     [D1,  D3,  D5,  D7,  D9,  D11, D13, D15,
>                      D17, D19, D21, D23, D25, D27, D29, D31]>;
> -
>
> Added: llvm/trunk/test/CodeGen/ARM/vmlal_lane.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vmlal_lane.ll?rev=81220&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/vmlal_lane.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/vmlal_lane.ll Tue Sep  8 10:22:32 2009
> @@ -0,0 +1,47 @@
> +; RUN: llc -mattr=+neon < %s | FileCheck %s
> +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
> +target triple = "thumbv7-elf"
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vmlal_lanes16(<4 x i32> %arg0_int32x4_t, <4 x i16> %arg1_int16x4_t, <4 x i16> %arg2_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmlal_lanes16
> +; CHECK: vmlal.s16 q0, d2, d3[1]
> +  %0 = shufflevector <4 x i16> %arg2_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
> +  %1 = tail call <4 x i32> @llvm.arm.neon.vmlals.v4i32(<4 x i32> %arg0_int32x4_t, <4 x i16> %arg1_int16x4_t, <4 x i16> %0) ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
> +
> +declare <4 x i32> @llvm.arm.neon.vmlals.v4i32(<4 x i32>, <4 x i16>, <4 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <2 x i64> @test_vmlal_lanes32(<2 x i64> %arg0_int64x2_t, <2 x i32> %arg1_int32x2_t, <2 x i32> %arg2_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmlal_lanes32
> +; CHECK: vmlal.s32 q0, d2, d3[1]
> +  %0 = shufflevector <2 x i32> %arg2_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = tail call <2 x i64> @llvm.arm.neon.vmlals.v2i64(<2 x i64> %arg0_int64x2_t, <2 x i32> %arg1_int32x2_t, <2 x i32> %0) ; <<2 x i64>> [#uses=1]
> +  ret <2 x i64> %1
> +}
> +
> +declare <2 x i64> @llvm.arm.neon.vmlals.v2i64(<2 x i64>, <2 x i32>, <2 x i32>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vmlal_laneu16(<4 x i32> %arg0_uint32x4_t, <4 x i16> %arg1_uint16x4_t, <4 x i16> %arg2_uint16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmlal_laneu16
> +; CHECK: vmlal.u16 q0, d2, d3[1]
> +  %0 = shufflevector <4 x i16> %arg2_uint16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
> +  %1 = tail call <4 x i32> @llvm.arm.neon.vmlalu.v4i32(<4 x i32> %arg0_uint32x4_t, <4 x i16> %arg1_uint16x4_t, <4 x i16> %0) ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
> +
> +declare <4 x i32> @llvm.arm.neon.vmlalu.v4i32(<4 x i32>, <4 x i16>, <4 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <2 x i64> @test_vmlal_laneu32(<2 x i64> %arg0_uint64x2_t, <2 x i32> %arg1_uint32x2_t, <2 x i32> %arg2_uint32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmlal_laneu32
> +; CHECK: vmlal.u32 q0, d2, d3[1]
> +  %0 = shufflevector <2 x i32> %arg2_uint32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = tail call <2 x i64> @llvm.arm.neon.vmlalu.v2i64(<2 x i64> %arg0_uint64x2_t, <2 x i32> %arg1_uint32x2_t, <2 x i32> %0) ; <<2 x i64>> [#uses=1]
> +  ret <2 x i64> %1
> +}
> +
> +declare <2 x i64> @llvm.arm.neon.vmlalu.v2i64(<2 x i64>, <2 x i32>, <2 x i32>) nounwind readnone
>
> Added: llvm/trunk/test/CodeGen/ARM/vmlsl_lane.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vmlsl_lane.ll?rev=81220&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/vmlsl_lane.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/vmlsl_lane.ll Tue Sep  8 10:22:32 2009
> @@ -0,0 +1,47 @@
> +; RUN: llc -mattr=+neon < %s | FileCheck %s
> +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
> +target triple = "thumbv7-elf"
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vmlsl_lanes16(<4 x i32> %arg0_int32x4_t, <4 x i16> %arg1_int16x4_t, <4 x i16> %arg2_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmlsl_lanes16
> +; CHECK: vmlsl.s16 q0, d2, d3[1]
> +  %0 = shufflevector <4 x i16> %arg2_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
> +  %1 = tail call <4 x i32> @llvm.arm.neon.vmlsls.v4i32(<4 x i32> %arg0_int32x4_t, <4 x i16> %arg1_int16x4_t, <4 x i16> %0) ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
> +
> +declare <4 x i32> @llvm.arm.neon.vmlsls.v4i32(<4 x i32>, <4 x i16>, <4 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <2 x i64> @test_vmlsl_lanes32(<2 x i64> %arg0_int64x2_t, <2 x i32> %arg1_int32x2_t, <2 x i32> %arg2_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmlsl_lanes32
> +; CHECK: vmlsl.s32 q0, d2, d3[1]
> +  %0 = shufflevector <2 x i32> %arg2_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = tail call <2 x i64> @llvm.arm.neon.vmlsls.v2i64(<2 x i64> %arg0_int64x2_t, <2 x i32> %arg1_int32x2_t, <2 x i32> %0) ; <<2 x i64>> [#uses=1]
> +  ret <2 x i64> %1
> +}
> +
> +declare <2 x i64> @llvm.arm.neon.vmlsls.v2i64(<2 x i64>, <2 x i32>, <2 x i32>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vmlsl_laneu16(<4 x i32> %arg0_uint32x4_t, <4 x i16> %arg1_uint16x4_t, <4 x i16> %arg2_uint16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmlsl_laneu16
> +; CHECK: vmlsl.u16 q0, d2, d3[1]
> +  %0 = shufflevector <4 x i16> %arg2_uint16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
> +  %1 = tail call <4 x i32> @llvm.arm.neon.vmlslu.v4i32(<4 x i32> %arg0_uint32x4_t, <4 x i16> %arg1_uint16x4_t, <4 x i16> %0) ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
> +
> +declare <4 x i32> @llvm.arm.neon.vmlslu.v4i32(<4 x i32>, <4 x i16>, <4 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <2 x i64> @test_vmlsl_laneu32(<2 x i64> %arg0_uint64x2_t, <2 x i32> %arg1_uint32x2_t, <2 x i32> %arg2_uint32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmlsl_laneu32
> +; CHECK: vmlsl.u32 q0, d2, d3[1]
> +  %0 = shufflevector <2 x i32> %arg2_uint32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = tail call <2 x i64> @llvm.arm.neon.vmlslu.v2i64(<2 x i64> %arg0_uint64x2_t, <2 x i32> %arg1_uint32x2_t, <2 x i32> %0) ; <<2 x i64>> [#uses=1]
> +  ret <2 x i64> %1
> +}
> +
> +declare <2 x i64> @llvm.arm.neon.vmlslu.v2i64(<2 x i64>, <2 x i32>, <2 x i32>) nounwind readnone
>
> Added: llvm/trunk/test/CodeGen/ARM/vmul_lane.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vmul_lane.ll?rev=81220&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/vmul_lane.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/vmul_lane.ll Tue Sep  8 10:22:32 2009
> @@ -0,0 +1,57 @@
> +; RUN: llc -mattr=+neon < %s | FileCheck %s
> +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
> +target triple = "thumbv7-elf"
> +
> +define arm_aapcs_vfpcc <2 x float> @test_vmul_lanef32(<2 x float> %arg0_float32x2_t, <2 x float> %arg1_float32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmul_lanef32:
> +; CHECK: vmul.f32 d0, d0, d1[0]
> +  %0 = shufflevector <2 x float> %arg1_float32x2_t, <2 x float> undef, <2 x i32> zeroinitializer ; <<2 x float>> [#uses=1]
> +  %1 = fmul <2 x float> %0, %arg0_float32x2_t     ; <<2 x float>> [#uses=1]
> +  ret <2 x float> %1
> +}
> +
> +define arm_aapcs_vfpcc <4 x i16> @test_vmul_lanes16(<4 x i16> %arg0_int16x4_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmul_lanes16:
> +; CHECK: vmul.i16 d0, d0, d1[1]
> +  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses$
> +  %1 = mul <4 x i16> %0, %arg0_int16x4_t          ; <<4 x i16>> [#uses=1]
> +  ret <4 x i16> %1
> +}
> +
> +define arm_aapcs_vfpcc <2 x i32> @test_vmul_lanes32(<2 x i32> %arg0_int32x2_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmul_lanes32:
> +; CHECK: vmul.i32 d0, d0, d1[1]
> +  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = mul <2 x i32> %0, %arg0_int32x2_t          ; <<2 x i32>> [#uses=1]
> +  ret <2 x i32> %1
> +}
> +
> +define arm_aapcs_vfpcc <4 x float> @test_vmulQ_lanef32(<4 x float> %arg0_float32x4_t, <2 x float> %arg1_float32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmulQ_lanef32:
> +; CHECK: vmul.f32 q0, q0, d2[1]
> +  %0 = shufflevector <2 x float> %arg1_float32x2_t, <2 x float> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x float>$
> +  %1 = fmul <4 x float> %0, %arg0_float32x4_t     ; <<4 x float>> [#uses=1]
> +  ret <4 x float> %1
> +}
> +
> +define arm_aapcs_vfpcc <8 x i16> @test_vmulQ_lanes16(<8 x i16> %arg0_int16x8_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmulQ_lanes16:
> +; CHECK: vmul.i16 q0, q0, d2[1]
> +  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
> +  %1 = mul <8 x i16> %0, %arg0_int16x8_t          ; <<8 x i16>> [#uses=1]
> +  ret <8 x i16> %1
> +}
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vmulQ_lanes32(<4 x i32> %arg0_int32x4_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmulQ_lanes32:
> +; CHECK: vmul.i32 q0, q0, d2[1]
> +  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i32>> [#uses$
> +  %1 = mul <4 x i32> %0, %arg0_int32x4_t          ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
>
> Added: llvm/trunk/test/CodeGen/ARM/vmull_lane.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vmull_lane.ll?rev=81220&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/vmull_lane.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/vmull_lane.ll Tue Sep  8 10:22:32 2009
> @@ -0,0 +1,47 @@
> +; RUN: llc -mattr=+neon < %s | FileCheck %s
> +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
> +target triple = "thumbv7-elf"
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vmull_lanes16(<4 x i16> %arg0_int16x4_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmull_lanes16
> +; CHECK: vmull.s16 q0, d0, d1[1]
> +  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
> +  %1 = tail call <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16> %arg0_int16x4_t, <4 x i16> %0) ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
> +
> +declare <4 x i32> @llvm.arm.neon.vmulls.v4i32(<4 x i16>, <4 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <2 x i64> @test_vmull_lanes32(<2 x i32> %arg0_int32x2_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmull_lanes32
> +; CHECK: vmull.s32 q0, d0, d1[1]
> +  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = tail call <2 x i64> @llvm.arm.neon.vmulls.v2i64(<2 x i32> %arg0_int32x2_t, <2 x i32> %0) ; <<2 x i64>> [#uses=1]
> +  ret <2 x i64> %1
> +}
> +
> +declare <2 x i64> @llvm.arm.neon.vmulls.v2i64(<2 x i32>, <2 x i32>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vmull_laneu16(<4 x i16> %arg0_uint16x4_t, <4 x i16> %arg1_uint16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmull_laneu16
> +; CHECK: vmull.u16 q0, d0, d1[1]
> +  %0 = shufflevector <4 x i16> %arg1_uint16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
> +  %1 = tail call <4 x i32> @llvm.arm.neon.vmullu.v4i32(<4 x i16> %arg0_uint16x4_t, <4 x i16> %0) ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
> +
> +declare <4 x i32> @llvm.arm.neon.vmullu.v4i32(<4 x i16>, <4 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <2 x i64> @test_vmull_laneu32(<2 x i32> %arg0_uint32x2_t, <2 x i32> %arg1_uint32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vmull_laneu32
> +; CHECK: vmull.u32 q0, d0, d1[1]
> +  %0 = shufflevector <2 x i32> %arg1_uint32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = tail call <2 x i64> @llvm.arm.neon.vmullu.v2i64(<2 x i32> %arg0_uint32x2_t, <2 x i32> %0) ; <<2 x i64>> [#uses=1]
> +  ret <2 x i64> %1
> +}
> +
> +declare <2 x i64> @llvm.arm.neon.vmullu.v2i64(<2 x i32>, <2 x i32>) nounwind readnone
>
> Added: llvm/trunk/test/CodeGen/ARM/vqRdmulh_lane.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vqRdmulh_lane.ll?rev=81220&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/vqRdmulh_lane.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/vqRdmulh_lane.ll Tue Sep  8 10:22:32 2009
> @@ -0,0 +1,47 @@
> +; RUN: llc -mattr=+neon < %s | FileCheck %s
> +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
> +target triple = "thumbv7-elf"
> +
> +define arm_aapcs_vfpcc <8 x i16> @test_vqRdmulhQ_lanes16(<8 x i16> %arg0_int16x8_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqRdmulhQ_lanes16
> +; CHECK: vqrdmulh.s16 q0, q0, d2[1]
> +  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> ; <<8 x i16>> [#uses=1]
> +  %1 = tail call <8 x i16> @llvm.arm.neon.vqrdmulh.v8i16(<8 x i16> %arg0_int16x8_t, <8 x i16> %0) ; <<8 x i16>> [#uses=1]
> +  ret <8 x i16> %1
> +}
> +
> +declare <8 x i16> @llvm.arm.neon.vqrdmulh.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vqRdmulhQ_lanes32(<4 x i32> %arg0_int32x4_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqRdmulhQ_lanes32
> +; CHECK: vqrdmulh.s32 q0, q0, d2[1]
> +  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i32>> [#uses=1]
> +  %1 = tail call <4 x i32> @llvm.arm.neon.vqrdmulh.v4i32(<4 x i32> %arg0_int32x4_t, <4 x i32> %0) ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
> +
> +declare <4 x i32> @llvm.arm.neon.vqrdmulh.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <4 x i16> @test_vqRdmulh_lanes16(<4 x i16> %arg0_int16x4_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqRdmulh_lanes16
> +; CHECK: vqrdmulh.s16 d0, d0, d1[1]
> +  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
> +  %1 = tail call <4 x i16> @llvm.arm.neon.vqrdmulh.v4i16(<4 x i16> %arg0_int16x4_t, <4 x i16> %0) ; <<4 x i16>> [#uses=1]
> +  ret <4 x i16> %1
> +}
> +
> +declare <4 x i16> @llvm.arm.neon.vqrdmulh.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <2 x i32> @test_vqRdmulh_lanes32(<2 x i32> %arg0_int32x2_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqRdmulh_lanes32
> +; CHECK: vqrdmulh.s32 d0, d0, d1[1]
> +  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = tail call <2 x i32> @llvm.arm.neon.vqrdmulh.v2i32(<2 x i32> %arg0_int32x2_t, <2 x i32> %0) ; <<2 x i32>> [#uses=1]
> +  ret <2 x i32> %1
> +}
> +
> +declare <2 x i32> @llvm.arm.neon.vqrdmulh.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
>
> Added: llvm/trunk/test/CodeGen/ARM/vqdmlal_lanes.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vqdmlal_lanes.ll?rev=81220&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/vqdmlal_lanes.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/vqdmlal_lanes.ll Tue Sep  8 10:22:32 2009
> @@ -0,0 +1,25 @@
> +; RUN: llc -mattr=+neon < %s | FileCheck %s
> +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
> +target triple = "thumbv7-elf"
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vqdmlal_lanes16(<4 x i32> %arg0_int32x4_t, <4 x i16> %arg1_int16x4_t, <4 x i16> %arg2_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqdmlal_lanes16
> +; CHECK: vqdmlal.s16 q0, d2, d3[1]
> +  %0 = shufflevector <4 x i16> %arg2_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
> +  %1 = tail call <4 x i32> @llvm.arm.neon.vqdmlal.v4i32(<4 x i32> %arg0_int32x4_t, <4 x i16> %arg1_int16x4_t, <4 x i16> %0) ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
> +
> +declare <4 x i32> @llvm.arm.neon.vqdmlal.v4i32(<4 x i32>, <4 x i16>, <4 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <2 x i64> @test_vqdmlal_lanes32(<2 x i64> %arg0_int64x2_t, <2 x i32> %arg1_int32x2_t, <2 x i32> %arg2_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqdmlal_lanes32
> +; CHECK: vqdmlal.s32 q0, d2, d3[1]
> +  %0 = shufflevector <2 x i32> %arg2_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = tail call <2 x i64> @llvm.arm.neon.vqdmlal.v2i64(<2 x i64> %arg0_int64x2_t, <2 x i32> %arg1_int32x2_t, <2 x i32> %0) ; <<2 x i64>> [#uses=1]
> +  ret <2 x i64> %1
> +}
> +
> +declare <2 x i64> @llvm.arm.neon.vqdmlal.v2i64(<2 x i64>, <2 x i32>, <2 x i32>) nounwind readnone
>
> Added: llvm/trunk/test/CodeGen/ARM/vqdmlsl_lanes.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vqdmlsl_lanes.ll?rev=81220&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/vqdmlsl_lanes.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/vqdmlsl_lanes.ll Tue Sep  8 10:22:32 2009
> @@ -0,0 +1,25 @@
> +; RUN: llc -mattr=+neon < %s | FileCheck %s
> +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
> +target triple = "thumbv7-elf"
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vqdmlsl_lanes16(<4 x i32> %arg0_int32x4_t, <4 x i16> %arg1_int16x4_t, <4 x i16> %arg2_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqdmlsl_lanes16
> +; CHECK: vqdmlsl.s16 q0, d2, d3[1]
> +  %0 = shufflevector <4 x i16> %arg2_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
> +  %1 = tail call <4 x i32> @llvm.arm.neon.vqdmlsl.v4i32(<4 x i32> %arg0_int32x4_t, <4 x i16> %arg1_int16x4_t, <4 x i16> %0) ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
> +
> +declare <4 x i32> @llvm.arm.neon.vqdmlsl.v4i32(<4 x i32>, <4 x i16>, <4 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <2 x i64> @test_vqdmlsl_lanes32(<2 x i64> %arg0_int64x2_t, <2 x i32> %arg1_int32x2_t, <2 x i32> %arg2_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqdmlsl_lanes32
> +; CHECK: vqdmlsl.s32 q0, d2, d3[1]
> +  %0 = shufflevector <2 x i32> %arg2_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = tail call <2 x i64> @llvm.arm.neon.vqdmlsl.v2i64(<2 x i64> %arg0_int64x2_t, <2 x i32> %arg1_int32x2_t, <2 x i32> %0) ; <<2 x i64>> [#uses=1]
> +  ret <2 x i64> %1
> +}
> +
> +declare <2 x i64> @llvm.arm.neon.vqdmlsl.v2i64(<2 x i64>, <2 x i32>, <2 x i32>) nounwind readnone
>
> Added: llvm/trunk/test/CodeGen/ARM/vqdmulh_lane.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vqdmulh_lane.ll?rev=81220&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/vqdmulh_lane.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/vqdmulh_lane.ll Tue Sep  8 10:22:32 2009
> @@ -0,0 +1,47 @@
> +; RUN: llc -mattr=+neon < %s | FileCheck %s
> +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
> +target triple = "thumbv7-elf"
> +
> +define arm_aapcs_vfpcc <8 x i16> @test_vqdmulhQ_lanes16(<8 x i16> %arg0_int16x8_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqdmulhQ_lanes16
> +; CHECK: vqdmulh.s16 q0, q0, d2[1]
> +  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> ; <<8 x i16>> [#uses=1]
> +  %1 = tail call <8 x i16> @llvm.arm.neon.vqdmulh.v8i16(<8 x i16> %arg0_int16x8_t, <8 x i16> %0) ; <<8 x i16>> [#uses=1]
> +  ret <8 x i16> %1
> +}
> +
> +declare <8 x i16> @llvm.arm.neon.vqdmulh.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vqdmulhQ_lanes32(<4 x i32> %arg0_int32x4_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqdmulhQ_lanes32
> +; CHECK: vqdmulh.s32 q0, q0, d2[1]
> +  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i32>> [#uses=1]
> +  %1 = tail call <4 x i32> @llvm.arm.neon.vqdmulh.v4i32(<4 x i32> %arg0_int32x4_t, <4 x i32> %0) ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
> +
> +declare <4 x i32> @llvm.arm.neon.vqdmulh.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <4 x i16> @test_vqdmulh_lanes16(<4 x i16> %arg0_int16x4_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqdmulh_lanes16
> +; CHECK: vqdmulh.s16 d0, d0, d1[1]
> +  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
> +  %1 = tail call <4 x i16> @llvm.arm.neon.vqdmulh.v4i16(<4 x i16> %arg0_int16x4_t, <4 x i16> %0) ; <<4 x i16>> [#uses=1]
> +  ret <4 x i16> %1
> +}
> +
> +declare <4 x i16> @llvm.arm.neon.vqdmulh.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <2 x i32> @test_vqdmulh_lanes32(<2 x i32> %arg0_int32x2_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqdmulh_lanes32
> +; CHECK: vqdmulh.s32 d0, d0, d1[1]
> +  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = tail call <2 x i32> @llvm.arm.neon.vqdmulh.v2i32(<2 x i32> %arg0_int32x2_t, <2 x i32> %0) ; <<2 x i32>> [#uses=1]
> +  ret <2 x i32> %1
> +}
> +
> +declare <2 x i32> @llvm.arm.neon.vqdmulh.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
>
> Added: llvm/trunk/test/CodeGen/ARM/vqdmull_lane.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vqdmull_lane.ll?rev=81220&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/vqdmull_lane.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/vqdmull_lane.ll Tue Sep  8 10:22:32 2009
> @@ -0,0 +1,25 @@
> +; RUN: llc -mattr=+neon < %s | FileCheck %s
> +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
> +target triple = "thumbv7-elf"
> +
> +define arm_aapcs_vfpcc <4 x i32> @test_vqdmull_lanes16(<4 x i16> %arg0_int16x4_t, <4 x i16> %arg1_int16x4_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqdmull_lanes16
> +; CHECK: vqdmull.s16 q0, d0, d1[1]
> +  %0 = shufflevector <4 x i16> %arg1_int16x4_t, <4 x i16> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> ; <<4 x i16>> [#uses=1]
> +  %1 = tail call <4 x i32> @llvm.arm.neon.vqdmull.v4i32(<4 x i16> %arg0_int16x4_t, <4 x i16> %0) ; <<4 x i32>> [#uses=1]
> +  ret <4 x i32> %1
> +}
> +
> +declare <4 x i32> @llvm.arm.neon.vqdmull.v4i32(<4 x i16>, <4 x i16>) nounwind readnone
> +
> +define arm_aapcs_vfpcc <2 x i64> @test_vqdmull_lanes32(<2 x i32> %arg0_int32x2_t, <2 x i32> %arg1_int32x2_t) nounwind readnone {
> +entry:
> +; CHECK: test_vqdmull_lanes32
> +; CHECK: vqdmull.s32 q0, d0, d1[1]
> +  %0 = shufflevector <2 x i32> %arg1_int32x2_t, <2 x i32> undef, <2 x i32> <i32 1, i32 1> ; <<2 x i32>> [#uses=1]
> +  %1 = tail call <2 x i64> @llvm.arm.neon.vqdmull.v2i64(<2 x i32> %arg0_int32x2_t, <2 x i32> %0) ; <<2 x i64>> [#uses=1]
> +  ret <2 x i64> %1
> +}
> +
> +declare <2 x i64> @llvm.arm.neon.vqdmull.v2i64(<2 x i32>, <2 x i32>) nounwind readnone
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>   




More information about the llvm-commits mailing list