From: Chad Rosier Date: Wed, 16 Oct 2013 21:04:39 +0000 (+0000) Subject: [AArch64] Add support for NEON scalar negate instruction. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=dceac4c5a611f26ebcc88c75cc39075c7df2466e;p=oota-llvm.git [AArch64] Add support for NEON scalar negate instruction. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192843 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/IntrinsicsAArch64.td b/include/llvm/IR/IntrinsicsAArch64.td index d11c672ef99..f707df7be2b 100644 --- a/include/llvm/IR/IntrinsicsAArch64.td +++ b/include/llvm/IR/IntrinsicsAArch64.td @@ -200,4 +200,8 @@ def int_aarch64_neon_vsqadd : Neon_2Arg_Intrinsic; // Scalar Absolute Value def int_aarch64_neon_vabs : Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty], [IntrNoMem]>; + +// Scalar Negate Value +def int_aarch64_neon_vneg : + Intrinsic<[llvm_v1i64_ty], [llvm_v1i64_ty], [IntrNoMem]>; } diff --git a/lib/Target/AArch64/AArch64InstrNEON.td b/lib/Target/AArch64/AArch64InstrNEON.td index 96a5482f99e..440e739e4ba 100644 --- a/lib/Target/AArch64/AArch64InstrNEON.td +++ b/lib/Target/AArch64/AArch64InstrNEON.td @@ -3585,6 +3585,10 @@ defm SQABS : NeonI_Scalar2SameMisc_BHSD_size<0b0, 0b00111, "sqabs">; defm : Neon_Scalar2SameMisc_BHSD_size_patterns; +// Scalar Negate +defm NEG : NeonI_Scalar2SameMisc_D_size<0b1, 0b01011, "neg">; +defm : Neon_Scalar2SameMisc_D_size_patterns; + // Scalar Signed Saturating Negate defm SQNEG : NeonI_Scalar2SameMisc_BHSD_size<0b1, 0b00111, "sqneg">; defm : Neon_Scalar2SameMisc_BHSD_size_patterns undef, i64 %a, i32 0 + %vneg1.i = tail call <1 x i64> @llvm.aarch64.neon.vneg(<1 x i64> %vneg.i) + %0 = extractelement <1 x i64> %vneg1.i, i32 0 + ret i64 %0 +} + +declare <1 x i64> @llvm.aarch64.neon.vneg(<1 x i64>) + define i8 @test_vqnegb_s8(i8 %a) { ; CHECK: test_vqnegb_s8 ; CHECK: sqneg {{b[0-9]+}}, {{b[0-9]+}} diff --git a/test/MC/AArch64/neon-diagnostics.s b/test/MC/AArch64/neon-diagnostics.s index ddd80ea1787..411ea9fe0b1 100644 --- a/test/MC/AArch64/neon-diagnostics.s +++ b/test/MC/AArch64/neon-diagnostics.s @@ -4450,3 +4450,13 @@ // CHECK-ERROR: error: invalid operand for instruction // CHECK-ERROR: abs d29, s24 // CHECK-ERROR: ^ + +//---------------------------------------------------------------------- +// Scalar Negate +//---------------------------------------------------------------------- + + neg d29, s24 + +// CHECK-ERROR: error: invalid operand for instruction +// CHECK-ERROR: neg d29, s24 +// CHECK-ERROR: ^ diff --git a/test/MC/AArch64/neon-scalar-neg.s b/test/MC/AArch64/neon-scalar-neg.s index 0e637da7949..8e5d61dd245 100644 --- a/test/MC/AArch64/neon-scalar-neg.s +++ b/test/MC/AArch64/neon-scalar-neg.s @@ -2,6 +2,14 @@ // Check that the assembler can handle the documented syntax for AArch64 +//---------------------------------------------------------------------- +// Scalar Negate +//---------------------------------------------------------------------- + + neg d29, d24 + +// CHECK: neg d29, d24 // encoding: [0x1d,0xbb,0xe0,0x7e] + //---------------------------------------------------------------------- // Scalar Signed Saturating Negate //---------------------------------------------------------------------- diff --git a/test/MC/Disassembler/AArch64/neon-instructions.txt b/test/MC/Disassembler/AArch64/neon-instructions.txt index 81fffd6c7cb..c70a2f64868 100644 --- a/test/MC/Disassembler/AArch64/neon-instructions.txt +++ b/test/MC/Disassembler/AArch64/neon-instructions.txt @@ -1618,6 +1618,12 @@ 0x94,0x79,0xa0,0x5e 0x92,0x79,0xe0,0x5e +#---------------------------------------------------------------------- +# Scalar Negate +#---------------------------------------------------------------------- +# CHECK: neg d29, d24 +0x1d,0xbb,0xe0,0x7e + #---------------------------------------------------------------------- # Scalar Signed Saturating Negate #----------------------------------------------------------------------