diff options
Diffstat (limited to 'tools/regression/ia64/emulated/test.c')
-rw-r--r-- | tools/regression/ia64/emulated/test.c | 172 |
1 files changed, 0 insertions, 172 deletions
diff --git a/tools/regression/ia64/emulated/test.c b/tools/regression/ia64/emulated/test.c deleted file mode 100644 index 35d4b05..0000000 --- a/tools/regression/ia64/emulated/test.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2006 Marcel Moolenaar - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <sys/mman.h> -#include <stdio.h> -#include <string.h> - -/* Supported long branch types */ -#define Call 1 -#define Cond 2 - -/* Supported predicates */ -#define False 1 -#define True 2 - -/* Supported variations */ -#define Backward 1 -#define Forward 2 - -#if TYPE == 0 || PRED == 0 || VAR == 0 -#error Define TYPE, PRED and/or VAR -#endif - -union bundle { - unsigned char bytes[16]; - long double _align; -}; - -/* - * Machine code of a bundle containing a long branch. The predicate of the - * long branch is the result of the compare in the first slot. - * The assembly of the bundle is: - * { .mlx - * cmp.eq p0,p15= <PREDICATE>,r0 - * (p15) brl.few <TARGET> ;; - * } - * the predicate is written to bit 18:1 - * The branch target is written to bits 100:20, 48:39 and 123:1 - */ -unsigned char mc_brl_cond[16] = { - 0x05, 0x00, 0x00, 0x00, 0x0f, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, - 0x00, 0x00, 0x00, 0xc0 -}; - -/* - * Machine code of the epilogue of a typical function returning an integer. - * The assembly of the epilogue is: - * { .mib - * nop.m 0 - * addl r8 = <RETVAL>, r0 - * br.ret.sptk.few b0 ;; - * } - * The return value is written to bits 59:7, 73:9, 68:5, and 82:1. - */ -unsigned char mc_epilogue[16] = { - 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x48, 0x80, - 0x00, 0x00, 0x84, 0x00 -}; - -void -mc_patch(union bundle *b, unsigned long val, int start, int len) -{ - unsigned long mask; - int bit, byte, run; - - byte = start >> 3; - bit = start & 7; - while (len) { - run = ((len > (8 - bit)) ? (8 - bit) : len); - mask = (1UL << run) - 1UL; - b->bytes[byte] |= (val & mask) << bit; - val >>= run; - len -= run; - byte++; - bit = 0; - } -} - -void -assemble_brl_cond(union bundle *b, int pred, unsigned long tgt) -{ - unsigned long iprel; - - iprel = tgt - (unsigned long)b; - memcpy(b->bytes, mc_brl_cond, sizeof(mc_brl_cond)); - mc_patch(b, pred ? 1 : 0, 18, 1); - mc_patch(b, iprel >> 4, 100, 20); - mc_patch(b, iprel >> 24, 48, 39); - mc_patch(b, iprel >> 63, 123, 1); -} - -void -assemble_epilogue(union bundle *b, int retval) -{ - memcpy(b->bytes, mc_epilogue, sizeof(mc_epilogue)); - mc_patch(b, retval, 59, 7); - mc_patch(b, retval >> 7, 73, 9); - mc_patch(b, retval >> 16, 68, 5); - mc_patch(b, retval >> 21, 82, 1); -} - -int -doit(void *addr) -{ - asm("mov b6 = %0; br.sptk b6;;" :: "r"(addr)); - return 1; -} - -int -test_cond(int pred, union bundle *src, union bundle *dst) -{ - assemble_epilogue(dst, pred ? 0 : 2); - assemble_brl_cond(src, pred ? 1 : 0, (unsigned long)dst); - assemble_epilogue(src + 1, !pred ? 0 : 2); - return doit(src); -} - -int -main() -{ - static union bundle blob_low[2]; - union bundle *blob_high; - void *addr; - - addr = (void *)0x7FFFFFFF00000000L; - blob_high = mmap(addr, 32, PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_ANON, -1, 0L); - if (blob_high != addr) - printf("NOTICE: blob_high is at %p, not at %p\n", blob_high, - addr); - -#if TYPE == Call - return (test_call(blob_high, blob_low)); -#elif TYPE == Cond - #if VAR == Forward - return (test_cond(PRED - 1, blob_low, blob_high)); - #elif VAR == Backward - return (test_cond(PRED - 1, blob_high, blob_low)); - #else - return (1); - #endif -#else - return (1); -#endif -} |