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