-"Conv_I2I" => {
- "reg_req" => { "in" => [ "gp", "gp", "gp", "none" ], "out" => [ "in_r3", "none" ] },
- "cmp_attr" => " return ia32_compare_immop_attr(attr_a, attr_b);\n",
- "comment" => "construct Conv Int -> Int"
-},
-
-"Conv_I2I8Bit" => {
- "reg_req" => { "in" => [ "gp", "gp", "eax ebx ecx edx", "none" ], "out" => [ "in_r3", "none" ] },
- "cmp_attr" => " return ia32_compare_immop_attr(attr_a, attr_b);\n",
- "comment" => "construct Conv Int -> Int"
-},
-
-"Conv_I2FP" => {
- "reg_req" => { "in" => [ "gp", "gp", "gp", "none" ], "out" => [ "xmm", "none" ] },
- "cmp_attr" => " return ia32_compare_immop_attr(attr_a, attr_b);\n",
- "comment" => "construct Conv Int -> Floating Point"
-},
-
-"Conv_FP2I" => {
- "reg_req" => { "in" => [ "gp", "gp", "xmm", "none" ], "out" => [ "gp", "none" ] },
- "cmp_attr" => " return ia32_compare_immop_attr(attr_a, attr_b);\n",
- "comment" => "construct Conv Floating Point -> Int"
-},
-
-"Conv_FP2FP" => {
- "reg_req" => { "in" => [ "gp", "gp", "xmm", "none" ], "out" => [ "xmm", "none" ] },
- "cmp_attr" => " return ia32_compare_immop_attr(attr_a, attr_b);\n",
- "comment" => "construct Conv Floating Point -> Floating Point",
-},
-
-#--------------------------------------------------------#
-# __ _ _ _ #
-# / _| | | | | | #
-# | |_| | ___ __ _| |_ _ __ ___ __| | ___ ___ #
-# | _| |/ _ \ / _` | __| | '_ \ / _ \ / _` |/ _ \/ __| #
-# | | | | (_) | (_| | |_ | | | | (_) | (_| | __/\__ \ #
-# |_| |_|\___/ \__,_|\__| |_| |_|\___/ \__,_|\___||___/ #
-#--------------------------------------------------------#
-
-# virtual float nodes
+Conv_I2I => {
+ reg_req => { in => [ "gp", "gp", "gp", "none" ], out => [ "in_r3", "none" ] },
+ comment => "construct Conv Int -> Int",
+ units => [ "GP" ],
+ mode => "mode_Iu",
+},
+
+Conv_I2I8Bit => {
+ reg_req => { in => [ "gp", "gp", "eax ebx ecx edx", "none" ], out => [ "in_r3", "none" ] },
+ comment => "construct Conv Int -> Int",
+ units => [ "GP" ],
+ mode => "mode_Iu",
+},
+
+Conv_I2FP => {
+ reg_req => { in => [ "gp", "gp", "gp", "none" ], out => [ "xmm", "none" ] },
+ comment => "construct Conv Int -> Floating Point",
+ latency => 10,
+ units => [ "SSE" ],
+ mode => "mode_E",
+},
+
+Conv_FP2I => {
+ reg_req => { in => [ "gp", "gp", "xmm", "none" ], out => [ "gp", "none" ] },
+ comment => "construct Conv Floating Point -> Int",
+ latency => 10,
+ units => [ "SSE" ],
+ mode => "mode_Iu",
+},
+
+Conv_FP2FP => {
+ reg_req => { in => [ "gp", "gp", "xmm", "none" ], out => [ "xmm", "none" ] },
+ comment => "construct Conv Floating Point -> Floating Point",
+ latency => 8,
+ units => [ "SSE" ],
+ mode => "mode_E",
+},
+
+CmpCMov => {
+ irn_flags => "R",
+ comment => "construct Conditional Move: CMov(sel, a, b) == sel ? a : b",
+ reg_req => { in => [ "gp", "gp", "gp", "gp" ], out => [ "in_r4" ] },
+ latency => 2,
+ units => [ "GP" ],
+ mode => "mode_Iu",
+},
+
+PsiCondCMov => {
+ irn_flags => "R",
+ comment => "check if Psi condition tree evaluates to true and move result accordingly",
+ reg_req => { in => [ "gp", "gp", "gp" ], out => [ "in_r3" ] },
+ latency => 2,
+ units => [ "GP" ],
+ mode => "mode_Iu",
+},
+
+xCmpCMov => {
+ irn_flags => "R",
+ comment => "construct Conditional Move: SSE Compare + int CMov ",
+ reg_req => { in => [ "xmm", "xmm", "gp", "gp" ], out => [ "in_r4" ] },
+ latency => 5,
+ units => [ "SSE" ],
+ mode => "mode_Iu",
+},
+
+vfCmpCMov => {
+ irn_flags => "R",
+ comment => "construct Conditional Move: x87 Compare + int CMov",
+ reg_req => { in => [ "vfp", "vfp", "gp", "gp" ], out => [ "in_r4" ] },
+ latency => 10,
+ units => [ "VFP" ],
+ mode => "mode_Iu",
+},
+
+CmpSet => {
+ irn_flags => "R",
+ comment => "construct Set: Set(sel) == sel ? 1 : 0",
+ reg_req => { in => [ "gp", "gp", "gp", "gp", "none" ], out => [ "eax ebx ecx edx" ] },
+ latency => 2,
+ units => [ "GP" ],
+ mode => "mode_Iu",
+},
+
+PsiCondSet => {
+ irn_flags => "R",
+ comment => "check if Psi condition tree evaluates to true and set result accordingly",
+ reg_req => { in => [ "gp" ], out => [ "eax ebx ecx edx" ] },
+ latency => 2,
+ units => [ "GP" ],
+ mode => "mode_Iu",
+},
+
+xCmpSet => {
+ irn_flags => "R",
+ comment => "construct Set: SSE Compare + int Set",
+ reg_req => { in => [ "gp", "gp", "xmm", "xmm", "none" ], out => [ "eax ebx ecx edx" ] },
+ latency => 5,
+ units => [ "SSE" ],
+ mode => "mode_Iu",
+},
+
+vfCmpSet => {
+ irn_flags => "R",
+ comment => "construct Set: x87 Compare + int Set",
+ reg_req => { in => [ "gp", "gp", "vfp", "vfp", "none" ], out => [ "eax ebx ecx edx" ] },
+ latency => 10,
+ units => [ "VFP" ],
+ mode => "mode_Iu",
+},
+
+vfCMov => {
+ irn_flags => "R",
+ comment => "construct x87 Conditional Move: vfCMov(sel, a, b) = sel ? a : b",
+ reg_req => { in => [ "vfp", "vfp", "vfp", "vfp" ], out => [ "vfp" ] },
+ latency => 10,
+ units => [ "VFP" ],
+ mode => "mode_E",
+},
+
+#----------------------------------------------------------#
+# _ _ _ __ _ _ #
+# (_) | | | | / _| | | | #
+# __ ___ _ __| |_ _ _ __ _| | | |_| | ___ __ _| |_ #
+# \ \ / / | '__| __| | | |/ _` | | | _| |/ _ \ / _` | __| #
+# \ V /| | | | |_| |_| | (_| | | | | | | (_) | (_| | |_ #
+# \_/ |_|_| \__|\__,_|\__,_|_| |_| |_|\___/ \__,_|\__| #
+# | | #
+# _ __ ___ __| | ___ ___ #
+# | '_ \ / _ \ / _` |/ _ \/ __| #
+# | | | | (_) | (_| | __/\__ \ #
+# |_| |_|\___/ \__,_|\___||___/ #
+#----------------------------------------------------------#
+
+vfadd => {
+ irn_flags => "R",
+ comment => "virtual fp Add: Add(a, b) = Add(b, a) = a + b",
+ reg_req => { in => [ "gp", "gp", "vfp", "vfp", "none" ], out => [ "vfp" ] },
+ latency => 4,
+ units => [ "VFP" ],
+ mode => "mode_E",
+},
+
+vfmul => {
+ irn_flags => "R",
+ comment => "virtual fp Mul: Mul(a, b) = Mul(b, a) = a * b",
+ reg_req => { in => [ "gp", "gp", "vfp", "vfp", "none" ], out => [ "vfp" ] },
+ latency => 4,
+ units => [ "VFP" ],
+ mode => "mode_E",
+},
+
+l_vfmul => {
+ op_flags => "C",
+ cmp_attr => "return 1;",
+ comment => "lowered virtual fp Mul: Mul(a, b) = Mul(b, a) = a * b",
+ arity => 2,
+},
+
+vfsub => {
+ irn_flags => "R",
+ comment => "virtual fp Sub: Sub(a, b) = a - b",
+ reg_req => { in => [ "gp", "gp", "vfp", "vfp", "none" ], out => [ "vfp" ] },
+ latency => 4,
+ units => [ "VFP" ],
+ mode => "mode_E",
+},
+
+l_vfsub => {
+ cmp_attr => "return 1;",
+ comment => "lowered virtual fp Sub: Sub(a, b) = a - b",
+ arity => 2,
+},
+
+vfdiv => {
+ comment => "virtual fp Div: Div(a, b) = a / b",
+ reg_req => { in => [ "gp", "gp", "vfp", "vfp", "none" ], out => [ "vfp" ] },
+ outs => [ "res", "M" ],
+ latency => 20,
+ units => [ "VFP" ],
+},
+
+l_vfdiv => {
+ cmp_attr => "return 1;",
+ comment => "lowered virtual fp Div: Div(a, b) = a / b",
+ outs => [ "res", "M" ],
+ arity => 2,
+},
+
+vfprem => {
+ comment => "virtual fp Rem: Rem(a, b) = a - Q * b (Q is integer)",
+ reg_req => { in => [ "gp", "gp", "vfp", "vfp", "none" ], out => [ "vfp" ] },
+ latency => 20,
+ units => [ "VFP" ],
+ mode => "mode_E",
+},
+
+l_vfprem => {
+ cmp_attr => "return 1;",
+ comment => "lowered virtual fp Rem: Rem(a, b) = a - Q * b (Q is integer)",
+ arity => 2,
+},
+
+vfabs => {
+ irn_flags => "R",
+ comment => "virtual fp Abs: Abs(a) = |a|",
+ reg_req => { in => [ "vfp"], out => [ "vfp" ] },
+ latency => 2,
+ units => [ "VFP" ],
+ mode => "mode_E",
+},
+
+vfchs => {
+ irn_flags => "R",
+ comment => "virtual fp Chs: Chs(a) = -a",
+ reg_req => { in => [ "vfp"], out => [ "vfp" ] },
+ latency => 2,
+ units => [ "VFP" ],
+ mode => "mode_E",
+},
+
+vfsin => {
+ irn_flags => "R",
+ comment => "virtual fp Sin: Sin(a) = sin(a)",
+ reg_req => { in => [ "vfp"], out => [ "vfp" ] },
+ latency => 150,
+ units => [ "VFP" ],
+ mode => "mode_E",
+},