1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; FIXME: @llvm.canonicalize doesn't support soft-float abi yet. 3; RUN: llc --mtriple=riscv64 --mattr=+d,+zfh < %s | FileCheck %s --check-prefixes=CHECK,CHECK-FP16-RV64 4; RUN: llc --mtriple=riscv64 --mattr=+d,-zfh < %s | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP16-RV64 5; RUN: llc --mtriple=riscv32 --mattr=+d,+zfh < %s | FileCheck %s --check-prefixes=CHECK,CHECK-FP16-RV32 6; RUN: llc --mtriple=riscv32 --mattr=+d,-zfh < %s | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP16-RV32 7 8declare half @llvm.fcanonicalize.f16(half) 9declare float @llvm.fcanonicalize.f32(float) 10declare double @llvm.fcanonicalize.f64(double) 11 12define half @fcanonicalize_f16(half %x) { 13; CHECK-FP16-RV64-LABEL: fcanonicalize_f16: 14; CHECK-FP16-RV64: # %bb.0: 15; CHECK-FP16-RV64-NEXT: fmin.h fa0, fa0, fa0 16; CHECK-FP16-RV64-NEXT: ret 17; 18; CHECK-NOFP16-RV64-LABEL: fcanonicalize_f16: 19; CHECK-NOFP16-RV64: # %bb.0: 20; CHECK-NOFP16-RV64-NEXT: addi sp, sp, -16 21; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 16 22; CHECK-NOFP16-RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 23; CHECK-NOFP16-RV64-NEXT: .cfi_offset ra, -8 24; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 25; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 26; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 27; CHECK-NOFP16-RV64-NEXT: fmv.x.w a0, fa0 28; CHECK-NOFP16-RV64-NEXT: lui a1, 1048560 29; CHECK-NOFP16-RV64-NEXT: or a0, a0, a1 30; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, a0 31; CHECK-NOFP16-RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 32; CHECK-NOFP16-RV64-NEXT: .cfi_restore ra 33; CHECK-NOFP16-RV64-NEXT: addi sp, sp, 16 34; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 0 35; CHECK-NOFP16-RV64-NEXT: ret 36; 37; CHECK-FP16-RV32-LABEL: fcanonicalize_f16: 38; CHECK-FP16-RV32: # %bb.0: 39; CHECK-FP16-RV32-NEXT: fmin.h fa0, fa0, fa0 40; CHECK-FP16-RV32-NEXT: ret 41; 42; CHECK-NOFP16-RV32-LABEL: fcanonicalize_f16: 43; CHECK-NOFP16-RV32: # %bb.0: 44; CHECK-NOFP16-RV32-NEXT: addi sp, sp, -16 45; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 16 46; CHECK-NOFP16-RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 47; CHECK-NOFP16-RV32-NEXT: .cfi_offset ra, -4 48; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 49; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 50; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 51; CHECK-NOFP16-RV32-NEXT: fmv.x.w a0, fa0 52; CHECK-NOFP16-RV32-NEXT: lui a1, 1048560 53; CHECK-NOFP16-RV32-NEXT: or a0, a0, a1 54; CHECK-NOFP16-RV32-NEXT: fmv.w.x fa0, a0 55; CHECK-NOFP16-RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 56; CHECK-NOFP16-RV32-NEXT: .cfi_restore ra 57; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 16 58; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0 59; CHECK-NOFP16-RV32-NEXT: ret 60 %z = call half @llvm.canonicalize.f16(half %x) 61 ret half %z 62} 63 64define half @fcanonicalize_f16_nnan(half %x) { 65; CHECK-FP16-RV64-LABEL: fcanonicalize_f16_nnan: 66; CHECK-FP16-RV64: # %bb.0: 67; CHECK-FP16-RV64-NEXT: fmin.h fa0, fa0, fa0 68; CHECK-FP16-RV64-NEXT: ret 69; 70; CHECK-NOFP16-RV64-LABEL: fcanonicalize_f16_nnan: 71; CHECK-NOFP16-RV64: # %bb.0: 72; CHECK-NOFP16-RV64-NEXT: addi sp, sp, -16 73; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 16 74; CHECK-NOFP16-RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 75; CHECK-NOFP16-RV64-NEXT: .cfi_offset ra, -8 76; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 77; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 78; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 79; CHECK-NOFP16-RV64-NEXT: fmv.x.w a0, fa0 80; CHECK-NOFP16-RV64-NEXT: lui a1, 1048560 81; CHECK-NOFP16-RV64-NEXT: or a0, a0, a1 82; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, a0 83; CHECK-NOFP16-RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 84; CHECK-NOFP16-RV64-NEXT: .cfi_restore ra 85; CHECK-NOFP16-RV64-NEXT: addi sp, sp, 16 86; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 0 87; CHECK-NOFP16-RV64-NEXT: ret 88; 89; CHECK-FP16-RV32-LABEL: fcanonicalize_f16_nnan: 90; CHECK-FP16-RV32: # %bb.0: 91; CHECK-FP16-RV32-NEXT: fmin.h fa0, fa0, fa0 92; CHECK-FP16-RV32-NEXT: ret 93; 94; CHECK-NOFP16-RV32-LABEL: fcanonicalize_f16_nnan: 95; CHECK-NOFP16-RV32: # %bb.0: 96; CHECK-NOFP16-RV32-NEXT: addi sp, sp, -16 97; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 16 98; CHECK-NOFP16-RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 99; CHECK-NOFP16-RV32-NEXT: .cfi_offset ra, -4 100; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 101; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 102; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 103; CHECK-NOFP16-RV32-NEXT: fmv.x.w a0, fa0 104; CHECK-NOFP16-RV32-NEXT: lui a1, 1048560 105; CHECK-NOFP16-RV32-NEXT: or a0, a0, a1 106; CHECK-NOFP16-RV32-NEXT: fmv.w.x fa0, a0 107; CHECK-NOFP16-RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 108; CHECK-NOFP16-RV32-NEXT: .cfi_restore ra 109; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 16 110; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0 111; CHECK-NOFP16-RV32-NEXT: ret 112 %z = call nnan half @llvm.canonicalize.f16(half %x) 113 ret half %z 114} 115 116define <2 x half> @fcanonicalize_v2f16(<2 x half> %x) { 117; CHECK-FP16-RV64-LABEL: fcanonicalize_v2f16: 118; CHECK-FP16-RV64: # %bb.0: 119; CHECK-FP16-RV64-NEXT: fmin.h fa0, fa0, fa0 120; CHECK-FP16-RV64-NEXT: fmin.h fa1, fa1, fa1 121; CHECK-FP16-RV64-NEXT: ret 122; 123; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v2f16: 124; CHECK-NOFP16-RV64: # %bb.0: 125; CHECK-NOFP16-RV64-NEXT: addi sp, sp, -32 126; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 32 127; CHECK-NOFP16-RV64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 128; CHECK-NOFP16-RV64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 129; CHECK-NOFP16-RV64-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 130; CHECK-NOFP16-RV64-NEXT: .cfi_offset ra, -8 131; CHECK-NOFP16-RV64-NEXT: .cfi_offset s0, -16 132; CHECK-NOFP16-RV64-NEXT: .cfi_offset s1, -24 133; CHECK-NOFP16-RV64-NEXT: mv s0, a1 134; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, a0 135; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 136; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 137; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 138; CHECK-NOFP16-RV64-NEXT: fmv.x.w s1, fa0 139; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s0 140; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 141; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 142; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 143; CHECK-NOFP16-RV64-NEXT: fmv.x.w a1, fa0 144; CHECK-NOFP16-RV64-NEXT: mv a0, s1 145; CHECK-NOFP16-RV64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 146; CHECK-NOFP16-RV64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 147; CHECK-NOFP16-RV64-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 148; CHECK-NOFP16-RV64-NEXT: .cfi_restore ra 149; CHECK-NOFP16-RV64-NEXT: .cfi_restore s0 150; CHECK-NOFP16-RV64-NEXT: .cfi_restore s1 151; CHECK-NOFP16-RV64-NEXT: addi sp, sp, 32 152; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 0 153; CHECK-NOFP16-RV64-NEXT: ret 154; 155; CHECK-FP16-RV32-LABEL: fcanonicalize_v2f16: 156; CHECK-FP16-RV32: # %bb.0: 157; CHECK-FP16-RV32-NEXT: fmin.h fa0, fa0, fa0 158; CHECK-FP16-RV32-NEXT: fmin.h fa1, fa1, fa1 159; CHECK-FP16-RV32-NEXT: ret 160; 161; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v2f16: 162; CHECK-NOFP16-RV32: # %bb.0: 163; CHECK-NOFP16-RV32-NEXT: addi sp, sp, -16 164; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 16 165; CHECK-NOFP16-RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 166; CHECK-NOFP16-RV32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 167; CHECK-NOFP16-RV32-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill 168; CHECK-NOFP16-RV32-NEXT: .cfi_offset ra, -4 169; CHECK-NOFP16-RV32-NEXT: .cfi_offset s0, -8 170; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs0, -16 171; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs0, a1 172; CHECK-NOFP16-RV32-NEXT: fmv.w.x fa0, a0 173; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 174; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 175; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 176; CHECK-NOFP16-RV32-NEXT: fmv.x.w s0, fa0 177; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs0 178; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 179; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 180; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 181; CHECK-NOFP16-RV32-NEXT: fmv.x.w a1, fa0 182; CHECK-NOFP16-RV32-NEXT: mv a0, s0 183; CHECK-NOFP16-RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 184; CHECK-NOFP16-RV32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 185; CHECK-NOFP16-RV32-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload 186; CHECK-NOFP16-RV32-NEXT: .cfi_restore ra 187; CHECK-NOFP16-RV32-NEXT: .cfi_restore s0 188; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs0 189; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 16 190; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0 191; CHECK-NOFP16-RV32-NEXT: ret 192 %z = call <2 x half> @llvm.canonicalize.v2f16(<2 x half> %x) 193 ret <2 x half> %z 194} 195 196define <2 x half> @fcanonicalize_v2f16_nnan(<2 x half> %x) { 197; CHECK-FP16-RV64-LABEL: fcanonicalize_v2f16_nnan: 198; CHECK-FP16-RV64: # %bb.0: 199; CHECK-FP16-RV64-NEXT: fmin.h fa0, fa0, fa0 200; CHECK-FP16-RV64-NEXT: fmin.h fa1, fa1, fa1 201; CHECK-FP16-RV64-NEXT: ret 202; 203; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v2f16_nnan: 204; CHECK-NOFP16-RV64: # %bb.0: 205; CHECK-NOFP16-RV64-NEXT: addi sp, sp, -32 206; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 32 207; CHECK-NOFP16-RV64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 208; CHECK-NOFP16-RV64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 209; CHECK-NOFP16-RV64-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 210; CHECK-NOFP16-RV64-NEXT: .cfi_offset ra, -8 211; CHECK-NOFP16-RV64-NEXT: .cfi_offset s0, -16 212; CHECK-NOFP16-RV64-NEXT: .cfi_offset s1, -24 213; CHECK-NOFP16-RV64-NEXT: mv s0, a1 214; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, a0 215; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 216; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 217; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 218; CHECK-NOFP16-RV64-NEXT: fmv.x.w s1, fa0 219; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s0 220; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 221; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 222; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 223; CHECK-NOFP16-RV64-NEXT: fmv.x.w a1, fa0 224; CHECK-NOFP16-RV64-NEXT: mv a0, s1 225; CHECK-NOFP16-RV64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 226; CHECK-NOFP16-RV64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 227; CHECK-NOFP16-RV64-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 228; CHECK-NOFP16-RV64-NEXT: .cfi_restore ra 229; CHECK-NOFP16-RV64-NEXT: .cfi_restore s0 230; CHECK-NOFP16-RV64-NEXT: .cfi_restore s1 231; CHECK-NOFP16-RV64-NEXT: addi sp, sp, 32 232; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 0 233; CHECK-NOFP16-RV64-NEXT: ret 234; 235; CHECK-FP16-RV32-LABEL: fcanonicalize_v2f16_nnan: 236; CHECK-FP16-RV32: # %bb.0: 237; CHECK-FP16-RV32-NEXT: fmin.h fa0, fa0, fa0 238; CHECK-FP16-RV32-NEXT: fmin.h fa1, fa1, fa1 239; CHECK-FP16-RV32-NEXT: ret 240; 241; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v2f16_nnan: 242; CHECK-NOFP16-RV32: # %bb.0: 243; CHECK-NOFP16-RV32-NEXT: addi sp, sp, -16 244; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 16 245; CHECK-NOFP16-RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 246; CHECK-NOFP16-RV32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 247; CHECK-NOFP16-RV32-NEXT: fsd fs0, 0(sp) # 8-byte Folded Spill 248; CHECK-NOFP16-RV32-NEXT: .cfi_offset ra, -4 249; CHECK-NOFP16-RV32-NEXT: .cfi_offset s0, -8 250; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs0, -16 251; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs0, a1 252; CHECK-NOFP16-RV32-NEXT: fmv.w.x fa0, a0 253; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 254; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 255; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 256; CHECK-NOFP16-RV32-NEXT: fmv.x.w s0, fa0 257; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs0 258; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 259; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 260; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 261; CHECK-NOFP16-RV32-NEXT: fmv.x.w a1, fa0 262; CHECK-NOFP16-RV32-NEXT: mv a0, s0 263; CHECK-NOFP16-RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 264; CHECK-NOFP16-RV32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 265; CHECK-NOFP16-RV32-NEXT: fld fs0, 0(sp) # 8-byte Folded Reload 266; CHECK-NOFP16-RV32-NEXT: .cfi_restore ra 267; CHECK-NOFP16-RV32-NEXT: .cfi_restore s0 268; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs0 269; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 16 270; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0 271; CHECK-NOFP16-RV32-NEXT: ret 272 %z = call nnan <2 x half> @llvm.canonicalize.v2f16(<2 x half> %x) 273 ret <2 x half> %z 274} 275 276define <4 x half> @fcanonicalize_v4f16(<4 x half> %x) { 277; CHECK-FP16-RV64-LABEL: fcanonicalize_v4f16: 278; CHECK-FP16-RV64: # %bb.0: 279; CHECK-FP16-RV64-NEXT: fmin.h fa5, fa0, fa0 280; CHECK-FP16-RV64-NEXT: fmin.h fa4, fa1, fa1 281; CHECK-FP16-RV64-NEXT: fmin.h fa2, fa2, fa2 282; CHECK-FP16-RV64-NEXT: fmin.h fa3, fa3, fa3 283; CHECK-FP16-RV64-NEXT: fsh fa5, 0(a0) 284; CHECK-FP16-RV64-NEXT: fsh fa4, 2(a0) 285; CHECK-FP16-RV64-NEXT: fsh fa2, 4(a0) 286; CHECK-FP16-RV64-NEXT: fsh fa3, 6(a0) 287; CHECK-FP16-RV64-NEXT: ret 288; 289; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v4f16: 290; CHECK-NOFP16-RV64: # %bb.0: 291; CHECK-NOFP16-RV64-NEXT: addi sp, sp, -64 292; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 64 293; CHECK-NOFP16-RV64-NEXT: sd ra, 56(sp) # 8-byte Folded Spill 294; CHECK-NOFP16-RV64-NEXT: sd s0, 48(sp) # 8-byte Folded Spill 295; CHECK-NOFP16-RV64-NEXT: sd s1, 40(sp) # 8-byte Folded Spill 296; CHECK-NOFP16-RV64-NEXT: sd s2, 32(sp) # 8-byte Folded Spill 297; CHECK-NOFP16-RV64-NEXT: sd s3, 24(sp) # 8-byte Folded Spill 298; CHECK-NOFP16-RV64-NEXT: fsd fs0, 16(sp) # 8-byte Folded Spill 299; CHECK-NOFP16-RV64-NEXT: fsd fs1, 8(sp) # 8-byte Folded Spill 300; CHECK-NOFP16-RV64-NEXT: fsd fs2, 0(sp) # 8-byte Folded Spill 301; CHECK-NOFP16-RV64-NEXT: .cfi_offset ra, -8 302; CHECK-NOFP16-RV64-NEXT: .cfi_offset s0, -16 303; CHECK-NOFP16-RV64-NEXT: .cfi_offset s1, -24 304; CHECK-NOFP16-RV64-NEXT: .cfi_offset s2, -32 305; CHECK-NOFP16-RV64-NEXT: .cfi_offset s3, -40 306; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs0, -48 307; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs1, -56 308; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs2, -64 309; CHECK-NOFP16-RV64-NEXT: lhu s1, 0(a1) 310; CHECK-NOFP16-RV64-NEXT: lhu s2, 8(a1) 311; CHECK-NOFP16-RV64-NEXT: lhu s3, 16(a1) 312; CHECK-NOFP16-RV64-NEXT: lhu a1, 24(a1) 313; CHECK-NOFP16-RV64-NEXT: mv s0, a0 314; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, a1 315; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 316; CHECK-NOFP16-RV64-NEXT: fmv.s fs0, fa0 317; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s3 318; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 319; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 320; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 321; CHECK-NOFP16-RV64-NEXT: fmv.s fs1, fa0 322; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s2 323; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 324; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 325; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 326; CHECK-NOFP16-RV64-NEXT: fmv.s fs2, fa0 327; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s1 328; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 329; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 330; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 331; CHECK-NOFP16-RV64-NEXT: fmv.x.w s1, fa0 332; CHECK-NOFP16-RV64-NEXT: fmv.x.w s2, fs2 333; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fs0, fs0 334; CHECK-NOFP16-RV64-NEXT: fmv.x.w s3, fs1 335; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 336; CHECK-NOFP16-RV64-NEXT: fmv.x.w a0, fa0 337; CHECK-NOFP16-RV64-NEXT: sh s1, 0(s0) 338; CHECK-NOFP16-RV64-NEXT: sh s2, 2(s0) 339; CHECK-NOFP16-RV64-NEXT: sh s3, 4(s0) 340; CHECK-NOFP16-RV64-NEXT: sh a0, 6(s0) 341; CHECK-NOFP16-RV64-NEXT: ld ra, 56(sp) # 8-byte Folded Reload 342; CHECK-NOFP16-RV64-NEXT: ld s0, 48(sp) # 8-byte Folded Reload 343; CHECK-NOFP16-RV64-NEXT: ld s1, 40(sp) # 8-byte Folded Reload 344; CHECK-NOFP16-RV64-NEXT: ld s2, 32(sp) # 8-byte Folded Reload 345; CHECK-NOFP16-RV64-NEXT: ld s3, 24(sp) # 8-byte Folded Reload 346; CHECK-NOFP16-RV64-NEXT: fld fs0, 16(sp) # 8-byte Folded Reload 347; CHECK-NOFP16-RV64-NEXT: fld fs1, 8(sp) # 8-byte Folded Reload 348; CHECK-NOFP16-RV64-NEXT: fld fs2, 0(sp) # 8-byte Folded Reload 349; CHECK-NOFP16-RV64-NEXT: .cfi_restore ra 350; CHECK-NOFP16-RV64-NEXT: .cfi_restore s0 351; CHECK-NOFP16-RV64-NEXT: .cfi_restore s1 352; CHECK-NOFP16-RV64-NEXT: .cfi_restore s2 353; CHECK-NOFP16-RV64-NEXT: .cfi_restore s3 354; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs0 355; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs1 356; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs2 357; CHECK-NOFP16-RV64-NEXT: addi sp, sp, 64 358; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 0 359; CHECK-NOFP16-RV64-NEXT: ret 360; 361; CHECK-FP16-RV32-LABEL: fcanonicalize_v4f16: 362; CHECK-FP16-RV32: # %bb.0: 363; CHECK-FP16-RV32-NEXT: fmin.h fa5, fa0, fa0 364; CHECK-FP16-RV32-NEXT: fmin.h fa4, fa1, fa1 365; CHECK-FP16-RV32-NEXT: fmin.h fa2, fa2, fa2 366; CHECK-FP16-RV32-NEXT: fmin.h fa3, fa3, fa3 367; CHECK-FP16-RV32-NEXT: fsh fa5, 0(a0) 368; CHECK-FP16-RV32-NEXT: fsh fa4, 2(a0) 369; CHECK-FP16-RV32-NEXT: fsh fa2, 4(a0) 370; CHECK-FP16-RV32-NEXT: fsh fa3, 6(a0) 371; CHECK-FP16-RV32-NEXT: ret 372; 373; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v4f16: 374; CHECK-NOFP16-RV32: # %bb.0: 375; CHECK-NOFP16-RV32-NEXT: addi sp, sp, -64 376; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 64 377; CHECK-NOFP16-RV32-NEXT: sw ra, 60(sp) # 4-byte Folded Spill 378; CHECK-NOFP16-RV32-NEXT: sw s0, 56(sp) # 4-byte Folded Spill 379; CHECK-NOFP16-RV32-NEXT: sw s1, 52(sp) # 4-byte Folded Spill 380; CHECK-NOFP16-RV32-NEXT: sw s2, 48(sp) # 4-byte Folded Spill 381; CHECK-NOFP16-RV32-NEXT: sw s3, 44(sp) # 4-byte Folded Spill 382; CHECK-NOFP16-RV32-NEXT: fsd fs0, 32(sp) # 8-byte Folded Spill 383; CHECK-NOFP16-RV32-NEXT: fsd fs1, 24(sp) # 8-byte Folded Spill 384; CHECK-NOFP16-RV32-NEXT: fsd fs2, 16(sp) # 8-byte Folded Spill 385; CHECK-NOFP16-RV32-NEXT: fsd fs3, 8(sp) # 8-byte Folded Spill 386; CHECK-NOFP16-RV32-NEXT: .cfi_offset ra, -4 387; CHECK-NOFP16-RV32-NEXT: .cfi_offset s0, -8 388; CHECK-NOFP16-RV32-NEXT: .cfi_offset s1, -12 389; CHECK-NOFP16-RV32-NEXT: .cfi_offset s2, -16 390; CHECK-NOFP16-RV32-NEXT: .cfi_offset s3, -20 391; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs0, -32 392; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs1, -40 393; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs2, -48 394; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs3, -56 395; CHECK-NOFP16-RV32-NEXT: mv s0, a0 396; CHECK-NOFP16-RV32-NEXT: lhu a0, 0(a1) 397; CHECK-NOFP16-RV32-NEXT: lhu a2, 4(a1) 398; CHECK-NOFP16-RV32-NEXT: lhu a3, 8(a1) 399; CHECK-NOFP16-RV32-NEXT: lhu a1, 12(a1) 400; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs0, a0 401; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs1, a2 402; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs2, a3 403; CHECK-NOFP16-RV32-NEXT: fmv.w.x fa0, a1 404; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 405; CHECK-NOFP16-RV32-NEXT: fmv.s fs3, fa0 406; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs2 407; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 408; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 409; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 410; CHECK-NOFP16-RV32-NEXT: fmv.s fs2, fa0 411; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs1 412; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 413; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 414; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 415; CHECK-NOFP16-RV32-NEXT: fmv.s fs1, fa0 416; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs0 417; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 418; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 419; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 420; CHECK-NOFP16-RV32-NEXT: fmv.x.w s1, fa0 421; CHECK-NOFP16-RV32-NEXT: fmv.x.w s2, fs1 422; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fs3, fs3 423; CHECK-NOFP16-RV32-NEXT: fmv.x.w s3, fs2 424; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 425; CHECK-NOFP16-RV32-NEXT: fmv.x.w a0, fa0 426; CHECK-NOFP16-RV32-NEXT: sh s1, 0(s0) 427; CHECK-NOFP16-RV32-NEXT: sh s2, 2(s0) 428; CHECK-NOFP16-RV32-NEXT: sh s3, 4(s0) 429; CHECK-NOFP16-RV32-NEXT: sh a0, 6(s0) 430; CHECK-NOFP16-RV32-NEXT: lw ra, 60(sp) # 4-byte Folded Reload 431; CHECK-NOFP16-RV32-NEXT: lw s0, 56(sp) # 4-byte Folded Reload 432; CHECK-NOFP16-RV32-NEXT: lw s1, 52(sp) # 4-byte Folded Reload 433; CHECK-NOFP16-RV32-NEXT: lw s2, 48(sp) # 4-byte Folded Reload 434; CHECK-NOFP16-RV32-NEXT: lw s3, 44(sp) # 4-byte Folded Reload 435; CHECK-NOFP16-RV32-NEXT: fld fs0, 32(sp) # 8-byte Folded Reload 436; CHECK-NOFP16-RV32-NEXT: fld fs1, 24(sp) # 8-byte Folded Reload 437; CHECK-NOFP16-RV32-NEXT: fld fs2, 16(sp) # 8-byte Folded Reload 438; CHECK-NOFP16-RV32-NEXT: fld fs3, 8(sp) # 8-byte Folded Reload 439; CHECK-NOFP16-RV32-NEXT: .cfi_restore ra 440; CHECK-NOFP16-RV32-NEXT: .cfi_restore s0 441; CHECK-NOFP16-RV32-NEXT: .cfi_restore s1 442; CHECK-NOFP16-RV32-NEXT: .cfi_restore s2 443; CHECK-NOFP16-RV32-NEXT: .cfi_restore s3 444; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs0 445; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs1 446; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs2 447; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs3 448; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 64 449; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0 450; CHECK-NOFP16-RV32-NEXT: ret 451 %z = call <4 x half> @llvm.canonicalize.v4f16(<4 x half> %x) 452 ret <4 x half> %z 453} 454 455define <4 x half> @fcanonicalize_v4f16_nnan(<4 x half> %x) { 456; CHECK-FP16-RV64-LABEL: fcanonicalize_v4f16_nnan: 457; CHECK-FP16-RV64: # %bb.0: 458; CHECK-FP16-RV64-NEXT: fmin.h fa5, fa0, fa0 459; CHECK-FP16-RV64-NEXT: fmin.h fa4, fa1, fa1 460; CHECK-FP16-RV64-NEXT: fmin.h fa2, fa2, fa2 461; CHECK-FP16-RV64-NEXT: fmin.h fa3, fa3, fa3 462; CHECK-FP16-RV64-NEXT: fsh fa5, 0(a0) 463; CHECK-FP16-RV64-NEXT: fsh fa4, 2(a0) 464; CHECK-FP16-RV64-NEXT: fsh fa2, 4(a0) 465; CHECK-FP16-RV64-NEXT: fsh fa3, 6(a0) 466; CHECK-FP16-RV64-NEXT: ret 467; 468; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v4f16_nnan: 469; CHECK-NOFP16-RV64: # %bb.0: 470; CHECK-NOFP16-RV64-NEXT: addi sp, sp, -64 471; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 64 472; CHECK-NOFP16-RV64-NEXT: sd ra, 56(sp) # 8-byte Folded Spill 473; CHECK-NOFP16-RV64-NEXT: sd s0, 48(sp) # 8-byte Folded Spill 474; CHECK-NOFP16-RV64-NEXT: sd s1, 40(sp) # 8-byte Folded Spill 475; CHECK-NOFP16-RV64-NEXT: sd s2, 32(sp) # 8-byte Folded Spill 476; CHECK-NOFP16-RV64-NEXT: sd s3, 24(sp) # 8-byte Folded Spill 477; CHECK-NOFP16-RV64-NEXT: fsd fs0, 16(sp) # 8-byte Folded Spill 478; CHECK-NOFP16-RV64-NEXT: fsd fs1, 8(sp) # 8-byte Folded Spill 479; CHECK-NOFP16-RV64-NEXT: fsd fs2, 0(sp) # 8-byte Folded Spill 480; CHECK-NOFP16-RV64-NEXT: .cfi_offset ra, -8 481; CHECK-NOFP16-RV64-NEXT: .cfi_offset s0, -16 482; CHECK-NOFP16-RV64-NEXT: .cfi_offset s1, -24 483; CHECK-NOFP16-RV64-NEXT: .cfi_offset s2, -32 484; CHECK-NOFP16-RV64-NEXT: .cfi_offset s3, -40 485; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs0, -48 486; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs1, -56 487; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs2, -64 488; CHECK-NOFP16-RV64-NEXT: lhu s1, 0(a1) 489; CHECK-NOFP16-RV64-NEXT: lhu s2, 8(a1) 490; CHECK-NOFP16-RV64-NEXT: lhu s3, 16(a1) 491; CHECK-NOFP16-RV64-NEXT: lhu a1, 24(a1) 492; CHECK-NOFP16-RV64-NEXT: mv s0, a0 493; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, a1 494; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 495; CHECK-NOFP16-RV64-NEXT: fmv.s fs0, fa0 496; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s3 497; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 498; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 499; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 500; CHECK-NOFP16-RV64-NEXT: fmv.s fs1, fa0 501; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s2 502; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 503; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 504; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 505; CHECK-NOFP16-RV64-NEXT: fmv.s fs2, fa0 506; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s1 507; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 508; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 509; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 510; CHECK-NOFP16-RV64-NEXT: fmv.x.w s1, fa0 511; CHECK-NOFP16-RV64-NEXT: fmv.x.w s2, fs2 512; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fs0, fs0 513; CHECK-NOFP16-RV64-NEXT: fmv.x.w s3, fs1 514; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 515; CHECK-NOFP16-RV64-NEXT: fmv.x.w a0, fa0 516; CHECK-NOFP16-RV64-NEXT: sh s1, 0(s0) 517; CHECK-NOFP16-RV64-NEXT: sh s2, 2(s0) 518; CHECK-NOFP16-RV64-NEXT: sh s3, 4(s0) 519; CHECK-NOFP16-RV64-NEXT: sh a0, 6(s0) 520; CHECK-NOFP16-RV64-NEXT: ld ra, 56(sp) # 8-byte Folded Reload 521; CHECK-NOFP16-RV64-NEXT: ld s0, 48(sp) # 8-byte Folded Reload 522; CHECK-NOFP16-RV64-NEXT: ld s1, 40(sp) # 8-byte Folded Reload 523; CHECK-NOFP16-RV64-NEXT: ld s2, 32(sp) # 8-byte Folded Reload 524; CHECK-NOFP16-RV64-NEXT: ld s3, 24(sp) # 8-byte Folded Reload 525; CHECK-NOFP16-RV64-NEXT: fld fs0, 16(sp) # 8-byte Folded Reload 526; CHECK-NOFP16-RV64-NEXT: fld fs1, 8(sp) # 8-byte Folded Reload 527; CHECK-NOFP16-RV64-NEXT: fld fs2, 0(sp) # 8-byte Folded Reload 528; CHECK-NOFP16-RV64-NEXT: .cfi_restore ra 529; CHECK-NOFP16-RV64-NEXT: .cfi_restore s0 530; CHECK-NOFP16-RV64-NEXT: .cfi_restore s1 531; CHECK-NOFP16-RV64-NEXT: .cfi_restore s2 532; CHECK-NOFP16-RV64-NEXT: .cfi_restore s3 533; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs0 534; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs1 535; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs2 536; CHECK-NOFP16-RV64-NEXT: addi sp, sp, 64 537; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 0 538; CHECK-NOFP16-RV64-NEXT: ret 539; 540; CHECK-FP16-RV32-LABEL: fcanonicalize_v4f16_nnan: 541; CHECK-FP16-RV32: # %bb.0: 542; CHECK-FP16-RV32-NEXT: fmin.h fa5, fa0, fa0 543; CHECK-FP16-RV32-NEXT: fmin.h fa4, fa1, fa1 544; CHECK-FP16-RV32-NEXT: fmin.h fa2, fa2, fa2 545; CHECK-FP16-RV32-NEXT: fmin.h fa3, fa3, fa3 546; CHECK-FP16-RV32-NEXT: fsh fa5, 0(a0) 547; CHECK-FP16-RV32-NEXT: fsh fa4, 2(a0) 548; CHECK-FP16-RV32-NEXT: fsh fa2, 4(a0) 549; CHECK-FP16-RV32-NEXT: fsh fa3, 6(a0) 550; CHECK-FP16-RV32-NEXT: ret 551; 552; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v4f16_nnan: 553; CHECK-NOFP16-RV32: # %bb.0: 554; CHECK-NOFP16-RV32-NEXT: addi sp, sp, -64 555; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 64 556; CHECK-NOFP16-RV32-NEXT: sw ra, 60(sp) # 4-byte Folded Spill 557; CHECK-NOFP16-RV32-NEXT: sw s0, 56(sp) # 4-byte Folded Spill 558; CHECK-NOFP16-RV32-NEXT: sw s1, 52(sp) # 4-byte Folded Spill 559; CHECK-NOFP16-RV32-NEXT: sw s2, 48(sp) # 4-byte Folded Spill 560; CHECK-NOFP16-RV32-NEXT: sw s3, 44(sp) # 4-byte Folded Spill 561; CHECK-NOFP16-RV32-NEXT: fsd fs0, 32(sp) # 8-byte Folded Spill 562; CHECK-NOFP16-RV32-NEXT: fsd fs1, 24(sp) # 8-byte Folded Spill 563; CHECK-NOFP16-RV32-NEXT: fsd fs2, 16(sp) # 8-byte Folded Spill 564; CHECK-NOFP16-RV32-NEXT: fsd fs3, 8(sp) # 8-byte Folded Spill 565; CHECK-NOFP16-RV32-NEXT: .cfi_offset ra, -4 566; CHECK-NOFP16-RV32-NEXT: .cfi_offset s0, -8 567; CHECK-NOFP16-RV32-NEXT: .cfi_offset s1, -12 568; CHECK-NOFP16-RV32-NEXT: .cfi_offset s2, -16 569; CHECK-NOFP16-RV32-NEXT: .cfi_offset s3, -20 570; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs0, -32 571; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs1, -40 572; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs2, -48 573; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs3, -56 574; CHECK-NOFP16-RV32-NEXT: mv s0, a0 575; CHECK-NOFP16-RV32-NEXT: lhu a0, 0(a1) 576; CHECK-NOFP16-RV32-NEXT: lhu a2, 4(a1) 577; CHECK-NOFP16-RV32-NEXT: lhu a3, 8(a1) 578; CHECK-NOFP16-RV32-NEXT: lhu a1, 12(a1) 579; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs0, a0 580; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs1, a2 581; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs2, a3 582; CHECK-NOFP16-RV32-NEXT: fmv.w.x fa0, a1 583; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 584; CHECK-NOFP16-RV32-NEXT: fmv.s fs3, fa0 585; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs2 586; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 587; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 588; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 589; CHECK-NOFP16-RV32-NEXT: fmv.s fs2, fa0 590; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs1 591; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 592; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 593; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 594; CHECK-NOFP16-RV32-NEXT: fmv.s fs1, fa0 595; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs0 596; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 597; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 598; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 599; CHECK-NOFP16-RV32-NEXT: fmv.x.w s1, fa0 600; CHECK-NOFP16-RV32-NEXT: fmv.x.w s2, fs1 601; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fs3, fs3 602; CHECK-NOFP16-RV32-NEXT: fmv.x.w s3, fs2 603; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 604; CHECK-NOFP16-RV32-NEXT: fmv.x.w a0, fa0 605; CHECK-NOFP16-RV32-NEXT: sh s1, 0(s0) 606; CHECK-NOFP16-RV32-NEXT: sh s2, 2(s0) 607; CHECK-NOFP16-RV32-NEXT: sh s3, 4(s0) 608; CHECK-NOFP16-RV32-NEXT: sh a0, 6(s0) 609; CHECK-NOFP16-RV32-NEXT: lw ra, 60(sp) # 4-byte Folded Reload 610; CHECK-NOFP16-RV32-NEXT: lw s0, 56(sp) # 4-byte Folded Reload 611; CHECK-NOFP16-RV32-NEXT: lw s1, 52(sp) # 4-byte Folded Reload 612; CHECK-NOFP16-RV32-NEXT: lw s2, 48(sp) # 4-byte Folded Reload 613; CHECK-NOFP16-RV32-NEXT: lw s3, 44(sp) # 4-byte Folded Reload 614; CHECK-NOFP16-RV32-NEXT: fld fs0, 32(sp) # 8-byte Folded Reload 615; CHECK-NOFP16-RV32-NEXT: fld fs1, 24(sp) # 8-byte Folded Reload 616; CHECK-NOFP16-RV32-NEXT: fld fs2, 16(sp) # 8-byte Folded Reload 617; CHECK-NOFP16-RV32-NEXT: fld fs3, 8(sp) # 8-byte Folded Reload 618; CHECK-NOFP16-RV32-NEXT: .cfi_restore ra 619; CHECK-NOFP16-RV32-NEXT: .cfi_restore s0 620; CHECK-NOFP16-RV32-NEXT: .cfi_restore s1 621; CHECK-NOFP16-RV32-NEXT: .cfi_restore s2 622; CHECK-NOFP16-RV32-NEXT: .cfi_restore s3 623; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs0 624; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs1 625; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs2 626; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs3 627; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 64 628; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0 629; CHECK-NOFP16-RV32-NEXT: ret 630 %z = call nnan <4 x half> @llvm.canonicalize.v4f16(<4 x half> %x) 631 ret <4 x half> %z 632} 633 634define <8 x half> @fcanonicalize_v8f16(<8 x half> %x) { 635; CHECK-FP16-RV64-LABEL: fcanonicalize_v8f16: 636; CHECK-FP16-RV64: # %bb.0: 637; CHECK-FP16-RV64-NEXT: fmin.h fa0, fa0, fa0 638; CHECK-FP16-RV64-NEXT: fmin.h fa1, fa1, fa1 639; CHECK-FP16-RV64-NEXT: fmin.h fa2, fa2, fa2 640; CHECK-FP16-RV64-NEXT: fmin.h fa3, fa3, fa3 641; CHECK-FP16-RV64-NEXT: fmin.h fa4, fa4, fa4 642; CHECK-FP16-RV64-NEXT: fmin.h fa5, fa5, fa5 643; CHECK-FP16-RV64-NEXT: fmin.h ft0, fa6, fa6 644; CHECK-FP16-RV64-NEXT: fmin.h ft1, fa7, fa7 645; CHECK-FP16-RV64-NEXT: fsh fa4, 8(a0) 646; CHECK-FP16-RV64-NEXT: fsh fa5, 10(a0) 647; CHECK-FP16-RV64-NEXT: fsh ft0, 12(a0) 648; CHECK-FP16-RV64-NEXT: fsh ft1, 14(a0) 649; CHECK-FP16-RV64-NEXT: fsh fa0, 0(a0) 650; CHECK-FP16-RV64-NEXT: fsh fa1, 2(a0) 651; CHECK-FP16-RV64-NEXT: fsh fa2, 4(a0) 652; CHECK-FP16-RV64-NEXT: fsh fa3, 6(a0) 653; CHECK-FP16-RV64-NEXT: ret 654; 655; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v8f16: 656; CHECK-NOFP16-RV64: # %bb.0: 657; CHECK-NOFP16-RV64-NEXT: addi sp, sp, -128 658; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 128 659; CHECK-NOFP16-RV64-NEXT: sd ra, 120(sp) # 8-byte Folded Spill 660; CHECK-NOFP16-RV64-NEXT: sd s0, 112(sp) # 8-byte Folded Spill 661; CHECK-NOFP16-RV64-NEXT: sd s1, 104(sp) # 8-byte Folded Spill 662; CHECK-NOFP16-RV64-NEXT: sd s2, 96(sp) # 8-byte Folded Spill 663; CHECK-NOFP16-RV64-NEXT: sd s3, 88(sp) # 8-byte Folded Spill 664; CHECK-NOFP16-RV64-NEXT: sd s4, 80(sp) # 8-byte Folded Spill 665; CHECK-NOFP16-RV64-NEXT: sd s5, 72(sp) # 8-byte Folded Spill 666; CHECK-NOFP16-RV64-NEXT: sd s6, 64(sp) # 8-byte Folded Spill 667; CHECK-NOFP16-RV64-NEXT: sd s7, 56(sp) # 8-byte Folded Spill 668; CHECK-NOFP16-RV64-NEXT: fsd fs0, 48(sp) # 8-byte Folded Spill 669; CHECK-NOFP16-RV64-NEXT: fsd fs1, 40(sp) # 8-byte Folded Spill 670; CHECK-NOFP16-RV64-NEXT: fsd fs2, 32(sp) # 8-byte Folded Spill 671; CHECK-NOFP16-RV64-NEXT: fsd fs3, 24(sp) # 8-byte Folded Spill 672; CHECK-NOFP16-RV64-NEXT: fsd fs4, 16(sp) # 8-byte Folded Spill 673; CHECK-NOFP16-RV64-NEXT: fsd fs5, 8(sp) # 8-byte Folded Spill 674; CHECK-NOFP16-RV64-NEXT: fsd fs6, 0(sp) # 8-byte Folded Spill 675; CHECK-NOFP16-RV64-NEXT: .cfi_offset ra, -8 676; CHECK-NOFP16-RV64-NEXT: .cfi_offset s0, -16 677; CHECK-NOFP16-RV64-NEXT: .cfi_offset s1, -24 678; CHECK-NOFP16-RV64-NEXT: .cfi_offset s2, -32 679; CHECK-NOFP16-RV64-NEXT: .cfi_offset s3, -40 680; CHECK-NOFP16-RV64-NEXT: .cfi_offset s4, -48 681; CHECK-NOFP16-RV64-NEXT: .cfi_offset s5, -56 682; CHECK-NOFP16-RV64-NEXT: .cfi_offset s6, -64 683; CHECK-NOFP16-RV64-NEXT: .cfi_offset s7, -72 684; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs0, -80 685; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs1, -88 686; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs2, -96 687; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs3, -104 688; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs4, -112 689; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs5, -120 690; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs6, -128 691; CHECK-NOFP16-RV64-NEXT: lhu s1, 0(a1) 692; CHECK-NOFP16-RV64-NEXT: lhu s2, 8(a1) 693; CHECK-NOFP16-RV64-NEXT: lhu s3, 16(a1) 694; CHECK-NOFP16-RV64-NEXT: lhu s4, 24(a1) 695; CHECK-NOFP16-RV64-NEXT: lhu s5, 32(a1) 696; CHECK-NOFP16-RV64-NEXT: lhu s6, 40(a1) 697; CHECK-NOFP16-RV64-NEXT: lhu s7, 48(a1) 698; CHECK-NOFP16-RV64-NEXT: lhu a1, 56(a1) 699; CHECK-NOFP16-RV64-NEXT: mv s0, a0 700; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, a1 701; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 702; CHECK-NOFP16-RV64-NEXT: fmv.s fs0, fa0 703; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s7 704; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 705; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 706; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 707; CHECK-NOFP16-RV64-NEXT: fmv.s fs1, fa0 708; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s6 709; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 710; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 711; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 712; CHECK-NOFP16-RV64-NEXT: fmv.s fs2, fa0 713; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s5 714; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 715; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 716; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 717; CHECK-NOFP16-RV64-NEXT: fmv.s fs3, fa0 718; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s4 719; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 720; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 721; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 722; CHECK-NOFP16-RV64-NEXT: fmv.s fs4, fa0 723; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s3 724; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 725; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 726; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 727; CHECK-NOFP16-RV64-NEXT: fmv.s fs5, fa0 728; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s2 729; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 730; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 731; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 732; CHECK-NOFP16-RV64-NEXT: fmv.s fs6, fa0 733; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s1 734; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 735; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 736; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 737; CHECK-NOFP16-RV64-NEXT: fmv.x.w s1, fa0 738; CHECK-NOFP16-RV64-NEXT: fmv.x.w s2, fs6 739; CHECK-NOFP16-RV64-NEXT: fmv.x.w s3, fs5 740; CHECK-NOFP16-RV64-NEXT: fmv.x.w s4, fs4 741; CHECK-NOFP16-RV64-NEXT: fmv.x.w s5, fs3 742; CHECK-NOFP16-RV64-NEXT: fmv.x.w s6, fs2 743; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fs0, fs0 744; CHECK-NOFP16-RV64-NEXT: fmv.x.w s7, fs1 745; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 746; CHECK-NOFP16-RV64-NEXT: fmv.x.w a0, fa0 747; CHECK-NOFP16-RV64-NEXT: sh s5, 8(s0) 748; CHECK-NOFP16-RV64-NEXT: sh s6, 10(s0) 749; CHECK-NOFP16-RV64-NEXT: sh s7, 12(s0) 750; CHECK-NOFP16-RV64-NEXT: sh a0, 14(s0) 751; CHECK-NOFP16-RV64-NEXT: sh s1, 0(s0) 752; CHECK-NOFP16-RV64-NEXT: sh s2, 2(s0) 753; CHECK-NOFP16-RV64-NEXT: sh s3, 4(s0) 754; CHECK-NOFP16-RV64-NEXT: sh s4, 6(s0) 755; CHECK-NOFP16-RV64-NEXT: ld ra, 120(sp) # 8-byte Folded Reload 756; CHECK-NOFP16-RV64-NEXT: ld s0, 112(sp) # 8-byte Folded Reload 757; CHECK-NOFP16-RV64-NEXT: ld s1, 104(sp) # 8-byte Folded Reload 758; CHECK-NOFP16-RV64-NEXT: ld s2, 96(sp) # 8-byte Folded Reload 759; CHECK-NOFP16-RV64-NEXT: ld s3, 88(sp) # 8-byte Folded Reload 760; CHECK-NOFP16-RV64-NEXT: ld s4, 80(sp) # 8-byte Folded Reload 761; CHECK-NOFP16-RV64-NEXT: ld s5, 72(sp) # 8-byte Folded Reload 762; CHECK-NOFP16-RV64-NEXT: ld s6, 64(sp) # 8-byte Folded Reload 763; CHECK-NOFP16-RV64-NEXT: ld s7, 56(sp) # 8-byte Folded Reload 764; CHECK-NOFP16-RV64-NEXT: fld fs0, 48(sp) # 8-byte Folded Reload 765; CHECK-NOFP16-RV64-NEXT: fld fs1, 40(sp) # 8-byte Folded Reload 766; CHECK-NOFP16-RV64-NEXT: fld fs2, 32(sp) # 8-byte Folded Reload 767; CHECK-NOFP16-RV64-NEXT: fld fs3, 24(sp) # 8-byte Folded Reload 768; CHECK-NOFP16-RV64-NEXT: fld fs4, 16(sp) # 8-byte Folded Reload 769; CHECK-NOFP16-RV64-NEXT: fld fs5, 8(sp) # 8-byte Folded Reload 770; CHECK-NOFP16-RV64-NEXT: fld fs6, 0(sp) # 8-byte Folded Reload 771; CHECK-NOFP16-RV64-NEXT: .cfi_restore ra 772; CHECK-NOFP16-RV64-NEXT: .cfi_restore s0 773; CHECK-NOFP16-RV64-NEXT: .cfi_restore s1 774; CHECK-NOFP16-RV64-NEXT: .cfi_restore s2 775; CHECK-NOFP16-RV64-NEXT: .cfi_restore s3 776; CHECK-NOFP16-RV64-NEXT: .cfi_restore s4 777; CHECK-NOFP16-RV64-NEXT: .cfi_restore s5 778; CHECK-NOFP16-RV64-NEXT: .cfi_restore s6 779; CHECK-NOFP16-RV64-NEXT: .cfi_restore s7 780; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs0 781; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs1 782; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs2 783; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs3 784; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs4 785; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs5 786; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs6 787; CHECK-NOFP16-RV64-NEXT: addi sp, sp, 128 788; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 0 789; CHECK-NOFP16-RV64-NEXT: ret 790; 791; CHECK-FP16-RV32-LABEL: fcanonicalize_v8f16: 792; CHECK-FP16-RV32: # %bb.0: 793; CHECK-FP16-RV32-NEXT: fmin.h fa0, fa0, fa0 794; CHECK-FP16-RV32-NEXT: fmin.h fa1, fa1, fa1 795; CHECK-FP16-RV32-NEXT: fmin.h fa2, fa2, fa2 796; CHECK-FP16-RV32-NEXT: fmin.h fa3, fa3, fa3 797; CHECK-FP16-RV32-NEXT: fmin.h fa4, fa4, fa4 798; CHECK-FP16-RV32-NEXT: fmin.h fa5, fa5, fa5 799; CHECK-FP16-RV32-NEXT: fmin.h ft0, fa6, fa6 800; CHECK-FP16-RV32-NEXT: fmin.h ft1, fa7, fa7 801; CHECK-FP16-RV32-NEXT: fsh fa4, 8(a0) 802; CHECK-FP16-RV32-NEXT: fsh fa5, 10(a0) 803; CHECK-FP16-RV32-NEXT: fsh ft0, 12(a0) 804; CHECK-FP16-RV32-NEXT: fsh ft1, 14(a0) 805; CHECK-FP16-RV32-NEXT: fsh fa0, 0(a0) 806; CHECK-FP16-RV32-NEXT: fsh fa1, 2(a0) 807; CHECK-FP16-RV32-NEXT: fsh fa2, 4(a0) 808; CHECK-FP16-RV32-NEXT: fsh fa3, 6(a0) 809; CHECK-FP16-RV32-NEXT: ret 810; 811; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v8f16: 812; CHECK-NOFP16-RV32: # %bb.0: 813; CHECK-NOFP16-RV32-NEXT: addi sp, sp, -112 814; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 112 815; CHECK-NOFP16-RV32-NEXT: sw ra, 108(sp) # 4-byte Folded Spill 816; CHECK-NOFP16-RV32-NEXT: sw s0, 104(sp) # 4-byte Folded Spill 817; CHECK-NOFP16-RV32-NEXT: sw s1, 100(sp) # 4-byte Folded Spill 818; CHECK-NOFP16-RV32-NEXT: sw s2, 96(sp) # 4-byte Folded Spill 819; CHECK-NOFP16-RV32-NEXT: sw s3, 92(sp) # 4-byte Folded Spill 820; CHECK-NOFP16-RV32-NEXT: sw s4, 88(sp) # 4-byte Folded Spill 821; CHECK-NOFP16-RV32-NEXT: sw s5, 84(sp) # 4-byte Folded Spill 822; CHECK-NOFP16-RV32-NEXT: sw s6, 80(sp) # 4-byte Folded Spill 823; CHECK-NOFP16-RV32-NEXT: sw s7, 76(sp) # 4-byte Folded Spill 824; CHECK-NOFP16-RV32-NEXT: fsd fs0, 64(sp) # 8-byte Folded Spill 825; CHECK-NOFP16-RV32-NEXT: fsd fs1, 56(sp) # 8-byte Folded Spill 826; CHECK-NOFP16-RV32-NEXT: fsd fs2, 48(sp) # 8-byte Folded Spill 827; CHECK-NOFP16-RV32-NEXT: fsd fs3, 40(sp) # 8-byte Folded Spill 828; CHECK-NOFP16-RV32-NEXT: fsd fs4, 32(sp) # 8-byte Folded Spill 829; CHECK-NOFP16-RV32-NEXT: fsd fs5, 24(sp) # 8-byte Folded Spill 830; CHECK-NOFP16-RV32-NEXT: fsd fs6, 16(sp) # 8-byte Folded Spill 831; CHECK-NOFP16-RV32-NEXT: fsd fs7, 8(sp) # 8-byte Folded Spill 832; CHECK-NOFP16-RV32-NEXT: .cfi_offset ra, -4 833; CHECK-NOFP16-RV32-NEXT: .cfi_offset s0, -8 834; CHECK-NOFP16-RV32-NEXT: .cfi_offset s1, -12 835; CHECK-NOFP16-RV32-NEXT: .cfi_offset s2, -16 836; CHECK-NOFP16-RV32-NEXT: .cfi_offset s3, -20 837; CHECK-NOFP16-RV32-NEXT: .cfi_offset s4, -24 838; CHECK-NOFP16-RV32-NEXT: .cfi_offset s5, -28 839; CHECK-NOFP16-RV32-NEXT: .cfi_offset s6, -32 840; CHECK-NOFP16-RV32-NEXT: .cfi_offset s7, -36 841; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs0, -48 842; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs1, -56 843; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs2, -64 844; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs3, -72 845; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs4, -80 846; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs5, -88 847; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs6, -96 848; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs7, -104 849; CHECK-NOFP16-RV32-NEXT: mv s0, a0 850; CHECK-NOFP16-RV32-NEXT: lhu a0, 0(a1) 851; CHECK-NOFP16-RV32-NEXT: lhu a2, 4(a1) 852; CHECK-NOFP16-RV32-NEXT: lhu a3, 8(a1) 853; CHECK-NOFP16-RV32-NEXT: lhu a4, 12(a1) 854; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs0, a0 855; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs2, a2 856; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs4, a3 857; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs5, a4 858; CHECK-NOFP16-RV32-NEXT: lhu a0, 16(a1) 859; CHECK-NOFP16-RV32-NEXT: lhu a2, 20(a1) 860; CHECK-NOFP16-RV32-NEXT: lhu a3, 24(a1) 861; CHECK-NOFP16-RV32-NEXT: lhu a1, 28(a1) 862; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs6, a0 863; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs7, a2 864; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs3, a3 865; CHECK-NOFP16-RV32-NEXT: fmv.w.x fa0, a1 866; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 867; CHECK-NOFP16-RV32-NEXT: fmv.s fs1, fa0 868; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs3 869; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 870; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 871; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 872; CHECK-NOFP16-RV32-NEXT: fmv.s fs3, fa0 873; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs7 874; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 875; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 876; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 877; CHECK-NOFP16-RV32-NEXT: fmv.s fs7, fa0 878; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs6 879; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 880; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 881; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 882; CHECK-NOFP16-RV32-NEXT: fmv.s fs6, fa0 883; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs5 884; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 885; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 886; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 887; CHECK-NOFP16-RV32-NEXT: fmv.s fs5, fa0 888; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs4 889; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 890; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 891; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 892; CHECK-NOFP16-RV32-NEXT: fmv.s fs4, fa0 893; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs2 894; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 895; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 896; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 897; CHECK-NOFP16-RV32-NEXT: fmv.s fs2, fa0 898; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs0 899; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 900; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 901; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 902; CHECK-NOFP16-RV32-NEXT: fmv.x.w s1, fa0 903; CHECK-NOFP16-RV32-NEXT: fmv.x.w s2, fs2 904; CHECK-NOFP16-RV32-NEXT: fmv.x.w s3, fs4 905; CHECK-NOFP16-RV32-NEXT: fmv.x.w s4, fs5 906; CHECK-NOFP16-RV32-NEXT: fmv.x.w s5, fs6 907; CHECK-NOFP16-RV32-NEXT: fmv.x.w s6, fs7 908; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fs1, fs1 909; CHECK-NOFP16-RV32-NEXT: fmv.x.w s7, fs3 910; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 911; CHECK-NOFP16-RV32-NEXT: fmv.x.w a0, fa0 912; CHECK-NOFP16-RV32-NEXT: sh s5, 8(s0) 913; CHECK-NOFP16-RV32-NEXT: sh s6, 10(s0) 914; CHECK-NOFP16-RV32-NEXT: sh s7, 12(s0) 915; CHECK-NOFP16-RV32-NEXT: sh a0, 14(s0) 916; CHECK-NOFP16-RV32-NEXT: sh s1, 0(s0) 917; CHECK-NOFP16-RV32-NEXT: sh s2, 2(s0) 918; CHECK-NOFP16-RV32-NEXT: sh s3, 4(s0) 919; CHECK-NOFP16-RV32-NEXT: sh s4, 6(s0) 920; CHECK-NOFP16-RV32-NEXT: lw ra, 108(sp) # 4-byte Folded Reload 921; CHECK-NOFP16-RV32-NEXT: lw s0, 104(sp) # 4-byte Folded Reload 922; CHECK-NOFP16-RV32-NEXT: lw s1, 100(sp) # 4-byte Folded Reload 923; CHECK-NOFP16-RV32-NEXT: lw s2, 96(sp) # 4-byte Folded Reload 924; CHECK-NOFP16-RV32-NEXT: lw s3, 92(sp) # 4-byte Folded Reload 925; CHECK-NOFP16-RV32-NEXT: lw s4, 88(sp) # 4-byte Folded Reload 926; CHECK-NOFP16-RV32-NEXT: lw s5, 84(sp) # 4-byte Folded Reload 927; CHECK-NOFP16-RV32-NEXT: lw s6, 80(sp) # 4-byte Folded Reload 928; CHECK-NOFP16-RV32-NEXT: lw s7, 76(sp) # 4-byte Folded Reload 929; CHECK-NOFP16-RV32-NEXT: fld fs0, 64(sp) # 8-byte Folded Reload 930; CHECK-NOFP16-RV32-NEXT: fld fs1, 56(sp) # 8-byte Folded Reload 931; CHECK-NOFP16-RV32-NEXT: fld fs2, 48(sp) # 8-byte Folded Reload 932; CHECK-NOFP16-RV32-NEXT: fld fs3, 40(sp) # 8-byte Folded Reload 933; CHECK-NOFP16-RV32-NEXT: fld fs4, 32(sp) # 8-byte Folded Reload 934; CHECK-NOFP16-RV32-NEXT: fld fs5, 24(sp) # 8-byte Folded Reload 935; CHECK-NOFP16-RV32-NEXT: fld fs6, 16(sp) # 8-byte Folded Reload 936; CHECK-NOFP16-RV32-NEXT: fld fs7, 8(sp) # 8-byte Folded Reload 937; CHECK-NOFP16-RV32-NEXT: .cfi_restore ra 938; CHECK-NOFP16-RV32-NEXT: .cfi_restore s0 939; CHECK-NOFP16-RV32-NEXT: .cfi_restore s1 940; CHECK-NOFP16-RV32-NEXT: .cfi_restore s2 941; CHECK-NOFP16-RV32-NEXT: .cfi_restore s3 942; CHECK-NOFP16-RV32-NEXT: .cfi_restore s4 943; CHECK-NOFP16-RV32-NEXT: .cfi_restore s5 944; CHECK-NOFP16-RV32-NEXT: .cfi_restore s6 945; CHECK-NOFP16-RV32-NEXT: .cfi_restore s7 946; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs0 947; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs1 948; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs2 949; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs3 950; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs4 951; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs5 952; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs6 953; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs7 954; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 112 955; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0 956; CHECK-NOFP16-RV32-NEXT: ret 957 %z = call <8 x half> @llvm.canonicalize.v8f16(<8 x half> %x) 958 ret <8 x half> %z 959} 960 961define <8 x half> @fcanonicalize_v8f16_nnan(<8 x half> %x) { 962; CHECK-FP16-RV64-LABEL: fcanonicalize_v8f16_nnan: 963; CHECK-FP16-RV64: # %bb.0: 964; CHECK-FP16-RV64-NEXT: fmin.h fa0, fa0, fa0 965; CHECK-FP16-RV64-NEXT: fmin.h fa1, fa1, fa1 966; CHECK-FP16-RV64-NEXT: fmin.h fa2, fa2, fa2 967; CHECK-FP16-RV64-NEXT: fmin.h fa3, fa3, fa3 968; CHECK-FP16-RV64-NEXT: fmin.h fa4, fa4, fa4 969; CHECK-FP16-RV64-NEXT: fmin.h fa5, fa5, fa5 970; CHECK-FP16-RV64-NEXT: fmin.h ft0, fa6, fa6 971; CHECK-FP16-RV64-NEXT: fmin.h ft1, fa7, fa7 972; CHECK-FP16-RV64-NEXT: fsh fa4, 8(a0) 973; CHECK-FP16-RV64-NEXT: fsh fa5, 10(a0) 974; CHECK-FP16-RV64-NEXT: fsh ft0, 12(a0) 975; CHECK-FP16-RV64-NEXT: fsh ft1, 14(a0) 976; CHECK-FP16-RV64-NEXT: fsh fa0, 0(a0) 977; CHECK-FP16-RV64-NEXT: fsh fa1, 2(a0) 978; CHECK-FP16-RV64-NEXT: fsh fa2, 4(a0) 979; CHECK-FP16-RV64-NEXT: fsh fa3, 6(a0) 980; CHECK-FP16-RV64-NEXT: ret 981; 982; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v8f16_nnan: 983; CHECK-NOFP16-RV64: # %bb.0: 984; CHECK-NOFP16-RV64-NEXT: addi sp, sp, -128 985; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 128 986; CHECK-NOFP16-RV64-NEXT: sd ra, 120(sp) # 8-byte Folded Spill 987; CHECK-NOFP16-RV64-NEXT: sd s0, 112(sp) # 8-byte Folded Spill 988; CHECK-NOFP16-RV64-NEXT: sd s1, 104(sp) # 8-byte Folded Spill 989; CHECK-NOFP16-RV64-NEXT: sd s2, 96(sp) # 8-byte Folded Spill 990; CHECK-NOFP16-RV64-NEXT: sd s3, 88(sp) # 8-byte Folded Spill 991; CHECK-NOFP16-RV64-NEXT: sd s4, 80(sp) # 8-byte Folded Spill 992; CHECK-NOFP16-RV64-NEXT: sd s5, 72(sp) # 8-byte Folded Spill 993; CHECK-NOFP16-RV64-NEXT: sd s6, 64(sp) # 8-byte Folded Spill 994; CHECK-NOFP16-RV64-NEXT: sd s7, 56(sp) # 8-byte Folded Spill 995; CHECK-NOFP16-RV64-NEXT: fsd fs0, 48(sp) # 8-byte Folded Spill 996; CHECK-NOFP16-RV64-NEXT: fsd fs1, 40(sp) # 8-byte Folded Spill 997; CHECK-NOFP16-RV64-NEXT: fsd fs2, 32(sp) # 8-byte Folded Spill 998; CHECK-NOFP16-RV64-NEXT: fsd fs3, 24(sp) # 8-byte Folded Spill 999; CHECK-NOFP16-RV64-NEXT: fsd fs4, 16(sp) # 8-byte Folded Spill 1000; CHECK-NOFP16-RV64-NEXT: fsd fs5, 8(sp) # 8-byte Folded Spill 1001; CHECK-NOFP16-RV64-NEXT: fsd fs6, 0(sp) # 8-byte Folded Spill 1002; CHECK-NOFP16-RV64-NEXT: .cfi_offset ra, -8 1003; CHECK-NOFP16-RV64-NEXT: .cfi_offset s0, -16 1004; CHECK-NOFP16-RV64-NEXT: .cfi_offset s1, -24 1005; CHECK-NOFP16-RV64-NEXT: .cfi_offset s2, -32 1006; CHECK-NOFP16-RV64-NEXT: .cfi_offset s3, -40 1007; CHECK-NOFP16-RV64-NEXT: .cfi_offset s4, -48 1008; CHECK-NOFP16-RV64-NEXT: .cfi_offset s5, -56 1009; CHECK-NOFP16-RV64-NEXT: .cfi_offset s6, -64 1010; CHECK-NOFP16-RV64-NEXT: .cfi_offset s7, -72 1011; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs0, -80 1012; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs1, -88 1013; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs2, -96 1014; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs3, -104 1015; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs4, -112 1016; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs5, -120 1017; CHECK-NOFP16-RV64-NEXT: .cfi_offset fs6, -128 1018; CHECK-NOFP16-RV64-NEXT: lhu s1, 0(a1) 1019; CHECK-NOFP16-RV64-NEXT: lhu s2, 8(a1) 1020; CHECK-NOFP16-RV64-NEXT: lhu s3, 16(a1) 1021; CHECK-NOFP16-RV64-NEXT: lhu s4, 24(a1) 1022; CHECK-NOFP16-RV64-NEXT: lhu s5, 32(a1) 1023; CHECK-NOFP16-RV64-NEXT: lhu s6, 40(a1) 1024; CHECK-NOFP16-RV64-NEXT: lhu s7, 48(a1) 1025; CHECK-NOFP16-RV64-NEXT: lhu a1, 56(a1) 1026; CHECK-NOFP16-RV64-NEXT: mv s0, a0 1027; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, a1 1028; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 1029; CHECK-NOFP16-RV64-NEXT: fmv.s fs0, fa0 1030; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s7 1031; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 1032; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 1033; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 1034; CHECK-NOFP16-RV64-NEXT: fmv.s fs1, fa0 1035; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s6 1036; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 1037; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 1038; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 1039; CHECK-NOFP16-RV64-NEXT: fmv.s fs2, fa0 1040; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s5 1041; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 1042; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 1043; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 1044; CHECK-NOFP16-RV64-NEXT: fmv.s fs3, fa0 1045; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s4 1046; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 1047; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 1048; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 1049; CHECK-NOFP16-RV64-NEXT: fmv.s fs4, fa0 1050; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s3 1051; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 1052; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 1053; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 1054; CHECK-NOFP16-RV64-NEXT: fmv.s fs5, fa0 1055; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s2 1056; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 1057; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 1058; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 1059; CHECK-NOFP16-RV64-NEXT: fmv.s fs6, fa0 1060; CHECK-NOFP16-RV64-NEXT: fmv.w.x fa0, s1 1061; CHECK-NOFP16-RV64-NEXT: call __extendhfsf2 1062; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fa0, fa0 1063; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 1064; CHECK-NOFP16-RV64-NEXT: fmv.x.w s1, fa0 1065; CHECK-NOFP16-RV64-NEXT: fmv.x.w s2, fs6 1066; CHECK-NOFP16-RV64-NEXT: fmv.x.w s3, fs5 1067; CHECK-NOFP16-RV64-NEXT: fmv.x.w s4, fs4 1068; CHECK-NOFP16-RV64-NEXT: fmv.x.w s5, fs3 1069; CHECK-NOFP16-RV64-NEXT: fmv.x.w s6, fs2 1070; CHECK-NOFP16-RV64-NEXT: fmin.s fa0, fs0, fs0 1071; CHECK-NOFP16-RV64-NEXT: fmv.x.w s7, fs1 1072; CHECK-NOFP16-RV64-NEXT: call __truncsfhf2 1073; CHECK-NOFP16-RV64-NEXT: fmv.x.w a0, fa0 1074; CHECK-NOFP16-RV64-NEXT: sh s5, 8(s0) 1075; CHECK-NOFP16-RV64-NEXT: sh s6, 10(s0) 1076; CHECK-NOFP16-RV64-NEXT: sh s7, 12(s0) 1077; CHECK-NOFP16-RV64-NEXT: sh a0, 14(s0) 1078; CHECK-NOFP16-RV64-NEXT: sh s1, 0(s0) 1079; CHECK-NOFP16-RV64-NEXT: sh s2, 2(s0) 1080; CHECK-NOFP16-RV64-NEXT: sh s3, 4(s0) 1081; CHECK-NOFP16-RV64-NEXT: sh s4, 6(s0) 1082; CHECK-NOFP16-RV64-NEXT: ld ra, 120(sp) # 8-byte Folded Reload 1083; CHECK-NOFP16-RV64-NEXT: ld s0, 112(sp) # 8-byte Folded Reload 1084; CHECK-NOFP16-RV64-NEXT: ld s1, 104(sp) # 8-byte Folded Reload 1085; CHECK-NOFP16-RV64-NEXT: ld s2, 96(sp) # 8-byte Folded Reload 1086; CHECK-NOFP16-RV64-NEXT: ld s3, 88(sp) # 8-byte Folded Reload 1087; CHECK-NOFP16-RV64-NEXT: ld s4, 80(sp) # 8-byte Folded Reload 1088; CHECK-NOFP16-RV64-NEXT: ld s5, 72(sp) # 8-byte Folded Reload 1089; CHECK-NOFP16-RV64-NEXT: ld s6, 64(sp) # 8-byte Folded Reload 1090; CHECK-NOFP16-RV64-NEXT: ld s7, 56(sp) # 8-byte Folded Reload 1091; CHECK-NOFP16-RV64-NEXT: fld fs0, 48(sp) # 8-byte Folded Reload 1092; CHECK-NOFP16-RV64-NEXT: fld fs1, 40(sp) # 8-byte Folded Reload 1093; CHECK-NOFP16-RV64-NEXT: fld fs2, 32(sp) # 8-byte Folded Reload 1094; CHECK-NOFP16-RV64-NEXT: fld fs3, 24(sp) # 8-byte Folded Reload 1095; CHECK-NOFP16-RV64-NEXT: fld fs4, 16(sp) # 8-byte Folded Reload 1096; CHECK-NOFP16-RV64-NEXT: fld fs5, 8(sp) # 8-byte Folded Reload 1097; CHECK-NOFP16-RV64-NEXT: fld fs6, 0(sp) # 8-byte Folded Reload 1098; CHECK-NOFP16-RV64-NEXT: .cfi_restore ra 1099; CHECK-NOFP16-RV64-NEXT: .cfi_restore s0 1100; CHECK-NOFP16-RV64-NEXT: .cfi_restore s1 1101; CHECK-NOFP16-RV64-NEXT: .cfi_restore s2 1102; CHECK-NOFP16-RV64-NEXT: .cfi_restore s3 1103; CHECK-NOFP16-RV64-NEXT: .cfi_restore s4 1104; CHECK-NOFP16-RV64-NEXT: .cfi_restore s5 1105; CHECK-NOFP16-RV64-NEXT: .cfi_restore s6 1106; CHECK-NOFP16-RV64-NEXT: .cfi_restore s7 1107; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs0 1108; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs1 1109; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs2 1110; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs3 1111; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs4 1112; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs5 1113; CHECK-NOFP16-RV64-NEXT: .cfi_restore fs6 1114; CHECK-NOFP16-RV64-NEXT: addi sp, sp, 128 1115; CHECK-NOFP16-RV64-NEXT: .cfi_def_cfa_offset 0 1116; CHECK-NOFP16-RV64-NEXT: ret 1117; 1118; CHECK-FP16-RV32-LABEL: fcanonicalize_v8f16_nnan: 1119; CHECK-FP16-RV32: # %bb.0: 1120; CHECK-FP16-RV32-NEXT: fmin.h fa0, fa0, fa0 1121; CHECK-FP16-RV32-NEXT: fmin.h fa1, fa1, fa1 1122; CHECK-FP16-RV32-NEXT: fmin.h fa2, fa2, fa2 1123; CHECK-FP16-RV32-NEXT: fmin.h fa3, fa3, fa3 1124; CHECK-FP16-RV32-NEXT: fmin.h fa4, fa4, fa4 1125; CHECK-FP16-RV32-NEXT: fmin.h fa5, fa5, fa5 1126; CHECK-FP16-RV32-NEXT: fmin.h ft0, fa6, fa6 1127; CHECK-FP16-RV32-NEXT: fmin.h ft1, fa7, fa7 1128; CHECK-FP16-RV32-NEXT: fsh fa4, 8(a0) 1129; CHECK-FP16-RV32-NEXT: fsh fa5, 10(a0) 1130; CHECK-FP16-RV32-NEXT: fsh ft0, 12(a0) 1131; CHECK-FP16-RV32-NEXT: fsh ft1, 14(a0) 1132; CHECK-FP16-RV32-NEXT: fsh fa0, 0(a0) 1133; CHECK-FP16-RV32-NEXT: fsh fa1, 2(a0) 1134; CHECK-FP16-RV32-NEXT: fsh fa2, 4(a0) 1135; CHECK-FP16-RV32-NEXT: fsh fa3, 6(a0) 1136; CHECK-FP16-RV32-NEXT: ret 1137; 1138; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v8f16_nnan: 1139; CHECK-NOFP16-RV32: # %bb.0: 1140; CHECK-NOFP16-RV32-NEXT: addi sp, sp, -112 1141; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 112 1142; CHECK-NOFP16-RV32-NEXT: sw ra, 108(sp) # 4-byte Folded Spill 1143; CHECK-NOFP16-RV32-NEXT: sw s0, 104(sp) # 4-byte Folded Spill 1144; CHECK-NOFP16-RV32-NEXT: sw s1, 100(sp) # 4-byte Folded Spill 1145; CHECK-NOFP16-RV32-NEXT: sw s2, 96(sp) # 4-byte Folded Spill 1146; CHECK-NOFP16-RV32-NEXT: sw s3, 92(sp) # 4-byte Folded Spill 1147; CHECK-NOFP16-RV32-NEXT: sw s4, 88(sp) # 4-byte Folded Spill 1148; CHECK-NOFP16-RV32-NEXT: sw s5, 84(sp) # 4-byte Folded Spill 1149; CHECK-NOFP16-RV32-NEXT: sw s6, 80(sp) # 4-byte Folded Spill 1150; CHECK-NOFP16-RV32-NEXT: sw s7, 76(sp) # 4-byte Folded Spill 1151; CHECK-NOFP16-RV32-NEXT: fsd fs0, 64(sp) # 8-byte Folded Spill 1152; CHECK-NOFP16-RV32-NEXT: fsd fs1, 56(sp) # 8-byte Folded Spill 1153; CHECK-NOFP16-RV32-NEXT: fsd fs2, 48(sp) # 8-byte Folded Spill 1154; CHECK-NOFP16-RV32-NEXT: fsd fs3, 40(sp) # 8-byte Folded Spill 1155; CHECK-NOFP16-RV32-NEXT: fsd fs4, 32(sp) # 8-byte Folded Spill 1156; CHECK-NOFP16-RV32-NEXT: fsd fs5, 24(sp) # 8-byte Folded Spill 1157; CHECK-NOFP16-RV32-NEXT: fsd fs6, 16(sp) # 8-byte Folded Spill 1158; CHECK-NOFP16-RV32-NEXT: fsd fs7, 8(sp) # 8-byte Folded Spill 1159; CHECK-NOFP16-RV32-NEXT: .cfi_offset ra, -4 1160; CHECK-NOFP16-RV32-NEXT: .cfi_offset s0, -8 1161; CHECK-NOFP16-RV32-NEXT: .cfi_offset s1, -12 1162; CHECK-NOFP16-RV32-NEXT: .cfi_offset s2, -16 1163; CHECK-NOFP16-RV32-NEXT: .cfi_offset s3, -20 1164; CHECK-NOFP16-RV32-NEXT: .cfi_offset s4, -24 1165; CHECK-NOFP16-RV32-NEXT: .cfi_offset s5, -28 1166; CHECK-NOFP16-RV32-NEXT: .cfi_offset s6, -32 1167; CHECK-NOFP16-RV32-NEXT: .cfi_offset s7, -36 1168; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs0, -48 1169; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs1, -56 1170; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs2, -64 1171; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs3, -72 1172; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs4, -80 1173; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs5, -88 1174; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs6, -96 1175; CHECK-NOFP16-RV32-NEXT: .cfi_offset fs7, -104 1176; CHECK-NOFP16-RV32-NEXT: mv s0, a0 1177; CHECK-NOFP16-RV32-NEXT: lhu a0, 0(a1) 1178; CHECK-NOFP16-RV32-NEXT: lhu a2, 4(a1) 1179; CHECK-NOFP16-RV32-NEXT: lhu a3, 8(a1) 1180; CHECK-NOFP16-RV32-NEXT: lhu a4, 12(a1) 1181; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs0, a0 1182; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs2, a2 1183; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs4, a3 1184; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs5, a4 1185; CHECK-NOFP16-RV32-NEXT: lhu a0, 16(a1) 1186; CHECK-NOFP16-RV32-NEXT: lhu a2, 20(a1) 1187; CHECK-NOFP16-RV32-NEXT: lhu a3, 24(a1) 1188; CHECK-NOFP16-RV32-NEXT: lhu a1, 28(a1) 1189; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs6, a0 1190; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs7, a2 1191; CHECK-NOFP16-RV32-NEXT: fmv.w.x fs3, a3 1192; CHECK-NOFP16-RV32-NEXT: fmv.w.x fa0, a1 1193; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 1194; CHECK-NOFP16-RV32-NEXT: fmv.s fs1, fa0 1195; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs3 1196; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 1197; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 1198; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 1199; CHECK-NOFP16-RV32-NEXT: fmv.s fs3, fa0 1200; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs7 1201; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 1202; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 1203; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 1204; CHECK-NOFP16-RV32-NEXT: fmv.s fs7, fa0 1205; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs6 1206; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 1207; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 1208; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 1209; CHECK-NOFP16-RV32-NEXT: fmv.s fs6, fa0 1210; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs5 1211; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 1212; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 1213; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 1214; CHECK-NOFP16-RV32-NEXT: fmv.s fs5, fa0 1215; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs4 1216; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 1217; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 1218; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 1219; CHECK-NOFP16-RV32-NEXT: fmv.s fs4, fa0 1220; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs2 1221; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 1222; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 1223; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 1224; CHECK-NOFP16-RV32-NEXT: fmv.s fs2, fa0 1225; CHECK-NOFP16-RV32-NEXT: fmv.s fa0, fs0 1226; CHECK-NOFP16-RV32-NEXT: call __extendhfsf2 1227; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fa0, fa0 1228; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 1229; CHECK-NOFP16-RV32-NEXT: fmv.x.w s1, fa0 1230; CHECK-NOFP16-RV32-NEXT: fmv.x.w s2, fs2 1231; CHECK-NOFP16-RV32-NEXT: fmv.x.w s3, fs4 1232; CHECK-NOFP16-RV32-NEXT: fmv.x.w s4, fs5 1233; CHECK-NOFP16-RV32-NEXT: fmv.x.w s5, fs6 1234; CHECK-NOFP16-RV32-NEXT: fmv.x.w s6, fs7 1235; CHECK-NOFP16-RV32-NEXT: fmin.s fa0, fs1, fs1 1236; CHECK-NOFP16-RV32-NEXT: fmv.x.w s7, fs3 1237; CHECK-NOFP16-RV32-NEXT: call __truncsfhf2 1238; CHECK-NOFP16-RV32-NEXT: fmv.x.w a0, fa0 1239; CHECK-NOFP16-RV32-NEXT: sh s5, 8(s0) 1240; CHECK-NOFP16-RV32-NEXT: sh s6, 10(s0) 1241; CHECK-NOFP16-RV32-NEXT: sh s7, 12(s0) 1242; CHECK-NOFP16-RV32-NEXT: sh a0, 14(s0) 1243; CHECK-NOFP16-RV32-NEXT: sh s1, 0(s0) 1244; CHECK-NOFP16-RV32-NEXT: sh s2, 2(s0) 1245; CHECK-NOFP16-RV32-NEXT: sh s3, 4(s0) 1246; CHECK-NOFP16-RV32-NEXT: sh s4, 6(s0) 1247; CHECK-NOFP16-RV32-NEXT: lw ra, 108(sp) # 4-byte Folded Reload 1248; CHECK-NOFP16-RV32-NEXT: lw s0, 104(sp) # 4-byte Folded Reload 1249; CHECK-NOFP16-RV32-NEXT: lw s1, 100(sp) # 4-byte Folded Reload 1250; CHECK-NOFP16-RV32-NEXT: lw s2, 96(sp) # 4-byte Folded Reload 1251; CHECK-NOFP16-RV32-NEXT: lw s3, 92(sp) # 4-byte Folded Reload 1252; CHECK-NOFP16-RV32-NEXT: lw s4, 88(sp) # 4-byte Folded Reload 1253; CHECK-NOFP16-RV32-NEXT: lw s5, 84(sp) # 4-byte Folded Reload 1254; CHECK-NOFP16-RV32-NEXT: lw s6, 80(sp) # 4-byte Folded Reload 1255; CHECK-NOFP16-RV32-NEXT: lw s7, 76(sp) # 4-byte Folded Reload 1256; CHECK-NOFP16-RV32-NEXT: fld fs0, 64(sp) # 8-byte Folded Reload 1257; CHECK-NOFP16-RV32-NEXT: fld fs1, 56(sp) # 8-byte Folded Reload 1258; CHECK-NOFP16-RV32-NEXT: fld fs2, 48(sp) # 8-byte Folded Reload 1259; CHECK-NOFP16-RV32-NEXT: fld fs3, 40(sp) # 8-byte Folded Reload 1260; CHECK-NOFP16-RV32-NEXT: fld fs4, 32(sp) # 8-byte Folded Reload 1261; CHECK-NOFP16-RV32-NEXT: fld fs5, 24(sp) # 8-byte Folded Reload 1262; CHECK-NOFP16-RV32-NEXT: fld fs6, 16(sp) # 8-byte Folded Reload 1263; CHECK-NOFP16-RV32-NEXT: fld fs7, 8(sp) # 8-byte Folded Reload 1264; CHECK-NOFP16-RV32-NEXT: .cfi_restore ra 1265; CHECK-NOFP16-RV32-NEXT: .cfi_restore s0 1266; CHECK-NOFP16-RV32-NEXT: .cfi_restore s1 1267; CHECK-NOFP16-RV32-NEXT: .cfi_restore s2 1268; CHECK-NOFP16-RV32-NEXT: .cfi_restore s3 1269; CHECK-NOFP16-RV32-NEXT: .cfi_restore s4 1270; CHECK-NOFP16-RV32-NEXT: .cfi_restore s5 1271; CHECK-NOFP16-RV32-NEXT: .cfi_restore s6 1272; CHECK-NOFP16-RV32-NEXT: .cfi_restore s7 1273; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs0 1274; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs1 1275; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs2 1276; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs3 1277; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs4 1278; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs5 1279; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs6 1280; CHECK-NOFP16-RV32-NEXT: .cfi_restore fs7 1281; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 112 1282; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0 1283; CHECK-NOFP16-RV32-NEXT: ret 1284 %z = call nnan <8 x half> @llvm.canonicalize.v8f16(<8 x half> %x) 1285 ret <8 x half> %z 1286} 1287 1288define float @fcanonicalize_f32(float %x) { 1289; CHECK-LABEL: fcanonicalize_f32: 1290; CHECK: # %bb.0: 1291; CHECK-NEXT: fmin.s fa0, fa0, fa0 1292; CHECK-NEXT: ret 1293 %z = call float @llvm.canonicalize.f32(float %x) 1294 ret float %z 1295} 1296 1297define float @fcanonicalize_f32_nnan(float %x) { 1298; CHECK-LABEL: fcanonicalize_f32_nnan: 1299; CHECK: # %bb.0: 1300; CHECK-NEXT: fmin.s fa0, fa0, fa0 1301; CHECK-NEXT: ret 1302 %z = call nnan float @llvm.canonicalize.f32(float %x) 1303 ret float %z 1304} 1305 1306define <2 x float> @fcanonicalize_v2f32(<2 x float> %x) { 1307; CHECK-LABEL: fcanonicalize_v2f32: 1308; CHECK: # %bb.0: 1309; CHECK-NEXT: fmin.s fa0, fa0, fa0 1310; CHECK-NEXT: fmin.s fa1, fa1, fa1 1311; CHECK-NEXT: ret 1312 %z = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x) 1313 ret <2 x float> %z 1314} 1315 1316define <2 x float> @fcanonicalize_v2f32_nnan(<2 x float> %x) { 1317; CHECK-LABEL: fcanonicalize_v2f32_nnan: 1318; CHECK: # %bb.0: 1319; CHECK-NEXT: fmin.s fa0, fa0, fa0 1320; CHECK-NEXT: fmin.s fa1, fa1, fa1 1321; CHECK-NEXT: ret 1322 %z = call nnan <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x) 1323 ret <2 x float> %z 1324} 1325 1326define <4 x float> @fcanonicalize_v4f32(<4 x float> %x) { 1327; CHECK-LABEL: fcanonicalize_v4f32: 1328; CHECK: # %bb.0: 1329; CHECK-NEXT: fmin.s fa5, fa0, fa0 1330; CHECK-NEXT: fmin.s fa4, fa1, fa1 1331; CHECK-NEXT: fmin.s fa2, fa2, fa2 1332; CHECK-NEXT: fmin.s fa3, fa3, fa3 1333; CHECK-NEXT: fsw fa5, 0(a0) 1334; CHECK-NEXT: fsw fa4, 4(a0) 1335; CHECK-NEXT: fsw fa2, 8(a0) 1336; CHECK-NEXT: fsw fa3, 12(a0) 1337; CHECK-NEXT: ret 1338 %z = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %x) 1339 ret <4 x float> %z 1340} 1341 1342define <4 x float> @fcanonicalize_v4f32_nnan(<4 x float> %x) { 1343; CHECK-LABEL: fcanonicalize_v4f32_nnan: 1344; CHECK: # %bb.0: 1345; CHECK-NEXT: fmin.s fa5, fa0, fa0 1346; CHECK-NEXT: fmin.s fa4, fa1, fa1 1347; CHECK-NEXT: fmin.s fa2, fa2, fa2 1348; CHECK-NEXT: fmin.s fa3, fa3, fa3 1349; CHECK-NEXT: fsw fa5, 0(a0) 1350; CHECK-NEXT: fsw fa4, 4(a0) 1351; CHECK-NEXT: fsw fa2, 8(a0) 1352; CHECK-NEXT: fsw fa3, 12(a0) 1353; CHECK-NEXT: ret 1354 %z = call nnan <4 x float> @llvm.canonicalize.v4f32(<4 x float> %x) 1355 ret <4 x float> %z 1356} 1357 1358define double @fcanonicalize_f64(double %x) { 1359; CHECK-LABEL: fcanonicalize_f64: 1360; CHECK: # %bb.0: 1361; CHECK-NEXT: fmin.d fa0, fa0, fa0 1362; CHECK-NEXT: ret 1363 %z = call double @llvm.canonicalize.f64(double %x) 1364 ret double %z 1365} 1366 1367define double @fcanonicalize_f64_nnan(double %x) { 1368; CHECK-LABEL: fcanonicalize_f64_nnan: 1369; CHECK: # %bb.0: 1370; CHECK-NEXT: fmin.d fa0, fa0, fa0 1371; CHECK-NEXT: ret 1372 %z = call nnan double @llvm.canonicalize.f64(double %x) 1373 ret double %z 1374} 1375 1376define <2 x double> @fcanonicalize_v2f64(<2 x double> %x) { 1377; CHECK-LABEL: fcanonicalize_v2f64: 1378; CHECK: # %bb.0: 1379; CHECK-NEXT: fmin.d fa0, fa0, fa0 1380; CHECK-NEXT: fmin.d fa1, fa1, fa1 1381; CHECK-NEXT: ret 1382 %z = call <2 x double> @llvm.canonicalize.v2f64(<2 x double> %x) 1383 ret <2 x double> %z 1384} 1385 1386define <2 x double> @fcanonicalize_v2f64_nnan(<2 x double> %x) { 1387; CHECK-LABEL: fcanonicalize_v2f64_nnan: 1388; CHECK: # %bb.0: 1389; CHECK-NEXT: fmin.d fa0, fa0, fa0 1390; CHECK-NEXT: fmin.d fa1, fa1, fa1 1391; CHECK-NEXT: ret 1392 %z = call nnan <2 x double> @llvm.canonicalize.v2f64(<2 x double> %x) 1393 ret <2 x double> %z 1394} 1395