1570af302Sopenharmony_ci .global _longjmp 2570af302Sopenharmony_ci .global longjmp 3570af302Sopenharmony_ci .type _longjmp,@function 4570af302Sopenharmony_ci .type longjmp,@function 5570af302Sopenharmony_ci_longjmp: 6570af302Sopenharmony_cilongjmp: 7570af302Sopenharmony_ci # 0) move old return address into the link register 8570af302Sopenharmony_ci ld 0, 0*8(3) 9570af302Sopenharmony_ci mtlr 0 10570af302Sopenharmony_ci # 1) restore cr 11570af302Sopenharmony_ci ld 0, 1*8(3) 12570af302Sopenharmony_ci mtcr 0 13570af302Sopenharmony_ci # 2) restore SP 14570af302Sopenharmony_ci ld 1, 2*8(3) 15570af302Sopenharmony_ci # 3) restore TOC into both r2 and the caller's stack. 16570af302Sopenharmony_ci # Which location is required depends on whether setjmp was called 17570af302Sopenharmony_ci # locally or non-locally, but it's always safe to restore to both. 18570af302Sopenharmony_ci ld 2, 3*8(3) 19570af302Sopenharmony_ci std 2, 24(1) 20570af302Sopenharmony_ci # 4) restore r14-r31 21570af302Sopenharmony_ci ld 14, 4*8(3) 22570af302Sopenharmony_ci ld 15, 5*8(3) 23570af302Sopenharmony_ci ld 16, 6*8(3) 24570af302Sopenharmony_ci ld 17, 7*8(3) 25570af302Sopenharmony_ci ld 18, 8*8(3) 26570af302Sopenharmony_ci ld 19, 9*8(3) 27570af302Sopenharmony_ci ld 20, 10*8(3) 28570af302Sopenharmony_ci ld 21, 11*8(3) 29570af302Sopenharmony_ci ld 22, 12*8(3) 30570af302Sopenharmony_ci ld 23, 13*8(3) 31570af302Sopenharmony_ci ld 24, 14*8(3) 32570af302Sopenharmony_ci ld 25, 15*8(3) 33570af302Sopenharmony_ci ld 26, 16*8(3) 34570af302Sopenharmony_ci ld 27, 17*8(3) 35570af302Sopenharmony_ci ld 28, 18*8(3) 36570af302Sopenharmony_ci ld 29, 19*8(3) 37570af302Sopenharmony_ci ld 30, 20*8(3) 38570af302Sopenharmony_ci ld 31, 21*8(3) 39570af302Sopenharmony_ci # 5) restore floating point registers f14-f31 40570af302Sopenharmony_ci lfd 14, 22*8(3) 41570af302Sopenharmony_ci lfd 15, 23*8(3) 42570af302Sopenharmony_ci lfd 16, 24*8(3) 43570af302Sopenharmony_ci lfd 17, 25*8(3) 44570af302Sopenharmony_ci lfd 18, 26*8(3) 45570af302Sopenharmony_ci lfd 19, 27*8(3) 46570af302Sopenharmony_ci lfd 20, 28*8(3) 47570af302Sopenharmony_ci lfd 21, 29*8(3) 48570af302Sopenharmony_ci lfd 22, 30*8(3) 49570af302Sopenharmony_ci lfd 23, 31*8(3) 50570af302Sopenharmony_ci lfd 24, 32*8(3) 51570af302Sopenharmony_ci lfd 25, 33*8(3) 52570af302Sopenharmony_ci lfd 26, 34*8(3) 53570af302Sopenharmony_ci lfd 27, 35*8(3) 54570af302Sopenharmony_ci lfd 28, 36*8(3) 55570af302Sopenharmony_ci lfd 29, 37*8(3) 56570af302Sopenharmony_ci lfd 30, 38*8(3) 57570af302Sopenharmony_ci lfd 31, 39*8(3) 58570af302Sopenharmony_ci 59570af302Sopenharmony_ci # 6) restore vector registers v20-v31 60570af302Sopenharmony_ci addi 3, 3, 40*8 61570af302Sopenharmony_ci lvx 20, 0, 3 ; addi 3, 3, 16 62570af302Sopenharmony_ci lvx 21, 0, 3 ; addi 3, 3, 16 63570af302Sopenharmony_ci lvx 22, 0, 3 ; addi 3, 3, 16 64570af302Sopenharmony_ci lvx 23, 0, 3 ; addi 3, 3, 16 65570af302Sopenharmony_ci lvx 24, 0, 3 ; addi 3, 3, 16 66570af302Sopenharmony_ci lvx 25, 0, 3 ; addi 3, 3, 16 67570af302Sopenharmony_ci lvx 26, 0, 3 ; addi 3, 3, 16 68570af302Sopenharmony_ci lvx 27, 0, 3 ; addi 3, 3, 16 69570af302Sopenharmony_ci lvx 28, 0, 3 ; addi 3, 3, 16 70570af302Sopenharmony_ci lvx 29, 0, 3 ; addi 3, 3, 16 71570af302Sopenharmony_ci lvx 30, 0, 3 ; addi 3, 3, 16 72570af302Sopenharmony_ci lvx 31, 0, 3 73570af302Sopenharmony_ci 74570af302Sopenharmony_ci # 7) return r4 ? r4 : 1 75570af302Sopenharmony_ci mr 3, 4 76570af302Sopenharmony_ci cmpwi cr7, 4, 0 77570af302Sopenharmony_ci bne cr7, 1f 78570af302Sopenharmony_ci li 3, 1 79570af302Sopenharmony_ci1: 80570af302Sopenharmony_ci blr 81570af302Sopenharmony_ci 82