219 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s | FileCheck -check-prefix=RV32IF %s3; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s | FileCheck -check-prefix=RV64IF %s4 5define i32 @func_01() {6; RV32IF-LABEL: func_01:7; RV32IF: # %bb.0:8; RV32IF-NEXT: frrm a09; RV32IF-NEXT: lui a1, 6610; RV32IF-NEXT: slli a0, a0, 211; RV32IF-NEXT: addi a1, a1, 76912; RV32IF-NEXT: srl a0, a1, a013; RV32IF-NEXT: andi a0, a0, 714; RV32IF-NEXT: ret15;16; RV64IF-LABEL: func_01:17; RV64IF: # %bb.0:18; RV64IF-NEXT: frrm a019; RV64IF-NEXT: lui a1, 6620; RV64IF-NEXT: slli a0, a0, 221; RV64IF-NEXT: addi a1, a1, 76922; RV64IF-NEXT: srl a0, a1, a023; RV64IF-NEXT: andi a0, a0, 724; RV64IF-NEXT: ret25 %rm = call i32 @llvm.get.rounding()26 ret i32 %rm27}28 29define i1 @test_get_rounding_sideeffect() #0 {30; RV32IF-LABEL: test_get_rounding_sideeffect:31; RV32IF: # %bb.0: # %entry32; RV32IF-NEXT: addi sp, sp, -1633; RV32IF-NEXT: .cfi_def_cfa_offset 1634; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill35; RV32IF-NEXT: sw s0, 8(sp) # 4-byte Folded Spill36; RV32IF-NEXT: .cfi_offset ra, -437; RV32IF-NEXT: .cfi_offset s0, -838; RV32IF-NEXT: li a0, 139; RV32IF-NEXT: call fesetround40; RV32IF-NEXT: frrm a041; RV32IF-NEXT: lui a1, 6642; RV32IF-NEXT: slli a0, a0, 243; RV32IF-NEXT: addi s0, a1, 76944; RV32IF-NEXT: srl a0, s0, a045; RV32IF-NEXT: andi a0, a0, 746; RV32IF-NEXT: beqz a0, .LBB1_247; RV32IF-NEXT: # %bb.1:48; RV32IF-NEXT: li a0, 049; RV32IF-NEXT: j .LBB1_350; RV32IF-NEXT: .LBB1_2: # %if.end51; RV32IF-NEXT: call fesetround52; RV32IF-NEXT: frrm a053; RV32IF-NEXT: slli a0, a0, 254; RV32IF-NEXT: srl a0, s0, a055; RV32IF-NEXT: andi a0, a0, 756; RV32IF-NEXT: addi a0, a0, -157; RV32IF-NEXT: seqz a0, a058; RV32IF-NEXT: .LBB1_3: # %return59; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload60; RV32IF-NEXT: lw s0, 8(sp) # 4-byte Folded Reload61; RV32IF-NEXT: .cfi_restore ra62; RV32IF-NEXT: .cfi_restore s063; RV32IF-NEXT: addi sp, sp, 1664; RV32IF-NEXT: .cfi_def_cfa_offset 065; RV32IF-NEXT: ret66;67; RV64IF-LABEL: test_get_rounding_sideeffect:68; RV64IF: # %bb.0: # %entry69; RV64IF-NEXT: addi sp, sp, -1670; RV64IF-NEXT: .cfi_def_cfa_offset 1671; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill72; RV64IF-NEXT: sd s0, 0(sp) # 8-byte Folded Spill73; RV64IF-NEXT: .cfi_offset ra, -874; RV64IF-NEXT: .cfi_offset s0, -1675; RV64IF-NEXT: li a0, 176; RV64IF-NEXT: call fesetround77; RV64IF-NEXT: frrm a078; RV64IF-NEXT: lui a1, 6679; RV64IF-NEXT: slli a0, a0, 280; RV64IF-NEXT: addi s0, a1, 76981; RV64IF-NEXT: srl a0, s0, a082; RV64IF-NEXT: andi a0, a0, 783; RV64IF-NEXT: beqz a0, .LBB1_284; RV64IF-NEXT: # %bb.1:85; RV64IF-NEXT: li a0, 086; RV64IF-NEXT: j .LBB1_387; RV64IF-NEXT: .LBB1_2: # %if.end88; RV64IF-NEXT: call fesetround89; RV64IF-NEXT: frrm a090; RV64IF-NEXT: slli a0, a0, 291; RV64IF-NEXT: srl a0, s0, a092; RV64IF-NEXT: andi a0, a0, 793; RV64IF-NEXT: addi a0, a0, -194; RV64IF-NEXT: seqz a0, a095; RV64IF-NEXT: .LBB1_3: # %return96; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload97; RV64IF-NEXT: ld s0, 0(sp) # 8-byte Folded Reload98; RV64IF-NEXT: .cfi_restore ra99; RV64IF-NEXT: .cfi_restore s0100; RV64IF-NEXT: addi sp, sp, 16101; RV64IF-NEXT: .cfi_def_cfa_offset 0102; RV64IF-NEXT: ret103entry:104 %call = tail call i32 @fesetround(i32 noundef 1) #0105 %0 = tail call i32 @llvm.get.rounding() #0106 %cmp.not = icmp eq i32 %0, 0107 br i1 %cmp.not, label %if.end, label %return108 109if.end:110 %call1 = tail call i32 @fesetround(i32 noundef 0) #0111 %1 = tail call i32 @llvm.get.rounding() #0112 %cmp2.not = icmp eq i32 %1, 1113 br label %return114 115return:116 %retval.0 = phi i1 [ false, %entry ], [ %cmp2.not, %if.end ]117 ret i1 %retval.0118}119 120define void @func_02(i32 %rm) {121; RV32IF-LABEL: func_02:122; RV32IF: # %bb.0:123; RV32IF-NEXT: slli a0, a0, 2124; RV32IF-NEXT: lui a1, 66125; RV32IF-NEXT: addi a1, a1, 769126; RV32IF-NEXT: srl a0, a1, a0127; RV32IF-NEXT: andi a0, a0, 7128; RV32IF-NEXT: fsrm a0129; RV32IF-NEXT: ret130;131; RV64IF-LABEL: func_02:132; RV64IF: # %bb.0:133; RV64IF-NEXT: slli a0, a0, 32134; RV64IF-NEXT: lui a1, 66135; RV64IF-NEXT: srli a0, a0, 30136; RV64IF-NEXT: addi a1, a1, 769137; RV64IF-NEXT: srl a0, a1, a0138; RV64IF-NEXT: andi a0, a0, 7139; RV64IF-NEXT: fsrm a0140; RV64IF-NEXT: ret141 call void @llvm.set.rounding(i32 %rm)142 ret void143}144 145define void @func_03() {146; RV32IF-LABEL: func_03:147; RV32IF: # %bb.0:148; RV32IF-NEXT: fsrmi 1149; RV32IF-NEXT: ret150;151; RV64IF-LABEL: func_03:152; RV64IF: # %bb.0:153; RV64IF-NEXT: fsrmi 1154; RV64IF-NEXT: ret155 call void @llvm.set.rounding(i32 0)156 ret void157}158 159define void @func_04() {160; RV32IF-LABEL: func_04:161; RV32IF: # %bb.0:162; RV32IF-NEXT: fsrmi 0163; RV32IF-NEXT: ret164;165; RV64IF-LABEL: func_04:166; RV64IF: # %bb.0:167; RV64IF-NEXT: fsrmi 0168; RV64IF-NEXT: ret169 call void @llvm.set.rounding(i32 1)170 ret void171}172 173define void @func_05() {174; RV32IF-LABEL: func_05:175; RV32IF: # %bb.0:176; RV32IF-NEXT: fsrmi 3177; RV32IF-NEXT: ret178;179; RV64IF-LABEL: func_05:180; RV64IF: # %bb.0:181; RV64IF-NEXT: fsrmi 3182; RV64IF-NEXT: ret183 call void @llvm.set.rounding(i32 2)184 ret void185}186 187define void @func_06() {188; RV32IF-LABEL: func_06:189; RV32IF: # %bb.0:190; RV32IF-NEXT: fsrmi 2191; RV32IF-NEXT: ret192;193; RV64IF-LABEL: func_06:194; RV64IF: # %bb.0:195; RV64IF-NEXT: fsrmi 2196; RV64IF-NEXT: ret197 call void @llvm.set.rounding(i32 3)198 ret void199}200 201define void @func_07() {202; RV32IF-LABEL: func_07:203; RV32IF: # %bb.0:204; RV32IF-NEXT: fsrmi 4205; RV32IF-NEXT: ret206;207; RV64IF-LABEL: func_07:208; RV64IF: # %bb.0:209; RV64IF-NEXT: fsrmi 4210; RV64IF-NEXT: ret211 call void @llvm.set.rounding(i32 4)212 ret void213}214 215attributes #0 = { strictfp }216 217declare i32 @fesetround(i32 noundef)218 219