|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * MC68000 emulation - machine dependent bits
5: *
6: * Copyright 1996 Bernd Schmidt
7: */
8:
9:
10: struct flag_struct {
11: unsigned int c:1; /* first byte */
12: int :5;
13: unsigned int z:1;
14: unsigned int n:1;
15: int :3; /* second, third & fourth byte */
16: unsigned int v:1;
17: int :20;
18: unsigned int x:1; /* fifth */
19: int :31;
20: };
21:
22: extern struct flag_struct regflags __asm__ ("regflags");
23:
24: #define ZFLG (regflags.z)
25: #define NFLG (regflags.n)
26: #define CFLG (regflags.c)
27: #define VFLG (regflags.v)
28: #define XFLG (regflags.x)
29:
30: static __inline__ int cctrue(const int cc)
31: {
32: switch(cc){
33: case 0: return 1; /* T */
34: case 1: return 0; /* F */
35: case 2: return !CFLG && !ZFLG; /* HI */
36: case 3: return CFLG || ZFLG; /* LS */
37: case 4: return !CFLG; /* CC */
38: case 5: return CFLG; /* CS */
39: case 6: return !ZFLG; /* NE */
40: case 7: return ZFLG; /* EQ */
41: case 8: return !VFLG; /* VC */
42: case 9: return VFLG; /* VS */
43: case 10:return !NFLG; /* PL */
44: case 11:return NFLG; /* MI */
45: case 12:return NFLG == VFLG; /* GE */
46: case 13:return NFLG != VFLG; /* LT */
47: case 14:return !ZFLG && (NFLG == VFLG); /* GT */
48: case 15:return ZFLG || (NFLG != VFLG); /* LE */
49: }
50: abort();
51: return 0;
52: }
53:
1.1.1.2 ! root 54: #define x86_flag_testl(v) \
! 55: __asm__ __volatile__ ("testl %1,%1\n\t" \
! 56: "pushfl\n\t" \
! 57: "popl %0\n\t" \
! 58: "movl %0,regflags\n" \
! 59: : "=r" (scratch) : "r" (v) : "cc")
! 60:
! 61: #define x86_flag_testw(v) \
! 62: __asm__ __volatile__ ("testw %w1,%w1\n\t" \
! 63: "pushfl\n\t" \
! 64: "popl %0\n\t" \
! 65: "movl %0,regflags\n" \
! 66: : "=r" (scratch) : "r" (v) : "cc")
! 67:
! 68: #define x86_flag_testb(v) \
! 69: __asm__ __volatile__ ("testb %b1,%b1\n\t" \
! 70: "pushfl\n\t" \
! 71: "popl %0\n\t" \
! 72: "movl %0,regflags\n" \
! 73: : "=r" (scratch) : "q" (v) : "cc")
! 74:
! 75: #define x86_flag_addl(v, s, d) \
! 76: __asm__ __volatile__ ("addl %k2,%k1\n\t" \
! 77: "pushfl\n\t" \
! 78: "popl %0\n\t" \
! 79: "movl %0,regflags\n\t" \
! 80: "movl %0,regflags+4\n" \
! 81: : "=r" (scratch), "=r" (v) : "rmi" (s), "1" (d) : "cc")
! 82:
! 83: #define x86_flag_addw(v, s, d) \
! 84: __asm__ __volatile__ ("addw %w2,%w1\n\t" \
! 85: "pushfl\n\t" \
! 86: "popl %0\n\t" \
! 87: "movl %0,regflags\n\t" \
! 88: "movl %0,regflags+4\n" \
! 89: : "=r" (scratch), "=r" (v) : "rmi" (s), "1" (d) : "cc")
! 90:
! 91: #define x86_flag_addb(v, s, d) \
! 92: __asm__ __volatile__ ("addb %b2,%b1\n\t" \
! 93: "pushfl\n\t" \
! 94: "popl %0\n\t" \
! 95: "movl %0,regflags\n\t" \
! 96: "movl %0,regflags+4\n" \
! 97: : "=r" (scratch), "=q" (v) : "qmi" (s), "1" (d) : "cc")
! 98:
! 99: #define x86_flag_subl(v, s, d) \
! 100: __asm__ __volatile__ ("subl %k2,%k1\n\t" \
! 101: "pushfl\n\t" \
! 102: "popl %0\n\t" \
! 103: "movl %0,regflags\n\t" \
! 104: "movl %0,regflags+4\n" \
! 105: : "=r" (scratch), "=r" (v) : "rmi" (s), "1" (d) : "cc")
! 106:
! 107: #define x86_flag_subw(v, s, d) \
! 108: __asm__ __volatile__ ("subw %w2,%w1\n\t" \
! 109: "pushfl\n\t" \
! 110: "popl %0\n\t" \
! 111: "movl %0,regflags\n\t" \
! 112: "movl %0,regflags+4\n" \
! 113: : "=r" (scratch), "=r" (v) : "rmi" (s), "1" (d) : "cc")
! 114:
! 115: #define x86_flag_subb(v, s, d) \
! 116: __asm__ __volatile__ ("subb %b2,%b1\n\t" \
! 117: "pushfl\n\t" \
! 118: "popl %0\n\t" \
! 119: "movl %0,regflags\n\t" \
! 120: "movl %0,regflags+4\n" \
! 121: : "=r" (scratch), "=q" (v) : "qmi" (s), "1" (d) : "cc")
! 122:
! 123: #define x86_flag_cmpl(s, d) \
! 124: __asm__ __volatile__ ("cmpl %k1,%k2\n\t" \
! 125: "pushfl\n\t" \
! 126: "popl %0\n\t" \
! 127: "movl %0,regflags\n" \
! 128: : "=r" (scratch) : "rmi" (s), "r" (d) : "cc")
! 129:
! 130: #define x86_flag_cmpw(s, d) \
! 131: __asm__ __volatile__ ("cmpw %w1,%w2\n\t" \
! 132: "pushfl\n\t" \
! 133: "popl %0\n\t" \
! 134: "movl %0,regflags\n" \
! 135: : "=r" (scratch) : "rmi" (s), "r" (d) : "cc")
! 136:
! 137: #define x86_flag_cmpb(s, d) \
! 138: __asm__ __volatile__ ("cmpb %b1,%b2\n\t" \
! 139: "pushfl\n\t" \
! 140: "popl %0\n\t" \
! 141: "movl %0,regflags\n" \
! 142: : "=r" (scratch) : "qmi" (s), "q" (d) : "cc")
! 143:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.