| ; 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) |