mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	[AArch64] Add support for NEON scalar floating-point compare instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193691 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -168,28 +168,35 @@ def int_aarch64_neon_vcvtf64_u64 :
 | 
				
			|||||||
// Scalar Floating-point Reciprocal Exponent
 | 
					// Scalar Floating-point Reciprocal Exponent
 | 
				
			||||||
def int_aarch64_neon_vrecpx : Neon_1Arg_Intrinsic;
 | 
					def int_aarch64_neon_vrecpx : Neon_1Arg_Intrinsic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Neon_ICmp_Intrinsic
 | 
					class Neon_Cmp_Intrinsic
 | 
				
			||||||
  : Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty, llvm_v1i64_ty], [IntrNoMem]>;
 | 
					  : Intrinsic<[llvm_anyvector_ty], [llvm_anyvector_ty, llvm_anyvector_ty],
 | 
				
			||||||
 | 
					              [IntrNoMem]>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Scalar Integer Compare Equal
 | 
					// Scalar Compare Equal
 | 
				
			||||||
def int_aarch64_neon_vceq : Neon_ICmp_Intrinsic;
 | 
					def int_aarch64_neon_vceq : Neon_Cmp_Intrinsic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Scalar Integer Compare Greater-Than or Equal
 | 
					// Scalar Compare Greater-Than or Equal
 | 
				
			||||||
def int_aarch64_neon_vcge : Neon_ICmp_Intrinsic;
 | 
					def int_aarch64_neon_vcge : Neon_Cmp_Intrinsic;
 | 
				
			||||||
def int_aarch64_neon_vchs : Neon_ICmp_Intrinsic;
 | 
					def int_aarch64_neon_vchs : Neon_Cmp_Intrinsic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Scalar Integer Compare Less-Than or Equal
 | 
					// Scalar Compare Less-Than or Equal
 | 
				
			||||||
def int_aarch64_neon_vclez : Neon_ICmp_Intrinsic;
 | 
					def int_aarch64_neon_vclez : Neon_Cmp_Intrinsic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Scalar Compare Less-Than
 | 
					// Scalar Compare Less-Than
 | 
				
			||||||
def int_aarch64_neon_vcltz : Neon_ICmp_Intrinsic;
 | 
					def int_aarch64_neon_vcltz : Neon_Cmp_Intrinsic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Scalar Compare Greater-Than
 | 
					// Scalar Compare Greater-Than
 | 
				
			||||||
def int_aarch64_neon_vcgt : Neon_ICmp_Intrinsic;
 | 
					def int_aarch64_neon_vcgt : Neon_Cmp_Intrinsic;
 | 
				
			||||||
def int_aarch64_neon_vchi : Neon_ICmp_Intrinsic;
 | 
					def int_aarch64_neon_vchi : Neon_Cmp_Intrinsic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Scalar Compare Bitwise Test Bits
 | 
					// Scalar Compare Bitwise Test Bits
 | 
				
			||||||
def int_aarch64_neon_vtstd : Neon_ICmp_Intrinsic;
 | 
					def int_aarch64_neon_vtstd : Neon_Cmp_Intrinsic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Absolute Compare Greater Than Or Equal
 | 
				
			||||||
 | 
					def int_aarch64_neon_vcage : Neon_Cmp_Intrinsic;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					// Scalar Floating-point Absolute Compare Greater Than
 | 
				
			||||||
 | 
					def int_aarch64_neon_vcagt : Neon_Cmp_Intrinsic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Scalar Signed Saturating Accumulated of Unsigned Value
 | 
					// Scalar Signed Saturating Accumulated of Unsigned Value
 | 
				
			||||||
