rocq/backend/EmitOps.v
The scalar instruction selection of the stack-homed emission: amd64.pl's compute_op//4 with all it calls, its store_insn/3 and load_insn/3, and filc_amd64.pl's x87 instructions for long double. Every operand is read from its slot below %rbp into %rax, %rcx or %rdx, and the result is left in %rax.
The lines are the Prolog compiler's, in order. Where a Prolog clause fails (a class an operation does not take, a wrong number of arguments) the code holds a todo line, as in Layout.v. The examples at the end are lines the Prolog compiler printed (nanofil --registers=stack asm-terms).
Registers and suffixes
Whether r is a short register of reg_name/3: a, c, d, si, di, r8 or r9.
Whether reg_name/3 names the byte and the halfword of the short register r: only of a, c and d.
The byte of the short register r: al, cl and dl as reg_name/3 has them at b, and x86's names for the others (sil, dil, r8b, r9b), which reg_name/3 lacks.
The halfword of the short register r: ax, cx and dx as reg_name/3 has them at h, and x86's names for the others (si, di, r8w, r9w), which reg_name/3 lacks.
As att_suffix/2 at a store width: the suffix of a move of that width. A pointer and an x87 float have none.
As reg_name/3 at a store width: the name of the part of the short register r that a store of the width w writes. Only a, c and d have a byte and a halfword there.
As store_insn/3: the store of the w-sized part of the short register r to (%rax).
Extensions and loads
As ext_from/2: the part of %rax that the narrow type t extends.
As ext_insn/3: the move that extends the low part of %rax that t names into %rax at the class k.
As sw_load_op/4: a signed word loads at w with a 32-bit move, and at l as it extends.
As load_insn/3: the load of a value of the type t from (%rax) into %rax, extended to the class k.
Integer arithmetic
As alu//4: the x86 two-operand instruction insn at the class k on the two arguments, the first in %rax and the second in %rcx.
As shift//4: the x86 shift insn at the class k of the first argument by the second, a w count in %cl.
As zero_divisor//4: a zero divisor c becomes 1 and the dividend a becomes 0, so that quotient and remainder are 0. With e 1 if c is 0 and else 0, in d: c is c + e and a is a and e - 1.
As minus_one_divisor//5: a signed divisor c of -1 becomes 1 and the dividend a its negation, which wraps the least integer to itself where idiv would fault. With e 1 if c is -1 and else 0, in d: c is c + 2e and a is (a xor -e) + e. An unsigned division needs none of it.
As sign_extension/2: the instruction that sign-extends %eax or %rax at the class k into %edx or %rdx.
As divide//4: %rdx:%rax (or %edx:%eax) divided by the register c, the upper half extended from %rax by the signedness sg.
As division_result//3: for a remainder, its move from %rdx to %rax; the quotient is already there.
As division//5: the division at the class k, signed or unsigned by sg, of the first argument by the second, leaving in %rax the remainder if remainder holds and else the quotient. It is total: the operands are first rewritten, without branches, so that the divide cannot fault.
As cond_code/2: the x86 condition code of the integer comparison c. A float order has none.
As the cmp(Cond, CmpClass) clause of compute_op//4: 1 in %eax if the two arguments, read at the class ck, compare by the integer condition c, else 0.
As the alloc(Align) clause of compute_op//4, which only the plain backend reaches: the size, rounded up to 16 bytes, taken from the stack, the stack pointer aligned further when align is more than 16, and the new stack pointer in %rax.
SSE2 floats
As float_suffix/2: the suffix of a scalar SSE2 instruction at the float class k, s or d.
As amd64.pl's float_class/1: whether k is s or d, the float classes SSE2 computes.
As float_bits/2: the integer class as wide as the float class k.
As float_compare/2: the unordered compare at the float class k.
As float_compute/2: whether the op o at the class k is SSE2's: arithmetic at a float class, a comparison of floats, the conversions between s and d, between floats and integers, and a cast.
As float_load//4: the bits of the value v of the float class k into the xmm register x, by way of %rax.
The mnemonic stem of the SSE2 arithmetic of the op o, which is its own name.
As float_condition//1: sets %al to the float comparison c after ucomiss, ucomisd or fucomip compared the operands. eq, ne, lt and le also read the parity flag, so that an unordered compare gives 0, or 1 for ne. Writes %cl.
As truncate_float//2: the float of the class f in %xmm0, truncated to an integer of the class k in %rax.
As convert_integer//2: the integer of the class k in %rax to a float of the class f in %xmm0.
As float_op//4: the code of the SSE2 op o at the class k on args, its result's bits in %rax.
- Arithmetic loads its operands into
%xmm0and%xmm1. - A negation flips the sign bit in
%rax. - A comparison, whose class is
w, is 1 or 0 byfloat_condition. ext(s)widens ansto adandtruncdnarrows adto ans.- A cast is its operand's bits, read at the class k.
- A float becomes an integer by
float_integerand an integer a float byinteger_float.
compute_op
As compute_op//4: the code that computes the op o at the class k on args into %rax, zero-extended for the class w. An SSE2 op (float_compute) is float_op's; the others are the integer clauses, one each. The load(Type) clause has no op here: it is load_insn after the load of the address into %rax.
x87 long double
An x temporary has a 16-byte slot, of which fldt and fstpt use the first 10 bytes. Each instruction pushes its operands on the x87 stack, computes and pops the stack empty again. Scalars and constants go through the red zone below %rsp.
As x87_op/3: whether the op o at the class k is x87's: every op at the class x, a comparison of x values, truncx, xtosi and xtoui. The op's kind, which the Prolog relation also takes, is the op's own.
The low 64 bits and the low 16 bits of an integer.
As x87_push//2: push the x value v: a temporary from its slot, a constant's 10 bytes through the red zone, by %rdx.
As x87_suffix/3: the suffix of an x87 load or store of the float class k, and of the integer move as wide.
As x87_push_float//3: push the value v of the float class f, s or d, widened exactly.
As x87_pop//2: pop %st into the wide slot of the temporary d.
As x87_fisttp//3: truncate %st toward zero into the temporary d of the class k and pop it.
As x87_int_source//3: the integer operand a of the conversion o in %rax, extended to 64 bits as o reads it.
2^64 as the bits of an s.
As x87_unsigned_fix//1: fildll read an unsigned l with bit 63 set as negative; ultof adds 2^64 to it, exactly.
The x87 arithmetic of the op o.
As x87_inst//5: the code of the temporary d as the op o at the class k on args, with x87. Operands are pushed in reverse, so %st is the first and %st(1) the second.
- Arithmetic, a negation and a copy leave an
xin d's slot. - A comparison leaves 1 or 0 by
float_condition. ext(s)andext(d)widen to anx;truncxrounds anxto the class k,sord.xtosiandxtouitruncate anxto an integer; an unsignedlof 2^63 or more has 2^63 subtracted and bit 63 restored.swtof,uwtof,sltofandultofatxload the integer as 64 bits.
Examples
Each states that a definition gives the very lines the Prolog compiler gave. The lines are copied from its output, not from the code above.
The temporary of the name s.
The slots m with the temporary s at -off(%rbp).
Whether the lines ls hold a todo.
Integer ops
compute_op on the instructions of a function ints, as asm − terms printed them in the stack-homed mode.
let(tmp(t1), w, add, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t2), l, add, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t3), w, sub, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t4), l, sub, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t5), w, mul, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t6), l, mul, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t7), w, and, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t8), l, and, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t9), w, or, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t10), l, or, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t11), w, xor, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t12), l, xor, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t13), w, shl, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t14), l, shl, tmp(c), tmp(b))
Proof 1 step Qed
let(tmp(t15), w, shr, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t16), l, shr, tmp(c), tmp(b))
Proof 1 step Qed
let(tmp(t17), w, sar, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t18), l, sar, tmp(c), tmp(b))
Proof 1 step Qed
let(tmp(t19), w, div, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t20), l, div, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t21), w, rem, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t22), l, rem, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t23), w, udiv, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t24), l, udiv, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t25), w, urem, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t26), l, urem, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t27), w, neg, tmp(a))
Proof 1 step Qed
let(tmp(t28), l, neg, tmp(c))
Proof 1 step Qed
let(tmp(t29), w, copy, tmp(a))
Proof 1 step Qed
let(tmp(t30), l, copy, tmp(c))
Proof 1 step Qed
let(tmp(t31), w, add, tmp(a), const(-1))
Proof 1 step Qed
let(tmp(t32), l, add, tmp(c), const(-1))
Proof 1 step Qed
let(tmp(t33), l, add, tmp(c), const(9223372036854775807))
Proof 1 step Qed
Integer comparisons and extensions
let(tmp(t1), w, cmp(eq, w), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t2), w, cmp(eq, l), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t3), w, cmp(ne, w), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t4), w, cmp(ne, l), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t5), w, cmp(slt, w), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t6), w, cmp(slt, l), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t7), w, cmp(sle, w), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t8), w, cmp(sle, l), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t9), w, cmp(sgt, w), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t10), w, cmp(sgt, l), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t11), w, cmp(sge, w), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t12), w, cmp(sge, l), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t13), w, cmp(ult, w), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t14), w, cmp(ult, l), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t15), w, cmp(ule, w), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t16), w, cmp(ule, l), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t17), w, cmp(ugt, w), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t18), w, cmp(ugt, l), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t19), w, cmp(uge, w), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t20), w, cmp(uge, l), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t21), l, cmp(eq, w), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t22), l, cmp(ult, l), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t23), w, ext(sb), tmp(a))
Proof 1 step Qed
let(tmp(t24), l, ext(sb), tmp(a))
Proof 1 step Qed
let(tmp(t25), w, ext(ub), tmp(a))
Proof 1 step Qed
let(tmp(t26), l, ext(ub), tmp(a))
Proof 1 step Qed
let(tmp(t27), w, ext(sh), tmp(a))
Proof 1 step Qed
let(tmp(t28), l, ext(sh), tmp(a))
Proof 1 step Qed
let(tmp(t29), w, ext(uh), tmp(a))
Proof 1 step Qed
let(tmp(t30), l, ext(uh), tmp(a))
Proof 1 step Qed
let(tmp(t31), l, ext(sw), tmp(a))
Proof 1 step Qed
let(tmp(t32), l, ext(uw), tmp(a))
Proof 1 step Qed
SSE2 floats
let(tmp(t1), s, add, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t2), d, add, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t3), s, sub, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t4), d, sub, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t5), s, mul, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t6), d, mul, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t7), s, div, tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t8), d, div, tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t9), s, neg, tmp(a))
Proof 1 step Qed
let(tmp(t10), d, neg, tmp(c))
Proof 1 step Qed
let(tmp(t11), s, copy, tmp(a))
Proof 1 step Qed
let(tmp(t12), d, copy, tmp(c))
Proof 1 step Qed
let(tmp(t13), w, cmp(eq, s), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t14), w, cmp(eq, d), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t15), w, cmp(ne, s), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t16), w, cmp(ne, d), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t17), w, cmp(lt, s), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t18), w, cmp(lt, d), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t19), w, cmp(le, s), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t20), w, cmp(le, d), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t21), w, cmp(gt, s), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t22), w, cmp(gt, d), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t23), w, cmp(ge, s), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t24), w, cmp(ge, d), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t25), w, cmp(o, s), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t26), w, cmp(o, d), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t27), w, cmp(uo, s), tmp(a), tmp(b))
Proof 1 step Qed
let(tmp(t28), w, cmp(uo, d), tmp(c), tmp(d))
Proof 1 step Qed
let(tmp(t29), d, ext(s), tmp(a))
Proof 1 step Qed
let(tmp(t30), s, truncd, tmp(c))
Proof 1 step Qed
let(tmp(t31), w, cast, tmp(a))
Proof 1 step Qed
let(tmp(t32), l, cast, tmp(c))
Proof 1 step Qed
let(tmp(t33), s, cast, tmp(i))
Proof 1 step Qed
let(tmp(t34), d, cast, tmp(j))
Proof 1 step Qed
let(tmp(t35), w, stosi, tmp(a))
Proof 1 step Qed
let(tmp(t36), w, stoui, tmp(a))
Proof 1 step Qed
let(tmp(t37), w, dtosi, tmp(c))
Proof 1 step Qed
let(tmp(t38), w, dtoui, tmp(c))
Proof 1 step Qed
let(tmp(t39), l, stosi, tmp(a))
Proof 1 step Qed
let(tmp(t40), l, stoui, tmp(a))
Proof 1 step Qed
let(tmp(t41), l, dtosi, tmp(c))
Proof 1 step Qed
let(tmp(t42), l, dtoui, tmp(c))
Proof 1 step Qed
let(tmp(t43), s, swtof, tmp(i))
Proof 1 step Qed
let(tmp(t44), s, uwtof, tmp(i))
Proof 1 step Qed
let(tmp(t45), s, sltof, tmp(j))
Proof 1 step Qed
let(tmp(t46), s, ultof, tmp(j))
Proof 1 step Qed
let(tmp(t47), d, swtof, tmp(i))
Proof 1 step Qed
let(tmp(t48), d, uwtof, tmp(i))
Proof 1 step Qed
let(tmp(t49), d, sltof, tmp(j))
Proof 1 step Qed
let(tmp(t50), d, ultof, tmp(j))
Proof 1 step Qed
let(tmp(t51), s, add, tmp(a), const(1069547520))
Proof 1 step Qed
let(tmp(t52), d, add, tmp(c), const(4621819117588971520))
Proof 1 step Qed
Loads and stores
The access itself of each raw load and store, after its checks.
let(tmp(t1), l, load(l), tmp(p))
Proof 1 step Qed
let(tmp(t2), s, load(s), tmp(p))
Proof 1 step Qed
let(tmp(t3), d, load(d), tmp(p))
Proof 1 step Qed
let(tmp(t4), w, load(sw), tmp(p))
Proof 1 step Qed
let(tmp(t5), l, load(sw), tmp(p))
Proof 1 step Qed
let(tmp(t6), w, load(uw), tmp(p))
Proof 1 step Qed
let(tmp(t7), l, load(uw), tmp(p))
Proof 1 step Qed
let(tmp(t8), w, load(sh), tmp(p))
Proof 1 step Qed
let(tmp(t9), l, load(sh), tmp(p))
Proof 1 step Qed
let(tmp(t10), w, load(uh), tmp(p))
Proof 1 step Qed
let(tmp(t11), l, load(uh), tmp(p))
Proof 1 step Qed
let(tmp(t12), w, load(sb), tmp(p))
Proof 1 step Qed
let(tmp(t13), l, load(sb), tmp(p))
Proof 1 step Qed
let(tmp(t14), w, load(ub), tmp(p))
Proof 1 step Qed
let(tmp(t15), l, load(ub), tmp(p))
Proof 1 step Qed
store(b, tmp(a), tmp(p))
Proof 1 step Qed
store(h, tmp(a), tmp(p))
Proof 1 step Qed
store(w, tmp(a), tmp(p))
Proof 1 step Qed
store(l, tmp(c), tmp(p))
Proof 1 step Qed
store(s, tmp(e), tmp(p))
Proof 1 step Qed
store(d, tmp(f), tmp(p))
Proof 1 step Qed
x87
The context holds the operands and the slot of the one temporary d that the instruction defines.
let(tmp(x), x, ext(s), tmp(e))
Proof 1 step Qed
let(tmp(y), x, ext(d), tmp(f))
Proof 1 step Qed
let(tmp(t3), x, add, tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t4), x, sub, tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t5), x, mul, tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t6), x, div, tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t7), x, neg, tmp(x))
Proof 1 step Qed
let(tmp(t8), x, copy, tmp(x))
Proof 1 step Qed
let(tmp(t9), w, cmp(eq, x), tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t10), w, cmp(ne, x), tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t11), w, cmp(lt, x), tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t12), w, cmp(le, x), tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t13), w, cmp(gt, x), tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t14), w, cmp(ge, x), tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t15), w, cmp(o, x), tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t16), w, cmp(uo, x), tmp(x), tmp(y))
Proof 1 step Qed
let(tmp(t17), s, truncx, tmp(x))
Proof 1 step Qed
let(tmp(t18), d, truncx, tmp(x))
Proof 1 step Qed
let(tmp(t19), w, xtosi, tmp(x))
Proof 1 step Qed
let(tmp(t20), l, xtosi, tmp(x))
Proof 1 step Qed
let(tmp(t21), w, xtoui, tmp(x))
Proof 1 step Qed
let(tmp(t22), l, xtoui, tmp(x))
Proof 1 step Qed
let(tmp(t23), x, swtof, tmp(a))
Proof 1 step Qed
let(tmp(t24), x, uwtof, tmp(a))
Proof 1 step Qed
let(tmp(t25), x, sltof, tmp(c))
Proof 1 step Qed
let(tmp(t26), x, ultof, tmp(c))
Proof 1 step Qed
let(tmp(t27), x, add, tmp(x), const(302222231531620438900736))
Proof 1 step Qed
let(tmp(t28), x, copy, const(906708199769027163193345))
Proof 1 step Qed
Cases no Fil-C module reaches
These are what the Prolog predicates gave when called directly: the plain backend's alloc, classes and registers that the Fil-C backend does not ask for, and goals that fail, which are a todo here.
compute_op(alloc(16), l, tmp(a))
Proof 1 step Qed
compute_op(alloc(32), l, tmp(a))
Proof 1 step Qed
compute_op(alloc(8), l, tmp(a))
Proof 1 step Qed
compute_op(and, s, tmp(a),tmp(b))
Proof 1 step Qed
compute_op(urem, d, tmp(a),tmp(b))
Proof 1 step Qed
compute_op(cmp(eq,w), x, tmp(a),tmp(b))
Proof 1 step Qed
compute_op(ext(ub), d, tmp(a))
Proof 1 step Qed
compute_op(add, l, tmp(a),const(9223372036854775808))
Proof 1 step Qed
compute_op(add, p, tmp(a),tmp(b))
Proof 1 step Qed
compute_op(add, w, tmp(a))
Proof 1 step Qed
compute_op(rem, s, tmp(a),tmp(b))
Proof 1 step Qed
compute_op(ext(sw), w, tmp(a))
Proof 1 step Qed
compute_op(cmp(lt,s), l, tmp(a),tmp(b))
Proof 1 step Qed
compute_op(cmp(lt,w), w, tmp(a),tmp(b))
Proof 1 step Qed
compute_op(stoui, s, tmp(a))
Proof 1 step Qed
compute_op(truncx, s, tmp(a))
Proof 1 step Qed
compute_op(add, w, tmp(nope),tmp(b))
Proof 1 step Qed
store_insn(b, a)
Proof 1 step Qed
store_insn(b, c)
Proof 1 step Qed
store_insn(h, c)
Proof 1 step Qed
store_insn(w, r8)
Proof 1 step Qed
store_insn(l, si)
Proof 1 step Qed
store_insn(s, di)
Proof 1 step Qed
store_insn(d, r9)
Proof 1 step Qed
store_insn(b, si)
Proof 1 step Qed
store_insn(h, r8)
Proof 1 step Qed
store_insn(p, a)
Proof 1 step Qed
store_insn(x, a)
Proof 1 step Qed
load_insn(uw, x)
Proof 1 step Qed
load_insn(x, x)
Proof 1 step Qed
load_insn(sw, s)
Proof 1 step Qed
load_insn(l, w)
Proof 1 step Qed
load_insn(sb, s)
Proof 1 step Qed
cond_code(ult)
Proof 1 step Qed
cond_code(sge)
Proof 1 step Qed
cond_code(lt)
Proof 1 step Qed
float_condition(le)
Proof 1 step Qed
float_condition(uo)
Proof 1 step Qed
float_condition(slt)
Proof 1 step Qed
reg_name(a, b)
Proof 1 step Qed
reg_name(c, h)
Proof 1 step Qed
reg_name(d, b)
Proof 1 step Qed
reg_name(d, h)
Proof 1 step Qed
x87_inst(xtosi, d, tmp(a))
Proof 1 step Qed
x87_inst(copy, x, const(-1))
Proof 1 step Qed
x87_inst(cmp(lt,x), w, tmp(a),const(906708199769027163193345))
Proof 1 step Qed
x87_inst(truncx, w, tmp(a))
Proof 1 step Qed
x87_inst(cmp(eq,x), l, tmp(a),tmp(b))
Proof 1 step Qed
x87_inst(add, w, tmp(a),tmp(b))
Proof 1 step Qed
x87_inst(ext(s), d, tmp(a))
Proof 1 step Qed
x87_op(add, x)
Proof 1 step Qed
x87_op(add, d)
Proof 1 step Qed
x87_op(cmp(lt,x), w)
Proof 1 step Qed
x87_op(cmp(lt,d), w)
Proof 1 step Qed
x87_op(truncx, s)
Proof 1 step Qed
x87_op(truncd, s)
Proof 1 step Qed
x87_op(xtoui, l)
Proof 1 step Qed
x87_op(dtoui, l)