|
|
1.1.1.5 ! root 1: /* 1.1 root 2: * UAE - The Un*x Amiga Emulator 1.1.1.5 ! root 3: * 1.1 root 4: * Memory access functions 5: * 6: * Copyright 1996 Bernd Schmidt 7: */ 8: 1.1.1.4 root 9: STATIC_INLINE uae_u32 do_get_mem_long (uae_u32 *a) 1.1 root 10: { 11: uae_u32 retval; 12: 1.1.1.3 root 13: __asm__ ("bswap %0" : "=r" (retval) : "0" (*a) : "cc"); 1.1 root 14: return retval; 15: } 16: 1.1.1.4 root 17: STATIC_INLINE uae_u32 do_get_mem_word (uae_u16 *a) 1.1 root 18: { 19: uae_u32 retval; 20: 21: #ifdef X86_PPRO_OPT 1.1.1.3 root 22: __asm__ ("movzwl %w1,%k0\n\tshll $16,%k0\n\tbswap %k0\n" : "=&r" (retval) : "m" (*a) : "cc"); 1.1 root 23: #else 24: __asm__ ("xorl %k0,%k0\n\tmovw %w1,%w0\n\trolw $8,%w0" : "=&r" (retval) : "m" (*a) : "cc"); 25: #endif 26: return retval; 27: } 28: 29: #define do_get_mem_byte(a) ((uae_u32)*((uae_u8 *)a)) 30: 1.1.1.4 root 31: STATIC_INLINE void do_put_mem_long (uae_u32 *a, uae_u32 v) 1.1 root 32: { 1.1.1.3 root 33: __asm__ ("bswap %0" : "=r" (v) : "0" (v) : "cc"); 1.1 root 34: *a = v; 35: } 36: 1.1.1.4 root 37: STATIC_INLINE void do_put_mem_word (uae_u16 *a, uae_u32 v) 1.1 root 38: { 39: #ifdef X86_PPRO_OPT 1.1.1.3 root 40: __asm__ ("bswap %0" : "=&r" (v) : "0" (v << 16) : "cc"); 1.1 root 41: #else 1.1.1.3 root 42: __asm__ ("rolw $8,%w0" : "=r" (v) : "0" (v) : "cc"); 1.1 root 43: #endif 44: *a = v; 45: } 46: 47: #define do_put_mem_byte(a,v) (*(uae_u8 *)(a) = (v)) 48: 49: #if 0 1.1.1.4 root 50: STATIC_INLINE uae_u32 call_mem_get_func(mem_get_func func, uae_cptr addr) 1.1 root 51: { 52: uae_u32 result; 1.1.1.2 root 53: __asm__("call %1" 1.1 root 54: : "=a" (result) : "r" (func), "a" (addr) : "cc", "edx", "ecx"); 55: return result; 56: } 57: 1.1.1.4 root 58: STATIC_INLINE void call_mem_put_func(mem_put_func func, uae_cptr addr, uae_u32 v) 1.1 root 59: { 1.1.1.2 root 60: __asm__("call %2" 1.1 root 61: : : "a" (addr), "d" (v), "r" (func) : "cc", "eax", "edx", "ecx", "memory"); 62: } 63: #else 64: 65: #define call_mem_get_func(func,addr) ((*func)(addr)) 66: #define call_mem_put_func(func,addr,v) ((*func)(addr,v)) 67: 68: #endif 69: 70: #undef NO_INLINE_MEMORY_ACCESS 71: #undef MD_HAVE_MEM_1_FUNCS 72: 73: #ifdef MD_HAVE_MEM_1_FUNCS 1.1.1.4 root 74: STATIC_INLINE uae_u32 longget_1 (uae_cptr addr) 1.1 root 75: { 76: uae_u32 result; 77: 78: __asm__ ("andl $0x00FFFFFF,%1\n" 79: "\tcmpb $0,(%1,%3)\n" 80: "\tleal 1f,%%ecx\n" 81: "\tje longget_stub\n" 82: "\taddl address_space,%1\n" 83: "\tmovl (%1),%0\n" 1.1.1.3 root 84: "\tbswap %0\n" 1.1 root 85: "\t1:" 86: : "=c" (result), "=d" (addr) : "1" (addr), "r" (good_address_map) : "cc"); 87: return result; 88: } 1.1.1.4 root 89: STATIC_INLINE uae_u32 wordget_1 (uae_cptr addr) 1.1 root 90: { 91: uae_u32 result; 92: 93: __asm__ ("andl $0x00FFFFFF,%1\n" 94: "\tcmpb $0,(%1,%3)\n" 95: "\tleal 1f,%%ecx\n" 96: "\tje wordget_stub\n" 97: "\taddl address_space,%1\n" 98: "\tmovzwl (%1),%0\n" 99: "\trolw $8,%w0\n" 100: "\t1:" 101: : "=c" (result), "=d" (addr) : "1" (addr), "r" (good_address_map) : "cc"); 102: return result; 103: } 1.1.1.5 ! root 104: STATIC_INLINE uae_u32 byteget_1 (uae_cptr addr) 1.1 root 105: { 106: uae_u32 result; 107: 108: __asm__ ("andl $0x00FFFFFF,%1\n" 109: "\tcmpb $0,(%1,%3)\n" 110: "\tleal 1f,%%ecx\n" 111: "\tje byteget_stub\n" 112: "\taddl address_space,%1\n" 113: "\tmovzbl (%1),%0\n" 114: "\t1:" 115: : "=c" (result), "=d" (addr) : "1" (addr), "r" (good_address_map) : "cc"); 116: return result; 117: } 1.1.1.4 root 118: STATIC_INLINE void longput_1 (uae_cptr addr, uae_u32 l) 1.1 root 119: { 120: __asm__ __volatile__("andl $0x00FFFFFF,%0\n" 121: "\tcmpb $0,(%0,%3)\n" 122: "\tleal 1f,%%ecx\n" 123: "\tje longput_stub\n" 124: "\taddl address_space,%0\n" 1.1.1.3 root 125: "\tbswap %1\n" 1.1 root 126: "\tmovl %1,(%0)\n" 127: "\t1:" 128: : "=d" (addr), "=b" (l) : "0" (addr), "r" (good_address_map), "1" (l) : "cc", "memory", "ecx"); 129: } 1.1.1.4 root 130: STATIC_INLINE void wordput_1 (uae_cptr addr, uae_u32 w) 1.1 root 131: { 132: __asm__ __volatile__("andl $0x00FFFFFF,%0\n" 133: "\tcmpb $0,(%0,%3)\n" 134: "\tleal 1f,%%ecx\n" 135: "\tje wordput_stub\n" 136: "\taddl address_space,%0\n" 137: "\trolw $8,%1\n" 138: "\tmovw %w1,(%0)\n" 139: "\t1:" 140: : "=d" (addr), "=b" (w) : "0" (addr), "r" (good_address_map), "1" (w) : "cc", "memory", "ecx"); 141: } 1.1.1.4 root 142: STATIC_INLINE void byteput_1 (uae_cptr addr, uae_u32 b) 1.1 root 143: { 144: __asm__ __volatile__("andl $0x00FFFFFF,%0\n" 145: "\tcmpb $0,(%0,%3)\n" 146: "\tleal 1f,%%ecx\n" 147: "\tje byteput_stub\n" 148: "\taddl address_space,%0\n" 149: "\tmovb %b1,(%0)\n" 150: "\t1:" 151: : "=d" (addr), "=b" (b) : "0" (addr), "r" (good_address_map), "1" (b) : "cc", "memory", "ecx"); 152: } 153: 154: #endif 155: 156: #define ALIGN_POINTER_TO32(p) ((~(unsigned long)(p)) & 3) 157: 158: /* Not the best place for this, but then there's no good place for a kludge 159: * like this... */ 160: #define HAVE_UAE_U24 161: typedef struct { 162: unsigned char a, b, c; 163: } __attribute__ ((packed)) uae_u24; 164: 1.1.1.4 root 165: STATIC_INLINE uae_u24 uae24_convert (uae_u32 v) 1.1 root 166: { 167: return *(uae_u24 *)&v; 168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.