Skip to content

Commit efc7005

Browse files
committed
[LoongArch] Add codegen support for fneg
Reference: https://llvm.org/docs/LangRef.html#fneg-instruction Differential Revision: https://reviews.llvm.org/D127200
1 parent a992115 commit efc7005

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ def FSTLE_S : FP_STORE_3R<0b00111000011101110, "fstle.s", FPR32>;
113113

114114
/// Generic pattern classes
115115

116+
class PatFpr<SDPatternOperator OpNode, LAInst Inst, RegisterClass RegTy>
117+
: Pat<(OpNode RegTy:$fj), (Inst $fj)>;
116118
class PatFprFpr<SDPatternOperator OpNode, LAInst Inst, RegisterClass RegTy>
117119
: Pat<(OpNode RegTy:$fj, RegTy:$fk), (Inst $fj, $fk)>;
118120

@@ -124,5 +126,6 @@ def : PatFprFpr<fadd, FADD_S, FPR32>;
124126
def : PatFprFpr<fsub, FSUB_S, FPR32>;
125127
def : PatFprFpr<fmul, FMUL_S, FPR32>;
126128
def : PatFprFpr<fdiv, FDIV_S, FPR32>;
129+
def : PatFpr<fneg, FNEG_S, FPR32>;
127130

128131
} // Predicates = [HasBasicF]

llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,5 +143,6 @@ def : PatFprFpr<fadd, FADD_D, FPR64>;
143143
def : PatFprFpr<fsub, FSUB_D, FPR64>;
144144
def : PatFprFpr<fmul, FMUL_D, FPR64>;
145145
def : PatFprFpr<fdiv, FDIV_D, FPR64>;
146+
def : PatFpr<fneg, FNEG_D, FPR64>;
146147

147148
} // Predicates = [HasBasicD]
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32
2+
; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64
3+
4+
;; Exercise the 'fneg' LLVM IR: https://llvm.org/docs/LangRef.html#fneg-instruction
5+
6+
define float @fneg_s(float %x) {
7+
; LA32-LABEL: fneg_s:
8+
; LA32: # %bb.0:
9+
; LA32-NEXT: fneg.s $fa0, $fa0
10+
; LA32-NEXT: jirl $zero, $ra, 0
11+
;
12+
; LA64-LABEL: fneg_s:
13+
; LA64: # %bb.0:
14+
; LA64-NEXT: fneg.s $fa0, $fa0
15+
; LA64-NEXT: jirl $zero, $ra, 0
16+
%neg = fneg float %x
17+
ret float %neg
18+
}
19+
20+
define double @fneg_d(double %x) {
21+
; LA32-LABEL: fneg_d:
22+
; LA32: # %bb.0:
23+
; LA32-NEXT: fneg.d $fa0, $fa0
24+
; LA32-NEXT: jirl $zero, $ra, 0
25+
;
26+
; LA64-LABEL: fneg_d:
27+
; LA64: # %bb.0:
28+
; LA64-NEXT: fneg.d $fa0, $fa0
29+
; LA64-NEXT: jirl $zero, $ra, 0
30+
%neg = fneg double %x
31+
ret double %neg
32+
}

llvm/test/CodeGen/LoongArch/ir-instruction/fsub.ll

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,31 @@ define double @fsub_d(double %x, double %y) {
3030
%sub = fsub double %x, %y
3131
ret double %sub
3232
}
33+
34+
define float @fneg_s(float %x) {
35+
; LA32-LABEL: fneg_s:
36+
; LA32: # %bb.0:
37+
; LA32-NEXT: fneg.s $fa0, $fa0
38+
; LA32-NEXT: jirl $zero, $ra, 0
39+
;
40+
; LA64-LABEL: fneg_s:
41+
; LA64: # %bb.0:
42+
; LA64-NEXT: fneg.s $fa0, $fa0
43+
; LA64-NEXT: jirl $zero, $ra, 0
44+
%res = fsub float -0.0, %x
45+
ret float %res
46+
}
47+
48+
define double @fneg_d(double %x) {
49+
; LA32-LABEL: fneg_d:
50+
; LA32: # %bb.0:
51+
; LA32-NEXT: fneg.d $fa0, $fa0
52+
; LA32-NEXT: jirl $zero, $ra, 0
53+
;
54+
; LA64-LABEL: fneg_d:
55+
; LA64: # %bb.0:
56+
; LA64-NEXT: fneg.d $fa0, $fa0
57+
; LA64-NEXT: jirl $zero, $ra, 0
58+
%res = fsub double -0.0, %x
59+
ret double %res
60+
}

0 commit comments

Comments
 (0)