1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=sparc-linux-gnu < %s | FileCheck %s -check-prefixes=ALL,V8,V8-OPT 3; RUN: llc -mtriple=sparcel-linux-gnu < %s | FileCheck %s -check-prefixes=ALL,V8,V8-OPT 4; RUN: llc -mtriple=sparc-linux-gnu -O0 < %s | FileCheck %s -check-prefixes=ALL,V8,V8-UNOPT 5; RUN: llc -mtriple=sparc-linux-gnu -mattr=v9 < %s | FileCheck %s -check-prefixes=ALL,V9 6; RUN: llc -mtriple=sparc64-unknown-linux < %s | FileCheck %s -check-prefixes=ALL,SPARC64 7 8define void @test_load_store(ptr %p, ptr %q) nounwind { 9; ALL-LABEL: test_load_store: 10; ALL: ! %bb.0: 11; ALL-NEXT: lduh [%o0], %o0 12; ALL-NEXT: retl 13; ALL-NEXT: sth %o0, [%o1] 14 %a = load half, ptr %p 15 store half %a, ptr %q 16 ret void 17} 18 19define float @test_fpextend_float(ptr %p) nounwind { 20; V8-LABEL: test_fpextend_float: 21; V8: ! %bb.0: 22; V8-NEXT: save %sp, -96, %sp 23; V8-NEXT: call __gnu_h2f_ieee 24; V8-NEXT: lduh [%i0], %o0 25; V8-NEXT: ret 26; V8-NEXT: restore 27; 28; V9-LABEL: test_fpextend_float: 29; V9: ! %bb.0: 30; V9-NEXT: save %sp, -96, %sp 31; V9-NEXT: call __gnu_h2f_ieee 32; V9-NEXT: lduh [%i0], %o0 33; V9-NEXT: ret 34; V9-NEXT: restore 35; 36; SPARC64-LABEL: test_fpextend_float: 37; SPARC64: ! %bb.0: 38; SPARC64-NEXT: save %sp, -176, %sp 39; SPARC64-NEXT: call __gnu_h2f_ieee 40; SPARC64-NEXT: lduh [%i0], %o0 41; SPARC64-NEXT: ret 42; SPARC64-NEXT: restore 43 %a = load half, ptr %p 44 %r = fpext half %a to float 45 ret float %r 46} 47 48define double @test_fpextend_double(ptr %p) nounwind { 49; V8-LABEL: test_fpextend_double: 50; V8: ! %bb.0: 51; V8-NEXT: save %sp, -96, %sp 52; V8-NEXT: call __gnu_h2f_ieee 53; V8-NEXT: lduh [%i0], %o0 54; V8-NEXT: fstod %f0, %f0 55; V8-NEXT: ret 56; V8-NEXT: restore 57; 58; V9-LABEL: test_fpextend_double: 59; V9: ! %bb.0: 60; V9-NEXT: save %sp, -96, %sp 61; V9-NEXT: call __gnu_h2f_ieee 62; V9-NEXT: lduh [%i0], %o0 63; V9-NEXT: fstod %f0, %f0 64; V9-NEXT: ret 65; V9-NEXT: restore 66; 67; SPARC64-LABEL: test_fpextend_double: 68; SPARC64: ! %bb.0: 69; SPARC64-NEXT: save %sp, -176, %sp 70; SPARC64-NEXT: call __gnu_h2f_ieee 71; SPARC64-NEXT: lduh [%i0], %o0 72; SPARC64-NEXT: fstod %f0, %f0 73; SPARC64-NEXT: ret 74; SPARC64-NEXT: restore 75 %a = load half, ptr %p 76 %r = fpext half %a to double 77 ret double %r 78} 79 80define void @test_fpextend_fp128(ptr %p, ptr %out) nounwind { 81; V8-OPT-LABEL: test_fpextend_fp128: 82; V8-OPT: ! %bb.0: 83; V8-OPT-NEXT: save %sp, -112, %sp 84; V8-OPT-NEXT: call __gnu_h2f_ieee 85; V8-OPT-NEXT: lduh [%i0], %o0 86; V8-OPT-NEXT: st %f0, [%fp+-20] 87; V8-OPT-NEXT: add %fp, -16, %i0 88; V8-OPT-NEXT: st %i0, [%sp+64] 89; V8-OPT-NEXT: call _Q_stoq 90; V8-OPT-NEXT: ld [%fp+-20], %o0 91; V8-OPT-NEXT: unimp 16 92; V8-OPT-NEXT: ldd [%fp+-16], %f0 93; V8-OPT-NEXT: ldd [%fp+-8], %f2 94; V8-OPT-NEXT: std %f2, [%i1+8] 95; V8-OPT-NEXT: std %f0, [%i1] 96; V8-OPT-NEXT: ret 97; V8-OPT-NEXT: restore 98; 99; V8-UNOPT-LABEL: test_fpextend_fp128: 100; V8-UNOPT: ! %bb.0: 101; V8-UNOPT-NEXT: save %sp, -112, %sp 102; V8-UNOPT-NEXT: call __gnu_h2f_ieee 103; V8-UNOPT-NEXT: lduh [%i0], %o0 104; V8-UNOPT-NEXT: st %f0, [%fp+-20] 105; V8-UNOPT-NEXT: add %fp, -16, %i0 106; V8-UNOPT-NEXT: st %i0, [%sp+64] 107; V8-UNOPT-NEXT: call _Q_stoq 108; V8-UNOPT-NEXT: ld [%fp+-20], %o0 109; V8-UNOPT-NEXT: unimp 16 110; V8-UNOPT-NEXT: ldd [%fp+-16], %f4 111; V8-UNOPT-NEXT: ! implicit-def: $q0 112; V8-UNOPT-NEXT: fmovs %f4, %f0 113; V8-UNOPT-NEXT: fmovs %f5, %f1 114; V8-UNOPT-NEXT: ldd [%fp+-8], %f4 115; V8-UNOPT-NEXT: fmovs %f4, %f2 116; V8-UNOPT-NEXT: fmovs %f5, %f3 117; V8-UNOPT-NEXT: fmovs %f2, %f4 118; V8-UNOPT-NEXT: fmovs %f3, %f5 119; V8-UNOPT-NEXT: std %f4, [%i1+8] 120; V8-UNOPT-NEXT: ! kill: def $d0 killed $d0 killed $q0 121; V8-UNOPT-NEXT: std %f0, [%i1] 122; V8-UNOPT-NEXT: ret 123; V8-UNOPT-NEXT: restore 124; 125; V9-LABEL: test_fpextend_fp128: 126; V9: ! %bb.0: 127; V9-NEXT: save %sp, -112, %sp 128; V9-NEXT: call __gnu_h2f_ieee 129; V9-NEXT: lduh [%i0], %o0 130; V9-NEXT: st %f0, [%fp+-20] 131; V9-NEXT: add %fp, -16, %i0 132; V9-NEXT: st %i0, [%sp+64] 133; V9-NEXT: call _Q_stoq 134; V9-NEXT: ld [%fp+-20], %o0 135; V9-NEXT: unimp 16 136; V9-NEXT: ldd [%fp+-16], %f0 137; V9-NEXT: ldd [%fp+-8], %f2 138; V9-NEXT: std %f2, [%i1+8] 139; V9-NEXT: std %f0, [%i1] 140; V9-NEXT: ret 141; V9-NEXT: restore 142; 143; SPARC64-LABEL: test_fpextend_fp128: 144; SPARC64: ! %bb.0: 145; SPARC64-NEXT: save %sp, -192, %sp 146; SPARC64-NEXT: call __gnu_h2f_ieee 147; SPARC64-NEXT: lduh [%i0], %o0 148; SPARC64-NEXT: add %fp, 2031, %o0 149; SPARC64-NEXT: fmovs %f0, %f3 150; SPARC64-NEXT: call _Qp_stoq 151; SPARC64-NEXT: nop 152; SPARC64-NEXT: ldd [%fp+2031], %f0 153; SPARC64-NEXT: ldd [%fp+2039], %f2 154; SPARC64-NEXT: std %f2, [%i1+8] 155; SPARC64-NEXT: std %f0, [%i1] 156; SPARC64-NEXT: ret 157; SPARC64-NEXT: restore 158 %a = load half, ptr %p 159 %r = fpext half %a to fp128 160 store fp128 %r, ptr %out 161 ret void 162} 163 164define void @test_fptrunc_float(float %f, ptr %p) nounwind { 165; V8-OPT-LABEL: test_fptrunc_float: 166; V8-OPT: ! %bb.0: 167; V8-OPT-NEXT: save %sp, -96, %sp 168; V8-OPT-NEXT: call __gnu_f2h_ieee 169; V8-OPT-NEXT: mov %i0, %o0 170; V8-OPT-NEXT: sth %o0, [%i1] 171; V8-OPT-NEXT: ret 172; V8-OPT-NEXT: restore 173; 174; V8-UNOPT-LABEL: test_fptrunc_float: 175; V8-UNOPT: ! %bb.0: 176; V8-UNOPT-NEXT: save %sp, -96, %sp 177; V8-UNOPT-NEXT: mov %i0, %o0 178; V8-UNOPT-NEXT: st %o0, [%fp+-4] 179; V8-UNOPT-NEXT: call __gnu_f2h_ieee 180; V8-UNOPT-NEXT: ld [%fp+-4], %f0 181; V8-UNOPT-NEXT: sth %o0, [%i1] 182; V8-UNOPT-NEXT: ret 183; V8-UNOPT-NEXT: restore 184; 185; V9-LABEL: test_fptrunc_float: 186; V9: ! %bb.0: 187; V9-NEXT: save %sp, -96, %sp 188; V9-NEXT: call __gnu_f2h_ieee 189; V9-NEXT: mov %i0, %o0 190; V9-NEXT: sth %o0, [%i1] 191; V9-NEXT: ret 192; V9-NEXT: restore 193; 194; SPARC64-LABEL: test_fptrunc_float: 195; SPARC64: ! %bb.0: 196; SPARC64-NEXT: save %sp, -176, %sp 197; SPARC64-NEXT: call __gnu_f2h_ieee 198; SPARC64-NEXT: nop 199; SPARC64-NEXT: sth %o0, [%i1] 200; SPARC64-NEXT: ret 201; SPARC64-NEXT: restore 202 %a = fptrunc float %f to half 203 store half %a, ptr %p 204 ret void 205} 206 207define void @test_fptrunc_double(double %d, ptr %p) nounwind { 208; V8-OPT-LABEL: test_fptrunc_double: 209; V8-OPT: ! %bb.0: 210; V8-OPT-NEXT: save %sp, -112, %sp 211; V8-OPT-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1 212; V8-OPT-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1 213; V8-OPT-NEXT: std %i0, [%fp+-8] 214; V8-OPT-NEXT: ldd [%fp+-8], %f0 215; V8-OPT-NEXT: std %f0, [%fp+-16] 216; V8-OPT-NEXT: call __truncdfhf2 217; V8-OPT-NEXT: ldd [%fp+-16], %o0 218; V8-OPT-NEXT: sth %o0, [%i2] 219; V8-OPT-NEXT: ret 220; V8-OPT-NEXT: restore 221; 222; V8-UNOPT-LABEL: test_fptrunc_double: 223; V8-UNOPT: ! %bb.0: 224; V8-UNOPT-NEXT: save %sp, -112, %sp 225; V8-UNOPT-NEXT: mov %i1, %i3 226; V8-UNOPT-NEXT: mov %i0, %i4 227; V8-UNOPT-NEXT: ! implicit-def: $i0_i1 228; V8-UNOPT-NEXT: mov %i4, %i0 229; V8-UNOPT-NEXT: mov %i3, %i1 230; V8-UNOPT-NEXT: std %i0, [%fp+-8] 231; V8-UNOPT-NEXT: ldd [%fp+-8], %f0 232; V8-UNOPT-NEXT: std %f0, [%fp+-16] 233; V8-UNOPT-NEXT: ldd [%fp+-16], %i0 234; V8-UNOPT-NEXT: mov %i0, %o0 235; V8-UNOPT-NEXT: call __truncdfhf2 236; V8-UNOPT-NEXT: mov %i1, %o1 237; V8-UNOPT-NEXT: sth %o0, [%i2] 238; V8-UNOPT-NEXT: ret 239; V8-UNOPT-NEXT: restore 240; 241; V9-LABEL: test_fptrunc_double: 242; V9: ! %bb.0: 243; V9-NEXT: save %sp, -112, %sp 244; V9-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1 245; V9-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1 246; V9-NEXT: std %i0, [%fp+-8] 247; V9-NEXT: ldd [%fp+-8], %f0 248; V9-NEXT: std %f0, [%fp+-16] 249; V9-NEXT: call __truncdfhf2 250; V9-NEXT: ldd [%fp+-16], %o0 251; V9-NEXT: sth %o0, [%i2] 252; V9-NEXT: ret 253; V9-NEXT: restore 254; 255; SPARC64-LABEL: test_fptrunc_double: 256; SPARC64: ! %bb.0: 257; SPARC64-NEXT: save %sp, -176, %sp 258; SPARC64-NEXT: call __truncdfhf2 259; SPARC64-NEXT: nop 260; SPARC64-NEXT: sth %o0, [%i1] 261; SPARC64-NEXT: ret 262; SPARC64-NEXT: restore 263 %a = fptrunc double %d to half 264 store half %a, ptr %p 265 ret void 266} 267 268define void @test_fptrunc_fp128(ptr %dp, ptr %p) nounwind { 269; V8-OPT-LABEL: test_fptrunc_fp128: 270; V8-OPT: ! %bb.0: 271; V8-OPT-NEXT: save %sp, -104, %sp 272; V8-OPT-NEXT: ldd [%i0], %f0 273; V8-OPT-NEXT: ldd [%i0+8], %f2 274; V8-OPT-NEXT: std %f2, [%sp+100] 275; V8-OPT-NEXT: call __trunctfhf2 276; V8-OPT-NEXT: std %f0, [%sp+92] 277; V8-OPT-NEXT: sth %o0, [%i1] 278; V8-OPT-NEXT: ret 279; V8-OPT-NEXT: restore 280; 281; V8-UNOPT-LABEL: test_fptrunc_fp128: 282; V8-UNOPT: ! %bb.0: 283; V8-UNOPT-NEXT: save %sp, -104, %sp 284; V8-UNOPT-NEXT: ldd [%i0], %f4 285; V8-UNOPT-NEXT: ! implicit-def: $q0 286; V8-UNOPT-NEXT: fmovs %f4, %f0 287; V8-UNOPT-NEXT: fmovs %f5, %f1 288; V8-UNOPT-NEXT: ldd [%i0+8], %f4 289; V8-UNOPT-NEXT: fmovs %f4, %f2 290; V8-UNOPT-NEXT: fmovs %f5, %f3 291; V8-UNOPT-NEXT: fmovs %f2, %f4 292; V8-UNOPT-NEXT: fmovs %f3, %f5 293; V8-UNOPT-NEXT: std %f4, [%sp+100] 294; V8-UNOPT-NEXT: ! kill: def $d0 killed $d0 killed $q0 295; V8-UNOPT-NEXT: call __trunctfhf2 296; V8-UNOPT-NEXT: std %f0, [%sp+92] 297; V8-UNOPT-NEXT: sth %o0, [%i1] 298; V8-UNOPT-NEXT: ret 299; V8-UNOPT-NEXT: restore 300; 301; V9-LABEL: test_fptrunc_fp128: 302; V9: ! %bb.0: 303; V9-NEXT: save %sp, -104, %sp 304; V9-NEXT: ldd [%i0], %f0 305; V9-NEXT: ldd [%i0+8], %f2 306; V9-NEXT: std %f2, [%sp+100] 307; V9-NEXT: call __trunctfhf2 308; V9-NEXT: std %f0, [%sp+92] 309; V9-NEXT: sth %o0, [%i1] 310; V9-NEXT: ret 311; V9-NEXT: restore 312; 313; SPARC64-LABEL: test_fptrunc_fp128: 314; SPARC64: ! %bb.0: 315; SPARC64-NEXT: save %sp, -176, %sp 316; SPARC64-NEXT: ldd [%i0], %f0 317; SPARC64-NEXT: call __trunctfhf2 318; SPARC64-NEXT: ldd [%i0+8], %f2 319; SPARC64-NEXT: sth %o0, [%i1] 320; SPARC64-NEXT: ret 321; SPARC64-NEXT: restore 322 %d = load fp128, ptr %dp 323 %a = fptrunc fp128 %d to half 324 store half %a, ptr %p 325 ret void 326} 327 328define void @test_fadd(ptr %p, ptr %q) nounwind { 329; V8-OPT-LABEL: test_fadd: 330; V8-OPT: ! %bb.0: 331; V8-OPT-NEXT: save %sp, -104, %sp 332; V8-OPT-NEXT: call __gnu_h2f_ieee 333; V8-OPT-NEXT: lduh [%i0], %o0 334; V8-OPT-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill 335; V8-OPT-NEXT: call __gnu_h2f_ieee 336; V8-OPT-NEXT: lduh [%i1], %o0 337; V8-OPT-NEXT: ld [%fp+-8], %f1 ! 4-byte Folded Reload 338; V8-OPT-NEXT: fadds %f1, %f0, %f0 339; V8-OPT-NEXT: st %f0, [%fp+-4] 340; V8-OPT-NEXT: call __gnu_f2h_ieee 341; V8-OPT-NEXT: ld [%fp+-4], %o0 342; V8-OPT-NEXT: sth %o0, [%i0] 343; V8-OPT-NEXT: ret 344; V8-OPT-NEXT: restore 345; 346; V8-UNOPT-LABEL: test_fadd: 347; V8-UNOPT: ! %bb.0: 348; V8-UNOPT-NEXT: save %sp, -104, %sp 349; V8-UNOPT-NEXT: call __gnu_h2f_ieee 350; V8-UNOPT-NEXT: lduh [%i0], %o0 351; V8-UNOPT-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill 352; V8-UNOPT-NEXT: call __gnu_h2f_ieee 353; V8-UNOPT-NEXT: lduh [%i1], %o0 354; V8-UNOPT-NEXT: fmovs %f0, %f1 355; V8-UNOPT-NEXT: ld [%fp+-8], %f0 ! 4-byte Folded Reload 356; V8-UNOPT-NEXT: fadds %f0, %f1, %f0 357; V8-UNOPT-NEXT: st %f0, [%fp+-4] 358; V8-UNOPT-NEXT: call __gnu_f2h_ieee 359; V8-UNOPT-NEXT: ld [%fp+-4], %o0 360; V8-UNOPT-NEXT: sth %o0, [%i0] 361; V8-UNOPT-NEXT: ret 362; V8-UNOPT-NEXT: restore 363; 364; V9-LABEL: test_fadd: 365; V9: ! %bb.0: 366; V9-NEXT: save %sp, -104, %sp 367; V9-NEXT: call __gnu_h2f_ieee 368; V9-NEXT: lduh [%i0], %o0 369; V9-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill 370; V9-NEXT: call __gnu_h2f_ieee 371; V9-NEXT: lduh [%i1], %o0 372; V9-NEXT: ld [%fp+-8], %f1 ! 4-byte Folded Reload 373; V9-NEXT: fadds %f1, %f0, %f0 374; V9-NEXT: st %f0, [%fp+-4] 375; V9-NEXT: call __gnu_f2h_ieee 376; V9-NEXT: ld [%fp+-4], %o0 377; V9-NEXT: sth %o0, [%i0] 378; V9-NEXT: ret 379; V9-NEXT: restore 380; 381; SPARC64-LABEL: test_fadd: 382; SPARC64: ! %bb.0: 383; SPARC64-NEXT: save %sp, -192, %sp 384; SPARC64-NEXT: call __gnu_h2f_ieee 385; SPARC64-NEXT: lduh [%i0], %o0 386; SPARC64-NEXT: st %f0, [%fp+2043] ! 4-byte Folded Spill 387; SPARC64-NEXT: call __gnu_h2f_ieee 388; SPARC64-NEXT: lduh [%i1], %o0 389; SPARC64-NEXT: ld [%fp+2043], %f1 ! 4-byte Folded Reload 390; SPARC64-NEXT: call __gnu_f2h_ieee 391; SPARC64-NEXT: fadds %f1, %f0, %f1 392; SPARC64-NEXT: sth %o0, [%i0] 393; SPARC64-NEXT: ret 394; SPARC64-NEXT: restore 395 %a = load half, ptr %p 396 %b = load half, ptr %q 397 %r = fadd half %a, %b 398 store half %r, ptr %p 399 ret void 400} 401 402define void @test_fmul(ptr %p, ptr %q) nounwind { 403; V8-OPT-LABEL: test_fmul: 404; V8-OPT: ! %bb.0: 405; V8-OPT-NEXT: save %sp, -104, %sp 406; V8-OPT-NEXT: call __gnu_h2f_ieee 407; V8-OPT-NEXT: lduh [%i0], %o0 408; V8-OPT-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill 409; V8-OPT-NEXT: call __gnu_h2f_ieee 410; V8-OPT-NEXT: lduh [%i1], %o0 411; V8-OPT-NEXT: ld [%fp+-8], %f1 ! 4-byte Folded Reload 412; V8-OPT-NEXT: fmuls %f1, %f0, %f0 413; V8-OPT-NEXT: st %f0, [%fp+-4] 414; V8-OPT-NEXT: call __gnu_f2h_ieee 415; V8-OPT-NEXT: ld [%fp+-4], %o0 416; V8-OPT-NEXT: sth %o0, [%i0] 417; V8-OPT-NEXT: ret 418; V8-OPT-NEXT: restore 419; 420; V8-UNOPT-LABEL: test_fmul: 421; V8-UNOPT: ! %bb.0: 422; V8-UNOPT-NEXT: save %sp, -104, %sp 423; V8-UNOPT-NEXT: call __gnu_h2f_ieee 424; V8-UNOPT-NEXT: lduh [%i0], %o0 425; V8-UNOPT-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill 426; V8-UNOPT-NEXT: call __gnu_h2f_ieee 427; V8-UNOPT-NEXT: lduh [%i1], %o0 428; V8-UNOPT-NEXT: fmovs %f0, %f1 429; V8-UNOPT-NEXT: ld [%fp+-8], %f0 ! 4-byte Folded Reload 430; V8-UNOPT-NEXT: fmuls %f0, %f1, %f0 431; V8-UNOPT-NEXT: st %f0, [%fp+-4] 432; V8-UNOPT-NEXT: call __gnu_f2h_ieee 433; V8-UNOPT-NEXT: ld [%fp+-4], %o0 434; V8-UNOPT-NEXT: sth %o0, [%i0] 435; V8-UNOPT-NEXT: ret 436; V8-UNOPT-NEXT: restore 437; 438; V9-LABEL: test_fmul: 439; V9: ! %bb.0: 440; V9-NEXT: save %sp, -104, %sp 441; V9-NEXT: call __gnu_h2f_ieee 442; V9-NEXT: lduh [%i0], %o0 443; V9-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill 444; V9-NEXT: call __gnu_h2f_ieee 445; V9-NEXT: lduh [%i1], %o0 446; V9-NEXT: ld [%fp+-8], %f1 ! 4-byte Folded Reload 447; V9-NEXT: fmuls %f1, %f0, %f0 448; V9-NEXT: st %f0, [%fp+-4] 449; V9-NEXT: call __gnu_f2h_ieee 450; V9-NEXT: ld [%fp+-4], %o0 451; V9-NEXT: sth %o0, [%i0] 452; V9-NEXT: ret 453; V9-NEXT: restore 454; 455; SPARC64-LABEL: test_fmul: 456; SPARC64: ! %bb.0: 457; SPARC64-NEXT: save %sp, -192, %sp 458; SPARC64-NEXT: call __gnu_h2f_ieee 459; SPARC64-NEXT: lduh [%i0], %o0 460; SPARC64-NEXT: st %f0, [%fp+2043] ! 4-byte Folded Spill 461; SPARC64-NEXT: call __gnu_h2f_ieee 462; SPARC64-NEXT: lduh [%i1], %o0 463; SPARC64-NEXT: ld [%fp+2043], %f1 ! 4-byte Folded Reload 464; SPARC64-NEXT: call __gnu_f2h_ieee 465; SPARC64-NEXT: fmuls %f1, %f0, %f1 466; SPARC64-NEXT: sth %o0, [%i0] 467; SPARC64-NEXT: ret 468; SPARC64-NEXT: restore 469 %a = load half, ptr %p 470 %b = load half, ptr %q 471 %r = fmul half %a, %b 472 store half %r, ptr %p 473 ret void 474} 475