brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.1 KiB · 4d4b77b Raw
206 lines · plain
1// This test checks various cases around sharing opcodes between epilogue and prologue2 3// RUN: llvm-mc -triple thumbv7-pc-win32 -filetype=obj %s | llvm-readobj -u - | FileCheck %s4 5// CHECK:       RuntimeFunction {6// CHECK-NEXT:    Function: func17// CHECK-NEXT:    ExceptionRecord:8// CHECK-NEXT:    ExceptionData {9// CHECK-NEXT:      FunctionLength:10// CHECK-NEXT:      Version:11// CHECK-NEXT:      ExceptionData:12// CHECK-NEXT:      EpiloguePacked: Yes13// CHECK-NEXT:      Fragment: No14// CHECK-NEXT:      EpilogueOffset: 215// CHECK-NEXT:      ByteCodeLength:16// CHECK-NEXT:      Prologue [17// CHECK-NEXT:        0xf5 0x15           ; vpush {d1-d5}18// CHECK-NEXT:        0x05                ; sub sp, #(5 * 4)19// CHECK-NEXT:        0xa0 0xf0           ; push.w {r4-r7, lr}20// CHECK-NEXT:        0xfe                ; b.w <target>21// CHECK-NEXT:      ]22// CHECK-NEXT:      Epilogue [23// CHECK-NEXT:        0x05                ; add sp, #(5 * 4)24// CHECK-NEXT:        0xa0 0xf0           ; pop.w {r4-r7, pc}25// CHECK-NEXT:        0xfe                ; b.w <target>26// CHECK-NEXT:      ]27// CHECK-NEXT:    }28// CHECK-NEXT:  }29// CHECK-NEXT:  RuntimeFunction {30// CHECK-NEXT:    Function: func231// CHECK-NEXT:    ExceptionRecord:32// CHECK-NEXT:    ExceptionData {33// CHECK-NEXT:      FunctionLength:34// CHECK-NEXT:      Version:35// CHECK-NEXT:      ExceptionData:36// CHECK-NEXT:      EpiloguePacked: Yes37// CHECK-NEXT:      Fragment: No38// CHECK-NEXT:      EpilogueOffset: 039// CHECK-NEXT:      ByteCodeLength: 440// CHECK-NEXT:      Prologue [41// CHECK-NEXT:        0xd2                ; push {r4-r6}42// CHECK-NEXT:        0x04                ; sub sp, #(4 * 4)43// CHECK-NEXT:        0xfd                ; bx <reg>44// CHECK-NEXT:      ]45// CHECK-NEXT:    }46// CHECK-NEXT:  }47// CHECK-NEXT:  RuntimeFunction {48// CHECK-NEXT:    Function: func349// CHECK-NEXT:    ExceptionRecord:50// CHECK-NEXT:    ExceptionData {51// CHECK-NEXT:      FunctionLength:52// CHECK-NEXT:      Version:53// CHECK-NEXT:      ExceptionData:54// CHECK-NEXT:      EpiloguePacked: Yes55// CHECK-NEXT:      Fragment: No56// CHECK-NEXT:      EpilogueOffset: 057// CHECK-NEXT:      ByteCodeLength: 458// CHECK-NEXT:      Prologue [59// CHECK-NEXT:        0xe1                ; vpush {d8-d9}60// CHECK-NEXT:        0xdf                ; push.w {r4-r11, lr}61// CHECK-NEXT:      ]62// CHECK-NEXT:    }63// CHECK-NEXT:  }64// CHECK-NEXT:  RuntimeFunction {65// CHECK-NEXT:    Function: notshared166// CHECK-NEXT:    ExceptionRecord:67// CHECK-NEXT:    ExceptionData {68// CHECK-NEXT:      FunctionLength:69// CHECK-NEXT:      Version:70// CHECK-NEXT:      ExceptionData:71// CHECK-NEXT:      EpiloguePacked: Yes72// CHECK-NEXT:      Fragment:73// CHECK-NEXT:      EpilogueOffset: 274// CHECK-NEXT:      ByteCodeLength: 475// CHECK-NEXT:      Prologue [76// CHECK-NEXT:        0xdf                ; push.w {r4-r11, lr}77// CHECK-NEXT:      ]78// CHECK-NEXT:      Epilogue [79// CHECK-NEXT:        0xdb                ; pop.w {r4-r11}80// CHECK-NEXT:        0xfd                ; bx <reg>81// CHECK-NEXT:      ]82// CHECK:       RuntimeFunction {83// CHECK-NEXT:    Function: notpacked284// CHECK-NEXT:    ExceptionRecord:85// CHECK-NEXT:    ExceptionData {86// CHECK-NEXT:      FunctionLength:87// CHECK-NEXT:      Version:88// CHECK-NEXT:      ExceptionData:89// CHECK-NEXT:      EpiloguePacked: No90// CHECK:       RuntimeFunction {91// CHECK-NEXT:    Function: notpacked392// CHECK-NEXT:    ExceptionRecord:93// CHECK-NEXT:    ExceptionData {94// CHECK-NEXT:      FunctionLength:95// CHECK-NEXT:      Version:96// CHECK-NEXT:      ExceptionData:97// CHECK-NEXT:      EpiloguePacked: No98 99        .text100        .syntax unified101        .seh_proc func1102func1:103        push.w {r4-r7,lr}104        .seh_save_regs_w {r4-r7,lr}105        sub sp, sp, #20106        .seh_stackalloc 20107        vpush {d1-d5}108        .seh_save_fregs {d1-d5}109        .seh_endprologue110        nop111        .seh_startepilogue112        add sp, sp, #20113        .seh_stackalloc 20114        // As we're popping into lr instead of directly into pc, this pop115        // becomes a wide instruction. To match prologue vs epilogue, the116        // push in the prologue has been made wide too.117        pop.w {r4-r7,lr}118        .seh_save_regs_w {r4-r7,lr}119        b.w tailcall120        .seh_nop_w121        .seh_endepilogue122        .seh_endproc123 124        .seh_proc func2125func2:126        sub sp, sp, #16127        .seh_stackalloc 16128        push {r4-r6}129        .seh_save_regs {r4-r6}130        .seh_endprologue131        nop132        .seh_startepilogue133        pop {r4-r6}134        .seh_save_regs {r4-r6}135        add sp, sp, #16136        .seh_stackalloc 16137        bx lr138        .seh_nop139        .seh_endepilogue140        .seh_endproc141 142        .seh_proc func3143func3:144        push {r4-r11,lr}145        .seh_save_regs_w {r4-r11,lr}146        vpush {d8-d9}147        .seh_save_fregs {d8-d9}148        .seh_endprologue149        nop150        .seh_startepilogue151        vpop {d8-d9}152        .seh_save_fregs {d8-d9}153        pop {r4-r11,pc}154        .seh_save_regs_w {r4-r11,pc}155        .seh_endepilogue156        .seh_endproc157 158        .seh_proc notshared1159notshared1:160        push {r4-r11,lr}161        .seh_save_regs_w {r4-r11,lr}162        .seh_endprologue163        nop164        .seh_startepilogue165        // Packed, but not shared as this opcode doesn't match the prolog166        pop {r4-r11}167        .seh_save_regs_w {r4-r11}168        bx lr169        .seh_nop170        .seh_endepilogue171        .seh_endproc172 173        .seh_proc notpacked2174notpacked2:175        push {r4-r11}176        .seh_save_regs_w {r4-r11}177        vpush {d8-d9}178        .seh_save_fregs {d8-d9}179        .seh_endprologue180        nop181        .seh_startepilogue182        vpop {d8-d9}183        .seh_save_fregs {d8-d9}184        pop {r4-r11}185        .seh_save_regs_w {r4-r11}186        bx lr187        .seh_nop188        .seh_endepilogue189        // Not packed, as the epilog isn't at the end of the function190        nop191        .seh_endproc192 193        .seh_proc notpacked3194notpacked3:195        push {r4-r11,lr}196        .seh_save_regs_w {r4-r11,lr}197        .seh_endprologue198        nop199        it ge200        // Not packed, as the epilog is conditional201        .seh_startepilogue_cond ge202        popge {r4-r11,pc}203        .seh_save_regs_w {r4-r11,pc}204        .seh_endepilogue205        .seh_endproc206