1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
/*
===========================================================================
Copyright (C) 2008 Przemyslaw Iskra <sparky@pld-linux.org>
This file is part of Quake III Arena source code.
Quake III Arena source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
Quake III Arena source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Quake III Arena source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
#ifndef VM_POWERPC_ASM_H
#define VM_POWERPC_ASM_H
/*
* Register information according to:
* http://refspecs.freestandards.org/elf/elfspec_ppc.pdf
*/
#define r0 0 // volatile
#define r1 1 // caller safe ( stack pointer )
#define r2 2 // reserved
#define r3 3 // callee safe
#define r4 4 // callee safe
#define r5 5 // callee safe
#define r6 6 // callee safe
#define r7 7 // callee safe
#define r8 8 // callee safe
#define r9 9 // callee safe
#define r10 10 // callee safe
#define r11 11 // volatile
#define r12 12 // volatile
#define r13 13 // reserved ( small data area )
#define r14 14 // caller safe
#define r15 15 // caller safe
#define r16 16 // caller safe
#define r17 17 // caller safe
#define r18 18 // caller safe
#define r19 19 // caller safe
#define r20 20 // caller safe
#define r21 21 // caller safe
#define r22 22 // caller safe
#define r23 23 // caller safe
#define r24 24 // caller safe
#define r25 25 // caller safe
#define r26 26 // caller safe
#define r27 27 // caller safe
#define r28 28 // caller safe
#define r29 29 // caller safe
#define r30 30 // caller safe
#define r31 31 // caller safe ( environment pointers )
#define f0 0 // callee safe
#define f1 1 // callee safe
#define f2 2 // callee safe
#define f3 3 // callee safe
#define f4 4 // callee safe
#define f5 5 // callee safe
#define f6 6 // callee safe
#define f7 7 // callee safe
#define f8 8 // callee safe
#define f9 9 // callee safe
#define f10 10 // callee safe
#define f11 11 // callee safe
#define f12 12 // callee safe
#define f13 13 // callee safe
#define f14 14 // caller safe
#define f15 15 // caller safe
#define f16 16 // caller safe
#define f17 17 // caller safe
#define f18 18 // caller safe
#define f19 19 // caller safe
#define f20 20 // caller safe
#define f21 21 // caller safe
#define f22 22 // caller safe
#define f23 23 // caller safe
#define f24 24 // caller safe
#define f25 25 // caller safe
#define f26 26 // caller safe
#define f27 27 // caller safe
#define f28 28 // caller safe
#define f29 29 // caller safe
#define f30 30 // caller safe
#define f31 31 // caller safe
#define cr0 0 // volatile
#define cr1 1 // volatile
#define cr2 2 // caller safe
#define cr3 3 // caller safe
#define cr4 4 // caller safe
#define cr5 5 // volatile
#define cr6 6 // volatile
#define cr7 7 // volatile
#define lt 0
#define gt 1
#define eq 2
#define so 3
// branch bo field values
#define branchLikely 1
#define branchFalse 4
#define branchTrue 12
#define branchAlways 20
// branch extensions (change branch type)
#define branchExtLink 0x0001
/*
* This list must match exactly the powerpc_opcodes list from vm_powerpc_asm.c
* If you're changing the original list remember to regenerate this one. You
* may do so using this perl script:
perl -p -e 'BEGIN{%t=("-"=>m=>"+"=>p=>"."=>d=>);$l=""}$o=0 if/^}/;
if($o && s/^{ "(.*?)([\.+-])?".+/i\U$1\E$t{$2}/s){$_.="_" while$l{$_};
$l{$_}=1;if(length $l.$_ > 70){$s=$_;$_="\t$l\n";$l="$s,"}else
{$l.=" $_,";$_=undef}}else{$o=1 if/powerpc_opcodes.*=/;$_=undef};
END{print "\t$l\n"}' < vm_powerpc_asm.c
*/
typedef enum powerpc_iname {
iCMPLWI, iCMPWI, iCMPW, iCMPLW, iFCMPU, iLI, iLIS, iADDI, iADDIS,
iBLTm, iBC, iBCL, iB, iBL, iBLR, iBCTR, iBCTRL, iRLWINM, iNOP, iORI,
iXORIS, iLDX, iLWZX, iSLW, iAND, iSUB, iLBZX, iNEG, iNOT, iSTWX, iSTBX,
iMULLW, iADD, iLHZX, iXOR, iMFLR, iSTHX, iMR, iOR, iDIVWU, iMTLR,
iMTCTR, iDIVW, iLFSX, iSRW, iSTFSX, iSRAW, iEXTSH, iEXTSB, iLWZ, iLBZ,
iSTW, iSTWU, iSTB, iLHZ, iSTH, iLFS, iLFD, iSTFS, iSTFD, iLD, iFDIVS,
iFSUBS, iFADDS, iFMULS, iSTD, iSTDU, iFRSP, iFCTIWZ, iFSUB, iFNEG,
} powerpc_iname_t;
#include <stdint.h>
typedef uint32_t ppc_instruction_t;
extern ppc_instruction_t
asm_instruction( powerpc_iname_t, const int, const long int * );
#define IN( inst, args... ) \
({\
const long int argv[] = { args };\
const int argc = sizeof( argv ) / sizeof( argv[0] ); \
asm_instruction( inst, argc, argv );\
})
#endif
|