added modufy_sp flag for AddSP
[libfirm] / ir / be / ia32 / ia32_spec.pl
index 1c015ec..ed2348d 100644 (file)
@@ -18,7 +18,7 @@ $comment_string = "/*";
 #
 # <op-name> => {
 #   "op_flags"  => "N|L|C|X|I|F|Y|H|c|K",
-#   "irn_flags" => "R|N|I"
+#   "irn_flags" => "R|N|I|S"
 #   "arity"     => "0|1|2|3 ... |variable|dynamic|any",
 #   "state"     => "floats|pinned|mem_pinned|exc_pinned",
 #   "args"      => [
@@ -57,6 +57,7 @@ $comment_string = "/*";
 #   R   rematerializeable
 #   N   not spillable
 #   I   ignore for register allocation
+#   S   modifies stack pointer
 #
 # state: state of the operation, OPTIONAL (default is "floats")
 #
@@ -213,10 +214,49 @@ $comment_string = "/*";
   "comment"   => "construct Add: Add(a, b) = Add(b, a) = a + b",
   "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
   "reg_req"   => { "in" => [ "gp", "gp", "gp", "gp", "none" ], "out" => [ "in_r3" ] },
-  "emit"      => '. add %ia32_emit_binop /* Add(%A1, %A2) -> %D1 */',
+  "emit"      => '. add %ia32_emit_binop /* Add(%A3, %A4) -> %D1 */',
   "outs"      => [ "res", "M" ],
 },
 
+"AddC" => {
+  "comment"   => "construct Add with Carry: AddC(a, b) = Add(b, a) = a + b + carry",
+  "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
+  "reg_req"   => { "in" => [ "gp", "gp", "gp", "gp", "none" ], "out" => [ "in_r3" ] },
+  "emit"      => '. adc %ia32_emit_binop /* AddC(%A3, %A4) -> %D1 */',
+  "outs"      => [ "res", "M" ],
+},
+
+"l_Add" => {
+  "op_flags"  => "C",
+  "irn_flags" => "R",
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered Add: Add(a, b) = Add(b, a) = a + b",
+  "arity"     => 2,
+},
+
+"l_AddC" => {
+  "op_flags"  => "C",
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered Add with Carry: AddC(a, b) = Add(b, a) = a + b + carry",
+  "arity"     => 2,
+},
+
+"MulS" => {
+  "comment"   => "construct MulS: MulS(a, b) = MulS(b, a) = a * b",
+  "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
+  "reg_req"   => { "in" => [ "gp", "gp", "eax", "gp", "none" ], "out" => [ "eax", "edx" ] },
+  "emit"      => '. mul %ia32_emit_unop /* Mul(%A1, %A2) -> %D1 */',
+  "outs"      => [ "EAX", "EDX", "M" ],
+},
+
+"l_MulS" => {
+  "op_flags"  => "C",
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered MulS: MulS(a, b) = MulS(b, a) = a * b",
+  "outs"      => [ "EAX", "EDX", "M" ],
+  "arity"     => 2
+},
+
 "Mul" => {
   "irn_flags" => "R",
   "comment"   => "construct Mul: Mul(a, b) = Mul(b, a) = a * b",
@@ -226,12 +266,19 @@ $comment_string = "/*";
   "outs"      => [ "res", "M" ],
 },
 
+"l_Mul" => {
+  "op_flags"  => "C",
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered Mul: Mul(a, b) = Mul(b, a) = a * b",
+  "arity"     => 2
+},
+
 # Mulh is an exception from the 4 INs with AM because the target is always EAX:EDX
 "Mulh" => {
   "comment"   => "construct Mul: Mul(a, b) = Mul(b, a) = a * b",
   "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
-  "reg_req"   => { "in" => [ "gp", "gp", "gp", "gp", "none" ], "out" => [ "eax in_r3", "edx in_r4" ] },
-  "emit"      => '. imul %ia32_emit_binop /* Mulh(%A1, %A2) -> %D1 */',
+  "reg_req"   => { "in" => [ "gp", "gp", "eax", "gp", "none" ], "out" => [ "eax", "edx" ] },
+  "emit"      => '. imul %ia32_emit_unop /* Mulh(%A1, %A2) -> %D1 */',
   "outs"      => [ "EAX", "EDX", "M" ],
 },
 
@@ -262,6 +309,13 @@ $comment_string = "/*";
   "outs"      => [ "res", "M" ],
 },
 
