310 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA644 5define float @convert_double_to_float(double %a) nounwind {6; LA32-LABEL: convert_double_to_float:7; LA32: # %bb.0:8; LA32-NEXT: fcvt.s.d $fa0, $fa09; LA32-NEXT: ret10;11; LA64-LABEL: convert_double_to_float:12; LA64: # %bb.0:13; LA64-NEXT: fcvt.s.d $fa0, $fa014; LA64-NEXT: ret15 %1 = fptrunc double %a to float16 ret float %117}18 19define double @convert_float_to_double(float %a) nounwind {20; LA32-LABEL: convert_float_to_double:21; LA32: # %bb.0:22; LA32-NEXT: fcvt.d.s $fa0, $fa023; LA32-NEXT: ret24;25; LA64-LABEL: convert_float_to_double:26; LA64: # %bb.0:27; LA64-NEXT: fcvt.d.s $fa0, $fa028; LA64-NEXT: ret29 %1 = fpext float %a to double30 ret double %131}32 33define double @convert_i8_to_double(i8 signext %a) nounwind {34; LA32-LABEL: convert_i8_to_double:35; LA32: # %bb.0:36; LA32-NEXT: movgr2fr.w $fa0, $a037; LA32-NEXT: ffint.d.w $fa0, $fa038; LA32-NEXT: ret39;40; LA64-LABEL: convert_i8_to_double:41; LA64: # %bb.0:42; LA64-NEXT: movgr2fr.w $fa0, $a043; LA64-NEXT: ffint.d.w $fa0, $fa044; LA64-NEXT: ret45 %1 = sitofp i8 %a to double46 ret double %147}48 49define double @convert_i16_to_double(i16 signext %a) nounwind {50; LA32-LABEL: convert_i16_to_double:51; LA32: # %bb.0:52; LA32-NEXT: movgr2fr.w $fa0, $a053; LA32-NEXT: ffint.d.w $fa0, $fa054; LA32-NEXT: ret55;56; LA64-LABEL: convert_i16_to_double:57; LA64: # %bb.0:58; LA64-NEXT: movgr2fr.w $fa0, $a059; LA64-NEXT: ffint.d.w $fa0, $fa060; LA64-NEXT: ret61 %1 = sitofp i16 %a to double62 ret double %163}64 65define double @convert_i32_to_double(i32 %a) nounwind {66; LA32-LABEL: convert_i32_to_double:67; LA32: # %bb.0:68; LA32-NEXT: movgr2fr.w $fa0, $a069; LA32-NEXT: ffint.d.w $fa0, $fa070; LA32-NEXT: ret71;72; LA64-LABEL: convert_i32_to_double:73; LA64: # %bb.0:74; LA64-NEXT: movgr2fr.w $fa0, $a075; LA64-NEXT: ffint.d.w $fa0, $fa076; LA64-NEXT: ret77 %1 = sitofp i32 %a to double78 ret double %179}80 81define double @convert_i64_to_double(i64 %a) nounwind {82; LA32-LABEL: convert_i64_to_double:83; LA32: # %bb.0:84; LA32-NEXT: addi.w $sp, $sp, -1685; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill86; LA32-NEXT: bl __floatdidf87; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload88; LA32-NEXT: addi.w $sp, $sp, 1689; LA32-NEXT: ret90;91; LA64-LABEL: convert_i64_to_double:92; LA64: # %bb.0:93; LA64-NEXT: movgr2fr.d $fa0, $a094; LA64-NEXT: ffint.d.l $fa0, $fa095; LA64-NEXT: ret96 %1 = sitofp i64 %a to double97 ret double %198}99 100define i32 @convert_double_to_i32(double %a) nounwind {101; LA32-LABEL: convert_double_to_i32:102; LA32: # %bb.0:103; LA32-NEXT: ftintrz.w.d $fa0, $fa0104; LA32-NEXT: movfr2gr.s $a0, $fa0105; LA32-NEXT: ret106;107; LA64-LABEL: convert_double_to_i32:108; LA64: # %bb.0:109; LA64-NEXT: ftintrz.w.d $fa0, $fa0110; LA64-NEXT: movfr2gr.s $a0, $fa0111; LA64-NEXT: ret112 %1 = fptosi double %a to i32113 ret i32 %1114}115 116define i32 @convert_double_to_u32(double %a) nounwind {117; LA32-LABEL: convert_double_to_u32:118; LA32: # %bb.0:119; LA32-NEXT: movgr2fr.w $fa1, $zero120; LA32-NEXT: lu12i.w $a0, 269824121; LA32-NEXT: movgr2frh.w $fa1, $a0122; LA32-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1123; LA32-NEXT: movcf2gr $a0, $fcc0124; LA32-NEXT: bne $a0, $zero, .LBB7_2125; LA32-NEXT: # %bb.1:126; LA32-NEXT: fsub.d $fa0, $fa0, $fa1127; LA32-NEXT: ftintrz.w.d $fa0, $fa0128; LA32-NEXT: movfr2gr.s $a0, $fa0129; LA32-NEXT: lu12i.w $a1, -524288130; LA32-NEXT: xor $a0, $a0, $a1131; LA32-NEXT: ret132; LA32-NEXT: .LBB7_2:133; LA32-NEXT: ftintrz.w.d $fa0, $fa0134; LA32-NEXT: movfr2gr.s $a0, $fa0135; LA32-NEXT: ret136;137; LA64-LABEL: convert_double_to_u32:138; LA64: # %bb.0:139; LA64-NEXT: ftintrz.l.d $fa0, $fa0140; LA64-NEXT: movfr2gr.d $a0, $fa0141; LA64-NEXT: ret142 %1 = fptoui double %a to i32143 ret i32 %1144}145 146define i64 @convert_double_to_i64(double %a) nounwind {147; LA32-LABEL: convert_double_to_i64:148; LA32: # %bb.0:149; LA32-NEXT: addi.w $sp, $sp, -16150; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill151; LA32-NEXT: bl __fixdfdi152; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload153; LA32-NEXT: addi.w $sp, $sp, 16154; LA32-NEXT: ret155;156; LA64-LABEL: convert_double_to_i64:157; LA64: # %bb.0:158; LA64-NEXT: ftintrz.l.d $fa0, $fa0159; LA64-NEXT: movfr2gr.d $a0, $fa0160; LA64-NEXT: ret161 %1 = fptosi double %a to i64162 ret i64 %1163}164 165define i64 @convert_double_to_u64(double %a) nounwind {166; LA32-LABEL: convert_double_to_u64:167; LA32: # %bb.0:168; LA32-NEXT: addi.w $sp, $sp, -16169; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill170; LA32-NEXT: bl __fixunsdfdi171; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload172; LA32-NEXT: addi.w $sp, $sp, 16173; LA32-NEXT: ret174;175; LA64-LABEL: convert_double_to_u64:176; LA64: # %bb.0:177; LA64-NEXT: lu52i.d $a0, $zero, 1086178; LA64-NEXT: movgr2fr.d $fa1, $a0179; LA64-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1180; LA64-NEXT: fsub.d $fa1, $fa0, $fa1181; LA64-NEXT: ftintrz.l.d $fa1, $fa1182; LA64-NEXT: movfr2gr.d $a0, $fa1183; LA64-NEXT: lu52i.d $a1, $zero, -2048184; LA64-NEXT: xor $a0, $a0, $a1185; LA64-NEXT: movcf2gr $a1, $fcc0186; LA64-NEXT: masknez $a0, $a0, $a1187; LA64-NEXT: ftintrz.l.d $fa0, $fa0188; LA64-NEXT: movfr2gr.d $a2, $fa0189; LA64-NEXT: maskeqz $a1, $a2, $a1190; LA64-NEXT: or $a0, $a1, $a0191; LA64-NEXT: ret192 %1 = fptoui double %a to i64193 ret i64 %1194}195 196define double @convert_u8_to_double(i8 zeroext %a) nounwind {197; LA32-LABEL: convert_u8_to_double:198; LA32: # %bb.0:199; LA32-NEXT: movgr2fr.w $fa0, $a0200; LA32-NEXT: ffint.d.w $fa0, $fa0201; LA32-NEXT: ret202;203; LA64-LABEL: convert_u8_to_double:204; LA64: # %bb.0:205; LA64-NEXT: movgr2fr.w $fa0, $a0206; LA64-NEXT: ffint.d.w $fa0, $fa0207; LA64-NEXT: ret208 %1 = uitofp i8 %a to double209 ret double %1210}211 212define double @convert_u16_to_double(i16 zeroext %a) nounwind {213; LA32-LABEL: convert_u16_to_double:214; LA32: # %bb.0:215; LA32-NEXT: movgr2fr.w $fa0, $a0216; LA32-NEXT: ffint.d.w $fa0, $fa0217; LA32-NEXT: ret218;219; LA64-LABEL: convert_u16_to_double:220; LA64: # %bb.0:221; LA64-NEXT: movgr2fr.w $fa0, $a0222; LA64-NEXT: ffint.d.w $fa0, $fa0223; LA64-NEXT: ret224 %1 = uitofp i16 %a to double225 ret double %1226}227 228define double @convert_u32_to_double(i32 %a) nounwind {229; LA32-LABEL: convert_u32_to_double:230; LA32: # %bb.0:231; LA32-NEXT: addi.w $sp, $sp, -16232; LA32-NEXT: lu12i.w $a1, 275200233; LA32-NEXT: st.w $a1, $sp, 12234; LA32-NEXT: st.w $a0, $sp, 8235; LA32-NEXT: fld.d $fa0, $sp, 8236; LA32-NEXT: movgr2fr.w $fa1, $zero237; LA32-NEXT: movgr2frh.w $fa1, $a1238; LA32-NEXT: fsub.d $fa0, $fa0, $fa1239; LA32-NEXT: addi.w $sp, $sp, 16240; LA32-NEXT: ret241;242; LA64-LABEL: convert_u32_to_double:243; LA64: # %bb.0:244; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0245; LA64-NEXT: movgr2fr.d $fa0, $a0246; LA64-NEXT: ffint.d.l $fa0, $fa0247; LA64-NEXT: ret248 %1 = uitofp i32 %a to double249 ret double %1250}251 252define double @convert_u64_to_double(i64 %a) nounwind {253; LA32-LABEL: convert_u64_to_double:254; LA32: # %bb.0:255; LA32-NEXT: addi.w $sp, $sp, -16256; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill257; LA32-NEXT: bl __floatundidf258; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload259; LA32-NEXT: addi.w $sp, $sp, 16260; LA32-NEXT: ret261;262; LA64-LABEL: convert_u64_to_double:263; LA64: # %bb.0:264; LA64-NEXT: srli.d $a1, $a0, 32265; LA64-NEXT: lu52i.d $a2, $zero, 1107266; LA64-NEXT: or $a1, $a1, $a2267; LA64-NEXT: movgr2fr.d $fa0, $a1268; LA64-NEXT: lu12i.w $a1, 256269; LA64-NEXT: lu52i.d $a1, $a1, 1107270; LA64-NEXT: movgr2fr.d $fa1, $a1271; LA64-NEXT: fsub.d $fa0, $fa0, $fa1272; LA64-NEXT: lu12i.w $a1, 275200273; LA64-NEXT: bstrins.d $a0, $a1, 63, 32274; LA64-NEXT: movgr2fr.d $fa1, $a0275; LA64-NEXT: fadd.d $fa0, $fa1, $fa0276; LA64-NEXT: ret277 %1 = uitofp i64 %a to double278 ret double %1279}280 281define double @bitcast_i64_to_double(i64 %a, i64 %b) nounwind {282; LA32-LABEL: bitcast_i64_to_double:283; LA32: # %bb.0:284; LA32-NEXT: movgr2fr.w $fa0, $a0285; LA32-NEXT: movgr2frh.w $fa0, $a1286; LA32-NEXT: ret287;288; LA64-LABEL: bitcast_i64_to_double:289; LA64: # %bb.0:290; LA64-NEXT: movgr2fr.d $fa0, $a0291; LA64-NEXT: ret292 %1 = bitcast i64 %a to double293 ret double %1294}295 296define i64 @bitcast_double_to_i64(double %a) nounwind {297; LA32-LABEL: bitcast_double_to_i64:298; LA32: # %bb.0:299; LA32-NEXT: movfr2gr.s $a0, $fa0300; LA32-NEXT: movfrh2gr.s $a1, $fa0301; LA32-NEXT: ret302;303; LA64-LABEL: bitcast_double_to_i64:304; LA64: # %bb.0:305; LA64-NEXT: movfr2gr.d $a0, $fa0306; LA64-NEXT: ret307 %1 = bitcast double %a to i64308 ret i64 %1309}310