blob: 2da7961c68959a955c25a5768c49458eba2a6f29 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc --mtriple=loongarch32 -mattr=+f < %s | FileCheck %s --check-prefixes=CHECK,LA32
; RUN: llc --mtriple=loongarch64 -mattr=+f < %s | FileCheck %s --check-prefixes=CHECK,LA64
;; LLVM rounding mode encoding: 0=RTZ, 1=RNE, 2=RUP, 3=RDN.
;; LoongArch FCSR encoding: 0=RNE, 1=RZ, 2=RP, 3=RN.
;; Translation: swap 0 <--> 1, keep 2 and 3.
;; The RM field in FCSR is at bits [9:8], so the value is shifted left by 8.
define void @set_rounding_rne() nounwind {
; CHECK-LABEL: set_rounding_rne:
; CHECK: # %bb.0:
; CHECK-NEXT: movgr2fcsr $fcsr3, $zero
; CHECK-NEXT: ret
tail call void @llvm.set.rounding(i32 1)
ret void
}
define void @set_rounding_rtz() nounwind {
; CHECK-LABEL: set_rounding_rtz:
; CHECK: # %bb.0:
; CHECK-NEXT: ori $a0, $zero, 256
; CHECK-NEXT: movgr2fcsr $fcsr3, $a0
; CHECK-NEXT: ret
tail call void @llvm.set.rounding(i32 0)
ret void
}
define void @set_rounding_rup() nounwind {
; CHECK-LABEL: set_rounding_rup:
; CHECK: # %bb.0:
; CHECK-NEXT: ori $a0, $zero, 512
; CHECK-NEXT: movgr2fcsr $fcsr3, $a0
; CHECK-NEXT: ret
tail call void @llvm.set.rounding(i32 2)
ret void
}
define void @set_rounding_rdn() nounwind {
; CHECK-LABEL: set_rounding_rdn:
; CHECK: # %bb.0:
; CHECK-NEXT: ori $a0, $zero, 768
; CHECK-NEXT: movgr2fcsr $fcsr3, $a0
; CHECK-NEXT: ret
tail call void @llvm.set.rounding(i32 3)
ret void
}
;; Test dynamic rounding mode argument.
define void @set_rounding_dynamic(i32 %rm) nounwind {
; LA32-LABEL: set_rounding_dynamic:
; LA32: # %bb.0:
; LA32-NEXT: nor $a1, $a0, $zero
; LA32-NEXT: srli.w $a1, $a1, 1
; LA32-NEXT: andi $a1, $a1, 1
; LA32-NEXT: xor $a0, $a0, $a1
; LA32-NEXT: slli.w $a0, $a0, 8
; LA32-NEXT: movgr2fcsr $fcsr3, $a0
; LA32-NEXT: ret
;
; LA64-LABEL: set_rounding_dynamic:
; LA64: # %bb.0:
; LA64-NEXT: bstrpick.d $a1, $a0, 31, 0
; LA64-NEXT: nor $a0, $a0, $zero
; LA64-NEXT: bstrpick.d $a0, $a0, 1, 1
; LA64-NEXT: xor $a0, $a1, $a0
; LA64-NEXT: slli.d $a0, $a0, 8
; LA64-NEXT: movgr2fcsr $fcsr3, $a0
; LA64-NEXT: ret
tail call void @llvm.set.rounding(i32 %rm)
ret void
}
declare void @llvm.set.rounding(i32)