mirror of
				https://github.com/hedge-dev/XenonRecomp.git
				synced 2025-10-30 07:11:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			324 lines
		
	
	
	
		
			7.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			324 lines
		
	
	
	
		
			7.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| #include <cstdint>
 | |
| #include <cstdlib>
 | |
| #include <cmath>
 | |
| 
 | |
| #ifdef __clang__
 | |
| #include <x86intrin.h>
 | |
| #define __restrict __restrict__
 | |
| #define _byteswap_ushort __builtin_bswap16
 | |
| #define _byteswap_ulong __builtin_bswap32
 | |
| #define _byteswap_uint64 __builtin_bswap64
 | |
| #define isnan __builtin_isnan
 | |
| #define PPC_FUNC __attribute__((weak,noinline))
 | |
| #else
 | |
| #include <intrin.h>
 | |
| #define PPC_FUNC __declspec(noinline)
 | |
| #endif
 | |
| 
 | |
| #define PPC_LOAD_U8(x) *(uint8_t*)(base + (x))
 | |
| #define PPC_LOAD_U16(x) _byteswap_ushort(*(uint16_t*)(base + (x)))
 | |
| #define PPC_LOAD_U32(x) _byteswap_ulong(*(uint32_t*)(base + (x)))
 | |
| #define PPC_LOAD_U64(x) _byteswap_uint64(*(uint64_t*)(base + (x)))
 | |
| 
 | |
| #define PPC_STORE_U8(x, y) *(uint8_t*)(base + (x)) = (y)
 | |
| #define PPC_STORE_U16(x, y) *(uint16_t*)(base + (x)) = _byteswap_ushort(y)
 | |
| #define PPC_STORE_U32(x, y) *(uint32_t*)(base + (x)) = _byteswap_ulong(y)
 | |
| #define PPC_STORE_U64(x, y) *(uint64_t*)(base + (x)) = _byteswap_uint64(y)
 | |
| 
 | |
| typedef void PPCFunc(struct PPCContext& __restrict ctx, uint8_t* base);
 | |
| 
 | |
| struct PPCRegister
 | |
| {
 | |
|     union
 | |
|     {
 | |
|         int8_t s8;
 | |
|         uint8_t u8;
 | |
|         int16_t s16;
 | |
|         uint16_t u16;
 | |
|         int32_t s32;
 | |
|         uint32_t u32;
 | |
|         int64_t s64;
 | |
|         uint64_t u64;
 | |
|         float f32;
 | |
|         double f64;
 | |
|     };
 | |
| };
 | |
| 
 | |
| struct PPCXERRegister
 | |
| {
 | |
|     uint8_t so;
 | |
|     uint8_t ov;
 | |
|     uint8_t ca;
 | |
| };
 | |
| 
 | |
| struct PPCCRRegister
 | |
| {
 | |
|     uint8_t lt;
 | |
|     uint8_t gt;
 | |
|     uint8_t eq;
 | |
|     union
 | |
|     {
 | |
|         uint8_t so;
 | |
|         uint8_t un;
 | |
|     };
 | |
| 
 | |
|     template<typename T>
 | |
|     void compare(T left, T right, const PPCXERRegister& xer)
 | |
|     {
 | |
|         lt = left < right;
 | |
|         gt = left > right;
 | |
|         eq = left == right;
 | |
|         so = xer.so;
 | |
|     }
 | |
| 
 | |
|     void compare(double left, double right)
 | |
|     {
 | |
|         lt = left < right;
 | |
|         gt = left > right;
 | |
|         eq = left == right;
 | |
|         un = isnan(left) || isnan(right);
 | |
|     }
 | |
| };
 | |
| 
 | |
| typedef float float128[4];
 | |
| 
 | |
| struct PPCContext
 | |
