brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.5 KiB · 9a557c5 Raw
280 lines · plain
1# RUN: llc -mtriple=armv7-none-none-eabihf -mcpu=cortex-r5 -o - %s -run-pass=prologepilog \2# RUN: | FileCheck --check-prefix=CHECK-R-ARM %s3# RUN: llc -mtriple=armv7-none-none-eabihf -mcpu=cortex-r4 -o - %s -run-pass=prologepilog \4# RUN: | FileCheck --check-prefix=CHECK-R-ARM %s5# RUN: llc -mtriple=thumbv7-none-none-eabihf -mcpu=cortex-r5 -o - %s -run-pass=prologepilog \6# RUN: | FileCheck --check-prefix=CHECK-R-THUMB %s7# RUN: llc -mtriple=thumbv7-none-none-eabihf -mcpu=cortex-r4 -o - %s -run-pass=prologepilog \8# RUN: | FileCheck --check-prefix=CHECK-R-THUMB %s9# RUN: llc -mtriple=thumbv7-none-none-eabihf -mcpu=cortex-m3 -o - %s -run-pass=prologepilog \10# RUN: | FileCheck --check-prefix=CHECK-M-THUMB %s11# RUN: llc -mtriple=thumbv7-none-none-eabihf -mcpu=cortex-m4 -o - %s -run-pass=prologepilog \12# RUN: | FileCheck --check-prefix=CHECK-M-THUMB %s13# RUN: llc -mtriple=thumbv8-none-none-eabihf -mcpu=cortex-m33 -o - %s -run-pass=prologepilog \14# RUN: | FileCheck --check-prefix=CHECK-M-THUMB %s15 16# =============================================================================17# ============================ cortex-r arm-mode ==============================18# =============================================================================19# This IRQ will save 104 bytes:20#21# |---------+------+----------|22# | reg     | size | zone     |23# |---------+------+----------|24# | LR      |  4x1 | GPR      |25# | R12-R10 |  4x3 |          |26# | R5-R0   |  4x6 |          |27# |---------+------+----------|28# | FPEXC   |  4x1 | FPStatus |29# | FPSCR   |  4x1 |          |30# |---------+------+----------|31# | D7-D0   |  8x8 | FPRegs   |32# |---------+------+----------|33# |         |  112 |          |34# |---------+------+----------|35#36# ================================= Prologue =================================37#38# Frame pointer (r11) will be store at $original_sp - 12, but we can't save the39# FP until after we save the GPR zone of registers. The GPR zone of registers40# moves the stack by 40 bytes. So $original_sp = $current_sp + 40. Thus,41# $current_sp + 40 - 12 = $current_sp + 28. Thus, we see the instruction:42#43# $r11 = ADDri $sp, 2844#45# We don't have dwarf information for the FPEXC and FPSCR registers, so there's46# no CFI_INSTRUCTION for those saves. So, we should see an 8 byte disparity in47# the register offsets. $r0 is -40, and $d7 is -56.48#49# (-40) - (-56) = 16.50# 16 = 8 (bytes from $d7) + 8 (bytes from FPSCR + FPEXC)51#52# There's an extra BFC to force the stack to be aligned.53#54# $sp = BFC $sp, 4294967288 /* ~0x7 */55#56# ================================= Epilogue =================================57#58# We use the frame pointer to restore the SP. Since $r11 is currently pointing59# to the previous $r11's stack position (aka base_of_stack - 12), and we60# allocated 112 bytes, $sp = $r11 - (112 - 12), or $sp = $r11 - 100, which is61# why we see this instruction:62#63# $sp = SUBri $r11, 10064 65# CHECK-R-ARM-LABEL: name: irq_fn66# CHECK-R-ARM-LABEL: bb.0 (%ir-block.0):67# CHECK-R-ARM:         $sp = frame-setup STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r0, killed $r1, killed $r2, killed $r3, killed $r4, killed $r5, killed $r10, killed $r11, killed $r12, killed $lr68# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION def_cfa_offset 4069# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $lr, -470# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $ra_auth_code, -871# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $r11, -1272# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $r10, -1673# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $r5, -2074# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $r4, -2475# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $r3, -2876# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $r2, -3277# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $r1, -3678# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $r0, -4079# CHECK-R-ARM-NEXT:    $r11 = frame-setup ADDri killed $sp, 28, 14 /* CC::al */, $noreg, $noreg80# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION def_cfa $r11, 1281# CHECK-R-ARM-NEXT:    $r4 = frame-setup VMRS 14 /* CC::al */, $noreg, implicit $fpscr82# CHECK-R-ARM-NEXT:    $r5 = frame-setup VMRS_FPEXC 14 /* CC::al */, $noreg, implicit $fpscr83# CHECK-R-ARM-NEXT:    $sp = frame-setup STMDB_UPD $sp, 14 /* CC::al */, $noreg, $r4, $r584# CHECK-R-ARM-NEXT:    $sp = frame-setup VSTMDDB_UPD $sp, 14 /* CC::al */, $noreg, killed $d0, killed $d1, killed $d2, killed $d3, killed $d4, killed $d5, killed $d6, killed $d785# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $d7, -5686# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $d6, -6487# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $d5, -7288# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $d4, -8089# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $d3, -8890# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $d2, -9691# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $d1, -10492# CHECK-R-ARM-NEXT:    frame-setup CFI_INSTRUCTION offset $d0, -11293# CHECK-R-ARM-NEXT:    $sp = BFC killed $sp, 4294967288, 14 /* CC::al */, $noreg94# CHECK-R-ARM-NEXT:    BL @bar, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp95# CHECK-R-ARM-NEXT:    $sp = frame-destroy SUBri killed $r11, 100, 14 /* CC::al */, $noreg, $noreg96# CHECK-R-ARM-NEXT:    $sp = frame-destroy VLDMDIA_UPD $sp, 14 /* CC::al */, $noreg, def $d0, def $d1, def $d2, def $d3, def $d4, def $d5, def $d6, def $d797# CHECK-R-ARM-NEXT:    $sp = frame-destroy LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r4, def $r598# CHECK-R-ARM-NEXT:    frame-destroy VMSR $r4, 14 /* CC::al */, $noreg, implicit-def $fpscr99# CHECK-R-ARM-NEXT:    frame-destroy VMSR_FPEXC $r5, 14 /* CC::al */, $noreg, implicit-def $fpscr100 101# =============================================================================102# =========================== cortex-r thumb-mode =============================103# =============================================================================104# This IRQ will save 112 bytes:105#106# |-------+------+----------|107# | reg   | size | zone     |108# |-------+------+----------|109# | LR    |  4x1 | GPR      |110# | R12   |  4x1 |          |111# | R7-R0 |  4x8 |          |112# |-------+------+----------|113# | FPEXC |  4x1 | FPStatus |114# | FPSCR |  4x1 |          |115# |-------+------+----------|116# | D7-D0 |  8x8 | FPRegs   |117# |-------+------+----------|118# |       |  112 |          |119# |-------+------+----------|120#121# ================================= Prologue =================================122#123# Frame pointer (r7) will be store at $original_sp - 12, but we can't save the124# FP until after we save the GPR zone of registers. The GPR zone of registers125# moves the stack by 40 bytes. So $original_sp = $current_sp + 40. Thus,126# $current_sp + 40 - 12 = $current_sp + 28. Thus, we see the instruction:127#128# $r7 = t2ADDri $sp, 28129#130# We don't have dwarf information for the FPEXC and FPSCR registers, so there's131# no CFI_INSTRUCTION for those saves. So, we should see an 8 byte disparity in132# the register offsets. $r0 is -40, and $d7 is -56.133#134# (-32) - (-48) = 16.135# 16 = 8 (bytes from $d7) + 8 (bytes from FPSCR + FPEXC)136#137# There's an extra BFC to force the stack to be aligned. This is done in 3138# steps, because the value of $sp needs to be moved into a low register139# (r0-r7), and then operated on, and then moved back.140#141# $r4 = tMOVr $sp, 14142# $r4 = t2BFC $r4, 4294967288 /* ~0x7 */, 14143# $sp = tMOVr $r4, 14144#145# ================================= Epilogue =================================146#147# We use the frame pointer to restore the SP. Since $r7 is currently pointing148# to the previous $r7's stack position (aka base_of_stack - 12), and we149# allocated 112 bytes, $sp = $r7 - (112 - 12), or $sp = $r7 - 100, which is150# why we see this instruction:151#152# $r4 = t2SUBri $r7, 100153# $sp = tMOVr $r4154 155# CHECK-R-THUMB-LABEL: name: irq_fn156# CHECK-R-THUMB-LABEL: bb.0 (%ir-block.0):157# CHECK-R-THUMB:        $sp = frame-setup t2STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r0, killed $r1, killed $r2, killed $r3, killed $r4, killed $r5, killed $r6, killed $r7, killed $r12, killed $lr158# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION def_cfa_offset 40159# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $lr, -4160# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $ra_auth_code, -8161# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $r7, -12162# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $r6, -16163# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $r5, -20164# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $r4, -24165# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $r3, -28166# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $r2, -32167# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $r1, -36168# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $r0, -40169# CHECK-R-THUMB-NEXT:    $r7 = frame-setup t2ADDri killed $sp, 28, 14 /* CC::al */, $noreg, $noreg170# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION def_cfa $r7, 12171# CHECK-R-THUMB-NEXT:    $r4 = frame-setup VMRS 14 /* CC::al */, $noreg, implicit $fpscr172# CHECK-R-THUMB-NEXT:    $r5 = frame-setup VMRS_FPEXC 14 /* CC::al */, $noreg, implicit $fpscr173# CHECK-R-THUMB-NEXT:    $sp = frame-setup t2STMDB_UPD $sp, 14 /* CC::al */, $noreg, $r4, $r5174# CHECK-R-THUMB-NEXT:    $sp = frame-setup VSTMDDB_UPD $sp, 14 /* CC::al */, $noreg, killed $d0, killed $d1, killed $d2, killed $d3, killed $d4, killed $d5, killed $d6, killed $d7175# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d7, -56176# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d6, -64177# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d5, -72178# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d4, -80179# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d3, -88180# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d2, -96181# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d1, -104182# CHECK-R-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d0, -112183# CHECK-R-THUMB-NEXT:    $r4 = tMOVr killed $sp, 14 /* CC::al */, $noreg184# CHECK-R-THUMB-NEXT:    $r4 = t2BFC killed $r4, 4294967288, 14 /* CC::al */, $noreg185# CHECK-R-THUMB-NEXT:    $sp = tMOVr killed $r4, 14 /* CC::al */, $noreg186# CHECK-R-THUMB-NEXT:    BL @bar, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp187# CHECK-R-THUMB-NEXT:    $r4 = frame-destroy t2SUBri killed $r7, 100, 14 /* CC::al */, $noreg, $noreg188# CHECK-R-THUMB-NEXT:    $sp = frame-destroy tMOVr $r4, 14 /* CC::al */, $noreg189# CHECK-R-THUMB-NEXT:    $sp = frame-destroy VLDMDIA_UPD $sp, 14 /* CC::al */, $noreg, def $d0, def $d1, def $d2, def $d3, def $d4, def $d5, def $d6, def $d7190# CHECK-R-THUMB-NEXT:    $sp = frame-destroy t2LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r4, def $r5191# CHECK-R-THUMB-NEXT:    frame-destroy VMSR $r4, 14 /* CC::al */, $noreg, implicit-def $fpscr192# CHECK-R-THUMB-NEXT:    frame-destroy VMSR_FPEXC $r5, 14 /* CC::al */, $noreg, implicit-def $fpscr193# CHECK-R-THUMB-NEXT:    $sp = frame-destroy t2LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r0, def $r1, def $r2, def $r3, def $r4, def $r5, def $r6, def $r7, def $r12, def $lr194# CHECK-R-THUMB-NEXT:    SUBS_PC_LR 4, 14 /* CC::al */, $noreg195 196# =============================================================================197# ============================== cortex-m thumb ===============================198# =============================================================================199# This IRQ will save 88 bytes:200#201# |---------+------+----------|202# | reg     | size | zone     |203# |---------+------+----------|204# | LR      |  4x1 | GPR      |205# | R7-R6   |  4x2 |          |206# | R4      |  4x1 |          |207# |---------+------+----------|208# | FPSCR   |  4x1 | FPStatus |209# |---------+------+----------|210# | EMPTY   |  4x1 | Align    |211# |---------+------+----------|212# | D7-D0   |  8x8 | FPRegs   |213# |---------+------+----------|214# |         |   88 |          |215# |---------+------+----------|216 217# CHECK-M-THUMB-LABEL: name: irq_fn218# CHECK-M-THUMB-LABEL: bb.0 (%ir-block.0):219# CHECK-M-THUMB:         $sp = frame-setup t2STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r4, killed $r6, killed $r7, killed $lr220# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION def_cfa_offset 16221# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $lr, -4222# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $r7, -8223# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $r6, -12224# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $r4, -16225# CHECK-M-THUMB-NEXT:    $r7 = frame-setup t2ADDri killed $sp, 8, 14 /* CC::al */, $noreg, $noreg226# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION def_cfa $r7, 8227# CHECK-M-THUMB-NEXT:    $r4 = frame-setup VMRS 14 /* CC::al */, $noreg, implicit $fpscr228# CHECK-M-THUMB-NEXT:    $sp = frame-setup t2STMDB_UPD $sp, 14 /* CC::al */, $noreg, $r4229# CHECK-M-THUMB-NEXT:    $sp = frame-setup tSUBspi $sp, 1, 14 /* CC::al */, $noreg230# CHECK-M-THUMB-NEXT:    $sp = frame-setup VSTMDDB_UPD $sp, 14 /* CC::al */, $noreg, killed $d0, killed $d1, killed $d2, killed $d3, killed $d4, killed $d5, killed $d6, killed $d7231# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d7, -32232# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d6, -40233# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d5, -48234# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d4, -56235# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d3, -64236# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d2, -72237# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d1, -80238# CHECK-M-THUMB-NEXT:    frame-setup CFI_INSTRUCTION offset $d0, -88239# CHECK-M-THUMB-NEXT:    $r4 = tMOVr killed $sp, 14 /* CC::al */, $noreg240# CHECK-M-THUMB-NEXT:    $r4 = t2BFC killed $r4, 4294967288, 14 /* CC::al */, $noreg241# CHECK-M-THUMB-NEXT:    $sp = tMOVr killed $r4, 14 /* CC::al */, $noreg242# CHECK-M-THUMB-NEXT:    BL @bar, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp243# CHECK-M-THUMB-NEXT:    $r4 = frame-destroy t2SUBri killed $r7, 80, 14 /* CC::al */, $noreg, $noreg244# CHECK-M-THUMB-NEXT:    $sp = frame-destroy tMOVr $r4, 14 /* CC::al */, $noreg245# CHECK-M-THUMB-NEXT:    $sp = frame-destroy VLDMDIA_UPD $sp, 14 /* CC::al */, $noreg, def $d0, def $d1, def $d2, def $d3, def $d4, def $d5, def $d6, def $d7246# CHECK-M-THUMB-NEXT:    $sp = frame-destroy tADDspi $sp, 1, 14 /* CC::al */, $noreg247# CHECK-M-THUMB-NEXT:    $sp = frame-destroy t2LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r4248# CHECK-M-THUMB-NEXT:    frame-destroy VMSR $r4, 14 /* CC::al */, $noreg, implicit-def $fpscr249# CHECK-M-THUMB-NEXT:    $sp = frame-destroy t2LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r4, def $r6, def $r7, def $lr250# CHECK-M-THUMB-NEXT:    SUBS_PC_LR 4, 14 /* CC::al */, $noreg251 252--- |253  ; ModuleID = '/scratch/benson/tools2/llvm_cgt/llvm-project/llvm/test/CodeGen/ARM/fp-attr-fpscr.ll'254  source_filename = "/scratch/benson/tools2/llvm_cgt/llvm-project/llvm/test/CodeGen/ARM/fp-attr-fpscr.ll"255  target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"256 257  declare arm_aapcscc void @bar()258 259  ; Function Attrs: alignstack(8)260  define arm_aapcscc void @irq_fn() #1 {261    call arm_aapcscc void @bar()262    ret void263  }264 265  attributes #1 = { alignstack=8 "interrupt"="IRQ" "target-features"="+fpregs" "save-fp" }266 267...268---269name:            irq_fn270frameInfo:271  adjustsStack:    true272alignment:       16273body:             |274  bb.0 (%ir-block.0):275    ADJCALLSTACKDOWN 0, 0, 14 /* CC::al */, $noreg, implicit-def dead $sp, implicit $sp276    BL @bar, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp277    ADJCALLSTACKUP 0, -1, 14 /* CC::al */, $noreg, implicit-def dead $sp, implicit $sp278    SUBS_PC_LR 4, 14 /* CC::al */, $noreg279...280