; RUN: llvm-dis < %s.bc | FileCheck %s ; vmovls should be auto-upgraded to sext ; CHECK: vmovls8 ; CHECK-NOT: arm.neon.vmovls.v8i16 ; CHECK: sext <8 x i8> ; CHECK: vmovls16 ; CHECK-NOT: arm.neon.vmovls.v4i32 ; CHECK: sext <4 x i16> ; CHECK: vmovls32 ; CHECK-NOT: arm.neon.vmovls.v2i64 ; CHECK: sext <2 x i32> ; vmovlu should be auto-upgraded to zext ; CHECK: vmovlu8 ; CHECK-NOT: arm.neon.vmovlu.v8i16 ; CHECK: zext <8 x i8> ; CHECK: vmovlu16 ; CHECK-NOT: arm.neon.vmovlu.v4i32 ; CHECK: zext <4 x i16> ; CHECK: vmovlu32 ; CHECK-NOT: arm.neon.vmovlu.v2i64 ; CHECK: zext <2 x i32> ; vaddl/vaddw should be auto-upgraded to add with sext/zext ; CHECK: vaddls16 ; CHECK-NOT: arm.neon.vaddls.v4i32 ; CHECK: sext <4 x i16> ; CHECK-NEXT: sext <4 x i16> ; CHECK-NEXT: add <4 x i32> ; CHECK: vaddlu32 ; CHECK-NOT: arm.neon.vaddlu.v2i64 ; CHECK: zext <2 x i32> ; CHECK-NEXT: zext <2 x i32> ; CHECK-NEXT: add <2 x i64> ; CHECK: vaddws8 ; CHECK-NOT: arm.neon.vaddws.v8i16 ; CHECK: sext <8 x i8> ; CHECK-NEXT: add <8 x i16> ; CHECK: vaddwu16 ; CHECK-NOT: arm.neon.vaddwu.v4i32 ; CHECK: zext <4 x i16> ; CHECK-NEXT: add <4 x i32> ; vsubl/vsubw should be auto-upgraded to subtract with sext/zext ; CHECK: vsubls16 ; CHECK-NOT: arm.neon.vsubls.v4i32 ; CHECK: sext <4 x i16> ; CHECK-NEXT: sext <4 x i16> ; CHECK-NEXT: sub <4 x i32> ; CHECK: vsublu32 ; CHECK-NOT: arm.neon.vsublu.v2i64 ; CHECK: zext <2 x i32> ; CHECK-NEXT: zext <2 x i32> ; CHECK-NEXT: sub <2 x i64> ; CHECK: vsubws8 ; CHECK-NOT: arm.neon.vsubws.v8i16 ; CHECK: sext <8 x i8> ; CHECK-NEXT: sub <8 x i16> ; CHECK: vsubwu16 ; CHECK-NOT: arm.neon.vsubwu.v4i32 ; CHECK: zext <4 x i16> ; CHECK-NEXT: sub <4 x i32> ; vmull should be auto-upgraded to multiply with sext/zext ; (but vmullp should remain an intrinsic) ; CHECK: vmulls8 ; CHECK-NOT: arm.neon.vmulls.v8i16 ; CHECK: sext <8 x i8> ; CHECK-NEXT: sext <8 x i8> ; CHECK-NEXT: mul <8 x i16> ; CHECK: vmullu16 ; CHECK-NOT: arm.neon.vmullu.v4i32 ; CHECK: zext <4 x i16> ; CHECK-NEXT: zext <4 x i16> ; CHECK-NEXT: mul <4 x i32> ; CHECK: vmullp8 ; CHECK: arm.neon.vmullp.v8i16 ; vmlal should be auto-upgraded to multiply/add with sext/zext ; CHECK: vmlals32 ; CHECK-NOT: arm.neon.vmlals.v2i64 ; CHECK: sext <2 x i32> ; CHECK-NEXT: sext <2 x i32> ; CHECK-NEXT: mul <2 x i64> ; CHECK-NEXT: add <2 x i64> ; CHECK: vmlalu8 ; CHECK-NOT: arm.neon.vmlalu.v8i16 ; CHECK: zext <8 x i8> ; CHECK-NEXT: zext <8 x i8> ; CHECK-NEXT: mul <8 x i16> ; CHECK-NEXT: add <8 x i16> ; vmlsl should be auto-upgraded to multiply/sub with sext/zext ; CHECK: vmlsls16 ; CHECK-NOT: arm.neon.vmlsls.v4i32 ; CHECK: sext <4 x i16> ; CHECK-NEXT: sext <4 x i16> ; CHECK-NEXT: mul <4 x i32> ; CHECK-NEXT: sub <4 x i32> ; CHECK: vmlslu32 ; CHECK-NOT: arm.neon.vmlslu.v2i64 ; CHECK: zext <2 x i32> ; CHECK-NEXT: zext <2 x i32> ; CHECK-NEXT: mul <2 x i64> ; CHECK-NEXT: sub <2 x i64> ; vaba should be auto-upgraded to vabd + add ; CHECK: vabas32 ; CHECK-NOT: arm.neon.vabas.v2i32 ; CHECK: arm.neon.vabds.v2i32 ; CHECK-NEXT: add <2 x i32> ; CHECK: vabaQu8 ; CHECK-NOT: arm.neon.vabau.v16i8 ; CHECK: arm.neon.vabdu.v16i8 ; CHECK-NEXT: add <16 x i8> ; vabal should be auto-upgraded to vabd with zext + add ; CHECK: vabals16 ; CHECK-NOT: arm.neon.vabals.v4i32 ; CHECK: arm.neon.vabds.v4i16 ; CHECK-NEXT: zext <4 x i16> ; CHECK-NEXT: add <4 x i32> ; CHECK: vabalu32 ; CHECK-NOT: arm.neon.vabalu.v2i64 ; CHECK: arm.neon.vabdu.v2i32 ; CHECK-NEXT: zext <2 x i32> ; CHECK-NEXT: add <2 x i64> ; vabdl should be auto-upgraded to vabd with zext ; CHECK: vabdls8 ; CHECK-NOT: arm.neon.vabdls.v8i16 ; CHECK: arm.neon.vabds.v8i8 ; CHECK-NEXT: zext <8 x i8> ; CHECK: vabdlu16 ; CHECK-NOT: arm.neon.vabdlu.v4i32 ; CHECK: arm.neon.vabdu.v4i16 ; CHECK-NEXT: zext <4 x i16> ; vmovn should be auto-upgraded to trunc ; CHECK: vmovni16 ; CHECK-NOT: arm.neon.vmovn.v8i8 ; CHECK: trunc <8 x i16> ; CHECK: vmovni32 ; CHECK-NOT: arm.neon.vmovn.v4i16 ; CHECK: trunc <4 x i32> ; CHECK: vmovni64 ; CHECK-NOT: arm.neon.vmovn.v2i32 ; CHECK: trunc <2 x i64> ; vld* and vst* intrinsic calls need an alignment argument (defaulted to 1) ; CHECK: vld1i8 ; CHECK: i32 1 ; CHECK: vld2Qi16 ; CHECK: i32 1 ; CHECK: vld3i32 ; CHECK: i32 1 ; CHECK: vld4Qf ; CHECK: i32 1 ; CHECK: vst1i8 ; CHECK: i32 1 ; CHECK: vst2Qi16 ; CHECK: i32 1 ; CHECK: vst3i32 ; CHECK: i32 1 ; CHECK: vst4Qf ; CHECK: i32 1 ; CHECK: vld2laneQi16 ; CHECK: i32 1 ; CHECK: vld3lanei32 ; CHECK: i32 1 ; CHECK: vld4laneQf ; CHECK: i32 1 ; CHECK: vst2laneQi16 ; CHECK: i32 1 ; CHECK: vst3lanei32 ; CHECK: i32 1 ; CHECK: vst4laneQf ; CHECK: i32 1