"irn_flags" => "R",
"comment" => "represents an integer constant",
"cmp_attr" => " return ia32_compare_immop_attr(attr_a, attr_b);\n",
- "reg_req" => { "in" => [ "none" ], "out" => [ "gp" ] },
+ "reg_req" => { "out" => [ "gp" ] },
},
"Cdq" => {
"irn_flags" => "R",
"comment" => "represents a SSE constant",
"cmp_attr" => " return ia32_compare_immop_attr(attr_a, attr_b);\n",
- "reg_req" => { "in" => [ "none" ], "out" => [ "xmm" ] },
+ "reg_req" => { "out" => [ "xmm" ] },
"emit" => '. movs%M %D1, %C /* Load fConst into register */',
"latency" => 2,
},
"init_attr" => " set_ia32_ls_mode(res, mode);",
"comment" => "represents a virtual floating point constant",
"cmp_attr" => " return ia32_compare_immop_attr(attr_a, attr_b);\n",
- "reg_req" => { "in" => [ "none" ], "out" => [ "vfp" ] },
+ "reg_req" => { "out" => [ "vfp" ] },
"latency" => 3,
},
"op_flags" => "R|c",
"irn_flags" => "R",
"comment" => "x87 fp Load 0.0: Ld 0.0 -> reg",
- "reg_req" => { },
+ "reg_req" => { "out" => [ "vfp" ] },
"emit" => '. fldz /* x87 0.0 -> %D1 */',
},
"op_flags" => "R|c",
"irn_flags" => "R",
"comment" => "x87 fp Load 1.0: Ld 1.0 -> reg",
- "reg_req" => { },
+ "reg_req" => { "out" => [ "vfp" ] },
"emit" => '. fld1 /* x87 1.0 -> %D1 */',
},
"op_flags" => "R|c",
"irn_flags" => "R",
"comment" => "x87 fp Load pi: Ld pi -> reg",
- "reg_req" => { },
+ "reg_req" => { "out" => [ "vfp" ] },
"emit" => '. fldpi /* x87 pi -> %D1 */',
},
"op_flags" => "R|c",
"irn_flags" => "R",
"comment" => "x87 fp Load ln 2: Ld ln 2 -> reg",
- "reg_req" => { },
+ "reg_req" => { "out" => [ "vfp" ] },
"emit" => '. fldln2 /* x87 ln(2) -> %D1 */',
},
"op_flags" => "R|c",
"irn_flags" => "R",
"comment" => "x87 fp Load lg 2: Ld lg 2 -> reg",
- "reg_req" => { },
+ "reg_req" => { "out" => [ "vfp" ] },
"emit" => '. fldlg2 /* x87 log(2) -> %D1 */',
},
"op_flags" => "R|c",
"irn_flags" => "R",
"comment" => "x87 fp Load ld 10: Ld ld 10 -> reg",
- "reg_req" => { },
+ "reg_req" => { "out" => [ "vfp" ] },
"emit" => '. fldll2t /* x87 ld(10) -> %D1 */',
},
"op_flags" => "R|c",
"irn_flags" => "R",
"comment" => "x87 fp Load ld e: Ld ld e -> reg",
- "reg_req" => { },
+ "reg_req" => { "out" => [ "vfp" ] },
"emit" => '. fldl2e /* x87 ld(e) -> %D1 */',
},
"rd_constructor" => "NONE",
"comment" => "represents a x87 constant",
"cmp_attr" => " return ia32_compare_immop_attr(attr_a, attr_b);\n",
- "reg_req" => { "out" => [ "st" ] },
+ "reg_req" => { "out" => [ "vfp" ] },
"emit" => '. fld %ia32_emit_adr /* Load fConst into register -> %D1 */',
},
# fxch, fpush, fpop
# Note that it is NEVER allowed to do CSE on these nodes
+# Moreover, note the virtual register requierements!
"fxch" => {
"op_flags" => "R|K",
"comment" => "x87 stack exchange",
- "reg_req" => { "in" => [ "st"], "out" => [ "st" ] },
+ "reg_req" => { },
"cmp_attr" => " return 1;\n",
"emit" => '. fxch %X1 /* x87 swap %X1, %X3 */',
},
"fpush" => {
+ "op_flags" => "R|K",
+ "comment" => "x87 stack push",
+ "reg_req" => {},
+ "cmp_attr" => " return 1;\n",
+ "emit" => '. fld %X1 /* x87 push %X1 */',
+},
+
+"fpushCopy" => {
"op_flags" => "R",
"comment" => "x87 stack push",
- "reg_req" => { "in" => [ "st"], "out" => [ "st" ] },
+ "reg_req" => { "in" => [ "vfp"], "out" => [ "vfp" ] },
"cmp_attr" => " return 1;\n",
"emit" => '. fld %X1 /* x87 push %X1 */',
},
"fpop" => {
"op_flags" => "R|K",
"comment" => "x87 stack pop",
- "reg_req" => { "out" => [ "st" ] },
+ "reg_req" => { },
"cmp_attr" => " return 1;\n",
"emit" => '. fstp %X1 /* x87 pop %X1 */',
},