1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -O0 -mtriple=mipsel-linux-gnu -global-isel -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32,FP32 3; RUN: llc -O0 -mtriple=mipsel-linux-gnu -mattr=+fp64,+mips32r2 -global-isel -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32,FP64 4 5define i64 @f32toi64(float %a) { 6; MIPS32-LABEL: f32toi64: 7; MIPS32: # %bb.0: # %entry 8; MIPS32-NEXT: addiu $sp, $sp, -24 9; MIPS32-NEXT: .cfi_def_cfa_offset 24 10; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 11; MIPS32-NEXT: .cfi_offset 31, -4 12; MIPS32-NEXT: jal __fixsfdi 13; MIPS32-NEXT: nop 14; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 15; MIPS32-NEXT: addiu $sp, $sp, 24 16; MIPS32-NEXT: jr $ra 17; MIPS32-NEXT: nop 18entry: 19 %conv = fptosi float %a to i64 20 ret i64 %conv 21} 22 23define i32 @f32toi32(float %a) { 24; MIPS32-LABEL: f32toi32: 25; MIPS32: # %bb.0: # %entry 26; MIPS32-NEXT: trunc.w.s $f0, $f12 27; MIPS32-NEXT: mfc1 $2, $f0 28; MIPS32-NEXT: jr $ra 29; MIPS32-NEXT: nop 30entry: 31 %conv = fptosi float %a to i32 32 ret i32 %conv 33} 34 35define signext i16 @f32toi16(float %a) { 36; MIPS32-LABEL: f32toi16: 37; MIPS32: # %bb.0: # %entry 38; MIPS32-NEXT: trunc.w.s $f0, $f12 39; MIPS32-NEXT: mfc1 $1, $f0 40; MIPS32-NEXT: sll $1, $1, 16 41; MIPS32-NEXT: sra $2, $1, 16 42; MIPS32-NEXT: jr $ra 43; MIPS32-NEXT: nop 44entry: 45 %conv = fptosi float %a to i16 46 ret i16 %conv 47} 48 49define signext i8 @f32toi8(float %a) { 50; MIPS32-LABEL: f32toi8: 51; MIPS32: # %bb.0: # %entry 52; MIPS32-NEXT: trunc.w.s $f0, $f12 53; MIPS32-NEXT: mfc1 $1, $f0 54; MIPS32-NEXT: sll $1, $1, 24 55; MIPS32-NEXT: sra $2, $1, 24 56; MIPS32-NEXT: jr $ra 57; MIPS32-NEXT: nop 58entry: 59 %conv = fptosi float %a to i8 60 ret i8 %conv 61} 62 63define i64 @f64toi64(double %a) { 64; MIPS32-LABEL: f64toi64: 65; MIPS32: # %bb.0: # %entry 66; MIPS32-NEXT: addiu $sp, $sp, -24 67; MIPS32-NEXT: .cfi_def_cfa_offset 24 68; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 69; MIPS32-NEXT: .cfi_offset 31, -4 70; MIPS32-NEXT: jal __fixdfdi 71; MIPS32-NEXT: nop 72; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 73; MIPS32-NEXT: addiu $sp, $sp, 24 74; MIPS32-NEXT: jr $ra 75; MIPS32-NEXT: nop 76entry: 77 %conv = fptosi double %a to i64 78 ret i64 %conv 79} 80 81define i32 @f64toi32(double %a) { 82; MIPS32-LABEL: f64toi32: 83; MIPS32: # %bb.0: # %entry 84; MIPS32-NEXT: trunc.w.d $f0, $f12 85; MIPS32-NEXT: mfc1 $2, $f0 86; MIPS32-NEXT: jr $ra 87; MIPS32-NEXT: nop 88entry: 89 %conv = fptosi double %a to i32 90 ret i32 %conv 91} 92 93define signext i16 @f64toi16(double %a) { 94; MIPS32-LABEL: f64toi16: 95; MIPS32: # %bb.0: # %entry 96; MIPS32-NEXT: trunc.w.d $f0, $f12 97; MIPS32-NEXT: mfc1 $1, $f0 98; MIPS32-NEXT: sll $1, $1, 16 99; MIPS32-NEXT: sra $2, $1, 16 100; MIPS32-NEXT: jr $ra 101; MIPS32-NEXT: nop 102entry: 103 %conv = fptosi double %a to i16 104 ret i16 %conv 105} 106 107define signext i8 @f64toi8(double %a) { 108; MIPS32-LABEL: f64toi8: 109; MIPS32: # %bb.0: # %entry 110; MIPS32-NEXT: trunc.w.d $f0, $f12 111; MIPS32-NEXT: mfc1 $1, $f0 112; MIPS32-NEXT: sll $1, $1, 24 113; MIPS32-NEXT: sra $2, $1, 24 114; MIPS32-NEXT: jr $ra 115; MIPS32-NEXT: nop 116entry: 117 %conv = fptosi double %a to i8 118 ret i8 %conv 119} 120 121define i64 @f32tou64(float %a) { 122; MIPS32-LABEL: f32tou64: 123; MIPS32: # %bb.0: # %entry 124; MIPS32-NEXT: addiu $sp, $sp, -24 125; MIPS32-NEXT: .cfi_def_cfa_offset 24 126; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 127; MIPS32-NEXT: .cfi_offset 31, -4 128; MIPS32-NEXT: jal __fixunssfdi 129; MIPS32-NEXT: nop 130; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 131; MIPS32-NEXT: addiu $sp, $sp, 24 132; MIPS32-NEXT: jr $ra 133; MIPS32-NEXT: nop 134entry: 135 %conv = fptoui float %a to i64 136 ret i64 %conv 137} 138 139define i32 @f32tou32(float %a) { 140; MIPS32-LABEL: f32tou32: 141; MIPS32: # %bb.0: # %entry 142; MIPS32-NEXT: trunc.w.s $f0, $f12 143; MIPS32-NEXT: mfc1 $1, $f0 144; MIPS32-NEXT: lui $2, 20224 145; MIPS32-NEXT: mtc1 $2, $f0 146; MIPS32-NEXT: sub.s $f1, $f12, $f0 147; MIPS32-NEXT: trunc.w.s $f1, $f1 148; MIPS32-NEXT: mfc1 $2, $f1 149; MIPS32-NEXT: lui $3, 32768 150; MIPS32-NEXT: xor $2, $2, $3 151; MIPS32-NEXT: addiu $3, $zero, 1 152; MIPS32-NEXT: c.ult.s $f12, $f0 153; MIPS32-NEXT: movf $3, $zero, $fcc0 154; MIPS32-NEXT: movn $2, $1, $3 155; MIPS32-NEXT: jr $ra 156; MIPS32-NEXT: nop 157entry: 158 %conv = fptoui float %a to i32 159 ret i32 %conv 160} 161 162define zeroext i16 @f32tou16(float %a) { 163; MIPS32-LABEL: f32tou16: 164; MIPS32: # %bb.0: # %entry 165; MIPS32-NEXT: trunc.w.s $f0, $f12 166; MIPS32-NEXT: mfc1 $2, $f0 167; MIPS32-NEXT: lui $1, 20224 168; MIPS32-NEXT: mtc1 $1, $f0 169; MIPS32-NEXT: sub.s $f1, $f12, $f0 170; MIPS32-NEXT: trunc.w.s $f1, $f1 171; MIPS32-NEXT: mfc1 $1, $f1 172; MIPS32-NEXT: lui $3, 32768 173; MIPS32-NEXT: xor $1, $1, $3 174; MIPS32-NEXT: addiu $3, $zero, 1 175; MIPS32-NEXT: c.ult.s $f12, $f0 176; MIPS32-NEXT: movf $3, $zero, $fcc0 177; MIPS32-NEXT: movn $1, $2, $3 178; MIPS32-NEXT: andi $2, $1, 65535 179; MIPS32-NEXT: jr $ra 180; MIPS32-NEXT: nop 181entry: 182 %conv = fptoui float %a to i16 183 ret i16 %conv 184} 185 186define zeroext i8 @f32tou8(float %a) { 187; MIPS32-LABEL: f32tou8: 188; MIPS32: # %bb.0: # %entry 189; MIPS32-NEXT: trunc.w.s $f0, $f12 190; MIPS32-NEXT: mfc1 $2, $f0 191; MIPS32-NEXT: lui $1, 20224 192; MIPS32-NEXT: mtc1 $1, $f0 193; MIPS32-NEXT: sub.s $f1, $f12, $f0 194; MIPS32-NEXT: trunc.w.s $f1, $f1 195; MIPS32-NEXT: mfc1 $1, $f1 196; MIPS32-NEXT: lui $3, 32768 197; MIPS32-NEXT: xor $1, $1, $3 198; MIPS32-NEXT: addiu $3, $zero, 1 199; MIPS32-NEXT: c.ult.s $f12, $f0 200; MIPS32-NEXT: movf $3, $zero, $fcc0 201; MIPS32-NEXT: movn $1, $2, $3 202; MIPS32-NEXT: andi $2, $1, 255 203; MIPS32-NEXT: jr $ra 204; MIPS32-NEXT: nop 205entry: 206 %conv = fptoui float %a to i8 207 ret i8 %conv 208} 209 210define i64 @f64tou64(double %a) { 211; MIPS32-LABEL: f64tou64: 212; MIPS32: # %bb.0: # %entry 213; MIPS32-NEXT: addiu $sp, $sp, -24 214; MIPS32-NEXT: .cfi_def_cfa_offset 24 215; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 216; MIPS32-NEXT: .cfi_offset 31, -4 217; MIPS32-NEXT: jal __fixunsdfdi 218; MIPS32-NEXT: nop 219; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 220; MIPS32-NEXT: addiu $sp, $sp, 24 221; MIPS32-NEXT: jr $ra 222; MIPS32-NEXT: nop 223entry: 224 %conv = fptoui double %a to i64 225 ret i64 %conv 226} 227 228define i32 @f64tou32(double %a) { 229; FP32-LABEL: f64tou32: 230; FP32: # %bb.0: # %entry 231; FP32-NEXT: trunc.w.d $f0, $f12 232; FP32-NEXT: mfc1 $1, $f0 233; FP32-NEXT: lui $3, 16864 234; FP32-NEXT: ori $2, $zero, 0 235; FP32-NEXT: mtc1 $2, $f0 236; FP32-NEXT: mtc1 $3, $f1 237; FP32-NEXT: sub.d $f2, $f12, $f0 238; FP32-NEXT: trunc.w.d $f2, $f2 239; FP32-NEXT: mfc1 $2, $f2 240; FP32-NEXT: lui $3, 32768 241; FP32-NEXT: xor $2, $2, $3 242; FP32-NEXT: addiu $3, $zero, 1 243; FP32-NEXT: c.ult.d $f12, $f0 244; FP32-NEXT: movf $3, $zero, $fcc0 245; FP32-NEXT: movn $2, $1, $3 246; FP32-NEXT: jr $ra 247; FP32-NEXT: nop 248; 249; FP64-LABEL: f64tou32: 250; FP64: # %bb.0: # %entry 251; FP64-NEXT: trunc.w.d $f0, $f12 252; FP64-NEXT: mfc1 $1, $f0 253; FP64-NEXT: lui $3, 16864 254; FP64-NEXT: ori $2, $zero, 0 255; FP64-NEXT: mtc1 $2, $f0 256; FP64-NEXT: mthc1 $3, $f0 257; FP64-NEXT: sub.d $f1, $f12, $f0 258; FP64-NEXT: trunc.w.d $f1, $f1 259; FP64-NEXT: mfc1 $2, $f1 260; FP64-NEXT: lui $3, 32768 261; FP64-NEXT: xor $2, $2, $3 262; FP64-NEXT: addiu $3, $zero, 1 263; FP64-NEXT: c.ult.d $f12, $f0 264; FP64-NEXT: movf $3, $zero, $fcc0 265; FP64-NEXT: movn $2, $1, $3 266; FP64-NEXT: jr $ra 267; FP64-NEXT: nop 268entry: 269 %conv = fptoui double %a to i32 270 ret i32 %conv 271} 272 273define zeroext i16 @f64tou16(double %a) { 274; FP32-LABEL: f64tou16: 275; FP32: # %bb.0: # %entry 276; FP32-NEXT: trunc.w.d $f0, $f12 277; FP32-NEXT: mfc1 $2, $f0 278; FP32-NEXT: lui $3, 16864 279; FP32-NEXT: ori $1, $zero, 0 280; FP32-NEXT: mtc1 $1, $f0 281; FP32-NEXT: mtc1 $3, $f1 282; FP32-NEXT: sub.d $f2, $f12, $f0 283; FP32-NEXT: trunc.w.d $f2, $f2 284; FP32-NEXT: mfc1 $1, $f2 285; FP32-NEXT: lui $3, 32768 286; FP32-NEXT: xor $1, $1, $3 287; FP32-NEXT: addiu $3, $zero, 1 288; FP32-NEXT: c.ult.d $f12, $f0 289; FP32-NEXT: movf $3, $zero, $fcc0 290; FP32-NEXT: movn $1, $2, $3 291; FP32-NEXT: andi $2, $1, 65535 292; FP32-NEXT: jr $ra 293; FP32-NEXT: nop 294; 295; FP64-LABEL: f64tou16: 296; FP64: # %bb.0: # %entry 297; FP64-NEXT: trunc.w.d $f0, $f12 298; FP64-NEXT: mfc1 $2, $f0 299; FP64-NEXT: lui $3, 16864 300; FP64-NEXT: ori $1, $zero, 0 301; FP64-NEXT: mtc1 $1, $f0 302; FP64-NEXT: mthc1 $3, $f0 303; FP64-NEXT: sub.d $f1, $f12, $f0 304; FP64-NEXT: trunc.w.d $f1, $f1 305; FP64-NEXT: mfc1 $1, $f1 306; FP64-NEXT: lui $3, 32768 307; FP64-NEXT: xor $1, $1, $3 308; FP64-NEXT: addiu $3, $zero, 1 309; FP64-NEXT: c.ult.d $f12, $f0 310; FP64-NEXT: movf $3, $zero, $fcc0 311; FP64-NEXT: movn $1, $2, $3 312; FP64-NEXT: andi $2, $1, 65535 313; FP64-NEXT: jr $ra 314; FP64-NEXT: nop 315entry: 316 %conv = fptoui double %a to i16 317 ret i16 %conv 318} 319 320define zeroext i8 @f64tou8(double %a) { 321; FP32-LABEL: f64tou8: 322; FP32: # %bb.0: # %entry 323; FP32-NEXT: trunc.w.d $f0, $f12 324; FP32-NEXT: mfc1 $2, $f0 325; FP32-NEXT: lui $3, 16864 326; FP32-NEXT: ori $1, $zero, 0 327; FP32-NEXT: mtc1 $1, $f0 328; FP32-NEXT: mtc1 $3, $f1 329; FP32-NEXT: sub.d $f2, $f12, $f0 330; FP32-NEXT: trunc.w.d $f2, $f2 331; FP32-NEXT: mfc1 $1, $f2 332; FP32-NEXT: lui $3, 32768 333; FP32-NEXT: xor $1, $1, $3 334; FP32-NEXT: addiu $3, $zero, 1 335; FP32-NEXT: c.ult.d $f12, $f0 336; FP32-NEXT: movf $3, $zero, $fcc0 337; FP32-NEXT: movn $1, $2, $3 338; FP32-NEXT: andi $2, $1, 255 339; FP32-NEXT: jr $ra 340; FP32-NEXT: nop 341; 342; FP64-LABEL: f64tou8: 343; FP64: # %bb.0: # %entry 344; FP64-NEXT: trunc.w.d $f0, $f12 345; FP64-NEXT: mfc1 $2, $f0 346; FP64-NEXT: lui $3, 16864 347; FP64-NEXT: ori $1, $zero, 0 348; FP64-NEXT: mtc1 $1, $f0 349; FP64-NEXT: mthc1 $3, $f0 350; FP64-NEXT: sub.d $f1, $f12, $f0 351; FP64-NEXT: trunc.w.d $f1, $f1 352; FP64-NEXT: mfc1 $1, $f1 353; FP64-NEXT: lui $3, 32768 354; FP64-NEXT: xor $1, $1, $3 355; FP64-NEXT: addiu $3, $zero, 1 356; FP64-NEXT: c.ult.d $f12, $f0 357; FP64-NEXT: movf $3, $zero, $fcc0 358; FP64-NEXT: movn $1, $2, $3 359; FP64-NEXT: andi $2, $1, 255 360; FP64-NEXT: jr $ra 361; FP64-NEXT: nop 362entry: 363 %conv = fptoui double %a to i8 364 ret i8 %conv 365} 366