1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD 3; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD 4; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI 5; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI 6 7define double @frem_f64(double %a, double %b) { 8; CHECK-LABEL: frem_f64: 9; CHECK: // %bb.0: // %entry 10; CHECK-NEXT: b fmod 11entry: 12 %c = frem double %a, %b 13 ret double %c 14} 15 16define float @frem_f32(float %a, float %b) { 17; CHECK-LABEL: frem_f32: 18; CHECK: // %bb.0: // %entry 19; CHECK-NEXT: b fmodf 20entry: 21 %c = frem float %a, %b 22 ret float %c 23} 24 25define half @frem_f16(half %a, half %b) { 26; CHECK-LABEL: frem_f16: 27; CHECK: // %bb.0: // %entry 28; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 29; CHECK-NEXT: .cfi_def_cfa_offset 16 30; CHECK-NEXT: .cfi_offset w30, -16 31; CHECK-NEXT: fcvt s0, h0 32; CHECK-NEXT: fcvt s1, h1 33; CHECK-NEXT: bl fmodf 34; CHECK-NEXT: fcvt h0, s0 35; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 36; CHECK-NEXT: ret 37entry: 38 %c = frem half %a, %b 39 ret half %c 40} 41 42define fp128 @frem_fp128(fp128 %a, fp128 %b) { 43; CHECK-LABEL: frem_fp128: 44; CHECK: // %bb.0: // %entry 45; CHECK-NEXT: b fmodl 46entry: 47 %c = frem fp128 %a, %b 48 ret fp128 %c 49} 50 51define <1 x double> @frem_v1f64(<1 x double> %a, <1 x double> %b) { 52; CHECK-LABEL: frem_v1f64: 53; CHECK: // %bb.0: // %entry 54; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 55; CHECK-NEXT: .cfi_def_cfa_offset 16 56; CHECK-NEXT: .cfi_offset w30, -16 57; CHECK-NEXT: bl fmod 58; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 59; CHECK-NEXT: ret 60entry: 61 %c = frem <1 x double> %a, %b 62 ret <1 x double> %c 63} 64 65define <2 x double> @frem_v2f64(<2 x double> %a, <2 x double> %b) { 66; CHECK-SD-LABEL: frem_v2f64: 67; CHECK-SD: // %bb.0: // %entry 68; CHECK-SD-NEXT: sub sp, sp, #64 69; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 70; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 71; CHECK-SD-NEXT: .cfi_offset w30, -16 72; CHECK-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill 73; CHECK-SD-NEXT: mov d0, v0.d[1] 74; CHECK-SD-NEXT: mov d1, v1.d[1] 75; CHECK-SD-NEXT: bl fmod 76; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 77; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 78; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 79; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 80; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 81; CHECK-SD-NEXT: bl fmod 82; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 83; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 84; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 85; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 86; CHECK-SD-NEXT: add sp, sp, #64 87; CHECK-SD-NEXT: ret 88; 89; CHECK-GI-LABEL: frem_v2f64: 90; CHECK-GI: // %bb.0: // %entry 91; CHECK-GI-NEXT: sub sp, sp, #48 92; CHECK-GI-NEXT: stp d9, d8, [sp, #16] // 16-byte Folded Spill 93; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 94; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 95; CHECK-GI-NEXT: .cfi_offset w30, -16 96; CHECK-GI-NEXT: .cfi_offset b8, -24 97; CHECK-GI-NEXT: .cfi_offset b9, -32 98; CHECK-GI-NEXT: mov d8, v0.d[1] 99; CHECK-GI-NEXT: mov d9, v1.d[1] 100; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 101; CHECK-GI-NEXT: // kill: def $d1 killed $d1 killed $q1 102; CHECK-GI-NEXT: bl fmod 103; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 104; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 105; CHECK-GI-NEXT: fmov d1, d9 106; CHECK-GI-NEXT: fmov d0, d8 107; CHECK-GI-NEXT: bl fmod 108; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload 109; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 110; CHECK-GI-NEXT: ldp d9, d8, [sp, #16] // 16-byte Folded Reload 111; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 112; CHECK-GI-NEXT: mov v1.d[1], v0.d[0] 113; CHECK-GI-NEXT: mov v0.16b, v1.16b 114; CHECK-GI-NEXT: add sp, sp, #48 115; CHECK-GI-NEXT: ret 116entry: 117 %c = frem <2 x double> %a, %b 118 ret <2 x double> %c 119} 120 121define <3 x double> @frem_v3f64(<3 x double> %a, <3 x double> %b) { 122; CHECK-SD-LABEL: frem_v3f64: 123; CHECK-SD: // %bb.0: // %entry 124; CHECK-SD-NEXT: str d12, [sp, #-48]! // 8-byte Folded Spill 125; CHECK-SD-NEXT: stp d11, d10, [sp, #8] // 16-byte Folded Spill 126; CHECK-SD-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill 127; CHECK-SD-NEXT: str x30, [sp, #40] // 8-byte Folded Spill 128; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 129; CHECK-SD-NEXT: .cfi_offset w30, -8 130; CHECK-SD-NEXT: .cfi_offset b8, -16 131; CHECK-SD-NEXT: .cfi_offset b9, -24 132; CHECK-SD-NEXT: .cfi_offset b10, -32 133; CHECK-SD-NEXT: .cfi_offset b11, -40 134; CHECK-SD-NEXT: .cfi_offset b12, -48 135; CHECK-SD-NEXT: fmov d11, d1 136; CHECK-SD-NEXT: fmov d1, d3 137; CHECK-SD-NEXT: fmov d8, d5 138; CHECK-SD-NEXT: fmov d9, d4 139; CHECK-SD-NEXT: fmov d10, d2 140; CHECK-SD-NEXT: bl fmod 141; CHECK-SD-NEXT: fmov d12, d0 142; CHECK-SD-NEXT: fmov d0, d11 143; CHECK-SD-NEXT: fmov d1, d9 144; CHECK-SD-NEXT: bl fmod 145; CHECK-SD-NEXT: fmov d9, d0 146; CHECK-SD-NEXT: fmov d0, d10 147; CHECK-SD-NEXT: fmov d1, d8 148; CHECK-SD-NEXT: bl fmod 149; CHECK-SD-NEXT: fmov d1, d9 150; CHECK-SD-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload 151; CHECK-SD-NEXT: ldp d11, d10, [sp, #8] // 16-byte Folded Reload 152; CHECK-SD-NEXT: fmov d2, d0 153; CHECK-SD-NEXT: ldr x30, [sp, #40] // 8-byte Folded Reload 154; CHECK-SD-NEXT: fmov d0, d12 155; CHECK-SD-NEXT: ldr d12, [sp], #48 // 8-byte Folded Reload 156; CHECK-SD-NEXT: ret 157; 158; CHECK-GI-LABEL: frem_v3f64: 159; CHECK-GI: // %bb.0: // %entry 160; CHECK-GI-NEXT: str d12, [sp, #-48]! // 8-byte Folded Spill 161; CHECK-GI-NEXT: stp d11, d10, [sp, #8] // 16-byte Folded Spill 162; CHECK-GI-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill 163; CHECK-GI-NEXT: str x30, [sp, #40] // 8-byte Folded Spill 164; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 165; CHECK-GI-NEXT: .cfi_offset w30, -8 166; CHECK-GI-NEXT: .cfi_offset b8, -16 167; CHECK-GI-NEXT: .cfi_offset b9, -24 168; CHECK-GI-NEXT: .cfi_offset b10, -32 169; CHECK-GI-NEXT: .cfi_offset b11, -40 170; CHECK-GI-NEXT: .cfi_offset b12, -48 171; CHECK-GI-NEXT: fmov d8, d1 172; CHECK-GI-NEXT: fmov d1, d3 173; CHECK-GI-NEXT: fmov d9, d2 174; CHECK-GI-NEXT: fmov d10, d4 175; CHECK-GI-NEXT: fmov d11, d5 176; CHECK-GI-NEXT: bl fmod 177; CHECK-GI-NEXT: fmov d12, d0 178; CHECK-GI-NEXT: fmov d0, d8 179; CHECK-GI-NEXT: fmov d1, d10 180; CHECK-GI-NEXT: bl fmod 181; CHECK-GI-NEXT: fmov d8, d0 182; CHECK-GI-NEXT: fmov d0, d9 183; CHECK-GI-NEXT: fmov d1, d11 184; CHECK-GI-NEXT: bl fmod 185; CHECK-GI-NEXT: fmov d1, d8 186; CHECK-GI-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload 187; CHECK-GI-NEXT: ldp d11, d10, [sp, #8] // 16-byte Folded Reload 188; CHECK-GI-NEXT: fmov d2, d0 189; CHECK-GI-NEXT: ldr x30, [sp, #40] // 8-byte Folded Reload 190; CHECK-GI-NEXT: fmov d0, d12 191; CHECK-GI-NEXT: ldr d12, [sp], #48 // 8-byte Folded Reload 192; CHECK-GI-NEXT: ret 193entry: 194 %c = frem <3 x double> %a, %b 195 ret <3 x double> %c 196} 197 198define <4 x double> @frem_v4f64(<4 x double> %a, <4 x double> %b) { 199; CHECK-SD-LABEL: frem_v4f64: 200; CHECK-SD: // %bb.0: // %entry 201; CHECK-SD-NEXT: sub sp, sp, #96 202; CHECK-SD-NEXT: str x30, [sp, #80] // 8-byte Folded Spill 203; CHECK-SD-NEXT: .cfi_def_cfa_offset 96 204; CHECK-SD-NEXT: .cfi_offset w30, -16 205; CHECK-SD-NEXT: stp q0, q2, [sp] // 32-byte Folded Spill 206; CHECK-SD-NEXT: mov d0, v0.d[1] 207; CHECK-SD-NEXT: stp q1, q3, [sp, #48] // 32-byte Folded Spill 208; CHECK-SD-NEXT: mov d1, v2.d[1] 209; CHECK-SD-NEXT: bl fmod 210; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 211; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 212; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 213; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 214; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 215; CHECK-SD-NEXT: bl fmod 216; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 217; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 218; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 219; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 220; CHECK-SD-NEXT: ldp q0, q1, [sp, #48] // 32-byte Folded Reload 221; CHECK-SD-NEXT: mov d0, v0.d[1] 222; CHECK-SD-NEXT: mov d1, v1.d[1] 223; CHECK-SD-NEXT: bl fmod 224; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 225; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 226; CHECK-SD-NEXT: ldp q0, q1, [sp, #48] // 32-byte Folded Reload 227; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 228; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 229; CHECK-SD-NEXT: bl fmod 230; CHECK-SD-NEXT: fmov d1, d0 231; CHECK-SD-NEXT: ldp q2, q0, [sp, #16] // 32-byte Folded Reload 232; CHECK-SD-NEXT: ldr x30, [sp, #80] // 8-byte Folded Reload 233; CHECK-SD-NEXT: mov v1.d[1], v2.d[0] 234; CHECK-SD-NEXT: add sp, sp, #96 235; CHECK-SD-NEXT: ret 236; 237; CHECK-GI-LABEL: frem_v4f64: 238; CHECK-GI: // %bb.0: // %entry 239; CHECK-GI-NEXT: sub sp, sp, #112 240; CHECK-GI-NEXT: stp d11, d10, [sp, #64] // 16-byte Folded Spill 241; CHECK-GI-NEXT: stp d9, d8, [sp, #80] // 16-byte Folded Spill 242; CHECK-GI-NEXT: str x30, [sp, #96] // 8-byte Folded Spill 243; CHECK-GI-NEXT: .cfi_def_cfa_offset 112 244; CHECK-GI-NEXT: .cfi_offset w30, -16 245; CHECK-GI-NEXT: .cfi_offset b8, -24 246; CHECK-GI-NEXT: .cfi_offset b9, -32 247; CHECK-GI-NEXT: .cfi_offset b10, -40 248; CHECK-GI-NEXT: .cfi_offset b11, -48 249; CHECK-GI-NEXT: mov v4.16b, v1.16b 250; CHECK-GI-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 251; CHECK-GI-NEXT: mov v1.16b, v2.16b 252; CHECK-GI-NEXT: str q3, [sp] // 16-byte Folded Spill 253; CHECK-GI-NEXT: mov d8, v0.d[1] 254; CHECK-GI-NEXT: mov d10, v2.d[1] 255; CHECK-GI-NEXT: mov d11, v3.d[1] 256; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 257; CHECK-GI-NEXT: // kill: def $d1 killed $d1 killed $q1 258; CHECK-GI-NEXT: mov d9, v4.d[1] 259; CHECK-GI-NEXT: bl fmod 260; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 261; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 262; CHECK-GI-NEXT: fmov d1, d10 263; CHECK-GI-NEXT: fmov d0, d8 264; CHECK-GI-NEXT: bl fmod 265; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 266; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 267; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload 268; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 269; CHECK-GI-NEXT: // kill: def $d1 killed $d1 killed $q1 270; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 271; CHECK-GI-NEXT: bl fmod 272; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 273; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 274; CHECK-GI-NEXT: fmov d1, d11 275; CHECK-GI-NEXT: fmov d0, d9 276; CHECK-GI-NEXT: bl fmod 277; CHECK-GI-NEXT: ldp q3, q1, [sp, #16] // 32-byte Folded Reload 278; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 279; CHECK-GI-NEXT: ldr q2, [sp, #48] // 16-byte Folded Reload 280; CHECK-GI-NEXT: ldp d9, d8, [sp, #80] // 16-byte Folded Reload 281; CHECK-GI-NEXT: ldr x30, [sp, #96] // 8-byte Folded Reload 282; CHECK-GI-NEXT: ldp d11, d10, [sp, #64] // 16-byte Folded Reload 283; CHECK-GI-NEXT: mov v2.d[1], v3.d[0] 284; CHECK-GI-NEXT: mov v1.d[1], v0.d[0] 285; CHECK-GI-NEXT: mov v0.16b, v2.16b 286; CHECK-GI-NEXT: add sp, sp, #112 287; CHECK-GI-NEXT: ret 288entry: 289 %c = frem <4 x double> %a, %b 290 ret <4 x double> %c 291} 292 293define <2 x float> @frem_v2f32(<2 x float> %a, <2 x float> %b) { 294; CHECK-SD-LABEL: frem_v2f32: 295; CHECK-SD: // %bb.0: // %entry 296; CHECK-SD-NEXT: sub sp, sp, #64 297; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 298; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 299; CHECK-SD-NEXT: .cfi_offset w30, -16 300; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 301; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 302; CHECK-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill 303; CHECK-SD-NEXT: mov s0, v0.s[1] 304; CHECK-SD-NEXT: mov s1, v1.s[1] 305; CHECK-SD-NEXT: bl fmodf 306; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 307; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 308; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 309; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 310; CHECK-SD-NEXT: // kill: def $s1 killed $s1 killed $q1 311; CHECK-SD-NEXT: bl fmodf 312; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 313; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 314; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 315; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 316; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 317; CHECK-SD-NEXT: add sp, sp, #64 318; CHECK-SD-NEXT: ret 319; 320; CHECK-GI-LABEL: frem_v2f32: 321; CHECK-GI: // %bb.0: // %entry 322; CHECK-GI-NEXT: sub sp, sp, #48 323; CHECK-GI-NEXT: stp d9, d8, [sp, #16] // 16-byte Folded Spill 324; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 325; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 326; CHECK-GI-NEXT: .cfi_offset w30, -16 327; CHECK-GI-NEXT: .cfi_offset b8, -24 328; CHECK-GI-NEXT: .cfi_offset b9, -32 329; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 330; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 331; CHECK-GI-NEXT: mov s8, v0.s[1] 332; CHECK-GI-NEXT: mov s9, v1.s[1] 333; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0 334; CHECK-GI-NEXT: // kill: def $s1 killed $s1 killed $q1 335; CHECK-GI-NEXT: bl fmodf 336; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 337; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 338; CHECK-GI-NEXT: fmov s1, s9 339; CHECK-GI-NEXT: fmov s0, s8 340; CHECK-GI-NEXT: bl fmodf 341; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload 342; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 343; CHECK-GI-NEXT: ldp d9, d8, [sp, #16] // 16-byte Folded Reload 344; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 345; CHECK-GI-NEXT: mov v1.s[1], v0.s[0] 346; CHECK-GI-NEXT: fmov d0, d1 347; CHECK-GI-NEXT: add sp, sp, #48 348; CHECK-GI-NEXT: ret 349entry: 350 %c = frem <2 x float> %a, %b 351 ret <2 x float> %c 352} 353 354define <3 x float> @frem_v3f32(<3 x float> %a, <3 x float> %b) { 355; CHECK-SD-LABEL: frem_v3f32: 356; CHECK-SD: // %bb.0: // %entry 357; CHECK-SD-NEXT: sub sp, sp, #64 358; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 359; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 360; CHECK-SD-NEXT: .cfi_offset w30, -16 361; CHECK-SD-NEXT: stp q0, q1, [sp, #16] // 32-byte Folded Spill 362; CHECK-SD-NEXT: mov s0, v0.s[1] 363; CHECK-SD-NEXT: mov s1, v1.s[1] 364; CHECK-SD-NEXT: bl fmodf 365; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 366; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 367; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 368; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 369; CHECK-SD-NEXT: // kill: def $s1 killed $s1 killed $q1 370; CHECK-SD-NEXT: bl fmodf 371; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 372; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 373; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 374; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 375; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 376; CHECK-SD-NEXT: mov s0, v0.s[2] 377; CHECK-SD-NEXT: mov s1, v1.s[2] 378; CHECK-SD-NEXT: bl fmodf 379; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 380; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 381; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 382; CHECK-SD-NEXT: mov v1.s[2], v0.s[0] 383; CHECK-SD-NEXT: mov v0.16b, v1.16b 384; CHECK-SD-NEXT: add sp, sp, #64 385; CHECK-SD-NEXT: ret 386; 387; CHECK-GI-LABEL: frem_v3f32: 388; CHECK-GI: // %bb.0: // %entry 389; CHECK-GI-NEXT: sub sp, sp, #80 390; CHECK-GI-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill 391; CHECK-GI-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill 392; CHECK-GI-NEXT: str x30, [sp, #64] // 8-byte Folded Spill 393; CHECK-GI-NEXT: .cfi_def_cfa_offset 80 394; CHECK-GI-NEXT: .cfi_offset w30, -16 395; CHECK-GI-NEXT: .cfi_offset b8, -24 396; CHECK-GI-NEXT: .cfi_offset b9, -32 397; CHECK-GI-NEXT: .cfi_offset b10, -40 398; CHECK-GI-NEXT: .cfi_offset b11, -48 399; CHECK-GI-NEXT: mov s8, v0.s[1] 400; CHECK-GI-NEXT: mov s9, v0.s[2] 401; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0 402; CHECK-GI-NEXT: mov s10, v1.s[1] 403; CHECK-GI-NEXT: mov s11, v1.s[2] 404; CHECK-GI-NEXT: // kill: def $s1 killed $s1 killed $q1 405; CHECK-GI-NEXT: bl fmodf 406; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 407; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 408; CHECK-GI-NEXT: fmov s1, s10 409; CHECK-GI-NEXT: fmov s0, s8 410; CHECK-GI-NEXT: bl fmodf 411; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 412; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 413; CHECK-GI-NEXT: fmov s1, s11 414; CHECK-GI-NEXT: fmov s0, s9 415; CHECK-GI-NEXT: bl fmodf 416; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload 417; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 418; CHECK-GI-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload 419; CHECK-GI-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload 420; CHECK-GI-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload 421; CHECK-GI-NEXT: mov v1.s[1], v2.s[0] 422; CHECK-GI-NEXT: mov v1.s[2], v0.s[0] 423; CHECK-GI-NEXT: mov v0.16b, v1.16b 424; CHECK-GI-NEXT: add sp, sp, #80 425; CHECK-GI-NEXT: ret 426entry: 427 %c = frem <3 x float> %a, %b 428 ret <3 x float> %c 429} 430 431define <4 x float> @frem_v4f32(<4 x float> %a, <4 x float> %b) { 432; CHECK-SD-LABEL: frem_v4f32: 433; CHECK-SD: // %bb.0: // %entry 434; CHECK-SD-NEXT: sub sp, sp, #64 435; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 436; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 437; CHECK-SD-NEXT: .cfi_offset w30, -16 438; CHECK-SD-NEXT: stp q0, q1, [sp, #16] // 32-byte Folded Spill 439; CHECK-SD-NEXT: mov s0, v0.s[1] 440; CHECK-SD-NEXT: mov s1, v1.s[1] 441; CHECK-SD-NEXT: bl fmodf 442; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 443; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 444; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 445; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 446; CHECK-SD-NEXT: // kill: def $s1 killed $s1 killed $q1 447; CHECK-SD-NEXT: bl fmodf 448; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 449; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 450; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 451; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 452; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 453; CHECK-SD-NEXT: mov s0, v0.s[2] 454; CHECK-SD-NEXT: mov s1, v1.s[2] 455; CHECK-SD-NEXT: bl fmodf 456; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 457; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 458; CHECK-SD-NEXT: mov v1.s[2], v0.s[0] 459; CHECK-SD-NEXT: str q1, [sp] // 16-byte Folded Spill 460; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 461; CHECK-SD-NEXT: mov s0, v0.s[3] 462; CHECK-SD-NEXT: mov s1, v1.s[3] 463; CHECK-SD-NEXT: bl fmodf 464; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 465; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 466; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 467; CHECK-SD-NEXT: mov v1.s[3], v0.s[0] 468; CHECK-SD-NEXT: mov v0.16b, v1.16b 469; CHECK-SD-NEXT: add sp, sp, #64 470; CHECK-SD-NEXT: ret 471; 472; CHECK-GI-LABEL: frem_v4f32: 473; CHECK-GI: // %bb.0: // %entry 474; CHECK-GI-NEXT: sub sp, sp, #112 475; CHECK-GI-NEXT: stp d13, d12, [sp, #48] // 16-byte Folded Spill 476; CHECK-GI-NEXT: stp d11, d10, [sp, #64] // 16-byte Folded Spill 477; CHECK-GI-NEXT: stp d9, d8, [sp, #80] // 16-byte Folded Spill 478; CHECK-GI-NEXT: str x30, [sp, #96] // 8-byte Folded Spill 479; CHECK-GI-NEXT: .cfi_def_cfa_offset 112 480; CHECK-GI-NEXT: .cfi_offset w30, -16 481; CHECK-GI-NEXT: .cfi_offset b8, -24 482; CHECK-GI-NEXT: .cfi_offset b9, -32 483; CHECK-GI-NEXT: .cfi_offset b10, -40 484; CHECK-GI-NEXT: .cfi_offset b11, -48 485; CHECK-GI-NEXT: .cfi_offset b12, -56 486; CHECK-GI-NEXT: .cfi_offset b13, -64 487; CHECK-GI-NEXT: mov s8, v0.s[1] 488; CHECK-GI-NEXT: mov s9, v0.s[2] 489; CHECK-GI-NEXT: mov s10, v0.s[3] 490; CHECK-GI-NEXT: mov s11, v1.s[1] 491; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0 492; CHECK-GI-NEXT: mov s12, v1.s[2] 493; CHECK-GI-NEXT: mov s13, v1.s[3] 494; CHECK-GI-NEXT: // kill: def $s1 killed $s1 killed $q1 495; CHECK-GI-NEXT: bl fmodf 496; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 497; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 498; CHECK-GI-NEXT: fmov s1, s11 499; CHECK-GI-NEXT: fmov s0, s8 500; CHECK-GI-NEXT: bl fmodf 501; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 502; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 503; CHECK-GI-NEXT: fmov s1, s12 504; CHECK-GI-NEXT: fmov s0, s9 505; CHECK-GI-NEXT: bl fmodf 506; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 507; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 508; CHECK-GI-NEXT: fmov s1, s13 509; CHECK-GI-NEXT: fmov s0, s10 510; CHECK-GI-NEXT: bl fmodf 511; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload 512; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 513; CHECK-GI-NEXT: ldr x30, [sp, #96] // 8-byte Folded Reload 514; CHECK-GI-NEXT: ldp d9, d8, [sp, #80] // 16-byte Folded Reload 515; CHECK-GI-NEXT: ldp d11, d10, [sp, #64] // 16-byte Folded Reload 516; CHECK-GI-NEXT: mov v1.s[1], v2.s[0] 517; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Folded Reload 518; CHECK-GI-NEXT: ldp d13, d12, [sp, #48] // 16-byte Folded Reload 519; CHECK-GI-NEXT: mov v1.s[2], v2.s[0] 520; CHECK-GI-NEXT: mov v1.s[3], v0.s[0] 521; CHECK-GI-NEXT: mov v0.16b, v1.16b 522; CHECK-GI-NEXT: add sp, sp, #112 523; CHECK-GI-NEXT: ret 524entry: 525 %c = frem <4 x float> %a, %b 526 ret <4 x float> %c 527} 528 529define <8 x float> @frem_v8f32(<8 x float> %a, <8 x float> %b) { 530; CHECK-SD-LABEL: frem_v8f32: 531; CHECK-SD: // %bb.0: // %entry 532; CHECK-SD-NEXT: sub sp, sp, #96 533; CHECK-SD-NEXT: str x30, [sp, #80] // 8-byte Folded Spill 534; CHECK-SD-NEXT: .cfi_def_cfa_offset 96 535; CHECK-SD-NEXT: .cfi_offset w30, -16 536; CHECK-SD-NEXT: stp q0, q2, [sp] // 32-byte Folded Spill 537; CHECK-SD-NEXT: mov s0, v0.s[1] 538; CHECK-SD-NEXT: stp q1, q3, [sp, #32] // 32-byte Folded Spill 539; CHECK-SD-NEXT: mov s1, v2.s[1] 540; CHECK-SD-NEXT: bl fmodf 541; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 542; CHECK-SD-NEXT: str q0, [sp, #64] // 16-byte Folded Spill 543; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 544; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 545; CHECK-SD-NEXT: // kill: def $s1 killed $s1 killed $q1 546; CHECK-SD-NEXT: bl fmodf 547; CHECK-SD-NEXT: ldr q1, [sp, #64] // 16-byte Folded Reload 548; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 549; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 550; CHECK-SD-NEXT: str q0, [sp, #64] // 16-byte Folded Spill 551; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 552; CHECK-SD-NEXT: mov s0, v0.s[2] 553; CHECK-SD-NEXT: mov s1, v1.s[2] 554; CHECK-SD-NEXT: bl fmodf 555; CHECK-SD-NEXT: ldr q1, [sp, #64] // 16-byte Folded Reload 556; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 557; CHECK-SD-NEXT: mov v1.s[2], v0.s[0] 558; CHECK-SD-NEXT: str q1, [sp, #64] // 16-byte Folded Spill 559; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 560; CHECK-SD-NEXT: mov s0, v0.s[3] 561; CHECK-SD-NEXT: mov s1, v1.s[3] 562; CHECK-SD-NEXT: bl fmodf 563; CHECK-SD-NEXT: ldr q1, [sp, #64] // 16-byte Folded Reload 564; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 565; CHECK-SD-NEXT: mov v1.s[3], v0.s[0] 566; CHECK-SD-NEXT: str q1, [sp, #64] // 16-byte Folded Spill 567; CHECK-SD-NEXT: ldp q0, q1, [sp, #32] // 32-byte Folded Reload 568; CHECK-SD-NEXT: mov s0, v0.s[1] 569; CHECK-SD-NEXT: mov s1, v1.s[1] 570; CHECK-SD-NEXT: bl fmodf 571; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 572; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 573; CHECK-SD-NEXT: ldp q0, q1, [sp, #32] // 32-byte Folded Reload 574; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 575; CHECK-SD-NEXT: // kill: def $s1 killed $s1 killed $q1 576; CHECK-SD-NEXT: bl fmodf 577; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 578; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 579; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 580; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 581; CHECK-SD-NEXT: ldp q0, q1, [sp, #32] // 32-byte Folded Reload 582; CHECK-SD-NEXT: mov s0, v0.s[2] 583; CHECK-SD-NEXT: mov s1, v1.s[2] 584; CHECK-SD-NEXT: bl fmodf 585; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 586; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 587; CHECK-SD-NEXT: mov v1.s[2], v0.s[0] 588; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 589; CHECK-SD-NEXT: ldp q0, q1, [sp, #32] // 32-byte Folded Reload 590; CHECK-SD-NEXT: mov s0, v0.s[3] 591; CHECK-SD-NEXT: mov s1, v1.s[3] 592; CHECK-SD-NEXT: bl fmodf 593; CHECK-SD-NEXT: fmov s2, s0 594; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 595; CHECK-SD-NEXT: ldr q0, [sp, #64] // 16-byte Folded Reload 596; CHECK-SD-NEXT: ldr x30, [sp, #80] // 8-byte Folded Reload 597; CHECK-SD-NEXT: mov v1.s[3], v2.s[0] 598; CHECK-SD-NEXT: add sp, sp, #96 599; CHECK-SD-NEXT: ret 600; 601; CHECK-GI-LABEL: frem_v8f32: 602; CHECK-GI: // %bb.0: // %entry 603; CHECK-GI-NEXT: sub sp, sp, #208 604; CHECK-GI-NEXT: stp d15, d14, [sp, #128] // 16-byte Folded Spill 605; CHECK-GI-NEXT: stp d13, d12, [sp, #144] // 16-byte Folded Spill 606; CHECK-GI-NEXT: stp d11, d10, [sp, #160] // 16-byte Folded Spill 607; CHECK-GI-NEXT: stp d9, d8, [sp, #176] // 16-byte Folded Spill 608; CHECK-GI-NEXT: str x30, [sp, #192] // 8-byte Folded Spill 609; CHECK-GI-NEXT: .cfi_def_cfa_offset 208 610; CHECK-GI-NEXT: .cfi_offset w30, -16 611; CHECK-GI-NEXT: .cfi_offset b8, -24 612; CHECK-GI-NEXT: .cfi_offset b9, -32 613; CHECK-GI-NEXT: .cfi_offset b10, -40 614; CHECK-GI-NEXT: .cfi_offset b11, -48 615; CHECK-GI-NEXT: .cfi_offset b12, -56 616; CHECK-GI-NEXT: .cfi_offset b13, -64 617; CHECK-GI-NEXT: .cfi_offset b14, -72 618; CHECK-GI-NEXT: .cfi_offset b15, -80 619; CHECK-GI-NEXT: mov v4.16b, v1.16b 620; CHECK-GI-NEXT: mov v1.16b, v2.16b 621; CHECK-GI-NEXT: mov s8, v0.s[1] 622; CHECK-GI-NEXT: mov s9, v0.s[2] 623; CHECK-GI-NEXT: mov s10, v0.s[3] 624; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0 625; CHECK-GI-NEXT: mov s12, v3.s[1] 626; CHECK-GI-NEXT: mov s11, v3.s[2] 627; CHECK-GI-NEXT: mov s2, v4.s[1] 628; CHECK-GI-NEXT: stp q3, q4, [sp] // 32-byte Folded Spill 629; CHECK-GI-NEXT: mov s5, v4.s[3] 630; CHECK-GI-NEXT: mov s14, v1.s[1] 631; CHECK-GI-NEXT: mov s15, v1.s[2] 632; CHECK-GI-NEXT: mov s13, v1.s[3] 633; CHECK-GI-NEXT: // kill: def $s1 killed $s1 killed $q1 634; CHECK-GI-NEXT: str s2, [sp, #48] // 4-byte Folded Spill 635; CHECK-GI-NEXT: mov s2, v4.s[2] 636; CHECK-GI-NEXT: str s2, [sp, #112] // 4-byte Folded Spill 637; CHECK-GI-NEXT: mov s2, v3.s[3] 638; CHECK-GI-NEXT: stp s2, s5, [sp, #200] // 8-byte Folded Spill 639; CHECK-GI-NEXT: bl fmodf 640; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 641; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Folded Spill 642; CHECK-GI-NEXT: fmov s1, s14 643; CHECK-GI-NEXT: fmov s0, s8 644; CHECK-GI-NEXT: bl fmodf 645; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 646; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 647; CHECK-GI-NEXT: fmov s1, s15 648; CHECK-GI-NEXT: fmov s0, s9 649; CHECK-GI-NEXT: bl fmodf 650; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 651; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Folded Spill 652; CHECK-GI-NEXT: fmov s1, s13 653; CHECK-GI-NEXT: fmov s0, s10 654; CHECK-GI-NEXT: bl fmodf 655; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 656; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Folded Spill 657; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 658; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0 659; CHECK-GI-NEXT: // kill: def $s1 killed $s1 killed $q1 660; CHECK-GI-NEXT: bl fmodf 661; CHECK-GI-NEXT: fmov s1, s12 662; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 663; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 664; CHECK-GI-NEXT: ldr s0, [sp, #48] // 4-byte Folded Reload 665; CHECK-GI-NEXT: bl fmodf 666; CHECK-GI-NEXT: fmov s1, s11 667; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 668; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 669; CHECK-GI-NEXT: ldr s0, [sp, #112] // 4-byte Folded Reload 670; CHECK-GI-NEXT: bl fmodf 671; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 672; CHECK-GI-NEXT: str q0, [sp, #112] // 16-byte Folded Spill 673; CHECK-GI-NEXT: ldp s1, s0, [sp, #200] // 8-byte Folded Reload 674; CHECK-GI-NEXT: bl fmodf 675; CHECK-GI-NEXT: ldp q3, q2, [sp, #16] // 32-byte Folded Reload 676; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 677; CHECK-GI-NEXT: ldr q1, [sp, #96] // 16-byte Folded Reload 678; CHECK-GI-NEXT: ldp d9, d8, [sp, #176] // 16-byte Folded Reload 679; CHECK-GI-NEXT: ldr x30, [sp, #192] // 8-byte Folded Reload 680; CHECK-GI-NEXT: ldp d11, d10, [sp, #160] // 16-byte Folded Reload 681; CHECK-GI-NEXT: mov v1.s[1], v2.s[0] 682; CHECK-GI-NEXT: ldr q2, [sp, #48] // 16-byte Folded Reload 683; CHECK-GI-NEXT: ldp d13, d12, [sp, #144] // 16-byte Folded Reload 684; CHECK-GI-NEXT: mov v3.s[1], v2.s[0] 685; CHECK-GI-NEXT: ldr q2, [sp, #80] // 16-byte Folded Reload 686; CHECK-GI-NEXT: ldp d15, d14, [sp, #128] // 16-byte Folded Reload 687; CHECK-GI-NEXT: mov v1.s[2], v2.s[0] 688; CHECK-GI-NEXT: ldr q2, [sp, #112] // 16-byte Folded Reload 689; CHECK-GI-NEXT: mov v3.s[2], v2.s[0] 690; CHECK-GI-NEXT: ldr q2, [sp, #64] // 16-byte Folded Reload 691; CHECK-GI-NEXT: mov v1.s[3], v2.s[0] 692; CHECK-GI-NEXT: mov v3.s[3], v0.s[0] 693; CHECK-GI-NEXT: mov v2.16b, v1.16b 694; CHECK-GI-NEXT: mov v1.16b, v3.16b 695; CHECK-GI-NEXT: mov v0.16b, v2.16b 696; CHECK-GI-NEXT: add sp, sp, #208 697; CHECK-GI-NEXT: ret 698entry: 699 %c = frem <8 x float> %a, %b 700 ret <8 x float> %c 701} 702 703define <7 x half> @frem_v7f16(<7 x half> %a, <7 x half> %b) { 704; CHECK-SD-LABEL: frem_v7f16: 705; CHECK-SD: // %bb.0: // %entry 706; CHECK-SD-NEXT: sub sp, sp, #64 707; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 708; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 709; CHECK-SD-NEXT: .cfi_offset w30, -16 710; CHECK-SD-NEXT: mov h3, v0.h[1] 711; CHECK-SD-NEXT: mov h2, v1.h[1] 712; CHECK-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill 713; CHECK-SD-NEXT: fcvt s0, h3 714; CHECK-SD-NEXT: fcvt s1, h2 715; CHECK-SD-NEXT: bl fmodf 716; CHECK-SD-NEXT: fcvt h0, s0 717; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 718; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 719; CHECK-SD-NEXT: fcvt s0, h0 720; CHECK-SD-NEXT: fcvt s1, h1 721; CHECK-SD-NEXT: bl fmodf 722; CHECK-SD-NEXT: fcvt h0, s0 723; CHECK-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload 724; CHECK-SD-NEXT: mov h1, v1.h[2] 725; CHECK-SD-NEXT: mov v0.h[1], v2.h[0] 726; CHECK-SD-NEXT: fcvt s1, h1 727; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 728; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 729; CHECK-SD-NEXT: mov h0, v0.h[2] 730; CHECK-SD-NEXT: fcvt s0, h0 731; CHECK-SD-NEXT: bl fmodf 732; CHECK-SD-NEXT: fcvt h0, s0 733; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 734; CHECK-SD-NEXT: mov v1.h[2], v0.h[0] 735; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 736; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 737; CHECK-SD-NEXT: mov h0, v0.h[3] 738; CHECK-SD-NEXT: mov h1, v1.h[3] 739; CHECK-SD-NEXT: fcvt s0, h0 740; CHECK-SD-NEXT: fcvt s1, h1 741; CHECK-SD-NEXT: bl fmodf 742; CHECK-SD-NEXT: fcvt h0, s0 743; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 744; CHECK-SD-NEXT: mov v1.h[3], v0.h[0] 745; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 746; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 747; CHECK-SD-NEXT: mov h0, v0.h[4] 748; CHECK-SD-NEXT: mov h1, v1.h[4] 749; CHECK-SD-NEXT: fcvt s0, h0 750; CHECK-SD-NEXT: fcvt s1, h1 751; CHECK-SD-NEXT: bl fmodf 752; CHECK-SD-NEXT: fcvt h0, s0 753; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 754; CHECK-SD-NEXT: mov v1.h[4], v0.h[0] 755; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 756; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 757; CHECK-SD-NEXT: mov h0, v0.h[5] 758; CHECK-SD-NEXT: mov h1, v1.h[5] 759; CHECK-SD-NEXT: fcvt s0, h0 760; CHECK-SD-NEXT: fcvt s1, h1 761; CHECK-SD-NEXT: bl fmodf 762; CHECK-SD-NEXT: fcvt h0, s0 763; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 764; CHECK-SD-NEXT: mov v1.h[5], v0.h[0] 765; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 766; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 767; CHECK-SD-NEXT: mov h0, v0.h[6] 768; CHECK-SD-NEXT: mov h1, v1.h[6] 769; CHECK-SD-NEXT: fcvt s0, h0 770; CHECK-SD-NEXT: fcvt s1, h1 771; CHECK-SD-NEXT: bl fmodf 772; CHECK-SD-NEXT: fcvt h0, s0 773; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 774; CHECK-SD-NEXT: mov v1.h[6], v0.h[0] 775; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 776; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 777; CHECK-SD-NEXT: mov h0, v0.h[7] 778; CHECK-SD-NEXT: mov h1, v1.h[7] 779; CHECK-SD-NEXT: fcvt s0, h0 780; CHECK-SD-NEXT: fcvt s1, h1 781; CHECK-SD-NEXT: bl fmodf 782; CHECK-SD-NEXT: fcvt h1, s0 783; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 784; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 785; CHECK-SD-NEXT: mov v0.h[7], v1.h[0] 786; CHECK-SD-NEXT: add sp, sp, #64 787; CHECK-SD-NEXT: ret 788; 789; CHECK-GI-LABEL: frem_v7f16: 790; CHECK-GI: // %bb.0: // %entry 791; CHECK-GI-NEXT: sub sp, sp, #176 792; CHECK-GI-NEXT: stp d15, d14, [sp, #96] // 16-byte Folded Spill 793; CHECK-GI-NEXT: stp d13, d12, [sp, #112] // 16-byte Folded Spill 794; CHECK-GI-NEXT: stp d11, d10, [sp, #128] // 16-byte Folded Spill 795; CHECK-GI-NEXT: stp d9, d8, [sp, #144] // 16-byte Folded Spill 796; CHECK-GI-NEXT: str x30, [sp, #160] // 8-byte Folded Spill 797; CHECK-GI-NEXT: .cfi_def_cfa_offset 176 798; CHECK-GI-NEXT: .cfi_offset w30, -16 799; CHECK-GI-NEXT: .cfi_offset b8, -24 800; CHECK-GI-NEXT: .cfi_offset b9, -32 801; CHECK-GI-NEXT: .cfi_offset b10, -40 802; CHECK-GI-NEXT: .cfi_offset b11, -48 803; CHECK-GI-NEXT: .cfi_offset b12, -56 804; CHECK-GI-NEXT: .cfi_offset b13, -64 805; CHECK-GI-NEXT: .cfi_offset b14, -72 806; CHECK-GI-NEXT: .cfi_offset b15, -80 807; CHECK-GI-NEXT: mov h2, v0.h[5] 808; CHECK-GI-NEXT: mov h9, v0.h[1] 809; CHECK-GI-NEXT: mov h10, v0.h[2] 810; CHECK-GI-NEXT: mov h11, v0.h[3] 811; CHECK-GI-NEXT: mov h12, v0.h[4] 812; CHECK-GI-NEXT: mov h14, v1.h[1] 813; CHECK-GI-NEXT: mov h15, v1.h[2] 814; CHECK-GI-NEXT: mov h8, v1.h[3] 815; CHECK-GI-NEXT: mov h13, v1.h[4] 816; CHECK-GI-NEXT: str h2, [sp, #48] // 2-byte Folded Spill 817; CHECK-GI-NEXT: mov h2, v0.h[6] 818; CHECK-GI-NEXT: fcvt s0, h0 819; CHECK-GI-NEXT: str h2, [sp, #80] // 2-byte Folded Spill 820; CHECK-GI-NEXT: mov h2, v1.h[5] 821; CHECK-GI-NEXT: str h2, [sp, #172] // 2-byte Folded Spill 822; CHECK-GI-NEXT: mov h2, v1.h[6] 823; CHECK-GI-NEXT: fcvt s1, h1 824; CHECK-GI-NEXT: str h2, [sp, #174] // 2-byte Folded Spill 825; CHECK-GI-NEXT: bl fmodf 826; CHECK-GI-NEXT: fcvt s2, h9 827; CHECK-GI-NEXT: fcvt h0, s0 828; CHECK-GI-NEXT: fcvt s1, h14 829; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Folded Spill 830; CHECK-GI-NEXT: fmov s0, s2 831; CHECK-GI-NEXT: bl fmodf 832; CHECK-GI-NEXT: fcvt s2, h10 833; CHECK-GI-NEXT: fcvt h0, s0 834; CHECK-GI-NEXT: fcvt s1, h15 835; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 836; CHECK-GI-NEXT: fmov s0, s2 837; CHECK-GI-NEXT: bl fmodf 838; CHECK-GI-NEXT: fcvt s2, h11 839; CHECK-GI-NEXT: fcvt h0, s0 840; CHECK-GI-NEXT: fcvt s1, h8 841; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 842; CHECK-GI-NEXT: fmov s0, s2 843; CHECK-GI-NEXT: bl fmodf 844; CHECK-GI-NEXT: fcvt s2, h12 845; CHECK-GI-NEXT: fcvt h0, s0 846; CHECK-GI-NEXT: fcvt s1, h13 847; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 848; CHECK-GI-NEXT: fmov s0, s2 849; CHECK-GI-NEXT: bl fmodf 850; CHECK-GI-NEXT: ldr h1, [sp, #48] // 2-byte Folded Reload 851; CHECK-GI-NEXT: fcvt h0, s0 852; CHECK-GI-NEXT: fcvt s2, h1 853; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 854; CHECK-GI-NEXT: ldr h0, [sp, #172] // 2-byte Folded Reload 855; CHECK-GI-NEXT: fcvt s1, h0 856; CHECK-GI-NEXT: fmov s0, s2 857; CHECK-GI-NEXT: bl fmodf 858; CHECK-GI-NEXT: ldr h1, [sp, #80] // 2-byte Folded Reload 859; CHECK-GI-NEXT: fcvt h0, s0 860; CHECK-GI-NEXT: fcvt s2, h1 861; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Folded Spill 862; CHECK-GI-NEXT: ldr h0, [sp, #174] // 2-byte Folded Reload 863; CHECK-GI-NEXT: fcvt s1, h0 864; CHECK-GI-NEXT: fmov s0, s2 865; CHECK-GI-NEXT: bl fmodf 866; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload 867; CHECK-GI-NEXT: fcvt h0, s0 868; CHECK-GI-NEXT: ldr q1, [sp, #64] // 16-byte Folded Reload 869; CHECK-GI-NEXT: ldp d9, d8, [sp, #144] // 16-byte Folded Reload 870; CHECK-GI-NEXT: ldp d11, d10, [sp, #128] // 16-byte Folded Reload 871; CHECK-GI-NEXT: ldr x30, [sp, #160] // 8-byte Folded Reload 872; CHECK-GI-NEXT: mov v1.h[1], v3.h[0] 873; CHECK-GI-NEXT: ldp d13, d12, [sp, #112] // 16-byte Folded Reload 874; CHECK-GI-NEXT: ldp d15, d14, [sp, #96] // 16-byte Folded Reload 875; CHECK-GI-NEXT: mov v1.h[2], v2.h[0] 876; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Folded Reload 877; CHECK-GI-NEXT: mov v1.h[3], v2.h[0] 878; CHECK-GI-NEXT: ldr q2, [sp, #48] // 16-byte Folded Reload 879; CHECK-GI-NEXT: mov v1.h[4], v2.h[0] 880; CHECK-GI-NEXT: ldr q2, [sp, #80] // 16-byte Folded Reload 881; CHECK-GI-NEXT: mov v1.h[5], v2.h[0] 882; CHECK-GI-NEXT: mov v1.h[6], v0.h[0] 883; CHECK-GI-NEXT: mov v0.16b, v1.16b 884; CHECK-GI-NEXT: add sp, sp, #176 885; CHECK-GI-NEXT: ret 886entry: 887 %c = frem <7 x half> %a, %b 888 ret <7 x half> %c 889} 890 891define <4 x half> @frem_v4f16(<4 x half> %a, <4 x half> %b) { 892; CHECK-SD-LABEL: frem_v4f16: 893; CHECK-SD: // %bb.0: // %entry 894; CHECK-SD-NEXT: sub sp, sp, #64 895; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 896; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 897; CHECK-SD-NEXT: .cfi_offset w30, -16 898; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 899; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 900; CHECK-SD-NEXT: mov h3, v0.h[1] 901; CHECK-SD-NEXT: mov h2, v1.h[1] 902; CHECK-SD-NEXT: stp q0, q1, [sp, #16] // 32-byte Folded Spill 903; CHECK-SD-NEXT: fcvt s0, h3 904; CHECK-SD-NEXT: fcvt s1, h2 905; CHECK-SD-NEXT: bl fmodf 906; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 907; CHECK-SD-NEXT: fcvt h0, s0 908; CHECK-SD-NEXT: fcvt s2, h1 909; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 910; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 911; CHECK-SD-NEXT: fcvt s1, h0 912; CHECK-SD-NEXT: fmov s0, s2 913; CHECK-SD-NEXT: bl fmodf 914; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 915; CHECK-SD-NEXT: fcvt h3, s0 916; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 917; CHECK-SD-NEXT: mov h1, v1.h[2] 918; CHECK-SD-NEXT: mov h2, v0.h[2] 919; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 920; CHECK-SD-NEXT: mov v3.h[1], v0.h[0] 921; CHECK-SD-NEXT: fcvt s0, h1 922; CHECK-SD-NEXT: fcvt s1, h2 923; CHECK-SD-NEXT: str q3, [sp] // 16-byte Folded Spill 924; CHECK-SD-NEXT: bl fmodf 925; CHECK-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload 926; CHECK-SD-NEXT: fcvt h0, s0 927; CHECK-SD-NEXT: ldr q3, [sp] // 16-byte Folded Reload 928; CHECK-SD-NEXT: mov h1, v1.h[3] 929; CHECK-SD-NEXT: mov h2, v2.h[3] 930; CHECK-SD-NEXT: mov v3.h[2], v0.h[0] 931; CHECK-SD-NEXT: fcvt s0, h1 932; CHECK-SD-NEXT: fcvt s1, h2 933; CHECK-SD-NEXT: str q3, [sp] // 16-byte Folded Spill 934; CHECK-SD-NEXT: bl fmodf 935; CHECK-SD-NEXT: fcvt h1, s0 936; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 937; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 938; CHECK-SD-NEXT: mov v0.h[3], v1.h[0] 939; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 940; CHECK-SD-NEXT: add sp, sp, #64 941; CHECK-SD-NEXT: ret 942; 943; CHECK-GI-LABEL: frem_v4f16: 944; CHECK-GI: // %bb.0: // %entry 945; CHECK-GI-NEXT: sub sp, sp, #112 946; CHECK-GI-NEXT: stp d13, d12, [sp, #48] // 16-byte Folded Spill 947; CHECK-GI-NEXT: stp d11, d10, [sp, #64] // 16-byte Folded Spill 948; CHECK-GI-NEXT: stp d9, d8, [sp, #80] // 16-byte Folded Spill 949; CHECK-GI-NEXT: str x30, [sp, #96] // 8-byte Folded Spill 950; CHECK-GI-NEXT: .cfi_def_cfa_offset 112 951; CHECK-GI-NEXT: .cfi_offset w30, -16 952; CHECK-GI-NEXT: .cfi_offset b8, -24 953; CHECK-GI-NEXT: .cfi_offset b9, -32 954; CHECK-GI-NEXT: .cfi_offset b10, -40 955; CHECK-GI-NEXT: .cfi_offset b11, -48 956; CHECK-GI-NEXT: .cfi_offset b12, -56 957; CHECK-GI-NEXT: .cfi_offset b13, -64 958; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 959; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 960; CHECK-GI-NEXT: mov h8, v0.h[1] 961; CHECK-GI-NEXT: mov h9, v0.h[2] 962; CHECK-GI-NEXT: mov h10, v0.h[3] 963; CHECK-GI-NEXT: mov h11, v1.h[1] 964; CHECK-GI-NEXT: mov h12, v1.h[2] 965; CHECK-GI-NEXT: mov h13, v1.h[3] 966; CHECK-GI-NEXT: fcvt s0, h0 967; CHECK-GI-NEXT: fcvt s1, h1 968; CHECK-GI-NEXT: bl fmodf 969; CHECK-GI-NEXT: fcvt s2, h8 970; CHECK-GI-NEXT: fcvt h0, s0 971; CHECK-GI-NEXT: fcvt s1, h11 972; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 973; CHECK-GI-NEXT: fmov s0, s2 974; CHECK-GI-NEXT: bl fmodf 975; CHECK-GI-NEXT: fcvt s2, h9 976; CHECK-GI-NEXT: fcvt h0, s0 977; CHECK-GI-NEXT: fcvt s1, h12 978; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 979; CHECK-GI-NEXT: fmov s0, s2 980; CHECK-GI-NEXT: bl fmodf 981; CHECK-GI-NEXT: fcvt s2, h10 982; CHECK-GI-NEXT: fcvt h0, s0 983; CHECK-GI-NEXT: fcvt s1, h13 984; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 985; CHECK-GI-NEXT: fmov s0, s2 986; CHECK-GI-NEXT: bl fmodf 987; CHECK-GI-NEXT: ldp q3, q2, [sp] // 32-byte Folded Reload 988; CHECK-GI-NEXT: fcvt h0, s0 989; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 990; CHECK-GI-NEXT: ldp d9, d8, [sp, #80] // 16-byte Folded Reload 991; CHECK-GI-NEXT: ldp d11, d10, [sp, #64] // 16-byte Folded Reload 992; CHECK-GI-NEXT: ldr x30, [sp, #96] // 8-byte Folded Reload 993; CHECK-GI-NEXT: mov v1.h[1], v3.h[0] 994; CHECK-GI-NEXT: ldp d13, d12, [sp, #48] // 16-byte Folded Reload 995; CHECK-GI-NEXT: mov v1.h[2], v2.h[0] 996; CHECK-GI-NEXT: mov v1.h[3], v0.h[0] 997; CHECK-GI-NEXT: mov v0.16b, v1.16b 998; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 999; CHECK-GI-NEXT: add sp, sp, #112 1000; CHECK-GI-NEXT: ret 1001entry: 1002 %c = frem <4 x half> %a, %b 1003 ret <4 x half> %c 1004} 1005 1006define <8 x half> @frem_v8f16(<8 x half> %a, <8 x half> %b) { 1007; CHECK-SD-LABEL: frem_v8f16: 1008; CHECK-SD: // %bb.0: // %entry 1009; CHECK-SD-NEXT: sub sp, sp, #64 1010; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 1011; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 1012; CHECK-SD-NEXT: .cfi_offset w30, -16 1013; CHECK-SD-NEXT: mov h3, v0.h[1] 1014; CHECK-SD-NEXT: mov h2, v1.h[1] 1015; CHECK-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill 1016; CHECK-SD-NEXT: fcvt s0, h3 1017; CHECK-SD-NEXT: fcvt s1, h2 1018; CHECK-SD-NEXT: bl fmodf 1019; CHECK-SD-NEXT: fcvt h0, s0 1020; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 1021; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 1022; CHECK-SD-NEXT: fcvt s0, h0 1023; CHECK-SD-NEXT: fcvt s1, h1 1024; CHECK-SD-NEXT: bl fmodf 1025; CHECK-SD-NEXT: fcvt h0, s0 1026; CHECK-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload 1027; CHECK-SD-NEXT: mov h1, v1.h[2] 1028; CHECK-SD-NEXT: mov v0.h[1], v2.h[0] 1029; CHECK-SD-NEXT: fcvt s1, h1 1030; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 1031; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1032; CHECK-SD-NEXT: mov h0, v0.h[2] 1033; CHECK-SD-NEXT: fcvt s0, h0 1034; CHECK-SD-NEXT: bl fmodf 1035; CHECK-SD-NEXT: fcvt h0, s0 1036; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1037; CHECK-SD-NEXT: mov v1.h[2], v0.h[0] 1038; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 1039; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 1040; CHECK-SD-NEXT: mov h0, v0.h[3] 1041; CHECK-SD-NEXT: mov h1, v1.h[3] 1042; CHECK-SD-NEXT: fcvt s0, h0 1043; CHECK-SD-NEXT: fcvt s1, h1 1044; CHECK-SD-NEXT: bl fmodf 1045; CHECK-SD-NEXT: fcvt h0, s0 1046; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1047; CHECK-SD-NEXT: mov v1.h[3], v0.h[0] 1048; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 1049; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 1050; CHECK-SD-NEXT: mov h0, v0.h[4] 1051; CHECK-SD-NEXT: mov h1, v1.h[4] 1052; CHECK-SD-NEXT: fcvt s0, h0 1053; CHECK-SD-NEXT: fcvt s1, h1 1054; CHECK-SD-NEXT: bl fmodf 1055; CHECK-SD-NEXT: fcvt h0, s0 1056; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1057; CHECK-SD-NEXT: mov v1.h[4], v0.h[0] 1058; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 1059; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 1060; CHECK-SD-NEXT: mov h0, v0.h[5] 1061; CHECK-SD-NEXT: mov h1, v1.h[5] 1062; CHECK-SD-NEXT: fcvt s0, h0 1063; CHECK-SD-NEXT: fcvt s1, h1 1064; CHECK-SD-NEXT: bl fmodf 1065; CHECK-SD-NEXT: fcvt h0, s0 1066; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1067; CHECK-SD-NEXT: mov v1.h[5], v0.h[0] 1068; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 1069; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 1070; CHECK-SD-NEXT: mov h0, v0.h[6] 1071; CHECK-SD-NEXT: mov h1, v1.h[6] 1072; CHECK-SD-NEXT: fcvt s0, h0 1073; CHECK-SD-NEXT: fcvt s1, h1 1074; CHECK-SD-NEXT: bl fmodf 1075; CHECK-SD-NEXT: fcvt h0, s0 1076; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1077; CHECK-SD-NEXT: mov v1.h[6], v0.h[0] 1078; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 1079; CHECK-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 1080; CHECK-SD-NEXT: mov h0, v0.h[7] 1081; CHECK-SD-NEXT: mov h1, v1.h[7] 1082; CHECK-SD-NEXT: fcvt s0, h0 1083; CHECK-SD-NEXT: fcvt s1, h1 1084; CHECK-SD-NEXT: bl fmodf 1085; CHECK-SD-NEXT: fcvt h1, s0 1086; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 1087; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 1088; CHECK-SD-NEXT: mov v0.h[7], v1.h[0] 1089; CHECK-SD-NEXT: add sp, sp, #64 1090; CHECK-SD-NEXT: ret 1091; 1092; CHECK-GI-LABEL: frem_v8f16: 1093; CHECK-GI: // %bb.0: // %entry 1094; CHECK-GI-NEXT: sub sp, sp, #192 1095; CHECK-GI-NEXT: stp d15, d14, [sp, #112] // 16-byte Folded Spill 1096; CHECK-GI-NEXT: stp d13, d12, [sp, #128] // 16-byte Folded Spill 1097; CHECK-GI-NEXT: stp d11, d10, [sp, #144] // 16-byte Folded Spill 1098; CHECK-GI-NEXT: stp d9, d8, [sp, #160] // 16-byte Folded Spill 1099; CHECK-GI-NEXT: str x30, [sp, #176] // 8-byte Folded Spill 1100; CHECK-GI-NEXT: .cfi_def_cfa_offset 192 1101; CHECK-GI-NEXT: .cfi_offset w30, -16 1102; CHECK-GI-NEXT: .cfi_offset b8, -24 1103; CHECK-GI-NEXT: .cfi_offset b9, -32 1104; CHECK-GI-NEXT: .cfi_offset b10, -40 1105; CHECK-GI-NEXT: .cfi_offset b11, -48 1106; CHECK-GI-NEXT: .cfi_offset b12, -56 1107; CHECK-GI-NEXT: .cfi_offset b13, -64 1108; CHECK-GI-NEXT: .cfi_offset b14, -72 1109; CHECK-GI-NEXT: .cfi_offset b15, -80 1110; CHECK-GI-NEXT: mov h2, v0.h[5] 1111; CHECK-GI-NEXT: mov h11, v0.h[1] 1112; CHECK-GI-NEXT: mov h12, v0.h[2] 1113; CHECK-GI-NEXT: mov h13, v0.h[3] 1114; CHECK-GI-NEXT: mov h14, v0.h[4] 1115; CHECK-GI-NEXT: mov h8, v1.h[1] 1116; CHECK-GI-NEXT: mov h9, v1.h[2] 1117; CHECK-GI-NEXT: mov h10, v1.h[3] 1118; CHECK-GI-NEXT: mov h15, v1.h[4] 1119; CHECK-GI-NEXT: str h2, [sp, #48] // 2-byte Folded Spill 1120; CHECK-GI-NEXT: mov h2, v0.h[6] 1121; CHECK-GI-NEXT: str h2, [sp, #64] // 2-byte Folded Spill 1122; CHECK-GI-NEXT: mov h2, v0.h[7] 1123; CHECK-GI-NEXT: fcvt s0, h0 1124; CHECK-GI-NEXT: str h2, [sp, #96] // 2-byte Folded Spill 1125; CHECK-GI-NEXT: mov h2, v1.h[5] 1126; CHECK-GI-NEXT: str h2, [sp, #186] // 2-byte Folded Spill 1127; CHECK-GI-NEXT: mov h2, v1.h[6] 1128; CHECK-GI-NEXT: str h2, [sp, #188] // 2-byte Folded Spill 1129; CHECK-GI-NEXT: mov h2, v1.h[7] 1130; CHECK-GI-NEXT: fcvt s1, h1 1131; CHECK-GI-NEXT: str h2, [sp, #190] // 2-byte Folded Spill 1132; CHECK-GI-NEXT: bl fmodf 1133; CHECK-GI-NEXT: fcvt s2, h11 1134; CHECK-GI-NEXT: fcvt h0, s0 1135; CHECK-GI-NEXT: fcvt s1, h8 1136; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Folded Spill 1137; CHECK-GI-NEXT: fmov s0, s2 1138; CHECK-GI-NEXT: bl fmodf 1139; CHECK-GI-NEXT: fcvt s2, h12 1140; CHECK-GI-NEXT: fcvt h0, s0 1141; CHECK-GI-NEXT: fcvt s1, h9 1142; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 1143; CHECK-GI-NEXT: fmov s0, s2 1144; CHECK-GI-NEXT: bl fmodf 1145; CHECK-GI-NEXT: fcvt s2, h13 1146; CHECK-GI-NEXT: fcvt h0, s0 1147; CHECK-GI-NEXT: fcvt s1, h10 1148; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1149; CHECK-GI-NEXT: fmov s0, s2 1150; CHECK-GI-NEXT: bl fmodf 1151; CHECK-GI-NEXT: fcvt s2, h14 1152; CHECK-GI-NEXT: fcvt h0, s0 1153; CHECK-GI-NEXT: fcvt s1, h15 1154; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1155; CHECK-GI-NEXT: fmov s0, s2 1156; CHECK-GI-NEXT: bl fmodf 1157; CHECK-GI-NEXT: ldr h1, [sp, #48] // 2-byte Folded Reload 1158; CHECK-GI-NEXT: fcvt h0, s0 1159; CHECK-GI-NEXT: fcvt s2, h1 1160; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 1161; CHECK-GI-NEXT: ldr h0, [sp, #186] // 2-byte Folded Reload 1162; CHECK-GI-NEXT: fcvt s1, h0 1163; CHECK-GI-NEXT: fmov s0, s2 1164; CHECK-GI-NEXT: bl fmodf 1165; CHECK-GI-NEXT: ldr h1, [sp, #64] // 2-byte Folded Reload 1166; CHECK-GI-NEXT: fcvt h0, s0 1167; CHECK-GI-NEXT: fcvt s2, h1 1168; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Folded Spill 1169; CHECK-GI-NEXT: ldr h0, [sp, #188] // 2-byte Folded Reload 1170; CHECK-GI-NEXT: fcvt s1, h0 1171; CHECK-GI-NEXT: fmov s0, s2 1172; CHECK-GI-NEXT: bl fmodf 1173; CHECK-GI-NEXT: ldr h1, [sp, #96] // 2-byte Folded Reload 1174; CHECK-GI-NEXT: fcvt h0, s0 1175; CHECK-GI-NEXT: fcvt s2, h1 1176; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Folded Spill 1177; CHECK-GI-NEXT: ldr h0, [sp, #190] // 2-byte Folded Reload 1178; CHECK-GI-NEXT: fcvt s1, h0 1179; CHECK-GI-NEXT: fmov s0, s2 1180; CHECK-GI-NEXT: bl fmodf 1181; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload 1182; CHECK-GI-NEXT: fcvt h0, s0 1183; CHECK-GI-NEXT: ldr q1, [sp, #80] // 16-byte Folded Reload 1184; CHECK-GI-NEXT: ldp d9, d8, [sp, #160] // 16-byte Folded Reload 1185; CHECK-GI-NEXT: ldp d11, d10, [sp, #144] // 16-byte Folded Reload 1186; CHECK-GI-NEXT: ldr x30, [sp, #176] // 8-byte Folded Reload 1187; CHECK-GI-NEXT: mov v1.h[1], v3.h[0] 1188; CHECK-GI-NEXT: ldp d13, d12, [sp, #128] // 16-byte Folded Reload 1189; CHECK-GI-NEXT: ldp d15, d14, [sp, #112] // 16-byte Folded Reload 1190; CHECK-GI-NEXT: mov v1.h[2], v2.h[0] 1191; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Folded Reload 1192; CHECK-GI-NEXT: mov v1.h[3], v2.h[0] 1193; CHECK-GI-NEXT: ldp q3, q2, [sp, #48] // 32-byte Folded Reload 1194; CHECK-GI-NEXT: mov v1.h[4], v3.h[0] 1195; CHECK-GI-NEXT: mov v1.h[5], v2.h[0] 1196; CHECK-GI-NEXT: ldr q2, [sp, #96] // 16-byte Folded Reload 1197; CHECK-GI-NEXT: mov v1.h[6], v2.h[0] 1198; CHECK-GI-NEXT: mov v1.h[7], v0.h[0] 1199; CHECK-GI-NEXT: mov v0.16b, v1.16b 1200; CHECK-GI-NEXT: add sp, sp, #192 1201; CHECK-GI-NEXT: ret 1202entry: 1203 %c = frem <8 x half> %a, %b 1204 ret <8 x half> %c 1205} 1206 1207define <16 x half> @frem_v16f16(<16 x half> %a, <16 x half> %b) { 1208; CHECK-SD-LABEL: frem_v16f16: 1209; CHECK-SD: // %bb.0: // %entry 1210; CHECK-SD-NEXT: sub sp, sp, #96 1211; CHECK-SD-NEXT: str x30, [sp, #80] // 8-byte Folded Spill 1212; CHECK-SD-NEXT: .cfi_def_cfa_offset 96 1213; CHECK-SD-NEXT: .cfi_offset w30, -16 1214; CHECK-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill 1215; CHECK-SD-NEXT: mov h1, v2.h[1] 1216; CHECK-SD-NEXT: stp q3, q2, [sp, #32] // 32-byte Folded Spill 1217; CHECK-SD-NEXT: mov h3, v0.h[1] 1218; CHECK-SD-NEXT: fcvt s1, h1 1219; CHECK-SD-NEXT: fcvt s0, h3 1220; CHECK-SD-NEXT: bl fmodf 1221; CHECK-SD-NEXT: fcvt h0, s0 1222; CHECK-SD-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1223; CHECK-SD-NEXT: fcvt s1, h1 1224; CHECK-SD-NEXT: str q0, [sp, #64] // 16-byte Folded Spill 1225; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1226; CHECK-SD-NEXT: fcvt s0, h0 1227; CHECK-SD-NEXT: bl fmodf 1228; CHECK-SD-NEXT: fcvt h0, s0 1229; CHECK-SD-NEXT: ldp q1, q2, [sp, #48] // 32-byte Folded Reload 1230; CHECK-SD-NEXT: mov h1, v1.h[2] 1231; CHECK-SD-NEXT: mov v0.h[1], v2.h[0] 1232; CHECK-SD-NEXT: fcvt s1, h1 1233; CHECK-SD-NEXT: str q0, [sp, #64] // 16-byte Folded Spill 1234; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1235; CHECK-SD-NEXT: mov h0, v0.h[2] 1236; CHECK-SD-NEXT: fcvt s0, h0 1237; CHECK-SD-NEXT: bl fmodf 1238; CHECK-SD-NEXT: fcvt h0, s0 1239; CHECK-SD-NEXT: ldr q1, [sp, #64] // 16-byte Folded Reload 1240; CHECK-SD-NEXT: mov v1.h[2], v0.h[0] 1241; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1242; CHECK-SD-NEXT: mov h0, v0.h[3] 1243; CHECK-SD-NEXT: str q1, [sp, #64] // 16-byte Folded Spill 1244; CHECK-SD-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1245; CHECK-SD-NEXT: mov h1, v1.h[3] 1246; CHECK-SD-NEXT: fcvt s0, h0 1247; CHECK-SD-NEXT: fcvt s1, h1 1248; CHECK-SD-NEXT: bl fmodf 1249; CHECK-SD-NEXT: fcvt h0, s0 1250; CHECK-SD-NEXT: ldr q1, [sp, #64] // 16-byte Folded Reload 1251; CHECK-SD-NEXT: mov v1.h[3], v0.h[0] 1252; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1253; CHECK-SD-NEXT: mov h0, v0.h[4] 1254; CHECK-SD-NEXT: str q1, [sp, #64] // 16-byte Folded Spill 1255; CHECK-SD-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1256; CHECK-SD-NEXT: mov h1, v1.h[4] 1257; CHECK-SD-NEXT: fcvt s0, h0 1258; CHECK-SD-NEXT: fcvt s1, h1 1259; CHECK-SD-NEXT: bl fmodf 1260; CHECK-SD-NEXT: fcvt h0, s0 1261; CHECK-SD-NEXT: ldr q1, [sp, #64] // 16-byte Folded Reload 1262; CHECK-SD-NEXT: mov v1.h[4], v0.h[0] 1263; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1264; CHECK-SD-NEXT: mov h0, v0.h[5] 1265; CHECK-SD-NEXT: str q1, [sp, #64] // 16-byte Folded Spill 1266; CHECK-SD-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1267; CHECK-SD-NEXT: mov h1, v1.h[5] 1268; CHECK-SD-NEXT: fcvt s0, h0 1269; CHECK-SD-NEXT: fcvt s1, h1 1270; CHECK-SD-NEXT: bl fmodf 1271; CHECK-SD-NEXT: fcvt h0, s0 1272; CHECK-SD-NEXT: ldr q1, [sp, #64] // 16-byte Folded Reload 1273; CHECK-SD-NEXT: mov v1.h[5], v0.h[0] 1274; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1275; CHECK-SD-NEXT: mov h0, v0.h[6] 1276; CHECK-SD-NEXT: str q1, [sp, #64] // 16-byte Folded Spill 1277; CHECK-SD-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1278; CHECK-SD-NEXT: mov h1, v1.h[6] 1279; CHECK-SD-NEXT: fcvt s0, h0 1280; CHECK-SD-NEXT: fcvt s1, h1 1281; CHECK-SD-NEXT: bl fmodf 1282; CHECK-SD-NEXT: fcvt h0, s0 1283; CHECK-SD-NEXT: ldr q1, [sp, #64] // 16-byte Folded Reload 1284; CHECK-SD-NEXT: mov v1.h[6], v0.h[0] 1285; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1286; CHECK-SD-NEXT: mov h0, v0.h[7] 1287; CHECK-SD-NEXT: str q1, [sp, #64] // 16-byte Folded Spill 1288; CHECK-SD-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1289; CHECK-SD-NEXT: mov h1, v1.h[7] 1290; CHECK-SD-NEXT: fcvt s0, h0 1291; CHECK-SD-NEXT: fcvt s1, h1 1292; CHECK-SD-NEXT: bl fmodf 1293; CHECK-SD-NEXT: fcvt h0, s0 1294; CHECK-SD-NEXT: ldr q1, [sp, #64] // 16-byte Folded Reload 1295; CHECK-SD-NEXT: mov v1.h[7], v0.h[0] 1296; CHECK-SD-NEXT: str q1, [sp, #64] // 16-byte Folded Spill 1297; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 1298; CHECK-SD-NEXT: mov h0, v0.h[1] 1299; CHECK-SD-NEXT: mov h1, v1.h[1] 1300; CHECK-SD-NEXT: fcvt s0, h0 1301; CHECK-SD-NEXT: fcvt s1, h1 1302; CHECK-SD-NEXT: bl fmodf 1303; CHECK-SD-NEXT: fcvt h0, s0 1304; CHECK-SD-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 1305; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 1306; CHECK-SD-NEXT: fcvt s0, h0 1307; CHECK-SD-NEXT: fcvt s1, h1 1308; CHECK-SD-NEXT: bl fmodf 1309; CHECK-SD-NEXT: fcvt h0, s0 1310; CHECK-SD-NEXT: ldp q1, q2, [sp, #32] // 32-byte Folded Reload 1311; CHECK-SD-NEXT: mov h1, v1.h[2] 1312; CHECK-SD-NEXT: mov v0.h[1], v2.h[0] 1313; CHECK-SD-NEXT: fcvt s1, h1 1314; CHECK-SD-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 1315; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1316; CHECK-SD-NEXT: mov h0, v0.h[2] 1317; CHECK-SD-NEXT: fcvt s0, h0 1318; CHECK-SD-NEXT: bl fmodf 1319; CHECK-SD-NEXT: fcvt h0, s0 1320; CHECK-SD-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1321; CHECK-SD-NEXT: mov v1.h[2], v0.h[0] 1322; CHECK-SD-NEXT: str q1, [sp, #48] // 16-byte Folded Spill 1323; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 1324; CHECK-SD-NEXT: mov h0, v0.h[3] 1325; CHECK-SD-NEXT: mov h1, v1.h[3] 1326; CHECK-SD-NEXT: fcvt s0, h0 1327; CHECK-SD-NEXT: fcvt s1, h1 1328; CHECK-SD-NEXT: bl fmodf 1329; CHECK-SD-NEXT: fcvt h0, s0 1330; CHECK-SD-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1331; CHECK-SD-NEXT: mov v1.h[3], v0.h[0] 1332; CHECK-SD-NEXT: str q1, [sp, #48] // 16-byte Folded Spill 1333; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 1334; CHECK-SD-NEXT: mov h0, v0.h[4] 1335; CHECK-SD-NEXT: mov h1, v1.h[4] 1336; CHECK-SD-NEXT: fcvt s0, h0 1337; CHECK-SD-NEXT: fcvt s1, h1 1338; CHECK-SD-NEXT: bl fmodf 1339; CHECK-SD-NEXT: fcvt h0, s0 1340; CHECK-SD-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1341; CHECK-SD-NEXT: mov v1.h[4], v0.h[0] 1342; CHECK-SD-NEXT: str q1, [sp, #48] // 16-byte Folded Spill 1343; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 1344; CHECK-SD-NEXT: mov h0, v0.h[5] 1345; CHECK-SD-NEXT: mov h1, v1.h[5] 1346; CHECK-SD-NEXT: fcvt s0, h0 1347; CHECK-SD-NEXT: fcvt s1, h1 1348; CHECK-SD-NEXT: bl fmodf 1349; CHECK-SD-NEXT: fcvt h0, s0 1350; CHECK-SD-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1351; CHECK-SD-NEXT: mov v1.h[5], v0.h[0] 1352; CHECK-SD-NEXT: str q1, [sp, #48] // 16-byte Folded Spill 1353; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 1354; CHECK-SD-NEXT: mov h0, v0.h[6] 1355; CHECK-SD-NEXT: mov h1, v1.h[6] 1356; CHECK-SD-NEXT: fcvt s0, h0 1357; CHECK-SD-NEXT: fcvt s1, h1 1358; CHECK-SD-NEXT: bl fmodf 1359; CHECK-SD-NEXT: fcvt h0, s0 1360; CHECK-SD-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1361; CHECK-SD-NEXT: mov v1.h[6], v0.h[0] 1362; CHECK-SD-NEXT: str q1, [sp, #48] // 16-byte Folded Spill 1363; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 1364; CHECK-SD-NEXT: mov h0, v0.h[7] 1365; CHECK-SD-NEXT: mov h1, v1.h[7] 1366; CHECK-SD-NEXT: fcvt s0, h0 1367; CHECK-SD-NEXT: fcvt s1, h1 1368; CHECK-SD-NEXT: bl fmodf 1369; CHECK-SD-NEXT: fmov s1, s0 1370; CHECK-SD-NEXT: ldr x30, [sp, #80] // 8-byte Folded Reload 1371; CHECK-SD-NEXT: fcvt h2, s1 1372; CHECK-SD-NEXT: ldp q1, q0, [sp, #48] // 32-byte Folded Reload 1373; CHECK-SD-NEXT: mov v1.h[7], v2.h[0] 1374; CHECK-SD-NEXT: add sp, sp, #96 1375; CHECK-SD-NEXT: ret 1376; 1377; CHECK-GI-LABEL: frem_v16f16: 1378; CHECK-GI: // %bb.0: // %entry 1379; CHECK-GI-NEXT: sub sp, sp, #448 1380; CHECK-GI-NEXT: stp d15, d14, [sp, #368] // 16-byte Folded Spill 1381; CHECK-GI-NEXT: stp d13, d12, [sp, #384] // 16-byte Folded Spill 1382; CHECK-GI-NEXT: stp d11, d10, [sp, #400] // 16-byte Folded Spill 1383; CHECK-GI-NEXT: stp d9, d8, [sp, #416] // 16-byte Folded Spill 1384; CHECK-GI-NEXT: stp x29, x30, [sp, #432] // 16-byte Folded Spill 1385; CHECK-GI-NEXT: .cfi_def_cfa_offset 448 1386; CHECK-GI-NEXT: .cfi_offset w30, -8 1387; CHECK-GI-NEXT: .cfi_offset w29, -16 1388; CHECK-GI-NEXT: .cfi_offset b8, -24 1389; CHECK-GI-NEXT: .cfi_offset b9, -32 1390; CHECK-GI-NEXT: .cfi_offset b10, -40 1391; CHECK-GI-NEXT: .cfi_offset b11, -48 1392; CHECK-GI-NEXT: .cfi_offset b12, -56 1393; CHECK-GI-NEXT: .cfi_offset b13, -64 1394; CHECK-GI-NEXT: .cfi_offset b14, -72 1395; CHECK-GI-NEXT: .cfi_offset b15, -80 1396; CHECK-GI-NEXT: mov v4.16b, v1.16b 1397; CHECK-GI-NEXT: str q1, [sp, #112] // 16-byte Folded Spill 1398; CHECK-GI-NEXT: mov h1, v0.h[4] 1399; CHECK-GI-NEXT: mov h12, v0.h[1] 1400; CHECK-GI-NEXT: mov h13, v0.h[2] 1401; CHECK-GI-NEXT: str q3, [sp, #16] // 16-byte Folded Spill 1402; CHECK-GI-NEXT: mov h14, v0.h[3] 1403; CHECK-GI-NEXT: mov h15, v2.h[1] 1404; CHECK-GI-NEXT: mov h8, v2.h[2] 1405; CHECK-GI-NEXT: mov h9, v2.h[3] 1406; CHECK-GI-NEXT: mov h10, v2.h[4] 1407; CHECK-GI-NEXT: mov h11, v2.h[5] 1408; CHECK-GI-NEXT: str h1, [sp, #272] // 2-byte Folded Spill 1409; CHECK-GI-NEXT: mov h1, v0.h[5] 1410; CHECK-GI-NEXT: str h1, [sp, #240] // 2-byte Folded Spill 1411; CHECK-GI-NEXT: mov h1, v0.h[6] 1412; CHECK-GI-NEXT: str h1, [sp, #176] // 2-byte Folded Spill 1413; CHECK-GI-NEXT: mov h1, v0.h[7] 1414; CHECK-GI-NEXT: fcvt s0, h0 1415; CHECK-GI-NEXT: str h1, [sp, #144] // 2-byte Folded Spill 1416; CHECK-GI-NEXT: mov h1, v4.h[1] 1417; CHECK-GI-NEXT: str h1, [sp, #48] // 2-byte Folded Spill 1418; CHECK-GI-NEXT: mov h1, v4.h[2] 1419; CHECK-GI-NEXT: str h1, [sp, #80] // 2-byte Folded Spill 1420; CHECK-GI-NEXT: mov h1, v4.h[3] 1421; CHECK-GI-NEXT: str h1, [sp, #128] // 2-byte Folded Spill 1422; CHECK-GI-NEXT: mov h1, v4.h[4] 1423; CHECK-GI-NEXT: str h1, [sp, #192] // 2-byte Folded Spill 1424; CHECK-GI-NEXT: mov h1, v4.h[5] 1425; CHECK-GI-NEXT: str h1, [sp, #256] // 2-byte Folded Spill 1426; CHECK-GI-NEXT: mov h1, v4.h[6] 1427; CHECK-GI-NEXT: str h1, [sp, #336] // 2-byte Folded Spill 1428; CHECK-GI-NEXT: mov h1, v4.h[7] 1429; CHECK-GI-NEXT: str h1, [sp, #352] // 2-byte Folded Spill 1430; CHECK-GI-NEXT: mov h1, v2.h[6] 1431; CHECK-GI-NEXT: str h1, [sp, #12] // 2-byte Folded Spill 1432; CHECK-GI-NEXT: mov h1, v2.h[7] 1433; CHECK-GI-NEXT: str h1, [sp, #14] // 2-byte Folded Spill 1434; CHECK-GI-NEXT: mov h1, v3.h[1] 1435; CHECK-GI-NEXT: str h1, [sp, #44] // 2-byte Folded Spill 1436; CHECK-GI-NEXT: mov h1, v3.h[2] 1437; CHECK-GI-NEXT: str h1, [sp, #46] // 2-byte Folded Spill 1438; CHECK-GI-NEXT: mov h1, v3.h[3] 1439; CHECK-GI-NEXT: str h1, [sp, #78] // 2-byte Folded Spill 1440; CHECK-GI-NEXT: mov h1, v3.h[4] 1441; CHECK-GI-NEXT: str h1, [sp, #110] // 2-byte Folded Spill 1442; CHECK-GI-NEXT: mov h1, v3.h[5] 1443; CHECK-GI-NEXT: str h1, [sp, #174] // 2-byte Folded Spill 1444; CHECK-GI-NEXT: mov h1, v3.h[6] 1445; CHECK-GI-NEXT: str h1, [sp, #238] // 2-byte Folded Spill 1446; CHECK-GI-NEXT: mov h1, v3.h[7] 1447; CHECK-GI-NEXT: str h1, [sp, #302] // 2-byte Folded Spill 1448; CHECK-GI-NEXT: fcvt s1, h2 1449; CHECK-GI-NEXT: bl fmodf 1450; CHECK-GI-NEXT: fcvt s2, h12 1451; CHECK-GI-NEXT: fcvt h0, s0 1452; CHECK-GI-NEXT: fcvt s1, h15 1453; CHECK-GI-NEXT: str q0, [sp, #304] // 16-byte Folded Spill 1454; CHECK-GI-NEXT: fmov s0, s2 1455; CHECK-GI-NEXT: bl fmodf 1456; CHECK-GI-NEXT: fcvt s2, h13 1457; CHECK-GI-NEXT: fcvt h0, s0 1458; CHECK-GI-NEXT: fcvt s1, h8 1459; CHECK-GI-NEXT: str q0, [sp, #208] // 16-byte Folded Spill 1460; CHECK-GI-NEXT: fmov s0, s2 1461; CHECK-GI-NEXT: bl fmodf 1462; CHECK-GI-NEXT: fcvt s2, h14 1463; CHECK-GI-NEXT: fcvt h0, s0 1464; CHECK-GI-NEXT: fcvt s1, h9 1465; CHECK-GI-NEXT: str q0, [sp, #320] // 16-byte Folded Spill 1466; CHECK-GI-NEXT: fmov s0, s2 1467; CHECK-GI-NEXT: bl fmodf 1468; CHECK-GI-NEXT: ldr h1, [sp, #272] // 2-byte Folded Reload 1469; CHECK-GI-NEXT: fcvt h0, s0 1470; CHECK-GI-NEXT: fcvt s2, h1 1471; CHECK-GI-NEXT: fcvt s1, h10 1472; CHECK-GI-NEXT: str q0, [sp, #272] // 16-byte Folded Spill 1473; CHECK-GI-NEXT: fmov s0, s2 1474; CHECK-GI-NEXT: bl fmodf 1475; CHECK-GI-NEXT: ldr h1, [sp, #240] // 2-byte Folded Reload 1476; CHECK-GI-NEXT: fcvt h0, s0 1477; CHECK-GI-NEXT: fcvt s2, h1 1478; CHECK-GI-NEXT: fcvt s1, h11 1479; CHECK-GI-NEXT: str q0, [sp, #240] // 16-byte Folded Spill 1480; CHECK-GI-NEXT: fmov s0, s2 1481; CHECK-GI-NEXT: bl fmodf 1482; CHECK-GI-NEXT: ldr h1, [sp, #176] // 2-byte Folded Reload 1483; CHECK-GI-NEXT: fcvt h0, s0 1484; CHECK-GI-NEXT: fcvt s2, h1 1485; CHECK-GI-NEXT: str q0, [sp, #176] // 16-byte Folded Spill 1486; CHECK-GI-NEXT: ldr h0, [sp, #12] // 2-byte Folded Reload 1487; CHECK-GI-NEXT: fcvt s1, h0 1488; CHECK-GI-NEXT: fmov s0, s2 1489; CHECK-GI-NEXT: bl fmodf 1490; CHECK-GI-NEXT: ldr h1, [sp, #144] // 2-byte Folded Reload 1491; CHECK-GI-NEXT: fcvt h0, s0 1492; CHECK-GI-NEXT: fcvt s2, h1 1493; CHECK-GI-NEXT: str q0, [sp, #144] // 16-byte Folded Spill 1494; CHECK-GI-NEXT: ldr h0, [sp, #14] // 2-byte Folded Reload 1495; CHECK-GI-NEXT: fcvt s1, h0 1496; CHECK-GI-NEXT: fmov s0, s2 1497; CHECK-GI-NEXT: bl fmodf 1498; CHECK-GI-NEXT: ldr q1, [sp, #112] // 16-byte Folded Reload 1499; CHECK-GI-NEXT: fcvt h0, s0 1500; CHECK-GI-NEXT: fcvt s2, h1 1501; CHECK-GI-NEXT: str q0, [sp, #112] // 16-byte Folded Spill 1502; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1503; CHECK-GI-NEXT: fcvt s1, h0 1504; CHECK-GI-NEXT: fmov s0, s2 1505; CHECK-GI-NEXT: bl fmodf 1506; CHECK-GI-NEXT: ldr h1, [sp, #48] // 2-byte Folded Reload 1507; CHECK-GI-NEXT: fcvt h0, s0 1508; CHECK-GI-NEXT: fcvt s2, h1 1509; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 1510; CHECK-GI-NEXT: ldr h0, [sp, #44] // 2-byte Folded Reload 1511; CHECK-GI-NEXT: fcvt s1, h0 1512; CHECK-GI-NEXT: fmov s0, s2 1513; CHECK-GI-NEXT: bl fmodf 1514; CHECK-GI-NEXT: ldr h1, [sp, #80] // 2-byte Folded Reload 1515; CHECK-GI-NEXT: fcvt h0, s0 1516; CHECK-GI-NEXT: fcvt s2, h1 1517; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Folded Spill 1518; CHECK-GI-NEXT: ldr h0, [sp, #46] // 2-byte Folded Reload 1519; CHECK-GI-NEXT: fcvt s1, h0 1520; CHECK-GI-NEXT: fmov s0, s2 1521; CHECK-GI-NEXT: bl fmodf 1522; CHECK-GI-NEXT: ldr h1, [sp, #128] // 2-byte Folded Reload 1523; CHECK-GI-NEXT: fcvt h0, s0 1524; CHECK-GI-NEXT: fcvt s2, h1 1525; CHECK-GI-NEXT: str q0, [sp, #128] // 16-byte Folded Spill 1526; CHECK-GI-NEXT: ldr h0, [sp, #78] // 2-byte Folded Reload 1527; CHECK-GI-NEXT: fcvt s1, h0 1528; CHECK-GI-NEXT: fmov s0, s2 1529; CHECK-GI-NEXT: bl fmodf 1530; CHECK-GI-NEXT: ldr h1, [sp, #192] // 2-byte Folded Reload 1531; CHECK-GI-NEXT: fcvt h0, s0 1532; CHECK-GI-NEXT: fcvt s2, h1 1533; CHECK-GI-NEXT: str q0, [sp, #192] // 16-byte Folded Spill 1534; CHECK-GI-NEXT: ldr h0, [sp, #110] // 2-byte Folded Reload 1535; CHECK-GI-NEXT: fcvt s1, h0 1536; CHECK-GI-NEXT: fmov s0, s2 1537; CHECK-GI-NEXT: bl fmodf 1538; CHECK-GI-NEXT: ldr h1, [sp, #256] // 2-byte Folded Reload 1539; CHECK-GI-NEXT: fcvt h0, s0 1540; CHECK-GI-NEXT: fcvt s2, h1 1541; CHECK-GI-NEXT: str q0, [sp, #256] // 16-byte Folded Spill 1542; CHECK-GI-NEXT: ldr h0, [sp, #174] // 2-byte Folded Reload 1543; CHECK-GI-NEXT: fcvt s1, h0 1544; CHECK-GI-NEXT: fmov s0, s2 1545; CHECK-GI-NEXT: bl fmodf 1546; CHECK-GI-NEXT: ldr h1, [sp, #336] // 2-byte Folded Reload 1547; CHECK-GI-NEXT: fcvt h0, s0 1548; CHECK-GI-NEXT: fcvt s2, h1 1549; CHECK-GI-NEXT: str q0, [sp, #336] // 16-byte Folded Spill 1550; CHECK-GI-NEXT: ldr h0, [sp, #238] // 2-byte Folded Reload 1551; CHECK-GI-NEXT: fcvt s1, h0 1552; CHECK-GI-NEXT: fmov s0, s2 1553; CHECK-GI-NEXT: bl fmodf 1554; CHECK-GI-NEXT: ldr h1, [sp, #352] // 2-byte Folded Reload 1555; CHECK-GI-NEXT: fcvt h0, s0 1556; CHECK-GI-NEXT: fcvt s2, h1 1557; CHECK-GI-NEXT: str q0, [sp, #352] // 16-byte Folded Spill 1558; CHECK-GI-NEXT: ldr h0, [sp, #302] // 2-byte Folded Reload 1559; CHECK-GI-NEXT: fcvt s1, h0 1560; CHECK-GI-NEXT: fmov s0, s2 1561; CHECK-GI-NEXT: bl fmodf 1562; CHECK-GI-NEXT: ldr q3, [sp, #304] // 16-byte Folded Reload 1563; CHECK-GI-NEXT: ldr q2, [sp, #208] // 16-byte Folded Reload 1564; CHECK-GI-NEXT: ldr q1, [sp, #48] // 16-byte Folded Reload 1565; CHECK-GI-NEXT: ldp x29, x30, [sp, #432] // 16-byte Folded Reload 1566; CHECK-GI-NEXT: mov v3.h[1], v2.h[0] 1567; CHECK-GI-NEXT: ldr q2, [sp, #80] // 16-byte Folded Reload 1568; CHECK-GI-NEXT: ldp d9, d8, [sp, #416] // 16-byte Folded Reload 1569; CHECK-GI-NEXT: mov v1.h[1], v2.h[0] 1570; CHECK-GI-NEXT: ldr q2, [sp, #320] // 16-byte Folded Reload 1571; CHECK-GI-NEXT: ldp d11, d10, [sp, #400] // 16-byte Folded Reload 1572; CHECK-GI-NEXT: mov v3.h[2], v2.h[0] 1573; CHECK-GI-NEXT: ldr q2, [sp, #128] // 16-byte Folded Reload 1574; CHECK-GI-NEXT: ldp d13, d12, [sp, #384] // 16-byte Folded Reload 1575; CHECK-GI-NEXT: mov v1.h[2], v2.h[0] 1576; CHECK-GI-NEXT: ldr q2, [sp, #272] // 16-byte Folded Reload 1577; CHECK-GI-NEXT: ldp d15, d14, [sp, #368] // 16-byte Folded Reload 1578; CHECK-GI-NEXT: mov v3.h[3], v2.h[0] 1579; CHECK-GI-NEXT: ldr q2, [sp, #192] // 16-byte Folded Reload 1580; CHECK-GI-NEXT: mov v1.h[3], v2.h[0] 1581; CHECK-GI-NEXT: ldp q4, q2, [sp, #240] // 32-byte Folded Reload 1582; CHECK-GI-NEXT: mov v3.h[4], v4.h[0] 1583; CHECK-GI-NEXT: mov v1.h[4], v2.h[0] 1584; CHECK-GI-NEXT: ldr q2, [sp, #176] // 16-byte Folded Reload 1585; CHECK-GI-NEXT: mov v3.h[5], v2.h[0] 1586; CHECK-GI-NEXT: ldr q2, [sp, #336] // 16-byte Folded Reload 1587; CHECK-GI-NEXT: mov v1.h[5], v2.h[0] 1588; CHECK-GI-NEXT: fcvt h2, s0 1589; CHECK-GI-NEXT: ldr q0, [sp, #144] // 16-byte Folded Reload 1590; CHECK-GI-NEXT: mov v3.h[6], v0.h[0] 1591; CHECK-GI-NEXT: ldr q0, [sp, #352] // 16-byte Folded Reload 1592; CHECK-GI-NEXT: mov v1.h[6], v0.h[0] 1593; CHECK-GI-NEXT: ldr q0, [sp, #112] // 16-byte Folded Reload 1594; CHECK-GI-NEXT: mov v3.h[7], v0.h[0] 1595; CHECK-GI-NEXT: mov v1.h[7], v2.h[0] 1596; CHECK-GI-NEXT: mov v0.16b, v3.16b 1597; CHECK-GI-NEXT: add sp, sp, #448 1598; CHECK-GI-NEXT: ret 1599entry: 1600 %c = frem <16 x half> %a, %b 1601 ret <16 x half> %c 1602} 1603 1604define <2 x fp128> @frem_v2fp128(<2 x fp128> %a, <2 x fp128> %b) { 1605; CHECK-SD-LABEL: frem_v2fp128: 1606; CHECK-SD: // %bb.0: // %entry 1607; CHECK-SD-NEXT: sub sp, sp, #64 1608; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 1609; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 1610; CHECK-SD-NEXT: .cfi_offset w30, -16 1611; CHECK-SD-NEXT: stp q1, q3, [sp, #16] // 32-byte Folded Spill 1612; CHECK-SD-NEXT: mov v1.16b, v2.16b 1613; CHECK-SD-NEXT: bl fmodl 1614; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1615; CHECK-SD-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 1616; CHECK-SD-NEXT: bl fmodl 1617; CHECK-SD-NEXT: mov v1.16b, v0.16b 1618; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1619; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 1620; CHECK-SD-NEXT: add sp, sp, #64 1621; CHECK-SD-NEXT: ret 1622; 1623; CHECK-GI-LABEL: frem_v2fp128: 1624; CHECK-GI: // %bb.0: // %entry 1625; CHECK-GI-NEXT: sub sp, sp, #64 1626; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 1627; CHECK-GI-NEXT: .cfi_def_cfa_offset 64 1628; CHECK-GI-NEXT: .cfi_offset w30, -16 1629; CHECK-GI-NEXT: stp q3, q1, [sp, #16] // 32-byte Folded Spill 1630; CHECK-GI-NEXT: mov v1.16b, v2.16b 1631; CHECK-GI-NEXT: bl fmodl 1632; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1633; CHECK-GI-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload 1634; CHECK-GI-NEXT: bl fmodl 1635; CHECK-GI-NEXT: mov v1.16b, v0.16b 1636; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1637; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 1638; CHECK-GI-NEXT: add sp, sp, #64 1639; CHECK-GI-NEXT: ret 1640entry: 1641 %c = frem <2 x fp128> %a, %b 1642 ret <2 x fp128> %c 1643} 1644