-
Notifications
You must be signed in to change notification settings - Fork 11.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[RISCV][GISel] Port portions of float-intrinsics.ll and double-intrin…
…sics.ll. NFC Remove the legalizer test for the same intrinsics as it is no longer interesting with end to end tests.
- Loading branch information
Showing
3 changed files
with
705 additions
and
328 deletions.
There are no files selected for viewing
264 changes: 264 additions & 0 deletions
264
llvm/test/CodeGen/RISCV/GlobalISel/double-intrinsics.ll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,264 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | ||
; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -global-isel -mattr=+d \ | ||
; RUN: -verify-machineinstrs -target-abi=ilp32d \ | ||
; RUN: | FileCheck -check-prefixes=CHECKIFD,RV32IFD %s | ||
; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -global-isel -mattr=+d \ | ||
; RUN: -verify-machineinstrs -target-abi=lp64d \ | ||
; RUN: | FileCheck -check-prefixes=CHECKIFD,RV64IFD %s | ||
|
||
declare double @llvm.sqrt.f64(double) | ||
|
||
define double @sqrt_f64(double %a) nounwind { | ||
; CHECKIFD-LABEL: sqrt_f64: | ||
; CHECKIFD: # %bb.0: | ||
; CHECKIFD-NEXT: fsqrt.d fa0, fa0 | ||
; CHECKIFD-NEXT: ret | ||
%1 = call double @llvm.sqrt.f64(double %a) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.fma.f64(double, double, double) | ||
|
||
define double @fma_f64(double %a, double %b, double %c) nounwind { | ||
; CHECKIFD-LABEL: fma_f64: | ||
; CHECKIFD: # %bb.0: | ||
; CHECKIFD-NEXT: fmadd.d fa0, fa0, fa1, fa2 | ||
; CHECKIFD-NEXT: ret | ||
%1 = call double @llvm.fma.f64(double %a, double %b, double %c) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.fmuladd.f64(double, double, double) | ||
|
||
define double @fmuladd_f64(double %a, double %b, double %c) nounwind { | ||
; CHECKIFD-LABEL: fmuladd_f64: | ||
; CHECKIFD: # %bb.0: | ||
; CHECKIFD-NEXT: fmadd.d fa0, fa0, fa1, fa2 | ||
; CHECKIFD-NEXT: ret | ||
%1 = call double @llvm.fmuladd.f64(double %a, double %b, double %c) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.fabs.f64(double) | ||
|
||
define double @fabs_f64(double %a) nounwind { | ||
; CHECKIFD-LABEL: fabs_f64: | ||
; CHECKIFD: # %bb.0: | ||
; CHECKIFD-NEXT: fabs.d fa0, fa0 | ||
; CHECKIFD-NEXT: ret | ||
%1 = call double @llvm.fabs.f64(double %a) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.minnum.f64(double, double) | ||
|
||
define double @minnum_f64(double %a, double %b) nounwind { | ||
; CHECKIFD-LABEL: minnum_f64: | ||
; CHECKIFD: # %bb.0: | ||
; CHECKIFD-NEXT: fmin.d fa0, fa0, fa1 | ||
; CHECKIFD-NEXT: ret | ||
%1 = call double @llvm.minnum.f64(double %a, double %b) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.maxnum.f64(double, double) | ||
|
||
define double @maxnum_f64(double %a, double %b) nounwind { | ||
; CHECKIFD-LABEL: maxnum_f64: | ||
; CHECKIFD: # %bb.0: | ||
; CHECKIFD-NEXT: fmax.d fa0, fa0, fa1 | ||
; CHECKIFD-NEXT: ret | ||
%1 = call double @llvm.maxnum.f64(double %a, double %b) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.copysign.f64(double, double) | ||
|
||
define double @copysign_f64(double %a, double %b) nounwind { | ||
; CHECKIFD-LABEL: copysign_f64: | ||
; CHECKIFD: # %bb.0: | ||
; CHECKIFD-NEXT: fsgnj.d fa0, fa0, fa1 | ||
; CHECKIFD-NEXT: ret | ||
%1 = call double @llvm.copysign.f64(double %a, double %b) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.floor.f64(double) | ||
|
||
define double @floor_f64(double %a) nounwind { | ||
; RV32IFD-LABEL: floor_f64: | ||
; RV32IFD: # %bb.0: | ||
; RV32IFD-NEXT: addi sp, sp, -16 | ||
; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | ||
; RV32IFD-NEXT: call floor | ||
; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | ||
; RV32IFD-NEXT: addi sp, sp, 16 | ||
; RV32IFD-NEXT: ret | ||
; | ||
; RV64IFD-LABEL: floor_f64: | ||
; RV64IFD: # %bb.0: | ||
; RV64IFD-NEXT: addi sp, sp, -16 | ||
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | ||
; RV64IFD-NEXT: call floor | ||
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | ||
; RV64IFD-NEXT: addi sp, sp, 16 | ||
; RV64IFD-NEXT: ret | ||
%1 = call double @llvm.floor.f64(double %a) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.ceil.f64(double) | ||
|
||
define double @ceil_f64(double %a) nounwind { | ||
; RV32IFD-LABEL: ceil_f64: | ||
; RV32IFD: # %bb.0: | ||
; RV32IFD-NEXT: addi sp, sp, -16 | ||
; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | ||
; RV32IFD-NEXT: call ceil | ||
; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | ||
; RV32IFD-NEXT: addi sp, sp, 16 | ||
; RV32IFD-NEXT: ret | ||
; | ||
; RV64IFD-LABEL: ceil_f64: | ||
; RV64IFD: # %bb.0: | ||
; RV64IFD-NEXT: addi sp, sp, -16 | ||
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | ||
; RV64IFD-NEXT: call ceil | ||
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | ||
; RV64IFD-NEXT: addi sp, sp, 16 | ||
; RV64IFD-NEXT: ret | ||
%1 = call double @llvm.ceil.f64(double %a) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.trunc.f64(double) | ||
|
||
define double @trunc_f64(double %a) nounwind { | ||
; RV32IFD-LABEL: trunc_f64: | ||
; RV32IFD: # %bb.0: | ||
; RV32IFD-NEXT: addi sp, sp, -16 | ||
; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | ||
; RV32IFD-NEXT: call trunc | ||
; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | ||
; RV32IFD-NEXT: addi sp, sp, 16 | ||
; RV32IFD-NEXT: ret | ||
; | ||
; RV64IFD-LABEL: trunc_f64: | ||
; RV64IFD: # %bb.0: | ||
; RV64IFD-NEXT: addi sp, sp, -16 | ||
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | ||
; RV64IFD-NEXT: call trunc | ||
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | ||
; RV64IFD-NEXT: addi sp, sp, 16 | ||
; RV64IFD-NEXT: ret | ||
%1 = call double @llvm.trunc.f64(double %a) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.rint.f64(double) | ||
|
||
define double @rint_f64(double %a) nounwind { | ||
; RV32IFD-LABEL: rint_f64: | ||
; RV32IFD: # %bb.0: | ||
; RV32IFD-NEXT: addi sp, sp, -16 | ||
; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | ||
; RV32IFD-NEXT: call rint | ||
; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | ||
; RV32IFD-NEXT: addi sp, sp, 16 | ||
; RV32IFD-NEXT: ret | ||
; | ||
; RV64IFD-LABEL: rint_f64: | ||
; RV64IFD: # %bb.0: | ||
; RV64IFD-NEXT: addi sp, sp, -16 | ||
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | ||
; RV64IFD-NEXT: call rint | ||
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | ||
; RV64IFD-NEXT: addi sp, sp, 16 | ||
; RV64IFD-NEXT: ret | ||
%1 = call double @llvm.rint.f64(double %a) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.nearbyint.f64(double) | ||
|
||
define double @nearbyint_f64(double %a) nounwind { | ||
; RV32IFD-LABEL: nearbyint_f64: | ||
; RV32IFD: # %bb.0: | ||
; RV32IFD-NEXT: addi sp, sp, -16 | ||
; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | ||
; RV32IFD-NEXT: call nearbyint | ||
; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | ||
; RV32IFD-NEXT: addi sp, sp, 16 | ||
; RV32IFD-NEXT: ret | ||
; | ||
; RV64IFD-LABEL: nearbyint_f64: | ||
; RV64IFD: # %bb.0: | ||
; RV64IFD-NEXT: addi sp, sp, -16 | ||
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | ||
; RV64IFD-NEXT: call nearbyint | ||
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | ||
; RV64IFD-NEXT: addi sp, sp, 16 | ||
; RV64IFD-NEXT: ret | ||
%1 = call double @llvm.nearbyint.f64(double %a) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.round.f64(double) | ||
|
||
define double @round_f64(double %a) nounwind { | ||
; RV32IFD-LABEL: round_f64: | ||
; RV32IFD: # %bb.0: | ||
; RV32IFD-NEXT: addi sp, sp, -16 | ||
; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | ||
; RV32IFD-NEXT: call round | ||
; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | ||
; RV32IFD-NEXT: addi sp, sp, 16 | ||
; RV32IFD-NEXT: ret | ||
; | ||
; RV64IFD-LABEL: round_f64: | ||
; RV64IFD: # %bb.0: | ||
; RV64IFD-NEXT: addi sp, sp, -16 | ||
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | ||
; RV64IFD-NEXT: call round | ||
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | ||
; RV64IFD-NEXT: addi sp, sp, 16 | ||
; RV64IFD-NEXT: ret | ||
%1 = call double @llvm.round.f64(double %a) | ||
ret double %1 | ||
} | ||
|
||
declare double @llvm.roundeven.f64(double) | ||
|
||
define double @roundeven_f64(double %a) nounwind { | ||
; RV32IFD-LABEL: roundeven_f64: | ||
; RV32IFD: # %bb.0: | ||
; RV32IFD-NEXT: addi sp, sp, -16 | ||
; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill | ||
; RV32IFD-NEXT: call roundeven | ||
; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload | ||
; RV32IFD-NEXT: addi sp, sp, 16 | ||
; RV32IFD-NEXT: ret | ||
; | ||
; RV64IFD-LABEL: roundeven_f64: | ||
; RV64IFD: # %bb.0: | ||
; RV64IFD-NEXT: addi sp, sp, -16 | ||
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill | ||
; RV64IFD-NEXT: call roundeven | ||
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload | ||
; RV64IFD-NEXT: addi sp, sp, 16 | ||
; RV64IFD-NEXT: ret | ||
%1 = call double @llvm.roundeven.f64(double %a) | ||
ret double %1 | ||
} | ||
|
||
declare i1 @llvm.is.fpclass.f64(double, i32) | ||
define i1 @isnan_d_fpclass(double %x) { | ||
; CHECKIFD-LABEL: isnan_d_fpclass: | ||
; CHECKIFD: # %bb.0: | ||
; CHECKIFD-NEXT: fclass.d a0, fa0 | ||
; CHECKIFD-NEXT: andi a0, a0, 768 | ||
; CHECKIFD-NEXT: snez a0, a0 | ||
; CHECKIFD-NEXT: ret | ||
%1 = call i1 @llvm.is.fpclass.f64(double %x, i32 3) ; nan | ||
ret i1 %1 | ||
} |
Oops, something went wrong.