1d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca/************************************************************************** 2d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * 3d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * Copyright (C) 1999-2005 Brian Paul All Rights Reserved. 4d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * 5d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 6d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * copy of this software and associated documentation files (the "Software"), 7d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * to deal in the Software without restriction, including without limitation 8d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * and/or sell copies of the Software, and to permit persons to whom the 10d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * Software is furnished to do so, subject to the following conditions: 11d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * 12d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * The above copyright notice and this permission notice shall be included 13d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * in all copies or substantial portions of the Software. 14d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * 15d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 19d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca * 22d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca **************************************************************************/ 23d2f6c9ab10656f6ecda131a6785a60565026d249José Fonseca 2455d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#include "pipe/p_config.h" 25a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri#include "util/u_cpu_detect.h" 2655d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca 27f4dd0991719ef3e2606920c5100b372181c60899José Fonseca#if defined(PIPE_ARCH_X86) || (defined(PIPE_ARCH_X86_64) && !defined(__MINGW32__)) 28df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 29df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca#include "pipe/p_compiler.h" 30ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h" 31f3a7463feefcf1f22c1309e1f5b0bfe381859686Brian Paul#include "util/u_pointer.h" 32df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 3339ea0308425ad04618061129c63c22ac0efb0692José Fonseca#include "rtasm_execmem.h" 3439ea0308425ad04618061129c63c22ac0efb0692José Fonseca#include "rtasm_x86sse.h" 35df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 36df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca#define DISASSEM 0 37df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca#define X86_TWOB 0x0f 38df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 39df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 40b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell#define DUMP_SSE 0 41b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 42b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 43d3e64caef6f8654af1a84825803e517ab8221c68Keith Whitwellvoid x86_print_reg( struct x86_reg reg ) 44b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell{ 45b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell if (reg.mod != mod_REG) 46b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell debug_printf( "[" ); 47b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 48b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell switch( reg.file ) { 49b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case file_REG32: 50b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell switch( reg.idx ) { 51b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case reg_AX: debug_printf( "EAX" ); break; 52b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case reg_CX: debug_printf( "ECX" ); break; 53b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case reg_DX: debug_printf( "EDX" ); break; 54b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case reg_BX: debug_printf( "EBX" ); break; 55b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case reg_SP: debug_printf( "ESP" ); break; 56b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case reg_BP: debug_printf( "EBP" ); break; 57b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case reg_SI: debug_printf( "ESI" ); break; 58b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case reg_DI: debug_printf( "EDI" ); break; 59b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell } 60b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell break; 61b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case file_MMX: 62b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell debug_printf( "MMX%u", reg.idx ); 63b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell break; 64b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case file_XMM: 65b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell debug_printf( "XMM%u", reg.idx ); 66b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell break; 67b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell case file_x87: 68b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell debug_printf( "fp%u", reg.idx ); 69b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell break; 70b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell } 71b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 72b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell if (reg.mod == mod_DISP8 || 73b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell reg.mod == mod_DISP32) 74b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell debug_printf("+%d", reg.disp); 75b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 76b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell if (reg.mod != mod_REG) 77b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell debug_printf( "]" ); 78b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell} 79b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 80d3e64caef6f8654af1a84825803e517ab8221c68Keith Whitwell#if DUMP_SSE 81b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 8273c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_START() debug_printf( "\n" ) 8373c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_END() debug_printf( "\n" ) 84b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 8573c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP() do { \ 8673c2711bb186692b866720058a09f5eb05950213Keith Whitwell const char *foo = __FUNCTION__; \ 8773c2711bb186692b866720058a09f5eb05950213Keith Whitwell while (*foo && *foo != '_') \ 8873c2711bb186692b866720058a09f5eb05950213Keith Whitwell foo++; \ 8973c2711bb186692b866720058a09f5eb05950213Keith Whitwell if (*foo) \ 9073c2711bb186692b866720058a09f5eb05950213Keith Whitwell foo++; \ 91e9a25089f92e0cce6f72ba5e1a6c2036825290d5Vinson Lee debug_printf( "\n%4x %14s ", p->csr - p->store, foo ); \ 9273c2711bb186692b866720058a09f5eb05950213Keith Whitwell} while (0) 93b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 9473c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_I( I ) do { \ 9573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); \ 96b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell debug_printf( "%u", I ); \ 97b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell} while( 0 ) 98b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 9973c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_R( R0 ) do { \ 10073c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); \ 101d3e64caef6f8654af1a84825803e517ab8221c68Keith Whitwell x86_print_reg( R0 ); \ 102b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell} while( 0 ) 103b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 10473c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_RR( R0, R1 ) do { \ 10573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); \ 106d3e64caef6f8654af1a84825803e517ab8221c68Keith Whitwell x86_print_reg( R0 ); \ 107b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell debug_printf( ", " ); \ 108d3e64caef6f8654af1a84825803e517ab8221c68Keith Whitwell x86_print_reg( R1 ); \ 109b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell} while( 0 ) 110b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 11173c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_RI( R0, I ) do { \ 11273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); \ 113d3e64caef6f8654af1a84825803e517ab8221c68Keith Whitwell x86_print_reg( R0 ); \ 11473c2711bb186692b866720058a09f5eb05950213Keith Whitwell debug_printf( ", %u", I ); \ 115b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell} while( 0 ) 116b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 11773c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_RRI( R0, R1, I ) do { \ 11873c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); \ 119d3e64caef6f8654af1a84825803e517ab8221c68Keith Whitwell x86_print_reg( R0 ); \ 120b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell debug_printf( ", " ); \ 121d3e64caef6f8654af1a84825803e517ab8221c68Keith Whitwell x86_print_reg( R1 ); \ 12273c2711bb186692b866720058a09f5eb05950213Keith Whitwell debug_printf( ", %u", I ); \ 123b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell} while( 0 ) 124b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 125b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell#else 126b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 127b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell#define DUMP_START() 128b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell#define DUMP_END() 12973c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP( ) 13073c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_I( I ) 13173c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_R( R0 ) 13273c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_RR( R0, R1 ) 13373c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_RI( R0, I ) 13473c2711bb186692b866720058a09f5eb05950213Keith Whitwell#define DUMP_RRI( R0, R1, I ) 135b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 136b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell#endif 137b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 138b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 139df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastatic void do_realloc( struct x86_function *p ) 140df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 141b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell if (p->store == p->error_overflow) { 142b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell p->csr = p->store; 143b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell } 144b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell else if (p->size == 0) { 145df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->size = 1024; 14639ea0308425ad04618061129c63c22ac0efb0692José Fonseca p->store = rtasm_exec_malloc(p->size); 147df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->csr = p->store; 148df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 149df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else { 15057060bc1fa82e4e93d2affafecd98219be2f991fMichal Krol uintptr_t used = pointer_to_uintptr( p->csr ) - pointer_to_uintptr( p->store ); 151df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char *tmp = p->store; 152df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->size *= 2; 15339ea0308425ad04618061129c63c22ac0efb0692José Fonseca p->store = rtasm_exec_malloc(p->size); 154b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell 155b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell if (p->store) { 156b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell memcpy(p->store, tmp, used); 157b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell p->csr = p->store + used; 158b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell } 159b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell else { 160b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell p->csr = p->store; 161b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell } 162b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell 16339ea0308425ad04618061129c63c22ac0efb0692José Fonseca rtasm_exec_free(tmp); 164df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 165b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell 166b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell if (p->store == NULL) { 167b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell p->store = p->csr = p->error_overflow; 16873c2711bb186692b866720058a09f5eb05950213Keith Whitwell p->size = sizeof(p->error_overflow); 169b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell } 170df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 171df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 172df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/* Emit bytes to the instruction stream: 173df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 174df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastatic unsigned char *reserve( struct x86_function *p, int bytes ) 175df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 17657060bc1fa82e4e93d2affafecd98219be2f991fMichal Krol if (p->csr + bytes - p->store > (int) p->size) 177df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca do_realloc(p); 178df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 179df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca { 180df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char *csr = p->csr; 181df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->csr += bytes; 182df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca return csr; 183df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 184df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 185df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 186df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 187df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 188df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastatic void emit_1b( struct x86_function *p, char b0 ) 189df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 190df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca char *csr = (char *)reserve(p, 1); 191df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca *csr = b0; 192df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 193df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 194df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastatic void emit_1i( struct x86_function *p, int i0 ) 195df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 196df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca int *icsr = (int *)reserve(p, sizeof(i0)); 197df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca *icsr = i0; 198df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 199df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 200df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastatic void emit_1ub( struct x86_function *p, unsigned char b0 ) 201df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 202df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char *csr = reserve(p, 1); 203df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca *csr++ = b0; 204df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 205df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 206df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastatic void emit_2ub( struct x86_function *p, unsigned char b0, unsigned char b1 ) 207df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 208df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char *csr = reserve(p, 2); 209df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca *csr++ = b0; 210df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca *csr++ = b1; 211df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 212df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 213df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastatic void emit_3ub( struct x86_function *p, unsigned char b0, unsigned char b1, unsigned char b2 ) 214df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 215df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char *csr = reserve(p, 3); 216df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca *csr++ = b0; 217df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca *csr++ = b1; 218df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca *csr++ = b2; 219df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 220df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 221df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 222df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/* Build a modRM byte + possible displacement. No treatment of SIB 223df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * indexing. BZZT - no way to encode an absolute address. 2246b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell * 2256b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell * This is the "/r" field in the x86 manuals... 226df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 227df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastatic void emit_modrm( struct x86_function *p, 228df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg reg, 229df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg regmem ) 230df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 231df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char val = 0; 232df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 233df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(reg.mod == mod_REG); 234df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 235a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri /* TODO: support extended x86-64 registers */ 236a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri assert(reg.idx < 8); 237a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri assert(regmem.idx < 8); 238a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 239df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca val |= regmem.mod << 6; /* mod field */ 240df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca val |= reg.idx << 3; /* reg field */ 241df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca val |= regmem.idx; /* r/m field */ 242df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 243df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, val); 244df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 245df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca /* Oh-oh we've stumbled into the SIB thing. 246df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 247df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (regmem.file == file_REG32 && 2486607f2cf19d083a979716a341e6e175aef7d6830José Fonseca regmem.idx == reg_SP && 2496607f2cf19d083a979716a341e6e175aef7d6830José Fonseca regmem.mod != mod_REG) { 250df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0x24); /* simplistic! */ 251df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 252df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 253df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca switch (regmem.mod) { 254df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca case mod_REG: 255df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca case mod_INDIRECT: 256df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca break; 257df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca case mod_DISP8: 25857060bc1fa82e4e93d2affafecd98219be2f991fMichal Krol emit_1b(p, (char) regmem.disp); 259df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca break; 260df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca case mod_DISP32: 261df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1i(p, regmem.disp); 262df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca break; 263df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca default: 264df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(0); 265df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca break; 266df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 267df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 268df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2696b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell/* Emits the "/0".."/7" specialized versions of the modrm ("/r") bytes. 2706b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell */ 271df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastatic void emit_modrm_noreg( struct x86_function *p, 272df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned op, 273df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg regmem ) 274df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 275df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dummy = x86_make_reg(file_REG32, op); 276df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm(p, dummy, regmem); 277df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 278df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 279df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/* Many x86 instructions have two opcodes to cope with the situations 280df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * where the destination is a register or memory reference 281df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * respectively. This function selects the correct opcode based on 282df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * the arguments presented. 283df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 284df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastatic void emit_op_modrm( struct x86_function *p, 285df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char op_dst_is_reg, 286df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char op_dst_is_mem, 287df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 288df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 289df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 290df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca switch (dst.mod) { 291df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca case mod_REG: 292df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, op_dst_is_reg); 293df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm(p, dst, src); 294df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca break; 295df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca case mod_INDIRECT: 296df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca case mod_DISP32: 297df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca case mod_DISP8: 298df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(src.mod == mod_REG); 299df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, op_dst_is_mem); 300df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm(p, src, dst); 301df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca break; 302df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca default: 303df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(0); 304df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca break; 305df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 306df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 307df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 308df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 309df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 310df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 311df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 312df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 313df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 314df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/* Create and manipulate registers and regmem values: 315df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 316df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastruct x86_reg x86_make_reg( enum x86_reg_file file, 317df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca enum x86_reg_name idx ) 318df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 319df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg reg; 320df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 321df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca reg.file = file; 322df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca reg.idx = idx; 323df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca reg.mod = mod_REG; 324df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca reg.disp = 0; 325df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 326df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca return reg; 327df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 328df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 329df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastruct x86_reg x86_make_disp( struct x86_reg reg, 330df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca int disp ) 331df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 332df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(reg.file == file_REG32); 333df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 334df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (reg.mod == mod_REG) 335df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca reg.disp = disp; 336df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else 337df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca reg.disp += disp; 338df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 339648da5158e5f418bf859aee6aa4532b6899b0d94Keith Whitwell if (reg.disp == 0 && reg.idx != reg_BP) 340df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca reg.mod = mod_INDIRECT; 341df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else if (reg.disp <= 127 && reg.disp >= -128) 342df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca reg.mod = mod_DISP8; 343df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else 344df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca reg.mod = mod_DISP32; 345df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 346df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca return reg; 347df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 348df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 349df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastruct x86_reg x86_deref( struct x86_reg reg ) 350df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 351df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca return x86_make_disp(reg, 0); 352df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 353df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 354df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastruct x86_reg x86_get_base_reg( struct x86_reg reg ) 355df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 356df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca return x86_make_reg( reg.file, reg.idx ); 357df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 358df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 359fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwellint x86_get_label( struct x86_function *p ) 360df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 361fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwell return p->csr - p->store; 362df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 363df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 364df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 365df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 366df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/*********************************************************************** 367df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * x86 instructions 368df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 369df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 370df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 371a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid x64_rexw(struct x86_function *p) 372a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 373a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(x86_target(p) != X86_32) 374a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0x48); 375a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 376a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 377df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_jcc( struct x86_function *p, 378df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca enum x86_cc cc, 379fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwell int label ) 380df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 381fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwell int offset = label - (x86_get_label(p) + 2); 382a945420ae6f96f0d7024f97e37ffd31329865a84Keith Whitwell DUMP_I(cc); 383df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 384fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwell if (offset < 0) { 385f7ee3c979261b4a2b77365b47c7147f69fbfd606Brian /*assert(p->csr - p->store > -offset);*/ 386f7ee3c979261b4a2b77365b47c7147f69fbfd606Brian if (p->csr - p->store <= -offset) { 387f7ee3c979261b4a2b77365b47c7147f69fbfd606Brian /* probably out of memory (using the error_overflow buffer) */ 388f7ee3c979261b4a2b77365b47c7147f69fbfd606Brian return; 389f7ee3c979261b4a2b77365b47c7147f69fbfd606Brian } 390fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwell } 391fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwell 392df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (offset <= 127 && offset >= -128) { 393df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0x70 + cc); 394df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1b(p, (char) offset); 395df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 396df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else { 397fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwell offset = label - (x86_get_label(p) + 6); 398df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0x0f, 0x80 + cc); 399df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1i(p, offset); 400df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 401df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 402df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 403df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/* Always use a 32bit offset for forward jumps: 404df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 405fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwellint x86_jcc_forward( struct x86_function *p, 406fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwell enum x86_cc cc ) 407df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 408a945420ae6f96f0d7024f97e37ffd31329865a84Keith Whitwell DUMP_I(cc); 409df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0x0f, 0x80 + cc); 410df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1i(p, 0); 411df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca return x86_get_label(p); 412df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 413df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 414fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwellint x86_jmp_forward( struct x86_function *p) 415df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 41673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 417df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xe9); 418df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1i(p, 0); 419df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca return x86_get_label(p); 420df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 421df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 422fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwellint x86_call_forward( struct x86_function *p) 423df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 42473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 425b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell 426df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xe8); 427df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1i(p, 0); 428df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca return x86_get_label(p); 429df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 430df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 431df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/* Fixup offset from forward jump: 432df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 433df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_fixup_fwd_jump( struct x86_function *p, 434fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwell int fixup ) 435df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 436fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwell *(int *)(p->store + fixup - 4) = x86_get_label(p) - fixup; 437df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 438df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 439fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwellvoid x86_jmp( struct x86_function *p, int label) 440df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 44173c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_I( label ); 442df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xe9); 443fb3623b235f5caa9d76e656b1e5eda797c7c73ebKeith Whitwell emit_1i(p, label - x86_get_label(p) - 4); 4445b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell} 4455b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell 446df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_call( struct x86_function *p, struct x86_reg reg) 447df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 44873c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( reg ); 449df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xff); 4504d184cc33131b440f9aafbcdd2d657050411db49Keith Whitwell emit_modrm_noreg(p, 2, reg); 451df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 452df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 453df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 454df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, int imm ) 455df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 45673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RI( dst, imm ); 4576607f2cf19d083a979716a341e6e175aef7d6830José Fonseca assert(dst.file == file_REG32); 458df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.mod == mod_REG); 459df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xb8 + dst.idx); 460df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1i(p, imm); 461df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 462df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 463a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid x86_mov_imm( struct x86_function *p, struct x86_reg dst, int imm ) 464a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 465a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI( dst, imm ); 466a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(dst.mod == mod_REG) 467a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri x86_mov_reg_imm(p, dst, imm); 468a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri else 469a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 470a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xc7); 471a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 0, dst); 472a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1i(p, imm); 473a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 474a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 475a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 476a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid x86_mov16_imm( struct x86_function *p, struct x86_reg dst, uint16_t imm ) 477a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 478a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI( dst, imm ); 479a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0x66); 480a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(dst.mod == mod_REG) 481a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 482a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xb8 + dst.idx); 483a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_2ub(p, imm & 0xff, imm >> 8); 484a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 485a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri else 486a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 487a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xc7); 488a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 0, dst); 489a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_2ub(p, imm & 0xff, imm >> 8); 490a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 491a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 492a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 493a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid x86_mov8_imm( struct x86_function *p, struct x86_reg dst, uint8_t imm ) 494a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 495a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI( dst, imm ); 496a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(dst.mod == mod_REG) 497a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 498a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xb0 + dst.idx); 499a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 500a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 501a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri else 502a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 503a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xc6); 504a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 0, dst); 505a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 506a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 507a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 508a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 5096607f2cf19d083a979716a341e6e175aef7d6830José Fonseca/** 5106607f2cf19d083a979716a341e6e175aef7d6830José Fonseca * Immediate group 1 instructions. 5116607f2cf19d083a979716a341e6e175aef7d6830José Fonseca */ 5126607f2cf19d083a979716a341e6e175aef7d6830José Fonsecastatic INLINE void 5136607f2cf19d083a979716a341e6e175aef7d6830José Fonsecax86_group1_imm( struct x86_function *p, 5146607f2cf19d083a979716a341e6e175aef7d6830José Fonseca unsigned op, struct x86_reg dst, int imm ) 5156b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell{ 5166607f2cf19d083a979716a341e6e175aef7d6830José Fonseca assert(dst.file == file_REG32); 5176b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell assert(dst.mod == mod_REG); 5186607f2cf19d083a979716a341e6e175aef7d6830José Fonseca if(-0x80 <= imm && imm < 0x80) { 5196607f2cf19d083a979716a341e6e175aef7d6830José Fonseca emit_1ub(p, 0x83); 5206607f2cf19d083a979716a341e6e175aef7d6830José Fonseca emit_modrm_noreg(p, op, dst); 5216607f2cf19d083a979716a341e6e175aef7d6830José Fonseca emit_1b(p, (char)imm); 5226607f2cf19d083a979716a341e6e175aef7d6830José Fonseca } 5236607f2cf19d083a979716a341e6e175aef7d6830José Fonseca else { 5246607f2cf19d083a979716a341e6e175aef7d6830José Fonseca emit_1ub(p, 0x81); 5256607f2cf19d083a979716a341e6e175aef7d6830José Fonseca emit_modrm_noreg(p, op, dst); 5266607f2cf19d083a979716a341e6e175aef7d6830José Fonseca emit_1i(p, imm); 5276607f2cf19d083a979716a341e6e175aef7d6830José Fonseca } 5286607f2cf19d083a979716a341e6e175aef7d6830José Fonseca} 5296607f2cf19d083a979716a341e6e175aef7d6830José Fonseca 5306607f2cf19d083a979716a341e6e175aef7d6830José Fonsecavoid x86_add_imm( struct x86_function *p, struct x86_reg dst, int imm ) 5316607f2cf19d083a979716a341e6e175aef7d6830José Fonseca{ 5326607f2cf19d083a979716a341e6e175aef7d6830José Fonseca DUMP_RI( dst, imm ); 5336607f2cf19d083a979716a341e6e175aef7d6830José Fonseca x86_group1_imm(p, 0, dst, imm); 5346607f2cf19d083a979716a341e6e175aef7d6830José Fonseca} 5356607f2cf19d083a979716a341e6e175aef7d6830José Fonseca 5366607f2cf19d083a979716a341e6e175aef7d6830José Fonsecavoid x86_or_imm( struct x86_function *p, struct x86_reg dst, int imm ) 5376607f2cf19d083a979716a341e6e175aef7d6830José Fonseca{ 5386607f2cf19d083a979716a341e6e175aef7d6830José Fonseca DUMP_RI( dst, imm ); 5396607f2cf19d083a979716a341e6e175aef7d6830José Fonseca x86_group1_imm(p, 1, dst, imm); 5406607f2cf19d083a979716a341e6e175aef7d6830José Fonseca} 5416607f2cf19d083a979716a341e6e175aef7d6830José Fonseca 5426607f2cf19d083a979716a341e6e175aef7d6830José Fonsecavoid x86_and_imm( struct x86_function *p, struct x86_reg dst, int imm ) 5436607f2cf19d083a979716a341e6e175aef7d6830José Fonseca{ 5446607f2cf19d083a979716a341e6e175aef7d6830José Fonseca DUMP_RI( dst, imm ); 5456607f2cf19d083a979716a341e6e175aef7d6830José Fonseca x86_group1_imm(p, 4, dst, imm); 5466607f2cf19d083a979716a341e6e175aef7d6830José Fonseca} 5476607f2cf19d083a979716a341e6e175aef7d6830José Fonseca 5486607f2cf19d083a979716a341e6e175aef7d6830José Fonsecavoid x86_sub_imm( struct x86_function *p, struct x86_reg dst, int imm ) 5496607f2cf19d083a979716a341e6e175aef7d6830José Fonseca{ 5506607f2cf19d083a979716a341e6e175aef7d6830José Fonseca DUMP_RI( dst, imm ); 5516607f2cf19d083a979716a341e6e175aef7d6830José Fonseca x86_group1_imm(p, 5, dst, imm); 5526607f2cf19d083a979716a341e6e175aef7d6830José Fonseca} 5536607f2cf19d083a979716a341e6e175aef7d6830José Fonseca 5546607f2cf19d083a979716a341e6e175aef7d6830José Fonsecavoid x86_xor_imm( struct x86_function *p, struct x86_reg dst, int imm ) 5556607f2cf19d083a979716a341e6e175aef7d6830José Fonseca{ 5566607f2cf19d083a979716a341e6e175aef7d6830José Fonseca DUMP_RI( dst, imm ); 5576607f2cf19d083a979716a341e6e175aef7d6830José Fonseca x86_group1_imm(p, 6, dst, imm); 5586607f2cf19d083a979716a341e6e175aef7d6830José Fonseca} 5596607f2cf19d083a979716a341e6e175aef7d6830José Fonseca 5606607f2cf19d083a979716a341e6e175aef7d6830José Fonsecavoid x86_cmp_imm( struct x86_function *p, struct x86_reg dst, int imm ) 5616607f2cf19d083a979716a341e6e175aef7d6830José Fonseca{ 5626607f2cf19d083a979716a341e6e175aef7d6830José Fonseca DUMP_RI( dst, imm ); 5636607f2cf19d083a979716a341e6e175aef7d6830José Fonseca x86_group1_imm(p, 7, dst, imm); 5646b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell} 5656b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell 5666b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell 567df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_push( struct x86_function *p, 568df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg reg ) 569df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 57073c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( reg ); 5712c89b75e36fd35d5a003107d1d2f97b537321f95Keith Whitwell if (reg.mod == mod_REG) 5722c89b75e36fd35d5a003107d1d2f97b537321f95Keith Whitwell emit_1ub(p, 0x50 + reg.idx); 5732c89b75e36fd35d5a003107d1d2f97b537321f95Keith Whitwell else 5742c89b75e36fd35d5a003107d1d2f97b537321f95Keith Whitwell { 5752c89b75e36fd35d5a003107d1d2f97b537321f95Keith Whitwell emit_1ub(p, 0xff); 5762c89b75e36fd35d5a003107d1d2f97b537321f95Keith Whitwell emit_modrm_noreg(p, 6, reg); 5772c89b75e36fd35d5a003107d1d2f97b537321f95Keith Whitwell } 5782c89b75e36fd35d5a003107d1d2f97b537321f95Keith Whitwell 5792c89b75e36fd35d5a003107d1d2f97b537321f95Keith Whitwell 580a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->stack_offset += sizeof(void*); 581df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 582df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 5836b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwellvoid x86_push_imm32( struct x86_function *p, 5846b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell int imm32 ) 5856b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell{ 5866b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell DUMP_I( imm32 ); 5876b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell emit_1ub(p, 0x68); 5886b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell emit_1i(p, imm32); 5896b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell 590a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->stack_offset += sizeof(void*); 5916b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell} 5926b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell 5936b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell 594df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_pop( struct x86_function *p, 595df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg reg ) 596df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 59773c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( reg ); 598df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(reg.mod == mod_REG); 599df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0x58 + reg.idx); 600a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->stack_offset -= sizeof(void*); 601df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 602df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 603df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_inc( struct x86_function *p, 604df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg reg ) 605df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 60673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( reg ); 607a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(x86_target(p) == X86_32 && reg.mod == mod_REG) 608a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 609a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0x40 + reg.idx); 610a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return; 611a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 612a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xff); 613a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 0, reg); 614df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 615df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 616df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_dec( struct x86_function *p, 617df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg reg ) 618df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 61973c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( reg ); 620a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(x86_target(p) == X86_32 && reg.mod == mod_REG) 621a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 622a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0x48 + reg.idx); 623a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return; 624a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 625a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xff); 626a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 1, reg); 627df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 628df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 629df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_ret( struct x86_function *p ) 630df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 63173c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 632727257f32002544658219d2e0163993c1cbc5644Keith Whitwell assert(p->stack_offset == 0); 633df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xc3); 634df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 635df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 636e3c415995706d2dda7c34a227e2e24d0745763ecJosé Fonsecavoid x86_retw( struct x86_function *p, unsigned short imm ) 637e3c415995706d2dda7c34a227e2e24d0745763ecJosé Fonseca{ 638e3c415995706d2dda7c34a227e2e24d0745763ecJosé Fonseca DUMP(); 639e3c415995706d2dda7c34a227e2e24d0745763ecJosé Fonseca emit_3ub(p, 0xc2, imm & 0xff, (imm >> 8) & 0xff); 640e3c415995706d2dda7c34a227e2e24d0745763ecJosé Fonseca} 641e3c415995706d2dda7c34a227e2e24d0745763ecJosé Fonseca 642df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_sahf( struct x86_function *p ) 643df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 64473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 645df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0x9e); 646df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 647df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 648df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_mov( struct x86_function *p, 649df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 650df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 651df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 65273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 653a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri /* special hack for reading arguments until we support x86-64 registers everywhere */ 654a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(src.mod == mod_REG && dst.mod == mod_REG && (src.idx >= 8 || dst.idx >= 8)) 655a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 656a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri uint8_t rex = 0x40; 657a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(dst.idx >= 8) 658a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 659a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri rex |= 4; 660a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri dst.idx -= 8; 661a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 662a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(src.idx >= 8) 663a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 664a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri rex |= 1; 665a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri src.idx -= 8; 666a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 667a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, rex); 668a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 669a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_op_modrm( p, 0x8b, 0x89, dst, src ); 670a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 671a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 672a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid x86_mov16( struct x86_function *p, 673a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg dst, 674a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg src ) 675a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 676a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR( dst, src ); 677a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0x66); 678a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_op_modrm( p, 0x8b, 0x89, dst, src ); 679a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 680a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 681a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid x86_mov8( struct x86_function *p, 682a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg dst, 683a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg src ) 684a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 685a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR( dst, src ); 686a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_op_modrm( p, 0x8a, 0x88, dst, src ); 687a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 688a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 689a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid x64_mov64( struct x86_function *p, 690a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg dst, 691a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg src ) 692a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 693a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri uint8_t rex = 0x48; 694a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR( dst, src ); 695a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri assert(x86_target(p) != X86_32); 696a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 697a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri /* special hack for reading arguments until we support x86-64 registers everywhere */ 698a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(src.mod == mod_REG && dst.mod == mod_REG && (src.idx >= 8 || dst.idx >= 8)) 699a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 700a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(dst.idx >= 8) 701a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 702a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri rex |= 4; 703a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri dst.idx -= 8; 704a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 705a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(src.idx >= 8) 706a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 707a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri rex |= 1; 708a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri src.idx -= 8; 709a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 710a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 711a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, rex); 712df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x8b, 0x89, dst, src ); 713df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 714df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 7154a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbierivoid x86_movzx8(struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 7164a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri{ 7174a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri DUMP_RR( dst, src ); 7184a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri emit_2ub(p, 0x0f, 0xb6); 7194a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri emit_modrm(p, dst, src); 7204a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri} 7214a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri 7224a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbierivoid x86_movzx16(struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 7234a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri{ 7244a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri DUMP_RR( dst, src ); 7254a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri emit_2ub(p, 0x0f, 0xb7); 7264a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri emit_modrm(p, dst, src); 7274a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri} 7284a4e29a9ab96d44fca9bb25064e12715aac85cbdLuca Barbieri 72917bbc1f0425b3768e26473eccea5f2570dcb26d3José Fonsecavoid x86_cmovcc( struct x86_function *p, 73017bbc1f0425b3768e26473eccea5f2570dcb26d3José Fonseca struct x86_reg dst, 73117bbc1f0425b3768e26473eccea5f2570dcb26d3José Fonseca struct x86_reg src, 73217bbc1f0425b3768e26473eccea5f2570dcb26d3José Fonseca enum x86_cc cc) 73317bbc1f0425b3768e26473eccea5f2570dcb26d3José Fonseca{ 73417bbc1f0425b3768e26473eccea5f2570dcb26d3José Fonseca DUMP_RRI( dst, src, cc ); 73517bbc1f0425b3768e26473eccea5f2570dcb26d3José Fonseca emit_2ub( p, 0x0f, 0x40 + cc ); 73617bbc1f0425b3768e26473eccea5f2570dcb26d3José Fonseca emit_modrm( p, dst, src ); 73717bbc1f0425b3768e26473eccea5f2570dcb26d3José Fonseca} 73817bbc1f0425b3768e26473eccea5f2570dcb26d3José Fonseca 739df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_xor( struct x86_function *p, 740df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 741df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 742df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 74373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 744df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x33, 0x31, dst, src ); 745df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 746df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 747df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_cmp( struct x86_function *p, 748df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 749df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 750df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 75173c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 752df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x3b, 0x39, dst, src ); 753df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 754df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 755df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_lea( struct x86_function *p, 756df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 757df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 758df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 75973c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 760df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0x8d); 761df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 762df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 763df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 764df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_test( struct x86_function *p, 765df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 766df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 767df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 76873c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 769df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0x85); 770df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 771df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 772df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 773df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_add( struct x86_function *p, 774df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 775df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 776df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 77773c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 778df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm(p, 0x03, 0x01, dst, src ); 779df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 780df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 7815b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell/* Calculate EAX * src, results in EDX:EAX. 7825b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell */ 783df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_mul( struct x86_function *p, 784df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 785df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 78673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( src ); 7875b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell emit_1ub(p, 0xf7); 7885b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell emit_modrm_noreg(p, 4, src ); 789df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 790df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 791363f7abf2000c1cf5993ae8f83ba81b2054bf6e0Keith Whitwell 792363f7abf2000c1cf5993ae8f83ba81b2054bf6e0Keith Whitwellvoid x86_imul( struct x86_function *p, 793363f7abf2000c1cf5993ae8f83ba81b2054bf6e0Keith Whitwell struct x86_reg dst, 794363f7abf2000c1cf5993ae8f83ba81b2054bf6e0Keith Whitwell struct x86_reg src ) 795363f7abf2000c1cf5993ae8f83ba81b2054bf6e0Keith Whitwell{ 79673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 797363f7abf2000c1cf5993ae8f83ba81b2054bf6e0Keith Whitwell emit_2ub(p, X86_TWOB, 0xAF); 798363f7abf2000c1cf5993ae8f83ba81b2054bf6e0Keith Whitwell emit_modrm(p, dst, src); 799363f7abf2000c1cf5993ae8f83ba81b2054bf6e0Keith Whitwell} 800363f7abf2000c1cf5993ae8f83ba81b2054bf6e0Keith Whitwell 801363f7abf2000c1cf5993ae8f83ba81b2054bf6e0Keith Whitwell 802df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_sub( struct x86_function *p, 803df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 804df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 805df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 80673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 807df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm(p, 0x2b, 0x29, dst, src ); 808df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 809df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 810df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_or( struct x86_function *p, 811df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 812df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 813df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 81473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 815df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x0b, 0x09, dst, src ); 816df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 817df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 818df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_and( struct x86_function *p, 819df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 820df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 821df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 82273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 823df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x23, 0x21, dst, src ); 824df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 825df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 8260f185cb027b12356895e424506846fa449e7c47fMichal Krolvoid x86_div( struct x86_function *p, 8270f185cb027b12356895e424506846fa449e7c47fMichal Krol struct x86_reg src ) 8280f185cb027b12356895e424506846fa449e7c47fMichal Krol{ 8290f185cb027b12356895e424506846fa449e7c47fMichal Krol assert(src.file == file_REG32 && src.mod == mod_REG); 8300f185cb027b12356895e424506846fa449e7c47fMichal Krol emit_op_modrm(p, 0xf7, 0, x86_make_reg(file_REG32, 6), src); 8310f185cb027b12356895e424506846fa449e7c47fMichal Krol} 8320f185cb027b12356895e424506846fa449e7c47fMichal Krol 833a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid x86_bswap( struct x86_function *p, struct x86_reg reg ) 834a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 835a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_R(reg); 836a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri assert(reg.file == file_REG32); 837a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri assert(reg.mod == mod_REG); 838a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_2ub(p, 0x0f, 0xc8 + reg.idx); 839a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 840a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 841a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid x86_shr_imm( struct x86_function *p, struct x86_reg reg, unsigned imm ) 842a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 843a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI(reg, imm); 844a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(imm == 1) 845a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 846a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xd1); 847a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 5, reg); 848a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 849a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri else 850a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 851a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xc1); 852a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 5, reg); 853a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 854a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 855a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 856a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 857a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid x86_sar_imm( struct x86_function *p, struct x86_reg reg, unsigned imm ) 858a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 859a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI(reg, imm); 860a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(imm == 1) 861a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 862a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xd1); 863a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 7, reg); 864a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 865a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri else 866a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 867a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xc1); 868a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 7, reg); 869a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 870a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 871a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 872a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 873a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid x86_shl_imm( struct x86_function *p, struct x86_reg reg, unsigned imm ) 874a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 875a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI(reg, imm); 876a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(imm == 1) 877a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 878a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xd1); 879a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 4, reg); 880a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 881a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri else 882a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 883a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0xc1); 884a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 4, reg); 885a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 886a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 887a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 888df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 889df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 890df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/*********************************************************************** 891df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * SSE instructions 892df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 893df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 89466d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwellvoid sse_prefetchnta( struct x86_function *p, struct x86_reg ptr) 89566d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell{ 89666d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell DUMP_R( ptr ); 89766d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell assert(ptr.mod != mod_REG); 89866d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell emit_2ub(p, 0x0f, 0x18); 89966d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell emit_modrm_noreg(p, 0, ptr); 90066d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell} 90166d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell 90266d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwellvoid sse_prefetch0( struct x86_function *p, struct x86_reg ptr) 90366d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell{ 90466d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell DUMP_R( ptr ); 90566d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell assert(ptr.mod != mod_REG); 90666d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell emit_2ub(p, 0x0f, 0x18); 90766d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell emit_modrm_noreg(p, 1, ptr); 90866d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell} 90966d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell 91066d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwellvoid sse_prefetch1( struct x86_function *p, struct x86_reg ptr) 91166d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell{ 91266d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell DUMP_R( ptr ); 91366d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell assert(ptr.mod != mod_REG); 91466d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell emit_2ub(p, 0x0f, 0x18); 91566d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell emit_modrm_noreg(p, 2, ptr); 91666d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell} 91766d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell 9186965532e14717f71a6f4353fb683c5070c6b7d7aKeith Whitwellvoid sse_movntps( struct x86_function *p, 9196965532e14717f71a6f4353fb683c5070c6b7d7aKeith Whitwell struct x86_reg dst, 9206965532e14717f71a6f4353fb683c5070c6b7d7aKeith Whitwell struct x86_reg src) 9216965532e14717f71a6f4353fb683c5070c6b7d7aKeith Whitwell{ 9227053f8c902e904495dffbbf6ea55f414cec780e7Keith Whitwell DUMP_RR( dst, src ); 9236965532e14717f71a6f4353fb683c5070c6b7d7aKeith Whitwell 9246965532e14717f71a6f4353fb683c5070c6b7d7aKeith Whitwell assert(dst.mod != mod_REG); 9256965532e14717f71a6f4353fb683c5070c6b7d7aKeith Whitwell assert(src.mod == mod_REG); 9266965532e14717f71a6f4353fb683c5070c6b7d7aKeith Whitwell emit_2ub(p, 0x0f, 0x2b); 9276965532e14717f71a6f4353fb683c5070c6b7d7aKeith Whitwell emit_modrm(p, src, dst); 9286965532e14717f71a6f4353fb683c5070c6b7d7aKeith Whitwell} 9296965532e14717f71a6f4353fb683c5070c6b7d7aKeith Whitwell 93066d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell 93166d4beb874606baab95fb6539de895eb373b0ccbKeith Whitwell 932df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 933df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_movss( struct x86_function *p, 934df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 935df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 936df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 93773c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 938df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xF3, X86_TWOB); 939df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x10, 0x11, dst, src ); 940df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 941df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 942df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_movaps( struct x86_function *p, 943df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 944df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 945df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 94673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 947df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, X86_TWOB); 948df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x28, 0x29, dst, src ); 949df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 950df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 951df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_movups( struct x86_function *p, 952df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 953df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 954df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 95573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 956df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, X86_TWOB); 957df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x10, 0x11, dst, src ); 958df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 959df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 960df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_movhps( struct x86_function *p, 961df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 962df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 963df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 96473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 965df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.mod != mod_REG || src.mod != mod_REG); 966df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, X86_TWOB); 967df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x16, 0x17, dst, src ); /* cf movlhps */ 968df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 969df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 970df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_movlps( struct x86_function *p, 971df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 972df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 973df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 97473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 975df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.mod != mod_REG || src.mod != mod_REG); 976df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, X86_TWOB); 977df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x12, 0x13, dst, src ); /* cf movhlps */ 978df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 979df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 980df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_maxps( struct x86_function *p, 981df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 982df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 983df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 98473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 985df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x5F); 986df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 987df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 988df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 989df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_maxss( struct x86_function *p, 990df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 991df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 992df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 99373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 994df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub(p, 0xF3, X86_TWOB, 0x5F); 995df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 996df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 997df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 998df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_divss( struct x86_function *p, 999df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1000df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1001df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 100273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1003df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub(p, 0xF3, X86_TWOB, 0x5E); 1004df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1005df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1006df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1007df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_minps( struct x86_function *p, 1008df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1009df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1010df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 101173c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1012df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x5D); 1013df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1014df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1015df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1016df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_subps( struct x86_function *p, 1017df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1018df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1019df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 102073c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1021df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x5C); 1022df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1023df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1024df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1025df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_mulps( struct x86_function *p, 1026df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1027df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1028df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 102973c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1030df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x59); 1031df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1032df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1033df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1034df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_mulss( struct x86_function *p, 1035df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1036df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1037df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 103873c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1039df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub(p, 0xF3, X86_TWOB, 0x59); 1040df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1041df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1042df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1043df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_addps( struct x86_function *p, 1044df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1045df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1046df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 104773c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1048df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x58); 1049df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1050df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1051df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1052df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_addss( struct x86_function *p, 1053df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1054df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1055df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 105673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1057df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub(p, 0xF3, X86_TWOB, 0x58); 1058df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1059df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1060df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1061df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_andnps( struct x86_function *p, 1062df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1063df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1064df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 106573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1066df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x55); 1067df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1068df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1069df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1070df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_andps( struct x86_function *p, 1071df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1072df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1073df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 107473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1075df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x54); 1076df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1077df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1078df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1079df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_rsqrtps( struct x86_function *p, 1080df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1081df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1082df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 108373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1084df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x52); 1085df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1086df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1087df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1088df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_rsqrtss( struct x86_function *p, 1089df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1090df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1091df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 109273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1093df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub(p, 0xF3, X86_TWOB, 0x52); 1094df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1095df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1096df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1097df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1098df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_movhlps( struct x86_function *p, 1099df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1100df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1101df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 110273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1103df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.mod == mod_REG && src.mod == mod_REG); 1104df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x12); 1105df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1106df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1107df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1108df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_movlhps( struct x86_function *p, 1109df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1110df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1111df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 111273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1113df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.mod == mod_REG && src.mod == mod_REG); 1114df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x16); 1115df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1116df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1117df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1118df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_orps( struct x86_function *p, 1119df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1120df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1121df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 112273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1123df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x56); 1124df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1125df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1126df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1127df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_xorps( struct x86_function *p, 1128df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1129df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1130df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 113173c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1132df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x57); 1133df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1134df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1135df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1136df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_cvtps2pi( struct x86_function *p, 1137df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1138df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1139df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 114073c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1141df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.file == file_MMX && 1142df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca (src.file == file_XMM || src.mod != mod_REG)); 1143df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1144df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->need_emms = 1; 1145df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1146df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x2d); 1147df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1148df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1149df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 11505b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwellvoid sse2_cvtdq2ps( struct x86_function *p, 11515b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell struct x86_reg dst, 11525b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell struct x86_reg src ) 11535b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell{ 115473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 11555b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell emit_2ub(p, X86_TWOB, 0x5b); 11565b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell emit_modrm( p, dst, src ); 11575b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell} 11585b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell 1159df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1160df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/* Shufps can also be used to implement a reduced swizzle when dest == 1161df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * arg0. 1162df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 1163df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_shufps( struct x86_function *p, 1164b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell struct x86_reg dst, 1165b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell struct x86_reg src, 1166df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char shuf) 1167df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 116873c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RRI( dst, src, shuf ); 1169df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0xC6); 1170b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell emit_modrm(p, dst, src); 1171df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, shuf); 1172df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1173df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 117458d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krolvoid sse_unpckhps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 117558d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol{ 117658d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol DUMP_RR( dst, src ); 117758d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol emit_2ub( p, X86_TWOB, 0x15 ); 117858d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol emit_modrm( p, dst, src ); 117958d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol} 118058d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol 118158d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krolvoid sse_unpcklps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 118258d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol{ 118358d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol DUMP_RR( dst, src ); 118458d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol emit_2ub( p, X86_TWOB, 0x14 ); 118558d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol emit_modrm( p, dst, src ); 118658d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol} 118758d3dff0d3115ddd5397b7f77b5bcf4f9ca616b6Michal Krol 1188df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_cmpps( struct x86_function *p, 1189b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell struct x86_reg dst, 1190b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell struct x86_reg src, 1191aa1a39d1a742c1bb346ba14814d6bf7b44e646cbJosé Fonseca enum sse_cc cc) 1192df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 119373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RRI( dst, src, cc ); 1194df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0xC2); 1195b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell emit_modrm(p, dst, src); 1196df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, cc); 1197df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1198df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1199df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse_pmovmskb( struct x86_function *p, 1200b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell struct x86_reg dst, 1201df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src) 1202df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 120373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1204b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell emit_3ub(p, 0x66, X86_TWOB, 0xD7); 1205b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell emit_modrm(p, dst, src); 1206df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1207df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1208e1ad38ad8e0243878ad1cf25f579a0a57e80a3adKeith Whitwellvoid sse_movmskps( struct x86_function *p, 1209e1ad38ad8e0243878ad1cf25f579a0a57e80a3adKeith Whitwell struct x86_reg dst, 1210e1ad38ad8e0243878ad1cf25f579a0a57e80a3adKeith Whitwell struct x86_reg src) 1211e1ad38ad8e0243878ad1cf25f579a0a57e80a3adKeith Whitwell{ 1212e1ad38ad8e0243878ad1cf25f579a0a57e80a3adKeith Whitwell DUMP_RR( dst, src ); 1213e1ad38ad8e0243878ad1cf25f579a0a57e80a3adKeith Whitwell emit_2ub(p, X86_TWOB, 0x50); 1214e1ad38ad8e0243878ad1cf25f579a0a57e80a3adKeith Whitwell emit_modrm(p, dst, src); 1215e1ad38ad8e0243878ad1cf25f579a0a57e80a3adKeith Whitwell} 1216e1ad38ad8e0243878ad1cf25f579a0a57e80a3adKeith Whitwell 1217df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/*********************************************************************** 1218df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * SSE2 instructions 1219df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 1220df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1221a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_movd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1222a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1223a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR(dst, src); 1224a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_2ub(p, 0x66, 0x0f); 1225a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(dst.mod == mod_REG && dst.file == file_REG32) 1226a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 1227a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, 0x7e); 1228a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm(p, src, dst); 1229a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 1230a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri else 1231a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 1232a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_op_modrm(p, 0x6e, 0x7e, dst, src); 1233a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 1234a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1235a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1236a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_movq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1237a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1238a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR(dst, src); 1239a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri switch (dst.mod) { 1240a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case mod_REG: 1241a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0xf3, 0x0f, 0x7e); 1242a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm(p, dst, src); 1243a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri break; 1244a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case mod_INDIRECT: 1245a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case mod_DISP32: 1246a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case mod_DISP8: 1247a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri assert(src.mod == mod_REG); 1248a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0xd6); 1249a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm(p, src, dst); 1250a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri break; 1251a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri default: 1252a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri assert(0); 1253a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri break; 1254a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 1255a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1256a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1257a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_movdqu( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1258a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1259a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR(dst, src); 1260a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_2ub(p, 0xf3, 0x0f); 1261a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_op_modrm(p, 0x6f, 0x7f, dst, src); 1262a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1263a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1264a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_movdqa( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1265a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1266a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR(dst, src); 1267a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_2ub(p, 0x66, 0x0f); 1268a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_op_modrm(p, 0x6f, 0x7f, dst, src); 1269a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1270a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1271a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_movsd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1272a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1273a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR(dst, src); 1274a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_2ub(p, 0xf2, 0x0f); 1275a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_op_modrm(p, 0x10, 0x11, dst, src); 1276a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1277a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1278a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_movupd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1279a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1280a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR(dst, src); 1281a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_2ub(p, 0x66, 0x0f); 1282a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_op_modrm(p, 0x10, 0x11, dst, src); 1283a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1284a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1285a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_movapd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1286a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1287a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR(dst, src); 1288a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_2ub(p, 0x66, 0x0f); 1289a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_op_modrm(p, 0x28, 0x29, dst, src); 1290a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1291a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1292df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/** 1293df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * Perform a reduced swizzle: 1294df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 1295df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse2_pshufd( struct x86_function *p, 1296b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell struct x86_reg dst, 1297b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell struct x86_reg src, 1298df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char shuf) 1299df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 130073c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RRI( dst, src, shuf ); 1301df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub(p, 0x66, X86_TWOB, 0x70); 1302b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell emit_modrm(p, dst, src); 1303df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, shuf); 1304df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1305df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1306a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_pshuflw( struct x86_function *p, 1307a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg dst, 1308a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg src, 1309a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri unsigned char shuf) 1310a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1311a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RRI( dst, src, shuf ); 1312a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0xf2, X86_TWOB, 0x70); 1313a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm(p, dst, src); 1314a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, shuf); 1315a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1316a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1317a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_pshufhw( struct x86_function *p, 1318a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg dst, 1319a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg src, 1320a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri unsigned char shuf) 1321a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1322a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RRI( dst, src, shuf ); 1323a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0xf3, X86_TWOB, 0x70); 1324a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm(p, dst, src); 1325a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, shuf); 1326a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1327a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1328df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse2_cvttps2dq( struct x86_function *p, 1329df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1330df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1331df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 133273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1333df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub( p, 0xF3, X86_TWOB, 0x5B ); 1334df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1335df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1336df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1337df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse2_cvtps2dq( struct x86_function *p, 1338df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1339df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1340df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 134173c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1342df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub(p, 0x66, X86_TWOB, 0x5B); 1343df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1344df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1345df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1346a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_cvtsd2ss( struct x86_function *p, 1347a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg dst, 1348a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg src ) 1349a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1350a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR( dst, src ); 1351a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0xf2, 0x0f, 0x5a); 1352a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm( p, dst, src ); 1353a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1354a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1355a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_cvtpd2ps( struct x86_function *p, 1356a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg dst, 1357a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri struct x86_reg src ) 1358a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1359a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR( dst, src ); 1360a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x5a); 1361a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm( p, dst, src ); 1362a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1363a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1364df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse2_packssdw( struct x86_function *p, 1365df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1366df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1367df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 136873c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1369df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub(p, 0x66, X86_TWOB, 0x6B); 1370df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1371df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1372df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1373df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse2_packsswb( struct x86_function *p, 1374df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1375df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1376df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 137773c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1378df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub(p, 0x66, X86_TWOB, 0x63); 1379df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1380df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1381df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1382df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse2_packuswb( struct x86_function *p, 1383df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1384df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1385df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 138673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1387df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub(p, 0x66, X86_TWOB, 0x67); 1388df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1389df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1390df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 13915b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwellvoid sse2_punpcklbw( struct x86_function *p, 13925b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell struct x86_reg dst, 13935b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell struct x86_reg src ) 13945b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell{ 139573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 13965b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell emit_3ub(p, 0x66, X86_TWOB, 0x60); 13975b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell emit_modrm( p, dst, src ); 13985b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell} 13995b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell 1400a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_punpcklwd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1401a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1402a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR( dst, src ); 1403a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x61); 1404a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm( p, dst, src ); 1405a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1406a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1407a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_punpckldq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1408a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1409a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR( dst, src ); 1410a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x62); 1411a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm( p, dst, src ); 1412a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1413a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1414a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_punpcklqdq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1415a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1416a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR( dst, src ); 1417a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x6c); 1418a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm( p, dst, src ); 1419a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1420a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1421a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_psllw_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1422a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1423a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI(dst, imm); 1424a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x71); 1425a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 6, dst); 1426a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 1427a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1428a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1429a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_pslld_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1430a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1431a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI(dst, imm); 1432a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x72); 1433a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 6, dst); 1434a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 1435a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1436a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1437a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_psllq_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1438a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1439a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI(dst, imm); 1440a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x73); 1441a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 6, dst); 1442a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 1443a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1444a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1445a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_psrlw_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1446a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1447a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI(dst, imm); 1448a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x71); 1449a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 2, dst); 1450a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 1451a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1452a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1453a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_psrld_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1454a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1455a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI(dst, imm); 1456a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x72); 1457a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 2, dst); 1458a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 1459a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1460a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1461a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_psrlq_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1462a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1463a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI(dst, imm); 1464a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x73); 1465a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 2, dst); 1466a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 1467a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1468a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1469a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_psraw_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1470a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1471a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI(dst, imm); 1472a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x71); 1473a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 4, dst); 1474a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 1475a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1476a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1477a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_psrad_imm( struct x86_function *p, struct x86_reg dst, unsigned imm ) 1478a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1479a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RI(dst, imm); 1480a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0x72); 1481a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm_noreg(p, 4, dst); 1482a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_1ub(p, imm); 1483a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 1484a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri 1485a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbierivoid sse2_por( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1486a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 1487a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_RR(dst, src); 1488a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_3ub(p, 0x66, 0x0f, 0xeb); 1489a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri emit_modrm(p, dst, src); 1490a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 14915b97c762ed9882dd922f48c2fbf13b14ad86a96eKeith Whitwell 1492df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse2_rcpps( struct x86_function *p, 1493df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1494df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1495df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 149673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1497df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x53); 1498df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1499df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1500df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1501df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid sse2_rcpss( struct x86_function *p, 1502df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 1503df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 1504df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 150573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1506df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_3ub(p, 0xF3, X86_TWOB, 0x53); 1507df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 1508df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1509df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1510df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/*********************************************************************** 1511df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * x87 instructions 1512df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 1513030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellstatic void note_x87_pop( struct x86_function *p ) 1514030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1515030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell p->x87_stack--; 1516030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell assert(p->x87_stack >= 0); 1517030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1518030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1519030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellstatic void note_x87_push( struct x86_function *p ) 1520030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1521030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell p->x87_stack++; 1522030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell assert(p->x87_stack <= 7); 1523030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1524030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1525030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_assert_stack_empty( struct x86_function *p ) 1526030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1527030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell assert (p->x87_stack == 0); 1528030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1529030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1530030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1531df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fist( struct x86_function *p, struct x86_reg dst ) 1532df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 153373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1534df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xdb); 1535df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm_noreg(p, 2, dst); 1536df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1537df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1538df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fistp( struct x86_function *p, struct x86_reg dst ) 1539df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 154073c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1541df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xdb); 1542df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm_noreg(p, 3, dst); 1543030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1544df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1545df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1546df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fild( struct x86_function *p, struct x86_reg arg ) 1547df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 154873c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( arg ); 1549df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xdf); 1550df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm_noreg(p, 0, arg); 1551030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_push(p); 1552df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1553df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1554df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fldz( struct x86_function *p ) 1555df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 155673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1557df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xee); 1558030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_push(p); 1559df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1560df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1561df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1562df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fldcw( struct x86_function *p, struct x86_reg arg ) 1563df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 156473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( arg ); 1565df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(arg.file == file_REG32); 1566df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(arg.mod != mod_REG); 1567df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xd9); 1568df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm_noreg(p, 5, arg); 1569df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1570df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1571df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fld1( struct x86_function *p ) 1572df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 157373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1574df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xe8); 1575030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_push(p); 1576df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1577df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1578df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fldl2e( struct x86_function *p ) 1579df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 158073c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1581df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xea); 1582030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_push(p); 1583df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1584df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1585df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fldln2( struct x86_function *p ) 1586df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 158773c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1588df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xed); 1589030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_push(p); 1590df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1591df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1592df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fwait( struct x86_function *p ) 1593df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 159473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1595df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0x9b); 1596df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1597df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1598df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fnclex( struct x86_function *p ) 1599df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 160073c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1601df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xdb, 0xe2); 1602df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1603df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1604df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fclex( struct x86_function *p ) 1605df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 1606df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca x87_fwait(p); 1607df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca x87_fnclex(p); 1608df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1609df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1610030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_fcmovb( struct x86_function *p, struct x86_reg arg ) 1611030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1612030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell DUMP_R( arg ); 1613030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell assert(arg.file == file_x87); 1614030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_2ub(p, 0xda, 0xc0+arg.idx); 1615030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1616030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1617030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_fcmove( struct x86_function *p, struct x86_reg arg ) 1618030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1619030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell DUMP_R( arg ); 1620030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell assert(arg.file == file_x87); 1621030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_2ub(p, 0xda, 0xc8+arg.idx); 1622030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1623030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1624030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_fcmovbe( struct x86_function *p, struct x86_reg arg ) 1625030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1626030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell DUMP_R( arg ); 1627030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell assert(arg.file == file_x87); 1628030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_2ub(p, 0xda, 0xd0+arg.idx); 1629030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1630030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1631030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_fcmovnb( struct x86_function *p, struct x86_reg arg ) 1632030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1633030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell DUMP_R( arg ); 1634030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell assert(arg.file == file_x87); 1635030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_2ub(p, 0xdb, 0xc0+arg.idx); 1636030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1637030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1638030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_fcmovne( struct x86_function *p, struct x86_reg arg ) 1639030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1640030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell DUMP_R( arg ); 1641030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell assert(arg.file == file_x87); 1642030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_2ub(p, 0xdb, 0xc8+arg.idx); 1643030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1644030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1645030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_fcmovnbe( struct x86_function *p, struct x86_reg arg ) 1646030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1647030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell DUMP_R( arg ); 1648030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell assert(arg.file == file_x87); 1649030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_2ub(p, 0xdb, 0xd0+arg.idx); 1650030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1651030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1652030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1653df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1654df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastatic void x87_arith_op( struct x86_function *p, struct x86_reg dst, struct x86_reg arg, 1655df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char dst0ub0, 1656df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char dst0ub1, 1657df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char arg0ub0, 1658df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char arg0ub1, 1659df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca unsigned char argmem_noreg) 1660df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 1661df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.file == file_x87); 1662df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1663df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (arg.file == file_x87) { 1664df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (dst.idx == 0) 1665df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, dst0ub0, dst0ub1+arg.idx); 1666df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else if (arg.idx == 0) 1667df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, arg0ub0, arg0ub1+arg.idx); 1668df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else 1669df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(0); 1670df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 1671df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else if (dst.idx == 0) { 1672df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(arg.file == file_REG32); 1673df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xd8); 1674df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm_noreg(p, argmem_noreg, arg); 1675df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 1676df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else 1677df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(0); 1678df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1679df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1680b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwellvoid x87_fmul( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1681df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 168273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1683b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell x87_arith_op(p, dst, src, 1684df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xd8, 0xc8, 1685df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xdc, 0xc8, 1686df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 4); 1687df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1688df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1689b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwellvoid x87_fsub( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1690df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 169173c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1692b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell x87_arith_op(p, dst, src, 1693df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xd8, 0xe0, 1694df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xdc, 0xe8, 1695df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 4); 1696df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1697df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1698b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwellvoid x87_fsubr( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1699df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 170073c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1701b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell x87_arith_op(p, dst, src, 1702df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xd8, 0xe8, 1703df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xdc, 0xe0, 1704df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 5); 1705df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1706df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1707b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwellvoid x87_fadd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1708df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 170973c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1710b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell x87_arith_op(p, dst, src, 1711df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xd8, 0xc0, 1712df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xdc, 0xc0, 1713df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0); 1714df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1715df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1716b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwellvoid x87_fdiv( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1717df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 171873c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1719b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell x87_arith_op(p, dst, src, 1720df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xd8, 0xf0, 1721df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xdc, 0xf8, 1722df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 6); 1723df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1724df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1725b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwellvoid x87_fdivr( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) 1726df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 172773c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 1728b6c9d2ef2cfadbbe3e7aa94f21fd0da36d089952Keith Whitwell x87_arith_op(p, dst, src, 1729df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xd8, 0xf8, 1730df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 0xdc, 0xf0, 1731df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 7); 1732df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1733df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1734df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fmulp( struct x86_function *p, struct x86_reg dst ) 1735df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 173673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1737df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.file == file_x87); 1738df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.idx >= 1); 1739df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xde, 0xc8+dst.idx); 1740030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1741df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1742df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1743df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fsubp( struct x86_function *p, struct x86_reg dst ) 1744df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 174573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1746df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.file == file_x87); 1747df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.idx >= 1); 1748df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xde, 0xe8+dst.idx); 1749030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1750df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1751df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1752df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fsubrp( struct x86_function *p, struct x86_reg dst ) 1753df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 175473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1755df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.file == file_x87); 1756df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.idx >= 1); 1757df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xde, 0xe0+dst.idx); 1758030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1759df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1760df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1761df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_faddp( struct x86_function *p, struct x86_reg dst ) 1762df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 176373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1764df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.file == file_x87); 1765df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.idx >= 1); 1766df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xde, 0xc0+dst.idx); 1767030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1768df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1769df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1770df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fdivp( struct x86_function *p, struct x86_reg dst ) 1771df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 177273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1773df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.file == file_x87); 1774df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.idx >= 1); 1775df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xde, 0xf8+dst.idx); 1776030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1777df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1778df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1779df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fdivrp( struct x86_function *p, struct x86_reg dst ) 1780df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 178173c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1782df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.file == file_x87); 1783df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.idx >= 1); 1784df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xde, 0xf0+dst.idx); 1785030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1786030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1787030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1788030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_ftst( struct x86_function *p ) 1789030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1790030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell DUMP(); 1791030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_2ub(p, 0xd9, 0xe4); 1792df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1793df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1794df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fucom( struct x86_function *p, struct x86_reg arg ) 1795df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 179673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( arg ); 1797df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(arg.file == file_x87); 1798df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xdd, 0xe0+arg.idx); 1799df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1800df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1801df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fucomp( struct x86_function *p, struct x86_reg arg ) 1802df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 180373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( arg ); 1804df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(arg.file == file_x87); 1805df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xdd, 0xe8+arg.idx); 1806030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1807df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1808df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1809df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fucompp( struct x86_function *p ) 1810df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 181173c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1812df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xda, 0xe9); 1813030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); /* pop twice */ 1814030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); /* pop twice */ 1815df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1816df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1817df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fxch( struct x86_function *p, struct x86_reg arg ) 1818df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 181973c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( arg ); 1820df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(arg.file == file_x87); 1821df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xc8+arg.idx); 1822df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1823df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1824df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fabs( struct x86_function *p ) 1825df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 182673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1827df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xe1); 1828df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1829df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1830df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fchs( struct x86_function *p ) 1831df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 183273c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1833df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xe0); 1834df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1835df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1836df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fcos( struct x86_function *p ) 1837df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 183873c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1839df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xff); 1840df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1841df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1842df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1843df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fprndint( struct x86_function *p ) 1844df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 184573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1846df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xfc); 1847df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1848df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1849df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fscale( struct x86_function *p ) 1850df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 185173c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1852df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xfd); 1853df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1854df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1855df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fsin( struct x86_function *p ) 1856df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 185773c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1858df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xfe); 1859df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1860df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1861df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fsincos( struct x86_function *p ) 1862df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 186373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1864df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xfb); 1865df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1866df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1867df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fsqrt( struct x86_function *p ) 1868df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 186973c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1870df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xfa); 1871df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1872df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1873df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fxtract( struct x86_function *p ) 1874df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 187573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1876df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xf4); 1877df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1878df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1879df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/* st0 = (2^st0)-1 1880df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * 1881df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * Restrictions: -1.0 <= st0 <= 1.0 1882df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 1883df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_f2xm1( struct x86_function *p ) 1884df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 188573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1886df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xf0); 1887df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1888df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1889df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/* st1 = st1 * log2(st0); 1890df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * pop_stack; 1891df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 1892df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fyl2x( struct x86_function *p ) 1893df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 189473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1895df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xf1); 1896030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1897df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1898df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1899df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/* st1 = st1 * log2(st0 + 1.0); 1900df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * pop_stack; 1901df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * 1902df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * A fast operation, with restrictions: -.29 < st0 < .29 1903df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 1904df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fyl2xp1( struct x86_function *p ) 1905df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 190673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP(); 1907df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xf9); 1908030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1909df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1910df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1911df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1912df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fld( struct x86_function *p, struct x86_reg arg ) 1913df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 191473c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( arg ); 1915df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (arg.file == file_x87) 1916df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd9, 0xc0 + arg.idx); 1917df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else { 1918df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xd9); 1919df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm_noreg(p, 0, arg); 1920df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 1921030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_push(p); 1922df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1923df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1924df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fst( struct x86_function *p, struct x86_reg dst ) 1925df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 192673c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1927df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (dst.file == file_x87) 1928df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xdd, 0xd0 + dst.idx); 1929df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else { 1930df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xd9); 1931df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm_noreg(p, 2, dst); 1932df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 1933df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1934df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1935df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fstp( struct x86_function *p, struct x86_reg dst ) 1936df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 193773c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1938df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (dst.file == file_x87) 1939df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xdd, 0xd8 + dst.idx); 1940df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else { 1941df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xd9); 1942df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm_noreg(p, 3, dst); 1943df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 1944030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1945df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1946df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1947030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_fpop( struct x86_function *p ) 1948030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1949030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell x87_fstp( p, x86_make_reg( file_x87, 0 )); 1950df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1951df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1952030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1953df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fcom( struct x86_function *p, struct x86_reg dst ) 1954df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 195573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1956df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (dst.file == file_x87) 1957df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd8, 0xd0 + dst.idx); 1958df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else { 1959df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xd8); 1960df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm_noreg(p, 2, dst); 1961df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 1962df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1963df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1964030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1965df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fcomp( struct x86_function *p, struct x86_reg dst ) 1966df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 196773c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1968df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (dst.file == file_x87) 1969df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xd8, 0xd8 + dst.idx); 1970df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else { 1971df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xd8); 1972df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm_noreg(p, 3, dst); 1973df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 1974030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1975030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1976030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1977030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_fcomi( struct x86_function *p, struct x86_reg arg ) 1978030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1979030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell DUMP_R( arg ); 1980030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_2ub(p, 0xdb, 0xf0+arg.idx); 1981030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 1982030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 1983030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_fcomip( struct x86_function *p, struct x86_reg arg ) 1984030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 1985030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell DUMP_R( arg ); 1986030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_2ub(p, 0xdb, 0xf0+arg.idx); 1987030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell note_x87_pop(p); 1988df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 1989df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1990df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1991df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x87_fnstsw( struct x86_function *p, struct x86_reg dst ) 1992df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 199373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_R( dst ); 1994df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.file == file_REG32); 1995df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 1996df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (dst.idx == reg_AX && 1997df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca dst.mod == mod_REG) 1998df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0xdf, 0xe0); 1999df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca else { 2000df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, 0xdd); 2001df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm_noreg(p, 7, dst); 2002df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca } 2003df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2004df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2005df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2006030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwellvoid x87_fnstcw( struct x86_function *p, struct x86_reg dst ) 2007030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell{ 2008030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell DUMP_R( dst ); 2009030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell assert(dst.file == file_REG32); 2010030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 2011030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_1ub(p, 0x9b); /* WAIT -- needed? */ 2012030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_1ub(p, 0xd9); 2013030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell emit_modrm_noreg(p, 7, dst); 2014030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell} 2015030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 2016030af06691bc5bc82ca141a576da7a2edffe9d1cKeith Whitwell 2017df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2018df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2019df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/*********************************************************************** 2020df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * MMX instructions 2021df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 2022df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2023df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid mmx_emms( struct x86_function *p ) 2024df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 2025a945420ae6f96f0d7024f97e37ffd31329865a84Keith Whitwell DUMP(); 2026df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(p->need_emms); 2027df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, 0x0f, 0x77); 2028df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->need_emms = 0; 2029df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2030df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2031df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid mmx_packssdw( struct x86_function *p, 2032df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 2033df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 2034df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 203573c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 2036df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.file == file_MMX && 2037df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca (src.file == file_MMX || src.mod != mod_REG)); 2038df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2039df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->need_emms = 1; 2040df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2041df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x6b); 2042df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 2043df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2044df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2045df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid mmx_packuswb( struct x86_function *p, 2046df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 2047df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 2048df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 204973c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 2050df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca assert(dst.file == file_MMX && 2051df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca (src.file == file_MMX || src.mod != mod_REG)); 2052df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2053df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->need_emms = 1; 2054df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2055df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_2ub(p, X86_TWOB, 0x67); 2056df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_modrm( p, dst, src ); 2057df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2058df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2059df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid mmx_movd( struct x86_function *p, 2060df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 2061df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 2062df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 206373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 2064df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->need_emms = 1; 2065df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, X86_TWOB); 2066df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x6e, 0x7e, dst, src ); 2067df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2068df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2069df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid mmx_movq( struct x86_function *p, 2070df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg dst, 2071df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca struct x86_reg src ) 2072df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 207373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_RR( dst, src ); 2074df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->need_emms = 1; 2075df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_1ub(p, X86_TWOB); 2076df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca emit_op_modrm( p, 0x6f, 0x7f, dst, src ); 2077df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2078df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2079df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2080df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca/*********************************************************************** 2081df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca * Helper functions 2082df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca */ 2083df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2084df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 20856b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwellvoid x86_cdecl_caller_push_regs( struct x86_function *p ) 20866b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell{ 20876b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell x86_push(p, x86_make_reg(file_REG32, reg_AX)); 20886b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell x86_push(p, x86_make_reg(file_REG32, reg_CX)); 20896b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell x86_push(p, x86_make_reg(file_REG32, reg_DX)); 20906b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell} 20916b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell 20926b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwellvoid x86_cdecl_caller_pop_regs( struct x86_function *p ) 20936b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell{ 20946b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell x86_pop(p, x86_make_reg(file_REG32, reg_DX)); 20956b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell x86_pop(p, x86_make_reg(file_REG32, reg_CX)); 20966b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell x86_pop(p, x86_make_reg(file_REG32, reg_AX)); 20976b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell} 20986b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell 20996b3723ee8d084a1abbc971b21c58f7c1e66949a7Keith Whitwell 2100df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecastruct x86_reg x86_fn_arg( struct x86_function *p, 2101a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri unsigned arg ) 2102df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 2103a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri switch(x86_target(p)) 2104a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 2105a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case X86_64_WIN64_ABI: 2106a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri /* Microsoft uses a different calling convention than the rest of the world */ 2107a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri switch(arg) 2108a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 2109a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case 1: 2110a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_reg(file_REG32, reg_CX); 2111a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case 2: 2112a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_reg(file_REG32, reg_DX); 2113a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case 3: 2114a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_reg(file_REG32, reg_R8); 2115a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case 4: 2116a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_reg(file_REG32, reg_R9); 2117a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri default: 2118c54dea66fd86f6000e334c703ea4890179c39c81Luca Barbieri /* Win64 allocates stack slots as if it pushed the first 4 arguments too */ 2119a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_disp(x86_make_reg(file_REG32, reg_SP), 2120c54dea66fd86f6000e334c703ea4890179c39c81Luca Barbieri p->stack_offset + arg * 8); 2121a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 2122a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case X86_64_STD_ABI: 2123a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri switch(arg) 2124a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri { 2125a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case 1: 2126a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_reg(file_REG32, reg_DI); 2127a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case 2: 2128a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_reg(file_REG32, reg_SI); 2129a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case 3: 2130a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_reg(file_REG32, reg_DX); 2131a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case 4: 2132a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_reg(file_REG32, reg_CX); 2133a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case 5: 2134a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_reg(file_REG32, reg_R8); 2135a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case 6: 2136a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_reg(file_REG32, reg_R9); 2137a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri default: 2138a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_disp(x86_make_reg(file_REG32, reg_SP), 2139a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->stack_offset + (arg - 6) * 8); /* ??? */ 2140a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 2141a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri case X86_32: 2142a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri return x86_make_disp(x86_make_reg(file_REG32, reg_SP), 2143df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->stack_offset + arg * 4); /* ??? */ 2144a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri default: 2145b5df19492322cbe3a61d45981111fd862772f427Brian Paul assert(0 && "Unexpected x86 target ABI in x86_fn_arg"); 2146b5df19492322cbe3a61d45981111fd862772f427Brian Paul return x86_make_reg(file_REG32, reg_CX); /* not used / silence warning */ 2147a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri } 2148df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2149df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2150a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieristatic void x86_init_func_common( struct x86_function *p ) 2151a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri{ 2152a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri util_cpu_detect(); 2153a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->caps = 0; 2154a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(util_cpu_caps.has_mmx) 2155a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->caps |= X86_MMX; 2156a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(util_cpu_caps.has_mmx2) 2157a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->caps |= X86_MMX2; 2158a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(util_cpu_caps.has_sse) 2159a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->caps |= X86_SSE; 2160a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(util_cpu_caps.has_sse2) 2161a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->caps |= X86_SSE2; 2162a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(util_cpu_caps.has_sse3) 2163a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->caps |= X86_SSE3; 2164a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri if(util_cpu_caps.has_sse4_1) 2165a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->caps |= X86_SSE4_1; 2166a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri p->csr = p->store; 2167a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri DUMP_START(); 2168a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri} 2169df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2170df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_init_func( struct x86_function *p ) 2171df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 2172df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->size = 0; 2173df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->store = NULL; 2174a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri x86_init_func_common(p); 2175df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2176df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2177df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_init_func_size( struct x86_function *p, unsigned code_size ) 2178df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 2179df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->size = code_size; 218039ea0308425ad04618061129c63c22ac0efb0692José Fonseca p->store = rtasm_exec_malloc(code_size); 2181b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell if (p->store == NULL) { 2182b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell p->store = p->error_overflow; 2183b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell } 2184a3e6e50544de74558ceb7cd4b618c350cdef36c6Luca Barbieri x86_init_func_common(p); 2185df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2186df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2187df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86_release_func( struct x86_function *p ) 2188df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 2189b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell if (p->store && p->store != p->error_overflow) 2190b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell rtasm_exec_free(p->store); 2191b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell 2192df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->store = NULL; 2193df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->csr = NULL; 2194df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca p->size = 0; 2195df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2196df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2197df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2198f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paulstatic INLINE x86_func 2199f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paulvoidptr_to_x86_func(void *v) 2200f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul{ 2201f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul union { 2202f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul void *v; 2203f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul x86_func f; 2204f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul } u; 2205f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul assert(sizeof(u.v) == sizeof(u.f)); 2206f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul u.v = v; 2207f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul return u.f; 2208f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul} 2209f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul 2210f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul 2211f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paulx86_func x86_get_func( struct x86_function *p ) 2212df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 221373c2711bb186692b866720058a09f5eb05950213Keith Whitwell DUMP_END(); 2214df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca if (DISASSEM && p->store) 221539ea0308425ad04618061129c63c22ac0efb0692José Fonseca debug_printf("disassemble %p %p\n", p->store, p->csr); 2216b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell 2217b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell if (p->store == p->error_overflow) 2218f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul return voidptr_to_x86_func(NULL); 2219b17e123a8f20239e8e1fc6816ccf115d9ec57471Keith Whitwell else 2220f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul return voidptr_to_x86_func(p->store); 2221df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2222df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2223df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca#else 2224df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2225f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paulvoid x86sse_dummy( void ); 2226f667526016dd1710fafd50eb09ac2c5c5b36063eBrian Paul 2227df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonsecavoid x86sse_dummy( void ) 2228df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca{ 2229df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca} 2230df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca 2231df8ab3140ce05599e1dc983ac211a30fc845d9b5José Fonseca#endif 2232