1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -global-isel=0 -mtriple=aarch64-unknown-unknown < %s | FileCheck -check-prefixes=CHECK,CVT,SDAG,CVT-SDAG %s 3; RUN: llc -global-isel=0 -mtriple=aarch64-unknown-unknown -mattr=+fullfp16 < %s | FileCheck -check-prefixes=CHECK,FP16,SDAG,FP16-SDAG %s 4; RUN: llc -global-isel=1 -mtriple=aarch64-unknown-unknown < %s | FileCheck -check-prefixes=CHECK,CVT,GISEL,CVT-GISEL %s 5; RUN: llc -global-isel=1 -mtriple=aarch64-unknown-unknown -mattr=+fullfp16 < %s | FileCheck -check-prefixes=CHECK,FP16,GISEL,FP16-GISEL %s 6 7declare half @llvm.exp10.f16(half) 8declare <1 x half> @llvm.exp10.v1f16(<1 x half>) 9declare <2 x half> @llvm.exp10.v2f16(<2 x half>) 10declare <3 x half> @llvm.exp10.v3f16(<3 x half>) 11declare <4 x half> @llvm.exp10.v4f16(<4 x half>) 12declare float @llvm.exp10.f32(float) 13declare <1 x float> @llvm.exp10.v1f32(<1 x float>) 14declare <2 x float> @llvm.exp10.v2f32(<2 x float>) 15declare <3 x float> @llvm.exp10.v3f32(<3 x float>) 16declare <4 x float> @llvm.exp10.v4f32(<4 x float>) 17declare double @llvm.exp10.f64(double) 18declare <1 x double> @llvm.exp10.v1f64(<1 x double>) 19declare <2 x double> @llvm.exp10.v2f64(<2 x double>) 20declare <3 x double> @llvm.exp10.v3f64(<3 x double>) 21declare <4 x double> @llvm.exp10.v4f64(<4 x double>) 22 23define half @exp10_f16(half %x) { 24; CHECK-LABEL: exp10_f16: 25; CHECK: // %bb.0: 26; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 27; CHECK-NEXT: .cfi_def_cfa_offset 16 28; CHECK-NEXT: .cfi_offset w30, -16 29; CHECK-NEXT: fcvt s0, h0 30; CHECK-NEXT: bl exp10f 31; CHECK-NEXT: fcvt h0, s0 32; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 33; CHECK-NEXT: ret 34 %r = call half @llvm.exp10.f16(half %x) 35 ret half %r 36} 37 38define <1 x half> @exp10_v1f16(<1 x half> %x) { 39; CHECK-LABEL: exp10_v1f16: 40; CHECK: // %bb.0: 41; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 42; CHECK-NEXT: .cfi_def_cfa_offset 16 43; CHECK-NEXT: .cfi_offset w30, -16 44; CHECK-NEXT: fcvt s0, h0 45; CHECK-NEXT: bl exp10f 46; CHECK-NEXT: fcvt h0, s0 47; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 48; CHECK-NEXT: ret 49 %r = call <1 x half> @llvm.exp10.v1f16(<1 x half> %x) 50 ret <1 x half> %r 51} 52 53define <2 x half> @exp10_v2f16(<2 x half> %x) { 54; SDAG-LABEL: exp10_v2f16: 55; SDAG: // %bb.0: 56; SDAG-NEXT: sub sp, sp, #48 57; SDAG-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 58; SDAG-NEXT: .cfi_def_cfa_offset 48 59; SDAG-NEXT: .cfi_offset w30, -16 60; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0 61; SDAG-NEXT: mov h1, v0.h[1] 62; SDAG-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 63; SDAG-NEXT: fcvt s0, h1 64; SDAG-NEXT: bl exp10f 65; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 66; SDAG-NEXT: fcvt h0, s0 67; SDAG-NEXT: fcvt s1, h1 68; SDAG-NEXT: str q0, [sp] // 16-byte Folded Spill 69; SDAG-NEXT: fmov s0, s1 70; SDAG-NEXT: bl exp10f 71; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 72; SDAG-NEXT: fcvt h2, s0 73; SDAG-NEXT: mov h1, v1.h[2] 74; SDAG-NEXT: fcvt s0, h1 75; SDAG-NEXT: ldr q1, [sp] // 16-byte Folded Reload 76; SDAG-NEXT: mov v2.h[1], v1.h[0] 77; SDAG-NEXT: str q2, [sp] // 16-byte Folded Spill 78; SDAG-NEXT: bl exp10f 79; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 80; SDAG-NEXT: fcvt h2, s0 81; SDAG-NEXT: mov h1, v1.h[3] 82; SDAG-NEXT: fcvt s0, h1 83; SDAG-NEXT: ldr q1, [sp] // 16-byte Folded Reload 84; SDAG-NEXT: mov v1.h[2], v2.h[0] 85; SDAG-NEXT: str q1, [sp] // 16-byte Folded Spill 86; SDAG-NEXT: bl exp10f 87; SDAG-NEXT: fcvt h1, s0 88; SDAG-NEXT: ldr q0, [sp] // 16-byte Folded Reload 89; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 90; SDAG-NEXT: mov v0.h[3], v1.h[0] 91; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0 92; SDAG-NEXT: add sp, sp, #48 93; SDAG-NEXT: ret 94; 95; GISEL-LABEL: exp10_v2f16: 96; GISEL: // %bb.0: 97; GISEL-NEXT: sub sp, sp, #32 98; GISEL-NEXT: str d8, [sp, #16] // 8-byte Folded Spill 99; GISEL-NEXT: str x30, [sp, #24] // 8-byte Folded Spill 100; GISEL-NEXT: .cfi_def_cfa_offset 32 101; GISEL-NEXT: .cfi_offset w30, -8 102; GISEL-NEXT: .cfi_offset b8, -16 103; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0 104; GISEL-NEXT: mov h8, v0.h[1] 105; GISEL-NEXT: fcvt s0, h0 106; GISEL-NEXT: bl exp10f 107; GISEL-NEXT: fcvt s1, h8 108; GISEL-NEXT: fcvt h0, s0 109; GISEL-NEXT: str q0, [sp] // 16-byte Folded Spill 110; GISEL-NEXT: fmov s0, s1 111; GISEL-NEXT: bl exp10f 112; GISEL-NEXT: fcvt h1, s0 113; GISEL-NEXT: ldr q0, [sp] // 16-byte Folded Reload 114; GISEL-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload 115; GISEL-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload 116; GISEL-NEXT: mov v0.h[1], v1.h[0] 117; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 118; GISEL-NEXT: add sp, sp, #32 119; GISEL-NEXT: ret 120 %r = call <2 x half> @llvm.exp10.v2f16(<2 x half> %x) 121 ret <2 x half> %r 122} 123 124define <3 x half> @exp10_v3f16(<3 x half> %x) { 125; SDAG-LABEL: exp10_v3f16: 126; SDAG: // %bb.0: 127; SDAG-NEXT: sub sp, sp, #48 128; SDAG-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 129; SDAG-NEXT: .cfi_def_cfa_offset 48 130; SDAG-NEXT: .cfi_offset w30, -16 131; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0 132; SDAG-NEXT: mov h1, v0.h[1] 133; SDAG-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 134; SDAG-NEXT: fcvt s0, h1 135; SDAG-NEXT: bl exp10f 136; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 137; SDAG-NEXT: fcvt h0, s0 138; SDAG-NEXT: fcvt s1, h1 139; SDAG-NEXT: str q0, [sp] // 16-byte Folded Spill 140; SDAG-NEXT: fmov s0, s1 141; SDAG-NEXT: bl exp10f 142; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 143; SDAG-NEXT: fcvt h2, s0 144; SDAG-NEXT: mov h1, v1.h[2] 145; SDAG-NEXT: fcvt s0, h1 146; SDAG-NEXT: ldr q1, [sp] // 16-byte Folded Reload 147; SDAG-NEXT: mov v2.h[1], v1.h[0] 148; SDAG-NEXT: str q2, [sp] // 16-byte Folded Spill 149; SDAG-NEXT: bl exp10f 150; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 151; SDAG-NEXT: fcvt h2, s0 152; SDAG-NEXT: mov h1, v1.h[3] 153; SDAG-NEXT: fcvt s0, h1 154; SDAG-NEXT: ldr q1, [sp] // 16-byte Folded Reload 155; SDAG-NEXT: mov v1.h[2], v2.h[0] 156; SDAG-NEXT: str q1, [sp] // 16-byte Folded Spill 157; SDAG-NEXT: bl exp10f 158; SDAG-NEXT: fcvt h1, s0 159; SDAG-NEXT: ldr q0, [sp] // 16-byte Folded Reload 160; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 161; SDAG-NEXT: mov v0.h[3], v1.h[0] 162; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0 163; SDAG-NEXT: add sp, sp, #48 164; SDAG-NEXT: ret 165; 166; GISEL-LABEL: exp10_v3f16: 167; GISEL: // %bb.0: 168; GISEL-NEXT: sub sp, sp, #64 169; GISEL-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill 170; GISEL-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 171; GISEL-NEXT: .cfi_def_cfa_offset 64 172; GISEL-NEXT: .cfi_offset w30, -16 173; GISEL-NEXT: .cfi_offset b8, -24 174; GISEL-NEXT: .cfi_offset b9, -32 175; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0 176; GISEL-NEXT: mov h8, v0.h[1] 177; GISEL-NEXT: mov h9, v0.h[2] 178; GISEL-NEXT: fcvt s0, h0 179; GISEL-NEXT: bl exp10f 180; GISEL-NEXT: fcvt s1, h8 181; GISEL-NEXT: fcvt h0, s0 182; GISEL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 183; GISEL-NEXT: fmov s0, s1 184; GISEL-NEXT: bl exp10f 185; GISEL-NEXT: fcvt s1, h9 186; GISEL-NEXT: fcvt h0, s0 187; GISEL-NEXT: str q0, [sp] // 16-byte Folded Spill 188; GISEL-NEXT: fmov s0, s1 189; GISEL-NEXT: bl exp10f 190; GISEL-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload 191; GISEL-NEXT: fcvt h0, s0 192; GISEL-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload 193; GISEL-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 194; GISEL-NEXT: mov v1.h[1], v2.h[0] 195; GISEL-NEXT: mov v1.h[2], v0.h[0] 196; GISEL-NEXT: mov v0.16b, v1.16b 197; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 198; GISEL-NEXT: add sp, sp, #64 199; GISEL-NEXT: ret 200 %r = call <3 x half> @llvm.exp10.v3f16(<3 x half> %x) 201 ret <3 x half> %r 202} 203 204define <4 x half> @exp10_v4f16(<4 x half> %x) { 205; SDAG-LABEL: exp10_v4f16: 206; SDAG: // %bb.0: 207; SDAG-NEXT: sub sp, sp, #48 208; SDAG-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 209; SDAG-NEXT: .cfi_def_cfa_offset 48 210; SDAG-NEXT: .cfi_offset w30, -16 211; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0 212; SDAG-NEXT: mov h1, v0.h[1] 213; SDAG-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 214; SDAG-NEXT: fcvt s0, h1 215; SDAG-NEXT: bl exp10f 216; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 217; SDAG-NEXT: fcvt h0, s0 218; SDAG-NEXT: fcvt s1, h1 219; SDAG-NEXT: str q0, [sp] // 16-byte Folded Spill 220; SDAG-NEXT: fmov s0, s1 221; SDAG-NEXT: bl exp10f 222; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 223; SDAG-NEXT: fcvt h2, s0 224; SDAG-NEXT: mov h1, v1.h[2] 225; SDAG-NEXT: fcvt s0, h1 226; SDAG-NEXT: ldr q1, [sp] // 16-byte Folded Reload 227; SDAG-NEXT: mov v2.h[1], v1.h[0] 228; SDAG-NEXT: str q2, [sp] // 16-byte Folded Spill 229; SDAG-NEXT: bl exp10f 230; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 231; SDAG-NEXT: fcvt h2, s0 232; SDAG-NEXT: mov h1, v1.h[3] 233; SDAG-NEXT: fcvt s0, h1 234; SDAG-NEXT: ldr q1, [sp] // 16-byte Folded Reload 235; SDAG-NEXT: mov v1.h[2], v2.h[0] 236; SDAG-NEXT: str q1, [sp] // 16-byte Folded Spill 237; SDAG-NEXT: bl exp10f 238; SDAG-NEXT: fcvt h1, s0 239; SDAG-NEXT: ldr q0, [sp] // 16-byte Folded Reload 240; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 241; SDAG-NEXT: mov v0.h[3], v1.h[0] 242; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0 243; SDAG-NEXT: add sp, sp, #48 244; SDAG-NEXT: ret 245; 246; GISEL-LABEL: exp10_v4f16: 247; GISEL: // %bb.0: 248; GISEL-NEXT: sub sp, sp, #80 249; GISEL-NEXT: str d10, [sp, #48] // 8-byte Folded Spill 250; GISEL-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill 251; GISEL-NEXT: str x30, [sp, #72] // 8-byte Folded Spill 252; GISEL-NEXT: .cfi_def_cfa_offset 80 253; GISEL-NEXT: .cfi_offset w30, -8 254; GISEL-NEXT: .cfi_offset b8, -16 255; GISEL-NEXT: .cfi_offset b9, -24 256; GISEL-NEXT: .cfi_offset b10, -32 257; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0 258; GISEL-NEXT: mov h8, v0.h[1] 259; GISEL-NEXT: mov h9, v0.h[2] 260; GISEL-NEXT: mov h10, v0.h[3] 261; GISEL-NEXT: fcvt s0, h0 262; GISEL-NEXT: bl exp10f 263; GISEL-NEXT: fcvt s1, h8 264; GISEL-NEXT: fcvt h0, s0 265; GISEL-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 266; GISEL-NEXT: fmov s0, s1 267; GISEL-NEXT: bl exp10f 268; GISEL-NEXT: fcvt s1, h9 269; GISEL-NEXT: fcvt h0, s0 270; GISEL-NEXT: str q0, [sp] // 16-byte Folded Spill 271; GISEL-NEXT: fmov s0, s1 272; GISEL-NEXT: bl exp10f 273; GISEL-NEXT: fcvt s1, h10 274; GISEL-NEXT: fcvt h0, s0 275; GISEL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 276; GISEL-NEXT: fmov s0, s1 277; GISEL-NEXT: bl exp10f 278; GISEL-NEXT: ldp q3, q2, [sp] // 32-byte Folded Reload 279; GISEL-NEXT: fcvt h0, s0 280; GISEL-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 281; GISEL-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload 282; GISEL-NEXT: ldr x30, [sp, #72] // 8-byte Folded Reload 283; GISEL-NEXT: ldr d10, [sp, #48] // 8-byte Folded Reload 284; GISEL-NEXT: mov v1.h[1], v3.h[0] 285; GISEL-NEXT: mov v1.h[2], v2.h[0] 286; GISEL-NEXT: mov v1.h[3], v0.h[0] 287; GISEL-NEXT: mov v0.16b, v1.16b 288; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 289; GISEL-NEXT: add sp, sp, #80 290; GISEL-NEXT: ret 291 %r = call <4 x half> @llvm.exp10.v4f16(<4 x half> %x) 292 ret <4 x half> %r 293} 294 295define float @exp10_f32(float %x) { 296; CHECK-LABEL: exp10_f32: 297; CHECK: // %bb.0: 298; CHECK-NEXT: b exp10f 299 %r = call float @llvm.exp10.f32(float %x) 300 ret float %r 301} 302 303define <1 x float> @exp10_v1f32(<1 x float> %x) { 304; SDAG-LABEL: exp10_v1f32: 305; SDAG: // %bb.0: 306; SDAG-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 307; SDAG-NEXT: .cfi_def_cfa_offset 16 308; SDAG-NEXT: .cfi_offset w30, -16 309; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0 310; SDAG-NEXT: // kill: def $s0 killed $s0 killed $q0 311; SDAG-NEXT: bl exp10f 312; SDAG-NEXT: // kill: def $s0 killed $s0 def $d0 313; SDAG-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 314; SDAG-NEXT: ret 315; 316; GISEL-LABEL: exp10_v1f32: 317; GISEL: // %bb.0: 318; GISEL-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 319; GISEL-NEXT: .cfi_def_cfa_offset 16 320; GISEL-NEXT: .cfi_offset w30, -16 321; GISEL-NEXT: // kill: def $s0 killed $s0 killed $d0 322; GISEL-NEXT: bl exp10f 323; GISEL-NEXT: // kill: def $s0 killed $s0 def $d0 324; GISEL-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 325; GISEL-NEXT: ret 326 %r = call <1 x float> @llvm.exp10.v1f32(<1 x float> %x) 327 ret <1 x float> %r 328} 329 330define <2 x float> @exp10_v2f32(<2 x float> %x) { 331; SDAG-LABEL: exp10_v2f32: 332; SDAG: // %bb.0: 333; SDAG-NEXT: sub sp, sp, #48 334; SDAG-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 335; SDAG-NEXT: .cfi_def_cfa_offset 48 336; SDAG-NEXT: .cfi_offset w30, -16 337; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0 338; SDAG-NEXT: str q0, [sp] // 16-byte Folded Spill 339; SDAG-NEXT: mov s0, v0.s[1] 340; SDAG-NEXT: bl exp10f 341; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0 342; SDAG-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 343; SDAG-NEXT: ldr q0, [sp] // 16-byte Folded Reload 344; SDAG-NEXT: // kill: def $s0 killed $s0 killed $q0 345; SDAG-NEXT: bl exp10f 346; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 347; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0 348; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 349; SDAG-NEXT: mov v0.s[1], v1.s[0] 350; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0 351; SDAG-NEXT: add sp, sp, #48 352; SDAG-NEXT: ret 353; 354; GISEL-LABEL: exp10_v2f32: 355; GISEL: // %bb.0: 356; GISEL-NEXT: sub sp, sp, #32 357; GISEL-NEXT: str d8, [sp, #16] // 8-byte Folded Spill 358; GISEL-NEXT: str x30, [sp, #24] // 8-byte Folded Spill 359; GISEL-NEXT: .cfi_def_cfa_offset 32 360; GISEL-NEXT: .cfi_offset w30, -8 361; GISEL-NEXT: .cfi_offset b8, -16 362; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0 363; GISEL-NEXT: mov s8, v0.s[1] 364; GISEL-NEXT: // kill: def $s0 killed $s0 killed $q0 365; GISEL-NEXT: bl exp10f 366; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0 367; GISEL-NEXT: str q0, [sp] // 16-byte Folded Spill 368; GISEL-NEXT: fmov s0, s8 369; GISEL-NEXT: bl exp10f 370; GISEL-NEXT: ldr q1, [sp] // 16-byte Folded Reload 371; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0 372; GISEL-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload 373; GISEL-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload 374; GISEL-NEXT: mov v1.s[1], v0.s[0] 375; GISEL-NEXT: fmov d0, d1 376; GISEL-NEXT: add sp, sp, #32 377; GISEL-NEXT: ret 378 %r = call <2 x float> @llvm.exp10.v2f32(<2 x float> %x) 379 ret <2 x float> %r 380} 381 382define <3 x float> @exp10_v3f32(<3 x float> %x) { 383; SDAG-LABEL: exp10_v3f32: 384; SDAG: // %bb.0: 385; SDAG-NEXT: sub sp, sp, #48 386; SDAG-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 387; SDAG-NEXT: .cfi_def_cfa_offset 48 388; SDAG-NEXT: .cfi_offset w30, -16 389; SDAG-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 390; SDAG-NEXT: mov s0, v0.s[1] 391; SDAG-NEXT: bl exp10f 392; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0 393; SDAG-NEXT: str q0, [sp] // 16-byte Folded Spill 394; SDAG-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 395; SDAG-NEXT: // kill: def $s0 killed $s0 killed $q0 396; SDAG-NEXT: bl exp10f 397; SDAG-NEXT: ldr q1, [sp] // 16-byte Folded Reload 398; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0 399; SDAG-NEXT: mov v0.s[1], v1.s[0] 400; SDAG-NEXT: str q0, [sp] // 16-byte Folded Spill 401; SDAG-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 402; SDAG-NEXT: mov s0, v0.s[2] 403; SDAG-NEXT: bl exp10f 404; SDAG-NEXT: ldr q1, [sp] // 16-byte Folded Reload 405; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0 406; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 407; SDAG-NEXT: mov v1.s[2], v0.s[0] 408; SDAG-NEXT: mov v0.16b, v1.16b 409; SDAG-NEXT: add sp, sp, #48 410; SDAG-NEXT: ret 411; 412; GISEL-LABEL: exp10_v3f32: 413; GISEL: // %bb.0: 414; GISEL-NEXT: sub sp, sp, #64 415; GISEL-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill 416; GISEL-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 417; GISEL-NEXT: .cfi_def_cfa_offset 64 418; GISEL-NEXT: .cfi_offset w30, -16 419; GISEL-NEXT: .cfi_offset b8, -24 420; GISEL-NEXT: .cfi_offset b9, -32 421; GISEL-NEXT: mov s8, v0.s[1] 422; GISEL-NEXT: mov s9, v0.s[2] 423; GISEL-NEXT: // kill: def $s0 killed $s0 killed $q0 424; GISEL-NEXT: bl exp10f 425; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0 426; GISEL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 427; GISEL-NEXT: fmov s0, s8 428; GISEL-NEXT: bl exp10f 429; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0 430; GISEL-NEXT: str q0, [sp] // 16-byte Folded Spill 431; GISEL-NEXT: fmov s0, s9 432; GISEL-NEXT: bl exp10f 433; GISEL-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload 434; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0 435; GISEL-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 436; GISEL-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload 437; GISEL-NEXT: mov v1.s[1], v2.s[0] 438; GISEL-NEXT: mov v1.s[2], v0.s[0] 439; GISEL-NEXT: mov v0.16b, v1.16b 440; GISEL-NEXT: add sp, sp, #64 441; GISEL-NEXT: ret 442 %r = call <3 x float> @llvm.exp10.v3f32(<3 x float> %x) 443 ret <3 x float> %r 444} 445 446define <4 x float> @exp10_v4f32(<4 x float> %x) { 447; SDAG-LABEL: exp10_v4f32: 448; SDAG: // %bb.0: 449; SDAG-NEXT: sub sp, sp, #48 450; SDAG-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 451; SDAG-NEXT: .cfi_def_cfa_offset 48 452; SDAG-NEXT: .cfi_offset w30, -16 453; SDAG-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 454; SDAG-NEXT: mov s0, v0.s[1] 455; SDAG-NEXT: bl exp10f 456; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0 457; SDAG-NEXT: str q0, [sp] // 16-byte Folded Spill 458; SDAG-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 459; SDAG-NEXT: // kill: def $s0 killed $s0 killed $q0 460; SDAG-NEXT: bl exp10f 461; SDAG-NEXT: ldr q1, [sp] // 16-byte Folded Reload 462; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0 463; SDAG-NEXT: mov v0.s[1], v1.s[0] 464; SDAG-NEXT: str q0, [sp] // 16-byte Folded Spill 465; SDAG-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 466; SDAG-NEXT: mov s0, v0.s[2] 467; SDAG-NEXT: bl exp10f 468; SDAG-NEXT: ldr q1, [sp] // 16-byte Folded Reload 469; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0 470; SDAG-NEXT: mov v1.s[2], v0.s[0] 471; SDAG-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 472; SDAG-NEXT: mov s0, v0.s[3] 473; SDAG-NEXT: str q1, [sp] // 16-byte Folded Spill 474; SDAG-NEXT: bl exp10f 475; SDAG-NEXT: ldr q1, [sp] // 16-byte Folded Reload 476; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0 477; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 478; SDAG-NEXT: mov v1.s[3], v0.s[0] 479; SDAG-NEXT: mov v0.16b, v1.16b 480; SDAG-NEXT: add sp, sp, #48 481; SDAG-NEXT: ret 482; 483; GISEL-LABEL: exp10_v4f32: 484; GISEL: // %bb.0: 485; GISEL-NEXT: sub sp, sp, #80 486; GISEL-NEXT: str d10, [sp, #48] // 8-byte Folded Spill 487; GISEL-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill 488; GISEL-NEXT: str x30, [sp, #72] // 8-byte Folded Spill 489; GISEL-NEXT: .cfi_def_cfa_offset 80 490; GISEL-NEXT: .cfi_offset w30, -8 491; GISEL-NEXT: .cfi_offset b8, -16 492; GISEL-NEXT: .cfi_offset b9, -24 493; GISEL-NEXT: .cfi_offset b10, -32 494; GISEL-NEXT: mov s8, v0.s[1] 495; GISEL-NEXT: mov s9, v0.s[2] 496; GISEL-NEXT: mov s10, v0.s[3] 497; GISEL-NEXT: // kill: def $s0 killed $s0 killed $q0 498; GISEL-NEXT: bl exp10f 499; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0 500; GISEL-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 501; GISEL-NEXT: fmov s0, s8 502; GISEL-NEXT: bl exp10f 503; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0 504; GISEL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 505; GISEL-NEXT: fmov s0, s9 506; GISEL-NEXT: bl exp10f 507; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0 508; GISEL-NEXT: str q0, [sp] // 16-byte Folded Spill 509; GISEL-NEXT: fmov s0, s10 510; GISEL-NEXT: bl exp10f 511; GISEL-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload 512; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0 513; GISEL-NEXT: ldr x30, [sp, #72] // 8-byte Folded Reload 514; GISEL-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload 515; GISEL-NEXT: ldr d10, [sp, #48] // 8-byte Folded Reload 516; GISEL-NEXT: mov v1.s[1], v2.s[0] 517; GISEL-NEXT: ldr q2, [sp] // 16-byte Folded Reload 518; GISEL-NEXT: mov v1.s[2], v2.s[0] 519; GISEL-NEXT: mov v1.s[3], v0.s[0] 520; GISEL-NEXT: mov v0.16b, v1.16b 521; GISEL-NEXT: add sp, sp, #80 522; GISEL-NEXT: ret 523 %r = call <4 x float> @llvm.exp10.v4f32(<4 x float> %x) 524 ret <4 x float> %r 525} 526 527define double @exp10_f64(double %x) { 528; CHECK-LABEL: exp10_f64: 529; CHECK: // %bb.0: 530; CHECK-NEXT: b exp10 531 %r = call double @llvm.exp10.f64(double %x) 532 ret double %r 533} 534 535define <1 x double> @exp10_v1f64(<1 x double> %x) { 536; CHECK-LABEL: exp10_v1f64: 537; CHECK: // %bb.0: 538; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 539; CHECK-NEXT: .cfi_def_cfa_offset 16 540; CHECK-NEXT: .cfi_offset w30, -16 541; CHECK-NEXT: bl exp10 542; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 543; CHECK-NEXT: ret 544 %r = call <1 x double> @llvm.exp10.v1f64(<1 x double> %x) 545 ret <1 x double> %r 546} 547 548define <2 x double> @exp10_v2f64(<2 x double> %x) { 549; SDAG-LABEL: exp10_v2f64: 550; SDAG: // %bb.0: 551; SDAG-NEXT: sub sp, sp, #48 552; SDAG-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 553; SDAG-NEXT: .cfi_def_cfa_offset 48 554; SDAG-NEXT: .cfi_offset w30, -16 555; SDAG-NEXT: str q0, [sp] // 16-byte Folded Spill 556; SDAG-NEXT: mov d0, v0.d[1] 557; SDAG-NEXT: bl exp10 558; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0 559; SDAG-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 560; SDAG-NEXT: ldr q0, [sp] // 16-byte Folded Reload 561; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0 562; SDAG-NEXT: bl exp10 563; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 564; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0 565; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 566; SDAG-NEXT: mov v0.d[1], v1.d[0] 567; SDAG-NEXT: add sp, sp, #48 568; SDAG-NEXT: ret 569; 570; GISEL-LABEL: exp10_v2f64: 571; GISEL: // %bb.0: 572; GISEL-NEXT: sub sp, sp, #32 573; GISEL-NEXT: str d8, [sp, #16] // 8-byte Folded Spill 574; GISEL-NEXT: str x30, [sp, #24] // 8-byte Folded Spill 575; GISEL-NEXT: .cfi_def_cfa_offset 32 576; GISEL-NEXT: .cfi_offset w30, -8 577; GISEL-NEXT: .cfi_offset b8, -16 578; GISEL-NEXT: mov d8, v0.d[1] 579; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 580; GISEL-NEXT: bl exp10 581; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0 582; GISEL-NEXT: str q0, [sp] // 16-byte Folded Spill 583; GISEL-NEXT: fmov d0, d8 584; GISEL-NEXT: bl exp10 585; GISEL-NEXT: ldr q1, [sp] // 16-byte Folded Reload 586; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0 587; GISEL-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload 588; GISEL-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload 589; GISEL-NEXT: mov v1.d[1], v0.d[0] 590; GISEL-NEXT: mov v0.16b, v1.16b 591; GISEL-NEXT: add sp, sp, #32 592; GISEL-NEXT: ret 593 %r = call <2 x double> @llvm.exp10.v2f64(<2 x double> %x) 594 ret <2 x double> %r 595} 596 597define <3 x double> @exp10_v3f64(<3 x double> %x) { 598; SDAG-LABEL: exp10_v3f64: 599; SDAG: // %bb.0: 600; SDAG-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill 601; SDAG-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill 602; SDAG-NEXT: str x30, [sp, #24] // 8-byte Folded Spill 603; SDAG-NEXT: .cfi_def_cfa_offset 32 604; SDAG-NEXT: .cfi_offset w30, -8 605; SDAG-NEXT: .cfi_offset b8, -16 606; SDAG-NEXT: .cfi_offset b9, -24 607; SDAG-NEXT: .cfi_offset b10, -32 608; SDAG-NEXT: fmov d8, d2 609; SDAG-NEXT: fmov d9, d1 610; SDAG-NEXT: bl exp10 611; SDAG-NEXT: fmov d10, d0 612; SDAG-NEXT: fmov d0, d9 613; SDAG-NEXT: bl exp10 614; SDAG-NEXT: fmov d9, d0 615; SDAG-NEXT: fmov d0, d8 616; SDAG-NEXT: bl exp10 617; SDAG-NEXT: fmov d1, d9 618; SDAG-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload 619; SDAG-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload 620; SDAG-NEXT: fmov d2, d0 621; SDAG-NEXT: fmov d0, d10 622; SDAG-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload 623; SDAG-NEXT: ret 624; 625; GISEL-LABEL: exp10_v3f64: 626; GISEL: // %bb.0: 627; GISEL-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill 628; GISEL-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill 629; GISEL-NEXT: str x30, [sp, #24] // 8-byte Folded Spill 630; GISEL-NEXT: .cfi_def_cfa_offset 32 631; GISEL-NEXT: .cfi_offset w30, -8 632; GISEL-NEXT: .cfi_offset b8, -16 633; GISEL-NEXT: .cfi_offset b9, -24 634; GISEL-NEXT: .cfi_offset b10, -32 635; GISEL-NEXT: fmov d8, d1 636; GISEL-NEXT: fmov d9, d2 637; GISEL-NEXT: bl exp10 638; GISEL-NEXT: fmov d10, d0 639; GISEL-NEXT: fmov d0, d8 640; GISEL-NEXT: bl exp10 641; GISEL-NEXT: fmov d8, d0 642; GISEL-NEXT: fmov d0, d9 643; GISEL-NEXT: bl exp10 644; GISEL-NEXT: fmov d1, d8 645; GISEL-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload 646; GISEL-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload 647; GISEL-NEXT: fmov d2, d0 648; GISEL-NEXT: fmov d0, d10 649; GISEL-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload 650; GISEL-NEXT: ret 651 %r = call <3 x double> @llvm.exp10.v3f64(<3 x double> %x) 652 ret <3 x double> %r 653} 654 655define <4 x double> @exp10_v4f64(<4 x double> %x) { 656; SDAG-LABEL: exp10_v4f64: 657; SDAG: // %bb.0: 658; SDAG-NEXT: sub sp, sp, #64 659; SDAG-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 660; SDAG-NEXT: .cfi_def_cfa_offset 64 661; SDAG-NEXT: .cfi_offset w30, -16 662; SDAG-NEXT: str q0, [sp] // 16-byte Folded Spill 663; SDAG-NEXT: mov d0, v0.d[1] 664; SDAG-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 665; SDAG-NEXT: bl exp10 666; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0 667; SDAG-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 668; SDAG-NEXT: ldr q0, [sp] // 16-byte Folded Reload 669; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0 670; SDAG-NEXT: bl exp10 671; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 672; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0 673; SDAG-NEXT: mov v0.d[1], v1.d[0] 674; SDAG-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 675; SDAG-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 676; SDAG-NEXT: mov d0, v0.d[1] 677; SDAG-NEXT: bl exp10 678; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0 679; SDAG-NEXT: str q0, [sp] // 16-byte Folded Spill 680; SDAG-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 681; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0 682; SDAG-NEXT: bl exp10 683; SDAG-NEXT: fmov d1, d0 684; SDAG-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload 685; SDAG-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 686; SDAG-NEXT: mov v1.d[1], v2.d[0] 687; SDAG-NEXT: add sp, sp, #64 688; SDAG-NEXT: ret 689; 690; GISEL-LABEL: exp10_v4f64: 691; GISEL: // %bb.0: 692; GISEL-NEXT: sub sp, sp, #80 693; GISEL-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill 694; GISEL-NEXT: str x30, [sp, #64] // 8-byte Folded Spill 695; GISEL-NEXT: .cfi_def_cfa_offset 80 696; GISEL-NEXT: .cfi_offset w30, -16 697; GISEL-NEXT: .cfi_offset b8, -24 698; GISEL-NEXT: .cfi_offset b9, -32 699; GISEL-NEXT: str q1, [sp] // 16-byte Folded Spill 700; GISEL-NEXT: mov d8, v0.d[1] 701; GISEL-NEXT: mov d9, v1.d[1] 702; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 703; GISEL-NEXT: bl exp10 704; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0 705; GISEL-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 706; GISEL-NEXT: fmov d0, d8 707; GISEL-NEXT: bl exp10 708; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0 709; GISEL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 710; GISEL-NEXT: ldr q0, [sp] // 16-byte Folded Reload 711; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 712; GISEL-NEXT: bl exp10 713; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0 714; GISEL-NEXT: str q0, [sp] // 16-byte Folded Spill 715; GISEL-NEXT: fmov d0, d9 716; GISEL-NEXT: bl exp10 717; GISEL-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload 718; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0 719; GISEL-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload 720; GISEL-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload 721; GISEL-NEXT: mov v2.d[1], v1.d[0] 722; GISEL-NEXT: ldr q1, [sp] // 16-byte Folded Reload 723; GISEL-NEXT: mov v1.d[1], v0.d[0] 724; GISEL-NEXT: mov v0.16b, v2.16b 725; GISEL-NEXT: add sp, sp, #80 726; GISEL-NEXT: ret 727 %r = call <4 x double> @llvm.exp10.v4f64(<4 x double> %x) 728 ret <4 x double> %r 729} 730;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 731; CVT: {{.*}} 732; CVT-GISEL: {{.*}} 733; CVT-SDAG: {{.*}} 734; FP16: {{.*}} 735; FP16-GISEL: {{.*}} 736; FP16-SDAG: {{.*}} 737