+"l_Eor" => {
+  "op_flags"  => "C",
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered Eor: Eor(a, b) = Eor(b, a) = a EOR b",
+  "arity"     => 2
+},
+
 "Max" => {
   "irn_flags" => "R",
   "comment"   => "construct Max: Max(a, b) = Max(b, a) = a > b ? a : b",
@@ -299,19 +353,40 @@ $comment_string = "/*";
   "comment"   => "construct Sub: Sub(a, b) = a - b",
   "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
   "reg_req"   => { "in" => [ "gp", "gp", "gp", "gp", "none" ], "out" => [ "in_r3" ] },
-  "emit"      => '. sub %ia32_emit_binop /* Sub(%A1, %A2) -> %D1 */',
+  "emit"      => '. sub %ia32_emit_binop /* Sub(%A3, %A4) -> %D1 */',
   "outs"      => [ "res", "M" ],
 },
 
+"SubC" => {
+  "comment"   => "construct Sub with Carry: SubC(a, b) = a - b - carry",
+  "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
+  "reg_req"   => { "in" => [ "gp", "gp", "gp", "gp", "none" ], "out" => [ "in_r3" ] },
+  "emit"      => '. sbb %ia32_emit_binop /* SubC(%A3, %A4) -> %D1 */',
+  "outs"      => [ "res", "M" ],
+},
+
+"l_Sub" => {
+  "irn_flags" => "R",
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered Sub: Sub(a, b) = a - b",
+  "arity"     => 2,
+},
+
+"l_SubC" => {
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered Sub with Carry: SubC(a, b) = a - b - carry",
+  "arity"     => 2,
+},
+
 "DivMod" => {
   "op_flags"  => "F|L",
   "state"     => "exc_pinned",
-  "reg_req"   => { "in" => [ "gp", "gp", "gp", "none" ], "out" => [ "eax in_r1", "edx in_r3" ] },
+  "reg_req"   => { "in" => [ "eax", "gp", "edx", "none" ], "out" => [ "eax", "edx" ] },
   "attr"      => "ia32_op_flavour_t dm_flav",
   "init_attr" => "  attr->data.op_flav = dm_flav;",
   "cmp_attr"  => "  return attr_a->data.op_flav != attr_b->data.op_flav;\n",
   "emit"      =>
-'  if (mode_is_signed(get_irn_mode(n))) {
+'  if (mode_is_signed(get_ia32_res_mode(n))) {
 4.  idiv %S2 /* signed DivMod(%S1, %S2) -> %D1, (%A1, %A2, %A3) */
   }
   else {
@@ -330,6 +405,45 @@ $comment_string = "/*";
   "outs"      => [ "res", "M" ],
 },
 
+"l_Shl" => {
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered Shl: Shl(a, b) = a << b",
+  "arity"     => 2
+},
+
+"ShlD" => {
+  "irn_flags" => "R",
+  "comment"   => "construct ShlD: ShlD(a, b, c) = a, b << count (shift left count bits from b into a)",
+  "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
+  "reg_req"   => { "in" => [ "gp", "gp", "gp", "gp", "ecx", "none" ], "out" => [ "in_r3 !in_r5" ] },
+  "emit"      =>
+'
+if (get_ia32_immop_type(n) == ia32_ImmNone) {
+  if (get_ia32_op_type(n) == ia32_AddrModeD) {
+4. shld %ia32_emit_am, %S4, %%cl /* ShlD(%A3, %A4, %A5) -> %D1 */
+  }
+  else {
+4. shld %S3, %S4, %%cl /* ShlD(%A3, %A4, %A5) -> %D1 */
+  }
+}
+else {
+  if (get_ia32_op_type(n) == ia32_AddrModeD) {
+4. shld %ia32_emit_am, %S4, %C /* ShlD(%A3, %A4, %A5) -> %D1 */
+  }
+  else {
+4. shld %S3, %S4, %C /* ShlD(%A3, %A4, %A5) -> %D1 */
+  }
+}
+',
+  "outs"      => [ "res", "M" ],
+},
+
+"l_ShlD" => {
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered ShlD: ShlD(a, b, c) = a, b << count (shift left count bits from b into a)",
+  "arity"     => 3
+},
+
 "Shr" => {
   "irn_flags" => "R",
   "comment"   => "construct Shr: Shr(a, b) = a >> b",
@@ -339,6 +453,45 @@ $comment_string = "/*";
   "outs"      => [ "res", "M" ],
 },
 
