1 @ RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o - \ 2 @ RUN: | llvm-readobj -s -sd -sr | FileCheck %s 3 4 @ Check the .vsave directive 5 6 @ The .vsave directive records the VFP registers which are pushed to the 7 @ stack. There are two different opcodes: 8 @ 9 @ 0xC800: pop d[(16+x+y):(16+x)] @ d[16+x+y]-d[16+x] must be consecutive 10 @ 0xC900: pop d[(x+y):x] @ d[x+y]-d[x] must be consecutive 11 12 13 .syntax unified 14 15 @------------------------------------------------------------------------------- 16 @ TEST1 17 @------------------------------------------------------------------------------- 18 .section .TEST1 19 .globl func1a 20 .align 2 21 .type func1a,%function 22 .fnstart 23 func1a: 24 .vsave {d0} 25 vpush {d0} 26 vpop {d0} 27 bx lr 28 .personality __gxx_personality_v0 29 .handlerdata 30 .fnend 31 32 .globl func1b 33 .align 2 34 .type func1b,%function 35 .fnstart 36 func1b: 37 .vsave {d0, d1, d2, d3} 38 vpush {d0, d1, d2, d3} 39 vpop {d0, d1, d2, d3} 40 bx lr 41 .personality __gxx_personality_v0 42 .handlerdata 43 .fnend 44 45 .globl func1c 46 .align 2 47 .type func1c,%function 48 .fnstart 49 func1c: 50 .vsave {d0, d1, d2, d3, d4, d5, d6, d7} 51 vpush {d0, d1, d2, d3, d4, d5, d6, d7} 52 vpop {d0, d1, d2, d3, d4, d5, d6, d7} 53 bx lr 54 .personality __gxx_personality_v0 55 .handlerdata 56 .fnend 57 58 .globl func1d 59 .align 2 60 .type func1d,%function 61 .fnstart 62 func1d: 63 .vsave {d2, d3, d4, d5, d6, d7} 64 vpush {d2, d3, d4, d5, d6, d7} 65 vpop {d2, d3, d4, d5, d6, d7} 66 bx lr 67 .personality __gxx_personality_v0 68 .handlerdata 69 .fnend 70 71 @ CHECK: Section { 72 @ CHECK: Name: .ARM.extab.TEST1 73 @ CHECK: SectionData ( 74 @ CHECK: 0000: 00000000 B000C900 00000000 B003C900 |................| 75 @ CHECK: 0010: 00000000 B007C900 00000000 B025C900 |.............%..| 76 @ CHECK: ) 77 @ CHECK: } 78 79 80 81 @------------------------------------------------------------------------------- 82 @ TEST2 83 @------------------------------------------------------------------------------- 84 .section .TEST2 85 .globl func2a 86 .align 2 87 .type func2a,%function 88 .fnstart 89 func2a: 90 .vsave {d16} 91 vpush {d16} 92 vpop {d16} 93 bx lr 94 .personality __gxx_personality_v0 95 .handlerdata 96 .fnend 97 98 .globl func2b 99 .align 2 100 .type func2b,%function 101 .fnstart 102 func2b: 103 .vsave {d16, d17, d18, d19} 104 vpush {d16, d17, d18, d19} 105 vpop {d16, d17, d18, d19} 106 bx lr 107 .personality __gxx_personality_v0 108 .handlerdata 109 .fnend 110 111 .globl func2c 112 .align 2 113 .type func2c,%function 114 .fnstart 115 func2c: 116 .vsave {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31} 117 vpush {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31} 118 vpop {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31} 119 bx lr 120 .personality __gxx_personality_v0 121 .handlerdata 122 .fnend 123 124 @ CHECK: Section { 125 @ CHECK: Name: .ARM.extab.TEST2 126 @ CHECK: SectionData ( 127 @ CHECK: 0000: 00000000 B000C800 00000000 B003C800 |................| 128 @ CHECK: 0010: 00000000 B00FC800 |........| 129 @ CHECK: ) 130 @ CHECK: } 131