PPC repairs
This commit is contained in:
parent
8c5e215876
commit
dd700b8430
|
@ -1578,7 +1578,7 @@ static int common4b(mz_jit_state *jitter, void *_data)
|
|||
CHECK_LIMIT();
|
||||
if (i == 2) {
|
||||
refno = _jit.x.pc;
|
||||
jit_movi_p(JIT_R0, scheme_false);
|
||||
(void)jit_movi_p(JIT_R0, scheme_false);
|
||||
mz_epilog(JIT_V1);
|
||||
CHECK_LIMIT();
|
||||
} else
|
||||
|
@ -1637,13 +1637,13 @@ static int common4b(mz_jit_state *jitter, void *_data)
|
|||
ref3 = jit_beqr_p(jit_forward(), JIT_R2, JIT_V1);
|
||||
|
||||
mz_get_local_p(JIT_V1, JIT_LOCAL3);
|
||||
jit_jmpi(refloop);
|
||||
(void)jit_jmpi(refloop);
|
||||
|
||||
/* Success! */
|
||||
mz_patch_branch(ref3);
|
||||
|
||||
if (i == 2) {
|
||||
jit_movi_p(JIT_R0, scheme_true);
|
||||
(void)jit_movi_p(JIT_R0, scheme_true);
|
||||
} else {
|
||||
if (i == 1) {
|
||||
/* pop second argument, which we don't need */
|
||||
|
@ -2278,7 +2278,7 @@ static int common10(mz_jit_state *jitter, void *_data)
|
|||
mz_epilog(JIT_R2);
|
||||
|
||||
refno = _jit.x.pc;
|
||||
jit_movi_p(JIT_R0, scheme_false);
|
||||
(void)jit_movi_p(JIT_R0, scheme_false);
|
||||
mz_epilog(JIT_R2);
|
||||
|
||||
/* R1 has fixnum ... check non-negative and them proc type */
|
||||
|
@ -2309,7 +2309,7 @@ static int common10(mz_jit_state *jitter, void *_data)
|
|||
(void)jit_finish(sjc.check_arity_code);
|
||||
jit_retval(JIT_R0);
|
||||
(void)jit_beqi_i(refno, JIT_R0, 0);
|
||||
jit_movi_p(JIT_R0, scheme_true);
|
||||
(void)jit_movi_p(JIT_R0, scheme_true);
|
||||
mz_epilog(JIT_R2);
|
||||
CHECK_LIMIT();
|
||||
|
||||
|
@ -2321,14 +2321,14 @@ static int common10(mz_jit_state *jitter, void *_data)
|
|||
jit_ldxi_s(JIT_R0, JIT_R0, &SCHEME_CLOSURE_DATA_FLAGS(((Scheme_Closure_Data *)0x0)));
|
||||
ref_nc = jit_bmsi_i(jit_forward(), JIT_R0, CLOS_HAS_REST);
|
||||
(void)jit_bner_i(refno, JIT_V1, JIT_R2);
|
||||
jit_movi_p(JIT_R0, scheme_true);
|
||||
(void)jit_movi_p(JIT_R0, scheme_true);
|
||||
mz_epilog(JIT_R2);
|
||||
CHECK_LIMIT();
|
||||
/* has rest arg: */
|
||||
mz_patch_branch(ref_nc);
|
||||
jit_subi_i(JIT_R2, JIT_R2, 1);
|
||||
(void)jit_bltr_i(refno, JIT_V1, JIT_R2);
|
||||
jit_movi_p(JIT_R0, scheme_true);
|
||||
(void)jit_movi_p(JIT_R0, scheme_true);
|
||||
mz_epilog(JIT_R2);
|
||||
CHECK_LIMIT();
|
||||
|
||||
|
@ -2342,7 +2342,7 @@ static int common10(mz_jit_state *jitter, void *_data)
|
|||
(void)jit_bgtr_i(refno, JIT_V1, JIT_R2);
|
||||
CHECK_LIMIT();
|
||||
|
||||
jit_movi_p(JIT_R0, scheme_true);
|
||||
(void)jit_movi_p(JIT_R0, scheme_true);
|
||||
mz_epilog(JIT_R2);
|
||||
|
||||
__END_SHORT_JUMPS__(1);
|
||||
|
|
|
@ -123,6 +123,31 @@ static MZ_INLINE int mzrt_cas(volatile size_t *addr, size_t old, size_t new_val)
|
|||
: "m"(*addr), "r" (new_val), "a"(old)
|
||||
: "memory");
|
||||
return (int) result;
|
||||
# elif defined(__POWERPC__) || defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) \
|
||||
|| defined(__powerpc64__) || defined(__ppc64__)
|
||||
size_t oldval;
|
||||
int result = 0;
|
||||
# if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__)
|
||||
# define CAS_I_SIZE "d"
|
||||
# else
|
||||
# define CAS_I_SIZE "w"
|
||||
# endif
|
||||
/* This code is based on Boehm GC's libatomic */
|
||||
__asm__ __volatile__(
|
||||
"1:l" CAS_I_SIZE "arx %0,0,%2\n" /* load and reserve */
|
||||
"cmpw %0, %4\n" /* if load is not equal to */
|
||||
"bne 2f\n" /* old, fail */
|
||||
"st" CAS_I_SIZE "cx. %3,0,%2\n" /* else store conditional */
|
||||
"bne- 1b\n" /* retry if lost reservation */
|
||||
"li %1,1\n" /* result = 1; */
|
||||
"2:\n"
|
||||
: "=&r"(oldval), "=&r"(result)
|
||||
: "r"(addr), "r"(new_val), "r"(old), "1"(result)
|
||||
: "memory", "cc");
|
||||
|
||||
return result;
|
||||
# else
|
||||
# error mzrt_cas not defined on this platform
|
||||
# endif
|
||||
|
||||
#elif defined(__GNUC__) && !defined(__INTEL_COMPILER)
|
||||
|
|
|
@ -204,7 +204,7 @@ static void inform_GC(int master_gc, int major_gc, intptr_t pre_used, intptr_t p
|
|||
THREAD_LOCAL_DECL(static volatile short delayed_break_ready);
|
||||
THREAD_LOCAL_DECL(static Scheme_Thread *main_break_target_thread);
|
||||
|
||||
THREAD_LOCAL_DECL(Scheme_Sleep_Proc scheme_place_sleep_);
|
||||
THREAD_LOCAL_DECL(Scheme_Sleep_Proc scheme_place_sleep);
|
||||
HOOK_SHARED_OK void (*scheme_sleep)(float seconds, void *fds);
|
||||
HOOK_SHARED_OK void (*scheme_notify_multithread)(int on);
|
||||
HOOK_SHARED_OK void (*scheme_wakeup_on_input)(void *fds);
|
||||
|
|
Loading…
Reference in New Issue
Block a user