2005-12-27 08:40:04 +03:00
|
|
|
// rb_ia64_flushrs and rb_ia64_bsp is written in IA64 assembly language
|
|
|
|
// because Intel Compiler for IA64 doesn't support inline assembly.
|
|
|
|
//
|
|
|
|
// This file is based on following C program compiled by gcc.
|
|
|
|
//
|
|
|
|
// void rb_ia64_flushrs(void) { __builtin_ia64_flushrs(); }
|
|
|
|
// void *rb_ia64_bsp(void) { return __builtin_ia64_bsp(); }
|
|
|
|
//
|
2007-07-15 05:18:55 +04:00
|
|
|
// Note that rb_ia64_flushrs and rb_ia64_bsp works in its own stack frame.
|
2007-07-15 05:20:19 +04:00
|
|
|
// It's because BSP is updated by br.call/brl.call (not alloc instruction).
|
2007-07-15 05:18:55 +04:00
|
|
|
// So rb_ia64_flushrs flushes stack frames including caller's one.
|
|
|
|
// rb_ia64_bsp returns the address next to caller's register stack frame.
|
2007-07-15 05:41:40 +04:00
|
|
|
//
|
|
|
|
// See also
|
|
|
|
// Intel Itanium Architecture Software Developer's Manual
|
|
|
|
// Volume 2: System Architecture.
|
2007-07-15 05:18:55 +04:00
|
|
|
//
|
2005-12-27 08:40:04 +03:00
|
|
|
.file "ia64.c"
|
|
|
|
.text
|
|
|
|
.align 16
|
|
|
|
.global rb_ia64_flushrs#
|
|
|
|
.proc rb_ia64_flushrs#
|
|
|
|
rb_ia64_flushrs:
|
|
|
|
.prologue
|
|
|
|
.body
|
|
|
|
flushrs
|
|
|
|
;;
|
|
|
|
nop.i 0
|
|
|
|
br.ret.sptk.many b0
|
|
|
|
.endp rb_ia64_flushrs#
|
|
|
|
.align 16
|
|
|
|
.global rb_ia64_bsp#
|
|
|
|
.proc rb_ia64_bsp#
|
|
|
|
rb_ia64_bsp:
|
|
|
|
.prologue
|
|
|
|
.body
|
|
|
|
nop.m 0
|
|
|
|
;;
|
|
|
|
mov r8 = ar.bsp
|
|
|
|
br.ret.sptk.many b0
|
|
|
|
.endp rb_ia64_bsp#
|
|
|
|
.ident "GCC: (GNU) 3.3.5 (Debian 1:3.3.5-13)"
|