-#--------------------------------------------------------#
-# __ _ _ _ #
-# / _| | | | | | #
-# | |_| | ___ __ _| |_ _ __ ___ __| | ___ ___ #
-# | _| |/ _ \ / _` | __| | '_ \ / _ \ / _` |/ _ \/ __| #
-# | | | | (_) | (_| | |_ | | | | (_) | (_| | __/\__ \ #
-# |_| |_|\___/ \__,_|\__| |_| |_|\___/ \__,_|\___||___/ #
-#--------------------------------------------------------#
+"Push" => {
+ "comment" => "push a gp register on the stack",
+ "reg_req" => { "in" => [ "esp", "gp", "none" ], "out" => [ "esp" ] },
+ "emit" => '
+if (get_ia32_id_cnst(n)) {
+ if (get_ia32_immop_type(n) == ia32_ImmConst) {
+. push %C /* Push(%A2) */
+ } else {
+. push OFFSET FLAT:%C /* Push(%A2) */
+ }
+}
+else {
+. push %S2 /* Push(%A2) */
+}
+',
+ "outs" => [ "stack", "M" ],
+},
+
+"Pop" => {
+ "comment" => "pop a gp register from the stack",
+ "reg_req" => { "in" => [ "esp", "none" ], "out" => [ "gp", "esp" ] },
+ "emit" => '. pop %D1 /* Pop -> %D1 */',
+ "outs" => [ "res", "stack", "M" ],
+},
+
+"Enter" => {
+ "comment" => "create stack frame",
+ "reg_req" => { "in" => [ "esp" ], "out" => [ "ebp", "esp" ] },
+ "emit" => '. enter /* Enter */',
+ "outs" => [ "frame", "stack", "M" ],
+},
+
+"Leave" => {
+ "comment" => "destroy stack frame",
+ "reg_req" => { "in" => [ "esp", "ebp" ], "out" => [ "ebp", "esp" ] },
+ "emit" => '. leave /* Leave */',
+ "outs" => [ "frame", "stack", "M" ],
+},
+
+#-----------------------------------------------------------------------------#
+# _____ _____ ______ __ _ _ _ #
+# / ____/ ____| ____| / _| | | | | | #
+# | (___| (___ | |__ | |_| | ___ __ _| |_ _ __ ___ __| | ___ ___ #
+# \___ \\___ \| __| | _| |/ _ \ / _` | __| | '_ \ / _ \ / _` |/ _ \/ __| #
+# ____) |___) | |____ | | | | (_) | (_| | |_ | | | | (_) | (_| | __/\__ \ #
+# |_____/_____/|______| |_| |_|\___/ \__,_|\__| |_| |_|\___/ \__,_|\___||___/ #
+#-----------------------------------------------------------------------------#