+"l_Shr" => {
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered Shr: Shr(a, b) = a << b",
+  "arity"     => 2
+},
+
+"ShrD" => {
+  "irn_flags" => "R",
+  "comment"   => "construct ShrD: ShrD(a, b, c) = a, b >> count (shift rigth count bits from a into b)",
+  "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
+  "reg_req"   => { "in" => [ "gp", "gp", "gp", "gp", "ecx", "none" ], "out" => [ "in_r3 !in_r5" ] },
+  "emit"      =>
+'
+if (get_ia32_immop_type(n) == ia32_ImmNone) {
+  if (get_ia32_op_type(n) == ia32_AddrModeD) {
+4. shrd %ia32_emit_am, %S4, %%cl /* ShrD(%A3, %A4, %A5) -> %D1 */
+  }
+  else {
+4. shrd %S3, %S4, %%cl /* ShrD(%A3, %A4, %A5) -> %D1 */
+  }
+}
+else {
+  if (get_ia32_op_type(n) == ia32_AddrModeD) {
+4. shrd %ia32_emit_am, %S4, %C /* ShrD(%A3, %A4, %A5) -> %D1 */
+  }
+  else {
+4. shrd %S3, %S4, %C /* ShrD(%A3, %A4, %A5) -> %D1 */
+  }
+}
+',
+  "outs"      => [ "res", "M" ],
+},
+
+"l_ShrD" => {
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered ShrD: ShrD(a, b, c) = a, b >> count (shift rigth count bits from a into b)",
+  "arity"     => 3
+},
+
 "Shrs" => {
   "irn_flags" => "R",
   "comment"   => "construct Shrs: Shrs(a, b) = a >> b",
@@ -348,6 +501,12 @@ $comment_string = "/*";
   "outs"      => [ "res", "M" ],
 },
 
+"l_Shrs" => {
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered Shrs: Shrs(a, b) = a << b",
+  "arity"     => 2
+},
+
 "RotR" => {
   "irn_flags" => "R",
   "comment"     => "construct RotR: RotR(a, b) = a ROTR b",
@@ -377,6 +536,12 @@ $comment_string = "/*";
   "outs"      => [ "res", "M" ],
 },
 
+"l_Minus" => {
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered Minus: Minus(a) = -a",
+  "arity"     => 1,
+},
+
 "Inc" => {
   "irn_flags" => "R",
   "comment"   => "construct Increment: Inc(a) = a++",
@@ -464,7 +629,6 @@ $comment_string = "/*";
 
 "Load" => {
   "op_flags"  => "L|F",
-  "irn_flags" => "R",
   "state"     => "exc_pinned",
   "comment"   => "construct Load: Load(ptr, mem) = LD ptr -> reg",
   "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
@@ -480,6 +644,23 @@ $comment_string = "/*";
   "outs"      => [ "res", "M" ],
 },
 
+"l_Load" => {
+  "op_flags"  => "L|F",
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "construct lowered Load: Load(ptr, mem) = LD ptr -> reg",
+  "outs"      => [ "res", "M" ],
+  "arity"     => 2,
+},
+
+"l_Store" => {
+  "op_flags"  => "L|F",
+  "cmp_attr"  => "  return 1;\n",
+  "state"     => "exc_pinned",
+  "comment"   => "construct lowered Store: Store(ptr, val, mem) = ST ptr,val",
+  "arity"     => 3,
+  "outs"      => [ "M" ],
+},
+
 "Store" => {
   "op_flags"  => "L|F",
   "state"     => "exc_pinned",
@@ -514,14 +695,17 @@ $comment_string = "/*";
   "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) */
+4. push %C /* Push const on stack */
+} else {
+4. push OFFSET FLAT:%C /* Push symconst on stack */
        }
 }
-else {
-. push %S2 /* Push(%A2) */
+else if (get_ia32_op_type(n) == ia32_Normal) {
+2. push %S2 /* Push(%A2) */
 }
+else {
+2. push %ia32_emit_am /* Push memory to stack */
+};
 ',
   "outs"      => [ "stack", "M" ],
 },
