1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2005 Brian Paul All Rights Reserved. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_config.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_cpu_detect.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(PIPE_ARCH_X86) || (defined(PIPE_ARCH_X86_64) && !defined(__MINGW32__)) 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_compiler.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pointer.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "rtasm_execmem.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "rtasm_x86sse.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DISASSEM 0 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define X86_TWOB 0x0f 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_SSE 0 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_print_reg( struct x86_reg reg ) 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.mod != mod_REG) 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( "[" ); 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch( reg.file ) { 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case file_REG32: 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch( reg.idx ) { 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case reg_AX: debug_printf( "EAX" ); break; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case reg_CX: debug_printf( "ECX" ); break; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case reg_DX: debug_printf( "EDX" ); break; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case reg_BX: debug_printf( "EBX" ); break; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case reg_SP: debug_printf( "ESP" ); break; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case reg_BP: debug_printf( "EBP" ); break; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case reg_SI: debug_printf( "ESI" ); break; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case reg_DI: debug_printf( "EDI" ); break; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case file_MMX: 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( "MMX%u", reg.idx ); 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case file_XMM: 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( "XMM%u", reg.idx ); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case file_x87: 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( "fp%u", reg.idx ); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.mod == mod_DISP8 || 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.mod == mod_DISP32) 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("+%d", reg.disp); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.mod != mod_REG) 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( "]" ); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DUMP_SSE 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_START() debug_printf( "\n" ) 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_END() debug_printf( "\n" ) 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP() do { \ 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *foo = __FUNCTION__; \ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (*foo && *foo != '_') \ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org foo++; \ 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*foo) \ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org foo++; \ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( "\n%4x %14s ", p->csr - p->store, foo ); \ 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_I( I ) do { \ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); \ 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( "%u", I ); \ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while( 0 ) 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_R( R0 ) do { \ 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); \ 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_print_reg( R0 ); \ 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while( 0 ) 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RR( R0, R1 ) do { \ 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); \ 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_print_reg( R0 ); \ 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( ", " ); \ 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_print_reg( R1 ); \ 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while( 0 ) 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RI( R0, I ) do { \ 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); \ 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_print_reg( R0 ); \ 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( ", %u", I ); \ 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while( 0 ) 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RRI( R0, R1, I ) do { \ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); \ 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_print_reg( R0 ); \ 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( ", " ); \ 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_print_reg( R1 ); \ 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf( ", %u", I ); \ 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while( 0 ) 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_START() 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_END() 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP( ) 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_I( I ) 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_R( R0 ) 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RR( R0, R1 ) 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RI( R0, I ) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DUMP_RRI( R0, R1, I ) 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void do_realloc( struct x86_function *p ) 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->store == p->error_overflow) { 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->csr = p->store; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (p->size == 0) { 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->size = 1024; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->store = rtasm_exec_malloc(p->size); 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->csr = p->store; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uintptr_t used = pointer_to_uintptr( p->csr ) - pointer_to_uintptr( p->store ); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *tmp = p->store; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->size *= 2; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->store = rtasm_exec_malloc(p->size); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->store) { 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(p->store, tmp, used); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->csr = p->store + used; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->csr = p->store; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rtasm_exec_free(tmp); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->store == NULL) { 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->store = p->csr = p->error_overflow; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->size = sizeof(p->error_overflow); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Emit bytes to the instruction stream: 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned char *reserve( struct x86_function *p, int bytes ) 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->csr + bytes - p->store > (int) p->size) 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do_realloc(p); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *csr = p->csr; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->csr += bytes; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return csr; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_1b( struct x86_function *p, char b0 ) 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *csr = (char *)reserve(p, 1); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *csr = b0; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_1i( struct x86_function *p, int i0 ) 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *icsr = (int *)reserve(p, sizeof(i0)); 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *icsr = i0; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_1ub( struct x86_function *p, unsigned char b0 ) 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *csr = reserve(p, 1); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *csr++ = b0; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_2ub( struct x86_function *p, unsigned char b0, unsigned char b1 ) 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *csr = reserve(p, 2); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *csr++ = b0; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *csr++ = b1; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_3ub( struct x86_function *p, unsigned char b0, unsigned char b1, unsigned char b2 ) 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *csr = reserve(p, 3); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *csr++ = b0; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *csr++ = b1; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *csr++ = b2; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Build a modRM byte + possible displacement. No treatment of SIB 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * indexing. BZZT - no way to encode an absolute address. 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the "/r" field in the x86 manuals... 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_modrm( struct x86_function *p, 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg reg, 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg regmem ) 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char val = 0; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.mod == mod_REG); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: support extended x86-64 registers */ 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.idx < 8); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(regmem.idx < 8); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val |= regmem.mod << 6; /* mod field */ 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val |= reg.idx << 3; /* reg field */ 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val |= regmem.idx; /* r/m field */ 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, val); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Oh-oh we've stumbled into the SIB thing. 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (regmem.file == file_REG32 && 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org regmem.idx == reg_SP && 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org regmem.mod != mod_REG) { 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x24); /* simplistic! */ 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (regmem.mod) { 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_REG: 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_INDIRECT: 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_DISP8: 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1b(p, (char) regmem.disp); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_DISP32: 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1i(p, regmem.disp); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Emits the "/0".."/7" specialized versions of the modrm ("/r") bytes. 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_modrm_noreg( struct x86_function *p, 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned op, 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg regmem ) 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dummy = x86_make_reg(file_REG32, op); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dummy, regmem); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Many x86 instructions have two opcodes to cope with the situations 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * where the destination is a register or memory reference 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * respectively. This function selects the correct opcode based on 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the arguments presented. 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_op_modrm( struct x86_function *p, 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char op_dst_is_reg, 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char op_dst_is_mem, 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dst.mod) { 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_REG: 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, op_dst_is_reg); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_INDIRECT: 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_DISP32: 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_DISP8: 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.mod == mod_REG); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, op_dst_is_mem); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, src, dst); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Create and manipulate registers and regmem values: 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x86_reg x86_make_reg( enum x86_reg_file file, 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum x86_reg_name idx ) 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg reg; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.file = file; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.idx = idx; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.mod = mod_REG; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.disp = 0; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reg; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x86_reg x86_make_disp( struct x86_reg reg, 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int disp ) 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.file == file_REG32); 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.mod == mod_REG) 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.disp = disp; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.disp += disp; 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.disp == 0 && reg.idx != reg_BP) 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.mod = mod_INDIRECT; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (reg.disp <= 127 && reg.disp >= -128) 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.mod = mod_DISP8; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.mod = mod_DISP32; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reg; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x86_reg x86_deref( struct x86_reg reg ) 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_disp(reg, 0); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x86_reg x86_get_base_reg( struct x86_reg reg ) 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg( reg.file, reg.idx ); 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint x86_get_label( struct x86_function *p ) 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return p->csr - p->store; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * x86 instructions 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x64_rexw(struct x86_function *p) 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(x86_target(p) != X86_32) 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x48); 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_jcc( struct x86_function *p, 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum x86_cc cc, 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int label ) 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int offset = label - (x86_get_label(p) + 2); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_I(cc); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (offset < 0) { 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*assert(p->csr - p->store > -offset);*/ 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->csr - p->store <= -offset) { 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* probably out of memory (using the error_overflow buffer) */ 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (offset <= 127 && offset >= -128) { 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x70 + cc); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1b(p, (char) offset); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset = label - (x86_get_label(p) + 6); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x0f, 0x80 + cc); 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1i(p, offset); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Always use a 32bit offset for forward jumps: 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint x86_jcc_forward( struct x86_function *p, 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum x86_cc cc ) 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_I(cc); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x0f, 0x80 + cc); 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1i(p, 0); 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_get_label(p); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint x86_jmp_forward( struct x86_function *p) 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xe9); 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1i(p, 0); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_get_label(p); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint x86_call_forward( struct x86_function *p) 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xe8); 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1i(p, 0); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_get_label(p); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Fixup offset from forward jump: 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_fixup_fwd_jump( struct x86_function *p, 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int fixup ) 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *(int *)(p->store + fixup - 4) = x86_get_label(p) - fixup; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_jmp( struct x86_function *p, int label) 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_I( label ); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xe9); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1i(p, label - x86_get_label(p) - 4); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_call( struct x86_function *p, struct x86_reg reg) 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( reg ); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xff); 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 2, reg); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, int imm ) 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI( dst, imm ); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_REG32); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.mod == mod_REG); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xb8 + dst.idx); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1i(p, imm); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov_imm( struct x86_function *p, struct x86_reg dst, int imm ) 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI( dst, imm ); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(dst.mod == mod_REG) 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_mov_reg_imm(p, dst, imm); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xc7); 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 0, dst); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1i(p, imm); 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov16_imm( struct x86_function *p, struct x86_reg dst, uint16_t imm ) 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI( dst, imm ); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x66); 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(dst.mod == mod_REG) 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xb8 + dst.idx); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, imm & 0xff, imm >> 8); 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xc7); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 0, dst); 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, imm & 0xff, imm >> 8); 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov8_imm( struct x86_function *p, struct x86_reg dst, uint8_t imm ) 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI( dst, imm ); 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(dst.mod == mod_REG) 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xb0 + dst.idx); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xc6); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 0, dst); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Immediate group 1 instructions. 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx86_group1_imm( struct x86_function *p, 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned op, struct x86_reg dst, int imm ) 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_REG32); 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.mod == mod_REG); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(-0x80 <= imm && imm < 0x80) { 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x83); 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, op, dst); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1b(p, (char)imm); 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x81); 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, op, dst); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1i(p, imm); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_add_imm( struct x86_function *p, struct x86_reg dst, int imm ) 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI( dst, imm ); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_group1_imm(p, 0, dst, imm); 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_or_imm( struct x86_function *p, struct x86_reg dst, int imm ) 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI( dst, imm ); 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_group1_imm(p, 1, dst, imm); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_and_imm( struct x86_function *p, struct x86_reg dst, int imm ) 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI( dst, imm ); 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_group1_imm(p, 4, dst, imm); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_sub_imm( struct x86_function *p, struct x86_reg dst, int imm ) 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI( dst, imm ); 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_group1_imm(p, 5, dst, imm); 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_xor_imm( struct x86_function *p, struct x86_reg dst, int imm ) 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI( dst, imm ); 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_group1_imm(p, 6, dst, imm); 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_cmp_imm( struct x86_function *p, struct x86_reg dst, int imm ) 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI( dst, imm ); 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_group1_imm(p, 7, dst, imm); 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_push( struct x86_function *p, 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg reg ) 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( reg ); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.mod == mod_REG) 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x50 + reg.idx); 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xff); 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 6, reg); 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->stack_offset += sizeof(void*); 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_push_imm32( struct x86_function *p, 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int imm32 ) 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_I( imm32 ); 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x68); 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1i(p, imm32); 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->stack_offset += sizeof(void*); 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_pop( struct x86_function *p, 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg reg ) 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( reg ); 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.mod == mod_REG); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x58 + reg.idx); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->stack_offset -= sizeof(void*); 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_inc( struct x86_function *p, 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg reg ) 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( reg ); 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(x86_target(p) == X86_32 && reg.mod == mod_REG) 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x40 + reg.idx); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xff); 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 0, reg); 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_dec( struct x86_function *p, 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg reg ) 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( reg ); 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(x86_target(p) == X86_32 && reg.mod == mod_REG) 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x48 + reg.idx); 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xff); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 1, reg); 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_ret( struct x86_function *p ) 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(p->stack_offset == 0); 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xc3); 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_retw( struct x86_function *p, unsigned short imm ) 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0xc2, imm & 0xff, (imm >> 8) & 0xff); 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_sahf( struct x86_function *p ) 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x9e); 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov( struct x86_function *p, 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* special hack for reading arguments until we support x86-64 registers everywhere */ 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(src.mod == mod_REG && dst.mod == mod_REG && (src.idx >= 8 || dst.idx >= 8)) 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t rex = 0x40; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(dst.idx >= 8) 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rex |= 4; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst.idx -= 8; 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(src.idx >= 8) 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rex |= 1; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.idx -= 8; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, rex); 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x8b, 0x89, dst, src ); 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov16( struct x86_function *p, 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x66); 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x8b, 0x89, dst, src ); 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mov8( struct x86_function *p, 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x8a, 0x88, dst, src ); 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x64_mov64( struct x86_function *p, 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t rex = 0x48; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(x86_target(p) != X86_32); 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* special hack for reading arguments until we support x86-64 registers everywhere */ 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(src.mod == mod_REG && dst.mod == mod_REG && (src.idx >= 8 || dst.idx >= 8)) 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(dst.idx >= 8) 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rex |= 4; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst.idx -= 8; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(src.idx >= 8) 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rex |= 1; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.idx -= 8; 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, rex); 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x8b, 0x89, dst, src ); 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_movzx8(struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x0f, 0xb6); 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_movzx16(struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x0f, 0xb7); 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_cmovcc( struct x86_function *p, 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src, 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum x86_cc cc) 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RRI( dst, src, cc ); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub( p, 0x0f, 0x40 + cc ); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_xor( struct x86_function *p, 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x33, 0x31, dst, src ); 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_cmp( struct x86_function *p, 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x3b, 0x39, dst, src ); 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_lea( struct x86_function *p, 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x8d); 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_test( struct x86_function *p, 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x85); 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_add( struct x86_function *p, 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm(p, 0x03, 0x01, dst, src ); 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Calculate EAX * src, results in EDX:EAX. 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_mul( struct x86_function *p, 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( src ); 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xf7); 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 4, src ); 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_imul( struct x86_function *p, 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0xAF); 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_sub( struct x86_function *p, 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm(p, 0x2b, 0x29, dst, src ); 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_or( struct x86_function *p, 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x0b, 0x09, dst, src ); 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_and( struct x86_function *p, 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x23, 0x21, dst, src ); 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_div( struct x86_function *p, 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.file == file_REG32 && src.mod == mod_REG); 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm(p, 0xf7, 0, x86_make_reg(file_REG32, 6), src); 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_bswap( struct x86_function *p, struct x86_reg reg ) 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R(reg); 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.file == file_REG32); 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.mod == mod_REG); 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x0f, 0xc8 + reg.idx); 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_shr_imm( struct x86_function *p, struct x86_reg reg, unsigned imm ) 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI(reg, imm); 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(imm == 1) 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xd1); 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 5, reg); 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xc1); 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 5, reg); 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_sar_imm( struct x86_function *p, struct x86_reg reg, unsigned imm ) 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI(reg, imm); 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(imm == 1) 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xd1); 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 7, reg); 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xc1); 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 7, reg); 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_shl_imm( struct x86_function *p, struct x86_reg reg, unsigned imm ) 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI(reg, imm); 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(imm == 1) 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xd1); 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 4, reg); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xc1); 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 4, reg); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SSE instructions 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_prefetchnta( struct x86_function *p, struct x86_reg ptr) 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( ptr ); 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ptr.mod != mod_REG); 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x0f, 0x18); 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 0, ptr); 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_prefetch0( struct x86_function *p, struct x86_reg ptr) 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( ptr ); 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ptr.mod != mod_REG); 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x0f, 0x18); 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 1, ptr); 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_prefetch1( struct x86_function *p, struct x86_reg ptr) 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( ptr ); 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ptr.mod != mod_REG); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x0f, 0x18); 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 2, ptr); 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movntps( struct x86_function *p, 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src) 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.mod != mod_REG); 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.mod == mod_REG); 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x0f, 0x2b); 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, src, dst); 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movss( struct x86_function *p, 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xF3, X86_TWOB); 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x10, 0x11, dst, src ); 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movaps( struct x86_function *p, 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, X86_TWOB); 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x28, 0x29, dst, src ); 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movups( struct x86_function *p, 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, X86_TWOB); 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x10, 0x11, dst, src ); 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movhps( struct x86_function *p, 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.mod != mod_REG || src.mod != mod_REG); 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, X86_TWOB); 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x16, 0x17, dst, src ); /* cf movlhps */ 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movlps( struct x86_function *p, 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.mod != mod_REG || src.mod != mod_REG); 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, X86_TWOB); 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x12, 0x13, dst, src ); /* cf movhlps */ 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_maxps( struct x86_function *p, 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x5F); 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_maxss( struct x86_function *p, 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x5F); 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_divss( struct x86_function *p, 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x5E); 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_minps( struct x86_function *p, 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x5D); 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_subps( struct x86_function *p, 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x5C); 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_mulps( struct x86_function *p, 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x59); 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_mulss( struct x86_function *p, 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x59); 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_addps( struct x86_function *p, 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x58); 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_addss( struct x86_function *p, 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x58); 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_andnps( struct x86_function *p, 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x55); 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_andps( struct x86_function *p, 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x54); 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_rsqrtps( struct x86_function *p, 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x52); 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_rsqrtss( struct x86_function *p, 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x52); 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movhlps( struct x86_function *p, 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.mod == mod_REG && src.mod == mod_REG); 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x12); 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movlhps( struct x86_function *p, 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.mod == mod_REG && src.mod == mod_REG); 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x16); 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_orps( struct x86_function *p, 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x56); 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_xorps( struct x86_function *p, 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x57); 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_cvtps2pi( struct x86_function *p, 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_MMX && 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (src.file == file_XMM || src.mod != mod_REG)); 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->need_emms = 1; 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x2d); 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_cvtdq2ps( struct x86_function *p, 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x5b); 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Shufps can also be used to implement a reduced swizzle when dest == 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * arg0. 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_shufps( struct x86_function *p, 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src, 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char shuf) 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RRI( dst, src, shuf ); 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0xC6); 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, shuf); 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_unpckhps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub( p, X86_TWOB, 0x15 ); 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_unpcklps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub( p, X86_TWOB, 0x14 ); 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_cmpps( struct x86_function *p, 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src, 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum sse_cc cc) 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RRI( dst, src, cc ); 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0xC2); 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, cc); 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_pmovmskb( struct x86_function *p, 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src) 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0xD7); 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse_movmskps( struct x86_function *p, 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src) 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x50); 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SSE2 instructions 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR(dst, src); 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x66, 0x0f); 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(dst.mod == mod_REG && dst.file == file_REG32) 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x7e); 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, src, dst); 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm(p, 0x6e, 0x7e, dst, src); 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR(dst, src); 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dst.mod) { 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_REG: 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0xf3, 0x0f, 0x7e); 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_INDIRECT: 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_DISP32: 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case mod_DISP8: 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.mod == mod_REG); 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0xd6); 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, src, dst); 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movdqu( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR(dst, src); 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xf3, 0x0f); 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm(p, 0x6f, 0x7f, dst, src); 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movdqa( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR(dst, src); 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x66, 0x0f); 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm(p, 0x6f, 0x7f, dst, src); 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movsd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR(dst, src); 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xf2, 0x0f); 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm(p, 0x10, 0x11, dst, src); 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movupd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR(dst, src); 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x66, 0x0f); 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm(p, 0x10, 0x11, dst, src); 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_movapd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR(dst, src); 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x66, 0x0f); 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm(p, 0x28, 0x29, dst, src); 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Perform a reduced swizzle: 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_pshufd( struct x86_function *p, 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src, 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char shuf) 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RRI( dst, src, shuf ); 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0x70); 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, shuf); 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_pshuflw( struct x86_function *p, 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src, 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char shuf) 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RRI( dst, src, shuf ); 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0xf2, X86_TWOB, 0x70); 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, shuf); 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_pshufhw( struct x86_function *p, 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src, 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char shuf) 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RRI( dst, src, shuf ); 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0xf3, X86_TWOB, 0x70); 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, shuf); 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_cvttps2dq( struct x86_function *p, 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub( p, 0xF3, X86_TWOB, 0x5B ); 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_cvtps2dq( struct x86_function *p, 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0x5B); 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_cvtsd2ss( struct x86_function *p, 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0xf2, 0x0f, 0x5a); 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_cvtpd2ps( struct x86_function *p, 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x5a); 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_packssdw( struct x86_function *p, 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0x6B); 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_packsswb( struct x86_function *p, 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0x63); 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_packuswb( struct x86_function *p, 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0x67); 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_punpcklbw( struct x86_function *p, 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, X86_TWOB, 0x60); 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_punpcklwd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x61); 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_punpckldq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x62); 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_punpcklqdq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x6c); 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psllw_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI(dst, imm); 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x71); 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 6, dst); 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_pslld_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI(dst, imm); 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x72); 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 6, dst); 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psllq_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI(dst, imm); 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x73); 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 6, dst); 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psrlw_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI(dst, imm); 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x71); 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 2, dst); 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psrld_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI(dst, imm); 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x72); 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 2, dst); 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psrlq_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI(dst, imm); 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x73); 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 2, dst); 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psraw_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI(dst, imm); 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x71); 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 4, dst); 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_psrad_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RI(dst, imm); 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0x72); 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 4, dst); 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, imm); 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_por( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR(dst, src); 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0x66, 0x0f, 0xeb); 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm(p, dst, src); 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_rcpps( struct x86_function *p, 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x53); 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid sse2_rcpss( struct x86_function *p, 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_3ub(p, 0xF3, X86_TWOB, 0x53); 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * x87 instructions 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void note_x87_pop( struct x86_function *p ) 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->x87_stack--; 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(p->x87_stack >= 0); 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void note_x87_push( struct x86_function *p ) 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->x87_stack++; 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(p->x87_stack <= 7); 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_assert_stack_empty( struct x86_function *p ) 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert (p->x87_stack == 0); 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fist( struct x86_function *p, struct x86_reg dst ) 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xdb); 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 2, dst); 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fistp( struct x86_function *p, struct x86_reg dst ) 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xdb); 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 3, dst); 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fild( struct x86_function *p, struct x86_reg arg ) 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xdf); 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 0, arg); 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_push(p); 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fldz( struct x86_function *p ) 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xee); 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_push(p); 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fldcw( struct x86_function *p, struct x86_reg arg ) 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.file == file_REG32); 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.mod != mod_REG); 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xd9); 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 5, arg); 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fld1( struct x86_function *p ) 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xe8); 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_push(p); 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fldl2e( struct x86_function *p ) 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xea); 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_push(p); 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fldln2( struct x86_function *p ) 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xed); 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_push(p); 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fwait( struct x86_function *p ) 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x9b); 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fnclex( struct x86_function *p ) 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xdb, 0xe2); 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fclex( struct x86_function *p ) 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x87_fwait(p); 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x87_fnclex(p); 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmovb( struct x86_function *p, struct x86_reg arg ) 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.file == file_x87); 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xda, 0xc0+arg.idx); 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmove( struct x86_function *p, struct x86_reg arg ) 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.file == file_x87); 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xda, 0xc8+arg.idx); 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmovbe( struct x86_function *p, struct x86_reg arg ) 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.file == file_x87); 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xda, 0xd0+arg.idx); 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmovnb( struct x86_function *p, struct x86_reg arg ) 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.file == file_x87); 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xdb, 0xc0+arg.idx); 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmovne( struct x86_function *p, struct x86_reg arg ) 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.file == file_x87); 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xdb, 0xc8+arg.idx); 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcmovnbe( struct x86_function *p, struct x86_reg arg ) 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.file == file_x87); 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xdb, 0xd0+arg.idx); 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void x87_arith_op( struct x86_function *p, struct x86_reg dst, struct x86_reg arg, 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char dst0ub0, 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char dst0ub1, 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char arg0ub0, 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char arg0ub1, 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char argmem_noreg) 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_x87); 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (arg.file == file_x87) { 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst.idx == 0) 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, dst0ub0, dst0ub1+arg.idx); 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (arg.idx == 0) 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, arg0ub0, arg0ub1+arg.idx); 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dst.idx == 0) { 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.file == file_REG32); 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xd8); 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, argmem_noreg, arg); 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fmul( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x87_arith_op(p, dst, src, 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xd8, 0xc8, 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xdc, 0xc8, 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4); 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsub( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x87_arith_op(p, dst, src, 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xd8, 0xe0, 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xdc, 0xe8, 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4); 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsubr( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x87_arith_op(p, dst, src, 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xd8, 0xe8, 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xdc, 0xe0, 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5); 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fadd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x87_arith_op(p, dst, src, 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xd8, 0xc0, 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xdc, 0xc0, 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0); 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fdiv( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x87_arith_op(p, dst, src, 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xd8, 0xf0, 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xdc, 0xf8, 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6); 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fdivr( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x87_arith_op(p, dst, src, 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xd8, 0xf8, 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xdc, 0xf0, 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 7); 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fmulp( struct x86_function *p, struct x86_reg dst ) 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_x87); 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.idx >= 1); 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xde, 0xc8+dst.idx); 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsubp( struct x86_function *p, struct x86_reg dst ) 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_x87); 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.idx >= 1); 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xde, 0xe8+dst.idx); 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsubrp( struct x86_function *p, struct x86_reg dst ) 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_x87); 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.idx >= 1); 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xde, 0xe0+dst.idx); 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_faddp( struct x86_function *p, struct x86_reg dst ) 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_x87); 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.idx >= 1); 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xde, 0xc0+dst.idx); 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fdivp( struct x86_function *p, struct x86_reg dst ) 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_x87); 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.idx >= 1); 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xde, 0xf8+dst.idx); 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fdivrp( struct x86_function *p, struct x86_reg dst ) 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_x87); 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.idx >= 1); 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xde, 0xf0+dst.idx); 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_ftst( struct x86_function *p ) 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xe4); 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fucom( struct x86_function *p, struct x86_reg arg ) 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.file == file_x87); 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xdd, 0xe0+arg.idx); 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fucomp( struct x86_function *p, struct x86_reg arg ) 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.file == file_x87); 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xdd, 0xe8+arg.idx); 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fucompp( struct x86_function *p ) 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xda, 0xe9); 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); /* pop twice */ 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); /* pop twice */ 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fxch( struct x86_function *p, struct x86_reg arg ) 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(arg.file == file_x87); 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xc8+arg.idx); 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fabs( struct x86_function *p ) 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xe1); 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fchs( struct x86_function *p ) 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xe0); 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcos( struct x86_function *p ) 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xff); 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fprndint( struct x86_function *p ) 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xfc); 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fscale( struct x86_function *p ) 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xfd); 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsin( struct x86_function *p ) 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xfe); 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsincos( struct x86_function *p ) 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xfb); 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fsqrt( struct x86_function *p ) 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xfa); 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fxtract( struct x86_function *p ) 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xf4); 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* st0 = (2^st0)-1 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Restrictions: -1.0 <= st0 <= 1.0 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_f2xm1( struct x86_function *p ) 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xf0); 1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* st1 = st1 * log2(st0); 1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pop_stack; 1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fyl2x( struct x86_function *p ) 1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xf1); 1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* st1 = st1 * log2(st0 + 1.0); 1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pop_stack; 1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A fast operation, with restrictions: -.29 < st0 < .29 1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fyl2xp1( struct x86_function *p ) 1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xf9); 1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fld( struct x86_function *p, struct x86_reg arg ) 1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (arg.file == file_x87) 1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd9, 0xc0 + arg.idx); 1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xd9); 1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 0, arg); 1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_push(p); 1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fst( struct x86_function *p, struct x86_reg dst ) 1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst.file == file_x87) 1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xdd, 0xd0 + dst.idx); 1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xd9); 1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 2, dst); 1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fstp( struct x86_function *p, struct x86_reg dst ) 1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst.file == file_x87) 1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xdd, 0xd8 + dst.idx); 1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xd9); 1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 3, dst); 1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fpop( struct x86_function *p ) 1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x87_fstp( p, x86_make_reg( file_x87, 0 )); 1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcom( struct x86_function *p, struct x86_reg dst ) 1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst.file == file_x87) 1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd8, 0xd0 + dst.idx); 1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xd8); 1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 2, dst); 1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcomp( struct x86_function *p, struct x86_reg dst ) 1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst.file == file_x87) 1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xd8, 0xd8 + dst.idx); 1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xd8); 1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 3, dst); 1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcomi( struct x86_function *p, struct x86_reg arg ) 1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xdb, 0xf0+arg.idx); 1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fcomip( struct x86_function *p, struct x86_reg arg ) 1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( arg ); 1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xdb, 0xf0+arg.idx); 1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org note_x87_pop(p); 1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fnstsw( struct x86_function *p, struct x86_reg dst ) 1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_REG32); 1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst.idx == reg_AX && 1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst.mod == mod_REG) 1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0xdf, 0xe0); 1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xdd); 2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 7, dst); 2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x87_fnstcw( struct x86_function *p, struct x86_reg dst ) 2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_R( dst ); 2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_REG32); 2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0x9b); /* WAIT -- needed? */ 2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, 0xd9); 2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm_noreg(p, 7, dst); 2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MMX instructions 2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid mmx_emms( struct x86_function *p ) 2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP(); 2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(p->need_emms); 2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, 0x0f, 0x77); 2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->need_emms = 0; 2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid mmx_packssdw( struct x86_function *p, 2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_MMX && 2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (src.file == file_MMX || src.mod != mod_REG)); 2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->need_emms = 1; 2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x6b); 2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid mmx_packuswb( struct x86_function *p, 2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst.file == file_MMX && 2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (src.file == file_MMX || src.mod != mod_REG)); 2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->need_emms = 1; 2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_2ub(p, X86_TWOB, 0x67); 2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_modrm( p, dst, src ); 2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid mmx_movd( struct x86_function *p, 2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->need_emms = 1; 2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, X86_TWOB); 2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x6e, 0x7e, dst, src ); 2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid mmx_movq( struct x86_function *p, 2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg dst, 2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct x86_reg src ) 2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_RR( dst, src ); 2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->need_emms = 1; 2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_1ub(p, X86_TWOB); 2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_op_modrm( p, 0x6f, 0x7f, dst, src ); 2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper functions 2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_cdecl_caller_push_regs( struct x86_function *p ) 2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_push(p, x86_make_reg(file_REG32, reg_AX)); 2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_push(p, x86_make_reg(file_REG32, reg_CX)); 2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_push(p, x86_make_reg(file_REG32, reg_DX)); 2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_cdecl_caller_pop_regs( struct x86_function *p ) 2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_pop(p, x86_make_reg(file_REG32, reg_DX)); 2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_pop(p, x86_make_reg(file_REG32, reg_CX)); 2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_pop(p, x86_make_reg(file_REG32, reg_AX)); 2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x86_reg x86_fn_arg( struct x86_function *p, 2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned arg ) 2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(x86_target(p)) 2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case X86_64_WIN64_ABI: 2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Microsoft uses a different calling convention than the rest of the world */ 2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(arg) 2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg(file_REG32, reg_CX); 2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg(file_REG32, reg_DX); 2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg(file_REG32, reg_R8); 2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg(file_REG32, reg_R9); 2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Win64 allocates stack slots as if it pushed the first 4 arguments too */ 2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_disp(x86_make_reg(file_REG32, reg_SP), 2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->stack_offset + arg * 8); 2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case X86_64_STD_ABI: 2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(arg) 2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg(file_REG32, reg_DI); 2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg(file_REG32, reg_SI); 2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg(file_REG32, reg_DX); 2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg(file_REG32, reg_CX); 2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 5: 2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg(file_REG32, reg_R8); 2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 6: 2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg(file_REG32, reg_R9); 2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_disp(x86_make_reg(file_REG32, reg_SP), 2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->stack_offset + (arg - 6) * 8); /* ??? */ 2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case X86_32: 2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_disp(x86_make_reg(file_REG32, reg_SP), 2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->stack_offset + arg * 4); /* ??? */ 2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "Unexpected x86 target ABI in x86_fn_arg"); 2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x86_make_reg(file_REG32, reg_CX); /* not used / silence warning */ 2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void x86_init_func_common( struct x86_function *p ) 2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_cpu_detect(); 2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->caps = 0; 2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(util_cpu_caps.has_mmx) 2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->caps |= X86_MMX; 2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(util_cpu_caps.has_mmx2) 2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->caps |= X86_MMX2; 2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(util_cpu_caps.has_sse) 2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->caps |= X86_SSE; 2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(util_cpu_caps.has_sse2) 2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->caps |= X86_SSE2; 2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(util_cpu_caps.has_sse3) 2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->caps |= X86_SSE3; 2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(util_cpu_caps.has_sse4_1) 2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->caps |= X86_SSE4_1; 2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->csr = p->store; 2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_START(); 2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_init_func( struct x86_function *p ) 2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->size = 0; 2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->store = NULL; 2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_init_func_common(p); 2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_init_func_size( struct x86_function *p, unsigned code_size ) 2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->size = code_size; 2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->store = rtasm_exec_malloc(code_size); 2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->store == NULL) { 2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->store = p->error_overflow; 2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_init_func_common(p); 2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86_release_func( struct x86_function *p ) 2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->store && p->store != p->error_overflow) 2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rtasm_exec_free(p->store); 2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->store = NULL; 2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->csr = NULL; 2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->size = 0; 2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE x86_func 2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoidptr_to_x86_func(void *v) 2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union { 2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *v; 2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_func f; 2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } u; 2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sizeof(u.v) == sizeof(u.f)); 2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u.v = v; 2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return u.f; 2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx86_func x86_get_func( struct x86_function *p ) 2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DUMP_END(); 2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (DISASSEM && p->store) 2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("disassemble %p %p\n", p->store, p->csr); 2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->store == p->error_overflow) 2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return voidptr_to_x86_func(NULL); 2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return voidptr_to_x86_func(p->store); 2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86sse_dummy( void ); 2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid x86sse_dummy( void ) 2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 2232