URL
https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk
Subversion Repositories openrisc_me
[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [config/] [m32c/] [m32c-lib1.S] - Rev 282
Compare with Previous | Blame | View Log
/* libgcc routines for R8C/M16C/M32CCopyright (C) 2005, 2009Free Software Foundation, Inc.Contributed by Red Hat.This file is part of GCC.GCC is free software; you can redistribute it and/or modify itunder the terms of the GNU General Public License as publishedby the Free Software Foundation; either version 3, or (at youroption) any later version.GCC is distributed in the hope that it will be useful, but WITHOUTANY WARRANTY; without even the implied warranty of MERCHANTABILITYor FITNESS FOR A PARTICULAR PURPOSE. See the GNU General PublicLicense for more details.Under Section 7 of GPL version 3, you are granted additionalpermissions described in the GCC Runtime Library Exception, version3.1, as published by the Free Software Foundation.You should have received a copy of the GNU General Public License anda copy of the GCC Runtime Library Exception along with this program;see the files COPYING3 and COPYING.RUNTIME respectively. If not, see<http://www.gnu.org/licenses/>. */#if defined(__r8c_cpu__) || defined(__m16c_cpu__)#define A16#define A(n,w) n#define W w#else#define A24#define A(n,w) w#define W l#endif#ifdef L__m32c_memregs/* Warning: these memory locations are used as a register bank. They*must* end up consecutive in any final executable, so you may *not*use the otherwise obvious ".comm" directive to allocate space forthem. */.bss.global mem0mem0: .space 1.global mem1mem1: .space 1.global mem2mem2: .space 1.global mem3mem3: .space 1.global mem4mem4: .space 1.global mem5mem5: .space 1.global mem6mem6: .space 1.global mem7mem7: .space 1.global mem8mem8: .space 1.global mem9mem9: .space 1.global mem10mem10: .space 1.global mem11mem11: .space 1.global mem12mem12: .space 1.global mem13mem13: .space 1.global mem14mem14: .space 1.global mem15mem15: .space 1#endif#ifdef L__m32c_eh_return.text.global __m32c_eh_return__m32c_eh_return:/* At this point, r0 has the stack adjustment, r1r3 has theaddress to return to. The stack looks like this:old_raold_fp<- unwound sp...fbthroughr0<- spWhat we need to do is restore all the registers, update thestack, and return to the right place.*/stc sp,a0add.W A(#16,#24),a0/* a0 points to the current stack, just above the registersave areas */mov.w a0,a1exts.w r0sub.W A(r0,r2r0),a1sub.W A(#3,#4),a1/* a1 points to the new stack. *//* This is for the "rts" below. */mov.w r1,[a1]#ifdef A16mov.w r2,r1mov.b r1l,2[a1]#elsemov.w r2,2[a1]#endif/* This is for the "popc sp" below. */mov.W a1,[a0]popm r0,r1,r2,r3,a0,a1,sb,fbpopc sprts#endif/* SImode arguments for SI foo(SI,SI) functions. */#ifdef A16#define SAL 5[fb]#define SAH 7[fb]#define SBL 9[fb]#define SBH 11[fb]#else#define SAL 8[fb]#define SAH 10[fb]#define SBL 12[fb]#define SBH 14[fb]#endif#ifdef L__m32c_mulsi3.text.global ___mulsi3___mulsi3:enter #0push.w r2mov.w SAL,r0mulu.w SBL,r0 /* writes to r2r0 */mov.w r0,mem0mov.w r2,mem2mov.w SAL,r0mulu.w SBH,r0 /* writes to r2r0 */add.w r0,mem2mov.w SAH,r0mulu.w SBL,r0 /* writes to r2r0 */add.w r0,mem2pop.w r2exitd#endif#ifdef L__m32c_cmpsi2.text.global ___cmpsi2___cmpsi2:enter #0cmp.w SBH,SAHjgt cmpsi_gtjlt cmpsi_ltcmp.w SBL,SALjgt cmpsi_gtjlt cmpsi_ltmov.w #1,r0exitdcmpsi_gt:mov.w #2,r0exitdcmpsi_lt:mov.w #0,r0exitd#endif#ifdef L__m32c_ucmpsi2.text.global ___ucmpsi2___ucmpsi2:enter #0cmp.w SBH,SAHjgtu cmpsi_gtjltu cmpsi_ltcmp.w SBL,SALjgtu cmpsi_gtjltu cmpsi_ltmov.w #1,r0exitdcmpsi_gt:mov.w #2,r0exitdcmpsi_lt:mov.w #0,r0exitd#endif#ifdef L__m32c_jsri16.datam32c_jsri_addr:.byte 0, 0, 0m32c_jsri_ret:.byte 0, 0, 0.text.global m32c_jsri16m32c_jsri16:pop.w m32c_jsri_retpop.b m32c_jsri_ret+2pop.w m32c_jsri_addrpush.b m32c_jsri_ret+2push.w m32c_jsri_retjmpi.a m32c_jsri_addr#endif
