Alien-LibJIT
view release on metacpan or search on metacpan
libjit/attic/jit-rules-alpha.c view on Meta::CPAN
/*
* jit-rules-alpha.c - Rules that define the characteristics of the alpha.
*
* Copyright (C) 2006 Southern Storm Software, Pty Ltd.
*
* This file is part of the libjit library.
*
* The libjit library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* The libjit library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with the libjit library. If not, see
* <http://www.gnu.org/licenses/>.
*/
#include "jit-internal.h"
#include "jit-rules.h"
#include "jit-apply-rules.h"
#if defined(JIT_BACKEND_ALPHA)
#include "jit-elf-defs.h"
#include "jit-gen-alpha.h"
#include "jit-reg-alloc.h"
#include "jit-setjmp.h"
#include <stdio.h>
/*
* _alpha_has_ieeefp()
*
* When the Alpha architecture's floating point unit was first designed,
* the designers traded performance for functionality. As a result, all
* Alpha systems below EV6 do not fully implement the IEEE floating
* point standard. For those earlier systems, there is no hardware
* support for denormalized numbers or exceptional IEEE values like not
* a number and positive/negative infinity. For systems without hardware
* support, the kernal can assist, but more you'll need to add
* instructions to trap into the kernel. Use this function to determine
* if hardware ieeefp is available.
*
* To get the kernel to assist when needed, use the following code:
*
* if (!_alpha_has_ieeefp())
* alpha_trapb(inst);
*
* RETURN VALUE:
* - TRUE if the CPU fully supports IEEE floating-point (i.e. >=ev6)
* - FALSE if the CPU needs kernel assistance
*/
int _alpha_has_ieeefp() {
unsigned long __implver;
/*
* __implver - major version number of the processor
*
* (__implver == 0) ev4 class processors
* (__implver == 1) ev5 class processors
* (__implver == 2) ev6 class processors
*/
__asm__ ("implver %0" : "=r"(__implver));
return (__implver >= 2);
}
/*
* Round a size up to a multiple of the stack word size.
*/
#define ROUND_STACK(size) \
(((size) + (sizeof(alpha_inst) - 1)) & ~(sizeof(alpha_inst) - 1))
/*
* Setup or teardown the alpha code output process.
*/
( run in 0.484 second using v1.01-cache-2.11-cpan-df04353d9ac )