Skip to content

Commit 35db35b

Browse files
committed
[RISCV][GISel] Support G_FCOPYSIGN with F and D extension.
1 parent 9535e01 commit 35db35b

File tree

5 files changed

+140
-0
lines changed

5 files changed

+140
-0
lines changed

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,9 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
254254
G_FABS, G_FSQRT, G_FMAXNUM, G_FMINNUM})
255255
.legalIf(typeIsScalarFPArith(0, ST));
256256

257+
getActionDefinitionsBuilder(G_FCOPYSIGN)
258+
.legalIf(all(typeIsScalarFPArith(0, ST), typeIsScalarFPArith(1, ST)));
259+
257260
getActionDefinitionsBuilder(G_FPTRUNC).legalIf(
258261
[=, &ST](const LegalityQuery &Query) -> bool {
259262
return (ST.hasStdExtD() && typeIs(0, s32)(Query) &&

llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ static bool isPreISelGenericFloatingPointOpcode(unsigned Opc) {
141141
case TargetOpcode::G_FFLOOR:
142142
case TargetOpcode::G_FNEARBYINT:
143143
case TargetOpcode::G_FNEG:
144+
case TargetOpcode::G_FCOPYSIGN:
144145
case TargetOpcode::G_FCOS:
145146
case TargetOpcode::G_FSIN:
146147
case TargetOpcode::G_FLOG10:

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/fp-arith.mir

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,30 @@ body: |
263263
$f10_f = COPY %2(s32)
264264
PseudoRET implicit $f10_f
265265
266+
...
267+
---
268+
name: fcopysign_f32
269+
legalized: true
270+
regBankSelected: true
271+
tracksRegLiveness: true
272+
body: |
273+
bb.0:
274+
liveins: $f10_f, $f11_f
275+
276+
; CHECK-LABEL: name: fcopysign_f32
277+
; CHECK: liveins: $f10_f, $f11_f
278+
; CHECK-NEXT: {{ $}}
279+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr32 = COPY $f10_f
280+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr32 = COPY $f11_f
281+
; CHECK-NEXT: [[FSGNJ_S:%[0-9]+]]:fpr32 = FSGNJ_S [[COPY]], [[COPY1]]
282+
; CHECK-NEXT: $f10_f = COPY [[FSGNJ_S]]
283+
; CHECK-NEXT: PseudoRET implicit $f10_f
284+
%0:fprb(s32) = COPY $f10_f
285+
%1:fprb(s32) = COPY $f11_f
286+
%2:fprb(s32) = G_FCOPYSIGN %0, %1
287+
$f10_f = COPY %2(s32)
288+
PseudoRET implicit $f10_f
289+
266290
...
267291
---
268292
name: fsub_f64
@@ -476,3 +500,27 @@ body: |
476500
PseudoRET implicit $f10_d
477501
478502
...
503+
---
504+
name: fcopysign_f64
505+
legalized: true
506+
regBankSelected: true
507+
tracksRegLiveness: true
508+
body: |
509+
bb.0:
510+
liveins: $f10_d, $f11_d
511+
512+
; CHECK-LABEL: name: fcopysign_f64
513+
; CHECK: liveins: $f10_d, $f11_d
514+
; CHECK-NEXT: {{ $}}
515+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $f10_d
516+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $f11_d
517+
; CHECK-NEXT: [[FSGNJ_D:%[0-9]+]]:fpr64 = FSGNJ_D [[COPY]], [[COPY1]]
518+
; CHECK-NEXT: $f10_d = COPY [[FSGNJ_D]]
519+
; CHECK-NEXT: PseudoRET implicit $f10_d
520+
%0:fprb(s64) = COPY $f10_d
521+
%1:fprb(s64) = COPY $f11_d
522+
%2:fprb(s64) = G_FCOPYSIGN %0, %1
523+
$f10_d = COPY %2(s64)
524+
PseudoRET implicit $f10_d
525+
526+
...

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-fp-arith.mir

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,27 @@ body: |
209209
$f10_f = COPY %2(s32)
210210
PseudoRET implicit $f10_f
211211
212+
...
213+
---
214+
name: fcopysign_f32
215+
body: |
216+
bb.0:
217+
liveins: $f10_f, $f11_f
218+
219+
; CHECK-LABEL: name: fcopysign_f32
220+
; CHECK: liveins: $f10_f, $f11_f
221+
; CHECK-NEXT: {{ $}}
222+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
223+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f11_f
224+
; CHECK-NEXT: [[FCOPYSIGN:%[0-9]+]]:_(s32) = G_FCOPYSIGN [[COPY]], [[COPY1]](s32)
225+
; CHECK-NEXT: $f10_f = COPY [[FCOPYSIGN]](s32)
226+
; CHECK-NEXT: PseudoRET implicit $f10_f
227+
%0:_(s32) = COPY $f10_f
228+
%1:_(s32) = COPY $f11_f
229+
%2:_(s32) = G_FCOPYSIGN %0, %1
230+
$f10_f = COPY %2(s32)
231+
PseudoRET implicit $f10_f
232+
212233
...
213234
---
214235
name: fadd_f64
@@ -416,3 +437,24 @@ body: |
416437
PseudoRET implicit $f10_d
417438
418439
...
440+
---
441+
name: fcopysign_f64
442+
body: |
443+
bb.0:
444+
liveins: $f10_d, $f11_d
445+
446+
; CHECK-LABEL: name: fcopysign_f64
447+
; CHECK: liveins: $f10_d, $f11_d
448+
; CHECK-NEXT: {{ $}}
449+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
450+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $f11_d
451+
; CHECK-NEXT: [[FCOPYSIGN:%[0-9]+]]:_(s64) = G_FCOPYSIGN [[COPY]], [[COPY1]](s64)
452+
; CHECK-NEXT: $f10_d = COPY [[FCOPYSIGN]](s64)
453+
; CHECK-NEXT: PseudoRET implicit $f10_d
454+
%0:_(s64) = COPY $f10_d
455+
%1:_(s64) = COPY $f11_d
456+
%2:_(s64) = G_FCOPYSIGN %0, %1
457+
$f10_d = COPY %2(s64)
458+
PseudoRET implicit $f10_d
459+
460+
...

llvm/test/CodeGen/RISCV/GlobalISel/regbankselect/fp-arith.mir

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,29 @@ body: |
231231
$f10_f = COPY %2(s32)
232232
PseudoRET implicit $f10_f
233233
234+
...
235+
---
236+
name: fcopysign_f32
237+
legalized: true
238+
tracksRegLiveness: true
239+
body: |
240+
bb.0:
241+
liveins: $f10_f, $f11_f
242+
243+
; CHECK-LABEL: name: fcopysign_f32
244+
; CHECK: liveins: $f10_f, $f11_f
245+
; CHECK-NEXT: {{ $}}
246+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fprb(s32) = COPY $f10_f
247+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fprb(s32) = COPY $f11_f
248+
; CHECK-NEXT: [[FCOPYSIGN:%[0-9]+]]:fprb(s32) = G_FCOPYSIGN [[COPY]], [[COPY1]](s32)
249+
; CHECK-NEXT: $f10_f = COPY [[FCOPYSIGN]](s32)
250+
; CHECK-NEXT: PseudoRET implicit $f10_f
251+
%0:_(s32) = COPY $f10_f
252+
%1:_(s32) = COPY $f11_f
253+
%2:_(s32) = G_FCOPYSIGN %0, %1
254+
$f10_f = COPY %2(s32)
255+
PseudoRET implicit $f10_f
256+
234257
...
235258
---
236259
name: fadd_f64
@@ -458,3 +481,26 @@ body: |
458481
PseudoRET implicit $f10_d
459482
460483
...
484+
---
485+
name: fcopysign_f64
486+
legalized: true
487+
tracksRegLiveness: true
488+
body: |
489+
bb.0:
490+
liveins: $f10_d, $f11_d
491+
492+
; CHECK-LABEL: name: fcopysign_f64
493+
; CHECK: liveins: $f10_d, $f11_d
494+
; CHECK-NEXT: {{ $}}
495+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fprb(s64) = COPY $f10_d
496+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f11_d
497+
; CHECK-NEXT: [[FCOPYSIGN:%[0-9]+]]:fprb(s64) = G_FCOPYSIGN [[COPY]], [[COPY1]](s64)
498+
; CHECK-NEXT: $f10_d = COPY [[FCOPYSIGN]](s64)
499+
; CHECK-NEXT: PseudoRET implicit $f10_d
500+
%0:_(s64) = COPY $f10_d
501+
%1:_(s64) = COPY $f11_d
502+
%2:_(s64) = G_FCOPYSIGN %0, %1
503+
$f10_d = COPY %2(s64)
504+
PseudoRET implicit $f10_d
505+
506+
...

0 commit comments

Comments
 (0)