mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
Add NEON single-precision FP support for fabs and fneg.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78101 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1071,6 +1071,14 @@ class ASuI<bits<8> opcod1, bits<4> opcod2, bits<4> opcod3, dag oops, dag iops,
|
|||||||
let Inst{7-4} = opcod3;
|
let Inst{7-4} = opcod3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Single precision, unary if no NEON
|
||||||
|
// Same as ASuI except not available if NEON is enabled
|
||||||
|
class ASuIn<bits<8> opcod1, bits<4> opcod2, bits<4> opcod3, dag oops, dag iops,
|
||||||
|
string opc, string asm, list<dag> pattern>
|
||||||
|
: ASuI<opcod1, opcod2, opcod2, oops, iops, opc, asm, pattern> {
|
||||||
|
list<Predicate> Predicates = [HasVFP2,DontUseNEONForFP];
|
||||||
|
}
|
||||||
|
|
||||||
// Single precision, binary
|
// Single precision, binary
|
||||||
class ASbI<bits<8> opcod, dag oops, dag iops, string opc,
|
class ASbI<bits<8> opcod, dag oops, dag iops, string opc,
|
||||||
string asm, list<dag> pattern>
|
string asm, list<dag> pattern>
|
||||||
|
@@ -246,6 +246,12 @@ class N2VQInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
|
|||||||
(ins QPR:$src), !strconcat(OpcodeStr, "\t$dst, $src"), "",
|
(ins QPR:$src), !strconcat(OpcodeStr, "\t$dst, $src"), "",
|
||||||
[(set QPR:$dst, (ResTy (IntOp (OpTy QPR:$src))))]>;
|
[(set QPR:$dst, (ResTy (IntOp (OpTy QPR:$src))))]>;
|
||||||
|
|
||||||
|
// Basic 2-register operations, scalar single-precision
|
||||||
|
class N2VDInts<SDNode OpNode, NeonI Inst>
|
||||||
|
: NEONFPPat<(f32 (OpNode SPR:$a)),
|
||||||
|
(EXTRACT_SUBREG (Inst (INSERT_SUBREG (v2f32 (IMPLICIT_DEF)), SPR:$a, arm_ssubreg_0)),
|
||||||
|
arm_ssubreg_0)>;
|
||||||
|
|
||||||
// Narrow 2-register intrinsics.
|
// Narrow 2-register intrinsics.
|
||||||
class N2VNInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
|
class N2VNInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
|
||||||
bits<2> op17_16, bits<5> op11_7, bit op6, bit op4,
|
bits<2> op17_16, bits<5> op11_7, bit op6, bit op4,
|
||||||
@@ -1338,6 +1344,7 @@ def VABSfd : N2VDInt<0b11, 0b11, 0b10, 0b01, 0b01110, 0, "vabs.f32",
|
|||||||
v2f32, v2f32, int_arm_neon_vabsf>;
|
v2f32, v2f32, int_arm_neon_vabsf>;
|
||||||
def VABSfq : N2VQInt<0b11, 0b11, 0b10, 0b01, 0b01110, 0, "vabs.f32",
|
def VABSfq : N2VQInt<0b11, 0b11, 0b10, 0b01, 0b01110, 0, "vabs.f32",
|
||||||
v4f32, v4f32, int_arm_neon_vabsf>;
|
v4f32, v4f32, int_arm_neon_vabsf>;
|
||||||
|
def : N2VDInts<fabs, VABSfd>;
|
||||||
|
|
||||||
// VQABS : Vector Saturating Absolute Value
|
// VQABS : Vector Saturating Absolute Value
|
||||||
defm VQABS : N2VInt_QHS<0b11, 0b11, 0b00, 0b01110, 0, "vqabs.s",
|
defm VQABS : N2VInt_QHS<0b11, 0b11, 0b00, 0b01110, 0, "vqabs.s",
|
||||||
@@ -1372,6 +1379,7 @@ def VNEGf32d : N2V<0b11, 0b11, 0b10, 0b01, 0b01111, 0, 0,
|
|||||||
def VNEGf32q : N2V<0b11, 0b11, 0b10, 0b01, 0b01111, 1, 0,
|
def VNEGf32q : N2V<0b11, 0b11, 0b10, 0b01, 0b01111, 1, 0,
|
||||||
(outs QPR:$dst), (ins QPR:$src), "vneg.f32\t$dst, $src", "",
|
(outs QPR:$dst), (ins QPR:$src), "vneg.f32\t$dst, $src", "",
|
||||||
[(set QPR:$dst, (v4f32 (fneg QPR:$src)))]>;
|
[(set QPR:$dst, (v4f32 (fneg QPR:$src)))]>;
|
||||||
|
def : N2VDInts<fneg, VNEGf32d>;
|
||||||
|
|
||||||
def : Pat<(v8i8 (vneg_conv DPR:$src)), (VNEGs8d DPR:$src)>;
|
def : Pat<(v8i8 (vneg_conv DPR:$src)), (VNEGs8d DPR:$src)>;
|
||||||
def : Pat<(v4i16 (vneg_conv DPR:$src)), (VNEGs16d DPR:$src)>;
|
def : Pat<(v4i16 (vneg_conv DPR:$src)), (VNEGs16d DPR:$src)>;
|
||||||
|
@@ -168,9 +168,9 @@ def FABSD : ADuI<0b11101011, 0b0000, 0b1100, (outs DPR:$dst), (ins DPR:$a),
|
|||||||
"fabsd", " $dst, $a",
|
"fabsd", " $dst, $a",
|
||||||
[(set DPR:$dst, (fabs DPR:$a))]>;
|
[(set DPR:$dst, (fabs DPR:$a))]>;
|
||||||
|
|
||||||
def FABSS : ASuI<0b11101011, 0b0000, 0b1100, (outs SPR:$dst), (ins SPR:$a),
|
def FABSS : ASuIn<0b11101011, 0b0000, 0b1100, (outs SPR:$dst), (ins SPR:$a),
|
||||||
"fabss", " $dst, $a",
|
"fabss", " $dst, $a",
|
||||||
[(set SPR:$dst, (fabs SPR:$a))]>;
|
[(set SPR:$dst, (fabs SPR:$a))]>;
|
||||||
|
|
||||||
let Defs = [FPSCR] in {
|
let Defs = [FPSCR] in {
|
||||||
def FCMPEZD : ADuI<0b11101011, 0b0101, 0b1100, (outs), (ins DPR:$a),
|
def FCMPEZD : ADuI<0b11101011, 0b0101, 0b1100, (outs), (ins DPR:$a),
|
||||||
@@ -208,9 +208,9 @@ def FNEGD : ADuI<0b11101011, 0b0001, 0b0100, (outs DPR:$dst), (ins DPR:$a),
|
|||||||
"fnegd", " $dst, $a",
|
"fnegd", " $dst, $a",
|
||||||
[(set DPR:$dst, (fneg DPR:$a))]>;
|
[(set DPR:$dst, (fneg DPR:$a))]>;
|
||||||
|
|
||||||
def FNEGS : ASuI<0b11101011, 0b0001, 0b0100, (outs SPR:$dst), (ins SPR:$a),
|
def FNEGS : ASuIn<0b11101011, 0b0001, 0b0100, (outs SPR:$dst), (ins SPR:$a),
|
||||||
"fnegs", " $dst, $a",
|
"fnegs", " $dst, $a",
|
||||||
[(set SPR:$dst, (fneg SPR:$a))]>;
|
[(set SPR:$dst, (fneg SPR:$a))]>;
|
||||||
|
|
||||||
def FSQRTD : ADuI<0b11101011, 0b0001, 0b1100, (outs DPR:$dst), (ins DPR:$a),
|
def FSQRTD : ADuI<0b11101011, 0b0001, 0b1100, (outs DPR:$dst), (ins DPR:$a),
|
||||||
"fsqrtd", " $dst, $a",
|
"fsqrtd", " $dst, $a",
|
||||||
|
13
test/CodeGen/ARM/fabss.ll
Normal file
13
test/CodeGen/ARM/fabss.ll
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
; RUN: llvm-as < %s | llc -march=arm -mattr=+vfp2 | grep -E {fabss\\W*s\[0-9\]+,\\W*s\[0-9\]+} | count 1
|
||||||
|
; RUN: llvm-as < %s | llc -march=arm -mattr=+neon,+neonfp | grep -E {vabs.f32\\W*d\[0-9\]+,\\W*d\[0-9\]+} | count 1
|
||||||
|
; RUN: llvm-as < %s | llc -march=arm -mattr=+neon,-neonfp | grep -E {fabss\\W*s\[0-9\]+,\\W*s\[0-9\]+} | count 1
|
||||||
|
|
||||||
|
define float @test(float %a, float %b) {
|
||||||
|
entry:
|
||||||
|
%dum = fadd float %a, %b
|
||||||
|
%0 = tail call float @fabsf(float %dum)
|
||||||
|
%dum1 = fadd float %0, %b
|
||||||
|
ret float %dum1
|
||||||
|
}
|
||||||
|
|
||||||
|
declare float @fabsf(float)
|
23
test/CodeGen/ARM/fnegs.ll
Normal file
23
test/CodeGen/ARM/fnegs.ll
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
; RUN: llvm-as < %s | llc -march=arm -mattr=+vfp2 | grep -E {fnegs\\W*s\[0-9\]+,\\W*s\[0-9\]+} | count 2
|
||||||
|
; RUN: llvm-as < %s | llc -march=arm -mattr=+neon,+neonfp | grep -E {vneg.f32\\W*d\[0-9\]+,\\W*d\[0-9\]+} | count 2
|
||||||
|
; RUN: llvm-as < %s | llc -march=arm -mattr=+neon,-neonfp | grep -E {fnegs\\W*s\[0-9\]+,\\W*s\[0-9\]+} | count 2
|
||||||
|
|
||||||
|
define float @test1(float* %a) {
|
||||||
|
entry:
|
||||||
|
%0 = load float* %a, align 4 ; <float> [#uses=2]
|
||||||
|
%1 = fsub float -0.000000e+00, %0 ; <float> [#uses=2]
|
||||||
|
%2 = fpext float %1 to double ; <double> [#uses=1]
|
||||||
|
%3 = fcmp olt double %2, 1.234000e+00 ; <i1> [#uses=1]
|
||||||
|
%retval = select i1 %3, float %1, float %0 ; <float> [#uses=1]
|
||||||
|
ret float %retval
|
||||||
|
}
|
||||||
|
|
||||||
|
define float @test2(float* %a) {
|
||||||
|
entry:
|
||||||
|
%0 = load float* %a, align 4 ; <float> [#uses=2]
|
||||||
|
%1 = fmul float -1.000000e+00, %0 ; <float> [#uses=2]
|
||||||
|
%2 = fpext float %1 to double ; <double> [#uses=1]
|
||||||
|
%3 = fcmp olt double %2, 1.234000e+00 ; <i1> [#uses=1]
|
||||||
|
%retval = select i1 %3, float %1, float %0 ; <float> [#uses=1]
|
||||||
|
ret float %retval
|
||||||
|
}
|
Reference in New Issue
Block a user