def int_aarch64_neon_vuqadd : Neon_2Arg_Intrinsic;
 | 
					def int_aarch64_neon_vuqadd : Neon_2Arg_Intrinsic;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3492,12 +3492,15 @@ AArch64TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
 | 
				
			|||||||
  unsigned SplatBitSize;
 | 
					  unsigned SplatBitSize;
 | 
				
			||||||
  bool HasAnyUndefs;
 | 
					  bool HasAnyUndefs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  unsigned UseNeonMov = VT.getSizeInBits() >= 64;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Note we favor lowering MOVI over MVNI.
 | 
					  // Note we favor lowering MOVI over MVNI.
 | 
				
			||||||
  // This has implications on the definition of patterns in TableGen to select
 | 
					  // This has implications on the definition of patterns in TableGen to select
 | 
				
			||||||
  // BIC immediate instructions but not ORR immediate instructions.
 | 
					  // BIC immediate instructions but not ORR immediate instructions.
 | 
				
			||||||
  // If this lowering order is changed, TableGen patterns for BIC immediate and
 | 
					  // If this lowering order is changed, TableGen patterns for BIC immediate and
 | 
				
			||||||
  // ORR immediate instructions have to be updated.
 | 
					  // ORR immediate instructions have to be updated.
 | 
				
			||||||
  if (BVN->isConstantSplat(SplatBits, SplatUndef, SplatBitSize, HasAnyUndefs)) {
 | 
					  if (UseNeonMov &&
 | 
				
			||||||
 | 
					      BVN->isConstantSplat(SplatBits, SplatUndef, SplatBitSize, HasAnyUndefs)) {
 | 
				
			||||||
    if (SplatBitSize <= 64) {
 | 
					    if (SplatBitSize <= 64) {
 | 
				
			||||||
      // First attempt to use vector immediate-form MOVI
 | 
					      // First attempt to use vector immediate-form MOVI
 | 
				
			||||||
      EVT NeonMovVT;
 | 
					      EVT NeonMovVT;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1980,6 +1980,13 @@ def fpz64 : Operand<f64>,
 | 
				
			|||||||
  let DecoderMethod = "DecodeFPZeroOperand";
 | 
					  let DecoderMethod = "DecodeFPZeroOperand";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def fpz64movi : Operand<i64>,
 | 
				
			||||||
 | 
					            ComplexPattern<f64, 1, "SelectFPZeroOperand", [fpimm]> {
 | 
				
			||||||
 | 
					  let ParserMatchClass = fpzero_asmoperand;
 | 
				
			||||||
 | 
					  let PrintMethod = "printFPZeroOperand";
 | 
				
			||||||
 | 
					  let DecoderMethod = "DecodeFPZeroOperand";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
multiclass A64I_fpcmpSignal<bits<2> type, bit imm, dag ins, dag pattern> {
 | 
					multiclass A64I_fpcmpSignal<bits<2> type, bit imm, dag ins, dag pattern> {
 | 
				
			||||||
  def _quiet : A64I_fpcmp<0b0, 0b0, type, 0b00, {0b0, imm, 0b0, 0b0, 0b0},
 | 
					  def _quiet : A64I_fpcmp<0b0, 0b0, type, 0b00, {0b0, imm, 0b0, 0b0, 0b0},
 | 
				
			||||||
                          (outs), ins, "fcmp\t$Rn, $Rm", [pattern],
 | 
					                          (outs), ins, "fcmp\t$Rn, $Rm", [pattern],
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3210,8 +3210,8 @@ multiclass Neon_Scalar3Same_BHSD_size_patterns<SDPatternOperator opnode,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class Neon_Scalar3Same_cmp_D_size_patterns<SDPatternOperator opnode,
 | 
					class Neon_Scalar3Same_cmp_D_size_patterns<SDPatternOperator opnode,
 | 
				
			||||||
                                           Instruction INSTD>
 | 
					                                           Instruction INSTD>
 | 
				
			||||||
  : Pat<(v1i64 (opnode (v1i64 VPR64:$Rn), (v1i64 VPR64:$Rm))),
 | 
					  : Pat<(v1i64 (opnode (v1i64 FPR64:$Rn), (v1i64 FPR64:$Rm))),
 | 
				
			||||||
        (INSTD VPR64:$Rn, VPR64:$Rm)>;
 | 
					        (INSTD FPR64:$Rn, FPR64:$Rm)>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
multiclass Neon_Scalar3Same_HS_size_patterns<SDPatternOperator opnode,
 | 
					multiclass Neon_Scalar3Same_HS_size_patterns<SDPatternOperator opnode,
 | 
				
			||||||
                                             Instruction INSTH,
 | 
					                                             Instruction INSTH,
 | 
				
			||||||
@@ -3231,6 +3231,15 @@ multiclass Neon_Scalar3Same_SD_size_patterns<SDPatternOperator opnode,
 | 
				
			|||||||
            (INSTD FPR64:$Rn, FPR64:$Rm)>;
 | 
					            (INSTD FPR64:$Rn, FPR64:$Rm)>;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					multiclass Neon_Scalar3Same_cmp_SD_size_patterns<SDPatternOperator opnode,
 | 
				
			||||||
 | 
					                                                 Instruction INSTS,
 | 
				
			||||||
 | 
					                                                 Instruction INSTD> {
 | 
				
			||||||
 | 
					  def : Pat<(v1i32 (opnode (v1f32 FPR32:$Rn), (v1f32 FPR32:$Rm))),
 | 
				
			||||||
 | 
					            (INSTS FPR32:$Rn, FPR32:$Rm)>;
 | 
				
			||||||
 | 
					  def : Pat<(v1i64 (opnode (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))),
 | 
				
			||||||
 | 
					            (INSTD FPR64:$Rn, FPR64:$Rm)>;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Scalar Three Different
 | 
					// Scalar Three Different
 | 
				
			||||||
 | 
					
 | 
				
			||||||
multiclass NeonI_Scalar3Diff_HS_size<bit u, bits<4> opcode, string asmop> {
 | 
					multiclass NeonI_Scalar3Diff_HS_size<bit u, bits<4> opcode, string asmop> {
 | 
				
			||||||
@@ -3381,10 +3390,36 @@ class NeonI_Scalar2SameMisc_cmpz_D_size<bit u, bits<5> opcode, string asmop>
 | 
				
			|||||||
                          [],
 | 
					                          [],
 | 
				
			||||||
                          NoItinerary>;
 | 
					                          NoItinerary>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					multiclass NeonI_Scalar2SameMisc_cmpz_SD_size<bit u, bits<5> opcode,
 | 
				
			||||||
 | 
					                                              string asmop> {
 | 
				
			||||||
 | 
					  def ssi : NeonI_Scalar2SameMisc<u, 0b10, opcode,
 | 
				
			||||||
 | 
					                           (outs FPR32:$Rd), (ins FPR32:$Rn, fpz32:$FPImm),
 | 
				
			||||||
 | 
					                           !strconcat(asmop, " $Rd, $Rn, $FPImm"),
 | 
				
			||||||
 | 
					                           [],
 | 
				
			||||||
 | 
					                           NoItinerary>;
 | 
				
			||||||
 | 
					  def ddi : NeonI_Scalar2SameMisc<u, 0b11, opcode,
 | 
				
			||||||
 | 
					                           (outs FPR64:$Rd), (ins FPR64:$Rn, fpz64movi:$FPImm),
 | 
				
			||||||
 | 
					                           !strconcat(asmop, " $Rd, $Rn, $FPImm"),
 | 
				
			||||||
 | 
					                           [],
 | 
				
			||||||
 | 
					                           NoItinerary>;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Neon_Scalar2SameMisc_cmpz_D_size_patterns<SDPatternOperator opnode,
 | 
					class Neon_Scalar2SameMisc_cmpz_D_size_patterns<SDPatternOperator opnode,
 | 
				
			||||||
                                                Instruction INSTD>
 | 
					                                                Instruction INSTD>
 | 
				
			||||||
  : Pat<(v1i64 (opnode (v1i64 VPR64:$Rn), (v1i64 (bitconvert (v8i8 Neon_immAllZeros))))),
 | 
					  : Pat<(v1i64 (opnode (v1i64 FPR64:$Rn),
 | 
				
			||||||
        (INSTD VPR64:$Rn, 0)>;
 | 
					                       (v1i64 (bitconvert (v8i8 Neon_immAllZeros))))),
 | 
				
			||||||
 | 
					        (INSTD FPR64:$Rn, 0)>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					multiclass Neon_Scalar2SameMisc_cmpz_SD_size_patterns<SDPatternOperator opnode,
 | 
				
			||||||
 | 
					                                                      Instruction INSTS,
 | 
				
			||||||
 | 
					                                                      Instruction INSTD> {
 | 
				
			||||||
 | 
					  def : Pat<(v1i32 (opnode (v1f32 FPR32:$Rn),
 | 
				
			||||||
 | 
					                           (v1f32 (scalar_to_vector (f32 fpimm:$FPImm))))),
 | 
				
			||||||
 | 
					            (INSTS FPR32:$Rn, fpimm:$FPImm)>;
 | 
				
			||||||
 | 
					  def : Pat<(v1i64 (opnode (v1f64 FPR64:$Rn),
 | 
				
			||||||
 | 
					                           (v1f64 (bitconvert (v8i8 Neon_immAllZeros))))),
 | 
				
			||||||
 | 
					            (INSTD FPR64:$Rn, 0)>;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
multiclass Neon_Scalar2SameMisc_D_size_patterns<SDPatternOperator opnode,
 | 
					multiclass Neon_Scalar2SameMisc_D_size_patterns<SDPatternOperator opnode,
 | 
				
			||||||
                                                Instruction INSTD> {
 | 
					                                                Instruction INSTD> {
 | 
				
			||||||
@@ -3669,6 +3704,58 @@ def CMLTddi: NeonI_Scalar2SameMisc_cmpz_D_size<0b0, 0b01010, "cmlt">;
 | 
				
			|||||||
def : Neon_Scalar2SameMisc_cmpz_D_size_patterns<int_aarch64_neon_vcltz,
 | 
					def : Neon_Scalar2SameMisc_cmpz_D_size_patterns<int_aarch64_neon_vcltz,
 | 
				
			||||||
                                                CMLTddi>;
 | 
					                                                CMLTddi>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Equal
 | 
				
			||||||
 | 
					defm FCMEQ: NeonI_Scalar3Same_SD_sizes<0b0, 0b0, 0b11100, "fcmeq">;
 | 
				
			||||||
 | 
					defm : Neon_Scalar3Same_cmp_SD_size_patterns<int_aarch64_neon_vceq,
 | 
				
			||||||
 | 
					                                             FCMEQsss, FCMEQddd>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Equal To Zero
 | 
				
			||||||
 | 
					defm FCMEQZ: NeonI_Scalar2SameMisc_cmpz_SD_size<0b0, 0b01101, "fcmeq">;
 | 
				
			||||||
 | 
					defm : Neon_Scalar2SameMisc_cmpz_SD_size_patterns<int_aarch64_neon_vceq,
 | 
				
			||||||
 | 
					                                                  FCMEQZssi, FCMEQZddi>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greater Than Or Equal
 | 
				
			||||||
 | 
					defm FCMGE: NeonI_Scalar3Same_SD_sizes<0b1, 0b0, 0b11100, "fcmge">;
 | 
				
			||||||
 | 
					defm : Neon_Scalar3Same_cmp_SD_size_patterns<int_aarch64_neon_vcge,
 | 
				
			||||||
 | 
					                                             FCMGEsss, FCMGEddd>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greater Than Or Equal To Zero
 | 
				
			||||||
 | 
					defm FCMGEZ: NeonI_Scalar2SameMisc_cmpz_SD_size<0b1, 0b01100, "fcmge">;
 | 
				
			||||||
 | 
					defm : Neon_Scalar2SameMisc_cmpz_SD_size_patterns<int_aarch64_neon_vcge,
 | 
				
			||||||
 | 
					                                                  FCMGEZssi, FCMGEZddi>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greather Than
 | 
				
			||||||
 | 
					defm FCMGT: NeonI_Scalar3Same_SD_sizes<0b1, 0b1, 0b11100, "fcmgt">;
 | 
				
			||||||
 | 
					defm : Neon_Scalar3Same_cmp_SD_size_patterns<int_aarch64_neon_vcgt,
 | 
				
			||||||
 | 
					                                             FCMGTsss, FCMGTddd>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greather Than Zero
 | 
				
			||||||
 | 
					defm FCMGTZ: NeonI_Scalar2SameMisc_cmpz_SD_size<0b0, 0b01100, "fcmgt">;
 | 
				
			||||||
 | 
					defm : Neon_Scalar2SameMisc_cmpz_SD_size_patterns<int_aarch64_neon_vcgt,
 | 
				
			||||||
 | 
					                                                  FCMGTZssi, FCMGTZddi>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Less Than Or Equal To Zero
 | 
				
			||||||
 | 
					defm FCMLEZ: NeonI_Scalar2SameMisc_cmpz_SD_size<0b1, 0b01101, "fcmle">;
 | 
				
			||||||
 | 
					defm : Neon_Scalar2SameMisc_cmpz_SD_size_patterns<int_aarch64_neon_vclez,
 | 
				
			||||||
 | 
					                                                  FCMLEZssi, FCMLEZddi>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Less Than Zero
 | 
				
			||||||
 | 
					defm FCMLTZ: NeonI_Scalar2SameMisc_cmpz_SD_size<0b0, 0b01110, "fcmlt">;
 | 
				
			||||||
 | 
					defm : Neon_Scalar2SameMisc_cmpz_SD_size_patterns<int_aarch64_neon_vcltz,
 | 
				
			||||||
 | 
					                                                  FCMLTZssi, FCMLTZddi>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Absolute Compare Mask Greater Than Or Equal
 | 
				
			||||||
 | 
					defm FACGE: NeonI_Scalar3Same_SD_sizes<0b1, 0b0, 0b11101, "facge">;
 | 
				
			||||||
 | 
					defm : Neon_Scalar3Same_cmp_SD_size_patterns<int_aarch64_neon_vcage,
 | 
				
			||||||
 | 
					                                             FACGEsss, FACGEddd>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Scalar Floating-point Absolute Compare Mask Greater Than
 | 
				
			||||||
 | 
					defm FACGT: NeonI_Scalar3Same_SD_sizes<0b1, 0b1, 0b11101, "facgt">;
 | 
				
			||||||
 | 
					defm : Neon_Scalar3Same_cmp_SD_size_patterns<int_aarch64_neon_vcagt,
 | 
				
			||||||
 | 
					                                             FACGTsss, FACGTddd>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Scalar Absolute Value
 | 
					// Scalar Absolute Value
 | 
				
			||||||
defm ABS : NeonI_Scalar2SameMisc_D_size<0b0, 0b01011, "abs">;
 | 
					defm ABS : NeonI_Scalar2SameMisc_D_size<0b0, 0b01011, "abs">;
 | 
				
			||||||
defm : Neon_Scalar2SameMisc_D_size_patterns<int_aarch64_neon_vabs, ABSdd>;
 | 
					defm : Neon_Scalar2SameMisc_D_size_patterns<int_aarch64_neon_vabs, ABSdd>;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@ define i64 @test_vceqd(i64 %a, i64 %b) {
 | 
				
			|||||||
entry:
 | 
					entry:
 | 
				
			||||||
  %vceq.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
					  %vceq.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
				
			||||||
  %vceq1.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
					  %vceq1.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
				
			||||||
  %vceq2.i = call <1 x i64> @llvm.aarch64.neon.vceq(<1 x i64> %vceq.i, <1 x i64> %vceq1.i)
 | 
					  %vceq2.i = call <1 x i64> @llvm.aarch64.neon.vceq.v1i64.v1i64.v1i64(<1 x i64> %vceq.i, <1 x i64> %vceq1.i)
 | 
				
			||||||
  %0 = extractelement <1 x i64> %vceq2.i, i32 0
 | 
					  %0 = extractelement <1 x i64> %vceq2.i, i32 0
 | 
				
			||||||
  ret i64 %0
 | 
					  ret i64 %0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -18,7 +18,7 @@ define i64 @test_vceqzd(i64 %a) {
 | 
				
			|||||||
; CHECK: cmeq {{d[0-9]}}, {{d[0-9]}}, #0x0
 | 
					; CHECK: cmeq {{d[0-9]}}, {{d[0-9]}}, #0x0
 | 
				
			||||||
entry:
 | 
					entry:
 | 
				
			||||||
  %vceqz.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
					  %vceqz.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
				
			||||||
  %vceqz1.i = call <1 x i64> @llvm.aarch64.neon.vceq(<1 x i64> %vceqz.i, <1 x i64> zeroinitializer)
 | 
					  %vceqz1.i = call <1 x i64> @llvm.aarch64.neon.vceq.v1i64.v1i64.v1i64(<1 x i64> %vceqz.i, <1 x i64> zeroinitializer)
 | 
				
			||||||
  %0 = extractelement <1 x i64> %vceqz1.i, i32 0
 | 
					  %0 = extractelement <1 x i64> %vceqz1.i, i32 0
 | 
				
			||||||
  ret i64 %0
 | 
					  ret i64 %0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -29,7 +29,7 @@ define i64 @test_vcged(i64 %a, i64 %b) {
 | 
				
			|||||||
entry:
 | 
					entry:
 | 
				
			||||||
  %vcge.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
					  %vcge.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
				
			||||||
  %vcge1.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
					  %vcge1.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
				
			||||||
  %vcge2.i = call <1 x i64> @llvm.aarch64.neon.vcge(<1 x i64> %vcge.i, <1 x i64> %vcge1.i)
 | 
					  %vcge2.i = call <1 x i64> @llvm.aarch64.neon.vcge.v1i64.v1i64.v1i64(<1 x i64> %vcge.i, <1 x i64> %vcge1.i)
 | 
				
			||||||
  %0 = extractelement <1 x i64> %vcge2.i, i32 0
 | 
					  %0 = extractelement <1 x i64> %vcge2.i, i32 0
 | 
				
			||||||
  ret i64 %0
 | 
					  ret i64 %0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -39,7 +39,7 @@ define i64 @test_vcgezd(i64 %a) {
 | 
				
			|||||||
; CHECK: cmge {{d[0-9]}}, {{d[0-9]}}, #0x0
 | 
					; CHECK: cmge {{d[0-9]}}, {{d[0-9]}}, #0x0
 | 
				
			||||||
entry:
 | 
					entry:
 | 
				
			||||||
  %vcgez.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
					  %vcgez.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
				
			||||||
  %vcgez1.i = call <1 x i64> @llvm.aarch64.neon.vcge(<1 x i64> %vcgez.i, <1 x i64> zeroinitializer)
 | 
					  %vcgez1.i = call <1 x i64> @llvm.aarch64.neon.vcge.v1i64.v1i64.v1i64(<1 x i64> %vcgez.i, <1 x i64> zeroinitializer)
 | 
				
			||||||
  %0 = extractelement <1 x i64> %vcgez1.i, i32 0
 | 
					  %0 = extractelement <1 x i64> %vcgez1.i, i32 0
 | 
				
			||||||
  ret i64 %0
 | 
					  ret i64 %0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -50,7 +50,7 @@ define i64 @test_vcgtd(i64 %a, i64 %b) {
 | 
				
			|||||||
entry:
 | 
					entry:
 | 
				
			||||||
  %vcgt.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
					  %vcgt.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
				
			||||||
  %vcgt1.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
					  %vcgt1.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
				
			||||||
  %vcgt2.i = call <1 x i64> @llvm.aarch64.neon.vcgt(<1 x i64> %vcgt.i, <1 x i64> %vcgt1.i)
 | 
					  %vcgt2.i = call <1 x i64> @llvm.aarch64.neon.vcgt.v1i64.v1i64.v1i64(<1 x i64> %vcgt.i, <1 x i64> %vcgt1.i)
 | 
				
			||||||
  %0 = extractelement <1 x i64> %vcgt2.i, i32 0
 | 
					  %0 = extractelement <1 x i64> %vcgt2.i, i32 0
 | 
				
			||||||
  ret i64 %0
 | 
					  ret i64 %0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -60,7 +60,7 @@ define i64 @test_vcgtzd(i64 %a) {
 | 
				
			|||||||
; CHECK: cmgt {{d[0-9]}}, {{d[0-9]}}, #0x0
 | 
					; CHECK: cmgt {{d[0-9]}}, {{d[0-9]}}, #0x0
 | 
				
			||||||
entry:
 | 
					entry:
 | 
				
			||||||
  %vcgtz.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
					  %vcgtz.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
				
			||||||
  %vcgtz1.i = call <1 x i64> @llvm.aarch64.neon.vcgt(<1 x i64> %vcgtz.i, <1 x i64> zeroinitializer)
 | 
					  %vcgtz1.i = call <1 x i64> @llvm.aarch64.neon.vcgt.v1i64.v1i64.v1i64(<1 x i64> %vcgtz.i, <1 x i64> zeroinitializer)
 | 
				
			||||||
  %0 = extractelement <1 x i64> %vcgtz1.i, i32 0
 | 
					  %0 = extractelement <1 x i64> %vcgtz1.i, i32 0
 | 
				
			||||||
  ret i64 %0
 | 
					  ret i64 %0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -71,7 +71,7 @@ define i64 @test_vcled(i64 %a, i64 %b) {
 | 
				
			|||||||
entry:
 | 
					entry:
 | 
				
			||||||
  %vcgt.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
					  %vcgt.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
				
			||||||
  %vcgt1.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
					  %vcgt1.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
				
			||||||
  %vcgt2.i = call <1 x i64> @llvm.aarch64.neon.vcgt(<1 x i64> %vcgt.i, <1 x i64> %vcgt1.i)
 | 
					  %vcgt2.i = call <1 x i64> @llvm.aarch64.neon.vcgt.v1i64.v1i64.v1i64(<1 x i64> %vcgt.i, <1 x i64> %vcgt1.i)
 | 
				
			||||||
  %0 = extractelement <1 x i64> %vcgt2.i, i32 0
 | 
					  %0 = extractelement <1 x i64> %vcgt2.i, i32 0
 | 
				
			||||||
  ret i64 %0
 | 
					  ret i64 %0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -81,7 +81,7 @@ define i64 @test_vclezd(i64 %a) {
 | 
				
			|||||||
; CHECK: cmle {{d[0-9]}}, {{d[0-9]}}, #0x0
 | 
					; CHECK: cmle {{d[0-9]}}, {{d[0-9]}}, #0x0
 | 
				
			||||||
entry:
 | 
					entry:
 | 
				
			||||||
  %vclez.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
					  %vclez.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
				
			||||||
  %vclez1.i = call <1 x i64> @llvm.aarch64.neon.vclez(<1 x i64> %vclez.i, <1 x i64> zeroinitializer)
 | 
					  %vclez1.i = call <1 x i64> @llvm.aarch64.neon.vclez.v1i64.v1i64.v1i64(<1 x i64> %vclez.i, <1 x i64> zeroinitializer)
 | 
				
			||||||
  %0 = extractelement <1 x i64> %vclez1.i, i32 0
 | 
					  %0 = extractelement <1 x i64> %vclez1.i, i32 0
 | 
				
			||||||
  ret i64 %0
 | 
					  ret i64 %0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -92,7 +92,7 @@ define i64 @test_vcltd(i64 %a, i64 %b) {
 | 
				
			|||||||
entry:
 | 
					entry:
 | 
				
			||||||
  %vcge.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
					  %vcge.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
				
			||||||
  %vcge1.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
					  %vcge1.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
				
			||||||
  %vcge2.i = call <1 x i64> @llvm.aarch64.neon.vcge(<1 x i64> %vcge.i, <1 x i64> %vcge1.i)
 | 
					  %vcge2.i = call <1 x i64> @llvm.aarch64.neon.vcge.v1i64.v1i64.v1i64(<1 x i64> %vcge.i, <1 x i64> %vcge1.i)
 | 
				
			||||||
  %0 = extractelement <1 x i64> %vcge2.i, i32 0
 | 
					  %0 = extractelement <1 x i64> %vcge2.i, i32 0
 | 
				
			||||||
  ret i64 %0
 | 
					  ret i64 %0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -102,7 +102,7 @@ define i64 @test_vcltzd(i64 %a) {
 | 
				
			|||||||
; CHECK: cmlt {{d[0-9]}}, {{d[0-9]}}, #0x0
 | 
					; CHECK: cmlt {{d[0-9]}}, {{d[0-9]}}, #0x0
 | 
				
			||||||
entry:
 | 
					entry:
 | 
				
			||||||
  %vcltz.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
					  %vcltz.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
				
			||||||
  %vcltz1.i = call <1 x i64> @llvm.aarch64.neon.vcltz(<1 x i64> %vcltz.i, <1 x i64> zeroinitializer)
 | 
					  %vcltz1.i = call <1 x i64> @llvm.aarch64.neon.vcltz.v1i64.v1i64.v1i64(<1 x i64> %vcltz.i, <1 x i64> zeroinitializer)
 | 
				
			||||||
  %0 = extractelement <1 x i64> %vcltz1.i, i32 0
 | 
					  %0 = extractelement <1 x i64> %vcltz1.i, i32 0
 | 
				
			||||||
  ret i64 %0
 | 
					  ret i64 %0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -113,16 +113,16 @@ define i64 @test_vtstd(i64 %a, i64 %b) {
 | 
				
			|||||||
entry:
 | 
					entry:
 | 
				
			||||||
  %vtst.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
					  %vtst.i = insertelement <1 x i64> undef, i64 %a, i32 0
 | 
				
			||||||
  %vtst1.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
					  %vtst1.i = insertelement <1 x i64> undef, i64 %b, i32 0
 | 
				
			||||||
  %vtst2.i = call <1 x i64> @llvm.aarch64.neon.vtstd(<1 x i64> %vtst.i, <1 x i64> %vtst1.i)
 | 
					  %vtst2.i = call <1 x i64> @llvm.aarch64.neon.vtstd.v1i64.v1i64.v1i64(<1 x i64> %vtst.i, <1 x i64> %vtst1.i)
 | 
				
			||||||
  %0 = extractelement <1 x i64> %vtst2.i, i32 0
 | 
					  %0 = extractelement <1 x i64> %vtst2.i, i32 0
 | 
				
			||||||
  ret i64 %0
 | 
					  ret i64 %0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
declare <1 x i64> @llvm.aarch64.neon.vtstd(<1 x i64>, <1 x i64>)
 | 
					declare <1 x i64> @llvm.aarch64.neon.vtstd.v1i64.v1i64.v1i64(<1 x i64>, <1 x i64>)
 | 
				
			||||||
declare <1 x i64> @llvm.aarch64.neon.vcltz(<1 x i64>, <1 x i64>)
 | 
					declare <1 x i64> @llvm.aarch64.neon.vcltz.v1i64.v1i64.v1i64(<1 x i64>, <1 x i64>)
 | 
				
			||||||
declare <1 x i64> @llvm.aarch64.neon.vchs(<1 x i64>, <1 x i64>)
 | 
					declare <1 x i64> @llvm.aarch64.neon.vchs.v1i64.v1i64.v1i64(<1 x i64>, <1 x i64>)
 | 
				
			||||||
declare <1 x i64> @llvm.aarch64.neon.vcge(<1 x i64>, <1 x i64>)
 | 
					declare <1 x i64> @llvm.aarch64.neon.vcge.v1i64.v1i64.v1i64(<1 x i64>, <1 x i64>)
 | 
				
			||||||
declare <1 x i64> @llvm.aarch64.neon.vclez(<1 x i64>, <1 x i64>)
 | 
					declare <1 x i64> @llvm.aarch64.neon.vclez.v1i64.v1i64.v1i64(<1 x i64>, <1 x i64>)
 | 
				
			||||||
declare <1 x i64> @llvm.aarch64.neon.vchi(<1 x i64>, <1 x i64>)
 | 
					declare <1 x i64> @llvm.aarch64.neon.vchi.v1i64.v1i64.v1i64(<1 x i64>, <1 x i64>)
 | 
				
			||||||
declare <1 x i64> @llvm.aarch64.neon.vcgt(<1 x i64>, <1 x i64>)
 | 
					declare <1 x i64> @llvm.aarch64.neon.vcgt.v1i64.v1i64.v1i64(<1 x i64>, <1 x i64>)
 | 
				
			||||||
declare <1 x i64> @llvm.aarch64.neon.vceq(<1 x i64>, <1 x i64>)
 | 
					declare <1 x i64> @llvm.aarch64.neon.vceq.v1i64.v1i64.v1i64(<1 x i64>, <1 x i64>)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										316
									
								
								test/CodeGen/AArch64/neon-scalar-fp-compare.ll
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										316
									
								
								test/CodeGen/AArch64/neon-scalar-fp-compare.ll
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,316 @@
 | 
				
			|||||||
 | 
					; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+neon < %s | FileCheck %s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Scalar Floating-point Compare
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vceqs_f32(float %a, float %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vceqs_f32
 | 
				
			||||||
 | 
					; CHECK: fcmeq {{s[0-9]}}, {{s[0-9]}}, {{s[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vceq.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vceq1.i = insertelement <1 x float> undef, float %b, i32 0
 | 
				
			||||||
 | 
					  %vceq2.i = call <1 x i32> @llvm.aarch64.neon.vceq.v1i32.v1f32.v1f32(<1 x float> %vceq.i, <1 x float> %vceq1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vceq2.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vceqd_f64(double %a, double %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vceqd_f64
 | 
				
			||||||
 | 
					; CHECK: fcmeq {{d[0-9]}}, {{d[0-9]}}, {{d[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vceq.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vceq1.i = insertelement <1 x double> undef, double %b, i32 0
 | 
				
			||||||
 | 
					  %vceq2.i = call <1 x i64> @llvm.aarch64.neon.vceq.v1i64.v1f64.v1f64(<1 x double> %vceq.i, <1 x double> %vceq1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vceq2.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vceqzs_f32(float %a) {
 | 
				
			||||||
 | 
					; CHECK: test_vceqzs_f32
 | 
				
			||||||
 | 
					; CHECK: fcmeq {{s[0-9]}}, {{s[0-9]}}, #0.0
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vceq.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vceq1.i = call <1 x i32> @llvm.aarch64.neon.vceq.v1i32.v1f32.v1f32(<1 x float> %vceq.i, <1 x float> zeroinitializer)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vceq1.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vceqzd_f64(double %a) {
 | 
				
			||||||
 | 
					; CHECK: test_vceqzd_f64
 | 
				
			||||||
 | 
					; CHECK: fcmeq {{d[0-9]}}, {{d[0-9]}}, #0.0
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vceq.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vceq1.i = call <1 x i64> @llvm.aarch64.neon.vceq.v1i64.v1f64.v1f64(<1 x double> %vceq.i, <1 x double> zeroinitializer)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vceq1.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vcges_f32(float %a, float %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcges_f32
 | 
				
			||||||
 | 
					; CHECK: fcmge {{s[0-9]}}, {{s[0-9]}}, {{s[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcge.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vcge1.i = insertelement <1 x float> undef, float %b, i32 0
 | 
				
			||||||
 | 
					  %vcge2.i = call <1 x i32> @llvm.aarch64.neon.vcge.v1i32.v1f32.v1f32(<1 x float> %vcge.i, <1 x float> %vcge1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vcge2.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vcged_f64(double %a, double %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcged_f64
 | 
				
			||||||
 | 
					; CHECK: fcmge {{d[0-9]}}, {{d[0-9]}}, {{d[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcge.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vcge1.i = insertelement <1 x double> undef, double %b, i32 0
 | 
				
			||||||
 | 
					  %vcge2.i = call <1 x i64> @llvm.aarch64.neon.vcge.v1i64.v1f64.v1f64(<1 x double> %vcge.i, <1 x double> %vcge1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vcge2.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vcgezs_f32(float %a) {
 | 
				
			||||||
 | 
					; CHECK: test_vcgezs_f32
 | 
				
			||||||
 | 
					; CHECK: fcmge {{s[0-9]}}, {{s[0-9]}}, #0.0
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcge.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vcge1.i = call <1 x i32> @llvm.aarch64.neon.vcge.v1i32.v1f32.v1f32(<1 x float> %vcge.i, <1 x float> zeroinitializer)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vcge1.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vcgezd_f64(double %a) {
 | 
				
			||||||
 | 
					; CHECK: test_vcgezd_f64
 | 
				
			||||||
 | 
					; CHECK: fcmge {{d[0-9]}}, {{d[0-9]}}, #0.0
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcge.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vcge1.i = call <1 x i64> @llvm.aarch64.neon.vcge.v1i64.v1f64.v1f64(<1 x double> %vcge.i, <1 x double> zeroinitializer)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vcge1.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vcgts_f32(float %a, float %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcgts_f32
 | 
				
			||||||
 | 
					; CHECK: fcmgt {{s[0-9]}}, {{s[0-9]}}, {{s[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcgt.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vcgt1.i = insertelement <1 x float> undef, float %b, i32 0
 | 
				
			||||||
 | 
					  %vcgt2.i = call <1 x i32> @llvm.aarch64.neon.vcgt.v1i32.v1f32.v1f32(<1 x float> %vcgt.i, <1 x float> %vcgt1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vcgt2.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vcgtd_f64(double %a, double %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcgtd_f64
 | 
				
			||||||
 | 
					; CHECK: fcmgt {{d[0-9]}}, {{d[0-9]}}, {{d[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcgt.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vcgt1.i = insertelement <1 x double> undef, double %b, i32 0
 | 
				
			||||||
 | 
					  %vcgt2.i = call <1 x i64> @llvm.aarch64.neon.vcgt.v1i64.v1f64.v1f64(<1 x double> %vcgt.i, <1 x double> %vcgt1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vcgt2.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vcgtzs_f32(float %a) {
 | 
				
			||||||
 | 
					; CHECK: test_vcgtzs_f32
 | 
				
			||||||
 | 
					; CHECK: fcmgt {{s[0-9]}}, {{s[0-9]}}, #0.0
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcgt.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vcgt1.i = call <1 x i32> @llvm.aarch64.neon.vcgt.v1i32.v1f32.v1f32(<1 x float> %vcgt.i, <1 x float> zeroinitializer)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vcgt1.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vcgtzd_f64(double %a) {
 | 
				
			||||||
 | 
					; CHECK: test_vcgtzd_f64
 | 
				
			||||||
 | 
					; CHECK: fcmgt {{d[0-9]}}, {{d[0-9]}}, #0.0
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcgt.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vcgt1.i = call <1 x i64> @llvm.aarch64.neon.vcgt.v1i64.v1f64.v1f64(<1 x double> %vcgt.i, <1 x double> zeroinitializer)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vcgt1.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vcles_f32(float %a, float %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcles_f32
 | 
				
			||||||
 | 
					; CHECK: fcmge {{s[0-9]}}, {{s[0-9]}}, {{s[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcge.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vcge1.i = insertelement <1 x float> undef, float %b, i32 0
 | 
				
			||||||
 | 
					  %vcge2.i = call <1 x i32> @llvm.aarch64.neon.vcge.v1i32.v1f32.v1f32(<1 x float> %vcge.i, <1 x float> %vcge1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vcge2.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vcled_f64(double %a, double %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcled_f64
 | 
				
			||||||
 | 
					; CHECK: fcmge {{d[0-9]}}, {{d[0-9]}}, {{d[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcge.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vcge1.i = insertelement <1 x double> undef, double %b, i32 0
 | 
				
			||||||
 | 
					  %vcge2.i = call <1 x i64> @llvm.aarch64.neon.vcge.v1i64.v1f64.v1f64(<1 x double> %vcge.i, <1 x double> %vcge1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vcge2.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vclezs_f32(float %a) {
 | 
				
			||||||
 | 
					; CHECK: test_vclezs_f32
 | 
				
			||||||
 | 
					; CHECK: fcmle {{s[0-9]}}, {{s[0-9]}}, #0.0
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcle.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vcle1.i = call <1 x i32> @llvm.aarch64.neon.vclez.v1i32.v1f32.v1f32(<1 x float> %vcle.i, <1 x float> zeroinitializer)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vcle1.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vclezd_f64(double %a) {
 | 
				
			||||||
 | 
					; CHECK: test_vclezd_f64
 | 
				
			||||||
 | 
					; CHECK: fcmle {{d[0-9]}}, {{d[0-9]}}, #0.0
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcle.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vcle1.i = call <1 x i64> @llvm.aarch64.neon.vclez.v1i64.v1f64.v1f64(<1 x double> %vcle.i, <1 x double> zeroinitializer)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vcle1.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vclts_f32(float %a, float %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vclts_f32
 | 
				
			||||||
 | 
					; CHECK: fcmgt {{s[0-9]}}, {{s[0-9]}}, {{s[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcgt.i = insertelement <1 x float> undef, float %b, i32 0
 | 
				
			||||||
 | 
					  %vcgt1.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vcgt2.i = call <1 x i32> @llvm.aarch64.neon.vcgt.v1i32.v1f32.v1f32(<1 x float> %vcgt.i, <1 x float> %vcgt1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vcgt2.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vcltd_f64(double %a, double %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcltd_f64
 | 
				
			||||||
 | 
					; CHECK: fcmgt {{d[0-9]}}, {{d[0-9]}}, {{d[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcgt.i = insertelement <1 x double> undef, double %b, i32 0
 | 
				
			||||||
 | 
					  %vcgt1.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vcgt2.i = call <1 x i64> @llvm.aarch64.neon.vcgt.v1i64.v1f64.v1f64(<1 x double> %vcgt.i, <1 x double> %vcgt1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vcgt2.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vcltzs_f32(float %a) {
 | 
				
			||||||
 | 
					; CHECK: test_vcltzs_f32
 | 
				
			||||||
 | 
					; CHECK: fcmlt {{s[0-9]}}, {{s[0-9]}}, #0.0
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vclt.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vclt1.i = call <1 x i32> @llvm.aarch64.neon.vcltz.v1i32.v1f32.v1f32(<1 x float> %vclt.i, <1 x float> zeroinitializer)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vclt1.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vcltzd_f64(double %a) {
 | 
				
			||||||
 | 
					; CHECK: test_vcltzd_f64
 | 
				
			||||||
 | 
					; CHECK: fcmlt {{d[0-9]}}, {{d[0-9]}}, #0.0
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vclt.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vclt1.i = call <1 x i64> @llvm.aarch64.neon.vcltz.v1i64.v1f64.v1f64(<1 x double> %vclt.i, <1 x double> zeroinitializer)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vclt1.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vcages_f32(float %a, float %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcages_f32
 | 
				
			||||||
 | 
					; CHECK: facge {{s[0-9]}}, {{s[0-9]}}, {{s[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcage.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vcage1.i = insertelement <1 x float> undef, float %b, i32 0
 | 
				
			||||||
 | 
					  %vcage2.i = call <1 x i32> @llvm.aarch64.neon.vcage.v1i32.v1f32.v1f32(<1 x float> %vcage.i, <1 x float> %vcage1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vcage2.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vcaged_f64(double %a, double %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcaged_f64
 | 
				
			||||||
 | 
					; CHECK: facge {{d[0-9]}}, {{d[0-9]}}, {{d[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcage.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vcage1.i = insertelement <1 x double> undef, double %b, i32 0
 | 
				
			||||||
 | 
					  %vcage2.i = call <1 x i64> @llvm.aarch64.neon.vcage.v1i64.v1f64.v1f64(<1 x double> %vcage.i, <1 x double> %vcage1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vcage2.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vcagts_f32(float %a, float %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcagts_f32
 | 
				
			||||||
 | 
					; CHECK: facgt {{s[0-9]}}, {{s[0-9]}}, {{s[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcagt.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vcagt1.i = insertelement <1 x float> undef, float %b, i32 0
 | 
				
			||||||
 | 
					  %vcagt2.i = call <1 x i32> @llvm.aarch64.neon.vcagt.v1i32.v1f32.v1f32(<1 x float> %vcagt.i, <1 x float> %vcagt1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vcagt2.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vcagtd_f64(double %a, double %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcagtd_f64
 | 
				
			||||||
 | 
					; CHECK: facgt {{d[0-9]}}, {{d[0-9]}}, {{d[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcagt.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vcagt1.i = insertelement <1 x double> undef, double %b, i32 0
 | 
				
			||||||
 | 
					  %vcagt2.i = call <1 x i64> @llvm.aarch64.neon.vcagt.v1i64.v1f64.v1f64(<1 x double> %vcagt.i, <1 x double> %vcagt1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vcagt2.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vcales_f32(float %a, float %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcales_f32
 | 
				
			||||||
 | 
					; CHECK: facge {{s[0-9]}}, {{s[0-9]}}, {{s[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcage.i = insertelement <1 x float> undef, float %b, i32 0
 | 
				
			||||||
 | 
					  %vcage1.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vcage2.i = call <1 x i32> @llvm.aarch64.neon.vcage.v1i32.v1f32.v1f32(<1 x float> %vcage.i, <1 x float> %vcage1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vcage2.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vcaled_f64(double %a, double %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcaled_f64
 | 
				
			||||||
 | 
					; CHECK: facge {{d[0-9]}}, {{d[0-9]}}, {{d[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcage.i = insertelement <1 x double> undef, double %b, i32 0
 | 
				
			||||||
 | 
					  %vcage1.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vcage2.i = call <1 x i64> @llvm.aarch64.neon.vcage.v1i64.v1f64.v1f64(<1 x double> %vcage.i, <1 x double> %vcage1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vcage2.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i32 @test_vcalts_f32(float %a, float %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcalts_f32
 | 
				
			||||||
 | 
					; CHECK: facgt {{s[0-9]}}, {{s[0-9]}}, {{s[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcalt.i = insertelement <1 x float> undef, float %b, i32 0
 | 
				
			||||||
 | 
					  %vcalt1.i = insertelement <1 x float> undef, float %a, i32 0
 | 
				
			||||||
 | 
					  %vcalt2.i = call <1 x i32> @llvm.aarch64.neon.vcagt.v1i32.v1f32.v1f32(<1 x float> %vcalt.i, <1 x float> %vcalt1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i32> %vcalt2.i, i32 0
 | 
				
			||||||
 | 
					  ret i32 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define i64 @test_vcaltd_f64(double %a, double %b) {
 | 
				
			||||||
 | 
					; CHECK: test_vcaltd_f64
 | 
				
			||||||
 | 
					; CHECK: facgt {{d[0-9]}}, {{d[0-9]}}, {{d[0-9]}}
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  %vcalt.i = insertelement <1 x double> undef, double %b, i32 0
 | 
				
			||||||
 | 
					  %vcalt1.i = insertelement <1 x double> undef, double %a, i32 0
 | 
				
			||||||
 | 
					  %vcalt2.i = call <1 x i64> @llvm.aarch64.neon.vcagt.v1i64.v1f64.v1f64(<1 x double> %vcalt.i, <1 x double> %vcalt1.i)
 | 
				
			||||||
 | 
					  %0 = extractelement <1 x i64> %vcalt2.i, i32 0
 | 
				
			||||||
 | 
					  ret i64 %0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare <1 x i32> @llvm.aarch64.neon.vceq.v1i32.v1f32.v1f32(<1 x float>, <1 x float>)
 | 
				
			||||||
 | 
					declare <1 x i64> @llvm.aarch64.neon.vceq.v1i64.v1f64.v1f64(<1 x double>, <1 x double>)
 | 
				
			||||||
 | 
					declare <1 x i32> @llvm.aarch64.neon.vcge.v1i32.v1f32.v1f32(<1 x float>, <1 x float>)
 | 
				
			||||||
 | 
					declare <1 x i64> @llvm.aarch64.neon.vcge.v1i64.v1f64.v1f64(<1 x double>, <1 x double>)
 | 
				
			||||||
 | 
					declare <1 x i32> @llvm.aarch64.neon.vclez.v1i32.v1f32.v1f32(<1 x float>, <1 x float>)
 | 
				
			||||||
 | 
					declare <1 x i64> @llvm.aarch64.neon.vclez.v1i64.v1f64.v1f64(<1 x double>, <1 x double>)
 | 
				
			||||||
 | 
					declare <1 x i32> @llvm.aarch64.neon.vcgt.v1i32.v1f32.v1f32(<1 x float>, <1 x float>)
 | 
				
			||||||
 | 
					declare <1 x i64> @llvm.aarch64.neon.vcgt.v1i64.v1f64.v1f64(<1 x double>, <1 x double>)
 | 
				
			||||||
 | 
					declare <1 x i32> @llvm.aarch64.neon.vcltz.v1i32.v1f32.v1f32(<1 x float>, <1 x float>)
 | 
				
			||||||
 | 
					declare <1 x i64> @llvm.aarch64.neon.vcltz.v1i64.v1f64.v1f64(<1 x double>, <1 x double>)
 | 
				
			||||||
 | 
					declare <1 x i32> @llvm.aarch64.neon.vcage.v1i32.v1f32.v1f32(<1 x float>, <1 x float>)
 | 
				
			||||||
 | 
					declare <1 x i64> @llvm.aarch64.neon.vcage.v1i64.v1f64.v1f64(<1 x double>, <1 x double>)
 | 
				
			||||||
 | 
					declare <1 x i32> @llvm.aarch64.neon.vcagt.v1i32.v1f32.v1f32(<1 x float>, <1 x float>)
 | 
				
			||||||
 | 
					declare <1 x i64> @llvm.aarch64.neon.vcagt.v1i64.v1f64.v1f64(<1 x double>, <1 x double>)
 | 
				
			||||||
@@ -4397,6 +4397,146 @@
 | 
				
			|||||||
// CHECK-ERROR:          cmtst b20, d21, d22
 | 
					// CHECK-ERROR:          cmtst b20, d21, d22
 | 
				
			||||||
// CHECK-ERROR:                ^
 | 
					// CHECK-ERROR:                ^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Equal
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmeq s10, h11, s12
 | 
				
			||||||
 | 
					         fcmeq d20, s21, d22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmeq s10, h11, s12
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmeq d20, s21, d22
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Equal To Zero
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmeq h10, s11, #0.0
 | 
				
			||||||
 | 
					         fcmeq d20, s21, #0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmeq h10, s11, #0.0
 | 
				
			||||||
 | 
					// CHECK-ERROR:                ^
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmeq d20, s21, #0.0
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greater Than Or Equal
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmge s10, h11, s12
 | 
				
			||||||
 | 
					         fcmge d20, s21, d22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmge s10, h11, s12
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmge d20, s21, d22
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greater Than Or Equal To Zero
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmge h10, s11, #0.0
 | 
				
			||||||
 | 
					         fcmge d20, s21, #0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmge h10, s11, #0.0
 | 
				
			||||||
 | 
					// CHECK-ERROR:                ^
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmge d20, s21, #0.0
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greather Than
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmgt s10, h11, s12
 | 
				
			||||||
 | 
					         fcmgt d20, s21, d22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmgt s10, h11, s12
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmgt d20, s21, d22
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greather Than Zero
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmgt h10, s11, #0.0
 | 
				
			||||||
 | 
					         fcmgt d20, s21, #0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmgt h10, s11, #0.0
 | 
				
			||||||
 | 
					// CHECK-ERROR:                ^
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmgt d20, s21, #0.0
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Less Than Or Equal To Zero
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmle h10, s11, #0.0
 | 
				
			||||||
 | 
					         fcmle d20, s21, #0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmle h10, s11, #0.0
 | 
				
			||||||
 | 
					// CHECK-ERROR:                ^
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmle d20, s21, #0.0
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Less Than
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmlt h10, s11, #0.0
 | 
				
			||||||
 | 
					         fcmlt d20, s21, #0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmlt h10, s11, #0.0
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          fcmlt d20, s21, #0.0
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Absolute Compare Mask Greater Than Or Equal
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         facge s10, h11, s12
 | 
				
			||||||
 | 
					         facge d20, s21, d22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          facge s10, h11, s12
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          facge d20, s21, d22
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Absolute Compare Mask Greater Than
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         facgt s10, h11, s12
 | 
				
			||||||
 | 
					         facgt d20, d21, s22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          facgt s10, h11, s12
 | 
				
			||||||
 | 
					// CHECK-ERROR:                     ^
 | 
				
			||||||
 | 
					// CHECK-ERROR: error: invalid operand for instruction
 | 
				
			||||||
 | 
					// CHECK-ERROR:          facgt d20, d21, s22
 | 
				
			||||||
 | 
					// CHECK-ERROR:                          ^
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
//----------------------------------------------------------------------
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
// Scalar Signed Saturating Accumulated of Unsigned Value
 | 
					// Scalar Signed Saturating Accumulated of Unsigned Value
 | 
				
			||||||
//----------------------------------------------------------------------
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										103
									
								
								test/MC/AArch64/neon-scalar-fp-compare.s
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								test/MC/AArch64/neon-scalar-fp-compare.s
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
				
			|||||||
 | 
					// RUN: llvm-mc -triple aarch64-none-linux-gnu -mattr=+neon -show-encoding < %s | FileCheck %s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Check that the assembler can handle the documented syntax for AArch64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Equal
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmeq s10, s11, s12
 | 
				
			||||||
 | 
					         fcmeq d20, d21, d22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK: fcmeq s10, s11, s12   // encoding: [0x6a,0xe5,0x2c,0x5e]
 | 
				
			||||||
 | 
					// CHECK: fcmeq d20, d21, d22   // encoding: [0xb4,0xe6,0x76,0x5e]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Equal To Zero
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmeq s10, s11, #0.0
 | 
				
			||||||
 | 
					         fcmeq d20, d21, #0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK: fcmeq s10, s11, #0.0   // encoding: [0x6a,0xd9,0xa0,0x5e]
 | 
				
			||||||
 | 
					// CHECK: fcmeq d20, d21, #0.0   // encoding: [0xb4,0xda,0xe0,0x5e]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greater Than Or Equal
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmge s10, s11, s12
 | 
				
			||||||
 | 
					         fcmge d20, d21, d22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK: fcmge s10, s11, s12   // encoding: [0x6a,0xe5,0x2c,0x7e]
 | 
				
			||||||
 | 
					// CHECK: fcmge d20, d21, d22   // encoding: [0xb4,0xe6,0x76,0x7e]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greater Than Or Equal To Zero
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmge s10, s11, #0.0
 | 
				
			||||||
 | 
					         fcmge d20, d21, #0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK: fcmge s10, s11, #0.0   // encoding: [0x6a,0xc9,0xa0,0x7e]
 | 
				
			||||||
 | 
					// CHECK: fcmge d20, d21, #0.0   // encoding: [0xb4,0xca,0xe0,0x7e]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greather Than
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmgt s10, s11, s12
 | 
				
			||||||
 | 
					         fcmgt d20, d21, d22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK: fcmgt s10, s11, s12   // encoding: [0x6a,0xe5,0xac,0x7e]
 | 
				
			||||||
 | 
					// CHECK: fcmgt d20, d21, d22   // encoding: [0xb4,0xe6,0xf6,0x7e]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Greather Than Zero
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmgt s10, s11, #0.0
 | 
				
			||||||
 | 
					         fcmgt d20, d21, #0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK: fcmgt s10, s11, #0.0   // encoding: [0x6a,0xc9,0xa0,0x5e]
 | 
				
			||||||
 | 
					// CHECK: fcmgt d20, d21, #0.0   // encoding: [0xb4,0xca,0xe0,0x5e]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Less Than Or Equal To Zero
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmle s10, s11, #0.0
 | 
				
			||||||
 | 
					         fcmle d20, d21, #0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK: fcmle s10, s11, #0.0   // encoding: [0x6a,0xd9,0xa0,0x7e]
 | 
				
			||||||
 | 
					// CHECK: fcmle d20, d21, #0.0   // encoding: [0xb4,0xda,0xe0,0x7e]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Compare Mask Less Than
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         fcmlt s10, s11, #0.0
 | 
				
			||||||
 | 
					         fcmlt d20, d21, #0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK: fcmlt s10, s11, #0.0   // encoding: [0x6a,0xe9,0xa0,0x5e]
 | 
				
			||||||
 | 
					// CHECK: fcmlt d20, d21, #0.0   // encoding: [0xb4,0xea,0xe0,0x5e]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Absolute Compare Mask Greater Than Or Equal
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         facge s10, s11, s12
 | 
				
			||||||
 | 
					         facge d20, d21, d22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK: facge s10, s11, s12    // encoding: [0x6a,0xed,0x2c,0x7e]
 | 
				
			||||||
 | 
					// CHECK: facge d20, d21, d22    // encoding: [0xb4,0xee,0x76,0x7e]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Scalar Floating-point Absolute Compare Mask Greater Than
 | 
				
			||||||
 | 
					//----------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         facgt s10, s11, s12
 | 
				
			||||||
 | 
					         facgt d20, d21, d22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK: facgt s10, s11, s12   // encoding: [0x6a,0xed,0xac,0x7e]
 | 
				
			||||||
 | 
					// CHECK: facgt d20, d21, d22   // encoding: [0xb4,0xee,0xf6,0x7e]
 | 
				
			||||||
@@ -1600,6 +1600,86 @@
 | 
				
			|||||||
# CHECK: cmtst d20, d21, d22
 | 
					# CHECK: cmtst d20, d21, d22
 | 
				
			||||||
0xb4,0x8e,0xf6,0x5e
 | 
					0xb4,0x8e,0xf6,0x5e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Scalar Floating-point Compare Mask Equal
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# CHECK: fcmeq s10, s11, s12
 | 
				
			||||||
 | 
					# CHECK: fcmeq d20, d21, d22
 | 
				
			||||||
 | 
					0x6a,0xe5,0x2c,0x5e
 | 
				
			||||||
 | 
					0xb4,0xe6,0x76,0x5e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Scalar Floating-point Compare Mask Equal To Zero
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# CHECK: fcmeq s10, s11, #0.0
 | 
				
			||||||
 | 
					# CHECK: fcmeq d20, d21, #0.0
 | 
				
			||||||
 | 
					0x6a,0xd9,0xa0,0x5e
 | 
				
			||||||
 | 
					0xb4,0xda,0xe0,0x5e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Scalar Floating-point Compare Mask Greater Than Or Equal
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# CHECK: fcmge s10, s11, s12
 | 
				
			||||||
 | 
					# CHECK: fcmge d20, d21, d22
 | 
				
			||||||
 | 
					0x6a,0xe5,0x2c,0x7e
 | 
				
			||||||
 | 
					0xb4,0xe6,0x76,0x7e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Scalar Floating-point Compare Mask Greater Than Or Equal To Zero
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# CHECK: fcmge s10, s11, #0.0
 | 
				
			||||||
 | 
					# CHECK: fcmge d20, d21, #0.0
 | 
				
			||||||
 | 
					0x6a,0xc9,0xa0,0x7e
 | 
				
			||||||
 | 
					0xb4,0xca,0xe0,0x7e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Scalar Floating-point Compare Mask Greather Than
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# CHECK: fcmgt s10, s11, s12
 | 
				
			||||||
 | 
					# CHECK: fcmgt d20, d21, d22
 | 
				
			||||||
 | 
					0x6a,0xe5,0xac,0x7e
 | 
				
			||||||
 | 
					0xb4,0xe6,0xf6,0x7e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Scalar Floating-point Compare Mask Greather Than Zero
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# CHECK: fcmgt s10, s11, #0.0
 | 
				
			||||||
 | 
					# CHECK: fcmgt d20, d21, #0.0
 | 
				
			||||||
 | 
					0x6a,0xc9,0xa0,0x5e
 | 
				
			||||||
 | 
					0xb4,0xca,0xe0,0x5e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Scalar Floating-point Compare Mask Less Than Or Equal To Zero
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# CHECK: fcmle s10, s11, #0.0
 | 
				
			||||||
 | 
					# CHECK: fcmle d20, d21, #0.0
 | 
				
			||||||
 | 
					0x6a,0xd9,0xa0,0x7e
 | 
				
			||||||
 | 
					0xb4,0xda,0xe0,0x7e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Scalar Floating-point Compare Mask Less Than
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# CHECK: fcmlt s10, s11, #0.0
 | 
				
			||||||
 | 
					# CHECK: fcmlt d20, d21, #0.0
 | 
				
			||||||
 | 
					0x6a,0xe9,0xa0,0x5e
 | 
				
			||||||
 | 
					0xb4,0xea,0xe0,0x5e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Scalar Floating-point Absolute Compare Mask Greater Than Or Equal
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# CHECK: facge s10, s11, s12
 | 
				
			||||||
 | 
					# CHECK: facge d20, d21, d22
 | 
				
			||||||
 | 
					0x6a,0xed,0x2c,0x7e
 | 
				
			||||||
 | 
					0xb4,0xee,0x76,0x7e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# Scalar Floating-point Absolute Compare Mask Greater Than
 | 
				
			||||||
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 | 
					# CHECK: facgt s10, s11, s12   
 | 
				
			||||||
 | 
					# CHECK: facgt d20, d21, d22   
 | 
				
			||||||
 | 
					0x6a,0xed,0xac,0x7e
 | 
				
			||||||
 | 
					0xb4,0xee,0xf6,0x7e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#----------------------------------------------------------------------
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
# Scalar Absolute Value
 | 
					# Scalar Absolute Value
 | 
				
			||||||
#----------------------------------------------------------------------
 | 
					#----------------------------------------------------------------------
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user