commit 5e5442e6bf058c1f8b7b9674ae008670cdadeae2
parent 4e77e2893bf01a51a32326effbac1f0ef3610cbd
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Thu, 27 Mar 2014 18:49:20 +0100
Add reverse enginnering of the intermediate code of Solid C
I like how this guy did this code, so I want to use it as base
for the intermediate code I am going to write.
Diffstat:
A | opcode.txt | | | 133 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 133 insertions(+), 0 deletions(-)
diff --git a/opcode.txt b/opcode.txt
@@ -0,0 +1,133 @@
+Ax -> automatic variable number x
+Tx -> static variable number x
+Gx -> global variable with name x
+Xx -> global function with name x
+Yx -> static function with name x
+Lx -> label number x
+Px -> parameter number x
+Mx -> member number x
+
+@ -> content of variable
+#x -> size of type x (R, I, C, W, N, Z, Q, H, Sx, Ux)
+#x -> integer constant of value x
+##x -> float constant of value x
+#%x -> long constant of value x
+" -> begin of string, each element is coded in decimal and comma (better in hexa!!)
+a -> take address
+:x -> assign of type x
++x -> sum of type x
+-x -> substraction of type x
+*x -> multiplication of type x
+/x -> division of type x
+; -> used in post operators (A2++ -> A2 #1 ;+I)
+: -> used in pre operators (++A2 -> A2 #1 :+I)
+. -> struct field
+_x -> sign negation of type x
+~x -> logic negation of type x
+%x -> modulo of type x
+lx -> left shift of type x
+rx -> right shift of type x
+>x -> greater than of type x
+<x -> less than of type x
+[x -> less or equal of type x
+]x -> greater or equal of type x
+=x -> equal of type x
+!x -> not equal of type x
+&x -> logical and of type x
+|x -> logical or of type x
+^x -> logical exor of type x
+m -> and (last two stack values)
+s -> or (last two stack values)
+` -> index array (*(val1 + val2))
+:yx -> operation y and assign of type x
+:x -> assign of type x
+?x -> ternary of type x (cond val1 val2)
+cx -> call to function of type x
+px -> pass parameter to function of type x
+Fx -> x number of parameters passed in a function call
+, -> comma operator (last two stack values)
+d -> begin of loop
+b -> end of loop
+j -> jump (next stack value is the label)
+yx -> return of type x
+ex -> switch of type x
+w -> case (next stack value is label and next is value)
+n -> no operation (it is used in ! and in for conditions)
+E -> no operation (it is used to mark end of function declaration)
+
+Conversions:
+----------
+Sx -> struct number x
+Ux -> union number x
+Vx -> vector number x
+R -> pointer
+I -> integer
+C -> char
+W -> long
+N -> unsigned
+Z -> unsigned long
+Q -> float
+H -> double
+F -> function
+
+
+xy -> conversion from y to x
+
+
+Examples:
+---------
+
+int
+main()
+{
+ int i;
+ float v = 3.0;
+
+ i = i != v;
+}
+
+->
+
+Xmain I F E
+{
+A1 I
+A2 I
+A3 Q
+ A3 ##4130000 QH :Q
+ A1 A1 QI A3 !Q #1 #0 ?I :I
+}
+
+-------------------------------------------
+
+struct pepe {
+ int i, j;
+ struct p2 {
+ int k;
+ } k;
+};
+
+int
+main()
+{
+ int i;
+ struct pepe p;
+
+ i += p.i + p.k.k;
+}
+
+->
+
+S4 (
+M5 I
+)
+S1 (
+M2 I
+M3 I
+M6 S4
+)
+Xmain I F E
+{
+A7 I
+A8 S1
+ A7 A8 M2 . A8 M6 . M5 . +I :+I
+}