1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=mipsel-linux-gnu < %s | FileCheck %s -check-prefix=MIPS32 3; RUN: llc -mtriple=mips64el-linux-gnu < %s | FileCheck %s -check-prefix=MIPS64 4 5define void @test_fadd(ptr %p, ptr %q) nounwind { 6; MIPS32-LABEL: test_fadd: 7; MIPS32: # %bb.0: 8; MIPS32-NEXT: addiu $sp, $sp, -32 9; MIPS32-NEXT: sdc1 $f20, 24($sp) # 8-byte Folded Spill 10; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 11; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 12; MIPS32-NEXT: move $16, $4 13; MIPS32-NEXT: lhu $4, 0($5) 14; MIPS32-NEXT: jal __gnu_h2f_ieee 15; MIPS32-NEXT: nop 16; MIPS32-NEXT: lhu $4, 0($16) 17; MIPS32-NEXT: jal __gnu_h2f_ieee 18; MIPS32-NEXT: mov.s $f20, $f0 19; MIPS32-NEXT: jal __gnu_f2h_ieee 20; MIPS32-NEXT: add.s $f12, $f0, $f20 21; MIPS32-NEXT: sh $2, 0($16) 22; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 23; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 24; MIPS32-NEXT: ldc1 $f20, 24($sp) # 8-byte Folded Reload 25; MIPS32-NEXT: jr $ra 26; MIPS32-NEXT: addiu $sp, $sp, 32 27; 28; MIPS64-LABEL: test_fadd: 29; MIPS64: # %bb.0: 30; MIPS64-NEXT: daddiu $sp, $sp, -32 31; MIPS64-NEXT: sdc1 $f24, 24($sp) # 8-byte Folded Spill 32; MIPS64-NEXT: sd $ra, 16($sp) # 8-byte Folded Spill 33; MIPS64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 34; MIPS64-NEXT: move $16, $4 35; MIPS64-NEXT: lhu $4, 0($5) 36; MIPS64-NEXT: jal __gnu_h2f_ieee 37; MIPS64-NEXT: nop 38; MIPS64-NEXT: lhu $4, 0($16) 39; MIPS64-NEXT: jal __gnu_h2f_ieee 40; MIPS64-NEXT: mov.s $f24, $f0 41; MIPS64-NEXT: jal __gnu_f2h_ieee 42; MIPS64-NEXT: add.s $f12, $f0, $f24 43; MIPS64-NEXT: sh $2, 0($16) 44; MIPS64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 45; MIPS64-NEXT: ld $ra, 16($sp) # 8-byte Folded Reload 46; MIPS64-NEXT: ldc1 $f24, 24($sp) # 8-byte Folded Reload 47; MIPS64-NEXT: jr $ra 48; MIPS64-NEXT: daddiu $sp, $sp, 32 49 %a = load half, ptr %p, align 2 50 %b = load half, ptr %q, align 2 51 %r = fadd half %a, %b 52 store half %r, ptr %p 53 ret void 54} 55 56define float @test_fpext_float(ptr %p) nounwind { 57; MIPS32-LABEL: test_fpext_float: 58; MIPS32: # %bb.0: 59; MIPS32-NEXT: addiu $sp, $sp, -24 60; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 61; MIPS32-NEXT: lhu $4, 0($4) 62; MIPS32-NEXT: jal __gnu_h2f_ieee 63; MIPS32-NEXT: nop 64; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 65; MIPS32-NEXT: jr $ra 66; MIPS32-NEXT: addiu $sp, $sp, 24 67; 68; MIPS64-LABEL: test_fpext_float: 69; MIPS64: # %bb.0: 70; MIPS64-NEXT: daddiu $sp, $sp, -16 71; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill 72; MIPS64-NEXT: lhu $4, 0($4) 73; MIPS64-NEXT: jal __gnu_h2f_ieee 74; MIPS64-NEXT: nop 75; MIPS64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload 76; MIPS64-NEXT: jr $ra 77; MIPS64-NEXT: daddiu $sp, $sp, 16 78 %a = load half, ptr %p, align 2 79 %r = fpext half %a to float 80 ret float %r 81} 82 83define double @test_fpext_double(ptr %p) nounwind { 84; MIPS32-LABEL: test_fpext_double: 85; MIPS32: # %bb.0: 86; MIPS32-NEXT: addiu $sp, $sp, -24 87; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 88; MIPS32-NEXT: lhu $4, 0($4) 89; MIPS32-NEXT: jal __gnu_h2f_ieee 90; MIPS32-NEXT: nop 91; MIPS32-NEXT: cvt.d.s $f0, $f0 92; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 93; MIPS32-NEXT: jr $ra 94; MIPS32-NEXT: addiu $sp, $sp, 24 95; 96; MIPS64-LABEL: test_fpext_double: 97; MIPS64: # %bb.0: 98; MIPS64-NEXT: daddiu $sp, $sp, -16 99; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill 100; MIPS64-NEXT: lhu $4, 0($4) 101; MIPS64-NEXT: jal __gnu_h2f_ieee 102; MIPS64-NEXT: nop 103; MIPS64-NEXT: cvt.d.s $f0, $f0 104; MIPS64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload 105; MIPS64-NEXT: jr $ra 106; MIPS64-NEXT: daddiu $sp, $sp, 16 107 %a = load half, ptr %p, align 2 108 %r = fpext half %a to double 109 ret double %r 110} 111 112define void @test_fptrunc_float(float %f, ptr %p) nounwind { 113; MIPS32-LABEL: test_fptrunc_float: 114; MIPS32: # %bb.0: 115; MIPS32-NEXT: addiu $sp, $sp, -24 116; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 117; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 118; MIPS32-NEXT: jal __gnu_f2h_ieee 119; MIPS32-NEXT: move $16, $5 120; MIPS32-NEXT: sh $2, 0($16) 121; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 122; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 123; MIPS32-NEXT: jr $ra 124; MIPS32-NEXT: addiu $sp, $sp, 24 125; 126; MIPS64-LABEL: test_fptrunc_float: 127; MIPS64: # %bb.0: 128; MIPS64-NEXT: daddiu $sp, $sp, -16 129; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill 130; MIPS64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill 131; MIPS64-NEXT: jal __gnu_f2h_ieee 132; MIPS64-NEXT: move $16, $5 133; MIPS64-NEXT: sh $2, 0($16) 134; MIPS64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload 135; MIPS64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload 136; MIPS64-NEXT: jr $ra 137; MIPS64-NEXT: daddiu $sp, $sp, 16 138 %a = fptrunc float %f to half 139 store half %a, ptr %p 140 ret void 141} 142 143define void @test_fptrunc_double(double %d, ptr %p) nounwind { 144; MIPS32-LABEL: test_fptrunc_double: 145; MIPS32: # %bb.0: 146; MIPS32-NEXT: addiu $sp, $sp, -24 147; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 148; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill 149; MIPS32-NEXT: jal __truncdfhf2 150; MIPS32-NEXT: move $16, $6 151; MIPS32-NEXT: sh $2, 0($16) 152; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload 153; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 154; MIPS32-NEXT: jr $ra 155; MIPS32-NEXT: addiu $sp, $sp, 24 156; 157; MIPS64-LABEL: test_fptrunc_double: 158; MIPS64: # %bb.0: 159; MIPS64-NEXT: daddiu $sp, $sp, -16 160; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill 161; MIPS64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill 162; MIPS64-NEXT: jal __truncdfhf2 163; MIPS64-NEXT: move $16, $5 164; MIPS64-NEXT: sh $2, 0($16) 165; MIPS64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload 166; MIPS64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload 167; MIPS64-NEXT: jr $ra 168; MIPS64-NEXT: daddiu $sp, $sp, 16 169 %a = fptrunc double %d to half 170 store half %a, ptr %p 171 ret void 172} 173 174define <4 x float> @test_vec_fpext_float(ptr %p) nounwind { 175; MIPS32-LABEL: test_vec_fpext_float: 176; MIPS32: # %bb.0: 177; MIPS32-NEXT: addiu $sp, $sp, -32 178; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill 179; MIPS32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill 180; MIPS32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill 181; MIPS32-NEXT: move $17, $4 182; MIPS32-NEXT: lhu $4, 6($5) 183; MIPS32-NEXT: jal __gnu_h2f_ieee 184; MIPS32-NEXT: move $16, $5 185; MIPS32-NEXT: lhu $4, 4($16) 186; MIPS32-NEXT: jal __gnu_h2f_ieee 187; MIPS32-NEXT: swc1 $f0, 12($17) 188; MIPS32-NEXT: swc1 $f0, 8($17) 189; MIPS32-NEXT: lhu $4, 2($16) 190; MIPS32-NEXT: jal __gnu_h2f_ieee 191; MIPS32-NEXT: nop 192; MIPS32-NEXT: swc1 $f0, 4($17) 193; MIPS32-NEXT: lhu $4, 0($16) 194; MIPS32-NEXT: jal __gnu_h2f_ieee 195; MIPS32-NEXT: nop 196; MIPS32-NEXT: swc1 $f0, 0($17) 197; MIPS32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload 198; MIPS32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload 199; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload 200; MIPS32-NEXT: jr $ra 201; MIPS32-NEXT: addiu $sp, $sp, 32 202; 203; MIPS64-LABEL: test_vec_fpext_float: 204; MIPS64: # %bb.0: 205; MIPS64-NEXT: daddiu $sp, $sp, -32 206; MIPS64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 207; MIPS64-NEXT: sd $18, 16($sp) # 8-byte Folded Spill 208; MIPS64-NEXT: sd $17, 8($sp) # 8-byte Folded Spill 209; MIPS64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill 210; MIPS64-NEXT: move $16, $4 211; MIPS64-NEXT: lhu $4, 2($4) 212; MIPS64-NEXT: jal __gnu_h2f_ieee 213; MIPS64-NEXT: nop 214; MIPS64-NEXT: lhu $4, 6($16) 215; MIPS64-NEXT: jal __gnu_h2f_ieee 216; MIPS64-NEXT: mfc1 $17, $f0 217; MIPS64-NEXT: mfc1 $18, $f0 218; MIPS64-NEXT: lhu $4, 0($16) 219; MIPS64-NEXT: jal __gnu_h2f_ieee 220; MIPS64-NEXT: dsll $17, $17, 32 221; MIPS64-NEXT: mfc1 $1, $f0 222; MIPS64-NEXT: dsll $1, $1, 32 223; MIPS64-NEXT: dsrl $1, $1, 32 224; MIPS64-NEXT: or $17, $1, $17 225; MIPS64-NEXT: lhu $4, 4($16) 226; MIPS64-NEXT: jal __gnu_h2f_ieee 227; MIPS64-NEXT: dsll $18, $18, 32 228; MIPS64-NEXT: mfc1 $1, $f0 229; MIPS64-NEXT: dsll $1, $1, 32 230; MIPS64-NEXT: dsrl $1, $1, 32 231; MIPS64-NEXT: or $3, $1, $18 232; MIPS64-NEXT: move $2, $17 233; MIPS64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload 234; MIPS64-NEXT: ld $17, 8($sp) # 8-byte Folded Reload 235; MIPS64-NEXT: ld $18, 16($sp) # 8-byte Folded Reload 236; MIPS64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 237; MIPS64-NEXT: jr $ra 238; MIPS64-NEXT: daddiu $sp, $sp, 32 239 %a = load <4 x half>, ptr %p, align 8 240 %b = fpext <4 x half> %a to <4 x float> 241 ret <4 x float> %b 242} 243 244define <4 x double> @test_vec_fpext_double(ptr %p) nounwind { 245; MIPS32-LABEL: test_vec_fpext_double: 246; MIPS32: # %bb.0: 247; MIPS32-NEXT: addiu $sp, $sp, -40 248; MIPS32-NEXT: sdc1 $f20, 32($sp) # 8-byte Folded Spill 249; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill 250; MIPS32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill 251; MIPS32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill 252; MIPS32-NEXT: move $17, $4 253; MIPS32-NEXT: lhu $4, 6($5) 254; MIPS32-NEXT: jal __gnu_h2f_ieee 255; MIPS32-NEXT: move $16, $5 256; MIPS32-NEXT: lhu $4, 4($16) 257; MIPS32-NEXT: jal __gnu_h2f_ieee 258; MIPS32-NEXT: mov.s $f20, $f0 259; MIPS32-NEXT: lhu $4, 2($16) 260; MIPS32-NEXT: cvt.d.s $f0, $f0 261; MIPS32-NEXT: cvt.d.s $f2, $f20 262; MIPS32-NEXT: sdc1 $f2, 24($17) 263; MIPS32-NEXT: jal __gnu_h2f_ieee 264; MIPS32-NEXT: sdc1 $f0, 16($17) 265; MIPS32-NEXT: cvt.d.s $f0, $f0 266; MIPS32-NEXT: sdc1 $f0, 8($17) 267; MIPS32-NEXT: lhu $4, 0($16) 268; MIPS32-NEXT: jal __gnu_h2f_ieee 269; MIPS32-NEXT: nop 270; MIPS32-NEXT: cvt.d.s $f0, $f0 271; MIPS32-NEXT: sdc1 $f0, 0($17) 272; MIPS32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload 273; MIPS32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload 274; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload 275; MIPS32-NEXT: ldc1 $f20, 32($sp) # 8-byte Folded Reload 276; MIPS32-NEXT: jr $ra 277; MIPS32-NEXT: addiu $sp, $sp, 40 278; 279; MIPS64-LABEL: test_vec_fpext_double: 280; MIPS64: # %bb.0: 281; MIPS64-NEXT: daddiu $sp, $sp, -32 282; MIPS64-NEXT: sdc1 $f24, 24($sp) # 8-byte Folded Spill 283; MIPS64-NEXT: sd $ra, 16($sp) # 8-byte Folded Spill 284; MIPS64-NEXT: sd $17, 8($sp) # 8-byte Folded Spill 285; MIPS64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill 286; MIPS64-NEXT: move $17, $4 287; MIPS64-NEXT: lhu $4, 6($5) 288; MIPS64-NEXT: jal __gnu_h2f_ieee 289; MIPS64-NEXT: move $16, $5 290; MIPS64-NEXT: lhu $4, 4($16) 291; MIPS64-NEXT: jal __gnu_h2f_ieee 292; MIPS64-NEXT: mov.s $f24, $f0 293; MIPS64-NEXT: lhu $4, 2($16) 294; MIPS64-NEXT: cvt.d.s $f0, $f0 295; MIPS64-NEXT: cvt.d.s $f1, $f24 296; MIPS64-NEXT: sdc1 $f1, 24($17) 297; MIPS64-NEXT: jal __gnu_h2f_ieee 298; MIPS64-NEXT: sdc1 $f0, 16($17) 299; MIPS64-NEXT: cvt.d.s $f0, $f0 300; MIPS64-NEXT: sdc1 $f0, 8($17) 301; MIPS64-NEXT: lhu $4, 0($16) 302; MIPS64-NEXT: jal __gnu_h2f_ieee 303; MIPS64-NEXT: nop 304; MIPS64-NEXT: cvt.d.s $f0, $f0 305; MIPS64-NEXT: sdc1 $f0, 0($17) 306; MIPS64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload 307; MIPS64-NEXT: ld $17, 8($sp) # 8-byte Folded Reload 308; MIPS64-NEXT: ld $ra, 16($sp) # 8-byte Folded Reload 309; MIPS64-NEXT: ldc1 $f24, 24($sp) # 8-byte Folded Reload 310; MIPS64-NEXT: jr $ra 311; MIPS64-NEXT: daddiu $sp, $sp, 32 312 %a = load <4 x half>, ptr %p, align 8 313 %b = fpext <4 x half> %a to <4 x double> 314 ret <4 x double> %b 315} 316 317define void @test_vec_fptrunc_float(<4 x float> %a, ptr %p) nounwind { 318; MIPS32-LABEL: test_vec_fptrunc_float: 319; MIPS32: # %bb.0: 320; MIPS32-NEXT: addiu $sp, $sp, -40 321; MIPS32-NEXT: sw $ra, 36($sp) # 4-byte Folded Spill 322; MIPS32-NEXT: sw $19, 32($sp) # 4-byte Folded Spill 323; MIPS32-NEXT: sw $18, 28($sp) # 4-byte Folded Spill 324; MIPS32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill 325; MIPS32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill 326; MIPS32-NEXT: move $16, $7 327; MIPS32-NEXT: move $17, $5 328; MIPS32-NEXT: move $18, $4 329; MIPS32-NEXT: jal __gnu_f2h_ieee 330; MIPS32-NEXT: mtc1 $6, $f12 331; MIPS32-NEXT: move $19, $2 332; MIPS32-NEXT: jal __gnu_f2h_ieee 333; MIPS32-NEXT: mtc1 $16, $f12 334; MIPS32-NEXT: mtc1 $17, $f12 335; MIPS32-NEXT: lw $16, 56($sp) 336; MIPS32-NEXT: sh $2, 6($16) 337; MIPS32-NEXT: jal __gnu_f2h_ieee 338; MIPS32-NEXT: sh $19, 4($16) 339; MIPS32-NEXT: sh $2, 2($16) 340; MIPS32-NEXT: jal __gnu_f2h_ieee 341; MIPS32-NEXT: mtc1 $18, $f12 342; MIPS32-NEXT: sh $2, 0($16) 343; MIPS32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload 344; MIPS32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload 345; MIPS32-NEXT: lw $18, 28($sp) # 4-byte Folded Reload 346; MIPS32-NEXT: lw $19, 32($sp) # 4-byte Folded Reload 347; MIPS32-NEXT: lw $ra, 36($sp) # 4-byte Folded Reload 348; MIPS32-NEXT: jr $ra 349; MIPS32-NEXT: addiu $sp, $sp, 40 350; 351; MIPS64-LABEL: test_vec_fptrunc_float: 352; MIPS64: # %bb.0: 353; MIPS64-NEXT: daddiu $sp, $sp, -48 354; MIPS64-NEXT: sd $ra, 40($sp) # 8-byte Folded Spill 355; MIPS64-NEXT: sd $19, 32($sp) # 8-byte Folded Spill 356; MIPS64-NEXT: sd $18, 24($sp) # 8-byte Folded Spill 357; MIPS64-NEXT: sd $17, 16($sp) # 8-byte Folded Spill 358; MIPS64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 359; MIPS64-NEXT: move $16, $6 360; MIPS64-NEXT: move $17, $5 361; MIPS64-NEXT: move $18, $4 362; MIPS64-NEXT: sll $1, $18, 0 363; MIPS64-NEXT: jal __gnu_f2h_ieee 364; MIPS64-NEXT: mtc1 $1, $f12 365; MIPS64-NEXT: move $19, $2 366; MIPS64-NEXT: sll $1, $17, 0 367; MIPS64-NEXT: jal __gnu_f2h_ieee 368; MIPS64-NEXT: mtc1 $1, $f12 369; MIPS64-NEXT: dsrl $1, $17, 32 370; MIPS64-NEXT: sll $1, $1, 0 371; MIPS64-NEXT: mtc1 $1, $f12 372; MIPS64-NEXT: sh $2, 4($16) 373; MIPS64-NEXT: jal __gnu_f2h_ieee 374; MIPS64-NEXT: sh $19, 0($16) 375; MIPS64-NEXT: sh $2, 6($16) 376; MIPS64-NEXT: dsrl $1, $18, 32 377; MIPS64-NEXT: sll $1, $1, 0 378; MIPS64-NEXT: jal __gnu_f2h_ieee 379; MIPS64-NEXT: mtc1 $1, $f12 380; MIPS64-NEXT: sh $2, 2($16) 381; MIPS64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 382; MIPS64-NEXT: ld $17, 16($sp) # 8-byte Folded Reload 383; MIPS64-NEXT: ld $18, 24($sp) # 8-byte Folded Reload 384; MIPS64-NEXT: ld $19, 32($sp) # 8-byte Folded Reload 385; MIPS64-NEXT: ld $ra, 40($sp) # 8-byte Folded Reload 386; MIPS64-NEXT: jr $ra 387; MIPS64-NEXT: daddiu $sp, $sp, 48 388 %b = fptrunc <4 x float> %a to <4 x half> 389 store <4 x half> %b, ptr %p, align 8 390 ret void 391} 392 393define void @test_vec_fptrunc_double(<4 x double> %a, ptr %p) nounwind { 394; MIPS32-LABEL: test_vec_fptrunc_double: 395; MIPS32: # %bb.0: 396; MIPS32-NEXT: addiu $sp, $sp, -72 397; MIPS32-NEXT: sw $ra, 68($sp) # 4-byte Folded Spill 398; MIPS32-NEXT: sw $19, 64($sp) # 4-byte Folded Spill 399; MIPS32-NEXT: sw $18, 60($sp) # 4-byte Folded Spill 400; MIPS32-NEXT: sw $17, 56($sp) # 4-byte Folded Spill 401; MIPS32-NEXT: sw $16, 52($sp) # 4-byte Folded Spill 402; MIPS32-NEXT: move $16, $5 403; MIPS32-NEXT: move $17, $4 404; MIPS32-NEXT: lw $1, 92($sp) 405; MIPS32-NEXT: sw $1, 36($sp) 406; MIPS32-NEXT: lw $1, 88($sp) 407; MIPS32-NEXT: sw $1, 32($sp) 408; MIPS32-NEXT: lw $1, 96($sp) 409; MIPS32-NEXT: lw $2, 100($sp) 410; MIPS32-NEXT: sw $2, 44($sp) 411; MIPS32-NEXT: sw $1, 40($sp) 412; MIPS32-NEXT: ldc1 $f12, 32($sp) 413; MIPS32-NEXT: sw $7, 28($sp) 414; MIPS32-NEXT: jal __truncdfhf2 415; MIPS32-NEXT: sw $6, 24($sp) 416; MIPS32-NEXT: move $18, $2 417; MIPS32-NEXT: jal __truncdfhf2 418; MIPS32-NEXT: ldc1 $f12, 40($sp) 419; MIPS32-NEXT: ldc1 $f12, 24($sp) 420; MIPS32-NEXT: lw $19, 104($sp) 421; MIPS32-NEXT: sh $2, 6($19) 422; MIPS32-NEXT: jal __truncdfhf2 423; MIPS32-NEXT: sh $18, 4($19) 424; MIPS32-NEXT: sh $2, 2($19) 425; MIPS32-NEXT: sw $16, 20($sp) 426; MIPS32-NEXT: sw $17, 16($sp) 427; MIPS32-NEXT: jal __truncdfhf2 428; MIPS32-NEXT: ldc1 $f12, 16($sp) 429; MIPS32-NEXT: sh $2, 0($19) 430; MIPS32-NEXT: lw $16, 52($sp) # 4-byte Folded Reload 431; MIPS32-NEXT: lw $17, 56($sp) # 4-byte Folded Reload 432; MIPS32-NEXT: lw $18, 60($sp) # 4-byte Folded Reload 433; MIPS32-NEXT: lw $19, 64($sp) # 4-byte Folded Reload 434; MIPS32-NEXT: lw $ra, 68($sp) # 4-byte Folded Reload 435; MIPS32-NEXT: jr $ra 436; MIPS32-NEXT: addiu $sp, $sp, 72 437; 438; MIPS64-LABEL: test_vec_fptrunc_double: 439; MIPS64: # %bb.0: 440; MIPS64-NEXT: daddiu $sp, $sp, -48 441; MIPS64-NEXT: sd $ra, 40($sp) # 8-byte Folded Spill 442; MIPS64-NEXT: sd $20, 32($sp) # 8-byte Folded Spill 443; MIPS64-NEXT: sd $19, 24($sp) # 8-byte Folded Spill 444; MIPS64-NEXT: sd $18, 16($sp) # 8-byte Folded Spill 445; MIPS64-NEXT: sd $17, 8($sp) # 8-byte Folded Spill 446; MIPS64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill 447; MIPS64-NEXT: move $16, $8 448; MIPS64-NEXT: move $17, $7 449; MIPS64-NEXT: move $18, $5 450; MIPS64-NEXT: move $19, $4 451; MIPS64-NEXT: jal __truncdfhf2 452; MIPS64-NEXT: dmtc1 $6, $f12 453; MIPS64-NEXT: move $20, $2 454; MIPS64-NEXT: jal __truncdfhf2 455; MIPS64-NEXT: dmtc1 $17, $f12 456; MIPS64-NEXT: dmtc1 $18, $f12 457; MIPS64-NEXT: sh $2, 6($16) 458; MIPS64-NEXT: jal __truncdfhf2 459; MIPS64-NEXT: sh $20, 4($16) 460; MIPS64-NEXT: sh $2, 2($16) 461; MIPS64-NEXT: jal __truncdfhf2 462; MIPS64-NEXT: dmtc1 $19, $f12 463; MIPS64-NEXT: sh $2, 0($16) 464; MIPS64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload 465; MIPS64-NEXT: ld $17, 8($sp) # 8-byte Folded Reload 466; MIPS64-NEXT: ld $18, 16($sp) # 8-byte Folded Reload 467; MIPS64-NEXT: ld $19, 24($sp) # 8-byte Folded Reload 468; MIPS64-NEXT: ld $20, 32($sp) # 8-byte Folded Reload 469; MIPS64-NEXT: ld $ra, 40($sp) # 8-byte Folded Reload 470; MIPS64-NEXT: jr $ra 471; MIPS64-NEXT: daddiu $sp, $sp, 48 472 %b = fptrunc <4 x double> %a to <4 x half> 473 store <4 x half> %b, ptr %p, align 8 474 ret void 475} 476 477define half @test_fadd_fadd(half %a, half %b, half %c) nounwind { 478; MIPS32-LABEL: test_fadd_fadd: 479; MIPS32: # %bb.0: 480; MIPS32-NEXT: addiu $sp, $sp, -40 481; MIPS32-NEXT: sdc1 $f20, 32($sp) # 8-byte Folded Spill 482; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill 483; MIPS32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill 484; MIPS32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill 485; MIPS32-NEXT: move $16, $6 486; MIPS32-NEXT: move $17, $4 487; MIPS32-NEXT: jal __gnu_h2f_ieee 488; MIPS32-NEXT: move $4, $5 489; MIPS32-NEXT: mov.s $f20, $f0 490; MIPS32-NEXT: jal __gnu_h2f_ieee 491; MIPS32-NEXT: move $4, $17 492; MIPS32-NEXT: jal __gnu_f2h_ieee 493; MIPS32-NEXT: add.s $f12, $f0, $f20 494; MIPS32-NEXT: jal __gnu_h2f_ieee 495; MIPS32-NEXT: move $4, $2 496; MIPS32-NEXT: mov.s $f20, $f0 497; MIPS32-NEXT: jal __gnu_h2f_ieee 498; MIPS32-NEXT: move $4, $16 499; MIPS32-NEXT: jal __gnu_f2h_ieee 500; MIPS32-NEXT: add.s $f12, $f20, $f0 501; MIPS32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload 502; MIPS32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload 503; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload 504; MIPS32-NEXT: ldc1 $f20, 32($sp) # 8-byte Folded Reload 505; MIPS32-NEXT: jr $ra 506; MIPS32-NEXT: addiu $sp, $sp, 40 507; 508; MIPS64-LABEL: test_fadd_fadd: 509; MIPS64: # %bb.0: 510; MIPS64-NEXT: daddiu $sp, $sp, -32 511; MIPS64-NEXT: sdc1 $f24, 24($sp) # 8-byte Folded Spill 512; MIPS64-NEXT: sd $ra, 16($sp) # 8-byte Folded Spill 513; MIPS64-NEXT: sd $17, 8($sp) # 8-byte Folded Spill 514; MIPS64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill 515; MIPS64-NEXT: move $16, $6 516; MIPS64-NEXT: move $17, $4 517; MIPS64-NEXT: jal __gnu_h2f_ieee 518; MIPS64-NEXT: sll $4, $5, 0 519; MIPS64-NEXT: mov.s $f24, $f0 520; MIPS64-NEXT: jal __gnu_h2f_ieee 521; MIPS64-NEXT: sll $4, $17, 0 522; MIPS64-NEXT: jal __gnu_f2h_ieee 523; MIPS64-NEXT: add.s $f12, $f0, $f24 524; MIPS64-NEXT: jal __gnu_h2f_ieee 525; MIPS64-NEXT: sll $4, $2, 0 526; MIPS64-NEXT: mov.s $f24, $f0 527; MIPS64-NEXT: jal __gnu_h2f_ieee 528; MIPS64-NEXT: sll $4, $16, 0 529; MIPS64-NEXT: jal __gnu_f2h_ieee 530; MIPS64-NEXT: add.s $f12, $f24, $f0 531; MIPS64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload 532; MIPS64-NEXT: ld $17, 8($sp) # 8-byte Folded Reload 533; MIPS64-NEXT: ld $ra, 16($sp) # 8-byte Folded Reload 534; MIPS64-NEXT: ldc1 $f24, 24($sp) # 8-byte Folded Reload 535; MIPS64-NEXT: jr $ra 536; MIPS64-NEXT: daddiu $sp, $sp, 32 537 %d = fadd half %a, %b 538 %e = fadd half %d, %c 539 ret half %e 540} 541 542define half @to_half(i16 %bits) nounwind { 543; MIPS32-LABEL: to_half: 544; MIPS32: # %bb.0: 545; MIPS32-NEXT: jr $ra 546; MIPS32-NEXT: move $2, $4 547; 548; MIPS64-LABEL: to_half: 549; MIPS64: # %bb.0: 550; MIPS64-NEXT: jr $ra 551; MIPS64-NEXT: sll $2, $4, 0 552 %f = bitcast i16 %bits to half 553 ret half %f 554} 555 556define i16 @from_half(half %f) nounwind { 557; MIPS32-LABEL: from_half: 558; MIPS32: # %bb.0: 559; MIPS32-NEXT: jr $ra 560; MIPS32-NEXT: move $2, $4 561; 562; MIPS64-LABEL: from_half: 563; MIPS64: # %bb.0: 564; MIPS64-NEXT: jr $ra 565; MIPS64-NEXT: sll $2, $4, 0 566 %bits = bitcast half %f to i16 567 ret i16 %bits 568} 569