1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=aarch64-gnu-linux < %s | FileCheck -check-prefixes=CHECK %s 3; RUN: llc -mtriple=aarch64-none-linux < %s | FileCheck -check-prefixes=NO-LIBCALL %s 4 5define { half, half } @test_sincos_f16(half %a) { 6; CHECK-LABEL: test_sincos_f16: 7; CHECK: // %bb.0: 8; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 9; CHECK-NEXT: .cfi_def_cfa_offset 16 10; CHECK-NEXT: .cfi_offset w30, -16 11; CHECK-NEXT: fcvt s0, h0 12; CHECK-NEXT: add x0, sp, #12 13; CHECK-NEXT: add x1, sp, #8 14; CHECK-NEXT: bl sincosf 15; CHECK-NEXT: ldp s1, s0, [sp, #8] 16; CHECK-NEXT: fcvt h0, s0 17; CHECK-NEXT: fcvt h1, s1 18; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 19; CHECK-NEXT: ret 20; 21; NO-LIBCALL-LABEL: test_sincos_f16: 22; NO-LIBCALL: // %bb.0: 23; NO-LIBCALL-NEXT: stp d9, d8, [sp, #-32]! // 16-byte Folded Spill 24; NO-LIBCALL-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 25; NO-LIBCALL-NEXT: .cfi_def_cfa_offset 32 26; NO-LIBCALL-NEXT: .cfi_offset w30, -16 27; NO-LIBCALL-NEXT: .cfi_offset b8, -24 28; NO-LIBCALL-NEXT: .cfi_offset b9, -32 29; NO-LIBCALL-NEXT: fcvt s8, h0 30; NO-LIBCALL-NEXT: fmov s0, s8 31; NO-LIBCALL-NEXT: bl sinf 32; NO-LIBCALL-NEXT: fcvt h9, s0 33; NO-LIBCALL-NEXT: fmov s0, s8 34; NO-LIBCALL-NEXT: bl cosf 35; NO-LIBCALL-NEXT: fmov s1, s0 36; NO-LIBCALL-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 37; NO-LIBCALL-NEXT: fmov s0, s9 38; NO-LIBCALL-NEXT: fcvt h1, s1 39; NO-LIBCALL-NEXT: ldp d9, d8, [sp], #32 // 16-byte Folded Reload 40; NO-LIBCALL-NEXT: ret 41 %result = call { half, half } @llvm.sincos.f16(half %a) 42 ret { half, half } %result 43} 44 45define half @test_sincos_f16_only_use_sin(half %a) { 46; CHECK-LABEL: test_sincos_f16_only_use_sin: 47; CHECK: // %bb.0: 48; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 49; CHECK-NEXT: .cfi_def_cfa_offset 16 50; CHECK-NEXT: .cfi_offset w30, -16 51; CHECK-NEXT: fcvt s0, h0 52; CHECK-NEXT: add x0, sp, #12 53; CHECK-NEXT: add x1, sp, #8 54; CHECK-NEXT: bl sincosf 55; CHECK-NEXT: ldr s0, [sp, #12] 56; CHECK-NEXT: fcvt h0, s0 57; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 58; CHECK-NEXT: ret 59; 60; NO-LIBCALL-LABEL: test_sincos_f16_only_use_sin: 61; NO-LIBCALL: // %bb.0: 62; NO-LIBCALL-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 63; NO-LIBCALL-NEXT: .cfi_def_cfa_offset 16 64; NO-LIBCALL-NEXT: .cfi_offset w30, -16 65; NO-LIBCALL-NEXT: fcvt s0, h0 66; NO-LIBCALL-NEXT: bl sinf 67; NO-LIBCALL-NEXT: fcvt h0, s0 68; NO-LIBCALL-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 69; NO-LIBCALL-NEXT: ret 70 %result = call { half, half } @llvm.sincos.f16(half %a) 71 %result.0 = extractvalue { half, half } %result, 0 72 ret half %result.0 73} 74 75define half @test_sincos_f16_only_use_cos(half %a) { 76; CHECK-LABEL: test_sincos_f16_only_use_cos: 77; CHECK: // %bb.0: 78; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 79; CHECK-NEXT: .cfi_def_cfa_offset 16 80; CHECK-NEXT: .cfi_offset w30, -16 81; CHECK-NEXT: fcvt s0, h0 82; CHECK-NEXT: add x0, sp, #12 83; CHECK-NEXT: add x1, sp, #8 84; CHECK-NEXT: bl sincosf 85; CHECK-NEXT: ldr s0, [sp, #8] 86; CHECK-NEXT: fcvt h0, s0 87; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 88; CHECK-NEXT: ret 89; 90; NO-LIBCALL-LABEL: test_sincos_f16_only_use_cos: 91; NO-LIBCALL: // %bb.0: 92; NO-LIBCALL-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 93; NO-LIBCALL-NEXT: .cfi_def_cfa_offset 16 94; NO-LIBCALL-NEXT: .cfi_offset w30, -16 95; NO-LIBCALL-NEXT: fcvt s0, h0 96; NO-LIBCALL-NEXT: bl cosf 97; NO-LIBCALL-NEXT: fcvt h0, s0 98; NO-LIBCALL-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 99; NO-LIBCALL-NEXT: ret 100 %result = call { half, half } @llvm.sincos.f16(half %a) 101 %result.1 = extractvalue { half, half } %result, 1 102 ret half %result.1 103} 104 105define { <2 x half>, <2 x half> } @test_sincos_v2f16(<2 x half> %a) { 106; CHECK-LABEL: test_sincos_v2f16: 107; CHECK: // %bb.0: 108; CHECK-NEXT: sub sp, sp, #64 109; CHECK-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 110; CHECK-NEXT: .cfi_def_cfa_offset 64 111; CHECK-NEXT: .cfi_offset w30, -16 112; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 113; CHECK-NEXT: mov h1, v0.h[1] 114; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 115; CHECK-NEXT: add x0, sp, #36 116; CHECK-NEXT: add x1, sp, #32 117; CHECK-NEXT: fcvt s0, h1 118; CHECK-NEXT: bl sincosf 119; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 120; CHECK-NEXT: add x0, sp, #28 121; CHECK-NEXT: add x1, sp, #24 122; CHECK-NEXT: fcvt s0, h0 123; CHECK-NEXT: bl sincosf 124; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 125; CHECK-NEXT: add x0, sp, #44 126; CHECK-NEXT: add x1, sp, #40 127; CHECK-NEXT: mov h0, v0.h[2] 128; CHECK-NEXT: fcvt s0, h0 129; CHECK-NEXT: bl sincosf 130; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 131; CHECK-NEXT: add x0, sp, #60 132; CHECK-NEXT: add x1, sp, #56 133; CHECK-NEXT: mov h0, v0.h[3] 134; CHECK-NEXT: fcvt s0, h0 135; CHECK-NEXT: bl sincosf 136; CHECK-NEXT: ldp s2, s0, [sp, #32] 137; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 138; CHECK-NEXT: ldp s3, s1, [sp, #24] 139; CHECK-NEXT: fcvt h4, s0 140; CHECK-NEXT: fcvt h2, s2 141; CHECK-NEXT: fcvt h0, s1 142; CHECK-NEXT: fcvt h1, s3 143; CHECK-NEXT: ldp s5, s3, [sp, #40] 144; CHECK-NEXT: fcvt h3, s3 145; CHECK-NEXT: mov v0.h[1], v4.h[0] 146; CHECK-NEXT: fcvt h4, s5 147; CHECK-NEXT: mov v1.h[1], v2.h[0] 148; CHECK-NEXT: ldp s5, s2, [sp, #56] 149; CHECK-NEXT: mov v0.h[2], v3.h[0] 150; CHECK-NEXT: fcvt h2, s2 151; CHECK-NEXT: fcvt h3, s5 152; CHECK-NEXT: mov v1.h[2], v4.h[0] 153; CHECK-NEXT: mov v0.h[3], v2.h[0] 154; CHECK-NEXT: mov v1.h[3], v3.h[0] 155; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 156; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q1 157; CHECK-NEXT: add sp, sp, #64 158; CHECK-NEXT: ret 159; 160; NO-LIBCALL-LABEL: test_sincos_v2f16: 161; NO-LIBCALL: // %bb.0: 162; NO-LIBCALL-NEXT: sub sp, sp, #80 163; NO-LIBCALL-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill 164; NO-LIBCALL-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill 165; NO-LIBCALL-NEXT: str x30, [sp, #64] // 8-byte Folded Spill 166; NO-LIBCALL-NEXT: .cfi_def_cfa_offset 80 167; NO-LIBCALL-NEXT: .cfi_offset w30, -16 168; NO-LIBCALL-NEXT: .cfi_offset b8, -24 169; NO-LIBCALL-NEXT: .cfi_offset b9, -32 170; NO-LIBCALL-NEXT: .cfi_offset b10, -40 171; NO-LIBCALL-NEXT: .cfi_offset b11, -48 172; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0 173; NO-LIBCALL-NEXT: mov h1, v0.h[1] 174; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Folded Spill 175; NO-LIBCALL-NEXT: fcvt s8, h1 176; NO-LIBCALL-NEXT: fmov s0, s8 177; NO-LIBCALL-NEXT: bl sinf 178; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload 179; NO-LIBCALL-NEXT: fcvt h0, s0 180; NO-LIBCALL-NEXT: fcvt s9, h1 181; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 182; NO-LIBCALL-NEXT: fmov s0, s9 183; NO-LIBCALL-NEXT: bl sinf 184; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload 185; NO-LIBCALL-NEXT: fcvt h0, s0 186; NO-LIBCALL-NEXT: mov h1, v1.h[2] 187; NO-LIBCALL-NEXT: fcvt s10, h1 188; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 189; NO-LIBCALL-NEXT: mov v0.h[1], v1.h[0] 190; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 191; NO-LIBCALL-NEXT: fmov s0, s10 192; NO-LIBCALL-NEXT: bl sinf 193; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload 194; NO-LIBCALL-NEXT: fcvt h0, s0 195; NO-LIBCALL-NEXT: mov h1, v1.h[3] 196; NO-LIBCALL-NEXT: fcvt s11, h1 197; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 198; NO-LIBCALL-NEXT: mov v1.h[2], v0.h[0] 199; NO-LIBCALL-NEXT: fmov s0, s11 200; NO-LIBCALL-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 201; NO-LIBCALL-NEXT: bl sinf 202; NO-LIBCALL-NEXT: fcvt h0, s0 203; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 204; NO-LIBCALL-NEXT: mov v1.h[3], v0.h[0] 205; NO-LIBCALL-NEXT: fmov s0, s8 206; NO-LIBCALL-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 207; NO-LIBCALL-NEXT: bl cosf 208; NO-LIBCALL-NEXT: fcvt h0, s0 209; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Folded Spill 210; NO-LIBCALL-NEXT: fmov s0, s9 211; NO-LIBCALL-NEXT: bl cosf 212; NO-LIBCALL-NEXT: fcvt h0, s0 213; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload 214; NO-LIBCALL-NEXT: mov v0.h[1], v1.h[0] 215; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Folded Spill 216; NO-LIBCALL-NEXT: fmov s0, s10 217; NO-LIBCALL-NEXT: bl cosf 218; NO-LIBCALL-NEXT: fcvt h0, s0 219; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload 220; NO-LIBCALL-NEXT: mov v1.h[2], v0.h[0] 221; NO-LIBCALL-NEXT: fmov s0, s11 222; NO-LIBCALL-NEXT: str q1, [sp] // 16-byte Folded Spill 223; NO-LIBCALL-NEXT: bl cosf 224; NO-LIBCALL-NEXT: fmov s1, s0 225; NO-LIBCALL-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload 226; NO-LIBCALL-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload 227; NO-LIBCALL-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 228; NO-LIBCALL-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload 229; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 killed $q0 230; NO-LIBCALL-NEXT: fcvt h2, s1 231; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload 232; NO-LIBCALL-NEXT: mov v1.h[3], v2.h[0] 233; NO-LIBCALL-NEXT: // kill: def $d1 killed $d1 killed $q1 234; NO-LIBCALL-NEXT: add sp, sp, #80 235; NO-LIBCALL-NEXT: ret 236 %result = call { <2 x half>, <2 x half> } @llvm.sincos.v2f16(<2 x half> %a) 237 ret { <2 x half>, <2 x half> } %result 238} 239 240define { float, float } @test_sincos_f32(float %a) { 241; CHECK-LABEL: test_sincos_f32: 242; CHECK: // %bb.0: 243; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 244; CHECK-NEXT: .cfi_def_cfa_offset 16 245; CHECK-NEXT: .cfi_offset w30, -16 246; CHECK-NEXT: add x0, sp, #12 247; CHECK-NEXT: add x1, sp, #8 248; CHECK-NEXT: bl sincosf 249; CHECK-NEXT: ldp s1, s0, [sp, #8] 250; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 251; CHECK-NEXT: ret 252; 253; NO-LIBCALL-LABEL: test_sincos_f32: 254; NO-LIBCALL: // %bb.0: 255; NO-LIBCALL-NEXT: stp d9, d8, [sp, #-32]! // 16-byte Folded Spill 256; NO-LIBCALL-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 257; NO-LIBCALL-NEXT: .cfi_def_cfa_offset 32 258; NO-LIBCALL-NEXT: .cfi_offset w30, -16 259; NO-LIBCALL-NEXT: .cfi_offset b8, -24 260; NO-LIBCALL-NEXT: .cfi_offset b9, -32 261; NO-LIBCALL-NEXT: fmov s8, s0 262; NO-LIBCALL-NEXT: bl sinf 263; NO-LIBCALL-NEXT: fmov s9, s0 264; NO-LIBCALL-NEXT: fmov s0, s8 265; NO-LIBCALL-NEXT: bl cosf 266; NO-LIBCALL-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 267; NO-LIBCALL-NEXT: fmov s1, s0 268; NO-LIBCALL-NEXT: fmov s0, s9 269; NO-LIBCALL-NEXT: ldp d9, d8, [sp], #32 // 16-byte Folded Reload 270; NO-LIBCALL-NEXT: ret 271 %result = call { float, float } @llvm.sincos.f32(float %a) 272 ret { float, float } %result 273} 274 275define { <3 x float>, <3 x float> } @test_sincos_v3f32(<3 x float> %a) { 276; CHECK-LABEL: test_sincos_v3f32: 277; CHECK: // %bb.0: 278; CHECK-NEXT: sub sp, sp, #80 279; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 280; CHECK-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill 281; CHECK-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 282; CHECK-NEXT: .cfi_def_cfa_offset 80 283; CHECK-NEXT: .cfi_offset w19, -8 284; CHECK-NEXT: .cfi_offset w20, -16 285; CHECK-NEXT: .cfi_offset w21, -24 286; CHECK-NEXT: .cfi_offset w22, -32 287; CHECK-NEXT: .cfi_offset w30, -48 288; CHECK-NEXT: add x0, sp, #20 289; CHECK-NEXT: add x1, sp, #16 290; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 291; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 292; CHECK-NEXT: bl sincosf 293; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 294; CHECK-NEXT: add x0, sp, #28 295; CHECK-NEXT: add x1, sp, #24 296; CHECK-NEXT: add x19, sp, #28 297; CHECK-NEXT: add x20, sp, #24 298; CHECK-NEXT: mov s0, v0.s[1] 299; CHECK-NEXT: bl sincosf 300; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 301; CHECK-NEXT: add x0, sp, #44 302; CHECK-NEXT: add x1, sp, #40 303; CHECK-NEXT: add x21, sp, #44 304; CHECK-NEXT: add x22, sp, #40 305; CHECK-NEXT: mov s0, v0.s[2] 306; CHECK-NEXT: bl sincosf 307; CHECK-NEXT: ldp s1, s0, [sp, #16] 308; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 309; CHECK-NEXT: ld1 { v0.s }[1], [x19] 310; CHECK-NEXT: ld1 { v1.s }[1], [x20] 311; CHECK-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 312; CHECK-NEXT: ld1 { v0.s }[2], [x21] 313; CHECK-NEXT: ld1 { v1.s }[2], [x22] 314; CHECK-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload 315; CHECK-NEXT: add sp, sp, #80 316; CHECK-NEXT: ret 317; 318; NO-LIBCALL-LABEL: test_sincos_v3f32: 319; NO-LIBCALL: // %bb.0: 320; NO-LIBCALL-NEXT: sub sp, sp, #80 321; NO-LIBCALL-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill 322; NO-LIBCALL-NEXT: str x30, [sp, #64] // 8-byte Folded Spill 323; NO-LIBCALL-NEXT: .cfi_def_cfa_offset 80 324; NO-LIBCALL-NEXT: .cfi_offset w30, -16 325; NO-LIBCALL-NEXT: .cfi_offset b8, -24 326; NO-LIBCALL-NEXT: .cfi_offset b9, -32 327; NO-LIBCALL-NEXT: mov s8, v0.s[1] 328; NO-LIBCALL-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 329; NO-LIBCALL-NEXT: fmov s0, s8 330; NO-LIBCALL-NEXT: bl sinf 331; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0 332; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 333; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 334; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 killed $q0 335; NO-LIBCALL-NEXT: bl sinf 336; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 337; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0 338; NO-LIBCALL-NEXT: mov v0.s[1], v1.s[0] 339; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 340; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 341; NO-LIBCALL-NEXT: mov s9, v0.s[2] 342; NO-LIBCALL-NEXT: fmov s0, s9 343; NO-LIBCALL-NEXT: bl sinf 344; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 345; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0 346; NO-LIBCALL-NEXT: mov v1.s[2], v0.s[0] 347; NO-LIBCALL-NEXT: fmov s0, s8 348; NO-LIBCALL-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 349; NO-LIBCALL-NEXT: bl cosf 350; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0 351; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Folded Spill 352; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 353; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 killed $q0 354; NO-LIBCALL-NEXT: bl cosf 355; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload 356; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0 357; NO-LIBCALL-NEXT: mov v0.s[1], v1.s[0] 358; NO-LIBCALL-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 359; NO-LIBCALL-NEXT: fmov s0, s9 360; NO-LIBCALL-NEXT: bl cosf 361; NO-LIBCALL-NEXT: fmov s2, s0 362; NO-LIBCALL-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 363; NO-LIBCALL-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload 364; NO-LIBCALL-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload 365; NO-LIBCALL-NEXT: mov v1.s[2], v2.s[0] 366; NO-LIBCALL-NEXT: add sp, sp, #80 367; NO-LIBCALL-NEXT: ret 368 %result = call { <3 x float>, <3 x float> } @llvm.sincos.v3f32(<3 x float> %a) 369 ret { <3 x float>, <3 x float> } %result 370} 371 372define { <2 x float>, <2 x float> } @test_sincos_v2f32(<2 x float> %a) { 373; CHECK-LABEL: test_sincos_v2f32: 374; CHECK: // %bb.0: 375; CHECK-NEXT: sub sp, sp, #64 376; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 377; CHECK-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 378; CHECK-NEXT: .cfi_def_cfa_offset 64 379; CHECK-NEXT: .cfi_offset w19, -8 380; CHECK-NEXT: .cfi_offset w20, -16 381; CHECK-NEXT: .cfi_offset w30, -32 382; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 383; CHECK-NEXT: add x0, sp, #44 384; CHECK-NEXT: add x1, sp, #40 385; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 386; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 387; CHECK-NEXT: bl sincosf 388; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 389; CHECK-NEXT: add x0, sp, #28 390; CHECK-NEXT: add x1, sp, #24 391; CHECK-NEXT: add x19, sp, #28 392; CHECK-NEXT: add x20, sp, #24 393; CHECK-NEXT: mov s0, v0.s[1] 394; CHECK-NEXT: bl sincosf 395; CHECK-NEXT: ldp s1, s0, [sp, #40] 396; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 397; CHECK-NEXT: ld1 { v0.s }[1], [x19] 398; CHECK-NEXT: ld1 { v1.s }[1], [x20] 399; CHECK-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 400; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 401; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q1 402; CHECK-NEXT: add sp, sp, #64 403; CHECK-NEXT: ret 404; 405; NO-LIBCALL-LABEL: test_sincos_v2f32: 406; NO-LIBCALL: // %bb.0: 407; NO-LIBCALL-NEXT: sub sp, sp, #64 408; NO-LIBCALL-NEXT: str d8, [sp, #48] // 8-byte Folded Spill 409; NO-LIBCALL-NEXT: str x30, [sp, #56] // 8-byte Folded Spill 410; NO-LIBCALL-NEXT: .cfi_def_cfa_offset 64 411; NO-LIBCALL-NEXT: .cfi_offset w30, -8 412; NO-LIBCALL-NEXT: .cfi_offset b8, -16 413; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0 414; NO-LIBCALL-NEXT: mov s8, v0.s[1] 415; NO-LIBCALL-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 416; NO-LIBCALL-NEXT: fmov s0, s8 417; NO-LIBCALL-NEXT: bl sinf 418; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0 419; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 420; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 421; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 killed $q0 422; NO-LIBCALL-NEXT: bl sinf 423; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 424; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0 425; NO-LIBCALL-NEXT: mov v0.s[1], v1.s[0] 426; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 427; NO-LIBCALL-NEXT: fmov s0, s8 428; NO-LIBCALL-NEXT: bl cosf 429; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0 430; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Folded Spill 431; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 432; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 killed $q0 433; NO-LIBCALL-NEXT: bl cosf 434; NO-LIBCALL-NEXT: fmov s1, s0 435; NO-LIBCALL-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload 436; NO-LIBCALL-NEXT: ldr x30, [sp, #56] // 8-byte Folded Reload 437; NO-LIBCALL-NEXT: ldr d8, [sp, #48] // 8-byte Folded Reload 438; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 killed $q0 439; NO-LIBCALL-NEXT: mov v1.s[1], v2.s[0] 440; NO-LIBCALL-NEXT: // kill: def $d1 killed $d1 killed $q1 441; NO-LIBCALL-NEXT: add sp, sp, #64 442; NO-LIBCALL-NEXT: ret 443 %result = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> %a) 444 ret { <2 x float>, <2 x float> } %result 445} 446 447define { double, double } @test_sincos_f64(double %a) { 448; CHECK-LABEL: test_sincos_f64: 449; CHECK: // %bb.0: 450; CHECK-NEXT: sub sp, sp, #32 451; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 452; CHECK-NEXT: .cfi_def_cfa_offset 32 453; CHECK-NEXT: .cfi_offset w30, -16 454; CHECK-NEXT: add x0, sp, #24 455; CHECK-NEXT: add x1, sp, #8 456; CHECK-NEXT: bl sincos 457; CHECK-NEXT: ldr d0, [sp, #24] 458; CHECK-NEXT: ldr d1, [sp, #8] 459; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 460; CHECK-NEXT: add sp, sp, #32 461; CHECK-NEXT: ret 462; 463; NO-LIBCALL-LABEL: test_sincos_f64: 464; NO-LIBCALL: // %bb.0: 465; NO-LIBCALL-NEXT: stp d9, d8, [sp, #-32]! // 16-byte Folded Spill 466; NO-LIBCALL-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 467; NO-LIBCALL-NEXT: .cfi_def_cfa_offset 32 468; NO-LIBCALL-NEXT: .cfi_offset w30, -16 469; NO-LIBCALL-NEXT: .cfi_offset b8, -24 470; NO-LIBCALL-NEXT: .cfi_offset b9, -32 471; NO-LIBCALL-NEXT: fmov d8, d0 472; NO-LIBCALL-NEXT: bl sin 473; NO-LIBCALL-NEXT: fmov d9, d0 474; NO-LIBCALL-NEXT: fmov d0, d8 475; NO-LIBCALL-NEXT: bl cos 476; NO-LIBCALL-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 477; NO-LIBCALL-NEXT: fmov d1, d0 478; NO-LIBCALL-NEXT: fmov d0, d9 479; NO-LIBCALL-NEXT: ldp d9, d8, [sp], #32 // 16-byte Folded Reload 480; NO-LIBCALL-NEXT: ret 481 %result = call { double, double } @llvm.sincos.f64(double %a) 482 ret { double, double } %result 483} 484 485define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) { 486; CHECK-LABEL: test_sincos_v2f64: 487; CHECK: // %bb.0: 488; CHECK-NEXT: sub sp, sp, #80 489; CHECK-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 490; CHECK-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 491; CHECK-NEXT: .cfi_def_cfa_offset 80 492; CHECK-NEXT: .cfi_offset w19, -8 493; CHECK-NEXT: .cfi_offset w20, -16 494; CHECK-NEXT: .cfi_offset w30, -32 495; CHECK-NEXT: add x0, sp, #56 496; CHECK-NEXT: add x1, sp, #40 497; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 498; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 499; CHECK-NEXT: bl sincos 500; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 501; CHECK-NEXT: add x0, sp, #32 502; CHECK-NEXT: add x1, sp, #24 503; CHECK-NEXT: add x19, sp, #32 504; CHECK-NEXT: add x20, sp, #24 505; CHECK-NEXT: mov d0, v0.d[1] 506; CHECK-NEXT: bl sincos 507; CHECK-NEXT: ldr d0, [sp, #56] 508; CHECK-NEXT: ldr d1, [sp, #40] 509; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 510; CHECK-NEXT: ld1 { v0.d }[1], [x19] 511; CHECK-NEXT: ld1 { v1.d }[1], [x20] 512; CHECK-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 513; CHECK-NEXT: add sp, sp, #80 514; CHECK-NEXT: ret 515; 516; NO-LIBCALL-LABEL: test_sincos_v2f64: 517; NO-LIBCALL: // %bb.0: 518; NO-LIBCALL-NEXT: sub sp, sp, #64 519; NO-LIBCALL-NEXT: str d8, [sp, #48] // 8-byte Folded Spill 520; NO-LIBCALL-NEXT: str x30, [sp, #56] // 8-byte Folded Spill 521; NO-LIBCALL-NEXT: .cfi_def_cfa_offset 64 522; NO-LIBCALL-NEXT: .cfi_offset w30, -8 523; NO-LIBCALL-NEXT: .cfi_offset b8, -16 524; NO-LIBCALL-NEXT: mov d8, v0.d[1] 525; NO-LIBCALL-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 526; NO-LIBCALL-NEXT: fmov d0, d8 527; NO-LIBCALL-NEXT: bl sin 528; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0 529; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 530; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 531; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 killed $q0 532; NO-LIBCALL-NEXT: bl sin 533; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 534; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0 535; NO-LIBCALL-NEXT: mov v0.d[1], v1.d[0] 536; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 537; NO-LIBCALL-NEXT: fmov d0, d8 538; NO-LIBCALL-NEXT: bl cos 539; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0 540; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Folded Spill 541; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 542; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 killed $q0 543; NO-LIBCALL-NEXT: bl cos 544; NO-LIBCALL-NEXT: fmov d1, d0 545; NO-LIBCALL-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload 546; NO-LIBCALL-NEXT: ldr x30, [sp, #56] // 8-byte Folded Reload 547; NO-LIBCALL-NEXT: ldr d8, [sp, #48] // 8-byte Folded Reload 548; NO-LIBCALL-NEXT: mov v1.d[1], v2.d[0] 549; NO-LIBCALL-NEXT: add sp, sp, #64 550; NO-LIBCALL-NEXT: ret 551 %result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %a) 552 ret { <2 x double>, <2 x double> } %result 553} 554