/******************************************************************************
 * Copyright (c) 2004, 2008 IBM Corporation
 * All rights reserved.
 * This program and the accompanying materials
 * are made available under the terms of the BSD License
 * which accompanies this distribution, and is available at
 * http://www.opensource.org/licenses/bsd-license.php
 *
 * Contributors:
 *     IBM Corporation - initial implementation
 *****************************************************************************/


// This file contains the implementation of the Forth code words specific
// to PowerPC64.  Some of this is 970-only.

// 970-specific CPU registers.
// Don't use on P7 !
PRIM(HID0_X21)
	unsigned long hid0 = TOS.u;
	asm volatile("sync ; mtspr 1008,%0 ; mfspr %0,1008 ; mfspr %0,1008 ; mfspr %0,1008 ; mfspr %0,1008 ; mfspr %0,1008 ; mfspr %0,1008" : "+r"(hid0));
	POP;
MIRP

PRIM(HID0_X40)
	PUSH;
	asm volatile("mfspr %0,1008" : "=r"(TOS));
MIRP

PRIM(HID1_X21)
	unsigned long hid1 = TOS.u;
	asm volatile("mtspr 1009,%0 ; mtspr 1009,%0 ; isync" : : "r"(hid1));
	POP;
MIRP

PRIM(HID1_X40)
	PUSH;
	asm volatile("mfspr %0,1009" : "=r"(TOS));
MIRP

PRIM(HID4_X21)
	unsigned long hid4 = TOS.u;
	asm volatile("sync ; mtspr 1012,%0 ; isync" : : "r"(hid4));
	POP;
MIRP

PRIM(HID4_X40)
	PUSH;
	asm volatile("mfspr %0,1012" : "=r"(TOS));
MIRP

PRIM(HID5_X21)
	unsigned long hid5 = TOS.u;
	asm volatile("mtspr 1014,%0" : : "r"(hid5));
	POP;
MIRP

PRIM(HID5_X40)
	PUSH;
	asm volatile("mfspr %0,1014" : "=r"(TOS));
MIRP

// PowerPC special registers.
PRIM(MSR_X21)
	unsigned long msr = TOS.u;
	asm volatile("mtmsrd %0" : : "r"(msr));
	POP;
MIRP

PRIM(MSR_X40)
	PUSH;
	asm volatile("mfmsr %0" : "=r"(TOS));
MIRP

PRIM(SDR1_X21)
	unsigned long sdr1 = TOS.u;
	asm volatile("mtsdr1 %0" : : "r"(sdr1));
	POP;
MIRP

PRIM(SDR1_X40)
	PUSH;
	asm volatile("mfsdr1 %0" : "=r"(TOS));
MIRP

PRIM(PVR_X40)
	PUSH;
	asm volatile("mfpvr %0" : "=r"(TOS));
MIRP

PRIM(PIR_X40)
	PUSH;
	asm volatile("mfspr %0,1023" : "=r"(TOS));
MIRP

PRIM(TBL_X40)
	PUSH;
	asm volatile("mftbl %0" : "=r"(TOS));
MIRP

PRIM(TBU_X40)
	PUSH;
	asm volatile("mftbu %0" : "=r"(TOS));
MIRP

PRIM(DABR_X21)
	unsigned long dabr = TOS.u;
	asm volatile("mtspr 1013,%0" : : "r"(dabr));
	POP;
MIRP

PRIM(DABR_X40)
	PUSH;
	asm volatile("mfspr %0,1013" : "=r"(TOS));
MIRP

PRIM(HIOR_X21)
	unsigned long dabr = TOS.u;
	asm volatile("mtspr 311,%0" : : "r"(dabr));
	POP;
MIRP

PRIM(HIOR_X40)
	PUSH;
	asm volatile("mfspr %0,311" : "=r"(TOS));
MIRP



PRIM(SPRG0_X21)
	unsigned long sprg0 = TOS.u;
	asm volatile("mtsprg0 %0" : "+r"(sprg0));
	POP;
MIRP

PRIM(SPRG0_X40)
	PUSH;
	asm volatile("mfsprg0 %0" : "=r"(TOS));
