1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32F 3; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32D 4; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64F 5; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64D 6 7declare float @llvm.sqrt.f32(float) 8declare double @llvm.sqrt.f64(double) 9 10define float @fsqrt_f32(float %a) nounwind { 11; LA32F-LABEL: fsqrt_f32: 12; LA32F: # %bb.0: 13; LA32F-NEXT: fsqrt.s $fa0, $fa0 14; LA32F-NEXT: ret 15; 16; LA32D-LABEL: fsqrt_f32: 17; LA32D: # %bb.0: 18; LA32D-NEXT: fsqrt.s $fa0, $fa0 19; LA32D-NEXT: ret 20; 21; LA64F-LABEL: fsqrt_f32: 22; LA64F: # %bb.0: 23; LA64F-NEXT: fsqrt.s $fa0, $fa0 24; LA64F-NEXT: ret 25; 26; LA64D-LABEL: fsqrt_f32: 27; LA64D: # %bb.0: 28; LA64D-NEXT: fsqrt.s $fa0, $fa0 29; LA64D-NEXT: ret 30 %1 = call float @llvm.sqrt.f32(float %a) 31 ret float %1 32} 33 34define double @fsqrt_f64(double %a) nounwind { 35; LA32F-LABEL: fsqrt_f64: 36; LA32F: # %bb.0: 37; LA32F-NEXT: addi.w $sp, $sp, -16 38; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 39; LA32F-NEXT: bl %plt(sqrt) 40; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 41; LA32F-NEXT: addi.w $sp, $sp, 16 42; LA32F-NEXT: ret 43; 44; LA32D-LABEL: fsqrt_f64: 45; LA32D: # %bb.0: 46; LA32D-NEXT: fsqrt.d $fa0, $fa0 47; LA32D-NEXT: ret 48; 49; LA64F-LABEL: fsqrt_f64: 50; LA64F: # %bb.0: 51; LA64F-NEXT: addi.d $sp, $sp, -16 52; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 53; LA64F-NEXT: bl %plt(sqrt) 54; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 55; LA64F-NEXT: addi.d $sp, $sp, 16 56; LA64F-NEXT: ret 57; 58; LA64D-LABEL: fsqrt_f64: 59; LA64D: # %bb.0: 60; LA64D-NEXT: fsqrt.d $fa0, $fa0 61; LA64D-NEXT: ret 62 %1 = call double @llvm.sqrt.f64(double %a) 63 ret double %1 64} 65 66define float @frsqrt_f32(float %a) nounwind { 67; LA32F-LABEL: frsqrt_f32: 68; LA32F: # %bb.0: 69; LA32F-NEXT: frsqrt.s $fa0, $fa0 70; LA32F-NEXT: ret 71; 72; LA32D-LABEL: frsqrt_f32: 73; LA32D: # %bb.0: 74; LA32D-NEXT: frsqrt.s $fa0, $fa0 75; LA32D-NEXT: ret 76; 77; LA64F-LABEL: frsqrt_f32: 78; LA64F: # %bb.0: 79; LA64F-NEXT: frsqrt.s $fa0, $fa0 80; LA64F-NEXT: ret 81; 82; LA64D-LABEL: frsqrt_f32: 83; LA64D: # %bb.0: 84; LA64D-NEXT: frsqrt.s $fa0, $fa0 85; LA64D-NEXT: ret 86 %1 = call float @llvm.sqrt.f32(float %a) 87 %2 = fdiv float 1.0, %1 88 ret float %2 89} 90 91define double @frsqrt_f64(double %a) nounwind { 92; LA32F-LABEL: frsqrt_f64: 93; LA32F: # %bb.0: 94; LA32F-NEXT: addi.w $sp, $sp, -16 95; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 96; LA32F-NEXT: bl %plt(sqrt) 97; LA32F-NEXT: move $a2, $a0 98; LA32F-NEXT: move $a3, $a1 99; LA32F-NEXT: lu12i.w $a1, 261888 100; LA32F-NEXT: move $a0, $zero 101; LA32F-NEXT: bl %plt(__divdf3) 102; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 103; LA32F-NEXT: addi.w $sp, $sp, 16 104; LA32F-NEXT: ret 105; 106; LA32D-LABEL: frsqrt_f64: 107; LA32D: # %bb.0: 108; LA32D-NEXT: frsqrt.d $fa0, $fa0 109; LA32D-NEXT: ret 110; 111; LA64F-LABEL: frsqrt_f64: 112; LA64F: # %bb.0: 113; LA64F-NEXT: addi.d $sp, $sp, -16 114; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 115; LA64F-NEXT: bl %plt(sqrt) 116; LA64F-NEXT: move $a1, $a0 117; LA64F-NEXT: lu52i.d $a0, $zero, 1023 118; LA64F-NEXT: bl %plt(__divdf3) 119; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 120; LA64F-NEXT: addi.d $sp, $sp, 16 121; LA64F-NEXT: ret 122; 123; LA64D-LABEL: frsqrt_f64: 124; LA64D: # %bb.0: 125; LA64D-NEXT: frsqrt.d $fa0, $fa0 126; LA64D-NEXT: ret 127 %1 = call double @llvm.sqrt.f64(double %a) 128 %2 = fdiv double 1.0, %1 129 ret double %2 130} 131