575 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2 3; No FP16/BF164; RUN: llc -mtriple=arm-none-eabi -mattr=+armv8-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefix=NO-FP16-SOFTFP5; RUN: llc -mtriple=thumb-none-eabi -mattr=+armv8-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefix=NO-FP16-SOFTFP6; RUN: llc -mtriple=arm-none-eabi -mattr=+armv8-a,+fp-armv8,-fullfp16,-bf16,+neon %s -o - | FileCheck %s --check-prefix=NO-FP16-SOFTFP7; RUN: llc -mtriple=thumb-none-eabi -mattr=+armv8-a,+fp-armv8,-fullfp16,-bf16,+neon %s -o - | FileCheck %s --check-prefix=NO-FP16-SOFTFP8; RUN: llc -mtriple=arm-none-eabihf -mattr=+armv8-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefix=NO-FP16-HARD9; RUN: llc -mtriple=thumb-none-eabihf -mattr=+armv8-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefix=NO-FP16-HARD10; RUN: llc -mtriple=arm-none-eabihf -mattr=+armv8-a,+fp-armv8,-fullfp16,-bf16,+neon %s -o - | FileCheck %s --check-prefix=NO-FP16-HARD11; RUN: llc -mtriple=thumb-none-eabihf -mattr=+armv8-a,+fp-armv8,-fullfp16,-bf16,+neon %s -o - | FileCheck %s --check-prefix=NO-FP16-HARD12 13; With FP16, Without BF1614; RUN: llc -mtriple=arm-none-eabi -mattr=+armv8-a,+fp-armv8,+fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefix=FP16-SOFTFP15; RUN: llc -mtriple=thumb-none-eabi -mattr=+armv8-a,+fp-armv8,+fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefix=FP16-SOFTFP16; RUN: llc -mtriple=arm-none-eabi -mattr=+armv8-a,+fp-armv8,+fullfp16,-bf16,+neon %s -o - | FileCheck %s --check-prefix=FP16-SOFTFP17; RUN: llc -mtriple=thumb-none-eabi -mattr=+armv8-a,+fp-armv8,+fullfp16,-bf16,+neon %s -o - | FileCheck %s --check-prefix=FP16-SOFTFP18; RUN: llc -mtriple=arm-none-eabihf -mattr=+armv8-a,+fp-armv8,+fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefix=FP16-HARD19; RUN: llc -mtriple=thumb-none-eabihf -mattr=+armv8-a,+fp-armv8,+fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefix=FP16-HARD20; RUN: llc -mtriple=arm-none-eabihf -mattr=+armv8-a,+fp-armv8,+fullfp16,-bf16,+neon %s -o - | FileCheck %s --check-prefix=FP16-HARD21; RUN: llc -mtriple=thumb-none-eabihf -mattr=+armv8-a,+fp-armv8,+fullfp16,-bf16,+neon %s -o - | FileCheck %s --check-prefix=FP16-HARD22 23; With FP16/BF1624; RUN: llc -mtriple=arm-none-eabi -mattr=+armv8-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefix=BF16-SOFTFP25; RUN: llc -mtriple=thumb-none-eabi -mattr=+armv8-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefix=BF16-SOFTFP26; RUN: llc -mtriple=arm-none-eabi -mattr=+armv8-a,+fp-armv8,+fullfp16,+bf16,+neon %s -o - | FileCheck %s --check-prefix=SIMD-BF16-SOFTFP27; RUN: llc -mtriple=thumb-none-eabi -mattr=+armv8-a,+fp-armv8,+fullfp16,+bf16,+neon %s -o - | FileCheck %s --check-prefix=SIMD-BF16-SOFTFP28; RUN: llc -mtriple=arm-none-eabihf -mattr=+armv8-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefix=BF16-HARD29; RUN: llc -mtriple=thumb-none-eabihf -mattr=+armv8-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefix=BF16-HARD30; RUN: llc -mtriple=arm-none-eabihf -mattr=+armv8-a,+fp-armv8,+fullfp16,+bf16,+neon %s -o - | FileCheck %s --check-prefix=SIMD-BF16-HARD31; RUN: llc -mtriple=thumb-none-eabihf -mattr=+armv8-a,+fp-armv8,+fullfp16,+bf16,+neon %s -o - | FileCheck %s --check-prefix=SIMD-BF16-HARD32 33; This test ensures that we can use `w` and `t` constraints to allocate34; S-registers for 16-bit FP inputs and outputs for inline assembly, with either35; the softfp or hard float ABIs. (With the soft abi, no S-regs are available).36 37define half @half_t(half %x) nounwind {38; NO-FP16-SOFTFP-LABEL: half_t:39; NO-FP16-SOFTFP: @ %bb.0: @ %entry40; NO-FP16-SOFTFP-NEXT: vmov s0, r041; NO-FP16-SOFTFP-NEXT: @APP42; NO-FP16-SOFTFP-NEXT: vmov.f32 s0, s043; NO-FP16-SOFTFP-NEXT: @NO_APP44; NO-FP16-SOFTFP-NEXT: vmov r0, s045; NO-FP16-SOFTFP-NEXT: bx lr46;47; NO-FP16-HARD-LABEL: half_t:48; NO-FP16-HARD: @ %bb.0: @ %entry49; NO-FP16-HARD-NEXT: @APP50; NO-FP16-HARD-NEXT: vmov.f32 s0, s051; NO-FP16-HARD-NEXT: @NO_APP52; NO-FP16-HARD-NEXT: bx lr53;54; FP16-SOFTFP-LABEL: half_t:55; FP16-SOFTFP: @ %bb.0: @ %entry56; FP16-SOFTFP-NEXT: vmov.f16 s0, r057; FP16-SOFTFP-NEXT: vmov.f16 r0, s058; FP16-SOFTFP-NEXT: vmov s0, r059; FP16-SOFTFP-NEXT: @APP60; FP16-SOFTFP-NEXT: vmov.f32 s0, s061; FP16-SOFTFP-NEXT: @NO_APP62; FP16-SOFTFP-NEXT: vmov r0, s063; FP16-SOFTFP-NEXT: bx lr64;65; FP16-HARD-LABEL: half_t:66; FP16-HARD: @ %bb.0: @ %entry67; FP16-HARD-NEXT: vmov.f16 r0, s068; FP16-HARD-NEXT: vmov s0, r069; FP16-HARD-NEXT: @APP70; FP16-HARD-NEXT: vmov.f32 s0, s071; FP16-HARD-NEXT: @NO_APP72; FP16-HARD-NEXT: bx lr73;74; BF16-SOFTFP-LABEL: half_t:75; BF16-SOFTFP: @ %bb.0: @ %entry76; BF16-SOFTFP-NEXT: vmov.f16 s0, r077; BF16-SOFTFP-NEXT: vmov.f16 r0, s078; BF16-SOFTFP-NEXT: vmov s0, r079; BF16-SOFTFP-NEXT: @APP80; BF16-SOFTFP-NEXT: vmov.f32 s0, s081; BF16-SOFTFP-NEXT: @NO_APP82; BF16-SOFTFP-NEXT: vmov r0, s083; BF16-SOFTFP-NEXT: bx lr84;85; SIMD-BF16-SOFTFP-LABEL: half_t:86; SIMD-BF16-SOFTFP: @ %bb.0: @ %entry87; SIMD-BF16-SOFTFP-NEXT: vmov.f16 s0, r088; SIMD-BF16-SOFTFP-NEXT: vmov.f16 r0, s089; SIMD-BF16-SOFTFP-NEXT: vmov s0, r090; SIMD-BF16-SOFTFP-NEXT: @APP91; SIMD-BF16-SOFTFP-NEXT: vmov.f32 s0, s092; SIMD-BF16-SOFTFP-NEXT: @NO_APP93; SIMD-BF16-SOFTFP-NEXT: vmov r0, s094; SIMD-BF16-SOFTFP-NEXT: bx lr95;96; BF16-HARD-LABEL: half_t:97; BF16-HARD: @ %bb.0: @ %entry98; BF16-HARD-NEXT: vmov.f16 r0, s099; BF16-HARD-NEXT: vmov s0, r0100; BF16-HARD-NEXT: @APP101; BF16-HARD-NEXT: vmov.f32 s0, s0102; BF16-HARD-NEXT: @NO_APP103; BF16-HARD-NEXT: bx lr104;105; SIMD-BF16-HARD-LABEL: half_t:106; SIMD-BF16-HARD: @ %bb.0: @ %entry107; SIMD-BF16-HARD-NEXT: vmov.f16 r0, s0108; SIMD-BF16-HARD-NEXT: vmov s0, r0109; SIMD-BF16-HARD-NEXT: @APP110; SIMD-BF16-HARD-NEXT: vmov.f32 s0, s0111; SIMD-BF16-HARD-NEXT: @NO_APP112; SIMD-BF16-HARD-NEXT: bx lr113entry:114 %0 = tail call half asm "vmov $0, $1", "=t,t"(half %x)115 ret half %0116}117 118define half @half_w(half %x) nounwind {119; NO-FP16-SOFTFP-LABEL: half_w:120; NO-FP16-SOFTFP: @ %bb.0: @ %entry121; NO-FP16-SOFTFP-NEXT: vmov s0, r0122; NO-FP16-SOFTFP-NEXT: @APP123; NO-FP16-SOFTFP-NEXT: vmov.f32 s0, s0124; NO-FP16-SOFTFP-NEXT: @NO_APP125; NO-FP16-SOFTFP-NEXT: vmov r0, s0126; NO-FP16-SOFTFP-NEXT: bx lr127;128; NO-FP16-HARD-LABEL: half_w:129; NO-FP16-HARD: @ %bb.0: @ %entry130; NO-FP16-HARD-NEXT: @APP131; NO-FP16-HARD-NEXT: vmov.f32 s0, s0132; NO-FP16-HARD-NEXT: @NO_APP133; NO-FP16-HARD-NEXT: bx lr134;135; FP16-SOFTFP-LABEL: half_w:136; FP16-SOFTFP: @ %bb.0: @ %entry137; FP16-SOFTFP-NEXT: vmov.f16 s0, r0138; FP16-SOFTFP-NEXT: vmov.f16 r0, s0139; FP16-SOFTFP-NEXT: vmov s0, r0140; FP16-SOFTFP-NEXT: @APP141; FP16-SOFTFP-NEXT: vmov.f32 s0, s0142; FP16-SOFTFP-NEXT: @NO_APP143; FP16-SOFTFP-NEXT: vmov r0, s0144; FP16-SOFTFP-NEXT: bx lr145;146; FP16-HARD-LABEL: half_w:147; FP16-HARD: @ %bb.0: @ %entry148; FP16-HARD-NEXT: vmov.f16 r0, s0149; FP16-HARD-NEXT: vmov s0, r0150; FP16-HARD-NEXT: @APP151; FP16-HARD-NEXT: vmov.f32 s0, s0152; FP16-HARD-NEXT: @NO_APP153; FP16-HARD-NEXT: bx lr154;155; BF16-SOFTFP-LABEL: half_w:156; BF16-SOFTFP: @ %bb.0: @ %entry157; BF16-SOFTFP-NEXT: vmov.f16 s0, r0158; BF16-SOFTFP-NEXT: vmov.f16 r0, s0159; BF16-SOFTFP-NEXT: vmov s0, r0160; BF16-SOFTFP-NEXT: @APP161; BF16-SOFTFP-NEXT: vmov.f32 s0, s0162; BF16-SOFTFP-NEXT: @NO_APP163; BF16-SOFTFP-NEXT: vmov r0, s0164; BF16-SOFTFP-NEXT: bx lr165;166; SIMD-BF16-SOFTFP-LABEL: half_w:167; SIMD-BF16-SOFTFP: @ %bb.0: @ %entry168; SIMD-BF16-SOFTFP-NEXT: vmov.f16 s0, r0169; SIMD-BF16-SOFTFP-NEXT: vmov.f16 r0, s0170; SIMD-BF16-SOFTFP-NEXT: vmov s0, r0171; SIMD-BF16-SOFTFP-NEXT: @APP172; SIMD-BF16-SOFTFP-NEXT: vmov.f32 s0, s0173; SIMD-BF16-SOFTFP-NEXT: @NO_APP174; SIMD-BF16-SOFTFP-NEXT: vmov r0, s0175; SIMD-BF16-SOFTFP-NEXT: bx lr176;177; BF16-HARD-LABEL: half_w:178; BF16-HARD: @ %bb.0: @ %entry179; BF16-HARD-NEXT: vmov.f16 r0, s0180; BF16-HARD-NEXT: vmov s0, r0181; BF16-HARD-NEXT: @APP182; BF16-HARD-NEXT: vmov.f32 s0, s0183; BF16-HARD-NEXT: @NO_APP184; BF16-HARD-NEXT: bx lr185;186; SIMD-BF16-HARD-LABEL: half_w:187; SIMD-BF16-HARD: @ %bb.0: @ %entry188; SIMD-BF16-HARD-NEXT: vmov.f16 r0, s0189; SIMD-BF16-HARD-NEXT: vmov s0, r0190; SIMD-BF16-HARD-NEXT: @APP191; SIMD-BF16-HARD-NEXT: vmov.f32 s0, s0192; SIMD-BF16-HARD-NEXT: @NO_APP193; SIMD-BF16-HARD-NEXT: bx lr194entry:195 %0 = tail call half asm "vmov $0, $1", "=w,w"(half %x)196 ret half %0197}198 199define half @half_x(half %x) nounwind {200; NO-FP16-SOFTFP-LABEL: half_x:201; NO-FP16-SOFTFP: @ %bb.0: @ %entry202; NO-FP16-SOFTFP-NEXT: vmov s0, r0203; NO-FP16-SOFTFP-NEXT: @APP204; NO-FP16-SOFTFP-NEXT: vmov.f32 s0, s0205; NO-FP16-SOFTFP-NEXT: @NO_APP206; NO-FP16-SOFTFP-NEXT: vmov r0, s0207; NO-FP16-SOFTFP-NEXT: bx lr208;209; NO-FP16-HARD-LABEL: half_x:210; NO-FP16-HARD: @ %bb.0: @ %entry211; NO-FP16-HARD-NEXT: @APP212; NO-FP16-HARD-NEXT: vmov.f32 s0, s0213; NO-FP16-HARD-NEXT: @NO_APP214; NO-FP16-HARD-NEXT: bx lr215;216; FP16-SOFTFP-LABEL: half_x:217; FP16-SOFTFP: @ %bb.0: @ %entry218; FP16-SOFTFP-NEXT: vmov.f16 s0, r0219; FP16-SOFTFP-NEXT: vmov.f16 r0, s0220; FP16-SOFTFP-NEXT: vmov s0, r0221; FP16-SOFTFP-NEXT: @APP222; FP16-SOFTFP-NEXT: vmov.f32 s0, s0223; FP16-SOFTFP-NEXT: @NO_APP224; FP16-SOFTFP-NEXT: vmov r0, s0225; FP16-SOFTFP-NEXT: bx lr226;227; FP16-HARD-LABEL: half_x:228; FP16-HARD: @ %bb.0: @ %entry229; FP16-HARD-NEXT: vmov.f16 r0, s0230; FP16-HARD-NEXT: vmov s0, r0231; FP16-HARD-NEXT: @APP232; FP16-HARD-NEXT: vmov.f32 s0, s0233; FP16-HARD-NEXT: @NO_APP234; FP16-HARD-NEXT: bx lr235;236; BF16-SOFTFP-LABEL: half_x:237; BF16-SOFTFP: @ %bb.0: @ %entry238; BF16-SOFTFP-NEXT: vmov.f16 s0, r0239; BF16-SOFTFP-NEXT: vmov.f16 r0, s0240; BF16-SOFTFP-NEXT: vmov s0, r0241; BF16-SOFTFP-NEXT: @APP242; BF16-SOFTFP-NEXT: vmov.f32 s0, s0243; BF16-SOFTFP-NEXT: @NO_APP244; BF16-SOFTFP-NEXT: vmov r0, s0245; BF16-SOFTFP-NEXT: bx lr246;247; SIMD-BF16-SOFTFP-LABEL: half_x:248; SIMD-BF16-SOFTFP: @ %bb.0: @ %entry249; SIMD-BF16-SOFTFP-NEXT: vmov.f16 s0, r0250; SIMD-BF16-SOFTFP-NEXT: vmov.f16 r0, s0251; SIMD-BF16-SOFTFP-NEXT: vmov s0, r0252; SIMD-BF16-SOFTFP-NEXT: @APP253; SIMD-BF16-SOFTFP-NEXT: vmov.f32 s0, s0254; SIMD-BF16-SOFTFP-NEXT: @NO_APP255; SIMD-BF16-SOFTFP-NEXT: vmov r0, s0256; SIMD-BF16-SOFTFP-NEXT: bx lr257;258; BF16-HARD-LABEL: half_x:259; BF16-HARD: @ %bb.0: @ %entry260; BF16-HARD-NEXT: vmov.f16 r0, s0261; BF16-HARD-NEXT: vmov s0, r0262; BF16-HARD-NEXT: @APP263; BF16-HARD-NEXT: vmov.f32 s0, s0264; BF16-HARD-NEXT: @NO_APP265; BF16-HARD-NEXT: bx lr266;267; SIMD-BF16-HARD-LABEL: half_x:268; SIMD-BF16-HARD: @ %bb.0: @ %entry269; SIMD-BF16-HARD-NEXT: vmov.f16 r0, s0270; SIMD-BF16-HARD-NEXT: vmov s0, r0271; SIMD-BF16-HARD-NEXT: @APP272; SIMD-BF16-HARD-NEXT: vmov.f32 s0, s0273; SIMD-BF16-HARD-NEXT: @NO_APP274; SIMD-BF16-HARD-NEXT: bx lr275entry:276 %0 = tail call half asm "vmov $0, $1", "=x,x"(half %x)277 ret half %0278}279 280define bfloat @bf16_t(bfloat %x) nounwind {281; NO-FP16-SOFTFP-LABEL: bf16_t:282; NO-FP16-SOFTFP: @ %bb.0: @ %entry283; NO-FP16-SOFTFP-NEXT: vmov s0, r0284; NO-FP16-SOFTFP-NEXT: @APP285; NO-FP16-SOFTFP-NEXT: vmov.f32 s0, s0286; NO-FP16-SOFTFP-NEXT: @NO_APP287; NO-FP16-SOFTFP-NEXT: vmov r0, s0288; NO-FP16-SOFTFP-NEXT: bx lr289;290; NO-FP16-HARD-LABEL: bf16_t:291; NO-FP16-HARD: @ %bb.0: @ %entry292; NO-FP16-HARD-NEXT: @APP293; NO-FP16-HARD-NEXT: vmov.f32 s0, s0294; NO-FP16-HARD-NEXT: @NO_APP295; NO-FP16-HARD-NEXT: bx lr296;297; FP16-SOFTFP-LABEL: bf16_t:298; FP16-SOFTFP: @ %bb.0: @ %entry299; FP16-SOFTFP-NEXT: vmov s0, r0300; FP16-SOFTFP-NEXT: @APP301; FP16-SOFTFP-NEXT: vmov.f32 s0, s0302; FP16-SOFTFP-NEXT: @NO_APP303; FP16-SOFTFP-NEXT: vmov r0, s0304; FP16-SOFTFP-NEXT: bx lr305;306; FP16-HARD-LABEL: bf16_t:307; FP16-HARD: @ %bb.0: @ %entry308; FP16-HARD-NEXT: @APP309; FP16-HARD-NEXT: vmov.f32 s0, s0310; FP16-HARD-NEXT: @NO_APP311; FP16-HARD-NEXT: bx lr312;313; BF16-SOFTFP-LABEL: bf16_t:314; BF16-SOFTFP: @ %bb.0: @ %entry315; BF16-SOFTFP-NEXT: vmov s0, r0316; BF16-SOFTFP-NEXT: @APP317; BF16-SOFTFP-NEXT: vmov.f32 s0, s0318; BF16-SOFTFP-NEXT: @NO_APP319; BF16-SOFTFP-NEXT: vmov r0, s0320; BF16-SOFTFP-NEXT: bx lr321;322; SIMD-BF16-SOFTFP-LABEL: bf16_t:323; SIMD-BF16-SOFTFP: @ %bb.0: @ %entry324; SIMD-BF16-SOFTFP-NEXT: vmov.f16 s0, r0325; SIMD-BF16-SOFTFP-NEXT: vmov.f16 r0, s0326; SIMD-BF16-SOFTFP-NEXT: vmov s0, r0327; SIMD-BF16-SOFTFP-NEXT: @APP328; SIMD-BF16-SOFTFP-NEXT: vmov.f32 s0, s0329; SIMD-BF16-SOFTFP-NEXT: @NO_APP330; SIMD-BF16-SOFTFP-NEXT: vmov r0, s0331; SIMD-BF16-SOFTFP-NEXT: bx lr332;333; BF16-HARD-LABEL: bf16_t:334; BF16-HARD: @ %bb.0: @ %entry335; BF16-HARD-NEXT: @APP336; BF16-HARD-NEXT: vmov.f32 s0, s0337; BF16-HARD-NEXT: @NO_APP338; BF16-HARD-NEXT: bx lr339;340; SIMD-BF16-HARD-LABEL: bf16_t:341; SIMD-BF16-HARD: @ %bb.0: @ %entry342; SIMD-BF16-HARD-NEXT: vmov.f16 r0, s0343; SIMD-BF16-HARD-NEXT: vmov s0, r0344; SIMD-BF16-HARD-NEXT: @APP345; SIMD-BF16-HARD-NEXT: vmov.f32 s0, s0346; SIMD-BF16-HARD-NEXT: @NO_APP347; SIMD-BF16-HARD-NEXT: bx lr348entry:349 %0 = tail call bfloat asm "vmov $0, $1", "=t,t"(bfloat %x)350 ret bfloat %0351}352 353define bfloat @bf16_w(bfloat %x) nounwind {354; NO-FP16-SOFTFP-LABEL: bf16_w:355; NO-FP16-SOFTFP: @ %bb.0: @ %entry356; NO-FP16-SOFTFP-NEXT: vmov s0, r0357; NO-FP16-SOFTFP-NEXT: @APP358; NO-FP16-SOFTFP-NEXT: vmov.f32 s0, s0359; NO-FP16-SOFTFP-NEXT: @NO_APP360; NO-FP16-SOFTFP-NEXT: vmov r0, s0361; NO-FP16-SOFTFP-NEXT: bx lr362;363; NO-FP16-HARD-LABEL: bf16_w:364; NO-FP16-HARD: @ %bb.0: @ %entry365; NO-FP16-HARD-NEXT: @APP366; NO-FP16-HARD-NEXT: vmov.f32 s0, s0367; NO-FP16-HARD-NEXT: @NO_APP368; NO-FP16-HARD-NEXT: bx lr369;370; FP16-SOFTFP-LABEL: bf16_w:371; FP16-SOFTFP: @ %bb.0: @ %entry372; FP16-SOFTFP-NEXT: vmov s0, r0373; FP16-SOFTFP-NEXT: @APP374; FP16-SOFTFP-NEXT: vmov.f32 s0, s0375; FP16-SOFTFP-NEXT: @NO_APP376; FP16-SOFTFP-NEXT: vmov r0, s0377; FP16-SOFTFP-NEXT: bx lr378;379; FP16-HARD-LABEL: bf16_w:380; FP16-HARD: @ %bb.0: @ %entry381; FP16-HARD-NEXT: @APP382; FP16-HARD-NEXT: vmov.f32 s0, s0383; FP16-HARD-NEXT: @NO_APP384; FP16-HARD-NEXT: bx lr385;386; BF16-SOFTFP-LABEL: bf16_w:387; BF16-SOFTFP: @ %bb.0: @ %entry388; BF16-SOFTFP-NEXT: vmov s0, r0389; BF16-SOFTFP-NEXT: @APP390; BF16-SOFTFP-NEXT: vmov.f32 s0, s0391; BF16-SOFTFP-NEXT: @NO_APP392; BF16-SOFTFP-NEXT: vmov r0, s0393; BF16-SOFTFP-NEXT: bx lr394;395; SIMD-BF16-SOFTFP-LABEL: bf16_w:396; SIMD-BF16-SOFTFP: @ %bb.0: @ %entry397; SIMD-BF16-SOFTFP-NEXT: vmov.f16 s0, r0398; SIMD-BF16-SOFTFP-NEXT: vmov.f16 r0, s0399; SIMD-BF16-SOFTFP-NEXT: vmov s0, r0400; SIMD-BF16-SOFTFP-NEXT: @APP401; SIMD-BF16-SOFTFP-NEXT: vmov.f32 s0, s0402; SIMD-BF16-SOFTFP-NEXT: @NO_APP403; SIMD-BF16-SOFTFP-NEXT: vmov r0, s0404; SIMD-BF16-SOFTFP-NEXT: bx lr405;406; BF16-HARD-LABEL: bf16_w:407; BF16-HARD: @ %bb.0: @ %entry408; BF16-HARD-NEXT: @APP409; BF16-HARD-NEXT: vmov.f32 s0, s0410; BF16-HARD-NEXT: @NO_APP411; BF16-HARD-NEXT: bx lr412;413; SIMD-BF16-HARD-LABEL: bf16_w:414; SIMD-BF16-HARD: @ %bb.0: @ %entry415; SIMD-BF16-HARD-NEXT: vmov.f16 r0, s0416; SIMD-BF16-HARD-NEXT: vmov s0, r0417; SIMD-BF16-HARD-NEXT: @APP418; SIMD-BF16-HARD-NEXT: vmov.f32 s0, s0419; SIMD-BF16-HARD-NEXT: @NO_APP420; SIMD-BF16-HARD-NEXT: bx lr421entry:422 %0 = tail call bfloat asm "vmov $0, $1", "=w,w"(bfloat %x)423 ret bfloat %0424}425 426define bfloat @bf16_x(bfloat %x) nounwind {427; NO-FP16-SOFTFP-LABEL: bf16_x:428; NO-FP16-SOFTFP: @ %bb.0: @ %entry429; NO-FP16-SOFTFP-NEXT: vmov s0, r0430; NO-FP16-SOFTFP-NEXT: @APP431; NO-FP16-SOFTFP-NEXT: vmov.f32 s0, s0432; NO-FP16-SOFTFP-NEXT: @NO_APP433; NO-FP16-SOFTFP-NEXT: vmov r0, s0434; NO-FP16-SOFTFP-NEXT: bx lr435;436; NO-FP16-HARD-LABEL: bf16_x:437; NO-FP16-HARD: @ %bb.0: @ %entry438; NO-FP16-HARD-NEXT: @APP439; NO-FP16-HARD-NEXT: vmov.f32 s0, s0440; NO-FP16-HARD-NEXT: @NO_APP441; NO-FP16-HARD-NEXT: bx lr442;443; FP16-SOFTFP-LABEL: bf16_x:444; FP16-SOFTFP: @ %bb.0: @ %entry445; FP16-SOFTFP-NEXT: vmov s0, r0446; FP16-SOFTFP-NEXT: @APP447; FP16-SOFTFP-NEXT: vmov.f32 s0, s0448; FP16-SOFTFP-NEXT: @NO_APP449; FP16-SOFTFP-NEXT: vmov r0, s0450; FP16-SOFTFP-NEXT: bx lr451;452; FP16-HARD-LABEL: bf16_x:453; FP16-HARD: @ %bb.0: @ %entry454; FP16-HARD-NEXT: @APP455; FP16-HARD-NEXT: vmov.f32 s0, s0456; FP16-HARD-NEXT: @NO_APP457; FP16-HARD-NEXT: bx lr458;459; BF16-SOFTFP-LABEL: bf16_x:460; BF16-SOFTFP: @ %bb.0: @ %entry461; BF16-SOFTFP-NEXT: vmov s0, r0462; BF16-SOFTFP-NEXT: @APP463; BF16-SOFTFP-NEXT: vmov.f32 s0, s0464; BF16-SOFTFP-NEXT: @NO_APP465; BF16-SOFTFP-NEXT: vmov r0, s0466; BF16-SOFTFP-NEXT: bx lr467;468; SIMD-BF16-SOFTFP-LABEL: bf16_x:469; SIMD-BF16-SOFTFP: @ %bb.0: @ %entry470; SIMD-BF16-SOFTFP-NEXT: vmov.f16 s0, r0471; SIMD-BF16-SOFTFP-NEXT: vmov.f16 r0, s0472; SIMD-BF16-SOFTFP-NEXT: vmov s0, r0473; SIMD-BF16-SOFTFP-NEXT: @APP474; SIMD-BF16-SOFTFP-NEXT: vmov.f32 s0, s0475; SIMD-BF16-SOFTFP-NEXT: @NO_APP476; SIMD-BF16-SOFTFP-NEXT: vmov r0, s0477; SIMD-BF16-SOFTFP-NEXT: bx lr478;479; BF16-HARD-LABEL: bf16_x:480; BF16-HARD: @ %bb.0: @ %entry481; BF16-HARD-NEXT: @APP482; BF16-HARD-NEXT: vmov.f32 s0, s0483; BF16-HARD-NEXT: @NO_APP484; BF16-HARD-NEXT: bx lr485;486; SIMD-BF16-HARD-LABEL: bf16_x:487; SIMD-BF16-HARD: @ %bb.0: @ %entry488; SIMD-BF16-HARD-NEXT: vmov.f16 r0, s0489; SIMD-BF16-HARD-NEXT: vmov s0, r0490; SIMD-BF16-HARD-NEXT: @APP491; SIMD-BF16-HARD-NEXT: vmov.f32 s0, s0492; SIMD-BF16-HARD-NEXT: @NO_APP493; SIMD-BF16-HARD-NEXT: bx lr494entry:495 %0 = tail call bfloat asm "vmov $0, $1", "=x,x"(bfloat %x)496 ret bfloat %0497}498 499define half @half_s(half %x) nounwind {500; NO-FP16-SOFTFP-LABEL: half_s:501; NO-FP16-SOFTFP: @ %bb.0: @ %entry502; NO-FP16-SOFTFP-NEXT: vmov s2, r0503; NO-FP16-SOFTFP-NEXT: @APP504; NO-FP16-SOFTFP-NEXT: vmov.f32 s1, s2505; NO-FP16-SOFTFP-NEXT: @NO_APP506; NO-FP16-SOFTFP-NEXT: vmov r0, s1507; NO-FP16-SOFTFP-NEXT: bx lr508;509; NO-FP16-HARD-LABEL: half_s:510; NO-FP16-HARD: @ %bb.0: @ %entry511; NO-FP16-HARD-NEXT: vmov.f32 s2, s0512; NO-FP16-HARD-NEXT: @APP513; NO-FP16-HARD-NEXT: vmov.f32 s1, s2514; NO-FP16-HARD-NEXT: @NO_APP515; NO-FP16-HARD-NEXT: vmov.f32 s0, s1516; NO-FP16-HARD-NEXT: bx lr517;518; FP16-SOFTFP-LABEL: half_s:519; FP16-SOFTFP: @ %bb.0: @ %entry520; FP16-SOFTFP-NEXT: vmov.f16 s2, r0521; FP16-SOFTFP-NEXT: @APP522; FP16-SOFTFP-NEXT: vmov.f32 s1, s2523; FP16-SOFTFP-NEXT: @NO_APP524; FP16-SOFTFP-NEXT: vmov r0, s1525; FP16-SOFTFP-NEXT: bx lr526;527; FP16-HARD-LABEL: half_s:528; FP16-HARD: @ %bb.0: @ %entry529; FP16-HARD-NEXT: vmov.f32 s2, s0530; FP16-HARD-NEXT: @APP531; FP16-HARD-NEXT: vmov.f32 s1, s2532; FP16-HARD-NEXT: @NO_APP533; FP16-HARD-NEXT: vmov.f32 s0, s1534; FP16-HARD-NEXT: bx lr535;536; BF16-SOFTFP-LABEL: half_s:537; BF16-SOFTFP: @ %bb.0: @ %entry538; BF16-SOFTFP-NEXT: vmov.f16 s2, r0539; BF16-SOFTFP-NEXT: @APP540; BF16-SOFTFP-NEXT: vmov.f32 s1, s2541; BF16-SOFTFP-NEXT: @NO_APP542; BF16-SOFTFP-NEXT: vmov r0, s1543; BF16-SOFTFP-NEXT: bx lr544;545; SIMD-BF16-SOFTFP-LABEL: half_s:546; SIMD-BF16-SOFTFP: @ %bb.0: @ %entry547; SIMD-BF16-SOFTFP-NEXT: vmov.f16 s2, r0548; SIMD-BF16-SOFTFP-NEXT: @APP549; SIMD-BF16-SOFTFP-NEXT: vmov.f32 s1, s2550; SIMD-BF16-SOFTFP-NEXT: @NO_APP551; SIMD-BF16-SOFTFP-NEXT: vmov r0, s1552; SIMD-BF16-SOFTFP-NEXT: bx lr553;554; BF16-HARD-LABEL: half_s:555; BF16-HARD: @ %bb.0: @ %entry556; BF16-HARD-NEXT: vmov.f32 s2, s0557; BF16-HARD-NEXT: @APP558; BF16-HARD-NEXT: vmov.f32 s1, s2559; BF16-HARD-NEXT: @NO_APP560; BF16-HARD-NEXT: vmov.f32 s0, s1561; BF16-HARD-NEXT: bx lr562;563; SIMD-BF16-HARD-LABEL: half_s:564; SIMD-BF16-HARD: @ %bb.0: @ %entry565; SIMD-BF16-HARD-NEXT: vmov.f32 s2, s0566; SIMD-BF16-HARD-NEXT: @APP567; SIMD-BF16-HARD-NEXT: vmov.f32 s1, s2568; SIMD-BF16-HARD-NEXT: @NO_APP569; SIMD-BF16-HARD-NEXT: vmov.f32 s0, s1570; SIMD-BF16-HARD-NEXT: bx lr571entry:572 %0 = tail call half asm "vmov $0, $1", "={s1},{s2}"(half %x)573 ret half %0574}575