brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · dabbb1e Raw
162 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc < %s -mtriple=armv7-linux-gnueabihf -o - | FileCheck %s3; RUN: llc < %s -mtriple=thumbv7em-none-eabi -mcpu=cortex-m4 | FileCheck %s --check-prefix=CHECK-M4F4 5target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64"6 7define arm_aapcs_vfpcc void @test_1float({ float } %a) {8; CHECK-LABEL: test_1float:9; CHECK:       @ %bb.0:10; CHECK-NEXT:    .save {r11, lr}11; CHECK-NEXT:    push {r11, lr}12; CHECK-NEXT:    vmov.f32 s0, #1.000000e+0013; CHECK-NEXT:    bl test_1float14; CHECK-NEXT:    pop {r11, pc}15;16; CHECK-M4F-LABEL: test_1float:17; CHECK-M4F:       @ %bb.0:18; CHECK-M4F-NEXT:    .save {r7, lr}19; CHECK-M4F-NEXT:    push {r7, lr}20; CHECK-M4F-NEXT:    vmov.f32 s0, #1.000000e+0021; CHECK-M4F-NEXT:    bl test_1float22; CHECK-M4F-NEXT:    pop {r7, pc}23  call arm_aapcs_vfpcc void @test_1float({ float } { float 1.0 })24  ret void25}26 27define arm_aapcs_vfpcc void @test_2float({ float, float } %a) {28; CHECK-LABEL: test_2float:29; CHECK:       @ %bb.0:30; CHECK-NEXT:    .save {r11, lr}31; CHECK-NEXT:    push {r11, lr}32; CHECK-NEXT:    vmov.f32 s0, #1.000000e+0033; CHECK-NEXT:    vmov.f32 s1, #2.000000e+0034; CHECK-NEXT:    bl test_2float35; CHECK-NEXT:    pop {r11, pc}36;37; CHECK-M4F-LABEL: test_2float:38; CHECK-M4F:       @ %bb.0:39; CHECK-M4F-NEXT:    .save {r7, lr}40; CHECK-M4F-NEXT:    push {r7, lr}41; CHECK-M4F-NEXT:    vmov.f32 s0, #1.000000e+0042; CHECK-M4F-NEXT:    vmov.f32 s1, #2.000000e+0043; CHECK-M4F-NEXT:    bl test_2float44; CHECK-M4F-NEXT:    pop {r7, pc}45  call arm_aapcs_vfpcc void @test_2float({ float, float } { float 1.0, float 2.0 })46  ret void47}48 49define arm_aapcs_vfpcc void @test_3float({ float, float, float } %a) {50; CHECK-LABEL: test_3float:51; CHECK:       @ %bb.0:52; CHECK-NEXT:    .save {r11, lr}53; CHECK-NEXT:    push {r11, lr}54; CHECK-NEXT:    vmov.f32 s0, #1.000000e+0055; CHECK-NEXT:    vmov.f32 s1, #2.000000e+0056; CHECK-NEXT:    vmov.f32 s2, #3.000000e+0057; CHECK-NEXT:    bl test_3float58; CHECK-NEXT:    pop {r11, pc}59;60; CHECK-M4F-LABEL: test_3float:61; CHECK-M4F:       @ %bb.0:62; CHECK-M4F-NEXT:    .save {r7, lr}63; CHECK-M4F-NEXT:    push {r7, lr}64; CHECK-M4F-NEXT:    vmov.f32 s0, #1.000000e+0065; CHECK-M4F-NEXT:    vmov.f32 s1, #2.000000e+0066; CHECK-M4F-NEXT:    vmov.f32 s2, #3.000000e+0067; CHECK-M4F-NEXT:    bl test_3float68; CHECK-M4F-NEXT:    pop {r7, pc}69  call arm_aapcs_vfpcc void @test_3float({ float, float, float } { float 1.0, float 2.0, float 3.0 })70  ret void71}72 73define arm_aapcs_vfpcc void @test_1double({ double } %a) {74; CHECK-LABEL: test_1double:75; CHECK:       @ %bb.0:76; CHECK-NEXT:    .save {r11, lr}77; CHECK-NEXT:    push {r11, lr}78; CHECK-NEXT:    vmov.f64 d0, #1.000000e+0079; CHECK-NEXT:    bl test_1double80; CHECK-NEXT:    pop {r11, pc}81;82; CHECK-M4F-LABEL: test_1double:83; CHECK-M4F:       @ %bb.0:84; CHECK-M4F-NEXT:    .save {r7, lr}85; CHECK-M4F-NEXT:    push {r7, lr}86; CHECK-M4F-NEXT:    vldr d0, .LCPI3_087; CHECK-M4F-NEXT:    bl test_1double88; CHECK-M4F-NEXT:    pop {r7, pc}89; CHECK-M4F-NEXT:    .p2align 390; CHECK-M4F-NEXT:  @ %bb.1:91; CHECK-M4F-NEXT:  .LCPI3_0:92; CHECK-M4F-NEXT:    .long 0 @ double 193; CHECK-M4F-NEXT:    .long 107269324894  call arm_aapcs_vfpcc void @test_1double({ double } { double 1.0 })95  ret void96}97 98; Final double argument might be put in s15 & [sp] if we're careless. It should99; go all on the stack.100define arm_aapcs_vfpcc void @test_1double_nosplit([4 x float], [4 x double], [3 x float], double %a) {101; CHECK-LABEL: test_1double_nosplit:102; CHECK:       @ %bb.0:103; CHECK-NEXT:    .save {r11, lr}104; CHECK-NEXT:    push {r11, lr}105; CHECK-NEXT:    .pad #8106; CHECK-NEXT:    sub sp, sp, #8107; CHECK-NEXT:    vmov.f64 d16, #1.000000e+00108; CHECK-NEXT:    vstr d16, [sp]109; CHECK-NEXT:    bl test_1double_nosplit110; CHECK-NEXT:    add sp, sp, #8111; CHECK-NEXT:    pop {r11, pc}112;113; CHECK-M4F-LABEL: test_1double_nosplit:114; CHECK-M4F:       @ %bb.0:115; CHECK-M4F-NEXT:    .save {r7, lr}116; CHECK-M4F-NEXT:    push {r7, lr}117; CHECK-M4F-NEXT:    .pad #8118; CHECK-M4F-NEXT:    sub sp, #8119; CHECK-M4F-NEXT:    movs r0, #0120; CHECK-M4F-NEXT:    movt r0, #16368121; CHECK-M4F-NEXT:    movs r1, #0122; CHECK-M4F-NEXT:    strd r1, r0, [sp]123; CHECK-M4F-NEXT:    bl test_1double_nosplit124; CHECK-M4F-NEXT:    add sp, #8125; CHECK-M4F-NEXT:    pop {r7, pc}126  call arm_aapcs_vfpcc void @test_1double_nosplit([4 x float] undef, [4 x double] undef, [3 x float] undef, double 1.0)127  ret void128}129 130; Final double argument might go at [sp, #4] if we're careless. Should go at131; [sp, #8] to preserve alignment.132define arm_aapcs_vfpcc void @test_1double_misaligned([4 x double], [4 x double], float, double) {133; CHECK-LABEL: test_1double_misaligned:134; CHECK:       @ %bb.0:135; CHECK-NEXT:    .save {r11, lr}136; CHECK-NEXT:    push {r11, lr}137; CHECK-NEXT:    .pad #16138; CHECK-NEXT:    sub sp, sp, #16139; CHECK-NEXT:    vmov.f64 d16, #1.000000e+00140; CHECK-NEXT:    vstr d16, [sp, #8]141; CHECK-NEXT:    bl test_1double_misaligned142; CHECK-NEXT:    add sp, sp, #16143; CHECK-NEXT:    pop {r11, pc}144;145; CHECK-M4F-LABEL: test_1double_misaligned:146; CHECK-M4F:       @ %bb.0:147; CHECK-M4F-NEXT:    .save {r7, lr}148; CHECK-M4F-NEXT:    push {r7, lr}149; CHECK-M4F-NEXT:    .pad #16150; CHECK-M4F-NEXT:    sub sp, #16151; CHECK-M4F-NEXT:    movs r0, #0152; CHECK-M4F-NEXT:    movt r0, #16368153; CHECK-M4F-NEXT:    movs r1, #0154; CHECK-M4F-NEXT:    strd r1, r0, [sp, #8]155; CHECK-M4F-NEXT:    bl test_1double_misaligned156; CHECK-M4F-NEXT:    add sp, #16157; CHECK-M4F-NEXT:    pop {r7, pc}158  call arm_aapcs_vfpcc void @test_1double_misaligned([4 x double] undef, [4 x double] undef, float undef, double 1.0)159 160  ret void161}162