@@ -529,7 +713,14 @@ else {
 "Pop" => {
   "comment"   => "pop a gp register from the stack",
   "reg_req"   => { "in" => [ "esp", "none" ], "out" => [ "gp", "esp" ] },
-  "emit"      => '. pop %D1 /* Pop -> %D1 */',
+  "emit"      => '
+if (get_ia32_op_type(n) == ia32_Normal) {
+2. pop %D1 /* Pop from stack into %D1 */
+}
+else {
+2. pop %ia32_emit_am /* Pop from stack into memory */
+}
+',
   "outs"      => [ "res", "stack", "M" ],
 },
 
@@ -547,6 +738,13 @@ else {
   "outs"      => [ "frame", "stack", "M" ],
 },
 
+"AddSP" => {
+  "irn_flags" => "S|I",
+  "comment"   => "allocate space on stack",
+  "reg_req"   => { "in" => [ "esp", "gp" ], "out" => [ "esp", "none" ] },
+  "outs"      => [ "stack", "M" ],
+},
+
 #-----------------------------------------------------------------------------#
 #   _____ _____ ______    __ _             _                     _            #
 #  / ____/ ____|  ____|  / _| |           | |                   | |           #
@@ -680,7 +878,6 @@ else {
 
 "xLoad" => {
   "op_flags"  => "L|F",
-  "irn_flags" => "R",
   "state"     => "exc_pinned",
   "comment"   => "construct SSE Load: Load(ptr, mem) = LD ptr",
   "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
@@ -699,13 +896,60 @@ else {
   "outs"      => [ "M" ],
 },
 
+"xStoreSimple" => {
+  "op_flags" => "L|F",
+  "state"    => "exc_pinned",
+  "comment"  => "construct Store without index: Store(ptr, val, mem) = ST ptr,val",
+  "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
+  "reg_req"  => { "in" => [ "gp", "xmm", "none" ] },
+  "emit"     => '. movs%M %ia32_emit_am, %S2 /* store XMM0 onto stack */',
+  "outs"      => [ "M" ],
+},
+
+"l_X87toSSE" => {
+  "op_flags" => "L|F",
+  "comment"  => "construct: transfer a value from x87 FPU into a SSE register",
+  "cmp_attr" => "  return 1;\n",
+  "arity"    => 3,
+},
+
+"l_SSEtoX87" => {
+  "op_flags" => "L|F",
+  "comment"  => "construct: transfer a value from SSE register to x87 FPU",
+  "cmp_attr" => "  return 1;\n",
+  "arity"    => 3,
+},
+
+"GetST0" => {
+  "op_flags" => "L|F",
+  "irn_flags" => "I",
+  "state"    => "exc_pinned",
+  "comment"  => "store ST0 onto stack",
+  "cmp_attr" => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
+  "reg_req"  => { "in" => [ "gp", "none" ] },
+  "emit"     => '. fstp %ia32_emit_am /* store ST0 onto stack */',
+  "outs"     => [ "M" ],
+},
+
+"SetST0" => {
+  "op_flags" => "L|F",
+  "irn_flags" => "I",
+  "state"    => "exc_pinned",
+  "comment"  => "load ST0 from stack",
+  "cmp_attr" => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
+  "reg_req"  => { "in" => [ "gp", "none" ], "out" => [ "st0", "none" ] },
+  "emit"     => '. fld %ia32_emit_am /* load ST0 from stack */',
+  "outs"     => [ "res", "M" ],
+},
+
 # CopyB
 
 "CopyB" => {
   "op_flags" => "F|H",
   "state"    => "pinned",
   "comment"  => "implements a memcopy: CopyB(dst, src, size, mem) == memcpy(dst, src, size)",
-  "reg_req"  => { "in" => [ "edi", "esi", "ecx", "none" ], "out" => [ "none" ] },
+  "reg_req"  => { "in" => [ "edi", "esi", "ecx", "none" ], "out" => [ "edi", "esi", "ecx", "none" ] },
+  "outs"     => [ "DST", "SRC", "CNT", "M" ],
 },
 
 "CopyB_i" => {
@@ -713,7 +957,8 @@ else {
   "state"    => "pinned",
   "comment"  => "implements a memcopy: CopyB(dst, src, mem) == memcpy(dst, src, attr(size))",
   "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
-  "reg_req"  => { "in" => [ "edi", "esi", "none" ], "out" => [ "none" ] },
+  "reg_req"  => { "in" => [ "edi", "esi", "none" ], "out" => [  "edi", "esi", "none" ] },
+  "outs"     => [ "DST", "SRC", "M" ],
 },
 
 # Conversions
@@ -834,12 +1079,19 @@ else {
 
 "vfmul" => {
   "irn_flags" => "R",
-  "comment"   => "virtual fp Mul: Mul(a, b) = Mul(b, a) = a + b",
+  "comment"   => "virtual fp Mul: Mul(a, b) = Mul(b, a) = a * b",
   "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
   "reg_req"   => { "in" => [ "gp", "gp", "vfp", "vfp", "none" ], "out" => [ "vfp" ] },
   "outs"      => [ "res", "M" ],
 },
 
+"l_vfmul" => {
+  "op_flags"  => "C",
+  "cmp_attr"  => "  return 1;\n",
+  "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",
@@ -848,6 +1100,12 @@ else {
   "outs"      => [ "res", "M" ],
 },
 
+"l_vfsub" => {
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "lowered virtual fp Sub: Sub(a, b) = a - b",
+  "arity"     => 2,
+},
+
 "vfdiv" => {
   "comment"   => "virtual fp Div: Div(a, b) = a / b",
   "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
@@ -855,6 +1113,12 @@ else {
   "outs"      => [ "res", "M" ],
 },
 
+"l_vfdiv" => {
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "lowered virtual fp Div: Div(a, b) = a / b",
+  "arity"     => 2,
+},
+
 "vfabs" => {
   "irn_flags" => "R",
   "comment"   => "virtual fp Abs: Abs(a) = |a|",
@@ -889,7 +1153,6 @@ else {
 
 "vfld" => {
   "op_flags"  => "L|F",
-  "irn_flags" => "R",
   "state"     => "exc_pinned",
   "comment"   => "virtual fp Load: Load(ptr, mem) = LD ptr -> reg",
   "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
@@ -909,13 +1172,19 @@ else {
 # Conversions
 
 "vfild" => {
-  "irn_flags" => "R",
   "comment"   => "virtual fp integer Load: Load(ptr, mem) = iLD ptr -> reg",
   "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
   "reg_req"   => { "in" => [ "gp", "gp", "none" ], "out" => [ "vfp", "none" ] },
   "outs"      => [ "res", "M" ],
 },
 
+"l_vfild" => {
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "lowered virtual fp integer Load: Load(ptr, mem) = iLD ptr -> reg",
+  "outs"      => [ "res", "M" ],
+  "arity"     => 2,
+},
+
 "vfist" => {
   "comment"   => "virtual fp integer Store: Store(ptr, val, mem) = iST ptr,val",
   "cmp_attr"  => "  return ia32_compare_immop_attr(attr_a, attr_b);\n",
@@ -923,6 +1192,14 @@ else {
   "outs"      => [ "M" ],
 },
 
+"l_vfist" => {
+  "cmp_attr"  => "  return 1;\n",
+  "comment"   => "lowered virtual fp integer Store: Store(ptr, val, mem) = iST ptr,val",
+  "outs"      => [ "M" ],
+  "arity"     => 3,
+},
+
+
 # constants
 
 "vfldz" => {
@@ -1165,7 +1442,6 @@ else {
 
 "fild" => {
   "op_flags"  => "R",
-  "irn_flags" => "R",
   "rd_constructor" => "NONE",
   "comment"   => "x87 fp integer Load: Load(ptr, mem) = iLD ptr -> reg",
   "reg_req"   => { },
@@ -1192,6 +1468,7 @@ else {
 
 "fldz" => {
   "op_flags"  => "R",
+  "irn_flags"  => "R",
   "rd_constructor" => "NONE",
   "comment"   => "x87 fp Load 0.0: Ld 0.0 -> reg",
   "reg_req"   => { },
@@ -1200,6 +1477,7 @@ else {
 
 "fld1" => {
   "op_flags"  => "R",
+  "irn_flags"  => "R",
   "rd_constructor" => "NONE",
   "comment"   => "x87 fp Load 1.0: Ld 1.0 -> reg",
   "reg_req"   => { },
@@ -1208,6 +1486,7 @@ else {
 
 "fldpi" => {
   "op_flags"  => "R",
+  "irn_flags"  => "R",
   "rd_constructor" => "NONE",
   "comment"   => "x87 fp Load pi: Ld pi -> reg",
   "reg_req"   => { },
@@ -1216,6 +1495,7 @@ else {
 
 "fldln2" => {
   "op_flags"  => "R",
+  "irn_flags"  => "R",
   "rd_constructor" => "NONE",
   "comment"   => "x87 fp Load ln 2: Ld ln 2 -> reg",
   "reg_req"   => { },
@@ -1224,6 +1504,7 @@ else {
 
 "fldlg2" => {
   "op_flags"  => "R",
+  "irn_flags"  => "R",
   "rd_constructor" => "NONE",
   "comment"   => "x87 fp Load lg 2: Ld lg 2 -> reg",
   "reg_req"   => { },
@@ -1232,6 +1513,7 @@ else {
 
 "fldl2t" => {
   "op_flags"  => "R",
+  "irn_flags"  => "R",
   "rd_constructor" => "NONE",
   "comment"   => "x87 fp Load ld 10: Ld ld 10 -> reg",
   "reg_req"   => { },
@@ -1240,6 +1522,7 @@ else {
 
 "fldl2e" => {
   "op_flags"  => "R",
+  "irn_flags"  => "R",
   "rd_constructor" => "NONE",
   "comment"   => "x87 fp Load ld e: Ld ld e -> reg",
   "reg_req"   => { },