MIRP

PRIM(SPRG1_X21)
	unsigned long sprg1 = TOS.u;
	asm volatile("mtsprg1 %0" : "+r"(sprg1));
	POP;
MIRP

PRIM(SPRG1_X40)
	PUSH;
	asm volatile("mfsprg1 %0" : "=r"(TOS));
MIRP

PRIM(SPRG2_X21)
	unsigned long sprg2 = TOS.u;
	asm volatile("mtsprg2 %0" : "+r"(sprg2));
	POP;
MIRP

PRIM(SPRG2_X40)
	PUSH;
	asm volatile("mfsprg2 %0" : "=r"(TOS));
MIRP

PRIM(SPRG3_X21)
	unsigned long sprg3 = TOS.u;
	asm volatile("mtsprg3 %0" : "+r"(sprg3));
	POP;
MIRP

PRIM(SPRG3_X40)
	PUSH;
	asm volatile("mfsprg3 %0" : "=r"(TOS));
MIRP

PRIM(HSPRG0_X21)
	unsigned long hsprg0 = TOS.u;
	asm volatile("mtspr 304,%0" : "+r"(hsprg0));
	POP;
MIRP

PRIM(HSPRG0_X40)
	PUSH;
	asm volatile("mfspr %0,304" : "=r"(TOS));
MIRP

PRIM(HSPRG1_X21)
	unsigned long hsprg1 = TOS.u;
	asm volatile("mtspr 305,%0" : "+r"(hsprg1));
	POP;
MIRP

PRIM(HSPRG1_X40)
	PUSH;
	asm volatile("mfspr %0,305" : "=r"(TOS));
MIRP


PRIM(MMCR0_X21)
	unsigned long mmcr0 = TOS.u;
	asm volatile("sync ; mtspr 795,%0 ; isync" : : "r"(mmcr0));
	POP;
MIRP

PRIM(PMC1_X40)
	PUSH;
	asm volatile("sync ; mfspr %0,787" : "=r"(TOS));
MIRP

PRIM(ICBI)
	asm volatile("dcbst 0,%0 ; sync ; icbi 0,%0 ; sync ; isync" : : "r"(TOS));
	POP;
MIRP

// Call into the client program.
PRIM(JUMP_X2d_CLIENT)
	TOS.u = call_client(TOS);
MIRP


// Hang.  Useful for debugging, believe it or not.
PRIM(CRASH)
	for (;;) ;
MIRP

PRIM(START_X2d_RTAS)
	cell e = TOS; POP;
	cell p1 = TOS; POP;
	cell p0 = TOS;
	TOS.u = call_c(p0, p1, (cell)0UL, e);
MIRP

PRIM(CALL_X2d_C)
	cell e = TOS; POP;
	cell p2 = TOS; POP;
	cell p1 = TOS; POP;
	cell p0 = TOS;
	TOS.u = call_c(p0, p1, p2, e);
MIRP

PRIM(FLUSHCACHE)
	type_u n = TOS.u; POP;
	unsigned char* p = TOS.a; POP;
	flush_cache(p, n);	
MIRP

PRIM(DEC_X21)
	unsigned long dec = TOS.u;
	asm volatile("mtdec %0" : "+r"(dec));
	POP;
MIRP

PRIM(DEC_X40)
	PUSH;
	asm volatile("mfdec %0" : "=r"(TOS));
MIRP

PRIM(BM_X2d_ALLOCATOR_X2d_INIT)
	unsigned long blocksize = TOS.u; POP;
	unsigned long size = TOS.u; POP;
	unsigned long start = TOS.u;
	TOS.u = SLOF_bm_allocator_init(start, size, blocksize);
MIRP

PRIM(BM_X2d_ALLOC)
	unsigned long size = TOS.u; POP;
	unsigned long handle = TOS.u;
	TOS.u = SLOF_bm_alloc(handle, size);
MIRP

PRIM(BM_X2d_FREE)
	unsigned long size = TOS.u; POP;
	unsigned long addr = TOS.u; POP;
	unsigned long handle = TOS.u; POP;
	SLOF_bm_free(handle, addr, size);
MIRP