|
|
1.1 ! root 1: /*** Integer load ***/ ! 2: #define SPARC_LD_OP(name, qp) \ ! 3: void OPPROTO glue(glue(op_, name), MEMSUFFIX)(void) \ ! 4: { \ ! 5: T1 = (target_ulong)glue(qp, MEMSUFFIX)(T0); \ ! 6: } ! 7: ! 8: #define SPARC_LD_OP_S(name, qp) \ ! 9: void OPPROTO glue(glue(op_, name), MEMSUFFIX)(void) \ ! 10: { \ ! 11: T1 = (target_long)glue(qp, MEMSUFFIX)(T0); \ ! 12: } ! 13: ! 14: #define SPARC_ST_OP(name, op) \ ! 15: void OPPROTO glue(glue(op_, name), MEMSUFFIX)(void) \ ! 16: { \ ! 17: glue(op, MEMSUFFIX)(T0, T1); \ ! 18: } ! 19: ! 20: SPARC_LD_OP(ld, ldl); ! 21: SPARC_LD_OP(ldub, ldub); ! 22: SPARC_LD_OP(lduh, lduw); ! 23: SPARC_LD_OP_S(ldsb, ldsb); ! 24: SPARC_LD_OP_S(ldsh, ldsw); ! 25: ! 26: /*** Integer store ***/ ! 27: SPARC_ST_OP(st, stl); ! 28: SPARC_ST_OP(stb, stb); ! 29: SPARC_ST_OP(sth, stw); ! 30: ! 31: void OPPROTO glue(op_std, MEMSUFFIX)(void) ! 32: { ! 33: glue(stl, MEMSUFFIX)(T0, T1); ! 34: glue(stl, MEMSUFFIX)((T0 + 4), T2); ! 35: } ! 36: ! 37: void OPPROTO glue(op_ldstub, MEMSUFFIX)(void) ! 38: { ! 39: T1 = glue(ldub, MEMSUFFIX)(T0); ! 40: glue(stb, MEMSUFFIX)(T0, 0xff); /* XXX: Should be Atomically */ ! 41: } ! 42: ! 43: void OPPROTO glue(op_swap, MEMSUFFIX)(void) ! 44: { ! 45: target_ulong tmp = glue(ldl, MEMSUFFIX)(T0); ! 46: glue(stl, MEMSUFFIX)(T0, T1); /* XXX: Should be Atomically */ ! 47: T1 = tmp; ! 48: } ! 49: ! 50: void OPPROTO glue(op_ldd, MEMSUFFIX)(void) ! 51: { ! 52: T1 = glue(ldl, MEMSUFFIX)(T0); ! 53: T0 = glue(ldl, MEMSUFFIX)((T0 + 4)); ! 54: } ! 55: ! 56: /*** Floating-point store ***/ ! 57: void OPPROTO glue(op_stf, MEMSUFFIX) (void) ! 58: { ! 59: glue(stfl, MEMSUFFIX)(T0, FT0); ! 60: } ! 61: ! 62: void OPPROTO glue(op_stdf, MEMSUFFIX) (void) ! 63: { ! 64: glue(stfq, MEMSUFFIX)(T0, DT0); ! 65: } ! 66: ! 67: /*** Floating-point load ***/ ! 68: void OPPROTO glue(op_ldf, MEMSUFFIX) (void) ! 69: { ! 70: FT0 = glue(ldfl, MEMSUFFIX)(T0); ! 71: } ! 72: ! 73: void OPPROTO glue(op_lddf, MEMSUFFIX) (void) ! 74: { ! 75: DT0 = glue(ldfq, MEMSUFFIX)(T0); ! 76: } ! 77: ! 78: #ifdef TARGET_SPARC64 ! 79: /* XXX: Should be Atomically */ ! 80: /* XXX: There are no cas[x] instructions, only cas[x]a */ ! 81: void OPPROTO glue(op_cas, MEMSUFFIX)(void) ! 82: { ! 83: uint32_t tmp; ! 84: ! 85: tmp = glue(ldl, MEMSUFFIX)(T0); ! 86: T2 &= 0xffffffffULL; ! 87: if (tmp == (T1 & 0xffffffffULL)) { ! 88: glue(stl, MEMSUFFIX)(T0, T2); ! 89: } ! 90: T2 = tmp; ! 91: } ! 92: ! 93: void OPPROTO glue(op_casx, MEMSUFFIX)(void) ! 94: { ! 95: uint64_t tmp; ! 96: ! 97: // XXX ! 98: tmp = (uint64_t)glue(ldl, MEMSUFFIX)(T0) << 32; ! 99: tmp |= glue(ldl, MEMSUFFIX)(T0); ! 100: if (tmp == T1) { ! 101: glue(stq, MEMSUFFIX)(T0, T2); ! 102: } ! 103: T2 = tmp; ! 104: } ! 105: ! 106: void OPPROTO glue(op_ldsw, MEMSUFFIX)(void) ! 107: { ! 108: T1 = (int64_t)(glue(ldl, MEMSUFFIX)(T0) & 0xffffffff); ! 109: } ! 110: ! 111: SPARC_LD_OP(ldx, ldq); ! 112: SPARC_ST_OP(stx, stq); ! 113: #endif ! 114: #undef MEMSUFFIX
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.