1/* Copyright (c) 2002 Dave Brolley <brolley@redhat.com> */ 2#include <picolibc.h> 3 4# setjmp/longjmp for Frv. The jmpbuf looks like this: 5# 6# Register jmpbuf offset 7# R16-R31 0x0-0x03c 8# R48-R63 0x40-0x7c 9# FR16-FR31 0x80-0xbc 10# FR48-FR63 0xc0-0xfc 11# LR 0x100 12# SP 0x104 13# FP 0x108 14# 15# R8 contains the pointer to jmpbuf 16 17#include <frv-asm.h> 18 19 .text 20 .global EXT(setjmp) 21 .type EXT(setjmp),@function 22EXT(setjmp): 23 stdi gr16, @(gr8,0) 24 stdi gr18, @(gr8,8) 25 stdi gr20, @(gr8,16) 26 stdi gr22, @(gr8,24) 27 stdi gr24, @(gr8,32) 28 stdi gr26, @(gr8,40) 29 stdi gr28, @(gr8,48) 30 stdi gr30, @(gr8,56) 31#if __FRV_GPR__ != 32 32 stdi gr48, @(gr8,64) 33 stdi gr50, @(gr8,72) 34 stdi gr52, @(gr8,80) 35 stdi gr54, @(gr8,88) 36 stdi gr56, @(gr8,96) 37 stdi gr58, @(gr8,104) 38 stdi gr60, @(gr8,112) 39 stdi gr62, @(gr8,120) 40#endif 41 42#if __FRV_FPR__ != 0 43 stdfi fr16, @(gr8,128) 44 stdfi fr18, @(gr8,136) 45 stdfi fr20, @(gr8,144) 46 stdfi fr22, @(gr8,152) 47 stdfi fr24, @(gr8,160) 48 stdfi fr26, @(gr8,168) 49 stdfi fr28, @(gr8,176) 50 stdfi fr30, @(gr8,184) 51#if __FRV_FPR__ != 32 52 stdfi fr48, @(gr8,192) 53 stdfi fr50, @(gr8,200) 54 stdfi fr52, @(gr8,208) 55 stdfi fr54, @(gr8,216) 56 stdfi fr56, @(gr8,224) 57 stdfi fr58, @(gr8,232) 58 stdfi fr60, @(gr8,240) 59 stdfi fr62, @(gr8,248) 60#endif 61#endif 62 63 movsg lr, gr4 64 sti gr4, @(gr8,256) 65 sti sp, @(gr8,260) 66 sti fp, @(gr8,264) 67 68 mov gr0,gr8 69 ret 70.Lend1: 71 .size EXT(setjmp),.Lend1-EXT(setjmp) 72 73 .global EXT(longjmp) 74 .type EXT(longjmp),@function 75EXT(longjmp): 76 lddi @(gr8,0), gr16 77 lddi @(gr8,8), gr18 78 lddi @(gr8,16), gr20 79 lddi @(gr8,24), gr22 80 lddi @(gr8,32), gr24 81 lddi @(gr8,40), gr26 82 lddi @(gr8,48), gr28 83 lddi @(gr8,56), gr30 84#if __FRV_GPR__ != 32 85 lddi @(gr8,64), gr48 86 lddi @(gr8,72), gr50 87 lddi @(gr8,80), gr52 88 lddi @(gr8,88), gr54 89 lddi @(gr8,96), gr56 90 lddi @(gr8,104), gr58 91 lddi @(gr8,112), gr60 92 lddi @(gr8,120), gr62 93#endif 94 95#if __FRV_FPR__ != 0 96 lddfi @(gr8,128), fr16 97 lddfi @(gr8,136), fr18 98 lddfi @(gr8,144), fr20 99 lddfi @(gr8,152), fr22 100 lddfi @(gr8,160), fr24 101 lddfi @(gr8,168), fr26 102 lddfi @(gr8,176), fr28 103 lddfi @(gr8,184), fr30 104#if __FRV_FPR__ != 32 105 lddfi @(gr8,192), fr48 106 lddfi @(gr8,200), fr50 107 lddfi @(gr8,208), fr52 108 lddfi @(gr8,216), fr54 109 lddfi @(gr8,224), fr56 110 lddfi @(gr8,232), fr58 111 lddfi @(gr8,240), fr60 112 lddfi @(gr8,248), fr62 113#endif 114#endif 115 116 ldi @(gr8,256), gr4 117 movgs gr4,lr 118 119 ldi @(gr8,260), sp 120 ldi @(gr8,264), fp 121 122# Value to return is in r9. If zero, return 1 123 cmp gr9, gr0, icc0 124 setlos #1, gr8 125 ckne icc0, cc4 126 cmov gr9, gr8, cc4, 1 127 ret 128.Lend2: 129 .size EXT(longjmp),.Lend2-EXT(longjmp) 130