brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.0 KiB · be18eb3 Raw
369 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=arm-unknown-linux-gnueabihf -mattr=+vfp2 < %s | FileCheck -check-prefixes=AAPCS-HARD,GNU-AAPCS-HARD %s3; RUN: llc -mtriple=arm-unknown-linux-gnueabi -mattr=+vfp2 < %s | FileCheck -check-prefixes=AAPCS-SOFT,GNU-AAPCS-SOFT %s4; RUN: llc -mtriple=arm-unknown-linux-eabihf -mattr=+vfp2 < %s | FileCheck -check-prefixes=AAPCS-HARD,EABI-HARD %s5; RUN: llc -mtriple=arm-unknown-linux-eabi -mattr=+vfp2 < %s | FileCheck -check-prefixes=AAPCS-SOFT,EABI-SOFT %s6; RUN: llc -mtriple=armv7-unknown-linux -target-abi=apcs -float-abi=soft < %s | FileCheck -check-prefix=APCS %s7; RUN: llc -mtriple=armv7-unknown-linux -target-abi=apcs -float-abi=hard < %s | FileCheck -check-prefix=APCS %s8; RUN: llc -mtriple=armv7k-apple-watchos2.0 -mcpu=cortex-a7 < %s | FileCheck -check-prefix=WATCHABI-HARD %s9; RUN: llc -mtriple=armv7k-apple-watchos2.0 -mcpu=cortex-a7 -float-abi=soft < %s | FileCheck -check-prefix=WATCHABI-SOFT %s10 11define i1 @test(half %self) #0 {12; GNU-AAPCS-HARD-LABEL: test:13; GNU-AAPCS-HARD:       @ %bb.0:14; GNU-AAPCS-HARD-NEXT:    .save {r11, lr}15; GNU-AAPCS-HARD-NEXT:    push {r11, lr}16; GNU-AAPCS-HARD-NEXT:    vmov r0, s017; GNU-AAPCS-HARD-NEXT:    bl __gnu_h2f_ieee18; GNU-AAPCS-HARD-NEXT:    vmov s0, r019; GNU-AAPCS-HARD-NEXT:    mov r0, #020; GNU-AAPCS-HARD-NEXT:    vcmp.f32 s0, s021; GNU-AAPCS-HARD-NEXT:    vmrs APSR_nzcv, fpscr22; GNU-AAPCS-HARD-NEXT:    movvs r0, #123; GNU-AAPCS-HARD-NEXT:    pop {r11, lr}24; GNU-AAPCS-HARD-NEXT:    mov pc, lr25;26; GNU-AAPCS-SOFT-LABEL: test:27; GNU-AAPCS-SOFT:       @ %bb.0:28; GNU-AAPCS-SOFT-NEXT:    .save {r11, lr}29; GNU-AAPCS-SOFT-NEXT:    push {r11, lr}30; GNU-AAPCS-SOFT-NEXT:    bl __gnu_h2f_ieee31; GNU-AAPCS-SOFT-NEXT:    vmov s0, r032; GNU-AAPCS-SOFT-NEXT:    mov r0, #033; GNU-AAPCS-SOFT-NEXT:    vcmp.f32 s0, s034; GNU-AAPCS-SOFT-NEXT:    vmrs APSR_nzcv, fpscr35; GNU-AAPCS-SOFT-NEXT:    movvs r0, #136; GNU-AAPCS-SOFT-NEXT:    pop {r11, lr}37; GNU-AAPCS-SOFT-NEXT:    mov pc, lr38;39; EABI-HARD-LABEL: test:40; EABI-HARD:       @ %bb.0:41; EABI-HARD-NEXT:    .save {r11, lr}42; EABI-HARD-NEXT:    push {r11, lr}43; EABI-HARD-NEXT:    vmov r0, s044; EABI-HARD-NEXT:    bl __aeabi_h2f45; EABI-HARD-NEXT:    vmov s0, r046; EABI-HARD-NEXT:    mov r0, #047; EABI-HARD-NEXT:    vcmp.f32 s0, s048; EABI-HARD-NEXT:    vmrs APSR_nzcv, fpscr49; EABI-HARD-NEXT:    movvs r0, #150; EABI-HARD-NEXT:    pop {r11, lr}51; EABI-HARD-NEXT:    mov pc, lr52;53; EABI-SOFT-LABEL: test:54; EABI-SOFT:       @ %bb.0:55; EABI-SOFT-NEXT:    .save {r11, lr}56; EABI-SOFT-NEXT:    push {r11, lr}57; EABI-SOFT-NEXT:    bl __aeabi_h2f58; EABI-SOFT-NEXT:    vmov s0, r059; EABI-SOFT-NEXT:    mov r0, #060; EABI-SOFT-NEXT:    vcmp.f32 s0, s061; EABI-SOFT-NEXT:    vmrs APSR_nzcv, fpscr62; EABI-SOFT-NEXT:    movvs r0, #163; EABI-SOFT-NEXT:    pop {r11, lr}64; EABI-SOFT-NEXT:    mov pc, lr65;66; APCS-LABEL: test:67; APCS:       @ %bb.0:68; APCS-NEXT:    push {lr}69; APCS-NEXT:    bl __gnu_h2f_ieee70; APCS-NEXT:    vmov s0, r071; APCS-NEXT:    mov r0, #072; APCS-NEXT:    vcmp.f32 s0, s073; APCS-NEXT:    vmrs APSR_nzcv, fpscr74; APCS-NEXT:    movwvs r0, #175; APCS-NEXT:    pop {lr}76; APCS-NEXT:    bx lr77;78; WATCHABI-HARD-LABEL: test:79; WATCHABI-HARD:       @ %bb.0:80; WATCHABI-HARD-NEXT:    vcvtb.f32.f16 s0, s081; WATCHABI-HARD-NEXT:    mov r0, #082; WATCHABI-HARD-NEXT:    vcmp.f32 s0, s083; WATCHABI-HARD-NEXT:    vmrs APSR_nzcv, fpscr84; WATCHABI-HARD-NEXT:    movwvs r0, #185; WATCHABI-HARD-NEXT:    bx lr86;87; WATCHABI-SOFT-LABEL: test:88; WATCHABI-SOFT:       @ %bb.0:89; WATCHABI-SOFT-NEXT:    vmov s0, r090; WATCHABI-SOFT-NEXT:    mov r1, #091; WATCHABI-SOFT-NEXT:    vcvtb.f32.f16 s0, s092; WATCHABI-SOFT-NEXT:    vcmp.f32 s0, s093; WATCHABI-SOFT-NEXT:    vmrs APSR_nzcv, fpscr94; WATCHABI-SOFT-NEXT:    movwvs r1, #195; WATCHABI-SOFT-NEXT:    mov r0, r196; WATCHABI-SOFT-NEXT:    bx lr97  %_0 = fcmp une half %self, %self98  ret i1 %_099}100 101define float @f16_to_f32(ptr %p) #0 {102; GNU-AAPCS-HARD-LABEL: f16_to_f32:103; GNU-AAPCS-HARD:       @ %bb.0:104; GNU-AAPCS-HARD-NEXT:    .save {r11, lr}105; GNU-AAPCS-HARD-NEXT:    push {r11, lr}106; GNU-AAPCS-HARD-NEXT:    ldrh r0, [r0]107; GNU-AAPCS-HARD-NEXT:    bl __gnu_h2f_ieee108; GNU-AAPCS-HARD-NEXT:    vmov s0, r0109; GNU-AAPCS-HARD-NEXT:    pop {r11, lr}110; GNU-AAPCS-HARD-NEXT:    mov pc, lr111;112; GNU-AAPCS-SOFT-LABEL: f16_to_f32:113; GNU-AAPCS-SOFT:       @ %bb.0:114; GNU-AAPCS-SOFT-NEXT:    ldrh r0, [r0]115; GNU-AAPCS-SOFT-NEXT:    b __gnu_h2f_ieee116;117; EABI-HARD-LABEL: f16_to_f32:118; EABI-HARD:       @ %bb.0:119; EABI-HARD-NEXT:    .save {r11, lr}120; EABI-HARD-NEXT:    push {r11, lr}121; EABI-HARD-NEXT:    ldrh r0, [r0]122; EABI-HARD-NEXT:    bl __aeabi_h2f123; EABI-HARD-NEXT:    vmov s0, r0124; EABI-HARD-NEXT:    pop {r11, lr}125; EABI-HARD-NEXT:    mov pc, lr126;127; EABI-SOFT-LABEL: f16_to_f32:128; EABI-SOFT:       @ %bb.0:129; EABI-SOFT-NEXT:    ldrh r0, [r0]130; EABI-SOFT-NEXT:    b __aeabi_h2f131;132; APCS-LABEL: f16_to_f32:133; APCS:       @ %bb.0:134; APCS-NEXT:    ldrh r0, [r0]135; APCS-NEXT:    b __gnu_h2f_ieee136;137; WATCHABI-HARD-LABEL: f16_to_f32:138; WATCHABI-HARD:       @ %bb.0:139; WATCHABI-HARD-NEXT:    ldrh r0, [r0]140; WATCHABI-HARD-NEXT:    vmov s0, r0141; WATCHABI-HARD-NEXT:    vcvtb.f32.f16 s0, s0142; WATCHABI-HARD-NEXT:    bx lr143;144; WATCHABI-SOFT-LABEL: f16_to_f32:145; WATCHABI-SOFT:       @ %bb.0:146; WATCHABI-SOFT-NEXT:    ldrh r0, [r0]147; WATCHABI-SOFT-NEXT:    vmov s0, r0148; WATCHABI-SOFT-NEXT:    vcvtb.f32.f16 s0, s0149; WATCHABI-SOFT-NEXT:    vmov r0, s0150; WATCHABI-SOFT-NEXT:    bx lr151  %load = load half, ptr %p152  %cvt = fpext half %load to float153  ret float %cvt154}155 156define void @f32_to_f16(ptr %p, float %arg) #0 {157; GNU-AAPCS-HARD-LABEL: f32_to_f16:158; GNU-AAPCS-HARD:       @ %bb.0:159; GNU-AAPCS-HARD-NEXT:    .save {r4, lr}160; GNU-AAPCS-HARD-NEXT:    push {r4, lr}161; GNU-AAPCS-HARD-NEXT:    mov r4, r0162; GNU-AAPCS-HARD-NEXT:    vmov r0, s0163; GNU-AAPCS-HARD-NEXT:    bl __gnu_f2h_ieee164; GNU-AAPCS-HARD-NEXT:    strh r0, [r4]165; GNU-AAPCS-HARD-NEXT:    pop {r4, lr}166; GNU-AAPCS-HARD-NEXT:    mov pc, lr167;168; GNU-AAPCS-SOFT-LABEL: f32_to_f16:169; GNU-AAPCS-SOFT:       @ %bb.0:170; GNU-AAPCS-SOFT-NEXT:    .save {r4, lr}171; GNU-AAPCS-SOFT-NEXT:    push {r4, lr}172; GNU-AAPCS-SOFT-NEXT:    mov r4, r0173; GNU-AAPCS-SOFT-NEXT:    mov r0, r1174; GNU-AAPCS-SOFT-NEXT:    bl __gnu_f2h_ieee175; GNU-AAPCS-SOFT-NEXT:    strh r0, [r4]176; GNU-AAPCS-SOFT-NEXT:    pop {r4, lr}177; GNU-AAPCS-SOFT-NEXT:    mov pc, lr178;179; EABI-HARD-LABEL: f32_to_f16:180; EABI-HARD:       @ %bb.0:181; EABI-HARD-NEXT:    .save {r4, lr}182; EABI-HARD-NEXT:    push {r4, lr}183; EABI-HARD-NEXT:    mov r4, r0184; EABI-HARD-NEXT:    vmov r0, s0185; EABI-HARD-NEXT:    bl __aeabi_f2h186; EABI-HARD-NEXT:    strh r0, [r4]187; EABI-HARD-NEXT:    pop {r4, lr}188; EABI-HARD-NEXT:    mov pc, lr189;190; EABI-SOFT-LABEL: f32_to_f16:191; EABI-SOFT:       @ %bb.0:192; EABI-SOFT-NEXT:    .save {r4, lr}193; EABI-SOFT-NEXT:    push {r4, lr}194; EABI-SOFT-NEXT:    mov r4, r0195; EABI-SOFT-NEXT:    mov r0, r1196; EABI-SOFT-NEXT:    bl __aeabi_f2h197; EABI-SOFT-NEXT:    strh r0, [r4]198; EABI-SOFT-NEXT:    pop {r4, lr}199; EABI-SOFT-NEXT:    mov pc, lr200;201; APCS-LABEL: f32_to_f16:202; APCS:       @ %bb.0:203; APCS-NEXT:    push {r4, lr}204; APCS-NEXT:    mov r4, r0205; APCS-NEXT:    mov r0, r1206; APCS-NEXT:    bl __gnu_f2h_ieee207; APCS-NEXT:    strh r0, [r4]208; APCS-NEXT:    pop {r4, pc}209;210; WATCHABI-HARD-LABEL: f32_to_f16:211; WATCHABI-HARD:       @ %bb.0:212; WATCHABI-HARD-NEXT:    vcvtb.f16.f32 s0, s0213; WATCHABI-HARD-NEXT:    vmov r1, s0214; WATCHABI-HARD-NEXT:    strh r1, [r0]215; WATCHABI-HARD-NEXT:    bx lr216;217; WATCHABI-SOFT-LABEL: f32_to_f16:218; WATCHABI-SOFT:       @ %bb.0:219; WATCHABI-SOFT-NEXT:    vmov s0, r1220; WATCHABI-SOFT-NEXT:    vcvtb.f16.f32 s0, s0221; WATCHABI-SOFT-NEXT:    vmov r1, s0222; WATCHABI-SOFT-NEXT:    strh r1, [r0]223; WATCHABI-SOFT-NEXT:    bx lr224  %cvt = fptrunc float %arg to half225  store half %cvt, ptr %p226  ret void227}228 229define double @f16_to_f64(ptr %p) #0 {230; GNU-AAPCS-HARD-LABEL: f16_to_f64:231; GNU-AAPCS-HARD:       @ %bb.0:232; GNU-AAPCS-HARD-NEXT:    .save {r11, lr}233; GNU-AAPCS-HARD-NEXT:    push {r11, lr}234; GNU-AAPCS-HARD-NEXT:    ldrh r0, [r0]235; GNU-AAPCS-HARD-NEXT:    bl __gnu_h2f_ieee236; GNU-AAPCS-HARD-NEXT:    vmov s0, r0237; GNU-AAPCS-HARD-NEXT:    vcvt.f64.f32 d0, s0238; GNU-AAPCS-HARD-NEXT:    pop {r11, lr}239; GNU-AAPCS-HARD-NEXT:    mov pc, lr240;241; GNU-AAPCS-SOFT-LABEL: f16_to_f64:242; GNU-AAPCS-SOFT:       @ %bb.0:243; GNU-AAPCS-SOFT-NEXT:    .save {r11, lr}244; GNU-AAPCS-SOFT-NEXT:    push {r11, lr}245; GNU-AAPCS-SOFT-NEXT:    ldrh r0, [r0]246; GNU-AAPCS-SOFT-NEXT:    bl __gnu_h2f_ieee247; GNU-AAPCS-SOFT-NEXT:    vmov s0, r0248; GNU-AAPCS-SOFT-NEXT:    vcvt.f64.f32 d0, s0249; GNU-AAPCS-SOFT-NEXT:    vmov r0, r1, d0250; GNU-AAPCS-SOFT-NEXT:    pop {r11, lr}251; GNU-AAPCS-SOFT-NEXT:    mov pc, lr252;253; EABI-HARD-LABEL: f16_to_f64:254; EABI-HARD:       @ %bb.0:255; EABI-HARD-NEXT:    .save {r11, lr}256; EABI-HARD-NEXT:    push {r11, lr}257; EABI-HARD-NEXT:    ldrh r0, [r0]258; EABI-HARD-NEXT:    bl __aeabi_h2f259; EABI-HARD-NEXT:    vmov s0, r0260; EABI-HARD-NEXT:    vcvt.f64.f32 d0, s0261; EABI-HARD-NEXT:    pop {r11, lr}262; EABI-HARD-NEXT:    mov pc, lr263;264; EABI-SOFT-LABEL: f16_to_f64:265; EABI-SOFT:       @ %bb.0:266; EABI-SOFT-NEXT:    .save {r11, lr}267; EABI-SOFT-NEXT:    push {r11, lr}268; EABI-SOFT-NEXT:    ldrh r0, [r0]269; EABI-SOFT-NEXT:    bl __aeabi_h2f270; EABI-SOFT-NEXT:    vmov s0, r0271; EABI-SOFT-NEXT:    vcvt.f64.f32 d0, s0272; EABI-SOFT-NEXT:    vmov r0, r1, d0273; EABI-SOFT-NEXT:    pop {r11, lr}274; EABI-SOFT-NEXT:    mov pc, lr275;276; APCS-LABEL: f16_to_f64:277; APCS:       @ %bb.0:278; APCS-NEXT:    push {lr}279; APCS-NEXT:    ldrh r0, [r0]280; APCS-NEXT:    bl __gnu_h2f_ieee281; APCS-NEXT:    vmov s0, r0282; APCS-NEXT:    vcvt.f64.f32 d16, s0283; APCS-NEXT:    vmov r0, r1, d16284; APCS-NEXT:    pop {lr}285; APCS-NEXT:    bx lr286;287; WATCHABI-HARD-LABEL: f16_to_f64:288; WATCHABI-HARD:       @ %bb.0:289; WATCHABI-HARD-NEXT:    ldrh r0, [r0]290; WATCHABI-HARD-NEXT:    vmov s0, r0291; WATCHABI-HARD-NEXT:    vcvtb.f32.f16 s0, s0292; WATCHABI-HARD-NEXT:    vcvt.f64.f32 d0, s0293; WATCHABI-HARD-NEXT:    bx lr294;295; WATCHABI-SOFT-LABEL: f16_to_f64:296; WATCHABI-SOFT:       @ %bb.0:297; WATCHABI-SOFT-NEXT:    ldrh r0, [r0]298; WATCHABI-SOFT-NEXT:    vmov s0, r0299; WATCHABI-SOFT-NEXT:    vcvtb.f32.f16 s0, s0300; WATCHABI-SOFT-NEXT:    vcvt.f64.f32 d16, s0301; WATCHABI-SOFT-NEXT:    vmov r0, r1, d16302; WATCHABI-SOFT-NEXT:    bx lr303  %load = load half, ptr %p304  %cvt = fpext half %load to double305  ret double %cvt306}307 308define void @f64_to_f16(ptr %p, double %arg) #0 {309; AAPCS-HARD-LABEL: f64_to_f16:310; AAPCS-HARD:       @ %bb.0:311; AAPCS-HARD-NEXT:    .save {r4, lr}312; AAPCS-HARD-NEXT:    push {r4, lr}313; AAPCS-HARD-NEXT:    mov r4, r0314; AAPCS-HARD-NEXT:    vmov r0, r1, d0315; AAPCS-HARD-NEXT:    bl __aeabi_d2h316; AAPCS-HARD-NEXT:    strh r0, [r4]317; AAPCS-HARD-NEXT:    pop {r4, lr}318; AAPCS-HARD-NEXT:    mov pc, lr319;320; AAPCS-SOFT-LABEL: f64_to_f16:321; AAPCS-SOFT:       @ %bb.0:322; AAPCS-SOFT-NEXT:    .save {r4, lr}323; AAPCS-SOFT-NEXT:    push {r4, lr}324; AAPCS-SOFT-NEXT:    mov r4, r0325; AAPCS-SOFT-NEXT:    mov r1, r3326; AAPCS-SOFT-NEXT:    mov r0, r2327; AAPCS-SOFT-NEXT:    bl __aeabi_d2h328; AAPCS-SOFT-NEXT:    strh r0, [r4]329; AAPCS-SOFT-NEXT:    pop {r4, lr}330; AAPCS-SOFT-NEXT:    mov pc, lr331;332; APCS-LABEL: f64_to_f16:333; APCS:       @ %bb.0:334; APCS-NEXT:    push {r4, lr}335; APCS-NEXT:    mov r4, r0336; APCS-NEXT:    mov r0, r1337; APCS-NEXT:    mov r1, r2338; APCS-NEXT:    bl __truncdfhf2339; APCS-NEXT:    strh r0, [r4]340; APCS-NEXT:    pop {r4, pc}341;342; WATCHABI-HARD-LABEL: f64_to_f16:343; WATCHABI-HARD:       @ %bb.0:344; WATCHABI-HARD-NEXT:    push {r4, lr}345; WATCHABI-HARD-NEXT:    sub sp, sp, #8346; WATCHABI-HARD-NEXT:    mov r4, r0347; WATCHABI-HARD-NEXT:    bl ___truncdfhf2348; WATCHABI-HARD-NEXT:    strh r0, [r4]349; WATCHABI-HARD-NEXT:    add sp, sp, #8350; WATCHABI-HARD-NEXT:    pop {r4, pc}351;352; WATCHABI-SOFT-LABEL: f64_to_f16:353; WATCHABI-SOFT:       @ %bb.0:354; WATCHABI-SOFT-NEXT:    push {r4, lr}355; WATCHABI-SOFT-NEXT:    sub sp, sp, #8356; WATCHABI-SOFT-NEXT:    mov r4, r0357; WATCHABI-SOFT-NEXT:    mov r1, r3358; WATCHABI-SOFT-NEXT:    mov r0, r2359; WATCHABI-SOFT-NEXT:    bl ___truncdfhf2360; WATCHABI-SOFT-NEXT:    strh r0, [r4]361; WATCHABI-SOFT-NEXT:    add sp, sp, #8362; WATCHABI-SOFT-NEXT:    pop {r4, pc}363  %cvt = fptrunc double %arg to half364  store half %cvt, ptr %p365  ret void366}367 368attributes #0 = { nounwind }369