| {
 | |
|     PPCFunc** fn;
 | |
|     uint64_t lr;
 | |
|     uint64_t ctr;
 | |
|     PPCXERRegister xer;
 | |
| 
 | |
|     union
 | |
|     {
 | |
|         struct
 | |
|         {
 | |
|             PPCCRRegister cr0;
 | |
|             PPCCRRegister cr1;
 | |
|             PPCCRRegister cr2;
 | |
|             PPCCRRegister cr3;
 | |
|             PPCCRRegister cr4;
 | |
|             PPCCRRegister cr5;
 | |
|             PPCCRRegister cr6;
 | |
|             PPCCRRegister cr7;
 | |
|         };
 | |
|         PPCCRRegister cr[8];
 | |
|     };
 | |
| 
 | |
|     union
 | |
|     {
 | |
|         struct
 | |
|         {
 | |
|             PPCRegister r0;
 | |
|             PPCRegister r1;
 | |
|             PPCRegister r2;
 | |
|             PPCRegister r3;
 | |
|             PPCRegister r4;
 | |
|             PPCRegister r5;
 | |
|             PPCRegister r6;
 | |
|             PPCRegister r7;
 | |
|             PPCRegister r8;
 | |
|             PPCRegister r9;
 | |
|             PPCRegister r10;
 | |
|             PPCRegister r11;
 | |
|             PPCRegister r12;
 | |
|             PPCRegister r13;
 | |
|             PPCRegister r14;
 | |
|             PPCRegister r15;
 | |
|             PPCRegister r16;
 | |
|             PPCRegister r17;
 | |
|             PPCRegister r18;
 | |
|             PPCRegister r19;
 | |
|             PPCRegister r20;
 | |
|             PPCRegister r21;
 | |
|             PPCRegister r22;
 | |
|             PPCRegister r23;
 | |
|             PPCRegister r24;
 | |
|             PPCRegister r25;
 | |
|             PPCRegister r26;
 | |
|             PPCRegister r27;
 | |
|             PPCRegister r28;
 | |
|             PPCRegister r29;
 | |
|             PPCRegister r30;
 | |
|             PPCRegister r31;
 | |
|         };
 | |
|         PPCRegister r[32];
 | |
|     };
 | |
| 
 | |
|     union
 | |
|     {
 | |
|         struct
 | |
|         {
 | |
|             PPCRegister f0;
 | |
|             PPCRegister f1;
 | |
|             PPCRegister f2;
 | |
|             PPCRegister f3;
 | |
|             PPCRegister f4;
 | |
|             PPCRegister f5;
 | |
|             PPCRegister f6;
 | |
|             PPCRegister f7;
 | |
|             PPCRegister f8;
 | |
|             PPCRegister f9;
 | |
|             PPCRegister f10;
 | |
|             PPCRegister f11;
 | |
|             PPCRegister f12;
 | |
|             PPCRegister f13;
 | |
|             PPCRegister f14;
 | |
|             PPCRegister f15;
 | |
|             PPCRegister f16;
 | |
|             PPCRegister f17;
 | |
|             PPCRegister f18;
 | |
|             PPCRegister f19;
 | |
|             PPCRegister f20;
 | |
|             PPCRegister f21;
 | |
|             PPCRegister f22;
 | |
|             PPCRegister f23;
 | |
|             PPCRegister f24;
 | |
|             PPCRegister f25;
 | |
|             PPCRegister f26;
 | |
|             PPCRegister f27;
 | |
|             PPCRegister f28;
 | |
|             PPCRegister f29;
 | |
|             PPCRegister f30;
 | |
|             PPCRegister f31;
 | |
|         };
 | |
|         PPCRegister f[32];
 | |
|     };
 | |
| 
 | |
|     union
 | |
|     {
 | |
|         struct
 | |
|         {
 | |
|             float128 v0;
 | |
|             float128 v1;
 | |
|             float128 v2;
 | |
|             float128 v3;
 | |
|             float128 v4;
 | |
|             float128 v5;
 | |
|             float128 v6;
 | |
|             float128 v7;
 | |
|             float128 v8;
 | |
|             float128 v9;
 | |
|             float128 v10;
 | |
|             float128 v11;
 | |
|             float128 v12;
 | |
|             float128 v13;
 | |
|             float128 v14;
 | |
|             float128 v15;
 | |
|             float128 v16;
 | |
|             float128 v17;
 | |
|             float128 v18;
 | |
|             float128 v19;
 | |
|             float128 v20;
 | |
|             float128 v21;
 | |
|             float128 v22;
 | |
|             float128 v23;
 | |
|             float128 v24;
 | |
|             float128 v25;
 | |
|             float128 v26;
 | |
|             float128 v27;
 | |
|             float128 v28;
 | |
|             float128 v29;
 | |
|             float128 v30;
 | |
|             float128 v31;
 | |
|             float128 v32;
 | |
|             float128 v33;
 | |
|             float128 v34;
 | |
|             float128 v35;
 | |
|             float128 v36;
 | |
|             float128 v37;
 | |
|             float128 v38;
 | |
|             float128 v39;
 | |
|             float128 v40;
 | |
|             float128 v41;
 | |
|             float128 v42;
 | |
|             float128 v43;
 | |
|             float128 v44;
 | |
|             float128 v45;
 | |
|             float128 v46;
 | |
|             float128 v47;
 | |
|             float128 v48;
 | |
|             float128 v49;
 | |
|             float128 v50;
 | |
|             float128 v51;
 | |
|             float128 v52;
 | |
|             float128 v53;
 | |
|             float128 v54;
 | |
|             float128 v55;
 | |
|             float128 v56;
 | |
|             float128 v57;
 | |
|             float128 v58;
 | |
|             float128 v59;
 | |
|             float128 v60;
 | |
|             float128 v61;
 | |
|             float128 v62;
 | |
|             float128 v63;
 | |
|             float128 v64;
 | |
|             float128 v65;
 | |
|             float128 v66;
 | |
|             float128 v67;
 | |
|             float128 v68;
 | |
|             float128 v69;
 | |
|             float128 v70;
 | |
|             float128 v71;
 | |
|             float128 v72;
 | |
|             float128 v73;
 | |
|             float128 v74;
 | |
|             float128 v75;
 | |
|             float128 v76;
 | |
|             float128 v77;
 | |
|             float128 v78;
 | |
|             float128 v79;
 | |
|             float128 v80;
 | |
|             float128 v81;
 | |
|             float128 v82;
 | |
|             float128 v83;
 | |
|             float128 v84;
 | |
|             float128 v85;
 | |
|             float128 v86;
 | |
|             float128 v87;
 | |
|             float128 v88;
 | |
|             float128 v89;
 | |
|             float128 v90;
 | |
|             float128 v91;
 | |
|             float128 v92;
 | |
|             float128 v93;
 | |
|             float128 v94;
 | |
|             float128 v95;
 | |
|             float128 v96;
 | |
|             float128 v97;
 | |
|             float128 v98;
 | |
|             float128 v99;
 | |
|             float128 v100;
 | |
|             float128 v101;
 | |
|             float128 v102;
 | |
|             float128 v103;
 | |
|             float128 v104;
 | |
|             float128 v105;
 | |
|             float128 v106;
 | |
|             float128 v107;
 | |
|             float128 v108;
 | |
|             float128 v109;
 | |
|             float128 v110;
 | |
|             float128 v111;
 | |
|             float128 v112;
 | |
|             float128 v113;
 | |
|             float128 v114;
 | |
|             float128 v115;
 | |
|             float128 v116;
 | |
|             float128 v117;
 | |
|             float128 v118;
 | |
|             float128 v119;
 | |
|             float128 v120;
 | |
|             float128 v121;
 | |
|             float128 v122;
 | |
|             float128 v123;
 | |
|             float128 v124;
 | |
|             float128 v125;
 | |
|             float128 v126;
 | |
|             float128 v127;
 | |
|         };
 | |
|         float128 v[128];
 | |
|     };
 | |
| };
 | 
