328 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=mips -mcpu=mips32 | FileCheck %s --check-prefix=MIPS32R13; RUN: llc < %s -mtriple=mips -mcpu=mips32r2 | FileCheck %s --check-prefix=MIPS32R24; RUN: llc < %s -mtriple=mips -mcpu=mips32r2 -mattr=+abs2008 | FileCheck %s --check-prefix=MIPS32R2-ABS2K85; RUN: llc < %s -mtriple=mips -mcpu=mips32r2 -mattr=+abs2008,+fp64 | FileCheck %s --check-prefix=MIPS32R2-ABS2K86; RUN: llc < %s -mtriple=mips -mcpu=mips32r2 -mattr=+fp64 | FileCheck %s --check-prefix=MIPS32R27; RUN: llc < %s -mtriple=mips -mcpu=mips32r6 | FileCheck %s --check-prefix=MIPS32R68; RUN: llc < %s -mtriple=mips64 -mcpu=mips64 | FileCheck %s --check-prefix=MIPS64R19; RUN: llc < %s -mtriple=mips64 -mcpu=mips64r2 | FileCheck %s --check-prefix=MIPS64R210; RUN: llc < %s -mtriple=mips64 -mcpu=mips64r2 -mattr=+abs2008 | FileCheck %s --check-prefix=MIPS64R2-ABS2K811; RUN: llc < %s -mtriple=mips64 -mcpu=mips64r6 | FileCheck %s --check-prefix=MIPS64R612; RUN: llc < %s -mtriple=mips64 -mcpu=mips64r6 -mattr=+abs2008 | FileCheck %s --check-prefix=MIPS64R6-ABS2K813; RUN: llc < %s -mtriple=mips -mcpu=mips32r2 -mattr=+micromips | FileCheck %s --check-prefix=MM14; RUN: llc < %s -mtriple=mips -mcpu=mips32r2 -mattr=+micromips,+abs2008 | FileCheck %s --check-prefix=MM-ABS2K815; RUN: llc < %s -mtriple=mips -mcpu=mips32r2 -mattr=+micromips,+abs2008,+fp64 | FileCheck %s --check-prefix=MM-ABS2K816; RUN: llc < %s -mtriple=mips -mcpu=mips32r2 -mattr=+micromips,+fp64 | FileCheck %s --check-prefix=MM17; RUN: llc < %s -mtriple=mips -mcpu=mips32r6 -mattr=+micromips | FileCheck %s --check-prefix=MMR618 19; Test that the instruction selection for the case of `abs.s` and `abs.d`20; matches the expected behaviour. In the default case with NaNs and no "abs2008"21; mode MIPS treats abs.s and abs.d as arithmetic fp instructions triggering22; a fp exception on execution if the input is a NaN. This results in no abs.[sd]23; instructions.24 25; In the case where no NaNs are present is asserted or in "abs2008" mode,26; abs.[sd] instructions are selected.27 28declare double @llvm.fabs.f64(double)29declare float @llvm.fabs.f32(float)30 31define dso_local double @foo(double %a) #0 {32; MIPS32R1-LABEL: foo:33; MIPS32R1: # %bb.0: # %entry34; MIPS32R1-NEXT: jr $ra35; MIPS32R1-NEXT: abs.d $f0, $f1236;37; MIPS32R2-LABEL: foo:38; MIPS32R2: # %bb.0: # %entry39; MIPS32R2-NEXT: jr $ra40; MIPS32R2-NEXT: abs.d $f0, $f1241;42; MIPS32R2-ABS2K8-LABEL: foo:43; MIPS32R2-ABS2K8: # %bb.0: # %entry44; MIPS32R2-ABS2K8-NEXT: jr $ra45; MIPS32R2-ABS2K8-NEXT: abs.d $f0, $f1246;47; MIPS32R6-LABEL: foo:48; MIPS32R6: # %bb.0: # %entry49; MIPS32R6-NEXT: jr $ra50; MIPS32R6-NEXT: abs.d $f0, $f1251;52; MIPS64R1-LABEL: foo:53; MIPS64R1: # %bb.0: # %entry54; MIPS64R1-NEXT: jr $ra55; MIPS64R1-NEXT: abs.d $f0, $f1256;57; MIPS64R2-LABEL: foo:58; MIPS64R2: # %bb.0: # %entry59; MIPS64R2-NEXT: jr $ra60; MIPS64R2-NEXT: abs.d $f0, $f1261;62; MIPS64R2-ABS2K8-LABEL: foo:63; MIPS64R2-ABS2K8: # %bb.0: # %entry64; MIPS64R2-ABS2K8-NEXT: jr $ra65; MIPS64R2-ABS2K8-NEXT: abs.d $f0, $f1266;67; MIPS64R6-LABEL: foo:68; MIPS64R6: # %bb.0: # %entry69; MIPS64R6-NEXT: jr $ra70; MIPS64R6-NEXT: abs.d $f0, $f1271;72; MIPS64R6-ABS2K8-LABEL: foo:73; MIPS64R6-ABS2K8: # %bb.0: # %entry74; MIPS64R6-ABS2K8-NEXT: jr $ra75; MIPS64R6-ABS2K8-NEXT: abs.d $f0, $f1276;77; MM-LABEL: foo:78; MM: # %bb.0: # %entry79; MM-NEXT: jr $ra80; MM-NEXT: abs.d $f0, $f1281;82; MM-ABS2K8-LABEL: foo:83; MM-ABS2K8: # %bb.0: # %entry84; MM-ABS2K8-NEXT: jr $ra85; MM-ABS2K8-NEXT: abs.d $f0, $f1286;87; MMR6-LABEL: foo:88; MMR6: # %bb.0: # %entry89; MMR6-NEXT: abs.d $f0, $f1290; MMR6-NEXT: jrc $ra91entry:92 %0 = tail call fast double @llvm.fabs.f64(double %a)93 ret double %094}95 96define dso_local double @bar(double %a) {97; MIPS32R1-LABEL: bar:98; MIPS32R1: # %bb.0: # %entry99; MIPS32R1-NEXT: lui $1, 32767100; MIPS32R1-NEXT: ori $1, $1, 65535101; MIPS32R1-NEXT: mfc1 $2, $f13102; MIPS32R1-NEXT: and $1, $2, $1103; MIPS32R1-NEXT: mfc1 $2, $f12104; MIPS32R1-NEXT: mtc1 $2, $f0105; MIPS32R1-NEXT: jr $ra106; MIPS32R1-NEXT: mtc1 $1, $f1107;108; MIPS32R2-LABEL: bar:109; MIPS32R2: # %bb.0: # %entry110; MIPS32R2-NEXT: mfc1 $1, $f12111; MIPS32R2-NEXT: mfhc1 $2, $f12112; MIPS32R2-NEXT: ins $2, $zero, 31, 1113; MIPS32R2-NEXT: mtc1 $1, $f0114; MIPS32R2-NEXT: mthc1 $2, $f0115; MIPS32R2-NEXT: jr $ra116; MIPS32R2-NEXT: nop117;118; MIPS32R2-ABS2K8-LABEL: bar:119; MIPS32R2-ABS2K8: # %bb.0: # %entry120; MIPS32R2-ABS2K8-NEXT: jr $ra121; MIPS32R2-ABS2K8-NEXT: abs.d $f0, $f12122;123; MIPS32R6-LABEL: bar:124; MIPS32R6: # %bb.0: # %entry125; MIPS32R6-NEXT: jr $ra126; MIPS32R6-NEXT: abs.d $f0, $f12127;128; MIPS64R1-LABEL: bar:129; MIPS64R1: # %bb.0: # %entry130; MIPS64R1-NEXT: dmfc1 $1, $f12131; MIPS64R1-NEXT: daddiu $2, $zero, 1132; MIPS64R1-NEXT: dsll $2, $2, 63133; MIPS64R1-NEXT: daddiu $2, $2, -1134; MIPS64R1-NEXT: and $1, $1, $2135; MIPS64R1-NEXT: jr $ra136; MIPS64R1-NEXT: dmtc1 $1, $f0137;138; MIPS64R2-LABEL: bar:139; MIPS64R2: # %bb.0: # %entry140; MIPS64R2-NEXT: dmfc1 $1, $f12141; MIPS64R2-NEXT: dinsu $1, $zero, 63, 1142; MIPS64R2-NEXT: jr $ra143; MIPS64R2-NEXT: dmtc1 $1, $f0144;145; MIPS64R2-ABS2K8-LABEL: bar:146; MIPS64R2-ABS2K8: # %bb.0: # %entry147; MIPS64R2-ABS2K8-NEXT: jr $ra148; MIPS64R2-ABS2K8-NEXT: abs.d $f0, $f12149;150; MIPS64R6-LABEL: bar:151; MIPS64R6: # %bb.0: # %entry152; MIPS64R6-NEXT: jr $ra153; MIPS64R6-NEXT: abs.d $f0, $f12154;155; MIPS64R6-ABS2K8-LABEL: bar:156; MIPS64R6-ABS2K8: # %bb.0: # %entry157; MIPS64R6-ABS2K8-NEXT: jr $ra158; MIPS64R6-ABS2K8-NEXT: abs.d $f0, $f12159;160; MM-LABEL: bar:161; MM: # %bb.0: # %entry162; MM-NEXT: mfc1 $1, $f12163; MM-NEXT: mfhc1 $2, $f12164; MM-NEXT: ins $2, $zero, 31, 1165; MM-NEXT: mtc1 $1, $f0166; MM-NEXT: mthc1 $2, $f0167; MM-NEXT: jrc $ra168;169; MM-ABS2K8-LABEL: bar:170; MM-ABS2K8: # %bb.0: # %entry171; MM-ABS2K8-NEXT: jr $ra172; MM-ABS2K8-NEXT: abs.d $f0, $f12173;174; MMR6-LABEL: bar:175; MMR6: # %bb.0: # %entry176; MMR6-NEXT: abs.d $f0, $f12177; MMR6-NEXT: jrc $ra178entry:179 %0 = tail call fast double @llvm.fabs.f64(double %a)180 ret double %0181}182 183define dso_local float @foo_2(float %a) #0 {184; MIPS32R1-LABEL: foo_2:185; MIPS32R1: # %bb.0: # %entry186; MIPS32R1-NEXT: jr $ra187; MIPS32R1-NEXT: abs.s $f0, $f12188;189; MIPS32R2-LABEL: foo_2:190; MIPS32R2: # %bb.0: # %entry191; MIPS32R2-NEXT: jr $ra192; MIPS32R2-NEXT: abs.s $f0, $f12193;194; MIPS32R2-ABS2K8-LABEL: foo_2:195; MIPS32R2-ABS2K8: # %bb.0: # %entry196; MIPS32R2-ABS2K8-NEXT: jr $ra197; MIPS32R2-ABS2K8-NEXT: abs.s $f0, $f12198;199; MIPS32R6-LABEL: foo_2:200; MIPS32R6: # %bb.0: # %entry201; MIPS32R6-NEXT: jr $ra202; MIPS32R6-NEXT: abs.s $f0, $f12203;204; MIPS64R1-LABEL: foo_2:205; MIPS64R1: # %bb.0: # %entry206; MIPS64R1-NEXT: jr $ra207; MIPS64R1-NEXT: abs.s $f0, $f12208;209; MIPS64R2-LABEL: foo_2:210; MIPS64R2: # %bb.0: # %entry211; MIPS64R2-NEXT: jr $ra212; MIPS64R2-NEXT: abs.s $f0, $f12213;214; MIPS64R2-ABS2K8-LABEL: foo_2:215; MIPS64R2-ABS2K8: # %bb.0: # %entry216; MIPS64R2-ABS2K8-NEXT: jr $ra217; MIPS64R2-ABS2K8-NEXT: abs.s $f0, $f12218;219; MIPS64R6-LABEL: foo_2:220; MIPS64R6: # %bb.0: # %entry221; MIPS64R6-NEXT: jr $ra222; MIPS64R6-NEXT: abs.s $f0, $f12223;224; MIPS64R6-ABS2K8-LABEL: foo_2:225; MIPS64R6-ABS2K8: # %bb.0: # %entry226; MIPS64R6-ABS2K8-NEXT: jr $ra227; MIPS64R6-ABS2K8-NEXT: abs.s $f0, $f12228;229; MM-LABEL: foo_2:230; MM: # %bb.0: # %entry231; MM-NEXT: jr $ra232; MM-NEXT: abs.s $f0, $f12233;234; MM-ABS2K8-LABEL: foo_2:235; MM-ABS2K8: # %bb.0: # %entry236; MM-ABS2K8-NEXT: jr $ra237; MM-ABS2K8-NEXT: abs.s $f0, $f12238;239; MMR6-LABEL: foo_2:240; MMR6: # %bb.0: # %entry241; MMR6-NEXT: abs.s $f0, $f12242; MMR6-NEXT: jrc $ra243entry:244 %0 = tail call fast float @llvm.fabs.f32(float %a)245 ret float %0246}247 248define dso_local float @bar_2(float %a) {249; MIPS32R1-LABEL: bar_2:250; MIPS32R1: # %bb.0: # %entry251; MIPS32R1-NEXT: lui $1, 32767252; MIPS32R1-NEXT: ori $1, $1, 65535253; MIPS32R1-NEXT: mfc1 $2, $f12254; MIPS32R1-NEXT: and $1, $2, $1255; MIPS32R1-NEXT: jr $ra256; MIPS32R1-NEXT: mtc1 $1, $f0257;258; MIPS32R2-LABEL: bar_2:259; MIPS32R2: # %bb.0: # %entry260; MIPS32R2-NEXT: mfc1 $1, $f12261; MIPS32R2-NEXT: ins $1, $zero, 31, 1262; MIPS32R2-NEXT: jr $ra263; MIPS32R2-NEXT: mtc1 $1, $f0264;265; MIPS32R2-ABS2K8-LABEL: bar_2:266; MIPS32R2-ABS2K8: # %bb.0: # %entry267; MIPS32R2-ABS2K8-NEXT: jr $ra268; MIPS32R2-ABS2K8-NEXT: abs.s $f0, $f12269;270; MIPS32R6-LABEL: bar_2:271; MIPS32R6: # %bb.0: # %entry272; MIPS32R6-NEXT: jr $ra273; MIPS32R6-NEXT: abs.s $f0, $f12274;275; MIPS64R1-LABEL: bar_2:276; MIPS64R1: # %bb.0: # %entry277; MIPS64R1-NEXT: lui $1, 32767278; MIPS64R1-NEXT: ori $1, $1, 65535279; MIPS64R1-NEXT: mfc1 $2, $f12280; MIPS64R1-NEXT: and $1, $2, $1281; MIPS64R1-NEXT: jr $ra282; MIPS64R1-NEXT: mtc1 $1, $f0283;284; MIPS64R2-LABEL: bar_2:285; MIPS64R2: # %bb.0: # %entry286; MIPS64R2-NEXT: mfc1 $1, $f12287; MIPS64R2-NEXT: ins $1, $zero, 31, 1288; MIPS64R2-NEXT: jr $ra289; MIPS64R2-NEXT: mtc1 $1, $f0290;291; MIPS64R2-ABS2K8-LABEL: bar_2:292; MIPS64R2-ABS2K8: # %bb.0: # %entry293; MIPS64R2-ABS2K8-NEXT: jr $ra294; MIPS64R2-ABS2K8-NEXT: abs.s $f0, $f12295;296; MIPS64R6-LABEL: bar_2:297; MIPS64R6: # %bb.0: # %entry298; MIPS64R6-NEXT: jr $ra299; MIPS64R6-NEXT: abs.s $f0, $f12300;301; MIPS64R6-ABS2K8-LABEL: bar_2:302; MIPS64R6-ABS2K8: # %bb.0: # %entry303; MIPS64R6-ABS2K8-NEXT: jr $ra304; MIPS64R6-ABS2K8-NEXT: abs.s $f0, $f12305;306; MM-LABEL: bar_2:307; MM: # %bb.0: # %entry308; MM-NEXT: mfc1 $1, $f12309; MM-NEXT: ins $1, $zero, 31, 1310; MM-NEXT: jr $ra311; MM-NEXT: mtc1 $1, $f0312;313; MM-ABS2K8-LABEL: bar_2:314; MM-ABS2K8: # %bb.0: # %entry315; MM-ABS2K8-NEXT: jr $ra316; MM-ABS2K8-NEXT: abs.s $f0, $f12317;318; MMR6-LABEL: bar_2:319; MMR6: # %bb.0: # %entry320; MMR6-NEXT: abs.s $f0, $f12321; MMR6-NEXT: jrc $ra322entry:323 %0 = tail call fast float @llvm.fabs.f32(float %a)324 ret float %0325}326 327attributes #0 = { nounwind "no-nans-fp-math"="true" }328