/* * regchecker - watch out for registers that are not correctly saved/restored * Copyright (C) 2005 Tony Luck, Intel Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ .data .align 512 empty: .fill 512, 0 .text .align 16 .global regcheck# .proc regcheck# regcheck: alloc loc1 = ar.pfs, 3, 4, 0, 0 mov loc0 = b0 mov r8 = r0 // assume success # Save regs mov loc3 = in0;; st8.spill [loc3] = r0, 8;; st8.spill [loc3] = r1, 8;; st8.spill [loc3] = r2, 8;; st8.spill [loc3] = r3, 8;; st8.spill [loc3] = r4, 8;; st8.spill [loc3] = r5, 8;; st8.spill [loc3] = r6, 8;; st8.spill [loc3] = r7, 8;; st8.spill [loc3] = r8, 8;; st8.spill [loc3] = r9, 8;; st8.spill [loc3] = r10, 8;; st8.spill [loc3] = r11, 8;; st8.spill [loc3] = r12, 8;; st8.spill [loc3] = r13, 8;; st8.spill [loc3] = r14, 8;; st8.spill [loc3] = r15, 8;; st8.spill [loc3] = r16, 8;; st8.spill [loc3] = r17, 8;; st8.spill [loc3] = r18, 8;; st8.spill [loc3] = r19, 8;; st8.spill [loc3] = r20, 8;; st8.spill [loc3] = r21, 8;; st8.spill [loc3] = r22, 8;; st8.spill [loc3] = r23, 8;; st8.spill [loc3] = r24, 8;; st8.spill [loc3] = r25, 8;; st8.spill [loc3] = r26, 8;; st8.spill [loc3] = r27, 8;; st8.spill [loc3] = r28, 8;; st8.spill [loc3] = r29, 8;; st8.spill [loc3] = r30, 8;; st8.spill [loc3] = r31, 8;; mov loc2 = ar.unat st8 [loc3] = loc2, 8;; mov loc2 = 1 ;; loop: movl loc3 = empty + 8 mov ar.unat = loc2 ;; ld8.fill r1 = [loc3], 8;; ld8.fill r2 = [loc3], 8;; ld8.fill r3 = [loc3], 8;; ld8.fill r4 = [loc3], 8;; ld8.fill r5 = [loc3], 8;; ld8.fill r6 = [loc3], 8;; ld8.fill r7 = [loc3], 8;; ld8.fill r8 = [loc3], 8;; ld8.fill r9 = [loc3], 8;; ld8.fill r10 = [loc3], 8;; ld8.fill r11 = [loc3], 8;; ld8.fill r12 = [loc3], 8;; ld8.fill r13 = [loc3], 8;; ld8.fill r14 = [loc3], 8;; ld8.fill r15 = [loc3], 8;; ld8.fill r16 = [loc3], 8;; ld8.fill r17 = [loc3], 8;; ld8.fill r18 = [loc3], 8;; ld8.fill r19 = [loc3], 8;; ld8.fill r20 = [loc3], 8;; ld8.fill r21 = [loc3], 8;; ld8.fill r22 = [loc3], 8;; ld8.fill r23 = [loc3], 8;; ld8.fill r24 = [loc3], 8;; ld8.fill r25 = [loc3], 8;; ld8.fill r26 = [loc3], 8;; ld8.fill r27 = [loc3], 8;; ld8.fill r28 = [loc3], 8;; ld8.fill r29 = [loc3], 8;; ld8.fill r30 = [loc3], 8;; ld8.fill r31 = [loc3], 8;; # Check nats tnat.nz p1,p0 = r1 tnat.nz p2,p0 = r2 tnat.nz p3,p0 = r3 tnat.nz p4,p0 = r4 tnat.nz p5,p0 = r5 tnat.nz p6,p0 = r6 tnat.nz p7,p0 = r7 tnat.nz p8,p0 = r8 tnat.nz p9,p0 = r9 tnat.nz p10,p0 = r10 tnat.nz p11,p0 = r11 tnat.nz p12,p0 = r12 tnat.nz p13,p0 = r13 tnat.nz p14,p0 = r14 tnat.nz p15,p0 = r15 tnat.nz p16,p0 = r16 tnat.nz p17,p0 = r17 tnat.nz p18,p0 = r18 tnat.nz p19,p0 = r19 tnat.nz p20,p0 = r20 tnat.nz p21,p0 = r21 tnat.nz p22,p0 = r22 tnat.nz p23,p0 = r23 tnat.nz p24,p0 = r24 tnat.nz p25,p0 = r25 tnat.nz p26,p0 = r26 tnat.nz p27,p0 = r27 tnat.nz p28,p0 = r28 tnat.nz p29,p0 = r29 tnat.nz p30,p0 = r30 tnat.nz p31,p0 = r31 ;; mov r8 = pr mov r9 = ar.unat movl r2 = 0xfffffffe ;; and r9 = r9,r2 and r8 = r8,r2 ;; cmp.ne p1,p0 = r8, r9 cmp.eq.or p1,p0 = in1, r0 (p1) br err ;; # Rot loc2 shl loc2 = loc2,1 ;; extr.u r8=loc2,32,1 ;; dep loc2 = r8, loc2, 0, 1 # Decrement counter add in1 = -1, in1 ;; br loop err: st8 [in2] = r8,8;; st8 [in2] = r9;; # Restore regs mov loc3 = in0;; add loc3 = 8, loc3 ;; ld8 r1 = [loc3], 8;; ld8 r2 = [loc3], 8;; ld8 r3 = [loc3], 8;; ld8 r4 = [loc3], 8;; ld8 r5 = [loc3], 8;; ld8 r6 = [loc3], 8;; ld8 r7 = [loc3], 8;; ld8 r8 = [loc3], 8;; ld8 r9 = [loc3], 8;; ld8 r10 = [loc3], 8;; ld8 r11 = [loc3], 8;; ld8 r12 = [loc3], 8;; ld8 r13 = [loc3], 8;; ld8 r14 = [loc3], 8;; ld8 r15 = [loc3], 8;; ld8 r16 = [loc3], 8;; ld8 r17 = [loc3], 8;; ld8 r18 = [loc3], 8;; ld8 r19 = [loc3], 8;; ld8 r20 = [loc3], 8;; ld8 r21 = [loc3], 8;; ld8 r22 = [loc3], 8;; ld8 r23 = [loc3], 8;; ld8 r24 = [loc3], 8;; ld8 r25 = [loc3], 8;; ld8 r26 = [loc3], 8;; ld8 r27 = [loc3], 8;; ld8 r28 = [loc3], 8;; ld8 r29 = [loc3], 8;; ld8 r30 = [loc3], 8;; ld8 r31 = [loc3], 8;; mov ar.pfs = loc1 mov b0 = loc0 br.ret.sptk.many b0 ;;