Annotation of uae/src/md-i386-linux/memory.h, revision 1.1

1.1     ! root        1:  /* 
        !             2:   * UAE - The Un*x Amiga Emulator
        !             3:   * 
        !             4:   * Memory access functions
        !             5:   *
        !             6:   * Copyright 1996 Bernd Schmidt
        !             7:   */
        !             8: 
        !             9: 
        !            10: static __inline__ ULONG do_get_mem_long(ULONG *a)
        !            11: {
        !            12:     ULONG retval;
        !            13: 
        !            14:     __asm__ ("bswapl %0" : "=r" (retval) : "0" (*a) : "cc");
        !            15:     return retval;
        !            16: }
        !            17: 
        !            18: static __inline__ ULONG do_get_mem_word(UWORD *a)
        !            19: {
        !            20:     ULONG retval;
        !            21: 
        !            22:     __asm__ ("xorl %k0,%k0\n\tmovw %w1,%w0\n\trolw $8,%w0" : "=&r" (retval) : "m" (*a) : "cc");
        !            23:     return retval;
        !            24: }
        !            25: 
        !            26: static __inline__ UBYTE do_get_mem_byte(UBYTE *a)
        !            27: {
        !            28:     return *a;
        !            29: }
        !            30: 
        !            31: static __inline__ void do_put_mem_long(ULONG *a, ULONG v)
        !            32: {
        !            33:     __asm__ ("bswapl %0" : "=r" (v) : "0" (v) : "cc");
        !            34:     *a = v;
        !            35: }
        !            36: 
        !            37: static __inline__ void do_put_mem_word(UWORD *a, UWORD v)
        !            38: {
        !            39:     __asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc");
        !            40:     *a = v;
        !            41: }
        !            42: 
        !            43: static __inline__ void do_put_mem_byte(UBYTE *a, UBYTE v)
        !            44: {
        !            45:     *a = v;
        !            46: }
        !            47: 
        !            48: #if 0
        !            49: static __inline__ ULONG call_mem_get_func(mem_get_func func, CPTR addr)
        !            50: {
        !            51:     ULONG result;
        !            52:     __asm__("call *%1"
        !            53:            : "=a" (result) : "r" (func), "a" (addr) : "cc", "edx", "ecx");
        !            54:     return result;
        !            55: }
        !            56: 
        !            57: static __inline__ void call_mem_put_func(mem_put_func func, CPTR addr, ULONG v)
        !            58: {
        !            59:     __asm__("call *%2"
        !            60:            : : "a" (addr), "d" (v), "r" (func) : "cc", "eax", "edx", "ecx", "memory");
        !            61: }
        !            62: #else
        !            63: 
        !            64: #define call_mem_get_func(func,addr) ((*func)(addr))
        !            65: #define call_mem_put_func(func,addr,v) ((*func)(addr,v))
        !            66: 
        !            67: #endif
        !            68: 
        !            69: #undef USE_MAPPED_MEMORY
        !            70: 
        !            71: #if USER_PROGRAMS_BEHAVE > 0
        !            72: #define USE_MAPPED_MEMORY
        !            73: #endif
        !            74: 
        !            75: #define CAN_MAP_MEMORY
        !            76: #undef NO_INLINE_MEMORY_ACCESS
        !            77: #undef MD_HAVE_MEM_1_FUNCS
        !            78: 
        !            79: 
        !            80: #if defined(MEMFUNCS_DIRECT_REQUESTED) && USER_PROGRAMS_BEHAVE > 0
        !            81: 
        !            82: #define MD_HAVE_MEM_1_FUNCS
        !            83: 
        !            84: #if USER_PROGRAMS_BEHAVE > 1
        !            85: #define MAYBE_MASK_ADDR_24BIT(a) (a)
        !            86: #else
        !            87: #define MAYBE_MASK_ADDR_24BIT(a) ((a) & 0xFFFFFF)
        !            88: #endif
        !            89: 
        !            90: static __inline__ ULONG longget_1(CPTR addr) { return do_get_mem_long ((ULONG *)(address_space + MAYBE_MASK_ADDR_24BIT(addr))); }
        !            91: static __inline__ ULONG wordget_1(CPTR addr) { return do_get_mem_word ((UWORD *)(address_space + MAYBE_MASK_ADDR_24BIT(addr))); }
        !            92: static __inline__ ULONG byteget_1(CPTR addr) { return do_get_mem_byte (address_space + MAYBE_MASK_ADDR_24BIT(addr)); }
        !            93: static __inline__ void longput_1(CPTR addr, ULONG l) { do_put_mem_long ((ULONG*)(address_space + MAYBE_MASK_ADDR_24BIT(addr)), l); }
        !            94: static __inline__ void wordput_1(CPTR addr, ULONG w) { do_put_mem_word ((UWORD *)(address_space + MAYBE_MASK_ADDR_24BIT(addr)), w); }
        !            95: static __inline__ void byteput_1(CPTR addr, ULONG b) { do_put_mem_byte (address_space + MAYBE_MASK_ADDR_24BIT(addr), b); }
        !            96: 
        !            97: #define DIRECT_MEMFUNCS_SUCCESSFUL
        !            98: 
        !            99: #else /* ! MEMFUNCS_DIRECT_REQUESTED */
        !           100: 
        !           101: #ifdef MD_HAVE_MEM_1_FUNCS
        !           102: 
        !           103: #define alongget_1 longget_1
        !           104: #define awordget_1 wordget_1
        !           105: 
        !           106: static __inline__ ULONG longget_1(CPTR addr)
        !           107: {
        !           108:     ULONG result;
        !           109: 
        !           110:     __asm__ ("andl $0x00FFFFFF,%1\n"
        !           111:             "\tcmpb $0,(%1,%3)\n"
        !           112:             "\tleal 1f,%%ecx\n"
        !           113:             "\tje longget_stub\n"
        !           114:             "\taddl address_space,%1\n"
        !           115:             "\tmovl (%1),%0\n"
        !           116:             "\tbswapl %0\n"
        !           117:             "\t1:"
        !           118:             : "=c" (result), "=d" (addr) : "1" (addr), "r" (good_address_map) : "cc");
        !           119:     return result;
        !           120: }
        !           121: static __inline__ ULONG wordget_1(CPTR addr)
        !           122: {
        !           123:     ULONG result;
        !           124: 
        !           125:     __asm__ ("andl $0x00FFFFFF,%1\n"
        !           126:             "\tcmpb $0,(%1,%3)\n"
        !           127:             "\tleal 1f,%%ecx\n"
        !           128:             "\tje wordget_stub\n"
        !           129:             "\taddl address_space,%1\n"
        !           130:             "\tmovzwl (%1),%0\n"
        !           131:             "\trolw $8,%w0\n"
        !           132:             "\t1:"
        !           133:             : "=c" (result), "=d" (addr) : "1" (addr), "r" (good_address_map) : "cc");
        !           134:     return result;
        !           135: }
        !           136: static __inline__ ULONG byteget_1(CPTR addr) 
        !           137: {
        !           138:     ULONG result;
        !           139: 
        !           140:     __asm__ ("andl $0x00FFFFFF,%1\n"
        !           141:             "\tcmpb $0,(%1,%3)\n"
        !           142:             "\tleal 1f,%%ecx\n"
        !           143:             "\tje byteget_stub\n"
        !           144:             "\taddl address_space,%1\n"
        !           145:             "\tmovzbl (%1),%0\n"
        !           146:             "\t1:"
        !           147:             : "=c" (result), "=d" (addr) : "1" (addr), "r" (good_address_map) : "cc");
        !           148:     return result;
        !           149: }
        !           150: static __inline__ void longput_1(CPTR addr, ULONG l)
        !           151: {
        !           152:     __asm__ __volatile__("andl $0x00FFFFFF,%0\n"
        !           153:             "\tcmpb $0,(%0,%3)\n"
        !           154:             "\tleal 1f,%%ecx\n"
        !           155:             "\tje longput_stub\n"
        !           156:             "\taddl address_space,%0\n"
        !           157:             "\tbswapl %1\n"
        !           158:             "\tmovl %1,(%0)\n"
        !           159:             "\t1:"
        !           160:             : "=d" (addr), "=b" (l) : "0" (addr), "r" (good_address_map), "1" (l) : "cc", "memory", "ecx");
        !           161: }
        !           162: static __inline__ void wordput_1(CPTR addr, ULONG w)
        !           163: {
        !           164:     __asm__ __volatile__("andl $0x00FFFFFF,%0\n"
        !           165:             "\tcmpb $0,(%0,%3)\n"
        !           166:             "\tleal 1f,%%ecx\n"
        !           167:             "\tje wordput_stub\n"
        !           168:             "\taddl address_space,%0\n"
        !           169:             "\trolw $8,%1\n"
        !           170:             "\tmovw %w1,(%0)\n"
        !           171:             "\t1:"
        !           172:             : "=d" (addr), "=b" (w) : "0" (addr), "r" (good_address_map), "1" (w) : "cc", "memory", "ecx");
        !           173: }
        !           174: static __inline__ void byteput_1(CPTR addr, ULONG b)
        !           175: {
        !           176:     __asm__ __volatile__("andl $0x00FFFFFF,%0\n"
        !           177:             "\tcmpb $0,(%0,%3)\n"
        !           178:             "\tleal 1f,%%ecx\n"
        !           179:             "\tje byteput_stub\n"
        !           180:             "\taddl address_space,%0\n"
        !           181:             "\tmovb %b1,(%0)\n"
        !           182:             "\t1:"
        !           183:             : "=d" (addr), "=b" (b) : "0" (addr), "r" (good_address_map), "1" (b) : "cc", "memory", "ecx");
        !           184: }
        !           185: 
        !           186: #endif
        !           187: 
        !           188: #endif /* ! MEMFUNCS_DIRECT_REQUESTED */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.