From 3601761528eac030db6129484f6b4e685ae1ba65 Mon Sep 17 00:00:00 2001 From: Jason Gross Date: Sat, 1 Mar 2025 01:38:51 -0800 Subject: [PATCH] Add support for more assembly I want to be able to handle the output of gcc/clang on our C code. Right now, I have added support for parsing the assembly output. Equivalence checking is still to come. --- src/Assembly/Equality.v | 33 +- src/Assembly/Parse.v | 27 +- .../Examples/fiat_25519_all_clang_19_1_0_O0.v | 1912 +++++++++++ .../Examples/fiat_25519_all_clang_19_1_0_O1.v | 910 ++++++ .../Examples/fiat_25519_all_clang_19_1_0_O2.v | 898 ++++++ .../Examples/fiat_25519_all_clang_19_1_0_O3.v | 898 ++++++ .../Examples/fiat_25519_all_clang_19_1_0_Os.v | 899 ++++++ .../Examples/fiat_25519_all_gcc_14_1_O0.v | 2861 +++++++++++++++++ .../Examples/fiat_25519_all_gcc_14_1_O1.v | 927 ++++++ .../Examples/fiat_25519_all_gcc_14_1_O2.v | 856 +++++ .../Examples/fiat_25519_all_gcc_14_1_O3.v | 856 +++++ .../Examples/fiat_25519_all_gcc_14_1_Os.v | 848 +++++ src/Assembly/Parse/Examples/make-example.sh | 15 + src/Assembly/Parse/TestAsm.v | 40 + src/Assembly/Syntax.v | 522 ++- src/Assembly/WithBedrock/Semantics.v | 40 +- src/Util/Strings/ParseArithmetic.v | 52 +- 17 files changed, 12488 insertions(+), 106 deletions(-) create mode 100644 src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O0.v create mode 100644 src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O1.v create mode 100644 src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O2.v create mode 100644 src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O3.v create mode 100644 src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_Os.v create mode 100644 src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O0.v create mode 100644 src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O1.v create mode 100644 src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O2.v create mode 100644 src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O3.v create mode 100644 src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_Os.v create mode 100755 src/Assembly/Parse/Examples/make-example.sh diff --git a/src/Assembly/Equality.v b/src/Assembly/Equality.v index 4575629772..28bb5c587c 100644 --- a/src/Assembly/Equality.v +++ b/src/Assembly/Equality.v @@ -32,11 +32,39 @@ Declare Scope REG_scope. Delimit Scope REG_scope with REG. Bind Scope REG_scope with REG. + +Definition REG_beq (r1 r2 : REG) : bool := + (prod_beq _ _ (prod_beq _ _ N.eqb N.eqb) N.eqb) + (index_and_shift_and_bitcount_of_reg r1) (index_and_shift_and_bitcount_of_reg r2). + +Lemma REG_dec_lb : forall r1 r2 : REG, r1 = r2 -> REG_beq r1 r2 = true. +Proof. + intros r1 r2 H. + subst r2; destruct r1. + all: reflexivity. +Defined. + +Lemma REG_dec_bl : forall r1 r2 : REG, REG_beq r1 r2 = true -> r1 = r2. +Proof. + cbv [REG_beq]. + intros r1 r2 H. + rewrite <- (reg_of_index_and_shift_and_bitcount_of_index_and_shift_and_bitcount_of_reg r1), <- (reg_of_index_and_shift_and_bitcount_of_index_and_shift_and_bitcount_of_reg r2). + reflect_hyps. + rewrite H. + reflexivity. +Defined. + +Definition REG_eq_dec (x y : REG) : {x = y} + {x <> y} := + (if REG_beq x y as b return (REG_beq x y = b -> _) + then fun pf => left (REG_dec_bl x y pf) + else fun pf => right (fun pf' => diff_false_true (eq_trans (eq_sym pf) (REG_dec_lb x y pf')))) + eq_refl. + Infix "=?" := REG_beq : REG_scope. Global Instance REG_beq_spec : reflect_rel (@eq REG) REG_beq | 10 - := reflect_of_beq internal_REG_dec_bl internal_REG_dec_lb. -Definition REG_beq_eq x y : (x =? y)%REG = true <-> x = y := conj (@internal_REG_dec_bl _ _) (@internal_REG_dec_lb _ _). + := reflect_of_beq REG_dec_bl REG_dec_lb. +Definition REG_beq_eq x y : (x =? y)%REG = true <-> x = y := conj (@REG_dec_bl _ _) (@REG_dec_lb _ _). Lemma REG_beq_neq x y : (x =? y)%REG = false <-> x <> y. Proof. rewrite <- REG_beq_eq; destruct (x =? y)%REG; intuition congruence. Qed. Global Instance REG_beq_compat : Proper (eq ==> eq ==> eq) REG_beq | 10. @@ -108,6 +136,7 @@ Bind Scope MEM_scope with MEM. Definition MEM_beq (x y : MEM) : bool := ((option_beq AccessSize_beq x.(mem_bits_access_size) y.(mem_bits_access_size)) + && option_beq String.eqb x.(mem_constant_location_label) y.(mem_constant_location_label) && option_beq String.eqb x.(mem_base_label) y.(mem_base_label) && (option_beq REG_beq x.(mem_base_reg) y.(mem_base_reg)) && (option_beq (prod_beq _ _ Z.eqb REG_beq) x.(mem_scale_reg) y.(mem_scale_reg)) diff --git a/src/Assembly/Parse.v b/src/Assembly/Parse.v index 7b0f313d2a..09bce645df 100644 --- a/src/Assembly/Parse.v +++ b/src/Assembly/Parse.v @@ -100,16 +100,20 @@ Definition parse_label : ParserAction string (fun '(char, ls) => string_of_list_ascii (char :: ls)) (([a-zA-Z] || parse_any_ascii "._?$") ;; (([a-zA-Z] || parse_any_ascii "0123456789_$#@~.?")* )). +Definition parse_non_access_size_label : ParserAction string +:= parse_lookahead_not parse_AccessSize ;;R parse_label. Definition parse_MEM : ParserAction MEM := parse_map - (fun '(access_size, (br (*base reg*), sr (*scale reg, including z *), offset, base_label)) + (fun '(access_size, (constant_location_label, (br (*base reg*), sr (*scale reg, including z *), offset, base_label))) => {| mem_bits_access_size := access_size:option AccessSize ; mem_base_reg := br:option REG + ; mem_constant_location_label := constant_location_label:option string ; mem_base_label := base_label ; mem_scale_reg := sr:option (Z * REG) ; mem_offset := offset:option Z |}) (((strip_whitespace_after parse_AccessSize)?) ;; + (parse_non_access_size_label?) ;; (parse_option_list_map (fun '(offset, vars) => (vars <-- List.map (fun '(c, (v, e), vs) => match vs, e with [], 1%Z => Some (c, v) | _, _ => None end) vars; @@ -160,7 +164,8 @@ Definition parse_OpCode_list : list (string * OpCode) := Eval vm_compute in List.map (fun r => (show r, r)) - (list_all OpCode). + (list_all OpCode) + ++ [(".quad", dq); (".word", dw); (".byte", db)]. Definition parse_OpCode : ParserAction OpCode := parse_strs_case_insensitive parse_OpCode_list. @@ -254,11 +259,23 @@ Global Instance show_lvl_MEM : ShowLevel MEM := fun m => (match m.(mem_bits_access_size) with | Some n - => show_lvl_app (fun 'tt => if n =? 8 then "byte" else if n =? 64 then "QWORD PTR" else "BAD SIZE")%N (* TODO: Fix casing and stuff *) + => show_lvl_app (fun 'tt => if n =? 8 then "byte" + else if n =? 16 then "word" + else if n =? 32 then "dword" + else if n =? 64 then "QWORD PTR" + else if n =? 128 then "XMMWORD PTR" + else if n =? 256 then "YMMWORD PTR" + else if n =? 512 then "ZMMWORD PTR" + else "BAD SIZE")%N (* TODO: Fix casing and stuff *) | None => show_lvl end) (fun 'tt - => let reg_part + => let label_part := + match m.(mem_constant_location_label) with + | None => "" + | Some l => l + end in + let reg_part := (match m.(mem_base_reg), m.(mem_scale_reg) with | (*"[Reg]" *) Some br, None => show_REG br | (*"[Reg + Z * Reg]"*) Some br, Some (z, sr) => show_REG br ++ " + " ++ Decimal.show_Z z ++ " * " ++ show_REG sr (*only matching '+' here, because there cannot be a negative scale. *) @@ -275,7 +292,7 @@ Global Instance show_lvl_MEM : ShowLevel MEM then "0x08 * " ++ Decimal.show_Z (offset / 8) else Hex.show_Z offset) end%Z) in - "[" ++ match m.(mem_base_label) with + label_part ++ "[" ++ match m.(mem_base_label) with | None => reg_part ++ offset_part | Some l => "((" ++ l ++ offset_part ++ "))" end diff --git a/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O0.v b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O0.v new file mode 100644 index 0000000000..ec782908e6 --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O0.v @@ -0,0 +1,1912 @@ +From Coq Require Import String List. +Import ListNotations. +Local Open Scope string_scope. +Local Open Scope list_scope. +Example example : list string := [ +"_Z24fiat_25519_addcarryx_u51PmPhhmm:"; +"push rbp"; +"mov rbp, rsp"; +"mov al, dl"; +"mov qword ptr [rbp - 8], rdi"; +"mov qword ptr [rbp - 16], rsi"; +"mov byte ptr [rbp - 17], al"; +"mov qword ptr [rbp - 32], rcx"; +"mov qword ptr [rbp - 40], r8"; +"movzx eax, byte ptr [rbp - 17]"; +"add rax, qword ptr [rbp - 32]"; +"add rax, qword ptr [rbp - 40]"; +"mov qword ptr [rbp - 48], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 48]"; +"mov qword ptr [rbp - 56], rax"; +"mov rax, qword ptr [rbp - 48]"; +"shr rax, 51"; +"mov byte ptr [rbp - 57], al"; +"mov rcx, qword ptr [rbp - 56]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax], rcx"; +"mov cl, byte ptr [rbp - 57]"; +"mov rax, qword ptr [rbp - 16]"; +"mov byte ptr [rax], cl"; +"pop rbp"; +"ret"; +""; +"_Z25fiat_25519_subborrowx_u51PmPhhmm:"; +"push rbp"; +"mov rbp, rsp"; +"mov al, dl"; +"mov qword ptr [rbp - 8], rdi"; +"mov qword ptr [rbp - 16], rsi"; +"mov byte ptr [rbp - 17], al"; +"mov qword ptr [rbp - 32], rcx"; +"mov qword ptr [rbp - 40], r8"; +"mov rax, qword ptr [rbp - 32]"; +"movzx ecx, byte ptr [rbp - 17]"; +"sub rax, rcx"; +"sub rax, qword ptr [rbp - 40]"; +"mov qword ptr [rbp - 48], rax"; +"mov rax, qword ptr [rbp - 48]"; +"sar rax, 51"; +"mov byte ptr [rbp - 49], al"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 48]"; +"mov qword ptr [rbp - 64], rax"; +"mov rcx, qword ptr [rbp - 64]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax], rcx"; +"movsx ecx, byte ptr [rbp - 49]"; +"xor eax, eax"; +"sub eax, ecx"; +"mov cl, al"; +"mov rax, qword ptr [rbp - 16]"; +"mov byte ptr [rax], cl"; +"pop rbp"; +"ret"; +""; +"_Z22fiat_25519_cmovznz_u64Pmhmm:"; +"push rbp"; +"mov rbp, rsp"; +"mov al, sil"; +"mov qword ptr [rbp - 8], rdi"; +"mov byte ptr [rbp - 9], al"; +"mov qword ptr [rbp - 24], rdx"; +"mov qword ptr [rbp - 32], rcx"; +"cmp byte ptr [rbp - 9], 0"; +"setne al"; +"xor al, -1"; +"xor al, -1"; +"and al, 1"; +"mov byte ptr [rbp - 33], al"; +"movzx ecx, byte ptr [rbp - 33]"; +"xor eax, eax"; +"sub eax, ecx"; +"movsx rax, al"; +"and rax, -1"; +"mov qword ptr [rbp - 48], rax"; +"mov rax, qword ptr [rbp - 48]"; +"and rax, qword ptr [rbp - 32]"; +"mov rcx, qword ptr [rbp - 48]"; +"xor rcx, -1"; +"and rcx, qword ptr [rbp - 24]"; +"or rax, rcx"; +"mov qword ptr [rbp - 56], rax"; +"mov rcx, qword ptr [rbp - 56]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax], rcx"; +"pop rbp"; +"ret"; +""; +"_Z20fiat_25519_carry_mulPmPKmS1_:"; +"push rbp"; +"mov rbp, rsp"; +"push r14"; +"push rbx"; +"sub rsp, 592"; +"mov qword ptr [rbp - 24], rdi"; +"mov qword ptr [rbp - 32], rsi"; +"mov qword ptr [rbp - 40], rdx"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 32]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 32]"; +"lea rdx, [rcx + 8*rcx]"; +"lea rcx, [rcx + 2*rdx]"; +"mul rcx"; +"mov qword ptr [rbp - 56], rdx"; +"mov qword ptr [rbp - 64], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 32]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 24]"; +"lea rdx, [rcx + 8*rcx]"; +"lea rcx, [rcx + 2*rdx]"; +"mul rcx"; +"mov qword ptr [rbp - 72], rdx"; +"mov qword ptr [rbp - 80], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 32]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 16]"; +"lea rdx, [rcx + 8*rcx]"; +"lea rcx, [rcx + 2*rdx]"; +"mul rcx"; +"mov qword ptr [rbp - 88], rdx"; +"mov qword ptr [rbp - 96], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 32]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 8]"; +"lea rdx, [rcx + 8*rcx]"; +"lea rcx, [rcx + 2*rdx]"; +"mul rcx"; +"mov qword ptr [rbp - 104], rdx"; +"mov qword ptr [rbp - 112], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 24]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 32]"; +"lea rdx, [rcx + 8*rcx]"; +"lea rcx, [rcx + 2*rdx]"; +"mul rcx"; +"mov qword ptr [rbp - 120], rdx"; +"mov qword ptr [rbp - 128], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 24]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 24]"; +"lea rdx, [rcx + 8*rcx]"; +"lea rcx, [rcx + 2*rdx]"; +"mul rcx"; +"mov qword ptr [rbp - 136], rdx"; +"mov qword ptr [rbp - 144], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 24]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 16]"; +"lea rdx, [rcx + 8*rcx]"; +"lea rcx, [rcx + 2*rdx]"; +"mul rcx"; +"mov qword ptr [rbp - 152], rdx"; +"mov qword ptr [rbp - 160], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 16]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 32]"; +"lea rdx, [rcx + 8*rcx]"; +"lea rcx, [rcx + 2*rdx]"; +"mul rcx"; +"mov qword ptr [rbp - 168], rdx"; +"mov qword ptr [rbp - 176], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 16]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 24]"; +"lea rdx, [rcx + 8*rcx]"; +"lea rcx, [rcx + 2*rdx]"; +"mul rcx"; +"mov qword ptr [rbp - 184], rdx"; +"mov qword ptr [rbp - 192], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 8]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 32]"; +"lea rdx, [rcx + 8*rcx]"; +"lea rcx, [rcx + 2*rdx]"; +"mul rcx"; +"mov qword ptr [rbp - 200], rdx"; +"mov qword ptr [rbp - 208], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 32]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx]"; +"mul rcx"; +"mov qword ptr [rbp - 216], rdx"; +"mov qword ptr [rbp - 224], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 24]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 8]"; +"mul rcx"; +"mov qword ptr [rbp - 232], rdx"; +"mov qword ptr [rbp - 240], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 24]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx]"; +"mul rcx"; +"mov qword ptr [rbp - 248], rdx"; +"mov qword ptr [rbp - 256], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 16]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 16]"; +"mul rcx"; +"mov qword ptr [rbp - 264], rdx"; +"mov qword ptr [rbp - 272], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 16]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 8]"; +"mul rcx"; +"mov qword ptr [rbp - 280], rdx"; +"mov qword ptr [rbp - 288], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 16]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx]"; +"mul rcx"; +"mov qword ptr [rbp - 296], rdx"; +"mov qword ptr [rbp - 304], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 8]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 24]"; +"mul rcx"; +"mov qword ptr [rbp - 312], rdx"; +"mov qword ptr [rbp - 320], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 8]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 16]"; +"mul rcx"; +"mov qword ptr [rbp - 328], rdx"; +"mov qword ptr [rbp - 336], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 8]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 8]"; +"mul rcx"; +"mov qword ptr [rbp - 344], rdx"; +"mov qword ptr [rbp - 352], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax + 8]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx]"; +"mul rcx"; +"mov qword ptr [rbp - 360], rdx"; +"mov qword ptr [rbp - 368], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 32]"; +"mul rcx"; +"mov qword ptr [rbp - 376], rdx"; +"mov qword ptr [rbp - 384], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 24]"; +"mul rcx"; +"mov qword ptr [rbp - 392], rdx"; +"mov qword ptr [rbp - 400], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 16]"; +"mul rcx"; +"mov qword ptr [rbp - 408], rdx"; +"mov qword ptr [rbp - 416], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx + 8]"; +"mul rcx"; +"mov qword ptr [rbp - 424], rdx"; +"mov qword ptr [rbp - 432], rax"; +"mov rax, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rax]"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rcx, qword ptr [rcx]"; +"mul rcx"; +"mov qword ptr [rbp - 440], rdx"; +"mov qword ptr [rbp - 448], rax"; +"mov rcx, qword ptr [rbp - 448]"; +"mov rax, qword ptr [rbp - 440]"; +"mov rsi, qword ptr [rbp - 208]"; +"mov rdx, qword ptr [rbp - 200]"; +"mov r8, qword ptr [rbp - 192]"; +"mov rdi, qword ptr [rbp - 184]"; +"mov r10, qword ptr [rbp - 160]"; +"mov r9, qword ptr [rbp - 152]"; +"mov rbx, qword ptr [rbp - 112]"; +"mov r11, qword ptr [rbp - 104]"; +"add r10, rbx"; +"adc r9, r11"; +"add r8, r10"; +"adc rdi, r9"; +"add rsi, r8"; +"adc rdx, rdi"; +"add rcx, rsi"; +"adc rax, rdx"; +"mov qword ptr [rbp - 464], rcx"; +"mov qword ptr [rbp - 456], rax"; +"mov rcx, qword ptr [rbp - 464]"; +"mov rax, qword ptr [rbp - 456]"; +"shld rax, rcx, 13"; +"mov qword ptr [rbp - 472], rax"; +"mov rax, qword ptr [rbp - 464]"; +"movabs rcx, 2251799813685247"; +"and rax, rcx"; +"mov qword ptr [rbp - 480], rax"; +"mov rdx, qword ptr [rbp - 384]"; +"mov rax, qword ptr [rbp - 376]"; +"mov rdi, qword ptr [rbp - 320]"; +"mov rsi, qword ptr [rbp - 312]"; +"mov r9, qword ptr [rbp - 272]"; +"mov r8, qword ptr [rbp - 264]"; +"mov r11, qword ptr [rbp - 240]"; +"mov r10, qword ptr [rbp - 232]"; +"mov r14, qword ptr [rbp - 224]"; +"mov rbx, qword ptr [rbp - 216]"; +"add r11, r14"; +"adc r10, rbx"; +"add r9, r11"; +"adc r8, r10"; +"add rdi, r9"; +"adc rsi, r8"; +"add rdx, rdi"; +"adc rax, rsi"; +"mov qword ptr [rbp - 496], rdx"; +"mov qword ptr [rbp - 488], rax"; +"mov rdx, qword ptr [rbp - 400]"; +"mov rax, qword ptr [rbp - 392]"; +"mov rdi, qword ptr [rbp - 336]"; +"mov rsi, qword ptr [rbp - 328]"; +"mov r9, qword ptr [rbp - 288]"; +"mov r8, qword ptr [rbp - 280]"; +"mov r11, qword ptr [rbp - 256]"; +"mov r10, qword ptr [rbp - 248]"; +"mov r14, qword ptr [rbp - 64]"; +"mov rbx, qword ptr [rbp - 56]"; +"add r11, r14"; +"adc r10, rbx"; +"add r9, r11"; +"adc r8, r10"; +"add rdi, r9"; +"adc rsi, r8"; +"add rdx, rdi"; +"adc rax, rsi"; +"mov qword ptr [rbp - 512], rdx"; +"mov qword ptr [rbp - 504], rax"; +"mov rdx, qword ptr [rbp - 416]"; +"mov rax, qword ptr [rbp - 408]"; +"mov rdi, qword ptr [rbp - 352]"; +"mov rsi, qword ptr [rbp - 344]"; +"mov r9, qword ptr [rbp - 304]"; +"mov r8, qword ptr [rbp - 296]"; +"mov r11, qword ptr [rbp - 128]"; +"mov r10, qword ptr [rbp - 120]"; +"mov r14, qword ptr [rbp - 80]"; +"mov rbx, qword ptr [rbp - 72]"; +"add r11, r14"; +"adc r10, rbx"; +"add r9, r11"; +"adc r8, r10"; +"add rdi, r9"; +"adc rsi, r8"; +"add rdx, rdi"; +"adc rax, rsi"; +"mov qword ptr [rbp - 528], rdx"; +"mov qword ptr [rbp - 520], rax"; +"mov rdx, qword ptr [rbp - 432]"; +"mov rax, qword ptr [rbp - 424]"; +"mov rdi, qword ptr [rbp - 368]"; +"mov rsi, qword ptr [rbp - 360]"; +"mov r9, qword ptr [rbp - 176]"; +"mov r8, qword ptr [rbp - 168]"; +"mov r11, qword ptr [rbp - 144]"; +"mov r10, qword ptr [rbp - 136]"; +"mov r14, qword ptr [rbp - 96]"; +"mov rbx, qword ptr [rbp - 88]"; +"add r11, r14"; +"adc r10, rbx"; +"add r9, r11"; +"adc r8, r10"; +"add rdi, r9"; +"adc rsi, r8"; +"add rdx, rdi"; +"adc rax, rsi"; +"mov qword ptr [rbp - 544], rdx"; +"mov qword ptr [rbp - 536], rax"; +"mov rdx, qword ptr [rbp - 472]"; +"mov rsi, qword ptr [rbp - 544]"; +"mov rax, qword ptr [rbp - 536]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 560], rdx"; +"mov qword ptr [rbp - 552], rax"; +"mov rdx, qword ptr [rbp - 560]"; +"mov rax, qword ptr [rbp - 552]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 568], rax"; +"mov rax, qword ptr [rbp - 560]"; +"and rax, rcx"; +"mov qword ptr [rbp - 576], rax"; +"mov rdx, qword ptr [rbp - 568]"; +"mov rsi, qword ptr [rbp - 528]"; +"mov rax, qword ptr [rbp - 520]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 592], rdx"; +"mov qword ptr [rbp - 584], rax"; +"mov rdx, qword ptr [rbp - 592]"; +"mov rax, qword ptr [rbp - 584]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 600], rax"; +"mov rax, qword ptr [rbp - 592]"; +"and rax, rcx"; +"mov qword ptr [rbp - 608], rax"; +"mov rdx, qword ptr [rbp - 600]"; +"mov rsi, qword ptr [rbp - 512]"; +"mov rax, qword ptr [rbp - 504]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 624], rdx"; +"mov qword ptr [rbp - 616], rax"; +"mov rdx, qword ptr [rbp - 624]"; +"mov rax, qword ptr [rbp - 616]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 632], rax"; +"mov rax, qword ptr [rbp - 624]"; +"and rax, rcx"; +"mov qword ptr [rbp - 640], rax"; +"mov rdx, qword ptr [rbp - 632]"; +"mov rsi, qword ptr [rbp - 496]"; +"mov rax, qword ptr [rbp - 488]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 656], rdx"; +"mov qword ptr [rbp - 648], rax"; +"mov rdx, qword ptr [rbp - 656]"; +"mov rax, qword ptr [rbp - 648]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 664], rax"; +"mov rax, qword ptr [rbp - 656]"; +"and rax, rcx"; +"mov qword ptr [rbp - 672], rax"; +"imul rax, qword ptr [rbp - 664], 19"; +"mov qword ptr [rbp - 680], rax"; +"mov rax, qword ptr [rbp - 480]"; +"add rax, qword ptr [rbp - 680]"; +"mov qword ptr [rbp - 688], rax"; +"mov rax, qword ptr [rbp - 688]"; +"shr rax, 51"; +"mov qword ptr [rbp - 696], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 688]"; +"mov qword ptr [rbp - 704], rax"; +"mov rax, qword ptr [rbp - 696]"; +"add rax, qword ptr [rbp - 576]"; +"mov qword ptr [rbp - 712], rax"; +"mov rax, qword ptr [rbp - 712]"; +"shr rax, 51"; +"mov byte ptr [rbp - 713], al"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 712]"; +"mov qword ptr [rbp - 728], rax"; +"movzx eax, byte ptr [rbp - 713]"; +"add rax, qword ptr [rbp - 608]"; +"mov qword ptr [rbp - 736], rax"; +"mov rcx, qword ptr [rbp - 704]"; +"mov rax, qword ptr [rbp - 24]"; +"mov qword ptr [rax], rcx"; +"mov rcx, qword ptr [rbp - 728]"; +"mov rax, qword ptr [rbp - 24]"; +"mov qword ptr [rax + 8], rcx"; +"mov rcx, qword ptr [rbp - 736]"; +"mov rax, qword ptr [rbp - 24]"; +"mov qword ptr [rax + 16], rcx"; +"mov rcx, qword ptr [rbp - 640]"; +"mov rax, qword ptr [rbp - 24]"; +"mov qword ptr [rax + 24], rcx"; +"mov rcx, qword ptr [rbp - 672]"; +"mov rax, qword ptr [rbp - 24]"; +"mov qword ptr [rax + 32], rcx"; +"add rsp, 592"; +"pop rbx"; +"pop r14"; +"pop rbp"; +"ret"; +""; +"_Z23fiat_25519_carry_squarePmPKm:"; +"push rbp"; +"mov rbp, rsp"; +"sub rsp, 480"; +"mov qword ptr [rbp - 8], rdi"; +"mov qword ptr [rbp - 16], rsi"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 32]"; +"lea rcx, [rax + 8*rax]"; +"lea rax, [rax + 2*rcx]"; +"mov qword ptr [rbp - 24], rax"; +"mov rax, qword ptr [rbp - 24]"; +"add rax, rax"; +"mov qword ptr [rbp - 32], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 32]"; +"add rax, rax"; +"mov qword ptr [rbp - 40], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 24]"; +"lea rcx, [rax + 8*rax]"; +"lea rax, [rax + 2*rcx]"; +"mov qword ptr [rbp - 48], rax"; +"mov rax, qword ptr [rbp - 48]"; +"add rax, rax"; +"mov qword ptr [rbp - 56], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 24]"; +"add rax, rax"; +"mov qword ptr [rbp - 64], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 16]"; +"add rax, rax"; +"mov qword ptr [rbp - 72], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 8]"; +"add rax, rax"; +"mov qword ptr [rbp - 80], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 32]"; +"mov rcx, qword ptr [rbp - 24]"; +"mul rcx"; +"mov qword ptr [rbp - 88], rdx"; +"mov qword ptr [rbp - 96], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 24]"; +"mov rcx, qword ptr [rbp - 32]"; +"mul rcx"; +"mov qword ptr [rbp - 104], rdx"; +"mov qword ptr [rbp - 112], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 24]"; +"mov rcx, qword ptr [rbp - 48]"; +"mul rcx"; +"mov qword ptr [rbp - 120], rdx"; +"mov qword ptr [rbp - 128], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 16]"; +"mov rcx, qword ptr [rbp - 32]"; +"mul rcx"; +"mov qword ptr [rbp - 136], rdx"; +"mov qword ptr [rbp - 144], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 16]"; +"mov rcx, qword ptr [rbp - 56]"; +"mul rcx"; +"mov qword ptr [rbp - 152], rdx"; +"mov qword ptr [rbp - 160], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rcx, qword ptr [rax + 16]"; +"mov rax, rcx"; +"mul rcx"; +"mov qword ptr [rbp - 168], rdx"; +"mov qword ptr [rbp - 176], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 8]"; +"mov rcx, qword ptr [rbp - 32]"; +"mul rcx"; +"mov qword ptr [rbp - 184], rdx"; +"mov qword ptr [rbp - 192], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 8]"; +"mov rcx, qword ptr [rbp - 64]"; +"mul rcx"; +"mov qword ptr [rbp - 200], rdx"; +"mov qword ptr [rbp - 208], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 8]"; +"mov rcx, qword ptr [rbp - 72]"; +"mul rcx"; +"mov qword ptr [rbp - 216], rdx"; +"mov qword ptr [rbp - 224], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rcx, qword ptr [rax + 8]"; +"mov rax, rcx"; +"mul rcx"; +"mov qword ptr [rbp - 232], rdx"; +"mov qword ptr [rbp - 240], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax]"; +"mov rcx, qword ptr [rbp - 40]"; +"mul rcx"; +"mov qword ptr [rbp - 248], rdx"; +"mov qword ptr [rbp - 256], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax]"; +"mov rcx, qword ptr [rbp - 64]"; +"mul rcx"; +"mov qword ptr [rbp - 264], rdx"; +"mov qword ptr [rbp - 272], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax]"; +"mov rcx, qword ptr [rbp - 72]"; +"mul rcx"; +"mov qword ptr [rbp - 280], rdx"; +"mov qword ptr [rbp - 288], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax]"; +"mov rcx, qword ptr [rbp - 80]"; +"mul rcx"; +"mov qword ptr [rbp - 296], rdx"; +"mov qword ptr [rbp - 304], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rcx, qword ptr [rax]"; +"mov rax, rcx"; +"mul rcx"; +"mov qword ptr [rbp - 312], rdx"; +"mov qword ptr [rbp - 320], rax"; +"mov rcx, qword ptr [rbp - 320]"; +"mov rax, qword ptr [rbp - 312]"; +"mov rsi, qword ptr [rbp - 192]"; +"mov rdx, qword ptr [rbp - 184]"; +"mov r8, qword ptr [rbp - 160]"; +"mov rdi, qword ptr [rbp - 152]"; +"add rsi, r8"; +"adc rdx, rdi"; +"add rcx, rsi"; +"adc rax, rdx"; +"mov qword ptr [rbp - 336], rcx"; +"mov qword ptr [rbp - 328], rax"; +"mov rcx, qword ptr [rbp - 336]"; +"mov rax, qword ptr [rbp - 328]"; +"shld rax, rcx, 13"; +"mov qword ptr [rbp - 344], rax"; +"mov rax, qword ptr [rbp - 336]"; +"movabs rcx, 2251799813685247"; +"and rax, rcx"; +"mov qword ptr [rbp - 352], rax"; +"mov rdx, qword ptr [rbp - 256]"; +"mov rax, qword ptr [rbp - 248]"; +"mov rdi, qword ptr [rbp - 208]"; +"mov rsi, qword ptr [rbp - 200]"; +"mov r9, qword ptr [rbp - 176]"; +"mov r8, qword ptr [rbp - 168]"; +"add rdi, r9"; +"adc rsi, r8"; +"add rdx, rdi"; +"adc rax, rsi"; +"mov qword ptr [rbp - 368], rdx"; +"mov qword ptr [rbp - 360], rax"; +"mov rdx, qword ptr [rbp - 272]"; +"mov rax, qword ptr [rbp - 264]"; +"mov rdi, qword ptr [rbp - 224]"; +"mov rsi, qword ptr [rbp - 216]"; +"mov r9, qword ptr [rbp - 96]"; +"mov r8, qword ptr [rbp - 88]"; +"add rdi, r9"; +"adc rsi, r8"; +"add rdx, rdi"; +"adc rax, rsi"; +"mov qword ptr [rbp - 384], rdx"; +"mov qword ptr [rbp - 376], rax"; +"mov rdx, qword ptr [rbp - 288]"; +"mov rax, qword ptr [rbp - 280]"; +"mov rdi, qword ptr [rbp - 240]"; +"mov rsi, qword ptr [rbp - 232]"; +"mov r9, qword ptr [rbp - 112]"; +"mov r8, qword ptr [rbp - 104]"; +"add rdi, r9"; +"adc rsi, r8"; +"add rdx, rdi"; +"adc rax, rsi"; +"mov qword ptr [rbp - 400], rdx"; +"mov qword ptr [rbp - 392], rax"; +"mov rdx, qword ptr [rbp - 304]"; +"mov rax, qword ptr [rbp - 296]"; +"mov rdi, qword ptr [rbp - 144]"; +"mov rsi, qword ptr [rbp - 136]"; +"mov r9, qword ptr [rbp - 128]"; +"mov r8, qword ptr [rbp - 120]"; +"add rdi, r9"; +"adc rsi, r8"; +"add rdx, rdi"; +"adc rax, rsi"; +"mov qword ptr [rbp - 416], rdx"; +"mov qword ptr [rbp - 408], rax"; +"mov rdx, qword ptr [rbp - 344]"; +"mov rsi, qword ptr [rbp - 416]"; +"mov rax, qword ptr [rbp - 408]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 432], rdx"; +"mov qword ptr [rbp - 424], rax"; +"mov rdx, qword ptr [rbp - 432]"; +"mov rax, qword ptr [rbp - 424]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 440], rax"; +"mov rax, qword ptr [rbp - 432]"; +"and rax, rcx"; +"mov qword ptr [rbp - 448], rax"; +"mov rdx, qword ptr [rbp - 440]"; +"mov rsi, qword ptr [rbp - 400]"; +"mov rax, qword ptr [rbp - 392]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 464], rdx"; +"mov qword ptr [rbp - 456], rax"; +"mov rdx, qword ptr [rbp - 464]"; +"mov rax, qword ptr [rbp - 456]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 472], rax"; +"mov rax, qword ptr [rbp - 464]"; +"and rax, rcx"; +"mov qword ptr [rbp - 480], rax"; +"mov rdx, qword ptr [rbp - 472]"; +"mov rsi, qword ptr [rbp - 384]"; +"mov rax, qword ptr [rbp - 376]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 496], rdx"; +"mov qword ptr [rbp - 488], rax"; +"mov rdx, qword ptr [rbp - 496]"; +"mov rax, qword ptr [rbp - 488]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 504], rax"; +"mov rax, qword ptr [rbp - 496]"; +"and rax, rcx"; +"mov qword ptr [rbp - 512], rax"; +"mov rdx, qword ptr [rbp - 504]"; +"mov rsi, qword ptr [rbp - 368]"; +"mov rax, qword ptr [rbp - 360]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 528], rdx"; +"mov qword ptr [rbp - 520], rax"; +"mov rdx, qword ptr [rbp - 528]"; +"mov rax, qword ptr [rbp - 520]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 536], rax"; +"mov rax, qword ptr [rbp - 528]"; +"and rax, rcx"; +"mov qword ptr [rbp - 544], rax"; +"imul rax, qword ptr [rbp - 536], 19"; +"mov qword ptr [rbp - 552], rax"; +"mov rax, qword ptr [rbp - 352]"; +"add rax, qword ptr [rbp - 552]"; +"mov qword ptr [rbp - 560], rax"; +"mov rax, qword ptr [rbp - 560]"; +"shr rax, 51"; +"mov qword ptr [rbp - 568], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 560]"; +"mov qword ptr [rbp - 576], rax"; +"mov rax, qword ptr [rbp - 568]"; +"add rax, qword ptr [rbp - 448]"; +"mov qword ptr [rbp - 584], rax"; +"mov rax, qword ptr [rbp - 584]"; +"shr rax, 51"; +"mov byte ptr [rbp - 585], al"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 584]"; +"mov qword ptr [rbp - 600], rax"; +"movzx eax, byte ptr [rbp - 585]"; +"add rax, qword ptr [rbp - 480]"; +"mov qword ptr [rbp - 608], rax"; +"mov rcx, qword ptr [rbp - 576]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax], rcx"; +"mov rcx, qword ptr [rbp - 600]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 8], rcx"; +"mov rcx, qword ptr [rbp - 608]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 16], rcx"; +"mov rcx, qword ptr [rbp - 512]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 24], rcx"; +"mov rcx, qword ptr [rbp - 544]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 32], rcx"; +"add rsp, 480"; +"pop rbp"; +"ret"; +""; +"_Z29fiat_25519_carry_scmul_121666PmPKm:"; +"push rbp"; +"mov rbp, rsp"; +"sub rsp, 176"; +"mov qword ptr [rbp - 8], rdi"; +"mov qword ptr [rbp - 16], rsi"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 32]"; +"mov ecx, 121666"; +"mul rcx"; +"mov qword ptr [rbp - 24], rdx"; +"mov qword ptr [rbp - 32], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 24]"; +"mul rcx"; +"mov qword ptr [rbp - 40], rdx"; +"mov qword ptr [rbp - 48], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 16]"; +"mul rcx"; +"mov qword ptr [rbp - 56], rdx"; +"mov qword ptr [rbp - 64], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 8]"; +"mul rcx"; +"mov qword ptr [rbp - 72], rdx"; +"mov qword ptr [rbp - 80], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax]"; +"mul rcx"; +"mov qword ptr [rbp - 88], rdx"; +"mov qword ptr [rbp - 96], rax"; +"mov rcx, qword ptr [rbp - 96]"; +"mov rax, qword ptr [rbp - 88]"; +"shld rax, rcx, 13"; +"mov qword ptr [rbp - 104], rax"; +"mov rax, qword ptr [rbp - 96]"; +"movabs rcx, 2251799813685247"; +"and rax, rcx"; +"mov qword ptr [rbp - 112], rax"; +"mov rdx, qword ptr [rbp - 104]"; +"mov rsi, qword ptr [rbp - 80]"; +"mov rax, qword ptr [rbp - 72]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 128], rdx"; +"mov qword ptr [rbp - 120], rax"; +"mov rdx, qword ptr [rbp - 128]"; +"mov rax, qword ptr [rbp - 120]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 136], rax"; +"mov rax, qword ptr [rbp - 128]"; +"and rax, rcx"; +"mov qword ptr [rbp - 144], rax"; +"mov rdx, qword ptr [rbp - 136]"; +"mov rsi, qword ptr [rbp - 64]"; +"mov rax, qword ptr [rbp - 56]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 160], rdx"; +"mov qword ptr [rbp - 152], rax"; +"mov rdx, qword ptr [rbp - 160]"; +"mov rax, qword ptr [rbp - 152]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 168], rax"; +"mov rax, qword ptr [rbp - 160]"; +"and rax, rcx"; +"mov qword ptr [rbp - 176], rax"; +"mov rdx, qword ptr [rbp - 168]"; +"mov rsi, qword ptr [rbp - 48]"; +"mov rax, qword ptr [rbp - 40]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 192], rdx"; +"mov qword ptr [rbp - 184], rax"; +"mov rdx, qword ptr [rbp - 192]"; +"mov rax, qword ptr [rbp - 184]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 200], rax"; +"mov rax, qword ptr [rbp - 192]"; +"and rax, rcx"; +"mov qword ptr [rbp - 208], rax"; +"mov rdx, qword ptr [rbp - 200]"; +"mov rsi, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rbp - 24]"; +"add rdx, rsi"; +"adc rax, 0"; +"mov qword ptr [rbp - 224], rdx"; +"mov qword ptr [rbp - 216], rax"; +"mov rdx, qword ptr [rbp - 224]"; +"mov rax, qword ptr [rbp - 216]"; +"shld rax, rdx, 13"; +"mov qword ptr [rbp - 232], rax"; +"mov rax, qword ptr [rbp - 224]"; +"and rax, rcx"; +"mov qword ptr [rbp - 240], rax"; +"imul rax, qword ptr [rbp - 232], 19"; +"mov qword ptr [rbp - 248], rax"; +"mov rax, qword ptr [rbp - 112]"; +"add rax, qword ptr [rbp - 248]"; +"mov qword ptr [rbp - 256], rax"; +"mov rax, qword ptr [rbp - 256]"; +"shr rax, 51"; +"mov byte ptr [rbp - 257], al"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 256]"; +"mov qword ptr [rbp - 272], rax"; +"movzx eax, byte ptr [rbp - 257]"; +"add rax, qword ptr [rbp - 144]"; +"mov qword ptr [rbp - 280], rax"; +"mov rax, qword ptr [rbp - 280]"; +"shr rax, 51"; +"mov byte ptr [rbp - 281], al"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 280]"; +"mov qword ptr [rbp - 296], rax"; +"movzx eax, byte ptr [rbp - 281]"; +"add rax, qword ptr [rbp - 176]"; +"mov qword ptr [rbp - 304], rax"; +"mov rcx, qword ptr [rbp - 272]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax], rcx"; +"mov rcx, qword ptr [rbp - 296]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 8], rcx"; +"mov rcx, qword ptr [rbp - 304]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 16], rcx"; +"mov rcx, qword ptr [rbp - 208]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 24], rcx"; +"mov rcx, qword ptr [rbp - 240]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 32], rcx"; +"add rsp, 176"; +"pop rbp"; +"ret"; +""; +"_Z16fiat_25519_carryPmPKm:"; +"push rbp"; +"mov rbp, rsp"; +"mov qword ptr [rbp - 8], rdi"; +"mov qword ptr [rbp - 16], rsi"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax]"; +"mov qword ptr [rbp - 24], rax"; +"mov rax, qword ptr [rbp - 24]"; +"shr rax, 51"; +"mov rcx, qword ptr [rbp - 16]"; +"add rax, qword ptr [rcx + 8]"; +"mov qword ptr [rbp - 32], rax"; +"mov rax, qword ptr [rbp - 32]"; +"shr rax, 51"; +"mov rcx, qword ptr [rbp - 16]"; +"add rax, qword ptr [rcx + 16]"; +"mov qword ptr [rbp - 40], rax"; +"mov rax, qword ptr [rbp - 40]"; +"shr rax, 51"; +"mov rcx, qword ptr [rbp - 16]"; +"add rax, qword ptr [rcx + 24]"; +"mov qword ptr [rbp - 48], rax"; +"mov rax, qword ptr [rbp - 48]"; +"shr rax, 51"; +"mov rcx, qword ptr [rbp - 16]"; +"add rax, qword ptr [rcx + 32]"; +"mov qword ptr [rbp - 56], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 24]"; +"mov rcx, qword ptr [rbp - 56]"; +"shr rcx, 51"; +"imul rcx, rcx, 19"; +"add rax, rcx"; +"mov qword ptr [rbp - 64], rax"; +"mov rax, qword ptr [rbp - 64]"; +"shr rax, 51"; +"movzx eax, al"; +"movabs rcx, 2251799813685247"; +"and rcx, qword ptr [rbp - 32]"; +"add rax, rcx"; +"mov qword ptr [rbp - 72], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 64]"; +"mov qword ptr [rbp - 80], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 72]"; +"mov qword ptr [rbp - 88], rax"; +"mov rax, qword ptr [rbp - 72]"; +"shr rax, 51"; +"movzx eax, al"; +"movabs rcx, 2251799813685247"; +"and rcx, qword ptr [rbp - 40]"; +"add rax, rcx"; +"mov qword ptr [rbp - 96], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 48]"; +"mov qword ptr [rbp - 104], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 56]"; +"mov qword ptr [rbp - 112], rax"; +"mov rcx, qword ptr [rbp - 80]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax], rcx"; +"mov rcx, qword ptr [rbp - 88]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 8], rcx"; +"mov rcx, qword ptr [rbp - 96]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 16], rcx"; +"mov rcx, qword ptr [rbp - 104]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 24], rcx"; +"mov rcx, qword ptr [rbp - 112]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 32], rcx"; +"pop rbp"; +"ret"; +""; +"_Z14fiat_25519_addPmPKmS1_:"; +"push rbp"; +"mov rbp, rsp"; +"mov qword ptr [rbp - 8], rdi"; +"mov qword ptr [rbp - 16], rsi"; +"mov qword ptr [rbp - 24], rdx"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax]"; +"mov rcx, qword ptr [rbp - 24]"; +"add rax, qword ptr [rcx]"; +"mov qword ptr [rbp - 32], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 8]"; +"mov rcx, qword ptr [rbp - 24]"; +"add rax, qword ptr [rcx + 8]"; +"mov qword ptr [rbp - 40], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 16]"; +"mov rcx, qword ptr [rbp - 24]"; +"add rax, qword ptr [rcx + 16]"; +"mov qword ptr [rbp - 48], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 24]"; +"mov rcx, qword ptr [rbp - 24]"; +"add rax, qword ptr [rcx + 24]"; +"mov qword ptr [rbp - 56], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov rax, qword ptr [rax + 32]"; +"mov rcx, qword ptr [rbp - 24]"; +"add rax, qword ptr [rcx + 32]"; +"mov qword ptr [rbp - 64], rax"; +"mov rcx, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax], rcx"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 8], rcx"; +"mov rcx, qword ptr [rbp - 48]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 16], rcx"; +"mov rcx, qword ptr [rbp - 56]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 24], rcx"; +"mov rcx, qword ptr [rbp - 64]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 32], rcx"; +"pop rbp"; +"ret"; +""; +"_Z14fiat_25519_subPmPKmS1_:"; +"push rbp"; +"mov rbp, rsp"; +"mov qword ptr [rbp - 8], rdi"; +"mov qword ptr [rbp - 16], rsi"; +"mov qword ptr [rbp - 24], rdx"; +"mov rcx, qword ptr [rbp - 16]"; +"movabs rax, 4503599627370458"; +"add rax, qword ptr [rcx]"; +"mov rcx, qword ptr [rbp - 24]"; +"sub rax, qword ptr [rcx]"; +"mov qword ptr [rbp - 32], rax"; +"mov rcx, qword ptr [rbp - 16]"; +"movabs rax, 4503599627370494"; +"add rax, qword ptr [rcx + 8]"; +"mov rcx, qword ptr [rbp - 24]"; +"sub rax, qword ptr [rcx + 8]"; +"mov qword ptr [rbp - 40], rax"; +"mov rcx, qword ptr [rbp - 16]"; +"movabs rax, 4503599627370494"; +"add rax, qword ptr [rcx + 16]"; +"mov rcx, qword ptr [rbp - 24]"; +"sub rax, qword ptr [rcx + 16]"; +"mov qword ptr [rbp - 48], rax"; +"mov rcx, qword ptr [rbp - 16]"; +"movabs rax, 4503599627370494"; +"add rax, qword ptr [rcx + 24]"; +"mov rcx, qword ptr [rbp - 24]"; +"sub rax, qword ptr [rcx + 24]"; +"mov qword ptr [rbp - 56], rax"; +"mov rcx, qword ptr [rbp - 16]"; +"movabs rax, 4503599627370494"; +"add rax, qword ptr [rcx + 32]"; +"mov rcx, qword ptr [rbp - 24]"; +"sub rax, qword ptr [rcx + 32]"; +"mov qword ptr [rbp - 64], rax"; +"mov rcx, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax], rcx"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 8], rcx"; +"mov rcx, qword ptr [rbp - 48]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 16], rcx"; +"mov rcx, qword ptr [rbp - 56]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 24], rcx"; +"mov rcx, qword ptr [rbp - 64]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 32], rcx"; +"pop rbp"; +"ret"; +""; +"_Z14fiat_25519_oppPmPKm:"; +"push rbp"; +"mov rbp, rsp"; +"mov qword ptr [rbp - 8], rdi"; +"mov qword ptr [rbp - 16], rsi"; +"mov rcx, qword ptr [rbp - 16]"; +"movabs rax, 4503599627370458"; +"sub rax, qword ptr [rcx]"; +"mov qword ptr [rbp - 24], rax"; +"mov rcx, qword ptr [rbp - 16]"; +"movabs rax, 4503599627370494"; +"sub rax, qword ptr [rcx + 8]"; +"mov qword ptr [rbp - 32], rax"; +"mov rcx, qword ptr [rbp - 16]"; +"movabs rax, 4503599627370494"; +"sub rax, qword ptr [rcx + 16]"; +"mov qword ptr [rbp - 40], rax"; +"mov rcx, qword ptr [rbp - 16]"; +"movabs rax, 4503599627370494"; +"sub rax, qword ptr [rcx + 24]"; +"mov qword ptr [rbp - 48], rax"; +"mov rcx, qword ptr [rbp - 16]"; +"movabs rax, 4503599627370494"; +"sub rax, qword ptr [rcx + 32]"; +"mov qword ptr [rbp - 56], rax"; +"mov rcx, qword ptr [rbp - 24]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax], rcx"; +"mov rcx, qword ptr [rbp - 32]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 8], rcx"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 16], rcx"; +"mov rcx, qword ptr [rbp - 48]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 24], rcx"; +"mov rcx, qword ptr [rbp - 56]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 32], rcx"; +"pop rbp"; +"ret"; +""; +"_Z20fiat_25519_selectznzPmhPKmS1_:"; +"push rbp"; +"mov rbp, rsp"; +"sub rsp, 80"; +"mov al, sil"; +"mov qword ptr [rbp - 8], rdi"; +"mov byte ptr [rbp - 9], al"; +"mov qword ptr [rbp - 24], rdx"; +"mov qword ptr [rbp - 32], rcx"; +"mov al, byte ptr [rbp - 9]"; +"mov rcx, qword ptr [rbp - 24]"; +"mov rdx, qword ptr [rcx]"; +"mov rcx, qword ptr [rbp - 32]"; +"mov rcx, qword ptr [rcx]"; +"lea rdi, [rbp - 40]"; +"movzx esi, al"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov al, byte ptr [rbp - 9]"; +"mov rcx, qword ptr [rbp - 24]"; +"mov rdx, qword ptr [rcx + 8]"; +"mov rcx, qword ptr [rbp - 32]"; +"mov rcx, qword ptr [rcx + 8]"; +"lea rdi, [rbp - 48]"; +"movzx esi, al"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov al, byte ptr [rbp - 9]"; +"mov rcx, qword ptr [rbp - 24]"; +"mov rdx, qword ptr [rcx + 16]"; +"mov rcx, qword ptr [rbp - 32]"; +"mov rcx, qword ptr [rcx + 16]"; +"lea rdi, [rbp - 56]"; +"movzx esi, al"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov al, byte ptr [rbp - 9]"; +"mov rcx, qword ptr [rbp - 24]"; +"mov rdx, qword ptr [rcx + 24]"; +"mov rcx, qword ptr [rbp - 32]"; +"mov rcx, qword ptr [rcx + 24]"; +"lea rdi, [rbp - 64]"; +"movzx esi, al"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov al, byte ptr [rbp - 9]"; +"mov rcx, qword ptr [rbp - 24]"; +"mov rdx, qword ptr [rcx + 32]"; +"mov rcx, qword ptr [rbp - 32]"; +"mov rcx, qword ptr [rcx + 32]"; +"lea rdi, [rbp - 72]"; +"movzx esi, al"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov rcx, qword ptr [rbp - 40]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax], rcx"; +"mov rcx, qword ptr [rbp - 48]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 8], rcx"; +"mov rcx, qword ptr [rbp - 56]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 16], rcx"; +"mov rcx, qword ptr [rbp - 64]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 24], rcx"; +"mov rcx, qword ptr [rbp - 72]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 32], rcx"; +"add rsp, 80"; +"pop rbp"; +"ret"; +""; +"_Z19fiat_25519_to_bytesPhPKm:"; +"push rbp"; +"mov rbp, rsp"; +"sub rsp, 704"; +"mov qword ptr [rbp - 8], rdi"; +"mov qword ptr [rbp - 16], rsi"; +"mov rax, qword ptr [rbp - 16]"; +"mov rcx, qword ptr [rax]"; +"lea rdi, [rbp - 24]"; +"lea rsi, [rbp - 25]"; +"xor edx, edx"; +"movabs r8, 2251799813685229"; +"call _Z25fiat_25519_subborrowx_u51PmPhhmm"; +"mov al, byte ptr [rbp - 25]"; +"mov rcx, qword ptr [rbp - 16]"; +"mov rcx, qword ptr [rcx + 8]"; +"lea rdi, [rbp - 40]"; +"lea rsi, [rbp - 41]"; +"movabs r8, 2251799813685247"; +"movzx edx, al"; +"call _Z25fiat_25519_subborrowx_u51PmPhhmm"; +"mov al, byte ptr [rbp - 41]"; +"mov rcx, qword ptr [rbp - 16]"; +"mov rcx, qword ptr [rcx + 16]"; +"lea rdi, [rbp - 56]"; +"lea rsi, [rbp - 57]"; +"movabs r8, 2251799813685247"; +"movzx edx, al"; +"call _Z25fiat_25519_subborrowx_u51PmPhhmm"; +"mov al, byte ptr [rbp - 57]"; +"mov rcx, qword ptr [rbp - 16]"; +"mov rcx, qword ptr [rcx + 24]"; +"lea rdi, [rbp - 72]"; +"lea rsi, [rbp - 73]"; +"movabs r8, 2251799813685247"; +"movzx edx, al"; +"call _Z25fiat_25519_subborrowx_u51PmPhhmm"; +"mov al, byte ptr [rbp - 73]"; +"mov rcx, qword ptr [rbp - 16]"; +"mov rcx, qword ptr [rcx + 32]"; +"lea rdi, [rbp - 88]"; +"lea rsi, [rbp - 89]"; +"movabs r8, 2251799813685247"; +"movzx edx, al"; +"call _Z25fiat_25519_subborrowx_u51PmPhhmm"; +"lea rdi, [rbp - 104]"; +"xor eax, eax"; +"mov edx, eax"; +"mov rcx, -1"; +"movzx esi, byte ptr [rbp - 89]"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov rcx, qword ptr [rbp - 24]"; +"movabs r8, 2251799813685229"; +"and r8, qword ptr [rbp - 104]"; +"lea rdi, [rbp - 112]"; +"lea rsi, [rbp - 113]"; +"xor edx, edx"; +"call _Z24fiat_25519_addcarryx_u51PmPhhmm"; +"mov al, byte ptr [rbp - 113]"; +"mov rcx, qword ptr [rbp - 40]"; +"movabs r8, 2251799813685247"; +"and r8, qword ptr [rbp - 104]"; +"lea rdi, [rbp - 128]"; +"lea rsi, [rbp - 129]"; +"movzx edx, al"; +"call _Z24fiat_25519_addcarryx_u51PmPhhmm"; +"mov al, byte ptr [rbp - 129]"; +"mov rcx, qword ptr [rbp - 56]"; +"movabs r8, 2251799813685247"; +"and r8, qword ptr [rbp - 104]"; +"lea rdi, [rbp - 144]"; +"lea rsi, [rbp - 145]"; +"movzx edx, al"; +"call _Z24fiat_25519_addcarryx_u51PmPhhmm"; +"mov al, byte ptr [rbp - 145]"; +"mov rcx, qword ptr [rbp - 72]"; +"movabs r8, 2251799813685247"; +"and r8, qword ptr [rbp - 104]"; +"lea rdi, [rbp - 160]"; +"lea rsi, [rbp - 161]"; +"movzx edx, al"; +"call _Z24fiat_25519_addcarryx_u51PmPhhmm"; +"mov al, byte ptr [rbp - 161]"; +"mov rcx, qword ptr [rbp - 88]"; +"movabs r8, 2251799813685247"; +"and r8, qword ptr [rbp - 104]"; +"lea rdi, [rbp - 176]"; +"lea rsi, [rbp - 177]"; +"movzx edx, al"; +"call _Z24fiat_25519_addcarryx_u51PmPhhmm"; +"mov rax, qword ptr [rbp - 176]"; +"shl rax, 4"; +"mov qword ptr [rbp - 192], rax"; +"mov rax, qword ptr [rbp - 160]"; +"shl rax"; +"mov qword ptr [rbp - 200], rax"; +"mov rax, qword ptr [rbp - 144]"; +"shl rax, 6"; +"mov qword ptr [rbp - 208], rax"; +"mov rax, qword ptr [rbp - 128]"; +"shl rax, 3"; +"mov qword ptr [rbp - 216], rax"; +"mov rax, qword ptr [rbp - 112]"; +"and rax, 255"; +"mov byte ptr [rbp - 217], al"; +"mov rax, qword ptr [rbp - 112]"; +"shr rax, 8"; +"mov qword ptr [rbp - 232], rax"; +"mov rax, qword ptr [rbp - 232]"; +"and rax, 255"; +"mov byte ptr [rbp - 233], al"; +"mov rax, qword ptr [rbp - 232]"; +"shr rax, 8"; +"mov qword ptr [rbp - 248], rax"; +"mov rax, qword ptr [rbp - 248]"; +"and rax, 255"; +"mov byte ptr [rbp - 249], al"; +"mov rax, qword ptr [rbp - 248]"; +"shr rax, 8"; +"mov qword ptr [rbp - 264], rax"; +"mov rax, qword ptr [rbp - 264]"; +"and rax, 255"; +"mov byte ptr [rbp - 265], al"; +"mov rax, qword ptr [rbp - 264]"; +"shr rax, 8"; +"mov qword ptr [rbp - 280], rax"; +"mov rax, qword ptr [rbp - 280]"; +"and rax, 255"; +"mov byte ptr [rbp - 281], al"; +"mov rax, qword ptr [rbp - 280]"; +"shr rax, 8"; +"mov qword ptr [rbp - 296], rax"; +"mov rax, qword ptr [rbp - 296]"; +"and rax, 255"; +"mov byte ptr [rbp - 297], al"; +"mov rax, qword ptr [rbp - 296]"; +"shr rax, 8"; +"mov byte ptr [rbp - 298], al"; +"mov rax, qword ptr [rbp - 216]"; +"movzx ecx, byte ptr [rbp - 298]"; +"add rax, rcx"; +"mov qword ptr [rbp - 312], rax"; +"mov rax, qword ptr [rbp - 312]"; +"and rax, 255"; +"mov byte ptr [rbp - 313], al"; +"mov rax, qword ptr [rbp - 312]"; +"shr rax, 8"; +"mov qword ptr [rbp - 328], rax"; +"mov rax, qword ptr [rbp - 328]"; +"and rax, 255"; +"mov byte ptr [rbp - 329], al"; +"mov rax, qword ptr [rbp - 328]"; +"shr rax, 8"; +"mov qword ptr [rbp - 344], rax"; +"mov rax, qword ptr [rbp - 344]"; +"and rax, 255"; +"mov byte ptr [rbp - 345], al"; +"mov rax, qword ptr [rbp - 344]"; +"shr rax, 8"; +"mov qword ptr [rbp - 360], rax"; +"mov rax, qword ptr [rbp - 360]"; +"and rax, 255"; +"mov byte ptr [rbp - 361], al"; +"mov rax, qword ptr [rbp - 360]"; +"shr rax, 8"; +"mov qword ptr [rbp - 376], rax"; +"mov rax, qword ptr [rbp - 376]"; +"and rax, 255"; +"mov byte ptr [rbp - 377], al"; +"mov rax, qword ptr [rbp - 376]"; +"shr rax, 8"; +"mov qword ptr [rbp - 392], rax"; +"mov rax, qword ptr [rbp - 392]"; +"and rax, 255"; +"mov byte ptr [rbp - 393], al"; +"mov rax, qword ptr [rbp - 392]"; +"shr rax, 8"; +"mov byte ptr [rbp - 394], al"; +"mov rax, qword ptr [rbp - 208]"; +"movzx ecx, byte ptr [rbp - 394]"; +"add rax, rcx"; +"mov qword ptr [rbp - 408], rax"; +"mov rax, qword ptr [rbp - 408]"; +"and rax, 255"; +"mov byte ptr [rbp - 409], al"; +"mov rax, qword ptr [rbp - 408]"; +"shr rax, 8"; +"mov qword ptr [rbp - 424], rax"; +"mov rax, qword ptr [rbp - 424]"; +"and rax, 255"; +"mov byte ptr [rbp - 425], al"; +"mov rax, qword ptr [rbp - 424]"; +"shr rax, 8"; +"mov qword ptr [rbp - 440], rax"; +"mov rax, qword ptr [rbp - 440]"; +"and rax, 255"; +"mov byte ptr [rbp - 441], al"; +"mov rax, qword ptr [rbp - 440]"; +"shr rax, 8"; +"mov qword ptr [rbp - 456], rax"; +"mov rax, qword ptr [rbp - 456]"; +"and rax, 255"; +"mov byte ptr [rbp - 457], al"; +"mov rax, qword ptr [rbp - 456]"; +"shr rax, 8"; +"mov qword ptr [rbp - 472], rax"; +"mov rax, qword ptr [rbp - 472]"; +"and rax, 255"; +"mov byte ptr [rbp - 473], al"; +"mov rax, qword ptr [rbp - 472]"; +"shr rax, 8"; +"mov qword ptr [rbp - 488], rax"; +"mov rax, qword ptr [rbp - 488]"; +"and rax, 255"; +"mov byte ptr [rbp - 489], al"; +"mov rax, qword ptr [rbp - 488]"; +"shr rax, 8"; +"mov qword ptr [rbp - 504], rax"; +"mov rax, qword ptr [rbp - 504]"; +"and rax, 255"; +"mov byte ptr [rbp - 505], al"; +"mov rax, qword ptr [rbp - 504]"; +"shr rax, 8"; +"mov byte ptr [rbp - 506], al"; +"mov rax, qword ptr [rbp - 200]"; +"movzx ecx, byte ptr [rbp - 506]"; +"add rax, rcx"; +"mov qword ptr [rbp - 520], rax"; +"mov rax, qword ptr [rbp - 520]"; +"and rax, 255"; +"mov byte ptr [rbp - 521], al"; +"mov rax, qword ptr [rbp - 520]"; +"shr rax, 8"; +"mov qword ptr [rbp - 536], rax"; +"mov rax, qword ptr [rbp - 536]"; +"and rax, 255"; +"mov byte ptr [rbp - 537], al"; +"mov rax, qword ptr [rbp - 536]"; +"shr rax, 8"; +"mov qword ptr [rbp - 552], rax"; +"mov rax, qword ptr [rbp - 552]"; +"and rax, 255"; +"mov byte ptr [rbp - 553], al"; +"mov rax, qword ptr [rbp - 552]"; +"shr rax, 8"; +"mov qword ptr [rbp - 568], rax"; +"mov rax, qword ptr [rbp - 568]"; +"and rax, 255"; +"mov byte ptr [rbp - 569], al"; +"mov rax, qword ptr [rbp - 568]"; +"shr rax, 8"; +"mov qword ptr [rbp - 584], rax"; +"mov rax, qword ptr [rbp - 584]"; +"and rax, 255"; +"mov byte ptr [rbp - 585], al"; +"mov rax, qword ptr [rbp - 584]"; +"shr rax, 8"; +"mov qword ptr [rbp - 600], rax"; +"mov rax, qword ptr [rbp - 600]"; +"and rax, 255"; +"mov byte ptr [rbp - 601], al"; +"mov rax, qword ptr [rbp - 600]"; +"shr rax, 8"; +"mov byte ptr [rbp - 602], al"; +"mov rax, qword ptr [rbp - 192]"; +"movzx ecx, byte ptr [rbp - 602]"; +"add rax, rcx"; +"mov qword ptr [rbp - 616], rax"; +"mov rax, qword ptr [rbp - 616]"; +"and rax, 255"; +"mov byte ptr [rbp - 617], al"; +"mov rax, qword ptr [rbp - 616]"; +"shr rax, 8"; +"mov qword ptr [rbp - 632], rax"; +"mov rax, qword ptr [rbp - 632]"; +"and rax, 255"; +"mov byte ptr [rbp - 633], al"; +"mov rax, qword ptr [rbp - 632]"; +"shr rax, 8"; +"mov qword ptr [rbp - 648], rax"; +"mov rax, qword ptr [rbp - 648]"; +"and rax, 255"; +"mov byte ptr [rbp - 649], al"; +"mov rax, qword ptr [rbp - 648]"; +"shr rax, 8"; +"mov qword ptr [rbp - 664], rax"; +"mov rax, qword ptr [rbp - 664]"; +"and rax, 255"; +"mov byte ptr [rbp - 665], al"; +"mov rax, qword ptr [rbp - 664]"; +"shr rax, 8"; +"mov qword ptr [rbp - 680], rax"; +"mov rax, qword ptr [rbp - 680]"; +"and rax, 255"; +"mov byte ptr [rbp - 681], al"; +"mov rax, qword ptr [rbp - 680]"; +"shr rax, 8"; +"mov qword ptr [rbp - 696], rax"; +"mov rax, qword ptr [rbp - 696]"; +"and rax, 255"; +"mov byte ptr [rbp - 697], al"; +"mov rax, qword ptr [rbp - 696]"; +"shr rax, 8"; +"mov byte ptr [rbp - 698], al"; +"mov cl, byte ptr [rbp - 217]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax], cl"; +"mov cl, byte ptr [rbp - 233]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 1], cl"; +"mov cl, byte ptr [rbp - 249]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 2], cl"; +"mov cl, byte ptr [rbp - 265]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 3], cl"; +"mov cl, byte ptr [rbp - 281]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 4], cl"; +"mov cl, byte ptr [rbp - 297]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 5], cl"; +"mov cl, byte ptr [rbp - 313]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 6], cl"; +"mov cl, byte ptr [rbp - 329]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 7], cl"; +"mov cl, byte ptr [rbp - 345]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 8], cl"; +"mov cl, byte ptr [rbp - 361]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 9], cl"; +"mov cl, byte ptr [rbp - 377]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 10], cl"; +"mov cl, byte ptr [rbp - 393]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 11], cl"; +"mov cl, byte ptr [rbp - 409]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 12], cl"; +"mov cl, byte ptr [rbp - 425]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 13], cl"; +"mov cl, byte ptr [rbp - 441]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 14], cl"; +"mov cl, byte ptr [rbp - 457]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 15], cl"; +"mov cl, byte ptr [rbp - 473]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 16], cl"; +"mov cl, byte ptr [rbp - 489]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 17], cl"; +"mov cl, byte ptr [rbp - 505]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 18], cl"; +"mov cl, byte ptr [rbp - 521]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 19], cl"; +"mov cl, byte ptr [rbp - 537]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 20], cl"; +"mov cl, byte ptr [rbp - 553]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 21], cl"; +"mov cl, byte ptr [rbp - 569]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 22], cl"; +"mov cl, byte ptr [rbp - 585]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 23], cl"; +"mov cl, byte ptr [rbp - 601]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 24], cl"; +"mov cl, byte ptr [rbp - 617]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 25], cl"; +"mov cl, byte ptr [rbp - 633]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 26], cl"; +"mov cl, byte ptr [rbp - 649]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 27], cl"; +"mov cl, byte ptr [rbp - 665]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 28], cl"; +"mov cl, byte ptr [rbp - 681]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 29], cl"; +"mov cl, byte ptr [rbp - 697]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 30], cl"; +"mov cl, byte ptr [rbp - 698]"; +"mov rax, qword ptr [rbp - 8]"; +"mov byte ptr [rax + 31], cl"; +"add rsp, 704"; +"pop rbp"; +"ret"; +""; +"_Z21fiat_25519_from_bytesPmPKh:"; +"push rbp"; +"mov rbp, rsp"; +"sub rsp, 456"; +"mov qword ptr [rbp - 8], rdi"; +"mov qword ptr [rbp - 16], rsi"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 31]"; +"shl rax, 44"; +"mov qword ptr [rbp - 24], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 30]"; +"shl rax, 36"; +"mov qword ptr [rbp - 32], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 29]"; +"shl rax, 28"; +"mov qword ptr [rbp - 40], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 28]"; +"shl rax, 20"; +"mov qword ptr [rbp - 48], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 27]"; +"shl rax, 12"; +"mov qword ptr [rbp - 56], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 26]"; +"shl rax, 4"; +"mov qword ptr [rbp - 64], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 25]"; +"shl rax, 47"; +"mov qword ptr [rbp - 72], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 24]"; +"shl rax, 39"; +"mov qword ptr [rbp - 80], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 23]"; +"shl rax, 31"; +"mov qword ptr [rbp - 88], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 22]"; +"shl rax, 23"; +"mov qword ptr [rbp - 96], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 21]"; +"shl rax, 15"; +"mov qword ptr [rbp - 104], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 20]"; +"shl rax, 7"; +"mov qword ptr [rbp - 112], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 19]"; +"shl rax, 50"; +"mov qword ptr [rbp - 120], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 18]"; +"shl rax, 42"; +"mov qword ptr [rbp - 128], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 17]"; +"shl rax, 34"; +"mov qword ptr [rbp - 136], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 16]"; +"shl rax, 26"; +"mov qword ptr [rbp - 144], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 15]"; +"shl rax, 18"; +"mov qword ptr [rbp - 152], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 14]"; +"shl rax, 10"; +"mov qword ptr [rbp - 160], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 13]"; +"shl rax, 2"; +"mov qword ptr [rbp - 168], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 12]"; +"shl rax, 45"; +"mov qword ptr [rbp - 176], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 11]"; +"shl rax, 37"; +"mov qword ptr [rbp - 184], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 10]"; +"shl rax, 29"; +"mov qword ptr [rbp - 192], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 9]"; +"shl rax, 21"; +"mov qword ptr [rbp - 200], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 8]"; +"shl rax, 13"; +"mov qword ptr [rbp - 208], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 7]"; +"shl rax, 5"; +"mov qword ptr [rbp - 216], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 6]"; +"shl rax, 48"; +"mov qword ptr [rbp - 224], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 5]"; +"shl rax, 40"; +"mov qword ptr [rbp - 232], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 4]"; +"shl rax, 32"; +"mov qword ptr [rbp - 240], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 3]"; +"shl rax, 24"; +"mov qword ptr [rbp - 248], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 2]"; +"shl rax, 16"; +"mov qword ptr [rbp - 256], rax"; +"mov rax, qword ptr [rbp - 16]"; +"movzx eax, byte ptr [rax + 1]"; +"shl rax, 8"; +"mov qword ptr [rbp - 264], rax"; +"mov rax, qword ptr [rbp - 16]"; +"mov al, byte ptr [rax]"; +"mov byte ptr [rbp - 265], al"; +"mov rax, qword ptr [rbp - 264]"; +"movzx ecx, byte ptr [rbp - 265]"; +"add rax, rcx"; +"mov qword ptr [rbp - 280], rax"; +"mov rax, qword ptr [rbp - 256]"; +"add rax, qword ptr [rbp - 280]"; +"mov qword ptr [rbp - 288], rax"; +"mov rax, qword ptr [rbp - 248]"; +"add rax, qword ptr [rbp - 288]"; +"mov qword ptr [rbp - 296], rax"; +"mov rax, qword ptr [rbp - 240]"; +"add rax, qword ptr [rbp - 296]"; +"mov qword ptr [rbp - 304], rax"; +"mov rax, qword ptr [rbp - 232]"; +"add rax, qword ptr [rbp - 304]"; +"mov qword ptr [rbp - 312], rax"; +"mov rax, qword ptr [rbp - 224]"; +"add rax, qword ptr [rbp - 312]"; +"mov qword ptr [rbp - 320], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 320]"; +"mov qword ptr [rbp - 328], rax"; +"mov rax, qword ptr [rbp - 320]"; +"shr rax, 51"; +"mov byte ptr [rbp - 329], al"; +"mov rax, qword ptr [rbp - 216]"; +"movzx ecx, byte ptr [rbp - 329]"; +"add rax, rcx"; +"mov qword ptr [rbp - 344], rax"; +"mov rax, qword ptr [rbp - 208]"; +"add rax, qword ptr [rbp - 344]"; +"mov qword ptr [rbp - 352], rax"; +"mov rax, qword ptr [rbp - 200]"; +"add rax, qword ptr [rbp - 352]"; +"mov qword ptr [rbp - 360], rax"; +"mov rax, qword ptr [rbp - 192]"; +"add rax, qword ptr [rbp - 360]"; +"mov qword ptr [rbp - 368], rax"; +"mov rax, qword ptr [rbp - 184]"; +"add rax, qword ptr [rbp - 368]"; +"mov qword ptr [rbp - 376], rax"; +"mov rax, qword ptr [rbp - 176]"; +"add rax, qword ptr [rbp - 376]"; +"mov qword ptr [rbp - 384], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 384]"; +"mov qword ptr [rbp - 392], rax"; +"mov rax, qword ptr [rbp - 384]"; +"shr rax, 51"; +"mov byte ptr [rbp - 393], al"; +"mov rax, qword ptr [rbp - 168]"; +"movzx ecx, byte ptr [rbp - 393]"; +"add rax, rcx"; +"mov qword ptr [rbp - 408], rax"; +"mov rax, qword ptr [rbp - 160]"; +"add rax, qword ptr [rbp - 408]"; +"mov qword ptr [rbp - 416], rax"; +"mov rax, qword ptr [rbp - 152]"; +"add rax, qword ptr [rbp - 416]"; +"mov qword ptr [rbp - 424], rax"; +"mov rax, qword ptr [rbp - 144]"; +"add rax, qword ptr [rbp - 424]"; +"mov qword ptr [rbp - 432], rax"; +"mov rax, qword ptr [rbp - 136]"; +"add rax, qword ptr [rbp - 432]"; +"mov qword ptr [rbp - 440], rax"; +"mov rax, qword ptr [rbp - 128]"; +"add rax, qword ptr [rbp - 440]"; +"mov qword ptr [rbp - 448], rax"; +"mov rax, qword ptr [rbp - 120]"; +"add rax, qword ptr [rbp - 448]"; +"mov qword ptr [rbp - 456], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 456]"; +"mov qword ptr [rbp - 464], rax"; +"mov rax, qword ptr [rbp - 456]"; +"shr rax, 51"; +"mov byte ptr [rbp - 465], al"; +"mov rax, qword ptr [rbp - 112]"; +"movzx ecx, byte ptr [rbp - 465]"; +"add rax, rcx"; +"mov qword ptr [rbp - 480], rax"; +"mov rax, qword ptr [rbp - 104]"; +"add rax, qword ptr [rbp - 480]"; +"mov qword ptr [rbp - 488], rax"; +"mov rax, qword ptr [rbp - 96]"; +"add rax, qword ptr [rbp - 488]"; +"mov qword ptr [rbp - 496], rax"; +"mov rax, qword ptr [rbp - 88]"; +"add rax, qword ptr [rbp - 496]"; +"mov qword ptr [rbp - 504], rax"; +"mov rax, qword ptr [rbp - 80]"; +"add rax, qword ptr [rbp - 504]"; +"mov qword ptr [rbp - 512], rax"; +"mov rax, qword ptr [rbp - 72]"; +"add rax, qword ptr [rbp - 512]"; +"mov qword ptr [rbp - 520], rax"; +"movabs rax, 2251799813685247"; +"and rax, qword ptr [rbp - 520]"; +"mov qword ptr [rbp - 528], rax"; +"mov rax, qword ptr [rbp - 520]"; +"shr rax, 51"; +"mov byte ptr [rbp - 529], al"; +"mov rax, qword ptr [rbp - 64]"; +"movzx ecx, byte ptr [rbp - 529]"; +"add rax, rcx"; +"mov qword ptr [rbp - 544], rax"; +"mov rax, qword ptr [rbp - 56]"; +"add rax, qword ptr [rbp - 544]"; +"mov qword ptr [rbp - 552], rax"; +"mov rax, qword ptr [rbp - 48]"; +"add rax, qword ptr [rbp - 552]"; +"mov qword ptr [rbp - 560], rax"; +"mov rax, qword ptr [rbp - 40]"; +"add rax, qword ptr [rbp - 560]"; +"mov qword ptr [rbp - 568], rax"; +"mov rax, qword ptr [rbp - 32]"; +"add rax, qword ptr [rbp - 568]"; +"mov qword ptr [rbp - 576], rax"; +"mov rax, qword ptr [rbp - 24]"; +"add rax, qword ptr [rbp - 576]"; +"mov qword ptr [rbp - 584], rax"; +"mov rcx, qword ptr [rbp - 328]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax], rcx"; +"mov rcx, qword ptr [rbp - 392]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 8], rcx"; +"mov rcx, qword ptr [rbp - 464]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 16], rcx"; +"mov rcx, qword ptr [rbp - 528]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 24], rcx"; +"mov rcx, qword ptr [rbp - 584]"; +"mov rax, qword ptr [rbp - 8]"; +"mov qword ptr [rax + 32], rcx"; +"add rsp, 456"; +"pop rbp"; +""]. diff --git a/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O1.v b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O1.v new file mode 100644 index 0000000000..47c305c5bc --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O1.v @@ -0,0 +1,910 @@ +From Coq Require Import String List. +Import ListNotations. +Local Open Scope string_scope. +Local Open Scope list_scope. +Example example : list string := [ +"_Z24fiat_25519_addcarryx_u51PmPhhmm:"; +"mov eax, edx"; +"add rcx, r8"; +"add rcx, rax"; +"movabs rax, 2251799813685247"; +"and rax, rcx"; +"shr rcx, 51"; +"mov qword ptr [rdi], rax"; +"mov byte ptr [rsi], cl"; +"ret"; +""; +"_Z25fiat_25519_subborrowx_u51PmPhhmm:"; +"mov eax, edx"; +"add rax, r8"; +"sub rcx, rax"; +"movabs rax, 2251799813685247"; +"and rax, rcx"; +"mov qword ptr [rdi], rax"; +"shr rcx, 51"; +"neg cl"; +"mov byte ptr [rsi], cl"; +"ret"; +""; +"_Z22fiat_25519_cmovznz_u64Pmhmm:"; +"test esi, esi"; +"cmovne rdx, rcx"; +"mov qword ptr [rdi], rdx"; +"ret"; +""; +"_Z20fiat_25519_carry_mulPmPKmS1_:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"sub rsp, 192"; +"mov r8, rdx"; +"mov r15, qword ptr [rsi + 32]"; +"mov r13, rsi"; +"mov qword ptr [rsp - 104], rsi"; +"mov rcx, qword ptr [rdx + 32]"; +"mov qword ptr [rsp - 96], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea rbx, [rcx + 2*rax]"; +"mov rax, rbx"; +"mul r15"; +"mov qword ptr [rsp + 176], rax"; +"mov qword ptr [rsp + 184], rdx"; +"mov rcx, qword ptr [r8 + 24]"; +"mov qword ptr [rsp - 120], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea r9, [rcx + 2*rax]"; +"mov rax, r9"; +"mul r15"; +"mov qword ptr [rsp + 144], rax"; +"mov qword ptr [rsp + 152], rdx"; +"mov rcx, qword ptr [r8 + 16]"; +"mov qword ptr [rsp - 128], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea r10, [rcx + 2*rax]"; +"mov rax, r10"; +"mul r15"; +"mov qword ptr [rsp + 128], rax"; +"mov qword ptr [rsp + 136], rdx"; +"mov rcx, qword ptr [r8 + 8]"; +"lea rax, [rcx + 8*rcx]"; +"lea rax, [rcx + 2*rax]"; +"mul r15"; +"mov qword ptr [rsp + 56], rax"; +"mov qword ptr [rsp + 64], rdx"; +"mov r14, qword ptr [rsi + 24]"; +"mov rax, r14"; +"mul rbx"; +"mov r11, rdx"; +"mov qword ptr [rsp + 40], rax"; +"mov rax, r14"; +"mul r9"; +"mov rbp, rdx"; +"mov rsi, rax"; +"mov rax, r14"; +"mul r10"; +"mov qword ptr [rsp + 16], rax"; +"mov r12, rdx"; +"mov r10, qword ptr [r13 + 16]"; +"mov rax, r10"; +"mul rbx"; +"mov qword ptr [rsp + 72], rdx"; +"mov qword ptr [rsp + 48], rax"; +"mov rax, r10"; +"mul r9"; +"mov qword ptr [rsp - 16], rax"; +"mov qword ptr [rsp - 8], rdx"; +"mov r9, qword ptr [r13 + 8]"; +"mov rax, r9"; +"mul rbx"; +"mov qword ptr [rsp - 32], rax"; +"mov qword ptr [rsp - 24], rdx"; +"mov r8, qword ptr [r8]"; +"mov rax, r8"; +"mul r15"; +"mov qword ptr [rsp + 168], rdx"; +"mov qword ptr [rsp + 160], rax"; +"mov rax, r14"; +"mov r15, rcx"; +"mov qword ptr [rsp - 112], rcx"; +"mul rcx"; +"mov qword ptr [rsp + 120], rdx"; +"mov qword ptr [rsp + 112], rax"; +"mov rax, r8"; +"mov qword ptr [rsp - 88], r8"; +"mul r14"; +"mov qword ptr [rsp + 104], rdx"; +"mov qword ptr [rsp + 96], rax"; +"mov rax, r10"; +"mov rcx, qword ptr [rsp - 128]"; +"mul rcx"; +"mov r13, rdx"; +"mov rbx, rax"; +"mov rax, r10"; +"mul r15"; +"mov r15, rdx"; +"mov r14, rax"; +"mov rax, r8"; +"mul r10"; +"mov qword ptr [rsp + 8], rdx"; +"mov qword ptr [rsp], rax"; +"mov rax, r9"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp + 88], rdx"; +"mov qword ptr [rsp + 80], rax"; +"mov rax, r9"; +"mul rcx"; +"mov qword ptr [rsp + 32], rdx"; +"mov qword ptr [rsp + 24], rax"; +"mov rax, r9"; +"mov r8, qword ptr [rsp - 112]"; +"mul r8"; +"mov qword ptr [rsp - 56], rax"; +"mov qword ptr [rsp - 48], rdx"; +"mov rax, qword ptr [rsp - 104]"; +"mov r10, qword ptr [rax]"; +"mov rcx, qword ptr [rsp - 88]"; +"mov rax, rcx"; +"mul r9"; +"mov qword ptr [rsp - 72], rdx"; +"mov qword ptr [rsp - 80], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 96]"; +"mov qword ptr [rsp - 96], rdx"; +"mov qword ptr [rsp - 104], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp - 120], rdx"; +"mov qword ptr [rsp - 40], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 128]"; +"mov qword ptr [rsp - 128], rdx"; +"mov qword ptr [rsp - 64], rax"; +"mov rax, r10"; +"mul r8"; +"mov qword ptr [rsp - 112], rdx"; +"mov r9, rax"; +"mov rax, r10"; +"mul rcx"; +"mov r8, qword ptr [rsp + 16]"; +"add r8, qword ptr [rsp + 56]"; +"adc r12, qword ptr [rsp + 64]"; +"add r8, qword ptr [rsp - 16]"; +"adc r12, qword ptr [rsp - 8]"; +"add r8, qword ptr [rsp - 32]"; +"adc r12, qword ptr [rsp - 24]"; +"add r8, rax"; +"adc r12, rdx"; +"shld r12, r8, 13"; +"movabs rax, 2251799813685247"; +"and r8, rax"; +"mov rcx, qword ptr [rsp + 40]"; +"add rcx, qword ptr [rsp + 144]"; +"adc r11, qword ptr [rsp + 152]"; +"add rsi, qword ptr [rsp + 128]"; +"adc rbp, qword ptr [rsp + 136]"; +"add rsi, qword ptr [rsp + 48]"; +"adc rbp, qword ptr [rsp + 72]"; +"add rsi, qword ptr [rsp - 80]"; +"adc rbp, qword ptr [rsp - 72]"; +"add rsi, r9"; +"adc rbp, qword ptr [rsp - 112]"; +"add rsi, r12"; +"adc rbp, 0"; +"shld rbp, rsi, 13"; +"and rsi, rax"; +"add rcx, qword ptr [rsp - 56]"; +"adc r11, qword ptr [rsp - 48]"; +"add rcx, qword ptr [rsp]"; +"adc r11, qword ptr [rsp + 8]"; +"add rcx, qword ptr [rsp - 64]"; +"adc r11, qword ptr [rsp - 128]"; +"add rcx, rbp"; +"adc r11, 0"; +"shld r11, rcx, 13"; +"and rcx, rax"; +"add r14, qword ptr [rsp + 176]"; +"adc r15, qword ptr [rsp + 184]"; +"add r14, qword ptr [rsp + 24]"; +"adc r15, qword ptr [rsp + 32]"; +"add r14, qword ptr [rsp + 96]"; +"adc r15, qword ptr [rsp + 104]"; +"add r14, qword ptr [rsp - 40]"; +"adc r15, qword ptr [rsp - 120]"; +"add r14, r11"; +"adc r15, 0"; +"shld r15, r14, 13"; +"and r14, rax"; +"add rbx, qword ptr [rsp + 112]"; +"adc r13, qword ptr [rsp + 120]"; +"add rbx, qword ptr [rsp + 80]"; +"adc r13, qword ptr [rsp + 88]"; +"add rbx, qword ptr [rsp + 160]"; +"adc r13, qword ptr [rsp + 168]"; +"add rbx, qword ptr [rsp - 104]"; +"adc r13, qword ptr [rsp - 96]"; +"add rbx, r15"; +"adc r13, 0"; +"shld r13, rbx, 13"; +"lea rdx, [8*r13]"; +"add rdx, r13"; +"lea rdx, [2*rdx]"; +"add rdx, r13"; +"add rdx, r8"; +"mov r8, rdx"; +"shr r8, 51"; +"add r8, rsi"; +"mov rsi, r8"; +"shr rsi, 51"; +"add rsi, rcx"; +"and rbx, rax"; +"and rdx, rax"; +"and r8, rax"; +"mov qword ptr [rdi], rdx"; +"mov qword ptr [rdi + 8], r8"; +"mov qword ptr [rdi + 16], rsi"; +"mov qword ptr [rdi + 24], r14"; +"mov qword ptr [rdi + 32], rbx"; +"add rsp, 192"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z23fiat_25519_carry_squarePmPKm:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"push rax"; +"mov rdx, qword ptr [rsi + 32]"; +"lea rax, [rdx + 8*rdx]"; +"lea rax, [rdx + 2*rax]"; +"imul r10, rdx, 38"; +"lea rcx, [rdx + rdx]"; +"mov qword ptr [rsp - 112], rcx"; +"mov r8, qword ptr [rsi + 24]"; +"lea rcx, [r8 + 8*r8]"; +"lea rcx, [r8 + 2*rcx]"; +"imul r11, r8, 38"; +"mul rdx"; +"mov qword ptr [rsp - 32], rax"; +"mov qword ptr [rsp - 24], rdx"; +"mov r9, qword ptr [rsi + 16]"; +"mov rax, r8"; +"mul r10"; +"mov qword ptr [rsp - 8], rdx"; +"mov qword ptr [rsp - 40], rax"; +"mov rax, rcx"; +"mul r8"; +"mov qword ptr [rsp], rdx"; +"mov qword ptr [rsp - 16], rax"; +"mov rax, r9"; +"mul r10"; +"mov rbx, rax"; +"mov rcx, rdx"; +"add r8, r8"; +"mov qword ptr [rsp - 128], r8"; +"mov rax, r9"; +"mul r11"; +"mov qword ptr [rsp - 72], rax"; +"mov qword ptr [rsp - 64], rdx"; +"lea r14, [r9 + r9]"; +"mov qword ptr [rsp - 120], r14"; +"mov rax, r9"; +"mul r9"; +"mov qword ptr [rsp - 56], rax"; +"mov qword ptr [rsp - 48], rdx"; +"mov rbp, qword ptr [rsi + 8]"; +"mov rax, rbp"; +"mul r10"; +"mov r15, rdx"; +"mov r9, rax"; +"mov rax, rbp"; +"mul r8"; +"mov r11, rdx"; +"mov r13, rax"; +"mov rax, rbp"; +"mul r14"; +"mov r14, rax"; +"mov r8, rdx"; +"mov rsi, qword ptr [rsi]"; +"mov rax, rbp"; +"mul rbp"; +"mov r10, rdx"; +"mov r12, rax"; +"mov rax, rsi"; +"mul qword ptr [rsp - 112]"; +"mov qword ptr [rsp - 80], rdx"; +"mov qword ptr [rsp - 104], rax"; +"mov rax, rsi"; +"mul qword ptr [rsp - 128]"; +"mov qword ptr [rsp - 88], rax"; +"mov qword ptr [rsp - 128], rdx"; +"add rbp, rbp"; +"mov rax, rsi"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp - 112], rdx"; +"mov qword ptr [rsp - 96], rax"; +"mov rax, rsi"; +"mul rbp"; +"mov rbp, rdx"; +"mov qword ptr [rsp - 120], rax"; +"mov rax, rsi"; +"mul rsi"; +"add r9, qword ptr [rsp - 72]"; +"adc r15, qword ptr [rsp - 64]"; +"add r9, rax"; +"adc r15, rdx"; +"shld r15, r9, 13"; +"movabs rax, 2251799813685247"; +"and r9, rax"; +"add r13, qword ptr [rsp - 56]"; +"adc r11, qword ptr [rsp - 48]"; +"add r13, qword ptr [rsp - 104]"; +"adc r11, qword ptr [rsp - 80]"; +"add r14, qword ptr [rsp - 32]"; +"adc r8, qword ptr [rsp - 24]"; +"add r14, qword ptr [rsp - 88]"; +"adc r8, qword ptr [rsp - 128]"; +"add r12, qword ptr [rsp - 40]"; +"adc r10, qword ptr [rsp - 8]"; +"add r12, qword ptr [rsp - 96]"; +"adc r10, qword ptr [rsp - 112]"; +"add rbx, qword ptr [rsp - 16]"; +"adc rcx, qword ptr [rsp]"; +"add rbx, qword ptr [rsp - 120]"; +"adc rcx, rbp"; +"add rbx, r15"; +"adc rcx, 0"; +"shld rcx, rbx, 13"; +"and rbx, rax"; +"add rcx, r12"; +"adc r10, 0"; +"shld r10, rcx, 13"; +"and rcx, rax"; +"add r10, r14"; +"adc r8, 0"; +"shld r8, r10, 13"; +"and r10, rax"; +"add r8, r13"; +"adc r11, 0"; +"shld r11, r8, 13"; +"lea rdx, [r11 + 8*r11]"; +"lea rdx, [r11 + 2*rdx]"; +"add rdx, r9"; +"mov rsi, rdx"; +"shr rsi, 51"; +"add rsi, rbx"; +"mov r9, rsi"; +"shr r9, 51"; +"add r9, rcx"; +"and r8, rax"; +"and rdx, rax"; +"and rsi, rax"; +"mov qword ptr [rdi], rdx"; +"mov qword ptr [rdi + 8], rsi"; +"mov qword ptr [rdi + 16], r9"; +"mov qword ptr [rdi + 24], r10"; +"mov qword ptr [rdi + 32], r8"; +"add rsp, 8"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z29fiat_25519_carry_scmul_121666PmPKm:"; +"push r15"; +"push r14"; +"push r12"; +"push rbx"; +"mov eax, 121666"; +"mul qword ptr [rsi + 32]"; +"mov r8, rdx"; +"mov r10, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 24]"; +"mov rcx, rdx"; +"mov r11, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 16]"; +"mov r14, rdx"; +"mov rbx, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 8]"; +"mov r15, rax"; +"mov r9, rdx"; +"mov eax, 121666"; +"mul qword ptr [rsi]"; +"shld rdx, rax, 13"; +"movabs rsi, 2251799813685247"; +"lea r12, [rsi - 1]"; +"and r12, rax"; +"add rdx, r15"; +"adc r9, 0"; +"shld r9, rdx, 13"; +"and rdx, rsi"; +"add r9, rbx"; +"adc r14, 0"; +"shld r14, r9, 13"; +"and r9, rsi"; +"add r14, r11"; +"adc rcx, 0"; +"shld rcx, r14, 13"; +"and r14, rsi"; +"add rcx, r10"; +"adc r8, 0"; +"shld r8, rcx, 13"; +"and rcx, rsi"; +"lea rax, [r8 + 8*r8]"; +"lea rax, [r8 + 2*rax]"; +"add rax, r12"; +"mov r8, rax"; +"shr r8, 51"; +"and rax, rsi"; +"movzx r8d, r8b"; +"add r8, rdx"; +"mov rdx, r8"; +"shr rdx, 51"; +"add rdx, r9"; +"and r8, rsi"; +"mov qword ptr [rdi], rax"; +"mov qword ptr [rdi + 8], r8"; +"mov qword ptr [rdi + 16], rdx"; +"mov qword ptr [rdi + 24], r14"; +"mov qword ptr [rdi + 32], rcx"; +"pop rbx"; +"pop r12"; +"pop r14"; +"pop r15"; +"ret"; +""; +"_Z16fiat_25519_carryPmPKm:"; +"mov r9, qword ptr [rsi]"; +"mov rcx, r9"; +"shr rcx, 51"; +"add rcx, qword ptr [rsi + 8]"; +"mov rax, rcx"; +"shr rax, 51"; +"add rax, qword ptr [rsi + 16]"; +"mov rdx, rax"; +"shr rdx, 51"; +"add rdx, qword ptr [rsi + 24]"; +"mov r8, rdx"; +"shr r8, 51"; +"add r8, qword ptr [rsi + 32]"; +"movabs rsi, 2251799813685247"; +"and r9, rsi"; +"mov r10, r8"; +"shr r10, 51"; +"lea r11, [r10 + 8*r10]"; +"lea r10, [r10 + 2*r11]"; +"add r10, r9"; +"mov r9, r10"; +"shr r9, 51"; +"and rcx, rsi"; +"add rcx, r9"; +"and r10, rsi"; +"mov r9, rcx"; +"and r9, rsi"; +"shr rcx, 51"; +"and rax, rsi"; +"add rax, rcx"; +"and rdx, rsi"; +"and r8, rsi"; +"mov qword ptr [rdi], r10"; +"mov qword ptr [rdi + 8], r9"; +"mov qword ptr [rdi + 16], rax"; +"mov qword ptr [rdi + 24], rdx"; +"mov qword ptr [rdi + 32], r8"; +"ret"; +""; +"_Z14fiat_25519_addPmPKmS1_:"; +"mov rax, qword ptr [rdx]"; +"mov rcx, qword ptr [rdx + 8]"; +"add rax, qword ptr [rsi]"; +"add rcx, qword ptr [rsi + 8]"; +"mov r8, qword ptr [rdx + 16]"; +"add r8, qword ptr [rsi + 16]"; +"mov r9, qword ptr [rdx + 24]"; +"add r9, qword ptr [rsi + 24]"; +"mov rdx, qword ptr [rdx + 32]"; +"add rdx, qword ptr [rsi + 32]"; +"mov qword ptr [rdi], rax"; +"mov qword ptr [rdi + 8], rcx"; +"mov qword ptr [rdi + 16], r8"; +"mov qword ptr [rdi + 24], r9"; +"mov qword ptr [rdi + 32], rdx"; +"ret"; +""; +"_Z14fiat_25519_subPmPKmS1_:"; +"movabs rax, 4503599627370494"; +"mov rcx, qword ptr [rsi]"; +"add rcx, rax"; +"sub rcx, qword ptr [rdx]"; +"mov r8, qword ptr [rsi + 8]"; +"add r8, rax"; +"sub r8, qword ptr [rdx + 8]"; +"mov r9, qword ptr [rsi + 16]"; +"add r9, rax"; +"sub r9, qword ptr [rdx + 16]"; +"mov r10, qword ptr [rsi + 24]"; +"add r10, rax"; +"sub r10, qword ptr [rdx + 24]"; +"add rax, qword ptr [rsi + 32]"; +"add rcx, -36"; +"sub rax, qword ptr [rdx + 32]"; +"mov qword ptr [rdi], rcx"; +"mov qword ptr [rdi + 8], r8"; +"mov qword ptr [rdi + 16], r9"; +"mov qword ptr [rdi + 24], r10"; +"mov qword ptr [rdi + 32], rax"; +"ret"; +""; +"_Z14fiat_25519_oppPmPKm:"; +"movabs rax, 4503599627370494"; +"mov rcx, rax"; +"sub rcx, qword ptr [rsi]"; +"mov rdx, rax"; +"sub rdx, qword ptr [rsi + 8]"; +"mov r8, rax"; +"sub r8, qword ptr [rsi + 16]"; +"mov r9, rax"; +"sub r9, qword ptr [rsi + 24]"; +"add rcx, -36"; +"sub rax, qword ptr [rsi + 32]"; +"mov qword ptr [rdi], rcx"; +"mov qword ptr [rdi + 8], rdx"; +"mov qword ptr [rdi + 16], r8"; +"mov qword ptr [rdi + 24], r9"; +"mov qword ptr [rdi + 32], rax"; +"ret"; +""; +"_Z20fiat_25519_selectznzPmhPKmS1_:"; +"push r15"; +"push r14"; +"push rbx"; +"lea rax, [rdx + 8]"; +"lea r8, [rcx + 8]"; +"lea r9, [rdx + 16]"; +"lea r10, [rcx + 16]"; +"lea r11, [rdx + 24]"; +"lea rbx, [rcx + 24]"; +"lea r14, [rdx + 32]"; +"lea r15, [rcx + 32]"; +"test esi, esi"; +"cmove rcx, rdx"; +"cmove r8, rax"; +"mov rax, qword ptr [rcx]"; +"mov rcx, qword ptr [r8]"; +"cmove r10, r9"; +"mov rdx, qword ptr [r10]"; +"cmove rbx, r11"; +"mov rsi, qword ptr [rbx]"; +"cmove r15, r14"; +"mov r8, qword ptr [r15]"; +"mov qword ptr [rdi], rax"; +"mov qword ptr [rdi + 8], rcx"; +"mov qword ptr [rdi + 16], rdx"; +"mov qword ptr [rdi + 24], rsi"; +"mov qword ptr [rdi + 32], r8"; +"pop rbx"; +"pop r14"; +"pop r15"; +"ret"; +""; +"_Z19fiat_25519_to_bytesPhPKm:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"mov rax, qword ptr [rsi]"; +"movabs r9, -2251799813685247"; +"add rax, r9"; +"add rax, 18"; +"movabs r11, 2251799813685247"; +"mov r10, rax"; +"and r10, r11"; +"shr rax, 51"; +"neg eax"; +"movzx eax, al"; +"mov rcx, qword ptr [rsi + 8]"; +"add rcx, r9"; +"sub rcx, rax"; +"mov rax, rcx"; +"and rax, r11"; +"shr rcx, 51"; +"neg ecx"; +"movzx ecx, cl"; +"mov rdx, qword ptr [rsi + 16]"; +"add rdx, r9"; +"sub rdx, rcx"; +"mov r8, rdx"; +"and r8, r11"; +"shr rdx, 51"; +"neg edx"; +"movzx ecx, dl"; +"mov rbx, qword ptr [rsi + 24]"; +"add rbx, r9"; +"sub rbx, rcx"; +"mov rdx, rbx"; +"and rdx, r11"; +"shr rbx, 51"; +"neg ebx"; +"add r9, qword ptr [rsi + 32]"; +"movzx ecx, bl"; +"sub r9, rcx"; +"movabs rcx, 574208952489738240"; +"and rcx, r9"; +"lea rbx, [r11 - 18]"; +"test rcx, rcx"; +"cmove rbx, rcx"; +"cmovne rcx, r11"; +"add rbx, r10"; +"mov r10, rbx"; +"mov rsi, rbx"; +"shr rsi, 51"; +"add rax, rcx"; +"add rax, rsi"; +"mov rsi, rax"; +"shr rsi, 51"; +"add r8, rcx"; +"add r8, rsi"; +"mov rsi, r8"; +"shr rsi, 51"; +"add rdx, rcx"; +"add rdx, rsi"; +"mov rsi, rdx"; +"shr rsi, 51"; +"add rcx, r9"; +"add rcx, rsi"; +"mov ebp, ecx"; +"shl ebp, 4"; +"mov esi, r8d"; +"shl esi, 6"; +"shr r10, 48"; +"and r10d, 7"; +"lea r9d, [r10 + 8*rax]"; +"mov dword ptr [rsp - 20], r9d"; +"mov dword ptr [rsp - 24], eax"; +"mov dword ptr [rsp - 28], eax"; +"mov dword ptr [rsp - 32], eax"; +"mov qword ptr [rsp - 8], rax"; +"mov qword ptr [rsp - 16], rax"; +"shr rax, 45"; +"and eax, 63"; +"or eax, esi"; +"mov dword ptr [rsp - 36], r8d"; +"mov dword ptr [rsp - 40], r8d"; +"mov r13d, r8d"; +"mov r12, r8"; +"mov r15, r8"; +"mov r14, r8"; +"shr r8, 50"; +"and r8d, 1"; +"lea esi, [r8 + 2*rdx]"; +"mov dword ptr [rsp - 44], esi"; +"mov r11d, edx"; +"mov r10d, edx"; +"mov r9d, edx"; +"mov r8, rdx"; +"mov rsi, rdx"; +"shr rdx, 47"; +"and edx, 15"; +"or edx, ebp"; +"mov byte ptr [rdi], bl"; +"mov byte ptr [rdi + 1], bh"; +"mov ebp, ebx"; +"shr ebp, 16"; +"mov byte ptr [rdi + 2], bpl"; +"mov ebp, ebx"; +"shr ebp, 24"; +"mov byte ptr [rdi + 3], bpl"; +"mov rbp, rbx"; +"shr rbp, 32"; +"mov byte ptr [rdi + 4], bpl"; +"shr rbx, 40"; +"mov byte ptr [rdi + 5], bl"; +"mov ebx, dword ptr [rsp - 20]"; +"mov byte ptr [rdi + 6], bl"; +"mov ebx, dword ptr [rsp - 24]"; +"shr ebx, 5"; +"mov byte ptr [rdi + 7], bl"; +"mov ebx, dword ptr [rsp - 28]"; +"shr ebx, 13"; +"mov byte ptr [rdi + 8], bl"; +"mov ebx, dword ptr [rsp - 32]"; +"shr ebx, 21"; +"mov byte ptr [rdi + 9], bl"; +"mov rbx, qword ptr [rsp - 8]"; +"shr rbx, 29"; +"mov byte ptr [rdi + 10], bl"; +"mov rbx, qword ptr [rsp - 16]"; +"shr rbx, 37"; +"mov byte ptr [rdi + 11], bl"; +"mov byte ptr [rdi + 12], al"; +"mov eax, dword ptr [rsp - 36]"; +"shr eax, 2"; +"mov byte ptr [rdi + 13], al"; +"mov eax, dword ptr [rsp - 40]"; +"shr eax, 10"; +"mov byte ptr [rdi + 14], al"; +"shr r13d, 18"; +"mov byte ptr [rdi + 15], r13b"; +"shr r12, 26"; +"mov byte ptr [rdi + 16], r12b"; +"shr r15, 34"; +"mov byte ptr [rdi + 17], r15b"; +"shr r14, 42"; +"mov byte ptr [rdi + 18], r14b"; +"mov eax, dword ptr [rsp - 44]"; +"mov byte ptr [rdi + 19], al"; +"shr r11d, 7"; +"mov byte ptr [rdi + 20], r11b"; +"shr r10d, 15"; +"mov byte ptr [rdi + 21], r10b"; +"shr r9d, 23"; +"mov byte ptr [rdi + 22], r9b"; +"shr r8, 31"; +"mov byte ptr [rdi + 23], r8b"; +"shr rsi, 39"; +"mov byte ptr [rdi + 24], sil"; +"mov byte ptr [rdi + 25], dl"; +"mov eax, ecx"; +"shr eax, 4"; +"mov byte ptr [rdi + 26], al"; +"mov eax, ecx"; +"shr eax, 12"; +"mov byte ptr [rdi + 27], al"; +"mov eax, ecx"; +"shr eax, 20"; +"mov byte ptr [rdi + 28], al"; +"mov rax, rcx"; +"shr rax, 28"; +"mov byte ptr [rdi + 29], al"; +"mov rax, rcx"; +"shr rax, 36"; +"mov byte ptr [rdi + 30], al"; +"shr rcx, 44"; +"and cl, 127"; +"mov byte ptr [rdi + 31], cl"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z21fiat_25519_from_bytesPmPKh:"; +"push r14"; +"push rbx"; +"movzx eax, byte ptr [rsi + 31]"; +"shl rax, 44"; +"movzx ecx, byte ptr [rsi + 30]"; +"shl rcx, 36"; +"or rcx, rax"; +"movzx eax, byte ptr [rsi + 29]"; +"shl rax, 28"; +"or rax, rcx"; +"movzx ecx, byte ptr [rsi + 28]"; +"shl ecx, 20"; +"or rcx, rax"; +"movzx edx, byte ptr [rsi + 27]"; +"shl edx, 12"; +"or rdx, rcx"; +"movzx eax, byte ptr [rsi + 26]"; +"shl eax, 4"; +"or rax, rdx"; +"movzx ecx, byte ptr [rsi + 25]"; +"shl rcx, 47"; +"movzx edx, byte ptr [rsi + 24]"; +"shl rdx, 39"; +"or rdx, rcx"; +"movzx ecx, byte ptr [rsi + 23]"; +"shl rcx, 31"; +"or rcx, rdx"; +"movzx edx, byte ptr [rsi + 22]"; +"shl edx, 23"; +"or rdx, rcx"; +"movzx r8d, byte ptr [rsi + 21]"; +"shl r8d, 15"; +"or r8, rdx"; +"movzx ecx, byte ptr [rsi + 20]"; +"shl ecx, 7"; +"or rcx, r8"; +"movzx edx, byte ptr [rsi + 19]"; +"shl rdx, 50"; +"movzx r8d, byte ptr [rsi + 18]"; +"shl r8, 42"; +"or r8, rdx"; +"movzx edx, byte ptr [rsi + 17]"; +"shl rdx, 34"; +"or rdx, r8"; +"movzx r8d, byte ptr [rsi + 16]"; +"shl r8, 26"; +"or r8, rdx"; +"movzx r9d, byte ptr [rsi + 15]"; +"shl r9d, 18"; +"or r9, r8"; +"movzx edx, byte ptr [rsi + 14]"; +"shl edx, 10"; +"or rdx, r9"; +"movzx r8d, byte ptr [rsi + 13]"; +"movzx r9d, byte ptr [rsi + 12]"; +"shl r9, 45"; +"movzx r10d, byte ptr [rsi + 11]"; +"shl r10, 37"; +"or r10, r9"; +"movzx r9d, byte ptr [rsi + 10]"; +"shl r9, 29"; +"or r9, r10"; +"movzx r10d, byte ptr [rsi + 9]"; +"shl r10d, 21"; +"or r10, r9"; +"movzx r11d, byte ptr [rsi + 8]"; +"shl r11d, 13"; +"or r11, r10"; +"movzx r9d, byte ptr [rsi + 7]"; +"shl r9d, 5"; +"or r9, r11"; +"movzx r10d, byte ptr [rsi + 6]"; +"shl r10, 48"; +"movzx r11d, byte ptr [rsi + 5]"; +"shl r11, 40"; +"movzx ebx, byte ptr [rsi + 4]"; +"shl rbx, 32"; +"or rbx, r11"; +"movzx r11d, byte ptr [rsi + 3]"; +"shl r11d, 24"; +"or r11, rbx"; +"movzx ebx, byte ptr [rsi + 2]"; +"shl ebx, 16"; +"or rbx, r11"; +"movzx r11d, byte ptr [rsi + 1]"; +"shl r11d, 8"; +"movzx r14d, byte ptr [rsi]"; +"or r14, rbx"; +"or r14, r11"; +"add r14, r10"; +"movabs rsi, 2251799813685247"; +"mov r10, r14"; +"and r10, rsi"; +"shr r14, 51"; +"movzx r11d, r14b"; +"add r11, r9"; +"mov r9, r11"; +"and r9, rsi"; +"shr r11, 51"; +"movzx r11d, r11b"; +"lea rdx, [rdx + 4*r8]"; +"add rdx, r11"; +"mov r8, rdx"; +"and r8, rsi"; +"shr rdx, 51"; +"movzx edx, dl"; +"add rdx, rcx"; +"and rsi, rdx"; +"shr rdx, 51"; +"movzx ecx, dl"; +"add rcx, rax"; +"mov qword ptr [rdi], r10"; +"mov qword ptr [rdi + 8], r9"; +"mov qword ptr [rdi + 16], r8"; +"mov qword ptr [rdi + 24], rsi"; +"mov qword ptr [rdi + 32], rcx"; +"pop rbx"; +"pop r14"; +""]. diff --git a/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O2.v b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O2.v new file mode 100644 index 0000000000..4988805585 --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O2.v @@ -0,0 +1,898 @@ +From Coq Require Import String List. +Import ListNotations. +Local Open Scope string_scope. +Local Open Scope list_scope. +Example example : list string := [ +"_Z24fiat_25519_addcarryx_u51PmPhhmm:"; +"mov eax, edx"; +"add rcx, r8"; +"add rcx, rax"; +"movabs rax, 2251799813685247"; +"and rax, rcx"; +"shr rcx, 51"; +"mov qword ptr [rdi], rax"; +"mov byte ptr [rsi], cl"; +"ret"; +""; +"_Z25fiat_25519_subborrowx_u51PmPhhmm:"; +"mov eax, edx"; +"add rax, r8"; +"sub rcx, rax"; +"movabs rax, 2251799813685247"; +"and rax, rcx"; +"mov qword ptr [rdi], rax"; +"shr rcx, 51"; +"neg cl"; +"mov byte ptr [rsi], cl"; +"ret"; +""; +"_Z22fiat_25519_cmovznz_u64Pmhmm:"; +"test esi, esi"; +"cmovne rdx, rcx"; +"mov qword ptr [rdi], rdx"; +"ret"; +""; +"_Z20fiat_25519_carry_mulPmPKmS1_:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"sub rsp, 192"; +"mov r8, rdx"; +"mov r15, qword ptr [rsi + 32]"; +"mov r13, rsi"; +"mov qword ptr [rsp - 104], rsi"; +"mov rcx, qword ptr [rdx + 32]"; +"mov qword ptr [rsp - 96], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea rbx, [rcx + 2*rax]"; +"mov rax, rbx"; +"mul r15"; +"mov qword ptr [rsp + 176], rax"; +"mov qword ptr [rsp + 184], rdx"; +"mov rcx, qword ptr [r8 + 24]"; +"mov qword ptr [rsp - 120], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea r9, [rcx + 2*rax]"; +"mov rax, r9"; +"mul r15"; +"mov qword ptr [rsp + 144], rax"; +"mov qword ptr [rsp + 152], rdx"; +"mov rcx, qword ptr [r8 + 16]"; +"mov qword ptr [rsp - 128], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea r10, [rcx + 2*rax]"; +"mov rax, r10"; +"mul r15"; +"mov qword ptr [rsp + 128], rax"; +"mov qword ptr [rsp + 136], rdx"; +"mov rcx, qword ptr [r8 + 8]"; +"lea rax, [rcx + 8*rcx]"; +"lea rax, [rcx + 2*rax]"; +"mul r15"; +"mov qword ptr [rsp + 56], rax"; +"mov qword ptr [rsp + 64], rdx"; +"mov r14, qword ptr [rsi + 24]"; +"mov rax, r14"; +"mul rbx"; +"mov r11, rdx"; +"mov qword ptr [rsp + 40], rax"; +"mov rax, r14"; +"mul r9"; +"mov rbp, rdx"; +"mov rsi, rax"; +"mov rax, r14"; +"mul r10"; +"mov qword ptr [rsp + 16], rax"; +"mov r12, rdx"; +"mov r10, qword ptr [r13 + 16]"; +"mov rax, r10"; +"mul rbx"; +"mov qword ptr [rsp + 72], rdx"; +"mov qword ptr [rsp + 48], rax"; +"mov rax, r10"; +"mul r9"; +"mov qword ptr [rsp - 16], rax"; +"mov qword ptr [rsp - 8], rdx"; +"mov r9, qword ptr [r13 + 8]"; +"mov rax, r9"; +"mul rbx"; +"mov qword ptr [rsp - 32], rax"; +"mov qword ptr [rsp - 24], rdx"; +"mov r8, qword ptr [r8]"; +"mov rax, r8"; +"mul r15"; +"mov qword ptr [rsp + 168], rdx"; +"mov qword ptr [rsp + 160], rax"; +"mov rax, r14"; +"mov r15, rcx"; +"mov qword ptr [rsp - 112], rcx"; +"mul rcx"; +"mov qword ptr [rsp + 120], rdx"; +"mov qword ptr [rsp + 112], rax"; +"mov rax, r8"; +"mov qword ptr [rsp - 88], r8"; +"mul r14"; +"mov qword ptr [rsp + 104], rdx"; +"mov qword ptr [rsp + 96], rax"; +"mov rax, r10"; +"mov rcx, qword ptr [rsp - 128]"; +"mul rcx"; +"mov r13, rdx"; +"mov rbx, rax"; +"mov rax, r10"; +"mul r15"; +"mov r15, rdx"; +"mov r14, rax"; +"mov rax, r8"; +"mul r10"; +"mov qword ptr [rsp + 8], rdx"; +"mov qword ptr [rsp], rax"; +"mov rax, r9"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp + 88], rdx"; +"mov qword ptr [rsp + 80], rax"; +"mov rax, r9"; +"mul rcx"; +"mov qword ptr [rsp + 32], rdx"; +"mov qword ptr [rsp + 24], rax"; +"mov rax, r9"; +"mov r8, qword ptr [rsp - 112]"; +"mul r8"; +"mov qword ptr [rsp - 56], rax"; +"mov qword ptr [rsp - 48], rdx"; +"mov rax, qword ptr [rsp - 104]"; +"mov r10, qword ptr [rax]"; +"mov rcx, qword ptr [rsp - 88]"; +"mov rax, rcx"; +"mul r9"; +"mov qword ptr [rsp - 72], rdx"; +"mov qword ptr [rsp - 80], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 96]"; +"mov qword ptr [rsp - 96], rdx"; +"mov qword ptr [rsp - 104], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp - 120], rdx"; +"mov qword ptr [rsp - 40], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 128]"; +"mov qword ptr [rsp - 128], rdx"; +"mov qword ptr [rsp - 64], rax"; +"mov rax, r10"; +"mul r8"; +"mov qword ptr [rsp - 112], rdx"; +"mov r9, rax"; +"mov rax, r10"; +"mul rcx"; +"mov r8, qword ptr [rsp + 16]"; +"add r8, qword ptr [rsp + 56]"; +"adc r12, qword ptr [rsp + 64]"; +"add r8, qword ptr [rsp - 16]"; +"adc r12, qword ptr [rsp - 8]"; +"add r8, qword ptr [rsp - 32]"; +"adc r12, qword ptr [rsp - 24]"; +"add r8, rax"; +"adc r12, rdx"; +"shld r12, r8, 13"; +"movabs rax, 2251799813685247"; +"and r8, rax"; +"mov rcx, qword ptr [rsp + 40]"; +"add rcx, qword ptr [rsp + 144]"; +"adc r11, qword ptr [rsp + 152]"; +"add rsi, qword ptr [rsp + 128]"; +"adc rbp, qword ptr [rsp + 136]"; +"add rsi, qword ptr [rsp + 48]"; +"adc rbp, qword ptr [rsp + 72]"; +"add rsi, qword ptr [rsp - 80]"; +"adc rbp, qword ptr [rsp - 72]"; +"add rsi, r9"; +"adc rbp, qword ptr [rsp - 112]"; +"add rsi, r12"; +"adc rbp, 0"; +"shld rbp, rsi, 13"; +"and rsi, rax"; +"add rcx, qword ptr [rsp - 56]"; +"adc r11, qword ptr [rsp - 48]"; +"add rcx, qword ptr [rsp]"; +"adc r11, qword ptr [rsp + 8]"; +"add rcx, qword ptr [rsp - 64]"; +"adc r11, qword ptr [rsp - 128]"; +"add rcx, rbp"; +"adc r11, 0"; +"shld r11, rcx, 13"; +"and rcx, rax"; +"add r14, qword ptr [rsp + 176]"; +"adc r15, qword ptr [rsp + 184]"; +"add r14, qword ptr [rsp + 24]"; +"adc r15, qword ptr [rsp + 32]"; +"add r14, qword ptr [rsp + 96]"; +"adc r15, qword ptr [rsp + 104]"; +"add r14, qword ptr [rsp - 40]"; +"adc r15, qword ptr [rsp - 120]"; +"add r14, r11"; +"adc r15, 0"; +"shld r15, r14, 13"; +"and r14, rax"; +"add rbx, qword ptr [rsp + 112]"; +"adc r13, qword ptr [rsp + 120]"; +"add rbx, qword ptr [rsp + 80]"; +"adc r13, qword ptr [rsp + 88]"; +"add rbx, qword ptr [rsp + 160]"; +"adc r13, qword ptr [rsp + 168]"; +"add rbx, qword ptr [rsp - 104]"; +"adc r13, qword ptr [rsp - 96]"; +"add rbx, r15"; +"adc r13, 0"; +"shld r13, rbx, 13"; +"lea rdx, [8*r13]"; +"add rdx, r13"; +"lea rdx, [2*rdx]"; +"add rdx, r13"; +"add rdx, r8"; +"mov r8, rdx"; +"shr r8, 51"; +"add r8, rsi"; +"mov rsi, r8"; +"shr rsi, 51"; +"add rsi, rcx"; +"and rbx, rax"; +"and rdx, rax"; +"and r8, rax"; +"mov qword ptr [rdi], rdx"; +"mov qword ptr [rdi + 8], r8"; +"mov qword ptr [rdi + 16], rsi"; +"mov qword ptr [rdi + 24], r14"; +"mov qword ptr [rdi + 32], rbx"; +"add rsp, 192"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z23fiat_25519_carry_squarePmPKm:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"push rax"; +"mov rdx, qword ptr [rsi + 32]"; +"lea rax, [rdx + 8*rdx]"; +"lea rax, [rdx + 2*rax]"; +"imul r10, rdx, 38"; +"lea rcx, [rdx + rdx]"; +"mov qword ptr [rsp - 112], rcx"; +"mov r8, qword ptr [rsi + 24]"; +"lea rcx, [r8 + 8*r8]"; +"lea rcx, [r8 + 2*rcx]"; +"imul r11, r8, 38"; +"mul rdx"; +"mov qword ptr [rsp - 32], rax"; +"mov qword ptr [rsp - 24], rdx"; +"mov r9, qword ptr [rsi + 16]"; +"mov rax, r8"; +"mul r10"; +"mov qword ptr [rsp - 8], rdx"; +"mov qword ptr [rsp - 40], rax"; +"mov rax, rcx"; +"mul r8"; +"mov qword ptr [rsp], rdx"; +"mov qword ptr [rsp - 16], rax"; +"mov rax, r9"; +"mul r10"; +"mov rbx, rax"; +"mov rcx, rdx"; +"add r8, r8"; +"mov qword ptr [rsp - 128], r8"; +"mov rax, r9"; +"mul r11"; +"mov qword ptr [rsp - 72], rax"; +"mov qword ptr [rsp - 64], rdx"; +"lea r14, [r9 + r9]"; +"mov qword ptr [rsp - 120], r14"; +"mov rax, r9"; +"mul r9"; +"mov qword ptr [rsp - 56], rax"; +"mov qword ptr [rsp - 48], rdx"; +"mov rbp, qword ptr [rsi + 8]"; +"mov rax, rbp"; +"mul r10"; +"mov r15, rdx"; +"mov r9, rax"; +"mov rax, rbp"; +"mul r8"; +"mov r11, rdx"; +"mov r13, rax"; +"mov rax, rbp"; +"mul r14"; +"mov r14, rax"; +"mov r8, rdx"; +"mov rsi, qword ptr [rsi]"; +"mov rax, rbp"; +"mul rbp"; +"mov r10, rdx"; +"mov r12, rax"; +"mov rax, rsi"; +"mul qword ptr [rsp - 112]"; +"mov qword ptr [rsp - 80], rdx"; +"mov qword ptr [rsp - 104], rax"; +"mov rax, rsi"; +"mul qword ptr [rsp - 128]"; +"mov qword ptr [rsp - 88], rax"; +"mov qword ptr [rsp - 128], rdx"; +"add rbp, rbp"; +"mov rax, rsi"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp - 112], rdx"; +"mov qword ptr [rsp - 96], rax"; +"mov rax, rsi"; +"mul rbp"; +"mov rbp, rdx"; +"mov qword ptr [rsp - 120], rax"; +"mov rax, rsi"; +"mul rsi"; +"add r9, qword ptr [rsp - 72]"; +"adc r15, qword ptr [rsp - 64]"; +"add r9, rax"; +"adc r15, rdx"; +"shld r15, r9, 13"; +"movabs rax, 2251799813685247"; +"and r9, rax"; +"add r13, qword ptr [rsp - 56]"; +"adc r11, qword ptr [rsp - 48]"; +"add r13, qword ptr [rsp - 104]"; +"adc r11, qword ptr [rsp - 80]"; +"add r14, qword ptr [rsp - 32]"; +"adc r8, qword ptr [rsp - 24]"; +"add r14, qword ptr [rsp - 88]"; +"adc r8, qword ptr [rsp - 128]"; +"add r12, qword ptr [rsp - 40]"; +"adc r10, qword ptr [rsp - 8]"; +"add r12, qword ptr [rsp - 96]"; +"adc r10, qword ptr [rsp - 112]"; +"add rbx, qword ptr [rsp - 16]"; +"adc rcx, qword ptr [rsp]"; +"add rbx, qword ptr [rsp - 120]"; +"adc rcx, rbp"; +"add rbx, r15"; +"adc rcx, 0"; +"shld rcx, rbx, 13"; +"and rbx, rax"; +"add rcx, r12"; +"adc r10, 0"; +"shld r10, rcx, 13"; +"and rcx, rax"; +"add r10, r14"; +"adc r8, 0"; +"shld r8, r10, 13"; +"and r10, rax"; +"add r8, r13"; +"adc r11, 0"; +"shld r11, r8, 13"; +"lea rdx, [r11 + 8*r11]"; +"lea rdx, [r11 + 2*rdx]"; +"add rdx, r9"; +"mov rsi, rdx"; +"shr rsi, 51"; +"add rsi, rbx"; +"mov r9, rsi"; +"shr r9, 51"; +"add r9, rcx"; +"and r8, rax"; +"and rdx, rax"; +"and rsi, rax"; +"mov qword ptr [rdi], rdx"; +"mov qword ptr [rdi + 8], rsi"; +"mov qword ptr [rdi + 16], r9"; +"mov qword ptr [rdi + 24], r10"; +"mov qword ptr [rdi + 32], r8"; +"add rsp, 8"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z29fiat_25519_carry_scmul_121666PmPKm:"; +"push r15"; +"push r14"; +"push r12"; +"push rbx"; +"mov eax, 121666"; +"mul qword ptr [rsi + 32]"; +"mov r8, rdx"; +"mov r10, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 24]"; +"mov rcx, rdx"; +"mov r11, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 16]"; +"mov r14, rdx"; +"mov rbx, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 8]"; +"mov r9, rdx"; +"mov r15, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi]"; +"shld rdx, rax, 13"; +"movabs rsi, 2251799813685247"; +"lea r12, [rsi - 1]"; +"and r12, rax"; +"add rdx, r15"; +"adc r9, 0"; +"shld r9, rdx, 13"; +"and rdx, rsi"; +"add r9, rbx"; +"adc r14, 0"; +"shld r14, r9, 13"; +"and r9, rsi"; +"add r14, r11"; +"adc rcx, 0"; +"shld rcx, r14, 13"; +"and r14, rsi"; +"add rcx, r10"; +"adc r8, 0"; +"shld r8, rcx, 13"; +"and rcx, rsi"; +"lea rax, [r8 + 8*r8]"; +"lea rax, [r8 + 2*rax]"; +"add rax, r12"; +"mov r8, rax"; +"shr r8, 51"; +"add r8, rdx"; +"and rax, rsi"; +"mov rdx, r8"; +"shr rdx, 51"; +"add rdx, r9"; +"and r8, rsi"; +"mov qword ptr [rdi], rax"; +"mov qword ptr [rdi + 8], r8"; +"mov qword ptr [rdi + 16], rdx"; +"mov qword ptr [rdi + 24], r14"; +"mov qword ptr [rdi + 32], rcx"; +"pop rbx"; +"pop r12"; +"pop r14"; +"pop r15"; +"ret"; +""; +"_Z16fiat_25519_carryPmPKm:"; +"mov r9, qword ptr [rsi]"; +"mov rcx, r9"; +"shr rcx, 51"; +"add rcx, qword ptr [rsi + 8]"; +"mov rax, rcx"; +"shr rax, 51"; +"add rax, qword ptr [rsi + 16]"; +"mov rdx, rax"; +"shr rdx, 51"; +"add rdx, qword ptr [rsi + 24]"; +"mov r8, rdx"; +"shr r8, 51"; +"add r8, qword ptr [rsi + 32]"; +"movabs rsi, 2251799813685247"; +"and r9, rsi"; +"mov r10, r8"; +"shr r10, 51"; +"lea r11, [r10 + 8*r10]"; +"lea r10, [r10 + 2*r11]"; +"add r10, r9"; +"mov r9, r10"; +"shr r9, 51"; +"and rcx, rsi"; +"add rcx, r9"; +"and r10, rsi"; +"mov r9, rcx"; +"and r9, rsi"; +"shr rcx, 51"; +"and rax, rsi"; +"add rax, rcx"; +"and rdx, rsi"; +"and r8, rsi"; +"mov qword ptr [rdi], r10"; +"mov qword ptr [rdi + 8], r9"; +"mov qword ptr [rdi + 16], rax"; +"mov qword ptr [rdi + 24], rdx"; +"mov qword ptr [rdi + 32], r8"; +"ret"; +""; +"_Z14fiat_25519_addPmPKmS1_:"; +"mov rax, qword ptr [rdx + 32]"; +"add rax, qword ptr [rsi + 32]"; +"movdqu xmm0, xmmword ptr [rsi]"; +"movdqu xmm1, xmmword ptr [rsi + 16]"; +"movdqu xmm2, xmmword ptr [rdx]"; +"paddq xmm2, xmm0"; +"movdqu xmm0, xmmword ptr [rdx + 16]"; +"paddq xmm0, xmm1"; +"movdqu xmmword ptr [rdi], xmm2"; +"movdqu xmmword ptr [rdi + 16], xmm0"; +"mov qword ptr [rdi + 32], rax"; +"ret"; +""; +".LCPI8_0:"; +".quad 4503599627370458"; +".quad 4503599627370494"; +".LCPI8_1:"; +".quad 4503599627370494"; +".quad 4503599627370494"; +"_Z14fiat_25519_subPmPKmS1_:"; +"mov rax, qword ptr [rsi + 32]"; +"sub rax, qword ptr [rdx + 32]"; +"movabs rcx, 4503599627370494"; +"movdqu xmm0, xmmword ptr [rsi]"; +"movdqu xmm1, xmmword ptr [rsi + 16]"; +"movdqu xmm2, xmmword ptr [rdx]"; +"psubq xmm0, xmm2"; +"movdqu xmm2, xmmword ptr [rdx + 16]"; +"psubq xmm1, xmm2"; +"paddq xmm0, xmmword ptr [rip + .LCPI8_0]"; +"paddq xmm1, xmmword ptr [rip + .LCPI8_1]"; +"add rcx, rax"; +"movdqu xmmword ptr [rdi], xmm0"; +"movdqu xmmword ptr [rdi + 16], xmm1"; +"mov qword ptr [rdi + 32], rcx"; +"ret"; +""; +".LCPI9_0:"; +".quad 4503599627370458"; +".quad 4503599627370494"; +".LCPI9_1:"; +".quad 4503599627370494"; +".quad 4503599627370494"; +"_Z14fiat_25519_oppPmPKm:"; +"movabs rax, 4503599627370494"; +"sub rax, qword ptr [rsi + 32]"; +"movdqa xmm0, xmmword ptr [rip + .LCPI9_0]"; +"movdqu xmm1, xmmword ptr [rsi]"; +"psubq xmm0, xmm1"; +"movdqu xmm1, xmmword ptr [rsi + 16]"; +"movdqa xmm2, xmmword ptr [rip + .LCPI9_1]"; +"psubq xmm2, xmm1"; +"movdqu xmmword ptr [rdi], xmm0"; +"movdqu xmmword ptr [rdi + 16], xmm2"; +"mov qword ptr [rdi + 32], rax"; +"ret"; +""; +"_Z20fiat_25519_selectznzPmhPKmS1_:"; +"lea rax, [rdx + 32]"; +"lea r8, [rcx + 32]"; +"xor r9d, r9d"; +"test esi, esi"; +"cmove r8, rax"; +"sete r9b"; +"mov rax, qword ptr [r8]"; +"movd xmm0, r9d"; +"pshufd xmm0, xmm0, 0"; +"pslld xmm0, 31"; +"psrad xmm0, 31"; +"movdqu xmm1, xmmword ptr [rcx]"; +"movdqu xmm2, xmmword ptr [rcx + 16]"; +"movdqa xmm3, xmm0"; +"pandn xmm3, xmm1"; +"movdqu xmm1, xmmword ptr [rdx]"; +"movdqu xmm4, xmmword ptr [rdx + 16]"; +"pand xmm1, xmm0"; +"por xmm1, xmm3"; +"pand xmm4, xmm0"; +"pandn xmm0, xmm2"; +"por xmm0, xmm4"; +"movdqu xmmword ptr [rdi], xmm1"; +"movdqu xmmword ptr [rdi + 16], xmm0"; +"mov qword ptr [rdi + 32], rax"; +"ret"; +""; +"_Z19fiat_25519_to_bytesPhPKm:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"mov rax, qword ptr [rsi]"; +"movabs r9, -2251799813685247"; +"add rax, r9"; +"add rax, 18"; +"movabs r11, 2251799813685247"; +"mov r10, rax"; +"and r10, r11"; +"shr rax, 51"; +"neg eax"; +"movzx eax, al"; +"mov rcx, qword ptr [rsi + 8]"; +"add rcx, r9"; +"sub rcx, rax"; +"mov rax, rcx"; +"and rax, r11"; +"shr rcx, 51"; +"neg ecx"; +"movzx ecx, cl"; +"mov rdx, qword ptr [rsi + 16]"; +"add rdx, r9"; +"sub rdx, rcx"; +"mov r8, rdx"; +"and r8, r11"; +"shr rdx, 51"; +"neg edx"; +"movzx ecx, dl"; +"mov rbx, qword ptr [rsi + 24]"; +"add rbx, r9"; +"sub rbx, rcx"; +"mov rdx, rbx"; +"and rdx, r11"; +"shr rbx, 51"; +"neg ebx"; +"add r9, qword ptr [rsi + 32]"; +"movzx ecx, bl"; +"sub r9, rcx"; +"movabs rcx, 574208952489738240"; +"and rcx, r9"; +"lea rbx, [r11 - 18]"; +"test rcx, rcx"; +"cmove rbx, rcx"; +"cmovne rcx, r11"; +"add rbx, r10"; +"mov r10, rbx"; +"mov rsi, rbx"; +"shr rsi, 51"; +"add rax, rcx"; +"add rax, rsi"; +"mov rsi, rax"; +"shr rsi, 51"; +"add r8, rcx"; +"add r8, rsi"; +"mov rsi, r8"; +"shr rsi, 51"; +"add rdx, rcx"; +"add rdx, rsi"; +"mov rsi, rdx"; +"shr rsi, 51"; +"add rcx, r9"; +"add rcx, rsi"; +"mov ebp, ecx"; +"shl ebp, 4"; +"mov esi, r8d"; +"shl esi, 6"; +"shr r10, 48"; +"and r10d, 7"; +"lea r9d, [r10 + 8*rax]"; +"mov dword ptr [rsp - 20], r9d"; +"mov dword ptr [rsp - 24], eax"; +"mov dword ptr [rsp - 28], eax"; +"mov dword ptr [rsp - 32], eax"; +"mov qword ptr [rsp - 8], rax"; +"mov qword ptr [rsp - 16], rax"; +"shr rax, 45"; +"and eax, 63"; +"or eax, esi"; +"mov dword ptr [rsp - 36], r8d"; +"mov dword ptr [rsp - 40], r8d"; +"mov r13d, r8d"; +"mov r12, r8"; +"mov r15, r8"; +"mov r14, r8"; +"shr r8, 50"; +"and r8d, 1"; +"lea esi, [r8 + 2*rdx]"; +"mov dword ptr [rsp - 44], esi"; +"mov r11d, edx"; +"mov r10d, edx"; +"mov r9d, edx"; +"mov r8, rdx"; +"mov rsi, rdx"; +"shr rdx, 47"; +"and edx, 15"; +"or edx, ebp"; +"mov byte ptr [rdi], bl"; +"mov byte ptr [rdi + 1], bh"; +"mov ebp, ebx"; +"shr ebp, 16"; +"mov byte ptr [rdi + 2], bpl"; +"mov ebp, ebx"; +"shr ebp, 24"; +"mov byte ptr [rdi + 3], bpl"; +"mov rbp, rbx"; +"shr rbp, 32"; +"mov byte ptr [rdi + 4], bpl"; +"shr rbx, 40"; +"mov byte ptr [rdi + 5], bl"; +"mov ebx, dword ptr [rsp - 20]"; +"mov byte ptr [rdi + 6], bl"; +"mov ebx, dword ptr [rsp - 24]"; +"shr ebx, 5"; +"mov byte ptr [rdi + 7], bl"; +"mov ebx, dword ptr [rsp - 28]"; +"shr ebx, 13"; +"mov byte ptr [rdi + 8], bl"; +"mov ebx, dword ptr [rsp - 32]"; +"shr ebx, 21"; +"mov byte ptr [rdi + 9], bl"; +"mov rbx, qword ptr [rsp - 8]"; +"shr rbx, 29"; +"mov byte ptr [rdi + 10], bl"; +"mov rbx, qword ptr [rsp - 16]"; +"shr rbx, 37"; +"mov byte ptr [rdi + 11], bl"; +"mov byte ptr [rdi + 12], al"; +"mov eax, dword ptr [rsp - 36]"; +"shr eax, 2"; +"mov byte ptr [rdi + 13], al"; +"mov eax, dword ptr [rsp - 40]"; +"shr eax, 10"; +"mov byte ptr [rdi + 14], al"; +"shr r13d, 18"; +"mov byte ptr [rdi + 15], r13b"; +"shr r12, 26"; +"mov byte ptr [rdi + 16], r12b"; +"shr r15, 34"; +"mov byte ptr [rdi + 17], r15b"; +"shr r14, 42"; +"mov byte ptr [rdi + 18], r14b"; +"mov eax, dword ptr [rsp - 44]"; +"mov byte ptr [rdi + 19], al"; +"shr r11d, 7"; +"mov byte ptr [rdi + 20], r11b"; +"shr r10d, 15"; +"mov byte ptr [rdi + 21], r10b"; +"shr r9d, 23"; +"mov byte ptr [rdi + 22], r9b"; +"shr r8, 31"; +"mov byte ptr [rdi + 23], r8b"; +"shr rsi, 39"; +"mov byte ptr [rdi + 24], sil"; +"mov byte ptr [rdi + 25], dl"; +"mov eax, ecx"; +"shr eax, 4"; +"mov byte ptr [rdi + 26], al"; +"mov eax, ecx"; +"shr eax, 12"; +"mov byte ptr [rdi + 27], al"; +"mov eax, ecx"; +"shr eax, 20"; +"mov byte ptr [rdi + 28], al"; +"mov rax, rcx"; +"shr rax, 28"; +"mov byte ptr [rdi + 29], al"; +"mov rax, rcx"; +"shr rax, 36"; +"mov byte ptr [rdi + 30], al"; +"shr rcx, 44"; +"and cl, 127"; +"mov byte ptr [rdi + 31], cl"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z21fiat_25519_from_bytesPmPKh:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"mov qword ptr [rsp - 8], rdi"; +"movzx eax, byte ptr [rsi + 31]"; +"shl rax, 44"; +"movzx ecx, byte ptr [rsi + 30]"; +"shl rcx, 36"; +"or rcx, rax"; +"movzx eax, byte ptr [rsi + 29]"; +"shl rax, 28"; +"or rax, rcx"; +"movzx ecx, byte ptr [rsi + 28]"; +"shl ecx, 20"; +"or rcx, rax"; +"movzx edx, byte ptr [rsi + 27]"; +"shl edx, 12"; +"or rdx, rcx"; +"movzx edi, byte ptr [rsi + 26]"; +"shl edi, 4"; +"or rdi, rdx"; +"movzx ecx, byte ptr [rsi + 25]"; +"shl rcx, 47"; +"movzx edx, byte ptr [rsi + 24]"; +"shl rdx, 39"; +"or rdx, rcx"; +"movzx ecx, byte ptr [rsi + 23]"; +"shl rcx, 31"; +"or rcx, rdx"; +"movzx edx, byte ptr [rsi + 22]"; +"shl edx, 23"; +"or rdx, rcx"; +"movzx r8d, byte ptr [rsi + 21]"; +"shl r8d, 15"; +"or r8, rdx"; +"movzx ecx, byte ptr [rsi + 20]"; +"shl ecx, 7"; +"or rcx, r8"; +"movzx edx, byte ptr [rsi + 19]"; +"shl rdx, 50"; +"movzx r8d, byte ptr [rsi + 18]"; +"shl r8, 42"; +"or r8, rdx"; +"movzx edx, byte ptr [rsi + 17]"; +"shl rdx, 34"; +"or rdx, r8"; +"movzx r8d, byte ptr [rsi + 16]"; +"shl r8, 26"; +"or r8, rdx"; +"movzx r9d, byte ptr [rsi + 15]"; +"shl r9d, 18"; +"or r9, r8"; +"movzx edx, byte ptr [rsi + 14]"; +"shl edx, 10"; +"or rdx, r9"; +"movzx r8d, byte ptr [rsi + 13]"; +"movzx r9d, byte ptr [rsi + 12]"; +"movzx r10d, byte ptr [rsi + 11]"; +"shl r10, 37"; +"movzx r11d, byte ptr [rsi + 10]"; +"shl r11, 29"; +"movzx ebx, byte ptr [rsi + 9]"; +"shl ebx, 21"; +"movzx r14d, byte ptr [rsi + 8]"; +"shl r14d, 13"; +"movzx r15d, byte ptr [rsi + 7]"; +"shl r15d, 5"; +"movzx r12d, byte ptr [rsi + 6]"; +"movzx r13d, byte ptr [rsi + 5]"; +"shl r13, 40"; +"movzx ebp, byte ptr [rsi + 4]"; +"shl rbp, 32"; +"mov eax, dword ptr [rsi]"; +"or rax, r13"; +"or rax, rbp"; +"mov esi, r12d"; +"and esi, 7"; +"shl rsi, 48"; +"or rsi, rax"; +"shr r12d, 3"; +"mov r13d, r9d"; +"and r13d, 63"; +"shl r13, 45"; +"or r13, r10"; +"or r13, r11"; +"or r13, rbx"; +"or r13, r14"; +"or r13, r15"; +"or r13, r12"; +"shr r9d, 6"; +"lea rax, [rdx + 4*r8]"; +"add rax, r9"; +"movabs rdx, 2251799813685247"; +"mov r8, rax"; +"and r8, rdx"; +"shr rax, 51"; +"add rax, rcx"; +"and rdx, rax"; +"shr rax, 51"; +"add rax, rdi"; +"mov rcx, qword ptr [rsp - 8]"; +"mov qword ptr [rcx], rsi"; +"mov qword ptr [rcx + 8], r13"; +"mov qword ptr [rcx + 16], r8"; +"mov qword ptr [rcx + 24], rdx"; +"mov qword ptr [rcx + 32], rax"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +""]. diff --git a/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O3.v b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O3.v new file mode 100644 index 0000000000..4988805585 --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O3.v @@ -0,0 +1,898 @@ +From Coq Require Import String List. +Import ListNotations. +Local Open Scope string_scope. +Local Open Scope list_scope. +Example example : list string := [ +"_Z24fiat_25519_addcarryx_u51PmPhhmm:"; +"mov eax, edx"; +"add rcx, r8"; +"add rcx, rax"; +"movabs rax, 2251799813685247"; +"and rax, rcx"; +"shr rcx, 51"; +"mov qword ptr [rdi], rax"; +"mov byte ptr [rsi], cl"; +"ret"; +""; +"_Z25fiat_25519_subborrowx_u51PmPhhmm:"; +"mov eax, edx"; +"add rax, r8"; +"sub rcx, rax"; +"movabs rax, 2251799813685247"; +"and rax, rcx"; +"mov qword ptr [rdi], rax"; +"shr rcx, 51"; +"neg cl"; +"mov byte ptr [rsi], cl"; +"ret"; +""; +"_Z22fiat_25519_cmovznz_u64Pmhmm:"; +"test esi, esi"; +"cmovne rdx, rcx"; +"mov qword ptr [rdi], rdx"; +"ret"; +""; +"_Z20fiat_25519_carry_mulPmPKmS1_:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"sub rsp, 192"; +"mov r8, rdx"; +"mov r15, qword ptr [rsi + 32]"; +"mov r13, rsi"; +"mov qword ptr [rsp - 104], rsi"; +"mov rcx, qword ptr [rdx + 32]"; +"mov qword ptr [rsp - 96], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea rbx, [rcx + 2*rax]"; +"mov rax, rbx"; +"mul r15"; +"mov qword ptr [rsp + 176], rax"; +"mov qword ptr [rsp + 184], rdx"; +"mov rcx, qword ptr [r8 + 24]"; +"mov qword ptr [rsp - 120], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea r9, [rcx + 2*rax]"; +"mov rax, r9"; +"mul r15"; +"mov qword ptr [rsp + 144], rax"; +"mov qword ptr [rsp + 152], rdx"; +"mov rcx, qword ptr [r8 + 16]"; +"mov qword ptr [rsp - 128], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea r10, [rcx + 2*rax]"; +"mov rax, r10"; +"mul r15"; +"mov qword ptr [rsp + 128], rax"; +"mov qword ptr [rsp + 136], rdx"; +"mov rcx, qword ptr [r8 + 8]"; +"lea rax, [rcx + 8*rcx]"; +"lea rax, [rcx + 2*rax]"; +"mul r15"; +"mov qword ptr [rsp + 56], rax"; +"mov qword ptr [rsp + 64], rdx"; +"mov r14, qword ptr [rsi + 24]"; +"mov rax, r14"; +"mul rbx"; +"mov r11, rdx"; +"mov qword ptr [rsp + 40], rax"; +"mov rax, r14"; +"mul r9"; +"mov rbp, rdx"; +"mov rsi, rax"; +"mov rax, r14"; +"mul r10"; +"mov qword ptr [rsp + 16], rax"; +"mov r12, rdx"; +"mov r10, qword ptr [r13 + 16]"; +"mov rax, r10"; +"mul rbx"; +"mov qword ptr [rsp + 72], rdx"; +"mov qword ptr [rsp + 48], rax"; +"mov rax, r10"; +"mul r9"; +"mov qword ptr [rsp - 16], rax"; +"mov qword ptr [rsp - 8], rdx"; +"mov r9, qword ptr [r13 + 8]"; +"mov rax, r9"; +"mul rbx"; +"mov qword ptr [rsp - 32], rax"; +"mov qword ptr [rsp - 24], rdx"; +"mov r8, qword ptr [r8]"; +"mov rax, r8"; +"mul r15"; +"mov qword ptr [rsp + 168], rdx"; +"mov qword ptr [rsp + 160], rax"; +"mov rax, r14"; +"mov r15, rcx"; +"mov qword ptr [rsp - 112], rcx"; +"mul rcx"; +"mov qword ptr [rsp + 120], rdx"; +"mov qword ptr [rsp + 112], rax"; +"mov rax, r8"; +"mov qword ptr [rsp - 88], r8"; +"mul r14"; +"mov qword ptr [rsp + 104], rdx"; +"mov qword ptr [rsp + 96], rax"; +"mov rax, r10"; +"mov rcx, qword ptr [rsp - 128]"; +"mul rcx"; +"mov r13, rdx"; +"mov rbx, rax"; +"mov rax, r10"; +"mul r15"; +"mov r15, rdx"; +"mov r14, rax"; +"mov rax, r8"; +"mul r10"; +"mov qword ptr [rsp + 8], rdx"; +"mov qword ptr [rsp], rax"; +"mov rax, r9"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp + 88], rdx"; +"mov qword ptr [rsp + 80], rax"; +"mov rax, r9"; +"mul rcx"; +"mov qword ptr [rsp + 32], rdx"; +"mov qword ptr [rsp + 24], rax"; +"mov rax, r9"; +"mov r8, qword ptr [rsp - 112]"; +"mul r8"; +"mov qword ptr [rsp - 56], rax"; +"mov qword ptr [rsp - 48], rdx"; +"mov rax, qword ptr [rsp - 104]"; +"mov r10, qword ptr [rax]"; +"mov rcx, qword ptr [rsp - 88]"; +"mov rax, rcx"; +"mul r9"; +"mov qword ptr [rsp - 72], rdx"; +"mov qword ptr [rsp - 80], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 96]"; +"mov qword ptr [rsp - 96], rdx"; +"mov qword ptr [rsp - 104], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp - 120], rdx"; +"mov qword ptr [rsp - 40], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 128]"; +"mov qword ptr [rsp - 128], rdx"; +"mov qword ptr [rsp - 64], rax"; +"mov rax, r10"; +"mul r8"; +"mov qword ptr [rsp - 112], rdx"; +"mov r9, rax"; +"mov rax, r10"; +"mul rcx"; +"mov r8, qword ptr [rsp + 16]"; +"add r8, qword ptr [rsp + 56]"; +"adc r12, qword ptr [rsp + 64]"; +"add r8, qword ptr [rsp - 16]"; +"adc r12, qword ptr [rsp - 8]"; +"add r8, qword ptr [rsp - 32]"; +"adc r12, qword ptr [rsp - 24]"; +"add r8, rax"; +"adc r12, rdx"; +"shld r12, r8, 13"; +"movabs rax, 2251799813685247"; +"and r8, rax"; +"mov rcx, qword ptr [rsp + 40]"; +"add rcx, qword ptr [rsp + 144]"; +"adc r11, qword ptr [rsp + 152]"; +"add rsi, qword ptr [rsp + 128]"; +"adc rbp, qword ptr [rsp + 136]"; +"add rsi, qword ptr [rsp + 48]"; +"adc rbp, qword ptr [rsp + 72]"; +"add rsi, qword ptr [rsp - 80]"; +"adc rbp, qword ptr [rsp - 72]"; +"add rsi, r9"; +"adc rbp, qword ptr [rsp - 112]"; +"add rsi, r12"; +"adc rbp, 0"; +"shld rbp, rsi, 13"; +"and rsi, rax"; +"add rcx, qword ptr [rsp - 56]"; +"adc r11, qword ptr [rsp - 48]"; +"add rcx, qword ptr [rsp]"; +"adc r11, qword ptr [rsp + 8]"; +"add rcx, qword ptr [rsp - 64]"; +"adc r11, qword ptr [rsp - 128]"; +"add rcx, rbp"; +"adc r11, 0"; +"shld r11, rcx, 13"; +"and rcx, rax"; +"add r14, qword ptr [rsp + 176]"; +"adc r15, qword ptr [rsp + 184]"; +"add r14, qword ptr [rsp + 24]"; +"adc r15, qword ptr [rsp + 32]"; +"add r14, qword ptr [rsp + 96]"; +"adc r15, qword ptr [rsp + 104]"; +"add r14, qword ptr [rsp - 40]"; +"adc r15, qword ptr [rsp - 120]"; +"add r14, r11"; +"adc r15, 0"; +"shld r15, r14, 13"; +"and r14, rax"; +"add rbx, qword ptr [rsp + 112]"; +"adc r13, qword ptr [rsp + 120]"; +"add rbx, qword ptr [rsp + 80]"; +"adc r13, qword ptr [rsp + 88]"; +"add rbx, qword ptr [rsp + 160]"; +"adc r13, qword ptr [rsp + 168]"; +"add rbx, qword ptr [rsp - 104]"; +"adc r13, qword ptr [rsp - 96]"; +"add rbx, r15"; +"adc r13, 0"; +"shld r13, rbx, 13"; +"lea rdx, [8*r13]"; +"add rdx, r13"; +"lea rdx, [2*rdx]"; +"add rdx, r13"; +"add rdx, r8"; +"mov r8, rdx"; +"shr r8, 51"; +"add r8, rsi"; +"mov rsi, r8"; +"shr rsi, 51"; +"add rsi, rcx"; +"and rbx, rax"; +"and rdx, rax"; +"and r8, rax"; +"mov qword ptr [rdi], rdx"; +"mov qword ptr [rdi + 8], r8"; +"mov qword ptr [rdi + 16], rsi"; +"mov qword ptr [rdi + 24], r14"; +"mov qword ptr [rdi + 32], rbx"; +"add rsp, 192"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z23fiat_25519_carry_squarePmPKm:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"push rax"; +"mov rdx, qword ptr [rsi + 32]"; +"lea rax, [rdx + 8*rdx]"; +"lea rax, [rdx + 2*rax]"; +"imul r10, rdx, 38"; +"lea rcx, [rdx + rdx]"; +"mov qword ptr [rsp - 112], rcx"; +"mov r8, qword ptr [rsi + 24]"; +"lea rcx, [r8 + 8*r8]"; +"lea rcx, [r8 + 2*rcx]"; +"imul r11, r8, 38"; +"mul rdx"; +"mov qword ptr [rsp - 32], rax"; +"mov qword ptr [rsp - 24], rdx"; +"mov r9, qword ptr [rsi + 16]"; +"mov rax, r8"; +"mul r10"; +"mov qword ptr [rsp - 8], rdx"; +"mov qword ptr [rsp - 40], rax"; +"mov rax, rcx"; +"mul r8"; +"mov qword ptr [rsp], rdx"; +"mov qword ptr [rsp - 16], rax"; +"mov rax, r9"; +"mul r10"; +"mov rbx, rax"; +"mov rcx, rdx"; +"add r8, r8"; +"mov qword ptr [rsp - 128], r8"; +"mov rax, r9"; +"mul r11"; +"mov qword ptr [rsp - 72], rax"; +"mov qword ptr [rsp - 64], rdx"; +"lea r14, [r9 + r9]"; +"mov qword ptr [rsp - 120], r14"; +"mov rax, r9"; +"mul r9"; +"mov qword ptr [rsp - 56], rax"; +"mov qword ptr [rsp - 48], rdx"; +"mov rbp, qword ptr [rsi + 8]"; +"mov rax, rbp"; +"mul r10"; +"mov r15, rdx"; +"mov r9, rax"; +"mov rax, rbp"; +"mul r8"; +"mov r11, rdx"; +"mov r13, rax"; +"mov rax, rbp"; +"mul r14"; +"mov r14, rax"; +"mov r8, rdx"; +"mov rsi, qword ptr [rsi]"; +"mov rax, rbp"; +"mul rbp"; +"mov r10, rdx"; +"mov r12, rax"; +"mov rax, rsi"; +"mul qword ptr [rsp - 112]"; +"mov qword ptr [rsp - 80], rdx"; +"mov qword ptr [rsp - 104], rax"; +"mov rax, rsi"; +"mul qword ptr [rsp - 128]"; +"mov qword ptr [rsp - 88], rax"; +"mov qword ptr [rsp - 128], rdx"; +"add rbp, rbp"; +"mov rax, rsi"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp - 112], rdx"; +"mov qword ptr [rsp - 96], rax"; +"mov rax, rsi"; +"mul rbp"; +"mov rbp, rdx"; +"mov qword ptr [rsp - 120], rax"; +"mov rax, rsi"; +"mul rsi"; +"add r9, qword ptr [rsp - 72]"; +"adc r15, qword ptr [rsp - 64]"; +"add r9, rax"; +"adc r15, rdx"; +"shld r15, r9, 13"; +"movabs rax, 2251799813685247"; +"and r9, rax"; +"add r13, qword ptr [rsp - 56]"; +"adc r11, qword ptr [rsp - 48]"; +"add r13, qword ptr [rsp - 104]"; +"adc r11, qword ptr [rsp - 80]"; +"add r14, qword ptr [rsp - 32]"; +"adc r8, qword ptr [rsp - 24]"; +"add r14, qword ptr [rsp - 88]"; +"adc r8, qword ptr [rsp - 128]"; +"add r12, qword ptr [rsp - 40]"; +"adc r10, qword ptr [rsp - 8]"; +"add r12, qword ptr [rsp - 96]"; +"adc r10, qword ptr [rsp - 112]"; +"add rbx, qword ptr [rsp - 16]"; +"adc rcx, qword ptr [rsp]"; +"add rbx, qword ptr [rsp - 120]"; +"adc rcx, rbp"; +"add rbx, r15"; +"adc rcx, 0"; +"shld rcx, rbx, 13"; +"and rbx, rax"; +"add rcx, r12"; +"adc r10, 0"; +"shld r10, rcx, 13"; +"and rcx, rax"; +"add r10, r14"; +"adc r8, 0"; +"shld r8, r10, 13"; +"and r10, rax"; +"add r8, r13"; +"adc r11, 0"; +"shld r11, r8, 13"; +"lea rdx, [r11 + 8*r11]"; +"lea rdx, [r11 + 2*rdx]"; +"add rdx, r9"; +"mov rsi, rdx"; +"shr rsi, 51"; +"add rsi, rbx"; +"mov r9, rsi"; +"shr r9, 51"; +"add r9, rcx"; +"and r8, rax"; +"and rdx, rax"; +"and rsi, rax"; +"mov qword ptr [rdi], rdx"; +"mov qword ptr [rdi + 8], rsi"; +"mov qword ptr [rdi + 16], r9"; +"mov qword ptr [rdi + 24], r10"; +"mov qword ptr [rdi + 32], r8"; +"add rsp, 8"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z29fiat_25519_carry_scmul_121666PmPKm:"; +"push r15"; +"push r14"; +"push r12"; +"push rbx"; +"mov eax, 121666"; +"mul qword ptr [rsi + 32]"; +"mov r8, rdx"; +"mov r10, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 24]"; +"mov rcx, rdx"; +"mov r11, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 16]"; +"mov r14, rdx"; +"mov rbx, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 8]"; +"mov r9, rdx"; +"mov r15, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi]"; +"shld rdx, rax, 13"; +"movabs rsi, 2251799813685247"; +"lea r12, [rsi - 1]"; +"and r12, rax"; +"add rdx, r15"; +"adc r9, 0"; +"shld r9, rdx, 13"; +"and rdx, rsi"; +"add r9, rbx"; +"adc r14, 0"; +"shld r14, r9, 13"; +"and r9, rsi"; +"add r14, r11"; +"adc rcx, 0"; +"shld rcx, r14, 13"; +"and r14, rsi"; +"add rcx, r10"; +"adc r8, 0"; +"shld r8, rcx, 13"; +"and rcx, rsi"; +"lea rax, [r8 + 8*r8]"; +"lea rax, [r8 + 2*rax]"; +"add rax, r12"; +"mov r8, rax"; +"shr r8, 51"; +"add r8, rdx"; +"and rax, rsi"; +"mov rdx, r8"; +"shr rdx, 51"; +"add rdx, r9"; +"and r8, rsi"; +"mov qword ptr [rdi], rax"; +"mov qword ptr [rdi + 8], r8"; +"mov qword ptr [rdi + 16], rdx"; +"mov qword ptr [rdi + 24], r14"; +"mov qword ptr [rdi + 32], rcx"; +"pop rbx"; +"pop r12"; +"pop r14"; +"pop r15"; +"ret"; +""; +"_Z16fiat_25519_carryPmPKm:"; +"mov r9, qword ptr [rsi]"; +"mov rcx, r9"; +"shr rcx, 51"; +"add rcx, qword ptr [rsi + 8]"; +"mov rax, rcx"; +"shr rax, 51"; +"add rax, qword ptr [rsi + 16]"; +"mov rdx, rax"; +"shr rdx, 51"; +"add rdx, qword ptr [rsi + 24]"; +"mov r8, rdx"; +"shr r8, 51"; +"add r8, qword ptr [rsi + 32]"; +"movabs rsi, 2251799813685247"; +"and r9, rsi"; +"mov r10, r8"; +"shr r10, 51"; +"lea r11, [r10 + 8*r10]"; +"lea r10, [r10 + 2*r11]"; +"add r10, r9"; +"mov r9, r10"; +"shr r9, 51"; +"and rcx, rsi"; +"add rcx, r9"; +"and r10, rsi"; +"mov r9, rcx"; +"and r9, rsi"; +"shr rcx, 51"; +"and rax, rsi"; +"add rax, rcx"; +"and rdx, rsi"; +"and r8, rsi"; +"mov qword ptr [rdi], r10"; +"mov qword ptr [rdi + 8], r9"; +"mov qword ptr [rdi + 16], rax"; +"mov qword ptr [rdi + 24], rdx"; +"mov qword ptr [rdi + 32], r8"; +"ret"; +""; +"_Z14fiat_25519_addPmPKmS1_:"; +"mov rax, qword ptr [rdx + 32]"; +"add rax, qword ptr [rsi + 32]"; +"movdqu xmm0, xmmword ptr [rsi]"; +"movdqu xmm1, xmmword ptr [rsi + 16]"; +"movdqu xmm2, xmmword ptr [rdx]"; +"paddq xmm2, xmm0"; +"movdqu xmm0, xmmword ptr [rdx + 16]"; +"paddq xmm0, xmm1"; +"movdqu xmmword ptr [rdi], xmm2"; +"movdqu xmmword ptr [rdi + 16], xmm0"; +"mov qword ptr [rdi + 32], rax"; +"ret"; +""; +".LCPI8_0:"; +".quad 4503599627370458"; +".quad 4503599627370494"; +".LCPI8_1:"; +".quad 4503599627370494"; +".quad 4503599627370494"; +"_Z14fiat_25519_subPmPKmS1_:"; +"mov rax, qword ptr [rsi + 32]"; +"sub rax, qword ptr [rdx + 32]"; +"movabs rcx, 4503599627370494"; +"movdqu xmm0, xmmword ptr [rsi]"; +"movdqu xmm1, xmmword ptr [rsi + 16]"; +"movdqu xmm2, xmmword ptr [rdx]"; +"psubq xmm0, xmm2"; +"movdqu xmm2, xmmword ptr [rdx + 16]"; +"psubq xmm1, xmm2"; +"paddq xmm0, xmmword ptr [rip + .LCPI8_0]"; +"paddq xmm1, xmmword ptr [rip + .LCPI8_1]"; +"add rcx, rax"; +"movdqu xmmword ptr [rdi], xmm0"; +"movdqu xmmword ptr [rdi + 16], xmm1"; +"mov qword ptr [rdi + 32], rcx"; +"ret"; +""; +".LCPI9_0:"; +".quad 4503599627370458"; +".quad 4503599627370494"; +".LCPI9_1:"; +".quad 4503599627370494"; +".quad 4503599627370494"; +"_Z14fiat_25519_oppPmPKm:"; +"movabs rax, 4503599627370494"; +"sub rax, qword ptr [rsi + 32]"; +"movdqa xmm0, xmmword ptr [rip + .LCPI9_0]"; +"movdqu xmm1, xmmword ptr [rsi]"; +"psubq xmm0, xmm1"; +"movdqu xmm1, xmmword ptr [rsi + 16]"; +"movdqa xmm2, xmmword ptr [rip + .LCPI9_1]"; +"psubq xmm2, xmm1"; +"movdqu xmmword ptr [rdi], xmm0"; +"movdqu xmmword ptr [rdi + 16], xmm2"; +"mov qword ptr [rdi + 32], rax"; +"ret"; +""; +"_Z20fiat_25519_selectznzPmhPKmS1_:"; +"lea rax, [rdx + 32]"; +"lea r8, [rcx + 32]"; +"xor r9d, r9d"; +"test esi, esi"; +"cmove r8, rax"; +"sete r9b"; +"mov rax, qword ptr [r8]"; +"movd xmm0, r9d"; +"pshufd xmm0, xmm0, 0"; +"pslld xmm0, 31"; +"psrad xmm0, 31"; +"movdqu xmm1, xmmword ptr [rcx]"; +"movdqu xmm2, xmmword ptr [rcx + 16]"; +"movdqa xmm3, xmm0"; +"pandn xmm3, xmm1"; +"movdqu xmm1, xmmword ptr [rdx]"; +"movdqu xmm4, xmmword ptr [rdx + 16]"; +"pand xmm1, xmm0"; +"por xmm1, xmm3"; +"pand xmm4, xmm0"; +"pandn xmm0, xmm2"; +"por xmm0, xmm4"; +"movdqu xmmword ptr [rdi], xmm1"; +"movdqu xmmword ptr [rdi + 16], xmm0"; +"mov qword ptr [rdi + 32], rax"; +"ret"; +""; +"_Z19fiat_25519_to_bytesPhPKm:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"mov rax, qword ptr [rsi]"; +"movabs r9, -2251799813685247"; +"add rax, r9"; +"add rax, 18"; +"movabs r11, 2251799813685247"; +"mov r10, rax"; +"and r10, r11"; +"shr rax, 51"; +"neg eax"; +"movzx eax, al"; +"mov rcx, qword ptr [rsi + 8]"; +"add rcx, r9"; +"sub rcx, rax"; +"mov rax, rcx"; +"and rax, r11"; +"shr rcx, 51"; +"neg ecx"; +"movzx ecx, cl"; +"mov rdx, qword ptr [rsi + 16]"; +"add rdx, r9"; +"sub rdx, rcx"; +"mov r8, rdx"; +"and r8, r11"; +"shr rdx, 51"; +"neg edx"; +"movzx ecx, dl"; +"mov rbx, qword ptr [rsi + 24]"; +"add rbx, r9"; +"sub rbx, rcx"; +"mov rdx, rbx"; +"and rdx, r11"; +"shr rbx, 51"; +"neg ebx"; +"add r9, qword ptr [rsi + 32]"; +"movzx ecx, bl"; +"sub r9, rcx"; +"movabs rcx, 574208952489738240"; +"and rcx, r9"; +"lea rbx, [r11 - 18]"; +"test rcx, rcx"; +"cmove rbx, rcx"; +"cmovne rcx, r11"; +"add rbx, r10"; +"mov r10, rbx"; +"mov rsi, rbx"; +"shr rsi, 51"; +"add rax, rcx"; +"add rax, rsi"; +"mov rsi, rax"; +"shr rsi, 51"; +"add r8, rcx"; +"add r8, rsi"; +"mov rsi, r8"; +"shr rsi, 51"; +"add rdx, rcx"; +"add rdx, rsi"; +"mov rsi, rdx"; +"shr rsi, 51"; +"add rcx, r9"; +"add rcx, rsi"; +"mov ebp, ecx"; +"shl ebp, 4"; +"mov esi, r8d"; +"shl esi, 6"; +"shr r10, 48"; +"and r10d, 7"; +"lea r9d, [r10 + 8*rax]"; +"mov dword ptr [rsp - 20], r9d"; +"mov dword ptr [rsp - 24], eax"; +"mov dword ptr [rsp - 28], eax"; +"mov dword ptr [rsp - 32], eax"; +"mov qword ptr [rsp - 8], rax"; +"mov qword ptr [rsp - 16], rax"; +"shr rax, 45"; +"and eax, 63"; +"or eax, esi"; +"mov dword ptr [rsp - 36], r8d"; +"mov dword ptr [rsp - 40], r8d"; +"mov r13d, r8d"; +"mov r12, r8"; +"mov r15, r8"; +"mov r14, r8"; +"shr r8, 50"; +"and r8d, 1"; +"lea esi, [r8 + 2*rdx]"; +"mov dword ptr [rsp - 44], esi"; +"mov r11d, edx"; +"mov r10d, edx"; +"mov r9d, edx"; +"mov r8, rdx"; +"mov rsi, rdx"; +"shr rdx, 47"; +"and edx, 15"; +"or edx, ebp"; +"mov byte ptr [rdi], bl"; +"mov byte ptr [rdi + 1], bh"; +"mov ebp, ebx"; +"shr ebp, 16"; +"mov byte ptr [rdi + 2], bpl"; +"mov ebp, ebx"; +"shr ebp, 24"; +"mov byte ptr [rdi + 3], bpl"; +"mov rbp, rbx"; +"shr rbp, 32"; +"mov byte ptr [rdi + 4], bpl"; +"shr rbx, 40"; +"mov byte ptr [rdi + 5], bl"; +"mov ebx, dword ptr [rsp - 20]"; +"mov byte ptr [rdi + 6], bl"; +"mov ebx, dword ptr [rsp - 24]"; +"shr ebx, 5"; +"mov byte ptr [rdi + 7], bl"; +"mov ebx, dword ptr [rsp - 28]"; +"shr ebx, 13"; +"mov byte ptr [rdi + 8], bl"; +"mov ebx, dword ptr [rsp - 32]"; +"shr ebx, 21"; +"mov byte ptr [rdi + 9], bl"; +"mov rbx, qword ptr [rsp - 8]"; +"shr rbx, 29"; +"mov byte ptr [rdi + 10], bl"; +"mov rbx, qword ptr [rsp - 16]"; +"shr rbx, 37"; +"mov byte ptr [rdi + 11], bl"; +"mov byte ptr [rdi + 12], al"; +"mov eax, dword ptr [rsp - 36]"; +"shr eax, 2"; +"mov byte ptr [rdi + 13], al"; +"mov eax, dword ptr [rsp - 40]"; +"shr eax, 10"; +"mov byte ptr [rdi + 14], al"; +"shr r13d, 18"; +"mov byte ptr [rdi + 15], r13b"; +"shr r12, 26"; +"mov byte ptr [rdi + 16], r12b"; +"shr r15, 34"; +"mov byte ptr [rdi + 17], r15b"; +"shr r14, 42"; +"mov byte ptr [rdi + 18], r14b"; +"mov eax, dword ptr [rsp - 44]"; +"mov byte ptr [rdi + 19], al"; +"shr r11d, 7"; +"mov byte ptr [rdi + 20], r11b"; +"shr r10d, 15"; +"mov byte ptr [rdi + 21], r10b"; +"shr r9d, 23"; +"mov byte ptr [rdi + 22], r9b"; +"shr r8, 31"; +"mov byte ptr [rdi + 23], r8b"; +"shr rsi, 39"; +"mov byte ptr [rdi + 24], sil"; +"mov byte ptr [rdi + 25], dl"; +"mov eax, ecx"; +"shr eax, 4"; +"mov byte ptr [rdi + 26], al"; +"mov eax, ecx"; +"shr eax, 12"; +"mov byte ptr [rdi + 27], al"; +"mov eax, ecx"; +"shr eax, 20"; +"mov byte ptr [rdi + 28], al"; +"mov rax, rcx"; +"shr rax, 28"; +"mov byte ptr [rdi + 29], al"; +"mov rax, rcx"; +"shr rax, 36"; +"mov byte ptr [rdi + 30], al"; +"shr rcx, 44"; +"and cl, 127"; +"mov byte ptr [rdi + 31], cl"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z21fiat_25519_from_bytesPmPKh:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"mov qword ptr [rsp - 8], rdi"; +"movzx eax, byte ptr [rsi + 31]"; +"shl rax, 44"; +"movzx ecx, byte ptr [rsi + 30]"; +"shl rcx, 36"; +"or rcx, rax"; +"movzx eax, byte ptr [rsi + 29]"; +"shl rax, 28"; +"or rax, rcx"; +"movzx ecx, byte ptr [rsi + 28]"; +"shl ecx, 20"; +"or rcx, rax"; +"movzx edx, byte ptr [rsi + 27]"; +"shl edx, 12"; +"or rdx, rcx"; +"movzx edi, byte ptr [rsi + 26]"; +"shl edi, 4"; +"or rdi, rdx"; +"movzx ecx, byte ptr [rsi + 25]"; +"shl rcx, 47"; +"movzx edx, byte ptr [rsi + 24]"; +"shl rdx, 39"; +"or rdx, rcx"; +"movzx ecx, byte ptr [rsi + 23]"; +"shl rcx, 31"; +"or rcx, rdx"; +"movzx edx, byte ptr [rsi + 22]"; +"shl edx, 23"; +"or rdx, rcx"; +"movzx r8d, byte ptr [rsi + 21]"; +"shl r8d, 15"; +"or r8, rdx"; +"movzx ecx, byte ptr [rsi + 20]"; +"shl ecx, 7"; +"or rcx, r8"; +"movzx edx, byte ptr [rsi + 19]"; +"shl rdx, 50"; +"movzx r8d, byte ptr [rsi + 18]"; +"shl r8, 42"; +"or r8, rdx"; +"movzx edx, byte ptr [rsi + 17]"; +"shl rdx, 34"; +"or rdx, r8"; +"movzx r8d, byte ptr [rsi + 16]"; +"shl r8, 26"; +"or r8, rdx"; +"movzx r9d, byte ptr [rsi + 15]"; +"shl r9d, 18"; +"or r9, r8"; +"movzx edx, byte ptr [rsi + 14]"; +"shl edx, 10"; +"or rdx, r9"; +"movzx r8d, byte ptr [rsi + 13]"; +"movzx r9d, byte ptr [rsi + 12]"; +"movzx r10d, byte ptr [rsi + 11]"; +"shl r10, 37"; +"movzx r11d, byte ptr [rsi + 10]"; +"shl r11, 29"; +"movzx ebx, byte ptr [rsi + 9]"; +"shl ebx, 21"; +"movzx r14d, byte ptr [rsi + 8]"; +"shl r14d, 13"; +"movzx r15d, byte ptr [rsi + 7]"; +"shl r15d, 5"; +"movzx r12d, byte ptr [rsi + 6]"; +"movzx r13d, byte ptr [rsi + 5]"; +"shl r13, 40"; +"movzx ebp, byte ptr [rsi + 4]"; +"shl rbp, 32"; +"mov eax, dword ptr [rsi]"; +"or rax, r13"; +"or rax, rbp"; +"mov esi, r12d"; +"and esi, 7"; +"shl rsi, 48"; +"or rsi, rax"; +"shr r12d, 3"; +"mov r13d, r9d"; +"and r13d, 63"; +"shl r13, 45"; +"or r13, r10"; +"or r13, r11"; +"or r13, rbx"; +"or r13, r14"; +"or r13, r15"; +"or r13, r12"; +"shr r9d, 6"; +"lea rax, [rdx + 4*r8]"; +"add rax, r9"; +"movabs rdx, 2251799813685247"; +"mov r8, rax"; +"and r8, rdx"; +"shr rax, 51"; +"add rax, rcx"; +"and rdx, rax"; +"shr rax, 51"; +"add rax, rdi"; +"mov rcx, qword ptr [rsp - 8]"; +"mov qword ptr [rcx], rsi"; +"mov qword ptr [rcx + 8], r13"; +"mov qword ptr [rcx + 16], r8"; +"mov qword ptr [rcx + 24], rdx"; +"mov qword ptr [rcx + 32], rax"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +""]. diff --git a/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_Os.v b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_Os.v new file mode 100644 index 0000000000..770d195a6e --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_Os.v @@ -0,0 +1,899 @@ +From Coq Require Import String List. +Import ListNotations. +Local Open Scope string_scope. +Local Open Scope list_scope. +Example example : list string := [ +"_Z24fiat_25519_addcarryx_u51PmPhhmm:"; +"mov eax, edx"; +"add rcx, r8"; +"add rcx, rax"; +"movabs rax, 2251799813685247"; +"and rax, rcx"; +"shr rcx, 51"; +"mov qword ptr [rdi], rax"; +"mov byte ptr [rsi], cl"; +"ret"; +""; +"_Z25fiat_25519_subborrowx_u51PmPhhmm:"; +"mov eax, edx"; +"add rax, r8"; +"sub rcx, rax"; +"movabs rax, 2251799813685247"; +"and rax, rcx"; +"mov qword ptr [rdi], rax"; +"shr rcx, 51"; +"neg cl"; +"mov byte ptr [rsi], cl"; +"ret"; +""; +"_Z22fiat_25519_cmovznz_u64Pmhmm:"; +"test esi, esi"; +"cmovne rdx, rcx"; +"mov qword ptr [rdi], rdx"; +"ret"; +""; +"_Z20fiat_25519_carry_mulPmPKmS1_:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"sub rsp, 192"; +"mov r8, rdx"; +"mov r15, qword ptr [rsi + 32]"; +"mov r13, rsi"; +"mov qword ptr [rsp - 104], rsi"; +"mov rcx, qword ptr [rdx + 32]"; +"mov qword ptr [rsp - 96], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea rbx, [rcx + 2*rax]"; +"mov rax, rbx"; +"mul r15"; +"mov qword ptr [rsp + 176], rax"; +"mov qword ptr [rsp + 184], rdx"; +"mov rcx, qword ptr [r8 + 24]"; +"mov qword ptr [rsp - 120], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea r9, [rcx + 2*rax]"; +"mov rax, r9"; +"mul r15"; +"mov qword ptr [rsp + 144], rax"; +"mov qword ptr [rsp + 152], rdx"; +"mov rcx, qword ptr [r8 + 16]"; +"mov qword ptr [rsp - 128], rcx"; +"lea rax, [rcx + 8*rcx]"; +"lea r10, [rcx + 2*rax]"; +"mov rax, r10"; +"mul r15"; +"mov qword ptr [rsp + 128], rax"; +"mov qword ptr [rsp + 136], rdx"; +"mov rcx, qword ptr [r8 + 8]"; +"lea rax, [rcx + 8*rcx]"; +"lea rax, [rcx + 2*rax]"; +"mul r15"; +"mov qword ptr [rsp + 56], rax"; +"mov qword ptr [rsp + 64], rdx"; +"mov r14, qword ptr [rsi + 24]"; +"mov rax, r14"; +"mul rbx"; +"mov r11, rdx"; +"mov qword ptr [rsp + 40], rax"; +"mov rax, r14"; +"mul r9"; +"mov rbp, rdx"; +"mov rsi, rax"; +"mov rax, r14"; +"mul r10"; +"mov qword ptr [rsp + 16], rax"; +"mov r12, rdx"; +"mov r10, qword ptr [r13 + 16]"; +"mov rax, r10"; +"mul rbx"; +"mov qword ptr [rsp + 72], rdx"; +"mov qword ptr [rsp + 48], rax"; +"mov rax, r10"; +"mul r9"; +"mov qword ptr [rsp - 16], rax"; +"mov qword ptr [rsp - 8], rdx"; +"mov r9, qword ptr [r13 + 8]"; +"mov rax, r9"; +"mul rbx"; +"mov qword ptr [rsp - 32], rax"; +"mov qword ptr [rsp - 24], rdx"; +"mov r8, qword ptr [r8]"; +"mov rax, r8"; +"mul r15"; +"mov qword ptr [rsp + 168], rdx"; +"mov qword ptr [rsp + 160], rax"; +"mov rax, r14"; +"mov r15, rcx"; +"mov qword ptr [rsp - 112], rcx"; +"mul rcx"; +"mov qword ptr [rsp + 120], rdx"; +"mov qword ptr [rsp + 112], rax"; +"mov rax, r8"; +"mov qword ptr [rsp - 88], r8"; +"mul r14"; +"mov qword ptr [rsp + 104], rdx"; +"mov qword ptr [rsp + 96], rax"; +"mov rax, r10"; +"mov rcx, qword ptr [rsp - 128]"; +"mul rcx"; +"mov r13, rdx"; +"mov rbx, rax"; +"mov rax, r10"; +"mul r15"; +"mov r15, rdx"; +"mov r14, rax"; +"mov rax, r8"; +"mul r10"; +"mov qword ptr [rsp + 8], rdx"; +"mov qword ptr [rsp], rax"; +"mov rax, r9"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp + 88], rdx"; +"mov qword ptr [rsp + 80], rax"; +"mov rax, r9"; +"mul rcx"; +"mov qword ptr [rsp + 32], rdx"; +"mov qword ptr [rsp + 24], rax"; +"mov rax, r9"; +"mov r8, qword ptr [rsp - 112]"; +"mul r8"; +"mov qword ptr [rsp - 56], rax"; +"mov qword ptr [rsp - 48], rdx"; +"mov rax, qword ptr [rsp - 104]"; +"mov r10, qword ptr [rax]"; +"mov rcx, qword ptr [rsp - 88]"; +"mov rax, rcx"; +"mul r9"; +"mov qword ptr [rsp - 72], rdx"; +"mov qword ptr [rsp - 80], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 96]"; +"mov qword ptr [rsp - 96], rdx"; +"mov qword ptr [rsp - 104], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp - 120], rdx"; +"mov qword ptr [rsp - 40], rax"; +"mov rax, r10"; +"mul qword ptr [rsp - 128]"; +"mov qword ptr [rsp - 128], rdx"; +"mov qword ptr [rsp - 64], rax"; +"mov rax, r10"; +"mul r8"; +"mov qword ptr [rsp - 112], rdx"; +"mov r9, rax"; +"mov rax, r10"; +"mul rcx"; +"mov r8, qword ptr [rsp + 16]"; +"add r8, qword ptr [rsp + 56]"; +"adc r12, qword ptr [rsp + 64]"; +"add r8, qword ptr [rsp - 16]"; +"adc r12, qword ptr [rsp - 8]"; +"add r8, qword ptr [rsp - 32]"; +"adc r12, qword ptr [rsp - 24]"; +"add r8, rax"; +"adc r12, rdx"; +"shld r12, r8, 13"; +"movabs rax, 2251799813685247"; +"and r8, rax"; +"mov rcx, qword ptr [rsp + 40]"; +"add rcx, qword ptr [rsp + 144]"; +"adc r11, qword ptr [rsp + 152]"; +"add rsi, qword ptr [rsp + 128]"; +"adc rbp, qword ptr [rsp + 136]"; +"add rsi, qword ptr [rsp + 48]"; +"adc rbp, qword ptr [rsp + 72]"; +"add rsi, qword ptr [rsp - 80]"; +"adc rbp, qword ptr [rsp - 72]"; +"add rsi, r9"; +"adc rbp, qword ptr [rsp - 112]"; +"add rsi, r12"; +"adc rbp, 0"; +"shld rbp, rsi, 13"; +"and rsi, rax"; +"add rcx, qword ptr [rsp - 56]"; +"adc r11, qword ptr [rsp - 48]"; +"add rcx, qword ptr [rsp]"; +"adc r11, qword ptr [rsp + 8]"; +"add rcx, qword ptr [rsp - 64]"; +"adc r11, qword ptr [rsp - 128]"; +"add rcx, rbp"; +"adc r11, 0"; +"shld r11, rcx, 13"; +"and rcx, rax"; +"add r14, qword ptr [rsp + 176]"; +"adc r15, qword ptr [rsp + 184]"; +"add r14, qword ptr [rsp + 24]"; +"adc r15, qword ptr [rsp + 32]"; +"add r14, qword ptr [rsp + 96]"; +"adc r15, qword ptr [rsp + 104]"; +"add r14, qword ptr [rsp - 40]"; +"adc r15, qword ptr [rsp - 120]"; +"add r14, r11"; +"adc r15, 0"; +"shld r15, r14, 13"; +"and r14, rax"; +"add rbx, qword ptr [rsp + 112]"; +"adc r13, qword ptr [rsp + 120]"; +"add rbx, qword ptr [rsp + 80]"; +"adc r13, qword ptr [rsp + 88]"; +"add rbx, qword ptr [rsp + 160]"; +"adc r13, qword ptr [rsp + 168]"; +"add rbx, qword ptr [rsp - 104]"; +"adc r13, qword ptr [rsp - 96]"; +"add rbx, r15"; +"adc r13, 0"; +"shld r13, rbx, 13"; +"lea rdx, [8*r13]"; +"add rdx, r13"; +"lea rdx, [2*rdx]"; +"add rdx, r13"; +"add rdx, r8"; +"mov r8, rdx"; +"shr r8, 51"; +"add r8, rsi"; +"mov rsi, r8"; +"shr rsi, 51"; +"add rsi, rcx"; +"and rbx, rax"; +"and rdx, rax"; +"and r8, rax"; +"mov qword ptr [rdi], rdx"; +"mov qword ptr [rdi + 8], r8"; +"mov qword ptr [rdi + 16], rsi"; +"mov qword ptr [rdi + 24], r14"; +"mov qword ptr [rdi + 32], rbx"; +"add rsp, 192"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z23fiat_25519_carry_squarePmPKm:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"push rax"; +"mov rdx, qword ptr [rsi + 32]"; +"lea rax, [rdx + 8*rdx]"; +"lea rax, [rdx + 2*rax]"; +"imul r10, rdx, 38"; +"lea rcx, [rdx + rdx]"; +"mov qword ptr [rsp - 112], rcx"; +"mov r8, qword ptr [rsi + 24]"; +"lea rcx, [r8 + 8*r8]"; +"lea rcx, [r8 + 2*rcx]"; +"imul r11, r8, 38"; +"mul rdx"; +"mov qword ptr [rsp - 32], rax"; +"mov qword ptr [rsp - 24], rdx"; +"mov r9, qword ptr [rsi + 16]"; +"mov rax, r8"; +"mul r10"; +"mov qword ptr [rsp - 8], rdx"; +"mov qword ptr [rsp - 40], rax"; +"mov rax, rcx"; +"mul r8"; +"mov qword ptr [rsp], rdx"; +"mov qword ptr [rsp - 16], rax"; +"mov rax, r9"; +"mul r10"; +"mov rbx, rax"; +"mov rcx, rdx"; +"add r8, r8"; +"mov qword ptr [rsp - 128], r8"; +"mov rax, r9"; +"mul r11"; +"mov qword ptr [rsp - 72], rax"; +"mov qword ptr [rsp - 64], rdx"; +"lea r14, [r9 + r9]"; +"mov qword ptr [rsp - 120], r14"; +"mov rax, r9"; +"mul r9"; +"mov qword ptr [rsp - 56], rax"; +"mov qword ptr [rsp - 48], rdx"; +"mov rbp, qword ptr [rsi + 8]"; +"mov rax, rbp"; +"mul r10"; +"mov r15, rdx"; +"mov r9, rax"; +"mov rax, rbp"; +"mul r8"; +"mov r11, rdx"; +"mov r13, rax"; +"mov rax, rbp"; +"mul r14"; +"mov r14, rax"; +"mov r8, rdx"; +"mov rsi, qword ptr [rsi]"; +"mov rax, rbp"; +"mul rbp"; +"mov r10, rdx"; +"mov r12, rax"; +"mov rax, rsi"; +"mul qword ptr [rsp - 112]"; +"mov qword ptr [rsp - 80], rdx"; +"mov qword ptr [rsp - 104], rax"; +"mov rax, rsi"; +"mul qword ptr [rsp - 128]"; +"mov qword ptr [rsp - 88], rax"; +"mov qword ptr [rsp - 128], rdx"; +"add rbp, rbp"; +"mov rax, rsi"; +"mul qword ptr [rsp - 120]"; +"mov qword ptr [rsp - 112], rdx"; +"mov qword ptr [rsp - 96], rax"; +"mov rax, rsi"; +"mul rbp"; +"mov rbp, rdx"; +"mov qword ptr [rsp - 120], rax"; +"mov rax, rsi"; +"mul rsi"; +"add r9, qword ptr [rsp - 72]"; +"adc r15, qword ptr [rsp - 64]"; +"add r9, rax"; +"adc r15, rdx"; +"shld r15, r9, 13"; +"movabs rax, 2251799813685247"; +"and r9, rax"; +"add r13, qword ptr [rsp - 56]"; +"adc r11, qword ptr [rsp - 48]"; +"add r13, qword ptr [rsp - 104]"; +"adc r11, qword ptr [rsp - 80]"; +"add r14, qword ptr [rsp - 32]"; +"adc r8, qword ptr [rsp - 24]"; +"add r14, qword ptr [rsp - 88]"; +"adc r8, qword ptr [rsp - 128]"; +"add r12, qword ptr [rsp - 40]"; +"adc r10, qword ptr [rsp - 8]"; +"add r12, qword ptr [rsp - 96]"; +"adc r10, qword ptr [rsp - 112]"; +"add rbx, qword ptr [rsp - 16]"; +"adc rcx, qword ptr [rsp]"; +"add rbx, qword ptr [rsp - 120]"; +"adc rcx, rbp"; +"add rbx, r15"; +"adc rcx, 0"; +"shld rcx, rbx, 13"; +"and rbx, rax"; +"add rcx, r12"; +"adc r10, 0"; +"shld r10, rcx, 13"; +"and rcx, rax"; +"add r10, r14"; +"adc r8, 0"; +"shld r8, r10, 13"; +"and r10, rax"; +"add r8, r13"; +"adc r11, 0"; +"shld r11, r8, 13"; +"lea rdx, [r11 + 8*r11]"; +"lea rdx, [r11 + 2*rdx]"; +"add rdx, r9"; +"mov rsi, rdx"; +"shr rsi, 51"; +"add rsi, rbx"; +"mov r9, rsi"; +"shr r9, 51"; +"add r9, rcx"; +"and r8, rax"; +"and rdx, rax"; +"and rsi, rax"; +"mov qword ptr [rdi], rdx"; +"mov qword ptr [rdi + 8], rsi"; +"mov qword ptr [rdi + 16], r9"; +"mov qword ptr [rdi + 24], r10"; +"mov qword ptr [rdi + 32], r8"; +"add rsp, 8"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z29fiat_25519_carry_scmul_121666PmPKm:"; +"push r15"; +"push r14"; +"push r12"; +"push rbx"; +"mov eax, 121666"; +"mul qword ptr [rsi + 32]"; +"mov r8, rdx"; +"mov r10, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 24]"; +"mov rcx, rdx"; +"mov r11, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 16]"; +"mov rbx, rdx"; +"mov r14, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi + 8]"; +"mov r9, rdx"; +"mov r15, rax"; +"mov eax, 121666"; +"mul qword ptr [rsi]"; +"shld rdx, rax, 13"; +"movabs rsi, 2251799813685247"; +"lea r12, [rsi - 1]"; +"and r12, rax"; +"add rdx, r15"; +"adc r9, 0"; +"shld r9, rdx, 13"; +"and rdx, rsi"; +"add r9, r14"; +"adc rbx, 0"; +"shld rbx, r9, 13"; +"and r9, rsi"; +"add rbx, r11"; +"adc rcx, 0"; +"shld rcx, rbx, 13"; +"and rbx, rsi"; +"add rcx, r10"; +"adc r8, 0"; +"shld r8, rcx, 13"; +"and rcx, rsi"; +"lea rax, [r8 + 8*r8]"; +"lea rax, [r8 + 2*rax]"; +"add rax, r12"; +"mov r8, rax"; +"shr r8, 51"; +"add r8, rdx"; +"and rax, rsi"; +"mov rdx, r8"; +"shr rdx, 51"; +"add rdx, r9"; +"and r8, rsi"; +"mov qword ptr [rdi], rax"; +"mov qword ptr [rdi + 8], r8"; +"mov qword ptr [rdi + 16], rdx"; +"mov qword ptr [rdi + 24], rbx"; +"mov qword ptr [rdi + 32], rcx"; +"pop rbx"; +"pop r12"; +"pop r14"; +"pop r15"; +"ret"; +""; +"_Z16fiat_25519_carryPmPKm:"; +"mov r9, qword ptr [rsi]"; +"mov rcx, r9"; +"shr rcx, 51"; +"add rcx, qword ptr [rsi + 8]"; +"mov rax, rcx"; +"shr rax, 51"; +"add rax, qword ptr [rsi + 16]"; +"mov rdx, rax"; +"shr rdx, 51"; +"add rdx, qword ptr [rsi + 24]"; +"mov r8, rdx"; +"shr r8, 51"; +"add r8, qword ptr [rsi + 32]"; +"movabs rsi, 2251799813685247"; +"and r9, rsi"; +"mov r10, r8"; +"shr r10, 51"; +"lea r11, [r10 + 8*r10]"; +"lea r10, [r10 + 2*r11]"; +"add r10, r9"; +"mov r9, r10"; +"shr r9, 51"; +"and rcx, rsi"; +"add rcx, r9"; +"and r10, rsi"; +"mov r9, rcx"; +"and r9, rsi"; +"shr rcx, 51"; +"and rax, rsi"; +"add rax, rcx"; +"and rdx, rsi"; +"and r8, rsi"; +"mov qword ptr [rdi], r10"; +"mov qword ptr [rdi + 8], r9"; +"mov qword ptr [rdi + 16], rax"; +"mov qword ptr [rdi + 24], rdx"; +"mov qword ptr [rdi + 32], r8"; +"ret"; +""; +"_Z14fiat_25519_addPmPKmS1_:"; +"mov rax, qword ptr [rdx + 32]"; +"add rax, qword ptr [rsi + 32]"; +"movdqu xmm0, xmmword ptr [rsi]"; +"movdqu xmm1, xmmword ptr [rsi + 16]"; +"movdqu xmm2, xmmword ptr [rdx]"; +"paddq xmm2, xmm0"; +"movdqu xmm0, xmmword ptr [rdx + 16]"; +"paddq xmm0, xmm1"; +"movdqu xmmword ptr [rdi], xmm2"; +"movdqu xmmword ptr [rdi + 16], xmm0"; +"mov qword ptr [rdi + 32], rax"; +"ret"; +""; +".LCPI8_0:"; +".quad 4503599627370458"; +".quad 4503599627370494"; +".LCPI8_1:"; +".quad 4503599627370494"; +".quad 4503599627370494"; +"_Z14fiat_25519_subPmPKmS1_:"; +"mov rax, qword ptr [rsi + 32]"; +"sub rax, qword ptr [rdx + 32]"; +"movabs rcx, 4503599627370494"; +"movdqu xmm0, xmmword ptr [rsi]"; +"movdqu xmm1, xmmword ptr [rsi + 16]"; +"movdqu xmm2, xmmword ptr [rdx]"; +"psubq xmm0, xmm2"; +"movdqu xmm2, xmmword ptr [rdx + 16]"; +"psubq xmm1, xmm2"; +"paddq xmm0, xmmword ptr [rip + .LCPI8_0]"; +"paddq xmm1, xmmword ptr [rip + .LCPI8_1]"; +"add rcx, rax"; +"movdqu xmmword ptr [rdi], xmm0"; +"movdqu xmmword ptr [rdi + 16], xmm1"; +"mov qword ptr [rdi + 32], rcx"; +"ret"; +""; +".LCPI9_0:"; +".quad 4503599627370458"; +".quad 4503599627370494"; +".LCPI9_1:"; +".quad 4503599627370494"; +".quad 4503599627370494"; +"_Z14fiat_25519_oppPmPKm:"; +"movabs rax, 4503599627370494"; +"sub rax, qword ptr [rsi + 32]"; +"movdqa xmm0, xmmword ptr [rip + .LCPI9_0]"; +"movdqu xmm1, xmmword ptr [rsi]"; +"psubq xmm0, xmm1"; +"movdqu xmm1, xmmword ptr [rsi + 16]"; +"movdqa xmm2, xmmword ptr [rip + .LCPI9_1]"; +"psubq xmm2, xmm1"; +"movdqu xmmword ptr [rdi], xmm0"; +"movdqu xmmword ptr [rdi + 16], xmm2"; +"mov qword ptr [rdi + 32], rax"; +"ret"; +""; +"_Z20fiat_25519_selectznzPmhPKmS1_:"; +"lea rax, [rdx + 32]"; +"lea r8, [rcx + 32]"; +"xor r9d, r9d"; +"test esi, esi"; +"cmove r8, rax"; +"sete r9b"; +"mov rax, qword ptr [r8]"; +"movd xmm0, r9d"; +"pshufd xmm0, xmm0, 0"; +"pslld xmm0, 31"; +"psrad xmm0, 31"; +"movdqu xmm1, xmmword ptr [rcx]"; +"movdqu xmm2, xmmword ptr [rcx + 16]"; +"movdqa xmm3, xmm0"; +"pandn xmm3, xmm1"; +"movdqu xmm1, xmmword ptr [rdx]"; +"movdqu xmm4, xmmword ptr [rdx + 16]"; +"pand xmm1, xmm0"; +"por xmm1, xmm3"; +"pand xmm4, xmm0"; +"pandn xmm0, xmm2"; +"por xmm0, xmm4"; +"movdqu xmmword ptr [rdi], xmm1"; +"movdqu xmmword ptr [rdi + 16], xmm0"; +"mov qword ptr [rdi + 32], rax"; +"ret"; +""; +"_Z19fiat_25519_to_bytesPhPKm:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"mov rax, qword ptr [rsi]"; +"movabs r9, -2251799813685247"; +"add rax, r9"; +"add rax, 18"; +"movabs r11, 2251799813685247"; +"mov r10, rax"; +"and r10, r11"; +"shr rax, 51"; +"neg eax"; +"mov ecx, 255"; +"and eax, ecx"; +"mov rdx, qword ptr [rsi + 8]"; +"add rdx, r9"; +"sub rdx, rax"; +"mov rax, rdx"; +"and rax, r11"; +"shr rdx, 51"; +"neg edx"; +"and edx, ecx"; +"mov rbx, qword ptr [rsi + 16]"; +"add rbx, r9"; +"sub rbx, rdx"; +"mov r8, rbx"; +"and r8, r11"; +"shr rbx, 51"; +"neg ebx"; +"and ebx, ecx"; +"mov r14, qword ptr [rsi + 24]"; +"add r14, r9"; +"sub r14, rbx"; +"mov rdx, r14"; +"and rdx, r11"; +"shr r14, 51"; +"neg r14d"; +"add r9, qword ptr [rsi + 32]"; +"and r14d, ecx"; +"sub r9, r14"; +"movabs rcx, 574208952489738240"; +"and rcx, r9"; +"lea rbx, [r11 - 18]"; +"test rcx, rcx"; +"cmove rbx, rcx"; +"cmovne rcx, r11"; +"add rbx, r10"; +"mov r10, rbx"; +"mov rsi, rbx"; +"shr rsi, 51"; +"add rax, rcx"; +"add rax, rsi"; +"mov rsi, rax"; +"shr rsi, 51"; +"add r8, rcx"; +"add r8, rsi"; +"mov rsi, r8"; +"shr rsi, 51"; +"add rdx, rcx"; +"add rdx, rsi"; +"mov rsi, rdx"; +"shr rsi, 51"; +"add rcx, r9"; +"add rcx, rsi"; +"mov ebp, ecx"; +"shl ebp, 4"; +"mov esi, r8d"; +"shl esi, 6"; +"shr r10, 48"; +"and r10d, 7"; +"lea r9d, [r10 + 8*rax]"; +"mov dword ptr [rsp - 20], r9d"; +"mov dword ptr [rsp - 24], eax"; +"mov dword ptr [rsp - 28], eax"; +"mov dword ptr [rsp - 32], eax"; +"mov qword ptr [rsp - 8], rax"; +"mov qword ptr [rsp - 16], rax"; +"shr rax, 45"; +"and eax, 63"; +"or eax, esi"; +"mov dword ptr [rsp - 36], r8d"; +"mov dword ptr [rsp - 40], r8d"; +"mov r13d, r8d"; +"mov r12, r8"; +"mov r15, r8"; +"mov r14, r8"; +"shr r8, 50"; +"and r8d, 1"; +"lea esi, [r8 + 2*rdx]"; +"mov dword ptr [rsp - 44], esi"; +"mov r11d, edx"; +"mov r10d, edx"; +"mov r9d, edx"; +"mov r8, rdx"; +"mov rsi, rdx"; +"shr rdx, 47"; +"and edx, 15"; +"or edx, ebp"; +"mov byte ptr [rdi], bl"; +"mov byte ptr [rdi + 1], bh"; +"mov ebp, ebx"; +"shr ebp, 16"; +"mov byte ptr [rdi + 2], bpl"; +"mov ebp, ebx"; +"shr ebp, 24"; +"mov byte ptr [rdi + 3], bpl"; +"mov rbp, rbx"; +"shr rbp, 32"; +"mov byte ptr [rdi + 4], bpl"; +"shr rbx, 40"; +"mov byte ptr [rdi + 5], bl"; +"mov ebx, dword ptr [rsp - 20]"; +"mov byte ptr [rdi + 6], bl"; +"mov ebx, dword ptr [rsp - 24]"; +"shr ebx, 5"; +"mov byte ptr [rdi + 7], bl"; +"mov ebx, dword ptr [rsp - 28]"; +"shr ebx, 13"; +"mov byte ptr [rdi + 8], bl"; +"mov ebx, dword ptr [rsp - 32]"; +"shr ebx, 21"; +"mov byte ptr [rdi + 9], bl"; +"mov rbx, qword ptr [rsp - 8]"; +"shr rbx, 29"; +"mov byte ptr [rdi + 10], bl"; +"mov rbx, qword ptr [rsp - 16]"; +"shr rbx, 37"; +"mov byte ptr [rdi + 11], bl"; +"mov byte ptr [rdi + 12], al"; +"mov eax, dword ptr [rsp - 36]"; +"shr eax, 2"; +"mov byte ptr [rdi + 13], al"; +"mov eax, dword ptr [rsp - 40]"; +"shr eax, 10"; +"mov byte ptr [rdi + 14], al"; +"shr r13d, 18"; +"mov byte ptr [rdi + 15], r13b"; +"shr r12, 26"; +"mov byte ptr [rdi + 16], r12b"; +"shr r15, 34"; +"mov byte ptr [rdi + 17], r15b"; +"shr r14, 42"; +"mov byte ptr [rdi + 18], r14b"; +"mov eax, dword ptr [rsp - 44]"; +"mov byte ptr [rdi + 19], al"; +"shr r11d, 7"; +"mov byte ptr [rdi + 20], r11b"; +"shr r10d, 15"; +"mov byte ptr [rdi + 21], r10b"; +"shr r9d, 23"; +"mov byte ptr [rdi + 22], r9b"; +"shr r8, 31"; +"mov byte ptr [rdi + 23], r8b"; +"shr rsi, 39"; +"mov byte ptr [rdi + 24], sil"; +"mov byte ptr [rdi + 25], dl"; +"mov eax, ecx"; +"shr eax, 4"; +"mov byte ptr [rdi + 26], al"; +"mov eax, ecx"; +"shr eax, 12"; +"mov byte ptr [rdi + 27], al"; +"mov eax, ecx"; +"shr eax, 20"; +"mov byte ptr [rdi + 28], al"; +"mov rax, rcx"; +"shr rax, 28"; +"mov byte ptr [rdi + 29], al"; +"mov rax, rcx"; +"shr rax, 36"; +"mov byte ptr [rdi + 30], al"; +"shr rcx, 44"; +"and cl, 127"; +"mov byte ptr [rdi + 31], cl"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +"ret"; +""; +"_Z21fiat_25519_from_bytesPmPKh:"; +"push rbp"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbx"; +"mov qword ptr [rsp - 8], rdi"; +"movzx eax, byte ptr [rsi + 31]"; +"shl rax, 44"; +"movzx ecx, byte ptr [rsi + 30]"; +"shl rcx, 36"; +"or rcx, rax"; +"movzx eax, byte ptr [rsi + 29]"; +"shl rax, 28"; +"or rax, rcx"; +"movzx ecx, byte ptr [rsi + 28]"; +"shl ecx, 20"; +"or rcx, rax"; +"movzx edx, byte ptr [rsi + 27]"; +"shl edx, 12"; +"or rdx, rcx"; +"movzx edi, byte ptr [rsi + 26]"; +"shl edi, 4"; +"or rdi, rdx"; +"movzx ecx, byte ptr [rsi + 25]"; +"shl rcx, 47"; +"movzx edx, byte ptr [rsi + 24]"; +"shl rdx, 39"; +"or rdx, rcx"; +"movzx ecx, byte ptr [rsi + 23]"; +"shl rcx, 31"; +"or rcx, rdx"; +"movzx edx, byte ptr [rsi + 22]"; +"shl edx, 23"; +"or rdx, rcx"; +"movzx r8d, byte ptr [rsi + 21]"; +"shl r8d, 15"; +"or r8, rdx"; +"movzx ecx, byte ptr [rsi + 20]"; +"shl ecx, 7"; +"or rcx, r8"; +"movzx edx, byte ptr [rsi + 19]"; +"shl rdx, 50"; +"movzx r8d, byte ptr [rsi + 18]"; +"shl r8, 42"; +"or r8, rdx"; +"movzx edx, byte ptr [rsi + 17]"; +"shl rdx, 34"; +"or rdx, r8"; +"movzx r8d, byte ptr [rsi + 16]"; +"shl r8, 26"; +"or r8, rdx"; +"movzx r9d, byte ptr [rsi + 15]"; +"shl r9d, 18"; +"or r9, r8"; +"movzx edx, byte ptr [rsi + 14]"; +"shl edx, 10"; +"or rdx, r9"; +"movzx r8d, byte ptr [rsi + 13]"; +"movzx r9d, byte ptr [rsi + 12]"; +"movzx r10d, byte ptr [rsi + 11]"; +"shl r10, 37"; +"movzx r11d, byte ptr [rsi + 10]"; +"shl r11, 29"; +"movzx ebx, byte ptr [rsi + 9]"; +"shl ebx, 21"; +"movzx r14d, byte ptr [rsi + 8]"; +"shl r14d, 13"; +"movzx r15d, byte ptr [rsi + 7]"; +"shl r15d, 5"; +"movzx r12d, byte ptr [rsi + 6]"; +"movzx r13d, byte ptr [rsi + 5]"; +"shl r13, 40"; +"movzx ebp, byte ptr [rsi + 4]"; +"shl rbp, 32"; +"mov eax, dword ptr [rsi]"; +"or rax, r13"; +"or rax, rbp"; +"mov esi, r12d"; +"and esi, 7"; +"shl rsi, 48"; +"or rsi, rax"; +"shr r12d, 3"; +"mov r13d, r9d"; +"and r13d, 63"; +"shl r13, 45"; +"or r13, r10"; +"or r13, r11"; +"or r13, rbx"; +"or r13, r14"; +"or r13, r15"; +"or r13, r12"; +"shr r9d, 6"; +"lea rax, [rdx + 4*r8]"; +"add rax, r9"; +"movabs rdx, 2251799813685247"; +"mov r8, rax"; +"and r8, rdx"; +"shr rax, 51"; +"add rax, rcx"; +"and rdx, rax"; +"shr rax, 51"; +"add rax, rdi"; +"mov rcx, qword ptr [rsp - 8]"; +"mov qword ptr [rcx], rsi"; +"mov qword ptr [rcx + 8], r13"; +"mov qword ptr [rcx + 16], r8"; +"mov qword ptr [rcx + 24], rdx"; +"mov qword ptr [rcx + 32], rax"; +"pop rbx"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"pop rbp"; +""]. diff --git a/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O0.v b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O0.v new file mode 100644 index 0000000000..53ba8a0d35 --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O0.v @@ -0,0 +1,2861 @@ +From Coq Require Import String List. +Import ListNotations. +Local Open Scope string_scope. +Local Open Scope list_scope. +Example example : list string := [ +"_Z24fiat_25519_addcarryx_u51PmPhhmm:"; +"push rbp"; +"mov rbp, rsp"; +"mov QWORD PTR [rbp-40], rdi"; +"mov QWORD PTR [rbp-48], rsi"; +"mov eax, edx"; +"mov QWORD PTR [rbp-64], rcx"; +"mov QWORD PTR [rbp-72], r8"; +"mov BYTE PTR [rbp-52], al"; +"movzx edx, BYTE PTR [rbp-52]"; +"mov rax, QWORD PTR [rbp-64]"; +"add rdx, rax"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-8], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-8]"; +"mov QWORD PTR [rbp-16], rax"; +"mov rax, QWORD PTR [rbp-8]"; +"shr rax, 51"; +"mov BYTE PTR [rbp-17], al"; +"mov rax, QWORD PTR [rbp-40]"; +"mov rdx, QWORD PTR [rbp-16]"; +"mov QWORD PTR [rax], rdx"; +"mov rax, QWORD PTR [rbp-48]"; +"movzx edx, BYTE PTR [rbp-17]"; +"mov BYTE PTR [rax], dl"; +"nop"; +"pop rbp"; +"ret"; +"_Z25fiat_25519_subborrowx_u51PmPhhmm:"; +"push rbp"; +"mov rbp, rsp"; +"mov QWORD PTR [rbp-40], rdi"; +"mov QWORD PTR [rbp-48], rsi"; +"mov eax, edx"; +"mov QWORD PTR [rbp-64], rcx"; +"mov QWORD PTR [rbp-72], r8"; +"mov BYTE PTR [rbp-52], al"; +"movzx eax, BYTE PTR [rbp-52]"; +"mov rdx, QWORD PTR [rbp-64]"; +"sub rdx, rax"; +"mov rax, QWORD PTR [rbp-72]"; +"sub rdx, rax"; +"mov QWORD PTR [rbp-8], rdx"; +"mov rax, QWORD PTR [rbp-8]"; +"sar rax, 51"; +"mov BYTE PTR [rbp-9], al"; +"mov rax, QWORD PTR [rbp-8]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-24], rax"; +"mov rax, QWORD PTR [rbp-40]"; +"mov rdx, QWORD PTR [rbp-24]"; +"mov QWORD PTR [rax], rdx"; +"movzx eax, BYTE PTR [rbp-9]"; +"neg eax"; +"mov edx, eax"; +"mov rax, QWORD PTR [rbp-48]"; +"mov BYTE PTR [rax], dl"; +"nop"; +"pop rbp"; +"ret"; +"_Z22fiat_25519_cmovznz_u64Pmhmm:"; +"push rbp"; +"mov rbp, rsp"; +"mov QWORD PTR [rbp-40], rdi"; +"mov eax, esi"; +"mov QWORD PTR [rbp-56], rdx"; +"mov QWORD PTR [rbp-64], rcx"; +"mov BYTE PTR [rbp-44], al"; +"cmp BYTE PTR [rbp-44], 0"; +"setne al"; +"mov BYTE PTR [rbp-1], al"; +"movzx eax, BYTE PTR [rbp-1]"; +"neg eax"; +"movsx rax, al"; +"mov QWORD PTR [rbp-16], rax"; +"mov rax, QWORD PTR [rbp-16]"; +"and rax, QWORD PTR [rbp-64]"; +"mov rdx, rax"; +"mov rax, QWORD PTR [rbp-16]"; +"not rax"; +"and rax, QWORD PTR [rbp-56]"; +"or rax, rdx"; +"mov QWORD PTR [rbp-24], rax"; +"mov rax, QWORD PTR [rbp-40]"; +"mov rdx, QWORD PTR [rbp-24]"; +"mov QWORD PTR [rax], rdx"; +"nop"; +"pop rbp"; +"ret"; +"_Z20fiat_25519_carry_mulPmPKmS1_:"; +"push rbp"; +"mov rbp, rsp"; +"push rbx"; +"sub rsp, 608"; +"mov QWORD PTR [rbp-712], rdi"; +"mov QWORD PTR [rbp-720], rsi"; +"mov QWORD PTR [rbp-728], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"mov rsi, rax"; +"mov edi, 0"; +"mov rax, QWORD PTR [rbp-728]"; +"add rax, 32"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov rcx, rax"; +"mov ebx, 0"; +"mov rdx, rdi"; +"imul rdx, rcx"; +"mov rax, rbx"; +"imul rax, rsi"; +"lea r8, [rdx+rax]"; +"mov rax, rsi"; +"mul rcx"; +"lea rcx, [r8+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-32], rax"; +"mov QWORD PTR [rbp-24], rdx"; +"mov QWORD PTR [rbp-32], rax"; +"mov QWORD PTR [rbp-24], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"mov rsi, rax"; +"mov edi, 0"; +"mov rax, QWORD PTR [rbp-728]"; +"add rax, 24"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov rcx, rax"; +"mov ebx, 0"; +"mov rdx, rdi"; +"imul rdx, rcx"; +"mov rax, rbx"; +"imul rax, rsi"; +"lea r8, [rdx+rax]"; +"mov rax, rsi"; +"mul rcx"; +"lea rcx, [r8+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-48], rax"; +"mov QWORD PTR [rbp-40], rdx"; +"mov QWORD PTR [rbp-48], rax"; +"mov QWORD PTR [rbp-40], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"mov rsi, rax"; +"mov edi, 0"; +"mov rax, QWORD PTR [rbp-728]"; +"add rax, 16"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov rcx, rax"; +"mov ebx, 0"; +"mov rdx, rdi"; +"imul rdx, rcx"; +"mov rax, rbx"; +"imul rax, rsi"; +"lea r8, [rdx+rax]"; +"mov rax, rsi"; +"mul rcx"; +"lea rcx, [r8+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-64], rax"; +"mov QWORD PTR [rbp-56], rdx"; +"mov QWORD PTR [rbp-64], rax"; +"mov QWORD PTR [rbp-56], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"mov rsi, rax"; +"mov edi, 0"; +"mov rax, QWORD PTR [rbp-728]"; +"add rax, 8"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov rcx, rax"; +"mov ebx, 0"; +"mov rdx, rdi"; +"imul rdx, rcx"; +"mov rax, rbx"; +"imul rax, rsi"; +"lea r8, [rdx+rax]"; +"mov rax, rsi"; +"mul rcx"; +"lea rcx, [r8+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-80], rax"; +"mov QWORD PTR [rbp-72], rdx"; +"mov QWORD PTR [rbp-80], rax"; +"mov QWORD PTR [rbp-72], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"mov rsi, rax"; +"mov edi, 0"; +"mov rax, QWORD PTR [rbp-728]"; +"add rax, 32"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov rcx, rax"; +"mov ebx, 0"; +"mov rdx, rdi"; +"imul rdx, rcx"; +"mov rax, rbx"; +"imul rax, rsi"; +"lea r8, [rdx+rax]"; +"mov rax, rsi"; +"mul rcx"; +"lea rcx, [r8+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-96], rax"; +"mov QWORD PTR [rbp-88], rdx"; +"mov QWORD PTR [rbp-96], rax"; +"mov QWORD PTR [rbp-88], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"mov rsi, rax"; +"mov edi, 0"; +"mov rax, QWORD PTR [rbp-728]"; +"add rax, 24"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov rcx, rax"; +"mov ebx, 0"; +"mov rdx, rdi"; +"imul rdx, rcx"; +"mov rax, rbx"; +"imul rax, rsi"; +"lea r8, [rdx+rax]"; +"mov rax, rsi"; +"mul rcx"; +"lea rcx, [r8+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-112], rax"; +"mov QWORD PTR [rbp-104], rdx"; +"mov QWORD PTR [rbp-112], rax"; +"mov QWORD PTR [rbp-104], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"mov rsi, rax"; +"mov edi, 0"; +"mov rax, QWORD PTR [rbp-728]"; +"add rax, 16"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov rcx, rax"; +"mov ebx, 0"; +"mov rdx, rdi"; +"imul rdx, rcx"; +"mov rax, rbx"; +"imul rax, rsi"; +"lea r8, [rdx+rax]"; +"mov rax, rsi"; +"mul rcx"; +"lea rcx, [r8+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-128], rax"; +"mov QWORD PTR [rbp-120], rdx"; +"mov QWORD PTR [rbp-128], rax"; +"mov QWORD PTR [rbp-120], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"mov rsi, rax"; +"mov edi, 0"; +"mov rax, QWORD PTR [rbp-728]"; +"add rax, 32"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov rcx, rax"; +"mov ebx, 0"; +"mov rdx, rdi"; +"imul rdx, rcx"; +"mov rax, rbx"; +"imul rax, rsi"; +"lea r8, [rdx+rax]"; +"mov rax, rsi"; +"mul rcx"; +"lea rcx, [r8+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-144], rax"; +"mov QWORD PTR [rbp-136], rdx"; +"mov QWORD PTR [rbp-144], rax"; +"mov QWORD PTR [rbp-136], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"mov rsi, rax"; +"mov edi, 0"; +"mov rax, QWORD PTR [rbp-728]"; +"add rax, 24"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov rcx, rax"; +"mov ebx, 0"; +"mov rdx, rdi"; +"imul rdx, rcx"; +"mov rax, rbx"; +"imul rax, rsi"; +"lea r8, [rdx+rax]"; +"mov rax, rsi"; +"mul rcx"; +"lea rcx, [r8+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-160], rax"; +"mov QWORD PTR [rbp-152], rdx"; +"mov QWORD PTR [rbp-160], rax"; +"mov QWORD PTR [rbp-152], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"mov rsi, rax"; +"mov edi, 0"; +"mov rax, QWORD PTR [rbp-728]"; +"add rax, 32"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov rcx, rax"; +"mov ebx, 0"; +"mov rdx, rdi"; +"imul rdx, rcx"; +"mov rax, rbx"; +"imul rax, rsi"; +"lea r8, [rdx+rax]"; +"mov rax, rsi"; +"mul rcx"; +"lea rcx, [r8+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-176], rax"; +"mov QWORD PTR [rbp-168], rdx"; +"mov QWORD PTR [rbp-176], rax"; +"mov QWORD PTR [rbp-168], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-192], rax"; +"mov QWORD PTR [rbp-184], rdx"; +"mov QWORD PTR [rbp-192], rax"; +"mov QWORD PTR [rbp-184], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"add rcx, 8"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-208], rax"; +"mov QWORD PTR [rbp-200], rdx"; +"mov QWORD PTR [rbp-208], rax"; +"mov QWORD PTR [rbp-200], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-224], rax"; +"mov QWORD PTR [rbp-216], rdx"; +"mov QWORD PTR [rbp-224], rax"; +"mov QWORD PTR [rbp-216], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"add rcx, 16"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-240], rax"; +"mov QWORD PTR [rbp-232], rdx"; +"mov QWORD PTR [rbp-240], rax"; +"mov QWORD PTR [rbp-232], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"add rcx, 8"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-256], rax"; +"mov QWORD PTR [rbp-248], rdx"; +"mov QWORD PTR [rbp-256], rax"; +"mov QWORD PTR [rbp-248], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-272], rax"; +"mov QWORD PTR [rbp-264], rdx"; +"mov QWORD PTR [rbp-272], rax"; +"mov QWORD PTR [rbp-264], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"add rcx, 24"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-288], rax"; +"mov QWORD PTR [rbp-280], rdx"; +"mov QWORD PTR [rbp-288], rax"; +"mov QWORD PTR [rbp-280], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"add rcx, 16"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-304], rax"; +"mov QWORD PTR [rbp-296], rdx"; +"mov QWORD PTR [rbp-304], rax"; +"mov QWORD PTR [rbp-296], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"add rcx, 8"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-320], rax"; +"mov QWORD PTR [rbp-312], rdx"; +"mov QWORD PTR [rbp-320], rax"; +"mov QWORD PTR [rbp-312], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-336], rax"; +"mov QWORD PTR [rbp-328], rdx"; +"mov QWORD PTR [rbp-336], rax"; +"mov QWORD PTR [rbp-328], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"add rcx, 32"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-352], rax"; +"mov QWORD PTR [rbp-344], rdx"; +"mov QWORD PTR [rbp-352], rax"; +"mov QWORD PTR [rbp-344], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"add rcx, 24"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-368], rax"; +"mov QWORD PTR [rbp-360], rdx"; +"mov QWORD PTR [rbp-368], rax"; +"mov QWORD PTR [rbp-360], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"add rcx, 16"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-384], rax"; +"mov QWORD PTR [rbp-376], rdx"; +"mov QWORD PTR [rbp-384], rax"; +"mov QWORD PTR [rbp-376], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"add rcx, 8"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-400], rax"; +"mov QWORD PTR [rbp-392], rdx"; +"mov QWORD PTR [rbp-400], rax"; +"mov QWORD PTR [rbp-392], rdx"; +"mov rax, QWORD PTR [rbp-720]"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-728]"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-416], rax"; +"mov QWORD PTR [rbp-408], rdx"; +"mov QWORD PTR [rbp-416], rax"; +"mov QWORD PTR [rbp-408], rdx"; +"mov rcx, QWORD PTR [rbp-128]"; +"mov rbx, QWORD PTR [rbp-120]"; +"mov rax, QWORD PTR [rbp-80]"; +"mov rdx, QWORD PTR [rbp-72]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-160]"; +"mov rbx, QWORD PTR [rbp-152]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-176]"; +"mov rbx, QWORD PTR [rbp-168]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-416]"; +"mov rbx, QWORD PTR [rbp-408]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-432], rax"; +"mov QWORD PTR [rbp-424], rdx"; +"mov rax, QWORD PTR [rbp-432]"; +"mov rdx, QWORD PTR [rbp-424]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-440], rax"; +"mov rax, QWORD PTR [rbp-432]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-448], rax"; +"mov rcx, QWORD PTR [rbp-208]"; +"mov rbx, QWORD PTR [rbp-200]"; +"mov rax, QWORD PTR [rbp-192]"; +"mov rdx, QWORD PTR [rbp-184]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-240]"; +"mov rbx, QWORD PTR [rbp-232]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-288]"; +"mov rbx, QWORD PTR [rbp-280]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-352]"; +"mov rbx, QWORD PTR [rbp-344]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-464], rax"; +"mov QWORD PTR [rbp-456], rdx"; +"mov rcx, QWORD PTR [rbp-224]"; +"mov rbx, QWORD PTR [rbp-216]"; +"mov rax, QWORD PTR [rbp-32]"; +"mov rdx, QWORD PTR [rbp-24]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-256]"; +"mov rbx, QWORD PTR [rbp-248]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-304]"; +"mov rbx, QWORD PTR [rbp-296]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-368]"; +"mov rbx, QWORD PTR [rbp-360]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-480], rax"; +"mov QWORD PTR [rbp-472], rdx"; +"mov rcx, QWORD PTR [rbp-96]"; +"mov rbx, QWORD PTR [rbp-88]"; +"mov rax, QWORD PTR [rbp-48]"; +"mov rdx, QWORD PTR [rbp-40]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-272]"; +"mov rbx, QWORD PTR [rbp-264]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-320]"; +"mov rbx, QWORD PTR [rbp-312]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-384]"; +"mov rbx, QWORD PTR [rbp-376]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-496], rax"; +"mov QWORD PTR [rbp-488], rdx"; +"mov rcx, QWORD PTR [rbp-112]"; +"mov rbx, QWORD PTR [rbp-104]"; +"mov rax, QWORD PTR [rbp-64]"; +"mov rdx, QWORD PTR [rbp-56]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-144]"; +"mov rbx, QWORD PTR [rbp-136]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-336]"; +"mov rbx, QWORD PTR [rbp-328]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-400]"; +"mov rbx, QWORD PTR [rbp-392]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-512], rax"; +"mov QWORD PTR [rbp-504], rdx"; +"mov rax, QWORD PTR [rbp-440]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-512]"; +"mov rbx, QWORD PTR [rbp-504]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-528], rax"; +"mov QWORD PTR [rbp-520], rdx"; +"mov rax, QWORD PTR [rbp-528]"; +"mov rdx, QWORD PTR [rbp-520]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-536], rax"; +"mov rax, QWORD PTR [rbp-528]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-544], rax"; +"mov rax, QWORD PTR [rbp-536]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-496]"; +"mov rbx, QWORD PTR [rbp-488]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-560], rax"; +"mov QWORD PTR [rbp-552], rdx"; +"mov rax, QWORD PTR [rbp-560]"; +"mov rdx, QWORD PTR [rbp-552]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-568], rax"; +"mov rax, QWORD PTR [rbp-560]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-576], rax"; +"mov rax, QWORD PTR [rbp-568]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-480]"; +"mov rbx, QWORD PTR [rbp-472]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-592], rax"; +"mov QWORD PTR [rbp-584], rdx"; +"mov rax, QWORD PTR [rbp-592]"; +"mov rdx, QWORD PTR [rbp-584]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-600], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-608], rax"; +"mov rax, QWORD PTR [rbp-600]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-464]"; +"mov rbx, QWORD PTR [rbp-456]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-624], rax"; +"mov QWORD PTR [rbp-616], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"mov rdx, QWORD PTR [rbp-616]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-632], rax"; +"mov rax, QWORD PTR [rbp-624]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-640], rax"; +"mov rdx, QWORD PTR [rbp-632]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov QWORD PTR [rbp-648], rax"; +"mov rdx, QWORD PTR [rbp-448]"; +"mov rax, QWORD PTR [rbp-648]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-656], rax"; +"mov rax, QWORD PTR [rbp-656]"; +"shr rax, 51"; +"mov QWORD PTR [rbp-664], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-656]"; +"mov QWORD PTR [rbp-672], rax"; +"mov rdx, QWORD PTR [rbp-664]"; +"mov rax, QWORD PTR [rbp-544]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-680], rax"; +"mov rax, QWORD PTR [rbp-680]"; +"shr rax, 51"; +"mov BYTE PTR [rbp-681], al"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-680]"; +"mov QWORD PTR [rbp-696], rax"; +"movzx edx, BYTE PTR [rbp-681]"; +"mov rax, QWORD PTR [rbp-576]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-704], rax"; +"mov rax, QWORD PTR [rbp-712]"; +"mov rdx, QWORD PTR [rbp-672]"; +"mov QWORD PTR [rax], rdx"; +"mov rax, QWORD PTR [rbp-712]"; +"lea rdx, [rax+8]"; +"mov rax, QWORD PTR [rbp-696]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-712]"; +"lea rdx, [rax+16]"; +"mov rax, QWORD PTR [rbp-704]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-712]"; +"lea rdx, [rax+24]"; +"mov rax, QWORD PTR [rbp-608]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-712]"; +"lea rdx, [rax+32]"; +"mov rax, QWORD PTR [rbp-640]"; +"mov QWORD PTR [rdx], rax"; +"nop"; +"mov rbx, QWORD PTR [rbp-8]"; +"leave"; +"ret"; +"_Z23fiat_25519_carry_squarePmPKm:"; +"push rbp"; +"mov rbp, rsp"; +"push rbx"; +"sub rsp, 496"; +"mov QWORD PTR [rbp-616], rdi"; +"mov QWORD PTR [rbp-624], rsi"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 32"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov QWORD PTR [rbp-24], rax"; +"mov rax, QWORD PTR [rbp-24]"; +"add rax, rax"; +"mov QWORD PTR [rbp-32], rax"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"add rax, rax"; +"mov QWORD PTR [rbp-40], rax"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 24"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov QWORD PTR [rbp-48], rax"; +"mov rax, QWORD PTR [rbp-48]"; +"add rax, rax"; +"mov QWORD PTR [rbp-56], rax"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"add rax, rax"; +"mov QWORD PTR [rbp-64], rax"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"add rax, rax"; +"mov QWORD PTR [rbp-72], rax"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"add rax, rax"; +"mov QWORD PTR [rbp-80], rax"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-24]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-96], rax"; +"mov QWORD PTR [rbp-88], rdx"; +"mov QWORD PTR [rbp-96], rax"; +"mov QWORD PTR [rbp-88], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-32]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-112], rax"; +"mov QWORD PTR [rbp-104], rdx"; +"mov QWORD PTR [rbp-112], rax"; +"mov QWORD PTR [rbp-104], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-48]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-128], rax"; +"mov QWORD PTR [rbp-120], rdx"; +"mov QWORD PTR [rbp-128], rax"; +"mov QWORD PTR [rbp-120], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-32]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-144], rax"; +"mov QWORD PTR [rbp-136], rdx"; +"mov QWORD PTR [rbp-144], rax"; +"mov QWORD PTR [rbp-136], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-56]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-160], rax"; +"mov QWORD PTR [rbp-152], rdx"; +"mov QWORD PTR [rbp-160], rax"; +"mov QWORD PTR [rbp-152], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-624]"; +"add rcx, 16"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-176], rax"; +"mov QWORD PTR [rbp-168], rdx"; +"mov QWORD PTR [rbp-176], rax"; +"mov QWORD PTR [rbp-168], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-32]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-192], rax"; +"mov QWORD PTR [rbp-184], rdx"; +"mov QWORD PTR [rbp-192], rax"; +"mov QWORD PTR [rbp-184], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-64]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-208], rax"; +"mov QWORD PTR [rbp-200], rdx"; +"mov QWORD PTR [rbp-208], rax"; +"mov QWORD PTR [rbp-200], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-72]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-224], rax"; +"mov QWORD PTR [rbp-216], rdx"; +"mov QWORD PTR [rbp-224], rax"; +"mov QWORD PTR [rbp-216], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-624]"; +"add rcx, 8"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-240], rax"; +"mov QWORD PTR [rbp-232], rdx"; +"mov QWORD PTR [rbp-240], rax"; +"mov QWORD PTR [rbp-232], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-40]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-256], rax"; +"mov QWORD PTR [rbp-248], rdx"; +"mov QWORD PTR [rbp-256], rax"; +"mov QWORD PTR [rbp-248], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-64]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-272], rax"; +"mov QWORD PTR [rbp-264], rdx"; +"mov QWORD PTR [rbp-272], rax"; +"mov QWORD PTR [rbp-264], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-72]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-288], rax"; +"mov QWORD PTR [rbp-280], rdx"; +"mov QWORD PTR [rbp-288], rax"; +"mov QWORD PTR [rbp-280], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-80]"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-304], rax"; +"mov QWORD PTR [rbp-296], rdx"; +"mov QWORD PTR [rbp-304], rax"; +"mov QWORD PTR [rbp-296], rdx"; +"mov rax, QWORD PTR [rbp-624]"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-624]"; +"mov rcx, QWORD PTR [rcx]"; +"mov rcx, rcx"; +"mov ebx, 0"; +"mov rdi, rdx"; +"imul rdi, rcx"; +"mov rsi, rbx"; +"imul rsi, rax"; +"add rsi, rdi"; +"mul rcx"; +"lea rcx, [rsi+rdx]"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-320], rax"; +"mov QWORD PTR [rbp-312], rdx"; +"mov QWORD PTR [rbp-320], rax"; +"mov QWORD PTR [rbp-312], rdx"; +"mov rcx, QWORD PTR [rbp-192]"; +"mov rbx, QWORD PTR [rbp-184]"; +"mov rax, QWORD PTR [rbp-160]"; +"mov rdx, QWORD PTR [rbp-152]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-320]"; +"mov rbx, QWORD PTR [rbp-312]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-336], rax"; +"mov QWORD PTR [rbp-328], rdx"; +"mov rax, QWORD PTR [rbp-336]"; +"mov rdx, QWORD PTR [rbp-328]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-344], rax"; +"mov rax, QWORD PTR [rbp-336]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-352], rax"; +"mov rcx, QWORD PTR [rbp-208]"; +"mov rbx, QWORD PTR [rbp-200]"; +"mov rax, QWORD PTR [rbp-176]"; +"mov rdx, QWORD PTR [rbp-168]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-256]"; +"mov rbx, QWORD PTR [rbp-248]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-368], rax"; +"mov QWORD PTR [rbp-360], rdx"; +"mov rcx, QWORD PTR [rbp-224]"; +"mov rbx, QWORD PTR [rbp-216]"; +"mov rax, QWORD PTR [rbp-96]"; +"mov rdx, QWORD PTR [rbp-88]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-272]"; +"mov rbx, QWORD PTR [rbp-264]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-384], rax"; +"mov QWORD PTR [rbp-376], rdx"; +"mov rcx, QWORD PTR [rbp-240]"; +"mov rbx, QWORD PTR [rbp-232]"; +"mov rax, QWORD PTR [rbp-112]"; +"mov rdx, QWORD PTR [rbp-104]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-288]"; +"mov rbx, QWORD PTR [rbp-280]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-400], rax"; +"mov QWORD PTR [rbp-392], rdx"; +"mov rcx, QWORD PTR [rbp-144]"; +"mov rbx, QWORD PTR [rbp-136]"; +"mov rax, QWORD PTR [rbp-128]"; +"mov rdx, QWORD PTR [rbp-120]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, QWORD PTR [rbp-304]"; +"mov rbx, QWORD PTR [rbp-296]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-416], rax"; +"mov QWORD PTR [rbp-408], rdx"; +"mov rax, QWORD PTR [rbp-344]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-416]"; +"mov rbx, QWORD PTR [rbp-408]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-432], rax"; +"mov QWORD PTR [rbp-424], rdx"; +"mov rax, QWORD PTR [rbp-432]"; +"mov rdx, QWORD PTR [rbp-424]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-440], rax"; +"mov rax, QWORD PTR [rbp-432]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-448], rax"; +"mov rax, QWORD PTR [rbp-440]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-400]"; +"mov rbx, QWORD PTR [rbp-392]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-464], rax"; +"mov QWORD PTR [rbp-456], rdx"; +"mov rax, QWORD PTR [rbp-464]"; +"mov rdx, QWORD PTR [rbp-456]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-472], rax"; +"mov rax, QWORD PTR [rbp-464]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-480], rax"; +"mov rax, QWORD PTR [rbp-472]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-384]"; +"mov rbx, QWORD PTR [rbp-376]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-496], rax"; +"mov QWORD PTR [rbp-488], rdx"; +"mov rax, QWORD PTR [rbp-496]"; +"mov rdx, QWORD PTR [rbp-488]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-504], rax"; +"mov rax, QWORD PTR [rbp-496]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-512], rax"; +"mov rax, QWORD PTR [rbp-504]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-368]"; +"mov rbx, QWORD PTR [rbp-360]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-528], rax"; +"mov QWORD PTR [rbp-520], rdx"; +"mov rax, QWORD PTR [rbp-528]"; +"mov rdx, QWORD PTR [rbp-520]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-536], rax"; +"mov rax, QWORD PTR [rbp-528]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-544], rax"; +"mov rdx, QWORD PTR [rbp-536]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov QWORD PTR [rbp-552], rax"; +"mov rdx, QWORD PTR [rbp-352]"; +"mov rax, QWORD PTR [rbp-552]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-560], rax"; +"mov rax, QWORD PTR [rbp-560]"; +"shr rax, 51"; +"mov QWORD PTR [rbp-568], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-560]"; +"mov QWORD PTR [rbp-576], rax"; +"mov rdx, QWORD PTR [rbp-568]"; +"mov rax, QWORD PTR [rbp-448]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-584], rax"; +"mov rax, QWORD PTR [rbp-584]"; +"shr rax, 51"; +"mov BYTE PTR [rbp-585], al"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-584]"; +"mov QWORD PTR [rbp-600], rax"; +"movzx edx, BYTE PTR [rbp-585]"; +"mov rax, QWORD PTR [rbp-480]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-608], rax"; +"mov rax, QWORD PTR [rbp-616]"; +"mov rdx, QWORD PTR [rbp-576]"; +"mov QWORD PTR [rax], rdx"; +"mov rax, QWORD PTR [rbp-616]"; +"lea rdx, [rax+8]"; +"mov rax, QWORD PTR [rbp-600]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-616]"; +"lea rdx, [rax+16]"; +"mov rax, QWORD PTR [rbp-608]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-616]"; +"lea rdx, [rax+24]"; +"mov rax, QWORD PTR [rbp-512]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-616]"; +"lea rdx, [rax+32]"; +"mov rax, QWORD PTR [rbp-544]"; +"mov QWORD PTR [rdx], rax"; +"nop"; +"mov rbx, QWORD PTR [rbp-8]"; +"leave"; +"ret"; +"_Z29fiat_25519_carry_scmul_121666PmPKm:"; +"push rbp"; +"mov rbp, rsp"; +"push rbx"; +"sub rsp, 192"; +"mov QWORD PTR [rbp-312], rdi"; +"mov QWORD PTR [rbp-320], rsi"; +"mov rax, QWORD PTR [rbp-320]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"imul rsi, rdx, 121666"; +"imul rcx, rax, 0"; +"add rcx, rsi"; +"mov esi, 121666"; +"mul rsi"; +"add rcx, rdx"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-32], rax"; +"mov QWORD PTR [rbp-24], rdx"; +"mov QWORD PTR [rbp-32], rax"; +"mov QWORD PTR [rbp-24], rdx"; +"mov rax, QWORD PTR [rbp-320]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"imul rsi, rdx, 121666"; +"imul rcx, rax, 0"; +"add rcx, rsi"; +"mov esi, 121666"; +"mul rsi"; +"add rcx, rdx"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-48], rax"; +"mov QWORD PTR [rbp-40], rdx"; +"mov QWORD PTR [rbp-48], rax"; +"mov QWORD PTR [rbp-40], rdx"; +"mov rax, QWORD PTR [rbp-320]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"imul rsi, rdx, 121666"; +"imul rcx, rax, 0"; +"add rcx, rsi"; +"mov esi, 121666"; +"mul rsi"; +"add rcx, rdx"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-64], rax"; +"mov QWORD PTR [rbp-56], rdx"; +"mov QWORD PTR [rbp-64], rax"; +"mov QWORD PTR [rbp-56], rdx"; +"mov rax, QWORD PTR [rbp-320]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"imul rsi, rdx, 121666"; +"imul rcx, rax, 0"; +"add rcx, rsi"; +"mov esi, 121666"; +"mul rsi"; +"add rcx, rdx"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-80], rax"; +"mov QWORD PTR [rbp-72], rdx"; +"mov QWORD PTR [rbp-80], rax"; +"mov QWORD PTR [rbp-72], rdx"; +"mov rax, QWORD PTR [rbp-320]"; +"mov rax, QWORD PTR [rax]"; +"mov rax, rax"; +"mov edx, 0"; +"imul rsi, rdx, 121666"; +"imul rcx, rax, 0"; +"add rcx, rsi"; +"mov esi, 121666"; +"mul rsi"; +"add rcx, rdx"; +"mov rdx, rcx"; +"mov QWORD PTR [rbp-96], rax"; +"mov QWORD PTR [rbp-88], rdx"; +"mov QWORD PTR [rbp-96], rax"; +"mov QWORD PTR [rbp-88], rdx"; +"mov rax, QWORD PTR [rbp-96]"; +"mov rdx, QWORD PTR [rbp-88]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-104], rax"; +"mov rax, QWORD PTR [rbp-96]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-112], rax"; +"mov rax, QWORD PTR [rbp-104]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-80]"; +"mov rbx, QWORD PTR [rbp-72]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-128], rax"; +"mov QWORD PTR [rbp-120], rdx"; +"mov rax, QWORD PTR [rbp-128]"; +"mov rdx, QWORD PTR [rbp-120]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-136], rax"; +"mov rax, QWORD PTR [rbp-128]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-144], rax"; +"mov rax, QWORD PTR [rbp-136]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-64]"; +"mov rbx, QWORD PTR [rbp-56]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-160], rax"; +"mov QWORD PTR [rbp-152], rdx"; +"mov rax, QWORD PTR [rbp-160]"; +"mov rdx, QWORD PTR [rbp-152]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-168], rax"; +"mov rax, QWORD PTR [rbp-160]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-176], rax"; +"mov rax, QWORD PTR [rbp-168]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-48]"; +"mov rbx, QWORD PTR [rbp-40]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-192], rax"; +"mov QWORD PTR [rbp-184], rdx"; +"mov rax, QWORD PTR [rbp-192]"; +"mov rdx, QWORD PTR [rbp-184]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-200], rax"; +"mov rax, QWORD PTR [rbp-192]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-208], rax"; +"mov rax, QWORD PTR [rbp-200]"; +"mov edx, 0"; +"mov rcx, QWORD PTR [rbp-32]"; +"mov rbx, QWORD PTR [rbp-24]"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov QWORD PTR [rbp-224], rax"; +"mov QWORD PTR [rbp-216], rdx"; +"mov rax, QWORD PTR [rbp-224]"; +"mov rdx, QWORD PTR [rbp-216]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov QWORD PTR [rbp-232], rax"; +"mov rax, QWORD PTR [rbp-224]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov QWORD PTR [rbp-240], rax"; +"mov rdx, QWORD PTR [rbp-232]"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"mov QWORD PTR [rbp-248], rax"; +"mov rdx, QWORD PTR [rbp-112]"; +"mov rax, QWORD PTR [rbp-248]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-256], rax"; +"mov rax, QWORD PTR [rbp-256]"; +"shr rax, 51"; +"mov BYTE PTR [rbp-257], al"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-256]"; +"mov QWORD PTR [rbp-272], rax"; +"movzx edx, BYTE PTR [rbp-257]"; +"mov rax, QWORD PTR [rbp-144]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-280], rax"; +"mov rax, QWORD PTR [rbp-280]"; +"shr rax, 51"; +"mov BYTE PTR [rbp-281], al"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-280]"; +"mov QWORD PTR [rbp-296], rax"; +"movzx edx, BYTE PTR [rbp-281]"; +"mov rax, QWORD PTR [rbp-176]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-304], rax"; +"mov rax, QWORD PTR [rbp-312]"; +"mov rdx, QWORD PTR [rbp-272]"; +"mov QWORD PTR [rax], rdx"; +"mov rax, QWORD PTR [rbp-312]"; +"lea rdx, [rax+8]"; +"mov rax, QWORD PTR [rbp-296]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-312]"; +"lea rdx, [rax+16]"; +"mov rax, QWORD PTR [rbp-304]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-312]"; +"lea rdx, [rax+24]"; +"mov rax, QWORD PTR [rbp-208]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-312]"; +"lea rdx, [rax+32]"; +"mov rax, QWORD PTR [rbp-240]"; +"mov QWORD PTR [rdx], rax"; +"nop"; +"mov rbx, QWORD PTR [rbp-8]"; +"leave"; +"ret"; +"_Z16fiat_25519_carryPmPKm:"; +"push rbp"; +"mov rbp, rsp"; +"mov QWORD PTR [rbp-104], rdi"; +"mov QWORD PTR [rbp-112], rsi"; +"mov rax, QWORD PTR [rbp-112]"; +"mov rax, QWORD PTR [rax]"; +"mov QWORD PTR [rbp-8], rax"; +"mov rax, QWORD PTR [rbp-8]"; +"shr rax, 51"; +"mov rdx, rax"; +"mov rax, QWORD PTR [rbp-112]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-16], rax"; +"mov rax, QWORD PTR [rbp-16]"; +"shr rax, 51"; +"mov rdx, rax"; +"mov rax, QWORD PTR [rbp-112]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-24], rax"; +"mov rax, QWORD PTR [rbp-24]"; +"shr rax, 51"; +"mov rdx, rax"; +"mov rax, QWORD PTR [rbp-112]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-32], rax"; +"mov rax, QWORD PTR [rbp-32]"; +"shr rax, 51"; +"mov rdx, rax"; +"mov rax, QWORD PTR [rbp-112]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-40], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-8]"; +"mov rcx, rax"; +"mov rax, QWORD PTR [rbp-40]"; +"shr rax, 51"; +"mov rdx, rax"; +"mov rax, rdx"; +"sal rax, 3"; +"add rax, rdx"; +"add rax, rax"; +"add rax, rdx"; +"add rax, rcx"; +"mov QWORD PTR [rbp-48], rax"; +"mov rax, QWORD PTR [rbp-48]"; +"shr rax, 51"; +"movzx edx, al"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-16]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-56], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-48]"; +"mov QWORD PTR [rbp-64], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-56]"; +"mov QWORD PTR [rbp-72], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"shr rax, 51"; +"movzx edx, al"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-24]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-80], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-32]"; +"mov QWORD PTR [rbp-88], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-40]"; +"mov QWORD PTR [rbp-96], rax"; +"mov rax, QWORD PTR [rbp-104]"; +"mov rdx, QWORD PTR [rbp-64]"; +"mov QWORD PTR [rax], rdx"; +"mov rax, QWORD PTR [rbp-104]"; +"lea rdx, [rax+8]"; +"mov rax, QWORD PTR [rbp-72]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-104]"; +"lea rdx, [rax+16]"; +"mov rax, QWORD PTR [rbp-80]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-104]"; +"lea rdx, [rax+24]"; +"mov rax, QWORD PTR [rbp-88]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-104]"; +"lea rdx, [rax+32]"; +"mov rax, QWORD PTR [rbp-96]"; +"mov QWORD PTR [rdx], rax"; +"nop"; +"pop rbp"; +"ret"; +"_Z14fiat_25519_addPmPKmS1_:"; +"push rbp"; +"mov rbp, rsp"; +"mov QWORD PTR [rbp-56], rdi"; +"mov QWORD PTR [rbp-64], rsi"; +"mov QWORD PTR [rbp-72], rdx"; +"mov rax, QWORD PTR [rbp-64]"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"mov rax, QWORD PTR [rax]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-8], rax"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 8"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-16], rax"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 16"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-24], rax"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 24"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-32], rax"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 32"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-40], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"mov rdx, QWORD PTR [rbp-8]"; +"mov QWORD PTR [rax], rdx"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+8]"; +"mov rax, QWORD PTR [rbp-16]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+16]"; +"mov rax, QWORD PTR [rbp-24]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+24]"; +"mov rax, QWORD PTR [rbp-32]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+32]"; +"mov rax, QWORD PTR [rbp-40]"; +"mov QWORD PTR [rdx], rax"; +"nop"; +"pop rbp"; +"ret"; +"_Z14fiat_25519_subPmPKmS1_:"; +"push rbp"; +"mov rbp, rsp"; +"mov QWORD PTR [rbp-56], rdi"; +"mov QWORD PTR [rbp-64], rsi"; +"mov QWORD PTR [rbp-72], rdx"; +"mov rax, QWORD PTR [rbp-64]"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"mov rax, QWORD PTR [rax]"; +"sub rdx, rax"; +"movabs rax, 4503599627370458"; +"add rax, rdx"; +"mov QWORD PTR [rbp-8], rax"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 8"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"sub rdx, rax"; +"movabs rax, 4503599627370494"; +"add rax, rdx"; +"mov QWORD PTR [rbp-16], rax"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 16"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"sub rdx, rax"; +"movabs rax, 4503599627370494"; +"add rax, rdx"; +"mov QWORD PTR [rbp-24], rax"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 24"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"sub rdx, rax"; +"movabs rax, 4503599627370494"; +"add rax, rdx"; +"mov QWORD PTR [rbp-32], rax"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 32"; +"mov rdx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"sub rdx, rax"; +"movabs rax, 4503599627370494"; +"add rax, rdx"; +"mov QWORD PTR [rbp-40], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"mov rdx, QWORD PTR [rbp-8]"; +"mov QWORD PTR [rax], rdx"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+8]"; +"mov rax, QWORD PTR [rbp-16]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+16]"; +"mov rax, QWORD PTR [rbp-24]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+24]"; +"mov rax, QWORD PTR [rbp-32]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+32]"; +"mov rax, QWORD PTR [rbp-40]"; +"mov QWORD PTR [rdx], rax"; +"nop"; +"pop rbp"; +"ret"; +"_Z14fiat_25519_oppPmPKm:"; +"push rbp"; +"mov rbp, rsp"; +"mov QWORD PTR [rbp-56], rdi"; +"mov QWORD PTR [rbp-64], rsi"; +"mov rax, QWORD PTR [rbp-64]"; +"mov rax, QWORD PTR [rax]"; +"movabs rdx, 4503599627370458"; +"sub rdx, rax"; +"mov QWORD PTR [rbp-8], rdx"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 8"; +"mov rax, QWORD PTR [rax]"; +"movabs rdx, 4503599627370494"; +"sub rdx, rax"; +"mov QWORD PTR [rbp-16], rdx"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 16"; +"mov rax, QWORD PTR [rax]"; +"movabs rdx, 4503599627370494"; +"sub rdx, rax"; +"mov QWORD PTR [rbp-24], rdx"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 24"; +"mov rax, QWORD PTR [rax]"; +"movabs rdx, 4503599627370494"; +"sub rdx, rax"; +"mov QWORD PTR [rbp-32], rdx"; +"mov rax, QWORD PTR [rbp-64]"; +"add rax, 32"; +"mov rax, QWORD PTR [rax]"; +"movabs rdx, 4503599627370494"; +"sub rdx, rax"; +"mov QWORD PTR [rbp-40], rdx"; +"mov rax, QWORD PTR [rbp-56]"; +"mov rdx, QWORD PTR [rbp-8]"; +"mov QWORD PTR [rax], rdx"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+8]"; +"mov rax, QWORD PTR [rbp-16]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+16]"; +"mov rax, QWORD PTR [rbp-24]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+24]"; +"mov rax, QWORD PTR [rbp-32]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+32]"; +"mov rax, QWORD PTR [rbp-40]"; +"mov QWORD PTR [rdx], rax"; +"nop"; +"pop rbp"; +"ret"; +"_Z20fiat_25519_selectznzPmhPKmS1_:"; +"push rbp"; +"mov rbp, rsp"; +"sub rsp, 80"; +"mov QWORD PTR [rbp-56], rdi"; +"mov eax, esi"; +"mov QWORD PTR [rbp-72], rdx"; +"mov QWORD PTR [rbp-80], rcx"; +"mov BYTE PTR [rbp-60], al"; +"mov rax, QWORD PTR [rbp-80]"; +"mov rcx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"mov rdx, QWORD PTR [rax]"; +"movzx esi, BYTE PTR [rbp-60]"; +"lea rax, [rbp-8]"; +"mov rdi, rax"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov rax, QWORD PTR [rbp-80]"; +"add rax, 8"; +"mov rcx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 8"; +"mov rdx, QWORD PTR [rax]"; +"movzx esi, BYTE PTR [rbp-60]"; +"lea rax, [rbp-16]"; +"mov rdi, rax"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov rax, QWORD PTR [rbp-80]"; +"add rax, 16"; +"mov rcx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 16"; +"mov rdx, QWORD PTR [rax]"; +"movzx esi, BYTE PTR [rbp-60]"; +"lea rax, [rbp-24]"; +"mov rdi, rax"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov rax, QWORD PTR [rbp-80]"; +"add rax, 24"; +"mov rcx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 24"; +"mov rdx, QWORD PTR [rax]"; +"movzx esi, BYTE PTR [rbp-60]"; +"lea rax, [rbp-32]"; +"mov rdi, rax"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov rax, QWORD PTR [rbp-80]"; +"add rax, 32"; +"mov rcx, QWORD PTR [rax]"; +"mov rax, QWORD PTR [rbp-72]"; +"add rax, 32"; +"mov rdx, QWORD PTR [rax]"; +"movzx esi, BYTE PTR [rbp-60]"; +"lea rax, [rbp-40]"; +"mov rdi, rax"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov rdx, QWORD PTR [rbp-8]"; +"mov rax, QWORD PTR [rbp-56]"; +"mov QWORD PTR [rax], rdx"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+8]"; +"mov rax, QWORD PTR [rbp-16]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+16]"; +"mov rax, QWORD PTR [rbp-24]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+24]"; +"mov rax, QWORD PTR [rbp-32]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-56]"; +"lea rdx, [rax+32]"; +"mov rax, QWORD PTR [rbp-40]"; +"mov QWORD PTR [rdx], rax"; +"nop"; +"leave"; +"ret"; +"_Z19fiat_25519_to_bytesPhPKm:"; +"push rbp"; +"mov rbp, rsp"; +"sub rsp, 704"; +"mov QWORD PTR [rbp-696], rdi"; +"mov QWORD PTR [rbp-704], rsi"; +"mov rax, QWORD PTR [rbp-704]"; +"mov rdx, QWORD PTR [rax]"; +"lea rsi, [rbp-529]"; +"lea rax, [rbp-528]"; +"movabs r8, 2251799813685229"; +"mov rcx, rdx"; +"mov edx, 0"; +"mov rdi, rax"; +"call _Z25fiat_25519_subborrowx_u51PmPhhmm"; +"mov rax, QWORD PTR [rbp-704]"; +"add rax, 8"; +"mov rcx, QWORD PTR [rax]"; +"movzx eax, BYTE PTR [rbp-529]"; +"movzx edx, al"; +"lea rsi, [rbp-545]"; +"lea rax, [rbp-544]"; +"movabs r8, 2251799813685247"; +"mov rdi, rax"; +"call _Z25fiat_25519_subborrowx_u51PmPhhmm"; +"mov rax, QWORD PTR [rbp-704]"; +"add rax, 16"; +"mov rcx, QWORD PTR [rax]"; +"movzx eax, BYTE PTR [rbp-545]"; +"movzx edx, al"; +"lea rsi, [rbp-561]"; +"lea rax, [rbp-560]"; +"movabs r8, 2251799813685247"; +"mov rdi, rax"; +"call _Z25fiat_25519_subborrowx_u51PmPhhmm"; +"mov rax, QWORD PTR [rbp-704]"; +"add rax, 24"; +"mov rcx, QWORD PTR [rax]"; +"movzx eax, BYTE PTR [rbp-561]"; +"movzx edx, al"; +"lea rsi, [rbp-577]"; +"lea rax, [rbp-576]"; +"movabs r8, 2251799813685247"; +"mov rdi, rax"; +"call _Z25fiat_25519_subborrowx_u51PmPhhmm"; +"mov rax, QWORD PTR [rbp-704]"; +"add rax, 32"; +"mov rcx, QWORD PTR [rax]"; +"movzx eax, BYTE PTR [rbp-577]"; +"movzx edx, al"; +"lea rsi, [rbp-593]"; +"lea rax, [rbp-592]"; +"movabs r8, 2251799813685247"; +"mov rdi, rax"; +"call _Z25fiat_25519_subborrowx_u51PmPhhmm"; +"movzx eax, BYTE PTR [rbp-593]"; +"movzx esi, al"; +"lea rax, [rbp-608]"; +"mov rcx, -1"; +"mov edx, 0"; +"mov rdi, rax"; +"call _Z22fiat_25519_cmovznz_u64Pmhmm"; +"mov rax, QWORD PTR [rbp-608]"; +"movabs rdx, 2251799813685229"; +"and rax, rdx"; +"mov rcx, rax"; +"mov rdx, QWORD PTR [rbp-528]"; +"lea rsi, [rbp-617]"; +"lea rax, [rbp-616]"; +"mov r8, rcx"; +"mov rcx, rdx"; +"mov edx, 0"; +"mov rdi, rax"; +"call _Z24fiat_25519_addcarryx_u51PmPhhmm"; +"mov rax, QWORD PTR [rbp-608]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov rdi, rax"; +"mov rcx, QWORD PTR [rbp-544]"; +"movzx eax, BYTE PTR [rbp-617]"; +"movzx edx, al"; +"lea rsi, [rbp-633]"; +"lea rax, [rbp-632]"; +"mov r8, rdi"; +"mov rdi, rax"; +"call _Z24fiat_25519_addcarryx_u51PmPhhmm"; +"mov rax, QWORD PTR [rbp-608]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov rdi, rax"; +"mov rcx, QWORD PTR [rbp-560]"; +"movzx eax, BYTE PTR [rbp-633]"; +"movzx edx, al"; +"lea rsi, [rbp-649]"; +"lea rax, [rbp-648]"; +"mov r8, rdi"; +"mov rdi, rax"; +"call _Z24fiat_25519_addcarryx_u51PmPhhmm"; +"mov rax, QWORD PTR [rbp-608]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov rdi, rax"; +"mov rcx, QWORD PTR [rbp-576]"; +"movzx eax, BYTE PTR [rbp-649]"; +"movzx edx, al"; +"lea rsi, [rbp-665]"; +"lea rax, [rbp-664]"; +"mov r8, rdi"; +"mov rdi, rax"; +"call _Z24fiat_25519_addcarryx_u51PmPhhmm"; +"mov rax, QWORD PTR [rbp-608]"; +"movabs rdx, 2251799813685247"; +"and rax, rdx"; +"mov rdi, rax"; +"mov rcx, QWORD PTR [rbp-592]"; +"movzx eax, BYTE PTR [rbp-665]"; +"movzx edx, al"; +"lea rsi, [rbp-681]"; +"lea rax, [rbp-680]"; +"mov r8, rdi"; +"mov rdi, rax"; +"call _Z24fiat_25519_addcarryx_u51PmPhhmm"; +"mov rax, QWORD PTR [rbp-680]"; +"sal rax, 4"; +"mov QWORD PTR [rbp-8], rax"; +"mov rax, QWORD PTR [rbp-664]"; +"add rax, rax"; +"mov QWORD PTR [rbp-16], rax"; +"mov rax, QWORD PTR [rbp-648]"; +"sal rax, 6"; +"mov QWORD PTR [rbp-24], rax"; +"mov rax, QWORD PTR [rbp-632]"; +"sal rax, 3"; +"mov QWORD PTR [rbp-32], rax"; +"mov rax, QWORD PTR [rbp-616]"; +"mov BYTE PTR [rbp-33], al"; +"mov rax, QWORD PTR [rbp-616]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-48], rax"; +"mov rax, QWORD PTR [rbp-48]"; +"mov BYTE PTR [rbp-49], al"; +"mov rax, QWORD PTR [rbp-48]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-64], rax"; +"mov rax, QWORD PTR [rbp-64]"; +"mov BYTE PTR [rbp-65], al"; +"mov rax, QWORD PTR [rbp-64]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-80], rax"; +"mov rax, QWORD PTR [rbp-80]"; +"mov BYTE PTR [rbp-81], al"; +"mov rax, QWORD PTR [rbp-80]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-96], rax"; +"mov rax, QWORD PTR [rbp-96]"; +"mov BYTE PTR [rbp-97], al"; +"mov rax, QWORD PTR [rbp-96]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-112], rax"; +"mov rax, QWORD PTR [rbp-112]"; +"mov BYTE PTR [rbp-113], al"; +"mov rax, QWORD PTR [rbp-112]"; +"shr rax, 8"; +"mov BYTE PTR [rbp-114], al"; +"movzx edx, BYTE PTR [rbp-114]"; +"mov rax, QWORD PTR [rbp-32]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-128], rax"; +"mov rax, QWORD PTR [rbp-128]"; +"mov BYTE PTR [rbp-129], al"; +"mov rax, QWORD PTR [rbp-128]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-144], rax"; +"mov rax, QWORD PTR [rbp-144]"; +"mov BYTE PTR [rbp-145], al"; +"mov rax, QWORD PTR [rbp-144]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-160], rax"; +"mov rax, QWORD PTR [rbp-160]"; +"mov BYTE PTR [rbp-161], al"; +"mov rax, QWORD PTR [rbp-160]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-176], rax"; +"mov rax, QWORD PTR [rbp-176]"; +"mov BYTE PTR [rbp-177], al"; +"mov rax, QWORD PTR [rbp-176]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-192], rax"; +"mov rax, QWORD PTR [rbp-192]"; +"mov BYTE PTR [rbp-193], al"; +"mov rax, QWORD PTR [rbp-192]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-208], rax"; +"mov rax, QWORD PTR [rbp-208]"; +"mov BYTE PTR [rbp-209], al"; +"mov rax, QWORD PTR [rbp-208]"; +"shr rax, 8"; +"mov BYTE PTR [rbp-210], al"; +"movzx edx, BYTE PTR [rbp-210]"; +"mov rax, QWORD PTR [rbp-24]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-224], rax"; +"mov rax, QWORD PTR [rbp-224]"; +"mov BYTE PTR [rbp-225], al"; +"mov rax, QWORD PTR [rbp-224]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-240], rax"; +"mov rax, QWORD PTR [rbp-240]"; +"mov BYTE PTR [rbp-241], al"; +"mov rax, QWORD PTR [rbp-240]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-256], rax"; +"mov rax, QWORD PTR [rbp-256]"; +"mov BYTE PTR [rbp-257], al"; +"mov rax, QWORD PTR [rbp-256]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-272], rax"; +"mov rax, QWORD PTR [rbp-272]"; +"mov BYTE PTR [rbp-273], al"; +"mov rax, QWORD PTR [rbp-272]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-288], rax"; +"mov rax, QWORD PTR [rbp-288]"; +"mov BYTE PTR [rbp-289], al"; +"mov rax, QWORD PTR [rbp-288]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-304], rax"; +"mov rax, QWORD PTR [rbp-304]"; +"mov BYTE PTR [rbp-305], al"; +"mov rax, QWORD PTR [rbp-304]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-320], rax"; +"mov rax, QWORD PTR [rbp-320]"; +"mov BYTE PTR [rbp-321], al"; +"mov rax, QWORD PTR [rbp-320]"; +"shr rax, 8"; +"mov BYTE PTR [rbp-322], al"; +"movzx edx, BYTE PTR [rbp-322]"; +"mov rax, QWORD PTR [rbp-16]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-336], rax"; +"mov rax, QWORD PTR [rbp-336]"; +"mov BYTE PTR [rbp-337], al"; +"mov rax, QWORD PTR [rbp-336]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-352], rax"; +"mov rax, QWORD PTR [rbp-352]"; +"mov BYTE PTR [rbp-353], al"; +"mov rax, QWORD PTR [rbp-352]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-368], rax"; +"mov rax, QWORD PTR [rbp-368]"; +"mov BYTE PTR [rbp-369], al"; +"mov rax, QWORD PTR [rbp-368]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-384], rax"; +"mov rax, QWORD PTR [rbp-384]"; +"mov BYTE PTR [rbp-385], al"; +"mov rax, QWORD PTR [rbp-384]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-400], rax"; +"mov rax, QWORD PTR [rbp-400]"; +"mov BYTE PTR [rbp-401], al"; +"mov rax, QWORD PTR [rbp-400]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-416], rax"; +"mov rax, QWORD PTR [rbp-416]"; +"mov BYTE PTR [rbp-417], al"; +"mov rax, QWORD PTR [rbp-416]"; +"shr rax, 8"; +"mov BYTE PTR [rbp-418], al"; +"movzx edx, BYTE PTR [rbp-418]"; +"mov rax, QWORD PTR [rbp-8]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-432], rax"; +"mov rax, QWORD PTR [rbp-432]"; +"mov BYTE PTR [rbp-433], al"; +"mov rax, QWORD PTR [rbp-432]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-448], rax"; +"mov rax, QWORD PTR [rbp-448]"; +"mov BYTE PTR [rbp-449], al"; +"mov rax, QWORD PTR [rbp-448]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-464], rax"; +"mov rax, QWORD PTR [rbp-464]"; +"mov BYTE PTR [rbp-465], al"; +"mov rax, QWORD PTR [rbp-464]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-480], rax"; +"mov rax, QWORD PTR [rbp-480]"; +"mov BYTE PTR [rbp-481], al"; +"mov rax, QWORD PTR [rbp-480]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-496], rax"; +"mov rax, QWORD PTR [rbp-496]"; +"mov BYTE PTR [rbp-497], al"; +"mov rax, QWORD PTR [rbp-496]"; +"shr rax, 8"; +"mov QWORD PTR [rbp-512], rax"; +"mov rax, QWORD PTR [rbp-512]"; +"mov BYTE PTR [rbp-513], al"; +"mov rax, QWORD PTR [rbp-512]"; +"shr rax, 8"; +"mov BYTE PTR [rbp-514], al"; +"mov rax, QWORD PTR [rbp-696]"; +"movzx edx, BYTE PTR [rbp-33]"; +"mov BYTE PTR [rax], dl"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+1]"; +"movzx eax, BYTE PTR [rbp-49]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+2]"; +"movzx eax, BYTE PTR [rbp-65]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+3]"; +"movzx eax, BYTE PTR [rbp-81]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+4]"; +"movzx eax, BYTE PTR [rbp-97]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+5]"; +"movzx eax, BYTE PTR [rbp-113]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+6]"; +"movzx eax, BYTE PTR [rbp-129]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+7]"; +"movzx eax, BYTE PTR [rbp-145]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+8]"; +"movzx eax, BYTE PTR [rbp-161]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+9]"; +"movzx eax, BYTE PTR [rbp-177]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+10]"; +"movzx eax, BYTE PTR [rbp-193]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+11]"; +"movzx eax, BYTE PTR [rbp-209]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+12]"; +"movzx eax, BYTE PTR [rbp-225]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+13]"; +"movzx eax, BYTE PTR [rbp-241]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+14]"; +"movzx eax, BYTE PTR [rbp-257]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+15]"; +"movzx eax, BYTE PTR [rbp-273]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+16]"; +"movzx eax, BYTE PTR [rbp-289]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+17]"; +"movzx eax, BYTE PTR [rbp-305]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+18]"; +"movzx eax, BYTE PTR [rbp-321]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+19]"; +"movzx eax, BYTE PTR [rbp-337]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+20]"; +"movzx eax, BYTE PTR [rbp-353]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+21]"; +"movzx eax, BYTE PTR [rbp-369]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+22]"; +"movzx eax, BYTE PTR [rbp-385]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+23]"; +"movzx eax, BYTE PTR [rbp-401]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+24]"; +"movzx eax, BYTE PTR [rbp-417]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+25]"; +"movzx eax, BYTE PTR [rbp-433]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+26]"; +"movzx eax, BYTE PTR [rbp-449]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+27]"; +"movzx eax, BYTE PTR [rbp-465]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+28]"; +"movzx eax, BYTE PTR [rbp-481]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+29]"; +"movzx eax, BYTE PTR [rbp-497]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+30]"; +"movzx eax, BYTE PTR [rbp-513]"; +"mov BYTE PTR [rdx], al"; +"mov rax, QWORD PTR [rbp-696]"; +"lea rdx, [rax+31]"; +"movzx eax, BYTE PTR [rbp-514]"; +"mov BYTE PTR [rdx], al"; +"nop"; +"leave"; +"ret"; +"_Z21fiat_25519_from_bytesPmPKh:"; +"push rbp"; +"mov rbp, rsp"; +"sub rsp, 472"; +"mov QWORD PTR [rbp-584], rdi"; +"mov QWORD PTR [rbp-592], rsi"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 31"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 44"; +"mov QWORD PTR [rbp-8], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 30"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 36"; +"mov QWORD PTR [rbp-16], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 29"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 28"; +"mov QWORD PTR [rbp-24], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 28"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 20"; +"mov QWORD PTR [rbp-32], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 27"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 12"; +"mov QWORD PTR [rbp-40], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 26"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 4"; +"mov QWORD PTR [rbp-48], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 25"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 47"; +"mov QWORD PTR [rbp-56], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 24"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 39"; +"mov QWORD PTR [rbp-64], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 23"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 31"; +"mov QWORD PTR [rbp-72], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 22"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 23"; +"mov QWORD PTR [rbp-80], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 21"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 15"; +"mov QWORD PTR [rbp-88], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 20"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 7"; +"mov QWORD PTR [rbp-96], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 19"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 50"; +"mov QWORD PTR [rbp-104], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 18"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 42"; +"mov QWORD PTR [rbp-112], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 17"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 34"; +"mov QWORD PTR [rbp-120], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 16"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 26"; +"mov QWORD PTR [rbp-128], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 15"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 18"; +"mov QWORD PTR [rbp-136], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 14"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 10"; +"mov QWORD PTR [rbp-144], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 13"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 2"; +"mov QWORD PTR [rbp-152], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 12"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 45"; +"mov QWORD PTR [rbp-160], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 11"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 37"; +"mov QWORD PTR [rbp-168], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 10"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 29"; +"mov QWORD PTR [rbp-176], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 9"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 21"; +"mov QWORD PTR [rbp-184], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 8"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 13"; +"mov QWORD PTR [rbp-192], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 7"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 5"; +"mov QWORD PTR [rbp-200], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 6"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 48"; +"mov QWORD PTR [rbp-208], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 5"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 40"; +"mov QWORD PTR [rbp-216], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 4"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 32"; +"mov QWORD PTR [rbp-224], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 3"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 24"; +"mov QWORD PTR [rbp-232], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 2"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 16"; +"mov QWORD PTR [rbp-240], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"add rax, 1"; +"movzx eax, BYTE PTR [rax]"; +"movzx eax, al"; +"sal rax, 8"; +"mov QWORD PTR [rbp-248], rax"; +"mov rax, QWORD PTR [rbp-592]"; +"movzx eax, BYTE PTR [rax]"; +"mov BYTE PTR [rbp-249], al"; +"movzx edx, BYTE PTR [rbp-249]"; +"mov rax, QWORD PTR [rbp-248]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-264], rax"; +"mov rdx, QWORD PTR [rbp-240]"; +"mov rax, QWORD PTR [rbp-264]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-272], rax"; +"mov rdx, QWORD PTR [rbp-232]"; +"mov rax, QWORD PTR [rbp-272]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-280], rax"; +"mov rdx, QWORD PTR [rbp-224]"; +"mov rax, QWORD PTR [rbp-280]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-288], rax"; +"mov rdx, QWORD PTR [rbp-216]"; +"mov rax, QWORD PTR [rbp-288]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-296], rax"; +"mov rdx, QWORD PTR [rbp-208]"; +"mov rax, QWORD PTR [rbp-296]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-304], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-304]"; +"mov QWORD PTR [rbp-312], rax"; +"mov rax, QWORD PTR [rbp-304]"; +"shr rax, 51"; +"mov BYTE PTR [rbp-313], al"; +"movzx edx, BYTE PTR [rbp-313]"; +"mov rax, QWORD PTR [rbp-200]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-328], rax"; +"mov rdx, QWORD PTR [rbp-192]"; +"mov rax, QWORD PTR [rbp-328]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-336], rax"; +"mov rdx, QWORD PTR [rbp-184]"; +"mov rax, QWORD PTR [rbp-336]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-344], rax"; +"mov rdx, QWORD PTR [rbp-176]"; +"mov rax, QWORD PTR [rbp-344]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-352], rax"; +"mov rdx, QWORD PTR [rbp-168]"; +"mov rax, QWORD PTR [rbp-352]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-360], rax"; +"mov rdx, QWORD PTR [rbp-160]"; +"mov rax, QWORD PTR [rbp-360]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-368], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-368]"; +"mov QWORD PTR [rbp-376], rax"; +"mov rax, QWORD PTR [rbp-368]"; +"shr rax, 51"; +"mov BYTE PTR [rbp-377], al"; +"movzx edx, BYTE PTR [rbp-377]"; +"mov rax, QWORD PTR [rbp-152]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-392], rax"; +"mov rdx, QWORD PTR [rbp-144]"; +"mov rax, QWORD PTR [rbp-392]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-400], rax"; +"mov rdx, QWORD PTR [rbp-136]"; +"mov rax, QWORD PTR [rbp-400]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-408], rax"; +"mov rdx, QWORD PTR [rbp-128]"; +"mov rax, QWORD PTR [rbp-408]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-416], rax"; +"mov rdx, QWORD PTR [rbp-120]"; +"mov rax, QWORD PTR [rbp-416]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-424], rax"; +"mov rdx, QWORD PTR [rbp-112]"; +"mov rax, QWORD PTR [rbp-424]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-432], rax"; +"mov rdx, QWORD PTR [rbp-104]"; +"mov rax, QWORD PTR [rbp-432]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-440], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-440]"; +"mov QWORD PTR [rbp-448], rax"; +"mov rax, QWORD PTR [rbp-440]"; +"shr rax, 51"; +"mov BYTE PTR [rbp-449], al"; +"movzx edx, BYTE PTR [rbp-449]"; +"mov rax, QWORD PTR [rbp-96]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-464], rax"; +"mov rdx, QWORD PTR [rbp-88]"; +"mov rax, QWORD PTR [rbp-464]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-472], rax"; +"mov rdx, QWORD PTR [rbp-80]"; +"mov rax, QWORD PTR [rbp-472]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-480], rax"; +"mov rdx, QWORD PTR [rbp-72]"; +"mov rax, QWORD PTR [rbp-480]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-488], rax"; +"mov rdx, QWORD PTR [rbp-64]"; +"mov rax, QWORD PTR [rbp-488]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-496], rax"; +"mov rdx, QWORD PTR [rbp-56]"; +"mov rax, QWORD PTR [rbp-496]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-504], rax"; +"movabs rax, 2251799813685247"; +"and rax, QWORD PTR [rbp-504]"; +"mov QWORD PTR [rbp-512], rax"; +"mov rax, QWORD PTR [rbp-504]"; +"shr rax, 51"; +"mov BYTE PTR [rbp-513], al"; +"movzx edx, BYTE PTR [rbp-513]"; +"mov rax, QWORD PTR [rbp-48]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-528], rax"; +"mov rdx, QWORD PTR [rbp-40]"; +"mov rax, QWORD PTR [rbp-528]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-536], rax"; +"mov rdx, QWORD PTR [rbp-32]"; +"mov rax, QWORD PTR [rbp-536]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-544], rax"; +"mov rdx, QWORD PTR [rbp-24]"; +"mov rax, QWORD PTR [rbp-544]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-552], rax"; +"mov rdx, QWORD PTR [rbp-16]"; +"mov rax, QWORD PTR [rbp-552]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-560], rax"; +"mov rdx, QWORD PTR [rbp-8]"; +"mov rax, QWORD PTR [rbp-560]"; +"add rax, rdx"; +"mov QWORD PTR [rbp-568], rax"; +"mov rax, QWORD PTR [rbp-584]"; +"mov rdx, QWORD PTR [rbp-312]"; +"mov QWORD PTR [rax], rdx"; +"mov rax, QWORD PTR [rbp-584]"; +"lea rdx, [rax+8]"; +"mov rax, QWORD PTR [rbp-376]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-584]"; +"lea rdx, [rax+16]"; +"mov rax, QWORD PTR [rbp-448]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-584]"; +"lea rdx, [rax+24]"; +"mov rax, QWORD PTR [rbp-512]"; +"mov QWORD PTR [rdx], rax"; +"mov rax, QWORD PTR [rbp-584]"; +"lea rdx, [rax+32]"; +"mov rax, QWORD PTR [rbp-568]"; +"mov QWORD PTR [rdx], rax"; +"nop"; +"leave"; +""]. diff --git a/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O1.v b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O1.v new file mode 100644 index 0000000000..73941604ee --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O1.v @@ -0,0 +1,927 @@ +From Coq Require Import String List. +Import ListNotations. +Local Open Scope string_scope. +Local Open Scope list_scope. +Example example : list string := [ +"_Z24fiat_25519_addcarryx_u51PmPhhmm:"; +"add rcx, r8"; +"movzx edx, dl"; +"add rcx, rdx"; +"movabs rax, 2251799813685247"; +"and rax, rcx"; +"mov QWORD PTR [rdi], rax"; +"shr rcx, 51"; +"mov BYTE PTR [rsi], cl"; +"ret"; +"_Z25fiat_25519_subborrowx_u51PmPhhmm:"; +"movzx edx, dl"; +"sub rcx, rdx"; +"sub rcx, r8"; +"movabs rax, 2251799813685247"; +"and rax, rcx"; +"mov QWORD PTR [rdi], rax"; +"sar rcx, 51"; +"neg ecx"; +"mov BYTE PTR [rsi], cl"; +"ret"; +"_Z22fiat_25519_cmovznz_u64Pmhmm:"; +"cmp sil, 1"; +"sbb rax, rax"; +"and rax, rdx"; +"test sil, sil"; +"mov edx, 0"; +"cmove rcx, rdx"; +"or rax, rcx"; +"mov QWORD PTR [rdi], rax"; +"ret"; +"_Z20fiat_25519_carry_mulPmPKmS1_:"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbp"; +"push rbx"; +"mov r14, rdi"; +"mov rcx, rsi"; +"mov rax, rdx"; +"mov rbx, QWORD PTR [rsi+32]"; +"mov esi, 0"; +"mov QWORD PTR [rsp-104], rbx"; +"mov QWORD PTR [rsp-96], rsi"; +"mov r15, QWORD PTR [rdx+32]"; +"lea rdx, [r15+r15*8]"; +"lea rdi, [r15+rdx*2]"; +"mov rbp, QWORD PTR [rax+24]"; +"lea rdx, [rbp+0+rbp*8]"; +"lea r8, [rbp+0+rdx*2]"; +"mov rbx, QWORD PTR [rax+16]"; +"lea rdx, [rbx+rbx*8]"; +"lea r9, [rbx+rdx*2]"; +"mov rsi, QWORD PTR [rax+8]"; +"mov r11, QWORD PTR [rcx+24]"; +"mov r12d, 0"; +"mov QWORD PTR [rsp-56], r11"; +"mov QWORD PTR [rsp-48], r12"; +"mov r11, QWORD PTR [rcx+16]"; +"mov r12d, 0"; +"mov QWORD PTR [rsp-72], r11"; +"mov QWORD PTR [rsp-64], r12"; +"mov r11, QWORD PTR [rcx+8]"; +"mov r12d, 0"; +"mov QWORD PTR [rsp-88], r11"; +"mov QWORD PTR [rsp-80], r12"; +"mov r12, QWORD PTR [rax]"; +"mov r13d, 0"; +"mov QWORD PTR [rsp-120], r12"; +"mov QWORD PTR [rsp-112], r13"; +"lea rax, [rsi+rsi*8]"; +"lea rax, [rsi+rax*2]"; +"mul QWORD PTR [rcx+32]"; +"mov r12, rax"; +"mov r13, rdx"; +"mov rax, r9"; +"mul QWORD PTR [rcx+24]"; +"mov r10, r12"; +"mov r11, r13"; +"add r10, rax"; +"adc r11, rdx"; +"mov rax, r8"; +"mul QWORD PTR [rcx+16]"; +"add r10, rax"; +"adc r11, rdx"; +"mov rax, rdi"; +"mul QWORD PTR [rcx+8]"; +"add r10, rax"; +"adc r11, rdx"; +"mov rax, QWORD PTR [rsp-120]"; +"mul QWORD PTR [rcx]"; +"add r10, rax"; +"adc r11, rdx"; +"mov QWORD PTR [rsp-40], r10"; +"mov QWORD PTR [rsp-32], r11"; +"mov rax, QWORD PTR [rsp-104]"; +"mul r9"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, r8"; +"mul QWORD PTR [rcx+24]"; +"add r10, rax"; +"adc r11, rdx"; +"mov rax, rdi"; +"mul QWORD PTR [rcx+16]"; +"add r10, rax"; +"adc r11, rdx"; +"mov r12, QWORD PTR [rsp-120]"; +"mov rax, r12"; +"mul QWORD PTR [rsp-88]"; +"add r10, rax"; +"adc r11, rdx"; +"mov rax, rsi"; +"mul QWORD PTR [rcx]"; +"add r10, rax"; +"adc r11, rdx"; +"mov rax, QWORD PTR [rsp-40]"; +"mov rdx, QWORD PTR [rsp-32]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov edx, 0"; +"add r10, rax"; +"adc r11, rdx"; +"mov QWORD PTR [rsp-24], r10"; +"mov QWORD PTR [rsp-16], r11"; +"mov rax, QWORD PTR [rsp-104]"; +"mul r8"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, rdi"; +"mul QWORD PTR [rcx+24]"; +"add r8, rax"; +"adc r9, rdx"; +"mov rax, QWORD PTR [rsp-120]"; +"mul QWORD PTR [rsp-72]"; +"add r8, rax"; +"adc r9, rdx"; +"mov rax, QWORD PTR [rsp-88]"; +"mul rsi"; +"add r8, rax"; +"adc r9, rdx"; +"mov rax, rbx"; +"mul QWORD PTR [rcx]"; +"add r8, rax"; +"adc r9, rdx"; +"mov rax, QWORD PTR [rsp-24]"; +"mov rdx, QWORD PTR [rsp-16]"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov edx, 0"; +"add r8, rax"; +"adc r9, rdx"; +"mov r12, r8"; +"mov r13, r9"; +"mov rax, QWORD PTR [rsp-104]"; +"mul rdi"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, QWORD PTR [rsp-120]"; +"mul QWORD PTR [rsp-56]"; +"add r8, rax"; +"adc r9, rdx"; +"mov rax, QWORD PTR [rsp-72]"; +"mul rsi"; +"add r8, rax"; +"adc r9, rdx"; +"mov r10, r8"; +"mov r11, r9"; +"mov rax, QWORD PTR [rsp-88]"; +"mul rbx"; +"mov r8, rax"; +"mov r9, rdx"; +"add r8, r10"; +"adc r9, r11"; +"mov rax, rbp"; +"mul QWORD PTR [rcx]"; +"add r8, rax"; +"adc r9, rdx"; +"mov rax, r12"; +"mov rdx, r13"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov edx, 0"; +"add r8, rax"; +"adc r9, rdx"; +"mov rax, QWORD PTR [rsp-120]"; +"mul QWORD PTR [rsp-104]"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, QWORD PTR [rsp-56]"; +"mul rsi"; +"mov rsi, rax"; +"mov rdi, rdx"; +"add rsi, r10"; +"adc rdi, r11"; +"mov rax, QWORD PTR [rsp-72]"; +"mul rbx"; +"add rsi, rax"; +"adc rdi, rdx"; +"mov rax, QWORD PTR [rsp-88]"; +"mul rbp"; +"add rsi, rax"; +"adc rdi, rdx"; +"mov rax, r15"; +"mul QWORD PTR [rcx]"; +"add rax, rsi"; +"adc rdx, rdi"; +"mov rcx, r8"; +"mov rbx, r9"; +"shrd rcx, rbx, 51"; +"shr rbx, 51"; +"mov ebx, 0"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, rax"; +"shrd rcx, rdx, 51"; +"lea rdx, [rcx+rcx*8]"; +"lea rsi, [rcx+rdx*2]"; +"movabs rcx, 2251799813685247"; +"mov rdx, QWORD PTR [rsp-40]"; +"and rdx, rcx"; +"add rsi, rdx"; +"mov rdx, QWORD PTR [rsp-24]"; +"and rdx, rcx"; +"mov rdi, rsi"; +"shr rdi, 51"; +"add rdx, rdi"; +"and rsi, rcx"; +"mov QWORD PTR [r14], rsi"; +"mov rsi, rdx"; +"and rsi, rcx"; +"mov QWORD PTR [r14+8], rsi"; +"shr rdx, 51"; +"and r12, rcx"; +"add rdx, r12"; +"mov QWORD PTR [r14+16], rdx"; +"and r8, rcx"; +"mov QWORD PTR [r14+24], r8"; +"and rax, rcx"; +"mov QWORD PTR [r14+32], rax"; +"pop rbx"; +"pop rbp"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"ret"; +"_Z23fiat_25519_carry_squarePmPKm:"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbp"; +"push rbx"; +"mov rbp, rdi"; +"mov r12, QWORD PTR [rsi+32]"; +"mov r10, QWORD PTR [rsi+24]"; +"mov rcx, QWORD PTR [rsi+16]"; +"mov rbx, QWORD PTR [rsi+8]"; +"lea rax, [r12+r12*8]"; +"lea r9, [rax+rax]"; +"lea rax, [r9+r12]"; +"lea r8, [rax+rax]"; +"lea r13, [r10+r10]"; +"lea rax, [rcx+rcx]"; +"mov QWORD PTR [rsp-16], rax"; +"mov rax, QWORD PTR [rsi]"; +"mov edx, 0"; +"mov QWORD PTR [rsp-72], rax"; +"mov QWORD PTR [rsp-64], rdx"; +"lea r11, [r10+r10*8]"; +"add r11, r11"; +"lea rsi, [r11+r10]"; +"add rsi, rsi"; +"mov rax, rsi"; +"mul rcx"; +"mov rsi, rax"; +"mov rdi, rdx"; +"mov rax, r8"; +"mul rbx"; +"add rsi, rax"; +"adc rdi, rdx"; +"mov r14, QWORD PTR [rsp-72]"; +"mov rax, r14"; +"mul QWORD PTR [rsp-72]"; +"add rsi, rax"; +"adc rdi, rdx"; +"mov QWORD PTR [rsp-56], rsi"; +"mov QWORD PTR [rsp-48], rdi"; +"add r11, r10"; +"mov rax, r11"; +"mul r10"; +"mov rsi, rax"; +"mov rdi, rdx"; +"mov rax, r8"; +"mul rcx"; +"mov r14, rsi"; +"mov r15, rdi"; +"add r14, rax"; +"adc r15, rdx"; +"lea rsi, [rbx+rbx]"; +"mov rax, rsi"; +"mul QWORD PTR [rsp-72]"; +"mov rsi, rax"; +"mov rdi, rdx"; +"add rsi, r14"; +"adc rdi, r15"; +"mov r14, QWORD PTR [rsp-56]"; +"mov r15, QWORD PTR [rsp-48]"; +"shrd r14, r15, 51"; +"shr r15, 51"; +"mov edx, 0"; +"add rsi, r14"; +"adc rdi, rdx"; +"mov rax, r8"; +"mul r10"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, QWORD PTR [rsp-16]"; +"mul QWORD PTR [rsp-72]"; +"add r10, rax"; +"adc r11, rdx"; +"mov rax, rbx"; +"mul rbx"; +"add r10, rax"; +"adc r11, rdx"; +"mov QWORD PTR [rsp-40], rsi"; +"mov QWORD PTR [rsp-32], rdi"; +"shrd rsi, rdi, 51"; +"shr rdi, 51"; +"mov edx, 0"; +"add r10, rsi"; +"adc r11, rdx"; +"lea r14, [r9+r12]"; +"mov rax, r14"; +"mul r12"; +"mov r14, rax"; +"mov r15, rdx"; +"mov rax, QWORD PTR [rsp-16]"; +"mul rbx"; +"mov r8, rax"; +"mov r9, rdx"; +"add r8, r14"; +"adc r9, r15"; +"mov QWORD PTR [rsp-16], r13"; +"mov rax, r13"; +"mul QWORD PTR [rsp-72]"; +"add r8, rax"; +"adc r9, rdx"; +"mov r13, r10"; +"mov r14, r11"; +"shrd r13, r14, 51"; +"shr r14, 51"; +"mov edx, 0"; +"add r8, r13"; +"adc r9, rdx"; +"add r12, r12"; +"mov rax, r12"; +"mul QWORD PTR [rsp-72]"; +"mov r12, rax"; +"mov r13, rdx"; +"mov rax, QWORD PTR [rsp-16]"; +"mul rbx"; +"add r12, rax"; +"adc r13, rdx"; +"mov rax, rcx"; +"mul rcx"; +"mov rcx, r12"; +"mov rbx, r13"; +"add rcx, rax"; +"adc rbx, rdx"; +"mov rax, r8"; +"mov rdx, r9"; +"shrd rax, rdx, 51"; +"shr rdx, 51"; +"mov edx, 0"; +"add rcx, rax"; +"adc rbx, rdx"; +"mov rax, rcx"; +"shrd rax, rbx, 51"; +"lea rdx, [rax+rax*8]"; +"lea rdx, [rax+rdx*2]"; +"movabs rax, 2251799813685247"; +"mov rdi, QWORD PTR [rsp-56]"; +"and rdi, rax"; +"add rdx, rdi"; +"mov rsi, QWORD PTR [rsp-40]"; +"and rsi, rax"; +"mov rdi, rdx"; +"shr rdi, 51"; +"add rsi, rdi"; +"and rdx, rax"; +"mov QWORD PTR [rbp+0], rdx"; +"mov rdx, rsi"; +"and rdx, rax"; +"mov QWORD PTR [rbp+8], rdx"; +"shr rsi, 51"; +"and r10, rax"; +"add rsi, r10"; +"mov QWORD PTR [rbp+16], rsi"; +"and r8, rax"; +"mov QWORD PTR [rbp+24], r8"; +"and rcx, rax"; +"mov QWORD PTR [rbp+32], rcx"; +"pop rbx"; +"pop rbp"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"ret"; +"_Z29fiat_25519_carry_scmul_121666PmPKm:"; +"push r15"; +"push r14"; +"push r13"; +"push r12"; +"push rbp"; +"push rbx"; +"mov rcx, rdi"; +"mov rbx, rsi"; +"mov r10, QWORD PTR [rsi]"; +"mov ebp, 121666"; +"mov rax, r10"; +"mul rbp"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, QWORD PTR [rsi+8]"; +"mul rbp"; +"mov r8, r10"; +"mov r9, r11"; +"shrd r8, r9, 51"; +"shr r9, 51"; +"mov r14, r8"; +"mov r15, r9"; +"add r14, rax"; +"adc r15, rdx"; +"mov rax, QWORD PTR [rsi+16]"; +"mul rbp"; +"mov QWORD PTR [rsp-40], r14"; +"mov QWORD PTR [rsp-32], r15"; +"mov rsi, r14"; +"mov rdi, r15"; +"shrd rsi, rdi, 51"; +"shr rdi, 51"; +"add rsi, rax"; +"adc rdi, rdx"; +"mov rax, QWORD PTR [rbx+24]"; +"mul rbp"; +"mov QWORD PTR [rsp-24], rsi"; +"mov QWORD PTR [rsp-16], rdi"; +"shrd rsi, rdi, 51"; +"shr rdi, 51"; +"mov r12, rsi"; +"mov r13, rdi"; +"add r12, rax"; +"adc r13, rdx"; +"mov rax, QWORD PTR [rbx+32]"; +"mul rbp"; +"mov r14, r12"; +"mov r15, r13"; +"shrd r14, r15, 51"; +"shr r15, 51"; +"add r14, rax"; +"adc r15, rdx"; +"mov rdi, r14"; +"shrd rdi, r15, 51"; +"lea rdx, [rdi+rdi*8]"; +"lea r9, [rdi+rdx*2]"; +"movabs rdi, 2251799813685247"; +"and r10, rdi"; +"add r9, r10"; +"mov rdx, r9"; +"shr rdx, 51"; +"mov r8, QWORD PTR [rsp-40]"; +"and r8, rdi"; +"add r8, rdx"; +"and r9, rdi"; +"mov QWORD PTR [rcx], r9"; +"mov rdx, r8"; +"and rdx, rdi"; +"mov QWORD PTR [rcx+8], rdx"; +"shr r8, 51"; +"mov rsi, QWORD PTR [rsp-24]"; +"and rsi, rdi"; +"add r8, rsi"; +"mov QWORD PTR [rcx+16], r8"; +"and r12, rdi"; +"mov QWORD PTR [rcx+24], r12"; +"mov rax, r14"; +"and rax, rdi"; +"mov QWORD PTR [rcx+32], rax"; +"pop rbx"; +"pop rbp"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"ret"; +"_Z16fiat_25519_carryPmPKm:"; +"mov rdx, rdi"; +"mov rax, QWORD PTR [rsi]"; +"mov r9, rax"; +"shr r9, 51"; +"add r9, QWORD PTR [rsi+8]"; +"mov rdi, r9"; +"shr rdi, 51"; +"add rdi, QWORD PTR [rsi+16]"; +"mov r10, rdi"; +"shr r10, 51"; +"add r10, QWORD PTR [rsi+24]"; +"mov rcx, r10"; +"shr rcx, 51"; +"add rcx, QWORD PTR [rsi+32]"; +"mov rsi, rcx"; +"shr rcx, 51"; +"lea r8, [rcx+rcx*8]"; +"lea r8, [rcx+r8*2]"; +"movabs rcx, 2251799813685247"; +"and rax, rcx"; +"add r8, rax"; +"mov rax, r8"; +"shr rax, 51"; +"and r9, rcx"; +"add rax, r9"; +"and r8, rcx"; +"mov QWORD PTR [rdx], r8"; +"mov r8, rax"; +"and r8, rcx"; +"mov QWORD PTR [rdx+8], r8"; +"shr rax, 51"; +"and rdi, rcx"; +"add rax, rdi"; +"mov QWORD PTR [rdx+16], rax"; +"and r10, rcx"; +"mov QWORD PTR [rdx+24], r10"; +"and rsi, rcx"; +"mov QWORD PTR [rdx+32], rsi"; +"ret"; +"_Z14fiat_25519_addPmPKmS1_:"; +"mov rax, rdi"; +"mov r9, QWORD PTR [rdx+8]"; +"add r9, QWORD PTR [rsi+8]"; +"mov r8, QWORD PTR [rdx+16]"; +"add r8, QWORD PTR [rsi+16]"; +"mov rdi, QWORD PTR [rdx+24]"; +"add rdi, QWORD PTR [rsi+24]"; +"mov rcx, QWORD PTR [rdx+32]"; +"add rcx, QWORD PTR [rsi+32]"; +"mov rdx, QWORD PTR [rdx]"; +"add rdx, QWORD PTR [rsi]"; +"mov QWORD PTR [rax], rdx"; +"mov QWORD PTR [rax+8], r9"; +"mov QWORD PTR [rax+16], r8"; +"mov QWORD PTR [rax+24], rdi"; +"mov QWORD PTR [rax+32], rcx"; +"ret"; +"_Z14fiat_25519_subPmPKmS1_:"; +"mov rcx, rdi"; +"mov rdi, QWORD PTR [rsi+8]"; +"sub rdi, QWORD PTR [rdx+8]"; +"movabs rax, 4503599627370494"; +"add rdi, rax"; +"mov r9, rax"; +"add r9, QWORD PTR [rsi+16]"; +"sub r9, QWORD PTR [rdx+16]"; +"mov r8, rax"; +"add r8, QWORD PTR [rsi+24]"; +"sub r8, QWORD PTR [rdx+24]"; +"add rax, QWORD PTR [rsi+32]"; +"sub rax, QWORD PTR [rdx+32]"; +"mov rsi, QWORD PTR [rsi]"; +"sub rsi, QWORD PTR [rdx]"; +"mov rdx, rsi"; +"movabs rsi, 4503599627370458"; +"add rdx, rsi"; +"mov QWORD PTR [rcx], rdx"; +"mov QWORD PTR [rcx+8], rdi"; +"mov QWORD PTR [rcx+16], r9"; +"mov QWORD PTR [rcx+24], r8"; +"mov QWORD PTR [rcx+32], rax"; +"ret"; +"_Z14fiat_25519_oppPmPKm:"; +"movabs rax, 4503599627370494"; +"mov r9, rax"; +"sub r9, QWORD PTR [rsi+8]"; +"mov r8, rax"; +"sub r8, QWORD PTR [rsi+16]"; +"mov rcx, rax"; +"sub rcx, QWORD PTR [rsi+24]"; +"sub rax, QWORD PTR [rsi+32]"; +"movabs rdx, 4503599627370458"; +"sub rdx, QWORD PTR [rsi]"; +"mov QWORD PTR [rdi], rdx"; +"mov QWORD PTR [rdi+8], r9"; +"mov QWORD PTR [rdi+16], r8"; +"mov QWORD PTR [rdi+24], rcx"; +"mov QWORD PTR [rdi+32], rax"; +"ret"; +"_Z20fiat_25519_selectznzPmhPKmS1_:"; +"push rbp"; +"push rbx"; +"mov r8, rdx"; +"cmp sil, 1"; +"sbb rdx, rdx"; +"mov eax, 0"; +"test sil, sil"; +"mov rbx, rax"; +"cmovne rbx, QWORD PTR [rcx+8]"; +"mov r9, rdx"; +"and r9, QWORD PTR [r8+8]"; +"or rbx, r9"; +"test sil, sil"; +"mov r11, rax"; +"cmovne r11, QWORD PTR [rcx+16]"; +"mov r9, rdx"; +"and r9, QWORD PTR [r8+16]"; +"or r11, r9"; +"test sil, sil"; +"mov r10, rax"; +"cmovne r10, QWORD PTR [rcx+24]"; +"mov r9, rdx"; +"and r9, QWORD PTR [r8+24]"; +"or r10, r9"; +"test sil, sil"; +"mov r9, rax"; +"cmovne r9, QWORD PTR [rcx+32]"; +"mov rbp, rdx"; +"and rbp, QWORD PTR [r8+32]"; +"or r9, rbp"; +"test sil, sil"; +"cmovne rax, QWORD PTR [rcx]"; +"and rdx, QWORD PTR [r8]"; +"or rax, rdx"; +"mov QWORD PTR [rdi], rax"; +"mov QWORD PTR [rdi+8], rbx"; +"mov QWORD PTR [rdi+16], r11"; +"mov QWORD PTR [rdi+24], r10"; +"mov QWORD PTR [rdi+32], r9"; +"pop rbx"; +"pop rbp"; +"ret"; +"_Z19fiat_25519_to_bytesPhPKm:"; +"push rbp"; +"push rbx"; +"mov rax, rdi"; +"movabs rbx, -2251799813685229"; +"add rbx, QWORD PTR [rsi]"; +"mov rdx, rbx"; +"sar rdx, 51"; +"neg edx"; +"movzx edx, dl"; +"mov rdi, QWORD PTR [rsi+8]"; +"sub rdi, rdx"; +"movabs rdx, -2251799813685247"; +"add rdi, rdx"; +"mov r8, rdi"; +"sar r8, 51"; +"neg r8d"; +"movzx r8d, r8b"; +"mov rcx, rdx"; +"add rcx, QWORD PTR [rsi+16]"; +"sub rcx, r8"; +"mov r11, rcx"; +"sar rcx, 51"; +"neg ecx"; +"movzx ecx, cl"; +"mov r8, rdx"; +"add r8, QWORD PTR [rsi+24]"; +"sub r8, rcx"; +"mov rcx, r8"; +"sar rcx, 51"; +"neg ecx"; +"movzx ecx, cl"; +"add rdx, QWORD PTR [rsi+32]"; +"sub rdx, rcx"; +"mov rbp, rdx"; +"sar rbp, 51"; +"mov r10d, 0"; +"test bpl, bpl"; +"movabs rcx, 2251799813685229"; +"cmove rcx, r10"; +"movabs r9, 2251799813685247"; +"and rbx, r9"; +"add rcx, rbx"; +"mov rsi, rcx"; +"and rsi, r9"; +"test bpl, bpl"; +"cmovne r10, r9"; +"and rdi, r9"; +"add rdi, r10"; +"shr rcx, 51"; +"add rdi, rcx"; +"mov rcx, r11"; +"and rcx, r9"; +"add rcx, r10"; +"mov r11, rdi"; +"shr r11, 51"; +"add rcx, r11"; +"and r8, r9"; +"add r8, r10"; +"mov r11, rcx"; +"shr r11, 51"; +"add r8, r11"; +"sal rdi, 3"; +"movabs r11, 18014398509481976"; +"and rdi, r11"; +"mov r11, rsi"; +"shr r11, 48"; +"lea rbp, [rdi+r11]"; +"sal rcx, 6"; +"movabs r11, 144115188075855808"; +"and rcx, r11"; +"shr rdi, 48"; +"add rcx, rdi"; +"mov r11, r8"; +"and r11, r9"; +"mov rdi, rcx"; +"shr rdi, 56"; +"lea rdi, [rdi+r11*2]"; +"and rdx, r9"; +"add rdx, r10"; +"shr r8, 51"; +"add rdx, r8"; +"sal rdx, 4"; +"movabs r8, 36028797018963952"; +"and rdx, r8"; +"mov r8, rdi"; +"shr r8, 48"; +"add rdx, r8"; +"mov BYTE PTR [rax], sil"; +"mov rbx, rsi"; +"mov BYTE PTR [rax+1], bh"; +"mov r8, rsi"; +"shr r8, 16"; +"mov BYTE PTR [rax+2], r8b"; +"mov r8, rsi"; +"shr r8, 24"; +"mov BYTE PTR [rax+3], r8b"; +"mov r8, rsi"; +"shr r8, 32"; +"mov BYTE PTR [rax+4], r8b"; +"shr rsi, 40"; +"mov BYTE PTR [rax+5], sil"; +"mov BYTE PTR [rax+6], bpl"; +"mov rbx, rbp"; +"mov BYTE PTR [rax+7], bh"; +"shr rbx, 16"; +"mov BYTE PTR [rax+8], bl"; +"mov rbx, rbp"; +"shr rbx, 24"; +"mov BYTE PTR [rax+9], bl"; +"mov rbx, rbp"; +"shr rbx, 32"; +"mov BYTE PTR [rax+10], bl"; +"mov rbx, rbp"; +"shr rbx, 40"; +"mov BYTE PTR [rax+11], bl"; +"mov BYTE PTR [rax+12], cl"; +"mov BYTE PTR [rax+13], ch"; +"mov rsi, rcx"; +"shr rsi, 16"; +"mov BYTE PTR [rax+14], sil"; +"mov rsi, rcx"; +"shr rsi, 24"; +"mov BYTE PTR [rax+15], sil"; +"mov rsi, rcx"; +"shr rsi, 32"; +"mov BYTE PTR [rax+16], sil"; +"mov rsi, rcx"; +"shr rsi, 40"; +"mov BYTE PTR [rax+17], sil"; +"shr rcx, 48"; +"mov BYTE PTR [rax+18], cl"; +"mov BYTE PTR [rax+19], dil"; +"mov rbx, rdi"; +"mov BYTE PTR [rax+20], bh"; +"mov rcx, rdi"; +"shr rcx, 16"; +"mov BYTE PTR [rax+21], cl"; +"mov rcx, rdi"; +"shr rcx, 24"; +"mov BYTE PTR [rax+22], cl"; +"mov rcx, rdi"; +"shr rcx, 32"; +"mov BYTE PTR [rax+23], cl"; +"shr rdi, 40"; +"mov BYTE PTR [rax+24], dil"; +"mov BYTE PTR [rax+25], dl"; +"mov BYTE PTR [rax+26], dh"; +"mov rcx, rdx"; +"shr rcx, 16"; +"mov BYTE PTR [rax+27], cl"; +"mov rcx, rdx"; +"shr rcx, 24"; +"mov BYTE PTR [rax+28], cl"; +"mov rcx, rdx"; +"shr rcx, 32"; +"mov BYTE PTR [rax+29], cl"; +"mov rcx, rdx"; +"shr rcx, 40"; +"mov BYTE PTR [rax+30], cl"; +"shr rdx, 48"; +"mov BYTE PTR [rax+31], dl"; +"pop rbx"; +"pop rbp"; +"ret"; +"_Z21fiat_25519_from_bytesPmPKh:"; +"mov r8, rdi"; +"mov rax, rsi"; +"movzx edi, BYTE PTR [rsi+6]"; +"sal rdi, 48"; +"movzx edx, BYTE PTR [rsi+5]"; +"sal rdx, 40"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi]"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+4]"; +"sal rdx, 32"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+3]"; +"sal rdx, 24"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+2]"; +"sal rdx, 16"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+1]"; +"sal rdx, 8"; +"add rdi, rdx"; +"movzx esi, BYTE PTR [rsi+12]"; +"sal rsi, 45"; +"movzx edx, BYTE PTR [rax+11]"; +"sal rdx, 37"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+10]"; +"sal rdx, 29"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+9]"; +"sal rdx, 21"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+8]"; +"sal rdx, 13"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+7]"; +"sal rdx, 5"; +"add rsi, rdx"; +"mov rdx, rdi"; +"shr rdx, 51"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+19]"; +"sal rdx, 50"; +"movzx ecx, BYTE PTR [rax+18]"; +"sal rcx, 42"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+17]"; +"sal rcx, 34"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+16]"; +"sal rcx, 26"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+15]"; +"sal rcx, 18"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+14]"; +"sal rcx, 10"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+13]"; +"lea r9, [rdx+rcx*4]"; +"mov rdx, rsi"; +"shr rdx, 51"; +"add r9, rdx"; +"movzx edx, BYTE PTR [rax+25]"; +"sal rdx, 47"; +"movzx ecx, BYTE PTR [rax+24]"; +"sal rcx, 39"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+23]"; +"sal rcx, 31"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+22]"; +"sal rcx, 23"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+21]"; +"sal rcx, 15"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+20]"; +"sal rcx, 7"; +"add rdx, rcx"; +"mov rcx, r9"; +"shr rcx, 51"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+31]"; +"sal rcx, 44"; +"movzx r10d, BYTE PTR [rax+30]"; +"sal r10, 36"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+29]"; +"sal r10, 28"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+28]"; +"sal r10, 20"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+27]"; +"sal r10, 12"; +"add rcx, r10"; +"movzx eax, BYTE PTR [rax+26]"; +"sal rax, 4"; +"add rax, rcx"; +"mov rcx, rdx"; +"shr rcx, 51"; +"add rax, rcx"; +"movabs rcx, 2251799813685247"; +"and rdi, rcx"; +"mov QWORD PTR [r8], rdi"; +"and rsi, rcx"; +"mov QWORD PTR [r8+8], rsi"; +"and r9, rcx"; +"mov QWORD PTR [r8+16], r9"; +"and rdx, rcx"; +"mov QWORD PTR [r8+24], rdx"; +"mov QWORD PTR [r8+32], rax"; +""]. diff --git a/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O2.v b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O2.v new file mode 100644 index 0000000000..f7562889bd --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O2.v @@ -0,0 +1,856 @@ +From Coq Require Import String List. +Import ListNotations. +Local Open Scope string_scope. +Local Open Scope list_scope. +Example example : list string := [ +"_Z24fiat_25519_addcarryx_u51PmPhhmm:"; +"movabs rax, 2251799813685247"; +"add rcx, r8"; +"movzx edx, dl"; +"add rcx, rdx"; +"and rax, rcx"; +"shr rcx, 51"; +"mov QWORD PTR [rdi], rax"; +"mov BYTE PTR [rsi], cl"; +"ret"; +"_Z25fiat_25519_subborrowx_u51PmPhhmm:"; +"movabs rax, 2251799813685247"; +"movzx edx, dl"; +"sub rcx, rdx"; +"sub rcx, r8"; +"and rax, rcx"; +"sar rcx, 51"; +"neg ecx"; +"mov QWORD PTR [rdi], rax"; +"mov BYTE PTR [rsi], cl"; +"ret"; +"_Z22fiat_25519_cmovznz_u64Pmhmm:"; +"cmp sil, 1"; +"sbb rax, rax"; +"and rax, rdx"; +"xor edx, edx"; +"test sil, sil"; +"cmove rcx, rdx"; +"or rax, rcx"; +"mov QWORD PTR [rdi], rax"; +"ret"; +"_Z20fiat_25519_carry_mulPmPKmS1_:"; +"push r15"; +"mov rcx, rsi"; +"mov rax, rdx"; +"push r14"; +"push r13"; +"push r12"; +"xor r12d, r12d"; +"push rbp"; +"mov rbp, rdi"; +"push rbx"; +"sub rsp, 16"; +"mov r11, QWORD PTR [rcx+24]"; +"mov r15, QWORD PTR [rdx+32]"; +"mov rbx, QWORD PTR [rsi+32]"; +"mov r14, QWORD PTR [rax+24]"; +"xor esi, esi"; +"mov QWORD PTR [rsp-48], r12"; +"mov QWORD PTR [rsp-56], r11"; +"mov r11, QWORD PTR [rcx+16]"; +"lea rdx, [r15+r15*8]"; +"xor r12d, r12d"; +"mov QWORD PTR [rsp-104], rbx"; +"mov rbx, QWORD PTR [rax+16]"; +"lea rdi, [r15+rdx*2]"; +"lea rdx, [r14+r14*8]"; +"mov r10, QWORD PTR [rax]"; +"mov QWORD PTR [rsp-96], rsi"; +"lea r8, [r14+rdx*2]"; +"mov rsi, QWORD PTR [rax+8]"; +"mov rax, QWORD PTR [rcx]"; +"mov QWORD PTR [rsp-72], r11"; +"lea rdx, [rbx+rbx*8]"; +"mov r11, QWORD PTR [rcx+8]"; +"mov QWORD PTR [rsp-64], r12"; +"xor r12d, r12d"; +"lea r9, [rbx+rdx*2]"; +"mov QWORD PTR [rsp-80], r12"; +"xor edx, edx"; +"mov QWORD PTR [rsp-88], r11"; +"xor r11d, r11d"; +"mov QWORD PTR [rsp-8], rax"; +"lea rax, [rsi+rsi*8]"; +"mov QWORD PTR [rsp], rdx"; +"lea rax, [rsi+rax*2]"; +"mul QWORD PTR [rcx+32]"; +"mov QWORD PTR [rsp-120], r10"; +"mov QWORD PTR [rsp-112], r11"; +"mov r12, rax"; +"mov r13, rdx"; +"mov rax, r9"; +"mul QWORD PTR [rcx+24]"; +"add r12, rax"; +"mov rax, r8"; +"adc r13, rdx"; +"mul QWORD PTR [rcx+16]"; +"add r12, rax"; +"mov rax, rdi"; +"adc r13, rdx"; +"mul QWORD PTR [rcx+8]"; +"add r12, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r13, rdx"; +"mul QWORD PTR [rcx]"; +"add r12, rax"; +"mov rax, QWORD PTR [rsp-104]"; +"adc r13, rdx"; +"mov QWORD PTR [rsp-40], r12"; +"mul r9"; +"mov QWORD PTR [rsp-32], r13"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, r8"; +"mul QWORD PTR [rcx+24]"; +"add r10, rax"; +"mov rax, rdi"; +"adc r11, rdx"; +"mul QWORD PTR [rcx+16]"; +"mov r9, r10"; +"mov r10, r11"; +"mov r11, QWORD PTR [rsp-32]"; +"add r9, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r10, rdx"; +"mul QWORD PTR [rsp-88]"; +"mov r12, r9"; +"mov r13, r10"; +"mov r10, QWORD PTR [rsp-40]"; +"add r12, rax"; +"mov rax, rsi"; +"adc r13, rdx"; +"mul QWORD PTR [rcx]"; +"add rax, r12"; +"adc rdx, r13"; +"shrd r10, r11, 51"; +"xor r11d, r11d"; +"add rax, r10"; +"mov r12, rax"; +"mov rax, QWORD PTR [rsp-104]"; +"adc rdx, r11"; +"mov r13, rdx"; +"mov QWORD PTR [rsp-24], r12"; +"mul r8"; +"mov QWORD PTR [rsp-16], r13"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, rdi"; +"mul QWORD PTR [rcx+24]"; +"add r8, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r9, rdx"; +"mul QWORD PTR [rsp-72]"; +"add r8, rax"; +"mov rax, QWORD PTR [rsp-88]"; +"adc r9, rdx"; +"mov r10, r8"; +"mov r8, r12"; +"mul rsi"; +"mov r11, r9"; +"add r10, rax"; +"mov rax, rbx"; +"adc r11, rdx"; +"mul QWORD PTR [rcx]"; +"add rax, r10"; +"adc rdx, r11"; +"shrd r8, r13, 51"; +"xor r9d, r9d"; +"add rax, r8"; +"mov r12, rax"; +"mov rax, QWORD PTR [rsp-104]"; +"adc rdx, r9"; +"mov r13, rdx"; +"mul rdi"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, QWORD PTR [rsp-120]"; +"mul QWORD PTR [rsp-56]"; +"add r10, rax"; +"mov rax, QWORD PTR [rsp-72]"; +"adc r11, rdx"; +"mul rsi"; +"add r10, rax"; +"mov rax, QWORD PTR [rsp-88]"; +"adc r11, rdx"; +"mul rbx"; +"add r10, rax"; +"mov rax, r14"; +"adc r11, rdx"; +"mul QWORD PTR [rcx]"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, r12"; +"add r8, r10"; +"adc r9, r11"; +"shrd rax, r13, 51"; +"xor r11d, r11d"; +"add r8, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r9, r11"; +"mul QWORD PTR [rsp-104]"; +"mov r10, rax"; +"mov rax, QWORD PTR [rsp-56]"; +"mov r11, rdx"; +"mul rsi"; +"add r10, rax"; +"mov rax, QWORD PTR [rsp-72]"; +"adc r11, rdx"; +"mov rcx, r10"; +"mul rbx"; +"mov rbx, r11"; +"add rcx, rax"; +"mov rax, QWORD PTR [rsp-88]"; +"adc rbx, rdx"; +"mul r14"; +"add rcx, rax"; +"mov rax, QWORD PTR [rsp-8]"; +"adc rbx, rdx"; +"mul r15"; +"add rax, rcx"; +"mov rcx, r8"; +"adc rdx, rbx"; +"shrd rcx, r9, 51"; +"xor ebx, ebx"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, rax"; +"shrd rcx, rdx, 51"; +"lea rdx, [rcx+rcx*8]"; +"lea rsi, [rcx+rdx*2]"; +"mov rdx, QWORD PTR [rsp-40]"; +"movabs rcx, 2251799813685247"; +"and r12, rcx"; +"and r8, rcx"; +"and rax, rcx"; +"and rdx, rcx"; +"mov QWORD PTR [rbp+24], r8"; +"add rsi, rdx"; +"mov rdx, QWORD PTR [rsp-24]"; +"mov QWORD PTR [rbp+32], rax"; +"mov rdi, rsi"; +"and rsi, rcx"; +"and rdx, rcx"; +"shr rdi, 51"; +"mov QWORD PTR [rbp+0], rsi"; +"add rdx, rdi"; +"mov rsi, rdx"; +"shr rdx, 51"; +"add rdx, r12"; +"and rsi, rcx"; +"mov QWORD PTR [rbp+8], rsi"; +"mov QWORD PTR [rbp+16], rdx"; +"add rsp, 16"; +"pop rbx"; +"pop rbp"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"ret"; +"_Z23fiat_25519_carry_squarePmPKm:"; +"push r15"; +"xor edx, edx"; +"push r14"; +"push r13"; +"push r12"; +"push rbp"; +"push rbx"; +"mov r12, QWORD PTR [rsi+32]"; +"mov rbx, rdi"; +"mov r8, QWORD PTR [rsi+24]"; +"mov rcx, QWORD PTR [rsi+8]"; +"lea rax, [r12+r12*8]"; +"mov rbp, QWORD PTR [rsi+16]"; +"lea r13, [r12+rax*2]"; +"lea rax, [r8+r8]"; +"mov QWORD PTR [rsp-48], rdx"; +"mov QWORD PTR [rsp-24], rax"; +"mov rax, QWORD PTR [rsi]"; +"lea r9, [r13+r13]"; +"lea rdi, [rbp+rbp]"; +"mov QWORD PTR [rsp-16], rdi"; +"mov QWORD PTR [rsp-56], rax"; +"lea rax, [r8+r8*8]"; +"lea rsi, [r8+rax*2]"; +"lea r14, [rsi+rsi]"; +"mov rax, r14"; +"mov r14, QWORD PTR [rsp-56]"; +"mul rbp"; +"mov r10, rax"; +"mov rax, r9"; +"mov r11, rdx"; +"mul rcx"; +"add r10, rax"; +"mov rax, r14"; +"adc r11, rdx"; +"mul QWORD PTR [rsp-56]"; +"mov r14, r10"; +"mov r15, r11"; +"add r14, rax"; +"mov rax, rsi"; +"lea rsi, [rcx+rcx]"; +"adc r15, rdx"; +"mul r8"; +"mov QWORD PTR [rsp-40], r14"; +"mov QWORD PTR [rsp-32], r15"; +"mov r10, rax"; +"mov rax, r9"; +"mov r11, rdx"; +"mul rbp"; +"add r10, rax"; +"mov rax, rsi"; +"adc r11, rdx"; +"mul QWORD PTR [rsp-56]"; +"mov rsi, rax"; +"mov rdi, rdx"; +"mov rax, r9"; +"add rsi, r10"; +"mov r10, r14"; +"adc rdi, r11"; +"shrd r10, r15, 51"; +"xor edx, edx"; +"add rsi, r10"; +"adc rdi, rdx"; +"mul r8"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, QWORD PTR [rsp-16]"; +"mul QWORD PTR [rsp-56]"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, rcx"; +"add r10, r8"; +"mov r8, rsi"; +"adc r11, r9"; +"mul rcx"; +"add r10, rax"; +"mov rax, r13"; +"adc r11, rdx"; +"shrd r8, rdi, 51"; +"xor edx, edx"; +"add r10, r8"; +"adc r11, rdx"; +"mul r12"; +"mov r13, r10"; +"mov r14, rax"; +"mov rax, QWORD PTR [rsp-16]"; +"mov r15, rdx"; +"mul rcx"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, QWORD PTR [rsp-24]"; +"add r8, r14"; +"adc r9, r15"; +"mul QWORD PTR [rsp-56]"; +"add r8, rax"; +"adc r9, rdx"; +"shrd r13, r11, 51"; +"xor edx, edx"; +"add r8, r13"; +"adc r9, rdx"; +"add r12, r12"; +"mov rax, r12"; +"mul QWORD PTR [rsp-56]"; +"mov r12, rax"; +"mov rax, QWORD PTR [rsp-24]"; +"mov r13, rdx"; +"mul rcx"; +"add r12, rax"; +"mov rax, rbp"; +"adc r13, rdx"; +"mul rbp"; +"movabs rbp, 2251799813685247"; +"add rax, r12"; +"mov r12, r8"; +"adc rdx, r13"; +"shrd r12, r9, 51"; +"xor r13d, r13d"; +"add rax, r12"; +"adc rdx, r13"; +"mov rcx, rax"; +"and rsi, rbp"; +"and r10, rbp"; +"shrd rcx, rdx, 51"; +"and r8, rbp"; +"and rax, rbp"; +"lea rdx, [rcx+rcx*8]"; +"mov QWORD PTR [rbx+24], r8"; +"lea rdx, [rcx+rdx*2]"; +"mov rcx, QWORD PTR [rsp-40]"; +"mov QWORD PTR [rbx+32], rax"; +"and rcx, rbp"; +"add rdx, rcx"; +"mov rcx, rdx"; +"and rdx, rbp"; +"shr rcx, 51"; +"mov QWORD PTR [rbx], rdx"; +"add rsi, rcx"; +"mov rdx, rsi"; +"shr rsi, 51"; +"and rdx, rbp"; +"add rsi, r10"; +"mov QWORD PTR [rbx+8], rdx"; +"mov QWORD PTR [rbx+16], rsi"; +"pop rbx"; +"pop rbp"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"ret"; +"_Z29fiat_25519_carry_scmul_121666PmPKm:"; +"push r15"; +"mov r11d, 121666"; +"mov r10, rsi"; +"mov rcx, rdi"; +"push r14"; +"push r13"; +"push r12"; +"mov r14, QWORD PTR [rsi]"; +"mov rax, r14"; +"mul r11"; +"mov r14, rax"; +"mov rax, QWORD PTR [rsi+8]"; +"mov r15, rdx"; +"mov r8, r14"; +"mov r9, r15"; +"mul r11"; +"shrd r8, r15, 51"; +"shr r9, 51"; +"add r8, rax"; +"mov rax, QWORD PTR [rsi+16]"; +"adc r9, rdx"; +"mov rsi, r8"; +"mul r11"; +"mov rdi, r9"; +"shrd rsi, r9, 51"; +"shr rdi, 51"; +"add rsi, rax"; +"mov rax, QWORD PTR [r10+24]"; +"adc rdi, rdx"; +"mov QWORD PTR [rsp-24], rsi"; +"mul r11"; +"shrd rsi, rdi, 51"; +"mov QWORD PTR [rsp-16], rdi"; +"shr rdi, 51"; +"mov r12, rsi"; +"mov r13, rdi"; +"mov rsi, QWORD PTR [rsp-24]"; +"add r12, rax"; +"mov rax, QWORD PTR [r10+32]"; +"adc r13, rdx"; +"mov r10, r12"; +"mul r11"; +"shrd r10, r13, 51"; +"mov r11, r13"; +"shr r11, 51"; +"add r10, rax"; +"adc r11, rdx"; +"mov rdi, r10"; +"mov rax, r10"; +"shrd rdi, r11, 51"; +"lea rdx, [rdi+rdi*8]"; +"lea rdx, [rdi+rdx*2]"; +"movabs rdi, 2251799813685247"; +"and r14, rdi"; +"and r8, rdi"; +"and rsi, rdi"; +"and r12, rdi"; +"add r14, rdx"; +"and rax, rdi"; +"mov QWORD PTR [rcx+24], r12"; +"pop r12"; +"mov rdx, r14"; +"and r14, rdi"; +"pop r13"; +"mov QWORD PTR [rcx+32], rax"; +"shr rdx, 51"; +"mov QWORD PTR [rcx], r14"; +"pop r14"; +"add r8, rdx"; +"pop r15"; +"mov rdx, r8"; +"shr r8, 51"; +"and rdx, rdi"; +"add r8, rsi"; +"mov QWORD PTR [rcx+8], rdx"; +"mov QWORD PTR [rcx+16], r8"; +"ret"; +"_Z16fiat_25519_carryPmPKm:"; +"mov rax, QWORD PTR [rsi]"; +"mov rdx, rdi"; +"mov r9, rax"; +"shr r9, 51"; +"add r9, QWORD PTR [rsi+8]"; +"mov rdi, r9"; +"shr rdi, 51"; +"add rdi, QWORD PTR [rsi+16]"; +"mov r10, rdi"; +"shr r10, 51"; +"add r10, QWORD PTR [rsi+24]"; +"mov rcx, r10"; +"shr rcx, 51"; +"add rcx, QWORD PTR [rsi+32]"; +"mov rsi, rcx"; +"shr rcx, 51"; +"lea r8, [rcx+rcx*8]"; +"lea r8, [rcx+r8*2]"; +"movabs rcx, 2251799813685247"; +"and rax, rcx"; +"and r9, rcx"; +"and rdi, rcx"; +"and r10, rcx"; +"add r8, rax"; +"and rsi, rcx"; +"mov QWORD PTR [rdx+24], r10"; +"mov rax, r8"; +"and r8, rcx"; +"mov QWORD PTR [rdx+32], rsi"; +"shr rax, 51"; +"mov QWORD PTR [rdx], r8"; +"add rax, r9"; +"mov r8, rax"; +"shr rax, 51"; +"and r8, rcx"; +"add rax, rdi"; +"mov QWORD PTR [rdx+8], r8"; +"mov QWORD PTR [rdx+16], rax"; +"ret"; +"_Z14fiat_25519_addPmPKmS1_:"; +"movdqu xmm0, XMMWORD PTR [rsi+16]"; +"movdqu xmm3, XMMWORD PTR [rdx+16]"; +"movdqu xmm1, XMMWORD PTR [rsi]"; +"movdqu xmm2, XMMWORD PTR [rdx]"; +"mov rax, QWORD PTR [rdx+32]"; +"paddq xmm0, xmm3"; +"add rax, QWORD PTR [rsi+32]"; +"paddq xmm1, xmm2"; +"mov QWORD PTR [rdi+32], rax"; +"movups XMMWORD PTR [rdi], xmm1"; +"movups XMMWORD PTR [rdi+16], xmm0"; +"ret"; +"_Z14fiat_25519_subPmPKmS1_:"; +"movdqu xmm0, XMMWORD PTR [rsi+16]"; +"movdqu xmm3, XMMWORD PTR [rdx+16]"; +"movabs rax, 4503599627370494"; +"movq xmm1, rax"; +"movdqu xmm2, XMMWORD PTR [rdx]"; +"add rax, QWORD PTR [rsi+32]"; +"punpcklqdq xmm1, xmm1"; +"psubq xmm0, xmm3"; +"sub rax, QWORD PTR [rdx+32]"; +"paddq xmm0, xmm1"; +"movdqu xmm1, XMMWORD PTR [rsi]"; +"mov QWORD PTR [rdi+32], rax"; +"movups XMMWORD PTR [rdi+16], xmm0"; +"psubq xmm1, xmm2"; +"paddq xmm1, XMMWORD PTR .LC1[rip]"; +"movups XMMWORD PTR [rdi], xmm1"; +"ret"; +"_Z14fiat_25519_oppPmPKm:"; +"movabs rax, 4503599627370494"; +"movdqu xmm3, XMMWORD PTR [rsi+16]"; +"movdqu xmm2, XMMWORD PTR [rsi]"; +"movq xmm0, rax"; +"movdqa xmm1, XMMWORD PTR .LC1[rip]"; +"sub rax, QWORD PTR [rsi+32]"; +"punpcklqdq xmm0, xmm0"; +"mov QWORD PTR [rdi+32], rax"; +"psubq xmm0, xmm3"; +"psubq xmm1, xmm2"; +"movups XMMWORD PTR [rdi], xmm1"; +"movups XMMWORD PTR [rdi+16], xmm0"; +"ret"; +"_Z20fiat_25519_selectznzPmhPKmS1_:"; +"mov r8, rdx"; +"cmp sil, 1"; +"push rbp"; +"sbb rdx, rdx"; +"mov r9, QWORD PTR [r8+8]"; +"xor eax, eax"; +"push rbx"; +"test sil, sil"; +"mov rbx, rax"; +"cmovne rbx, QWORD PTR [rcx+8]"; +"mov r11, rax"; +"and r9, rdx"; +"mov r10, rax"; +"mov rbp, QWORD PTR [r8+32]"; +"or rbx, r9"; +"mov r9, QWORD PTR [r8+16]"; +"test sil, sil"; +"cmovne r11, QWORD PTR [rcx+16]"; +"and r9, rdx"; +"or r11, r9"; +"mov r9, QWORD PTR [r8+24]"; +"test sil, sil"; +"cmovne r10, QWORD PTR [rcx+24]"; +"and r9, rdx"; +"or r10, r9"; +"test sil, sil"; +"mov r9, rax"; +"cmovne r9, QWORD PTR [rcx+32]"; +"and rbp, rdx"; +"or r9, rbp"; +"test sil, sil"; +"cmovne rax, QWORD PTR [rcx]"; +"and rdx, QWORD PTR [r8]"; +"mov QWORD PTR [rdi+8], rbx"; +"pop rbx"; +"or rax, rdx"; +"mov QWORD PTR [rdi+16], r11"; +"pop rbp"; +"mov QWORD PTR [rdi], rax"; +"mov QWORD PTR [rdi+24], r10"; +"mov QWORD PTR [rdi+32], r9"; +"ret"; +"_Z19fiat_25519_to_bytesPhPKm:"; +"movabs rdx, -2251799813685247"; +"push rbp"; +"xor r9d, r9d"; +"push rbx"; +"mov rcx, QWORD PTR [rsi+8]"; +"movabs rbx, -2251799813685229"; +"add rbx, QWORD PTR [rsi]"; +"mov r11, QWORD PTR [rsi+24]"; +"mov rax, rbx"; +"sar rax, 51"; +"add r11, rdx"; +"neg eax"; +"movzx eax, al"; +"sub rcx, rax"; +"mov rax, QWORD PTR [rsi+16]"; +"add rcx, rdx"; +"mov r8, rcx"; +"add rax, rdx"; +"add rdx, QWORD PTR [rsi+32]"; +"sar r8, 51"; +"neg r8d"; +"movzx r8d, r8b"; +"sub rax, r8"; +"movabs r8, 2251799813685247"; +"mov r10, rax"; +"sar rax, 51"; +"neg eax"; +"movzx eax, al"; +"sub r11, rax"; +"mov rax, r11"; +"sar rax, 51"; +"neg eax"; +"movzx eax, al"; +"sub rdx, rax"; +"movabs rax, 2251799813685229"; +"mov rbp, rdx"; +"sar rbp, 51"; +"test bpl, bpl"; +"cmove rax, r9"; +"and rbx, r8"; +"add rax, rbx"; +"movabs rbx, 144115188075855808"; +"mov rsi, rax"; +"and rsi, r8"; +"test bpl, bpl"; +"cmovne r9, r8"; +"and rcx, r8"; +"shr rax, 51"; +"and r11, r8"; +"and rdx, r8"; +"mov DWORD PTR [rdi], esi"; +"add rcx, r9"; +"add r11, r9"; +"add rdx, r9"; +"add rcx, rax"; +"mov rax, r10"; +"and rax, r8"; +"mov r10, rcx"; +"sal rcx, 3"; +"shr r10, 51"; +"add rax, r9"; +"add rax, r10"; +"mov r10, rax"; +"sal rax, 6"; +"shr r10, 51"; +"and rax, rbx"; +"add r11, r10"; +"movabs r10, 18014398509481976"; +"and rcx, r10"; +"mov r10, rsi"; +"mov rbx, r11"; +"shr r11, 51"; +"shr r10, 48"; +"and rbx, r8"; +"add rdx, r11"; +"movabs r8, 36028797018963952"; +"add r10, rcx"; +"shr rcx, 48"; +"add rax, rcx"; +"sal rdx, 4"; +"mov DWORD PTR [rdi+6], r10d"; +"mov rcx, rax"; +"and rdx, r8"; +"mov DWORD PTR [rdi+12], eax"; +"shr rcx, 56"; +"lea rcx, [rcx+rbx*2]"; +"pop rbx"; +"pop rbp"; +"mov r8, rcx"; +"mov DWORD PTR [rdi+19], ecx"; +"shr r8, 48"; +"add rdx, r8"; +"mov r8, rsi"; +"shr rsi, 40"; +"mov BYTE PTR [rdi+5], sil"; +"mov rsi, r10"; +"shr r8, 32"; +"shr rsi, 32"; +"mov DWORD PTR [rdi+25], edx"; +"shr r10, 40"; +"mov BYTE PTR [rdi+10], sil"; +"mov rsi, rax"; +"shr rsi, 32"; +"mov BYTE PTR [rdi+4], r8b"; +"mov BYTE PTR [rdi+16], sil"; +"mov rsi, rax"; +"shr rax, 48"; +"mov BYTE PTR [rdi+18], al"; +"mov rax, rcx"; +"shr rsi, 40"; +"shr rax, 32"; +"shr rcx, 40"; +"mov BYTE PTR [rdi+11], r10b"; +"mov BYTE PTR [rdi+23], al"; +"mov rax, rdx"; +"shr rax, 32"; +"mov BYTE PTR [rdi+17], sil"; +"mov BYTE PTR [rdi+29], al"; +"mov rax, rdx"; +"shr rdx, 48"; +"shr rax, 40"; +"mov BYTE PTR [rdi+24], cl"; +"mov BYTE PTR [rdi+30], al"; +"mov BYTE PTR [rdi+31], dl"; +"ret"; +"_Z21fiat_25519_from_bytesPmPKh:"; +"mov r8, rdi"; +"movzx edx, BYTE PTR [rsi+5]"; +"movzx edi, BYTE PTR [rsi+6]"; +"mov rax, rsi"; +"movzx ecx, BYTE PTR [rax+18]"; +"movzx r10d, BYTE PTR [rax+30]"; +"sal rdx, 40"; +"sal rdi, 48"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi]"; +"sal rcx, 42"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+4]"; +"sal rdx, 32"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+3]"; +"sal rdx, 24"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+2]"; +"sal rdx, 16"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+1]"; +"movzx esi, BYTE PTR [rsi+12]"; +"sal rdx, 8"; +"sal rsi, 45"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rax+11]"; +"sal rdx, 37"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+10]"; +"sal rdx, 29"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+9]"; +"sal rdx, 21"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+8]"; +"sal rdx, 13"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+7]"; +"sal rdx, 5"; +"add rsi, rdx"; +"mov rdx, rdi"; +"shr rdx, 51"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+19]"; +"sal rdx, 50"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+17]"; +"sal rcx, 34"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+16]"; +"sal rcx, 26"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+15]"; +"sal rcx, 18"; +"sal r10, 36"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+14]"; +"sal rcx, 10"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+13]"; +"lea r9, [rdx+rcx*4]"; +"mov rdx, rsi"; +"movzx ecx, BYTE PTR [rax+24]"; +"shr rdx, 51"; +"add r9, rdx"; +"movzx edx, BYTE PTR [rax+25]"; +"sal rcx, 39"; +"sal rdx, 47"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+23]"; +"sal rcx, 31"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+22]"; +"sal rcx, 23"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+21]"; +"sal rcx, 15"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+20]"; +"sal rcx, 7"; +"add rdx, rcx"; +"mov rcx, r9"; +"shr rcx, 51"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+31]"; +"sal rcx, 44"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+29]"; +"sal r10, 28"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+28]"; +"sal r10, 20"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+27]"; +"movzx eax, BYTE PTR [rax+26]"; +"sal r10, 12"; +"sal rax, 4"; +"add rcx, r10"; +"add rax, rcx"; +"mov rcx, rdx"; +"shr rcx, 51"; +"add rax, rcx"; +"movabs rcx, 2251799813685247"; +"and rdi, rcx"; +"and rsi, rcx"; +"and r9, rcx"; +"and rdx, rcx"; +"mov QWORD PTR [r8], rdi"; +"mov QWORD PTR [r8+8], rsi"; +"mov QWORD PTR [r8+16], r9"; +"mov QWORD PTR [r8+24], rdx"; +"mov QWORD PTR [r8+32], rax"; +"ret"; +".LC1:"; +".quad 4503599627370458"; +""]. diff --git a/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O3.v b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O3.v new file mode 100644 index 0000000000..f7562889bd --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O3.v @@ -0,0 +1,856 @@ +From Coq Require Import String List. +Import ListNotations. +Local Open Scope string_scope. +Local Open Scope list_scope. +Example example : list string := [ +"_Z24fiat_25519_addcarryx_u51PmPhhmm:"; +"movabs rax, 2251799813685247"; +"add rcx, r8"; +"movzx edx, dl"; +"add rcx, rdx"; +"and rax, rcx"; +"shr rcx, 51"; +"mov QWORD PTR [rdi], rax"; +"mov BYTE PTR [rsi], cl"; +"ret"; +"_Z25fiat_25519_subborrowx_u51PmPhhmm:"; +"movabs rax, 2251799813685247"; +"movzx edx, dl"; +"sub rcx, rdx"; +"sub rcx, r8"; +"and rax, rcx"; +"sar rcx, 51"; +"neg ecx"; +"mov QWORD PTR [rdi], rax"; +"mov BYTE PTR [rsi], cl"; +"ret"; +"_Z22fiat_25519_cmovznz_u64Pmhmm:"; +"cmp sil, 1"; +"sbb rax, rax"; +"and rax, rdx"; +"xor edx, edx"; +"test sil, sil"; +"cmove rcx, rdx"; +"or rax, rcx"; +"mov QWORD PTR [rdi], rax"; +"ret"; +"_Z20fiat_25519_carry_mulPmPKmS1_:"; +"push r15"; +"mov rcx, rsi"; +"mov rax, rdx"; +"push r14"; +"push r13"; +"push r12"; +"xor r12d, r12d"; +"push rbp"; +"mov rbp, rdi"; +"push rbx"; +"sub rsp, 16"; +"mov r11, QWORD PTR [rcx+24]"; +"mov r15, QWORD PTR [rdx+32]"; +"mov rbx, QWORD PTR [rsi+32]"; +"mov r14, QWORD PTR [rax+24]"; +"xor esi, esi"; +"mov QWORD PTR [rsp-48], r12"; +"mov QWORD PTR [rsp-56], r11"; +"mov r11, QWORD PTR [rcx+16]"; +"lea rdx, [r15+r15*8]"; +"xor r12d, r12d"; +"mov QWORD PTR [rsp-104], rbx"; +"mov rbx, QWORD PTR [rax+16]"; +"lea rdi, [r15+rdx*2]"; +"lea rdx, [r14+r14*8]"; +"mov r10, QWORD PTR [rax]"; +"mov QWORD PTR [rsp-96], rsi"; +"lea r8, [r14+rdx*2]"; +"mov rsi, QWORD PTR [rax+8]"; +"mov rax, QWORD PTR [rcx]"; +"mov QWORD PTR [rsp-72], r11"; +"lea rdx, [rbx+rbx*8]"; +"mov r11, QWORD PTR [rcx+8]"; +"mov QWORD PTR [rsp-64], r12"; +"xor r12d, r12d"; +"lea r9, [rbx+rdx*2]"; +"mov QWORD PTR [rsp-80], r12"; +"xor edx, edx"; +"mov QWORD PTR [rsp-88], r11"; +"xor r11d, r11d"; +"mov QWORD PTR [rsp-8], rax"; +"lea rax, [rsi+rsi*8]"; +"mov QWORD PTR [rsp], rdx"; +"lea rax, [rsi+rax*2]"; +"mul QWORD PTR [rcx+32]"; +"mov QWORD PTR [rsp-120], r10"; +"mov QWORD PTR [rsp-112], r11"; +"mov r12, rax"; +"mov r13, rdx"; +"mov rax, r9"; +"mul QWORD PTR [rcx+24]"; +"add r12, rax"; +"mov rax, r8"; +"adc r13, rdx"; +"mul QWORD PTR [rcx+16]"; +"add r12, rax"; +"mov rax, rdi"; +"adc r13, rdx"; +"mul QWORD PTR [rcx+8]"; +"add r12, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r13, rdx"; +"mul QWORD PTR [rcx]"; +"add r12, rax"; +"mov rax, QWORD PTR [rsp-104]"; +"adc r13, rdx"; +"mov QWORD PTR [rsp-40], r12"; +"mul r9"; +"mov QWORD PTR [rsp-32], r13"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, r8"; +"mul QWORD PTR [rcx+24]"; +"add r10, rax"; +"mov rax, rdi"; +"adc r11, rdx"; +"mul QWORD PTR [rcx+16]"; +"mov r9, r10"; +"mov r10, r11"; +"mov r11, QWORD PTR [rsp-32]"; +"add r9, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r10, rdx"; +"mul QWORD PTR [rsp-88]"; +"mov r12, r9"; +"mov r13, r10"; +"mov r10, QWORD PTR [rsp-40]"; +"add r12, rax"; +"mov rax, rsi"; +"adc r13, rdx"; +"mul QWORD PTR [rcx]"; +"add rax, r12"; +"adc rdx, r13"; +"shrd r10, r11, 51"; +"xor r11d, r11d"; +"add rax, r10"; +"mov r12, rax"; +"mov rax, QWORD PTR [rsp-104]"; +"adc rdx, r11"; +"mov r13, rdx"; +"mov QWORD PTR [rsp-24], r12"; +"mul r8"; +"mov QWORD PTR [rsp-16], r13"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, rdi"; +"mul QWORD PTR [rcx+24]"; +"add r8, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r9, rdx"; +"mul QWORD PTR [rsp-72]"; +"add r8, rax"; +"mov rax, QWORD PTR [rsp-88]"; +"adc r9, rdx"; +"mov r10, r8"; +"mov r8, r12"; +"mul rsi"; +"mov r11, r9"; +"add r10, rax"; +"mov rax, rbx"; +"adc r11, rdx"; +"mul QWORD PTR [rcx]"; +"add rax, r10"; +"adc rdx, r11"; +"shrd r8, r13, 51"; +"xor r9d, r9d"; +"add rax, r8"; +"mov r12, rax"; +"mov rax, QWORD PTR [rsp-104]"; +"adc rdx, r9"; +"mov r13, rdx"; +"mul rdi"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, QWORD PTR [rsp-120]"; +"mul QWORD PTR [rsp-56]"; +"add r10, rax"; +"mov rax, QWORD PTR [rsp-72]"; +"adc r11, rdx"; +"mul rsi"; +"add r10, rax"; +"mov rax, QWORD PTR [rsp-88]"; +"adc r11, rdx"; +"mul rbx"; +"add r10, rax"; +"mov rax, r14"; +"adc r11, rdx"; +"mul QWORD PTR [rcx]"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, r12"; +"add r8, r10"; +"adc r9, r11"; +"shrd rax, r13, 51"; +"xor r11d, r11d"; +"add r8, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r9, r11"; +"mul QWORD PTR [rsp-104]"; +"mov r10, rax"; +"mov rax, QWORD PTR [rsp-56]"; +"mov r11, rdx"; +"mul rsi"; +"add r10, rax"; +"mov rax, QWORD PTR [rsp-72]"; +"adc r11, rdx"; +"mov rcx, r10"; +"mul rbx"; +"mov rbx, r11"; +"add rcx, rax"; +"mov rax, QWORD PTR [rsp-88]"; +"adc rbx, rdx"; +"mul r14"; +"add rcx, rax"; +"mov rax, QWORD PTR [rsp-8]"; +"adc rbx, rdx"; +"mul r15"; +"add rax, rcx"; +"mov rcx, r8"; +"adc rdx, rbx"; +"shrd rcx, r9, 51"; +"xor ebx, ebx"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov rcx, rax"; +"shrd rcx, rdx, 51"; +"lea rdx, [rcx+rcx*8]"; +"lea rsi, [rcx+rdx*2]"; +"mov rdx, QWORD PTR [rsp-40]"; +"movabs rcx, 2251799813685247"; +"and r12, rcx"; +"and r8, rcx"; +"and rax, rcx"; +"and rdx, rcx"; +"mov QWORD PTR [rbp+24], r8"; +"add rsi, rdx"; +"mov rdx, QWORD PTR [rsp-24]"; +"mov QWORD PTR [rbp+32], rax"; +"mov rdi, rsi"; +"and rsi, rcx"; +"and rdx, rcx"; +"shr rdi, 51"; +"mov QWORD PTR [rbp+0], rsi"; +"add rdx, rdi"; +"mov rsi, rdx"; +"shr rdx, 51"; +"add rdx, r12"; +"and rsi, rcx"; +"mov QWORD PTR [rbp+8], rsi"; +"mov QWORD PTR [rbp+16], rdx"; +"add rsp, 16"; +"pop rbx"; +"pop rbp"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"ret"; +"_Z23fiat_25519_carry_squarePmPKm:"; +"push r15"; +"xor edx, edx"; +"push r14"; +"push r13"; +"push r12"; +"push rbp"; +"push rbx"; +"mov r12, QWORD PTR [rsi+32]"; +"mov rbx, rdi"; +"mov r8, QWORD PTR [rsi+24]"; +"mov rcx, QWORD PTR [rsi+8]"; +"lea rax, [r12+r12*8]"; +"mov rbp, QWORD PTR [rsi+16]"; +"lea r13, [r12+rax*2]"; +"lea rax, [r8+r8]"; +"mov QWORD PTR [rsp-48], rdx"; +"mov QWORD PTR [rsp-24], rax"; +"mov rax, QWORD PTR [rsi]"; +"lea r9, [r13+r13]"; +"lea rdi, [rbp+rbp]"; +"mov QWORD PTR [rsp-16], rdi"; +"mov QWORD PTR [rsp-56], rax"; +"lea rax, [r8+r8*8]"; +"lea rsi, [r8+rax*2]"; +"lea r14, [rsi+rsi]"; +"mov rax, r14"; +"mov r14, QWORD PTR [rsp-56]"; +"mul rbp"; +"mov r10, rax"; +"mov rax, r9"; +"mov r11, rdx"; +"mul rcx"; +"add r10, rax"; +"mov rax, r14"; +"adc r11, rdx"; +"mul QWORD PTR [rsp-56]"; +"mov r14, r10"; +"mov r15, r11"; +"add r14, rax"; +"mov rax, rsi"; +"lea rsi, [rcx+rcx]"; +"adc r15, rdx"; +"mul r8"; +"mov QWORD PTR [rsp-40], r14"; +"mov QWORD PTR [rsp-32], r15"; +"mov r10, rax"; +"mov rax, r9"; +"mov r11, rdx"; +"mul rbp"; +"add r10, rax"; +"mov rax, rsi"; +"adc r11, rdx"; +"mul QWORD PTR [rsp-56]"; +"mov rsi, rax"; +"mov rdi, rdx"; +"mov rax, r9"; +"add rsi, r10"; +"mov r10, r14"; +"adc rdi, r11"; +"shrd r10, r15, 51"; +"xor edx, edx"; +"add rsi, r10"; +"adc rdi, rdx"; +"mul r8"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, QWORD PTR [rsp-16]"; +"mul QWORD PTR [rsp-56]"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, rcx"; +"add r10, r8"; +"mov r8, rsi"; +"adc r11, r9"; +"mul rcx"; +"add r10, rax"; +"mov rax, r13"; +"adc r11, rdx"; +"shrd r8, rdi, 51"; +"xor edx, edx"; +"add r10, r8"; +"adc r11, rdx"; +"mul r12"; +"mov r13, r10"; +"mov r14, rax"; +"mov rax, QWORD PTR [rsp-16]"; +"mov r15, rdx"; +"mul rcx"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, QWORD PTR [rsp-24]"; +"add r8, r14"; +"adc r9, r15"; +"mul QWORD PTR [rsp-56]"; +"add r8, rax"; +"adc r9, rdx"; +"shrd r13, r11, 51"; +"xor edx, edx"; +"add r8, r13"; +"adc r9, rdx"; +"add r12, r12"; +"mov rax, r12"; +"mul QWORD PTR [rsp-56]"; +"mov r12, rax"; +"mov rax, QWORD PTR [rsp-24]"; +"mov r13, rdx"; +"mul rcx"; +"add r12, rax"; +"mov rax, rbp"; +"adc r13, rdx"; +"mul rbp"; +"movabs rbp, 2251799813685247"; +"add rax, r12"; +"mov r12, r8"; +"adc rdx, r13"; +"shrd r12, r9, 51"; +"xor r13d, r13d"; +"add rax, r12"; +"adc rdx, r13"; +"mov rcx, rax"; +"and rsi, rbp"; +"and r10, rbp"; +"shrd rcx, rdx, 51"; +"and r8, rbp"; +"and rax, rbp"; +"lea rdx, [rcx+rcx*8]"; +"mov QWORD PTR [rbx+24], r8"; +"lea rdx, [rcx+rdx*2]"; +"mov rcx, QWORD PTR [rsp-40]"; +"mov QWORD PTR [rbx+32], rax"; +"and rcx, rbp"; +"add rdx, rcx"; +"mov rcx, rdx"; +"and rdx, rbp"; +"shr rcx, 51"; +"mov QWORD PTR [rbx], rdx"; +"add rsi, rcx"; +"mov rdx, rsi"; +"shr rsi, 51"; +"and rdx, rbp"; +"add rsi, r10"; +"mov QWORD PTR [rbx+8], rdx"; +"mov QWORD PTR [rbx+16], rsi"; +"pop rbx"; +"pop rbp"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"ret"; +"_Z29fiat_25519_carry_scmul_121666PmPKm:"; +"push r15"; +"mov r11d, 121666"; +"mov r10, rsi"; +"mov rcx, rdi"; +"push r14"; +"push r13"; +"push r12"; +"mov r14, QWORD PTR [rsi]"; +"mov rax, r14"; +"mul r11"; +"mov r14, rax"; +"mov rax, QWORD PTR [rsi+8]"; +"mov r15, rdx"; +"mov r8, r14"; +"mov r9, r15"; +"mul r11"; +"shrd r8, r15, 51"; +"shr r9, 51"; +"add r8, rax"; +"mov rax, QWORD PTR [rsi+16]"; +"adc r9, rdx"; +"mov rsi, r8"; +"mul r11"; +"mov rdi, r9"; +"shrd rsi, r9, 51"; +"shr rdi, 51"; +"add rsi, rax"; +"mov rax, QWORD PTR [r10+24]"; +"adc rdi, rdx"; +"mov QWORD PTR [rsp-24], rsi"; +"mul r11"; +"shrd rsi, rdi, 51"; +"mov QWORD PTR [rsp-16], rdi"; +"shr rdi, 51"; +"mov r12, rsi"; +"mov r13, rdi"; +"mov rsi, QWORD PTR [rsp-24]"; +"add r12, rax"; +"mov rax, QWORD PTR [r10+32]"; +"adc r13, rdx"; +"mov r10, r12"; +"mul r11"; +"shrd r10, r13, 51"; +"mov r11, r13"; +"shr r11, 51"; +"add r10, rax"; +"adc r11, rdx"; +"mov rdi, r10"; +"mov rax, r10"; +"shrd rdi, r11, 51"; +"lea rdx, [rdi+rdi*8]"; +"lea rdx, [rdi+rdx*2]"; +"movabs rdi, 2251799813685247"; +"and r14, rdi"; +"and r8, rdi"; +"and rsi, rdi"; +"and r12, rdi"; +"add r14, rdx"; +"and rax, rdi"; +"mov QWORD PTR [rcx+24], r12"; +"pop r12"; +"mov rdx, r14"; +"and r14, rdi"; +"pop r13"; +"mov QWORD PTR [rcx+32], rax"; +"shr rdx, 51"; +"mov QWORD PTR [rcx], r14"; +"pop r14"; +"add r8, rdx"; +"pop r15"; +"mov rdx, r8"; +"shr r8, 51"; +"and rdx, rdi"; +"add r8, rsi"; +"mov QWORD PTR [rcx+8], rdx"; +"mov QWORD PTR [rcx+16], r8"; +"ret"; +"_Z16fiat_25519_carryPmPKm:"; +"mov rax, QWORD PTR [rsi]"; +"mov rdx, rdi"; +"mov r9, rax"; +"shr r9, 51"; +"add r9, QWORD PTR [rsi+8]"; +"mov rdi, r9"; +"shr rdi, 51"; +"add rdi, QWORD PTR [rsi+16]"; +"mov r10, rdi"; +"shr r10, 51"; +"add r10, QWORD PTR [rsi+24]"; +"mov rcx, r10"; +"shr rcx, 51"; +"add rcx, QWORD PTR [rsi+32]"; +"mov rsi, rcx"; +"shr rcx, 51"; +"lea r8, [rcx+rcx*8]"; +"lea r8, [rcx+r8*2]"; +"movabs rcx, 2251799813685247"; +"and rax, rcx"; +"and r9, rcx"; +"and rdi, rcx"; +"and r10, rcx"; +"add r8, rax"; +"and rsi, rcx"; +"mov QWORD PTR [rdx+24], r10"; +"mov rax, r8"; +"and r8, rcx"; +"mov QWORD PTR [rdx+32], rsi"; +"shr rax, 51"; +"mov QWORD PTR [rdx], r8"; +"add rax, r9"; +"mov r8, rax"; +"shr rax, 51"; +"and r8, rcx"; +"add rax, rdi"; +"mov QWORD PTR [rdx+8], r8"; +"mov QWORD PTR [rdx+16], rax"; +"ret"; +"_Z14fiat_25519_addPmPKmS1_:"; +"movdqu xmm0, XMMWORD PTR [rsi+16]"; +"movdqu xmm3, XMMWORD PTR [rdx+16]"; +"movdqu xmm1, XMMWORD PTR [rsi]"; +"movdqu xmm2, XMMWORD PTR [rdx]"; +"mov rax, QWORD PTR [rdx+32]"; +"paddq xmm0, xmm3"; +"add rax, QWORD PTR [rsi+32]"; +"paddq xmm1, xmm2"; +"mov QWORD PTR [rdi+32], rax"; +"movups XMMWORD PTR [rdi], xmm1"; +"movups XMMWORD PTR [rdi+16], xmm0"; +"ret"; +"_Z14fiat_25519_subPmPKmS1_:"; +"movdqu xmm0, XMMWORD PTR [rsi+16]"; +"movdqu xmm3, XMMWORD PTR [rdx+16]"; +"movabs rax, 4503599627370494"; +"movq xmm1, rax"; +"movdqu xmm2, XMMWORD PTR [rdx]"; +"add rax, QWORD PTR [rsi+32]"; +"punpcklqdq xmm1, xmm1"; +"psubq xmm0, xmm3"; +"sub rax, QWORD PTR [rdx+32]"; +"paddq xmm0, xmm1"; +"movdqu xmm1, XMMWORD PTR [rsi]"; +"mov QWORD PTR [rdi+32], rax"; +"movups XMMWORD PTR [rdi+16], xmm0"; +"psubq xmm1, xmm2"; +"paddq xmm1, XMMWORD PTR .LC1[rip]"; +"movups XMMWORD PTR [rdi], xmm1"; +"ret"; +"_Z14fiat_25519_oppPmPKm:"; +"movabs rax, 4503599627370494"; +"movdqu xmm3, XMMWORD PTR [rsi+16]"; +"movdqu xmm2, XMMWORD PTR [rsi]"; +"movq xmm0, rax"; +"movdqa xmm1, XMMWORD PTR .LC1[rip]"; +"sub rax, QWORD PTR [rsi+32]"; +"punpcklqdq xmm0, xmm0"; +"mov QWORD PTR [rdi+32], rax"; +"psubq xmm0, xmm3"; +"psubq xmm1, xmm2"; +"movups XMMWORD PTR [rdi], xmm1"; +"movups XMMWORD PTR [rdi+16], xmm0"; +"ret"; +"_Z20fiat_25519_selectznzPmhPKmS1_:"; +"mov r8, rdx"; +"cmp sil, 1"; +"push rbp"; +"sbb rdx, rdx"; +"mov r9, QWORD PTR [r8+8]"; +"xor eax, eax"; +"push rbx"; +"test sil, sil"; +"mov rbx, rax"; +"cmovne rbx, QWORD PTR [rcx+8]"; +"mov r11, rax"; +"and r9, rdx"; +"mov r10, rax"; +"mov rbp, QWORD PTR [r8+32]"; +"or rbx, r9"; +"mov r9, QWORD PTR [r8+16]"; +"test sil, sil"; +"cmovne r11, QWORD PTR [rcx+16]"; +"and r9, rdx"; +"or r11, r9"; +"mov r9, QWORD PTR [r8+24]"; +"test sil, sil"; +"cmovne r10, QWORD PTR [rcx+24]"; +"and r9, rdx"; +"or r10, r9"; +"test sil, sil"; +"mov r9, rax"; +"cmovne r9, QWORD PTR [rcx+32]"; +"and rbp, rdx"; +"or r9, rbp"; +"test sil, sil"; +"cmovne rax, QWORD PTR [rcx]"; +"and rdx, QWORD PTR [r8]"; +"mov QWORD PTR [rdi+8], rbx"; +"pop rbx"; +"or rax, rdx"; +"mov QWORD PTR [rdi+16], r11"; +"pop rbp"; +"mov QWORD PTR [rdi], rax"; +"mov QWORD PTR [rdi+24], r10"; +"mov QWORD PTR [rdi+32], r9"; +"ret"; +"_Z19fiat_25519_to_bytesPhPKm:"; +"movabs rdx, -2251799813685247"; +"push rbp"; +"xor r9d, r9d"; +"push rbx"; +"mov rcx, QWORD PTR [rsi+8]"; +"movabs rbx, -2251799813685229"; +"add rbx, QWORD PTR [rsi]"; +"mov r11, QWORD PTR [rsi+24]"; +"mov rax, rbx"; +"sar rax, 51"; +"add r11, rdx"; +"neg eax"; +"movzx eax, al"; +"sub rcx, rax"; +"mov rax, QWORD PTR [rsi+16]"; +"add rcx, rdx"; +"mov r8, rcx"; +"add rax, rdx"; +"add rdx, QWORD PTR [rsi+32]"; +"sar r8, 51"; +"neg r8d"; +"movzx r8d, r8b"; +"sub rax, r8"; +"movabs r8, 2251799813685247"; +"mov r10, rax"; +"sar rax, 51"; +"neg eax"; +"movzx eax, al"; +"sub r11, rax"; +"mov rax, r11"; +"sar rax, 51"; +"neg eax"; +"movzx eax, al"; +"sub rdx, rax"; +"movabs rax, 2251799813685229"; +"mov rbp, rdx"; +"sar rbp, 51"; +"test bpl, bpl"; +"cmove rax, r9"; +"and rbx, r8"; +"add rax, rbx"; +"movabs rbx, 144115188075855808"; +"mov rsi, rax"; +"and rsi, r8"; +"test bpl, bpl"; +"cmovne r9, r8"; +"and rcx, r8"; +"shr rax, 51"; +"and r11, r8"; +"and rdx, r8"; +"mov DWORD PTR [rdi], esi"; +"add rcx, r9"; +"add r11, r9"; +"add rdx, r9"; +"add rcx, rax"; +"mov rax, r10"; +"and rax, r8"; +"mov r10, rcx"; +"sal rcx, 3"; +"shr r10, 51"; +"add rax, r9"; +"add rax, r10"; +"mov r10, rax"; +"sal rax, 6"; +"shr r10, 51"; +"and rax, rbx"; +"add r11, r10"; +"movabs r10, 18014398509481976"; +"and rcx, r10"; +"mov r10, rsi"; +"mov rbx, r11"; +"shr r11, 51"; +"shr r10, 48"; +"and rbx, r8"; +"add rdx, r11"; +"movabs r8, 36028797018963952"; +"add r10, rcx"; +"shr rcx, 48"; +"add rax, rcx"; +"sal rdx, 4"; +"mov DWORD PTR [rdi+6], r10d"; +"mov rcx, rax"; +"and rdx, r8"; +"mov DWORD PTR [rdi+12], eax"; +"shr rcx, 56"; +"lea rcx, [rcx+rbx*2]"; +"pop rbx"; +"pop rbp"; +"mov r8, rcx"; +"mov DWORD PTR [rdi+19], ecx"; +"shr r8, 48"; +"add rdx, r8"; +"mov r8, rsi"; +"shr rsi, 40"; +"mov BYTE PTR [rdi+5], sil"; +"mov rsi, r10"; +"shr r8, 32"; +"shr rsi, 32"; +"mov DWORD PTR [rdi+25], edx"; +"shr r10, 40"; +"mov BYTE PTR [rdi+10], sil"; +"mov rsi, rax"; +"shr rsi, 32"; +"mov BYTE PTR [rdi+4], r8b"; +"mov BYTE PTR [rdi+16], sil"; +"mov rsi, rax"; +"shr rax, 48"; +"mov BYTE PTR [rdi+18], al"; +"mov rax, rcx"; +"shr rsi, 40"; +"shr rax, 32"; +"shr rcx, 40"; +"mov BYTE PTR [rdi+11], r10b"; +"mov BYTE PTR [rdi+23], al"; +"mov rax, rdx"; +"shr rax, 32"; +"mov BYTE PTR [rdi+17], sil"; +"mov BYTE PTR [rdi+29], al"; +"mov rax, rdx"; +"shr rdx, 48"; +"shr rax, 40"; +"mov BYTE PTR [rdi+24], cl"; +"mov BYTE PTR [rdi+30], al"; +"mov BYTE PTR [rdi+31], dl"; +"ret"; +"_Z21fiat_25519_from_bytesPmPKh:"; +"mov r8, rdi"; +"movzx edx, BYTE PTR [rsi+5]"; +"movzx edi, BYTE PTR [rsi+6]"; +"mov rax, rsi"; +"movzx ecx, BYTE PTR [rax+18]"; +"movzx r10d, BYTE PTR [rax+30]"; +"sal rdx, 40"; +"sal rdi, 48"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi]"; +"sal rcx, 42"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+4]"; +"sal rdx, 32"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+3]"; +"sal rdx, 24"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+2]"; +"sal rdx, 16"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+1]"; +"movzx esi, BYTE PTR [rsi+12]"; +"sal rdx, 8"; +"sal rsi, 45"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rax+11]"; +"sal rdx, 37"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+10]"; +"sal rdx, 29"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+9]"; +"sal rdx, 21"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+8]"; +"sal rdx, 13"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+7]"; +"sal rdx, 5"; +"add rsi, rdx"; +"mov rdx, rdi"; +"shr rdx, 51"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+19]"; +"sal rdx, 50"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+17]"; +"sal rcx, 34"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+16]"; +"sal rcx, 26"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+15]"; +"sal rcx, 18"; +"sal r10, 36"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+14]"; +"sal rcx, 10"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+13]"; +"lea r9, [rdx+rcx*4]"; +"mov rdx, rsi"; +"movzx ecx, BYTE PTR [rax+24]"; +"shr rdx, 51"; +"add r9, rdx"; +"movzx edx, BYTE PTR [rax+25]"; +"sal rcx, 39"; +"sal rdx, 47"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+23]"; +"sal rcx, 31"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+22]"; +"sal rcx, 23"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+21]"; +"sal rcx, 15"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+20]"; +"sal rcx, 7"; +"add rdx, rcx"; +"mov rcx, r9"; +"shr rcx, 51"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+31]"; +"sal rcx, 44"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+29]"; +"sal r10, 28"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+28]"; +"sal r10, 20"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+27]"; +"movzx eax, BYTE PTR [rax+26]"; +"sal r10, 12"; +"sal rax, 4"; +"add rcx, r10"; +"add rax, rcx"; +"mov rcx, rdx"; +"shr rcx, 51"; +"add rax, rcx"; +"movabs rcx, 2251799813685247"; +"and rdi, rcx"; +"and rsi, rcx"; +"and r9, rcx"; +"and rdx, rcx"; +"mov QWORD PTR [r8], rdi"; +"mov QWORD PTR [r8+8], rsi"; +"mov QWORD PTR [r8+16], r9"; +"mov QWORD PTR [r8+24], rdx"; +"mov QWORD PTR [r8+32], rax"; +"ret"; +".LC1:"; +".quad 4503599627370458"; +""]. diff --git a/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_Os.v b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_Os.v new file mode 100644 index 0000000000..f28a5def1a --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_Os.v @@ -0,0 +1,848 @@ +From Coq Require Import String List. +Import ListNotations. +Local Open Scope string_scope. +Local Open Scope list_scope. +Example example : list string := [ +"_Z24fiat_25519_addcarryx_u51PmPhhmm:"; +"movabs rax, 2251799813685247"; +"add rcx, r8"; +"movzx edx, dl"; +"add rcx, rdx"; +"and rax, rcx"; +"shr rcx, 51"; +"mov QWORD PTR [rdi], rax"; +"mov BYTE PTR [rsi], cl"; +"ret"; +"_Z25fiat_25519_subborrowx_u51PmPhhmm:"; +"movabs rax, 2251799813685247"; +"movzx edx, dl"; +"sub rcx, rdx"; +"sub rcx, r8"; +"and rax, rcx"; +"sar rcx, 51"; +"neg ecx"; +"mov QWORD PTR [rdi], rax"; +"mov BYTE PTR [rsi], cl"; +"ret"; +"_Z22fiat_25519_cmovznz_u64Pmhmm:"; +"cmp sil, 1"; +"sbb rax, rax"; +"and rax, rdx"; +"xor edx, edx"; +"test sil, sil"; +"cmove rcx, rdx"; +"or rax, rcx"; +"mov QWORD PTR [rdi], rax"; +"ret"; +"_Z20fiat_25519_carry_mulPmPKmS1_:"; +"push r15"; +"mov rcx, rsi"; +"push r14"; +"push r13"; +"push r12"; +"xor r12d, r12d"; +"push rbp"; +"push rbx"; +"sub rsp, 32"; +"mov r11, QWORD PTR [rcx+24]"; +"mov rbx, QWORD PTR [rsi+32]"; +"xor esi, esi"; +"mov rax, QWORD PTR [rdx]"; +"mov rbp, QWORD PTR [rdx+16]"; +"mov QWORD PTR [rsp-48], r12"; +"xor r12d, r12d"; +"mov r14, QWORD PTR [rdx+24]"; +"mov r15, QWORD PTR [rdx+32]"; +"mov QWORD PTR [rsp-56], r11"; +"mov r11, QWORD PTR [rcx+16]"; +"mov QWORD PTR [rsp-104], rbx"; +"imul r9, rbp, 19"; +"mov rbx, QWORD PTR [rdx+8]"; +"mov QWORD PTR [rsp-64], r12"; +"xor edx, edx"; +"xor r12d, r12d"; +"mov QWORD PTR [rsp-72], r11"; +"mov r11, QWORD PTR [rcx+8]"; +"imul r8, r14, 19"; +"mov QWORD PTR [rsp-96], rsi"; +"imul rsi, r15, 19"; +"mov QWORD PTR [rsp-88], r11"; +"mov QWORD PTR [rsp-80], r12"; +"mov QWORD PTR [rsp-120], rax"; +"mov QWORD PTR [rsp-112], rdx"; +"mov rax, QWORD PTR [rcx]"; +"xor edx, edx"; +"mov QWORD PTR [rsp+16], rdx"; +"mov QWORD PTR [rsp+8], rax"; +"imul rax, rbx, 19"; +"mul QWORD PTR [rcx+32]"; +"mov r12, rax"; +"mov r13, rdx"; +"mov rax, r9"; +"mul QWORD PTR [rcx+24]"; +"add r12, rax"; +"mov rax, r8"; +"adc r13, rdx"; +"mul QWORD PTR [rcx+16]"; +"add r12, rax"; +"mov rax, rsi"; +"adc r13, rdx"; +"mul QWORD PTR [rcx+8]"; +"add r12, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r13, rdx"; +"mul QWORD PTR [rcx]"; +"add r12, rax"; +"mov rax, QWORD PTR [rsp-104]"; +"adc r13, rdx"; +"mov QWORD PTR [rsp-40], r12"; +"mul r9"; +"mov QWORD PTR [rsp-32], r13"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, r8"; +"mul QWORD PTR [rcx+24]"; +"add r10, rax"; +"mov rax, rsi"; +"adc r11, rdx"; +"mul QWORD PTR [rcx+16]"; +"add r10, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r11, rdx"; +"mul QWORD PTR [rsp-88]"; +"mov r12, r10"; +"mov r10, QWORD PTR [rsp-40]"; +"mov r13, r11"; +"mov r11, QWORD PTR [rsp-32]"; +"add r12, rax"; +"mov rax, rbx"; +"adc r13, rdx"; +"mul QWORD PTR [rcx]"; +"add rax, r12"; +"adc rdx, r13"; +"shrd r10, r11, 51"; +"xor r11d, r11d"; +"add rax, r10"; +"mov QWORD PTR [rsp-24], rax"; +"mov rax, QWORD PTR [rsp-104]"; +"adc rdx, r11"; +"mov QWORD PTR [rsp-16], rdx"; +"mul r8"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, rsi"; +"mul QWORD PTR [rcx+24]"; +"add r8, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r9, rdx"; +"mul QWORD PTR [rsp-72]"; +"add r8, rax"; +"mov rax, QWORD PTR [rsp-88]"; +"adc r9, rdx"; +"mov r10, r8"; +"mul rbx"; +"mov r11, r9"; +"mov r8, rax"; +"mov r9, rdx"; +"mov rax, rbp"; +"add r8, r10"; +"adc r9, r11"; +"mul QWORD PTR [rcx]"; +"add r8, rax"; +"mov rax, QWORD PTR [rsp-24]"; +"adc r9, rdx"; +"mov rdx, QWORD PTR [rsp-16]"; +"shrd rax, rdx, 51"; +"xor edx, edx"; +"add r8, rax"; +"mov rax, QWORD PTR [rsp-104]"; +"adc r9, rdx"; +"mov QWORD PTR [rsp-8], r8"; +"mul rsi"; +"mov QWORD PTR [rsp], r9"; +"movabs rsi, 2251799813685247"; +"mov r12, rax"; +"mov r13, rdx"; +"mov rax, QWORD PTR [rsp-120]"; +"mul QWORD PTR [rsp-56]"; +"add r12, rax"; +"mov rax, QWORD PTR [rsp-72]"; +"adc r13, rdx"; +"mul rbx"; +"add r12, rax"; +"mov rax, QWORD PTR [rsp-88]"; +"adc r13, rdx"; +"mul rbp"; +"add r12, rax"; +"mov rax, r14"; +"adc r13, rdx"; +"mul QWORD PTR [rcx]"; +"mov r10, rax"; +"mov r11, rdx"; +"mov rax, r8"; +"mov r8, QWORD PTR [rsp-8]"; +"add r10, r12"; +"adc r11, r13"; +"shrd rax, r9, 51"; +"xor edx, edx"; +"add r10, rax"; +"mov rax, QWORD PTR [rsp-120]"; +"adc r11, rdx"; +"mul QWORD PTR [rsp-104]"; +"mov r12, rax"; +"mov rax, QWORD PTR [rsp-56]"; +"mov r13, rdx"; +"mov rcx, r12"; +"mul rbx"; +"mov rbx, r13"; +"add rcx, rax"; +"mov rax, QWORD PTR [rsp-72]"; +"adc rbx, rdx"; +"mul rbp"; +"add rcx, rax"; +"mov rax, QWORD PTR [rsp-88]"; +"adc rbx, rdx"; +"mul r14"; +"add rcx, rax"; +"mov rax, QWORD PTR [rsp+8]"; +"adc rbx, rdx"; +"mul r15"; +"add rax, rcx"; +"mov rcx, r10"; +"adc rdx, rbx"; +"shrd rcx, r11, 51"; +"xor ebx, ebx"; +"add rax, rcx"; +"adc rdx, rbx"; +"mov r14, rax"; +"and r8, rsi"; +"and r10, rsi"; +"shrd rax, rdx, 51"; +"mov rdx, QWORD PTR [rsp-40]"; +"mov QWORD PTR [rdi+24], r10"; +"imul rcx, rax, 19"; +"mov rax, r14"; +"and rdx, rsi"; +"and rax, rsi"; +"mov QWORD PTR [rdi+32], rax"; +"add rcx, rdx"; +"mov rdx, QWORD PTR [rsp-24]"; +"mov r9, rcx"; +"and rcx, rsi"; +"and rdx, rsi"; +"shr r9, 51"; +"mov QWORD PTR [rdi], rcx"; +"add rdx, r9"; +"mov rcx, rdx"; +"shr rdx, 51"; +"and rcx, rsi"; +"add rdx, r8"; +"mov QWORD PTR [rdi+8], rcx"; +"mov QWORD PTR [rdi+16], rdx"; +"add rsp, 32"; +"pop rbx"; +"pop rbp"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"ret"; +"_Z23fiat_25519_carry_squarePmPKm:"; +"push r15"; +"mov r10, rdi"; +"push r14"; +"push r13"; +"push r12"; +"push rbp"; +"push rbx"; +"mov r8, QWORD PTR [rsi+24]"; +"mov r14, QWORD PTR [rsi]"; +"mov rcx, QWORD PTR [rsi+16]"; +"mov r11, QWORD PTR [rsi+8]"; +"mov rbx, QWORD PTR [rsi+32]"; +"imul rsi, r8, 38"; +"lea rax, [r8+r8]"; +"mov QWORD PTR [rsp-24], rax"; +"lea rax, [rcx+rcx]"; +"mov QWORD PTR [rsp-16], rax"; +"imul r9, rbx, 38"; +"mov rax, rsi"; +"mul rcx"; +"mov rsi, rax"; +"mov rax, r9"; +"mov rdi, rdx"; +"mul r11"; +"add rsi, rax"; +"mov rax, r14"; +"adc rdi, rdx"; +"mul r14"; +"add rsi, rax"; +"adc rdi, rdx"; +"mov r12, rsi"; +"imul rsi, r8, 19"; +"mov r13, rdi"; +"mov rax, rsi"; +"mul r8"; +"mov rsi, rax"; +"mov rax, r9"; +"mov rdi, rdx"; +"mul rcx"; +"add rsi, rax"; +"lea rax, [r11+r11]"; +"adc rdi, rdx"; +"mul r14"; +"add rsi, rax"; +"mov rax, r12"; +"adc rdi, rdx"; +"shrd rax, r13, 51"; +"xor edx, edx"; +"add rsi, rax"; +"mov rax, r9"; +"adc rdi, rdx"; +"mul r8"; +"mov QWORD PTR [rsp-56], rsi"; +"mov QWORD PTR [rsp-48], rdi"; +"mov r8, rax"; +"mov rax, QWORD PTR [rsp-16]"; +"mov r9, rdx"; +"mul r14"; +"add r8, rax"; +"mov rax, r11"; +"adc r9, rdx"; +"mul r11"; +"add r8, rax"; +"mov rax, rsi"; +"mov rsi, QWORD PTR [rsp-56]"; +"adc r9, rdx"; +"shrd rax, rdi, 51"; +"xor edx, edx"; +"add r8, rax"; +"adc r9, rdx"; +"imul rax, rbx, 19"; +"mov QWORD PTR [rsp-40], r8"; +"mov QWORD PTR [rsp-32], r9"; +"mul rbx"; +"mov rdi, rax"; +"mov rax, QWORD PTR [rsp-16]"; +"mov rbp, rdx"; +"mul r11"; +"add rdi, rax"; +"mov rax, QWORD PTR [rsp-24]"; +"adc rbp, rdx"; +"mul r14"; +"add rdi, rax"; +"mov rax, r8"; +"mov r8, QWORD PTR [rsp-40]"; +"adc rbp, rdx"; +"shrd rax, r9, 51"; +"xor edx, edx"; +"add rdi, rax"; +"adc rbp, rdx"; +"add rbx, rbx"; +"mov rax, rbx"; +"mul r14"; +"mov r14, rax"; +"mov rax, QWORD PTR [rsp-24]"; +"mov r15, rdx"; +"mul r11"; +"add r14, rax"; +"mov rax, rcx"; +"adc r15, rdx"; +"mul rcx"; +"mov rcx, rax"; +"mov rbx, rdx"; +"mov rax, rdi"; +"add rcx, r14"; +"adc rbx, r15"; +"shrd rax, rbp, 51"; +"xor edx, edx"; +"add rcx, rax"; +"adc rbx, rdx"; +"mov rax, rcx"; +"movabs rdx, 2251799813685247"; +"shrd rax, rbx, 51"; +"and r12, rdx"; +"and rsi, rdx"; +"and r8, rdx"; +"imul rax, rax, 19"; +"and rdi, rdx"; +"and rcx, rdx"; +"add rax, r12"; +"mov r9, rax"; +"and rax, rdx"; +"shr r9, 51"; +"mov QWORD PTR [r10], rax"; +"add rsi, r9"; +"mov rax, rsi"; +"shr rsi, 51"; +"and rax, rdx"; +"add rsi, r8"; +"mov QWORD PTR [r10+8], rax"; +"mov QWORD PTR [r10+16], rsi"; +"mov QWORD PTR [r10+24], rdi"; +"pop rbx"; +"mov QWORD PTR [r10+32], rcx"; +"pop rbp"; +"pop r12"; +"pop r13"; +"pop r14"; +"pop r15"; +"ret"; +"_Z29fiat_25519_carry_scmul_121666PmPKm:"; +"push r15"; +"mov r11d, 121666"; +"mov r10, rsi"; +"mov rcx, rdi"; +"push r14"; +"push r13"; +"push r12"; +"mov r14, QWORD PTR [rsi]"; +"mov rax, r14"; +"mul r11"; +"mov r14, rax"; +"mov rax, QWORD PTR [rsi+8]"; +"mov r15, rdx"; +"mov r8, r14"; +"mov r9, r15"; +"mul r11"; +"shrd r8, r15, 51"; +"shr r9, 51"; +"add r8, rax"; +"mov rax, QWORD PTR [rsi+16]"; +"adc r9, rdx"; +"mov rsi, r8"; +"mul r11"; +"mov rdi, r9"; +"shrd rsi, r9, 51"; +"shr rdi, 51"; +"add rsi, rax"; +"mov rax, QWORD PTR [r10+24]"; +"adc rdi, rdx"; +"mov r12, rsi"; +"mul r11"; +"mov r13, rdi"; +"shrd r12, rdi, 51"; +"shr r13, 51"; +"add r12, rax"; +"mov rax, QWORD PTR [r10+32]"; +"adc r13, rdx"; +"mov r10, r12"; +"mul r11"; +"shrd r10, r13, 51"; +"mov r11, r13"; +"shr r11, 51"; +"add rax, r10"; +"adc rdx, r11"; +"mov QWORD PTR [rsp-24], rax"; +"shrd rax, rdx, 51"; +"mov QWORD PTR [rsp-16], rdx"; +"imul r10, rax, 19"; +"movabs rax, 2251799813685247"; +"and r14, rax"; +"and r8, rax"; +"and rsi, rax"; +"and r12, rax"; +"mov QWORD PTR [rcx+24], r12"; +"add r10, r14"; +"mov rdx, r10"; +"and r10, rax"; +"shr rdx, 51"; +"mov QWORD PTR [rcx], r10"; +"add r8, rdx"; +"mov rdx, r8"; +"shr r8, 51"; +"and rdx, rax"; +"add r8, rsi"; +"and rax, QWORD PTR [rsp-24]"; +"pop r12"; +"mov QWORD PTR [rcx+8], rdx"; +"pop r13"; +"mov QWORD PTR [rcx+16], r8"; +"pop r14"; +"mov QWORD PTR [rcx+32], rax"; +"pop r15"; +"ret"; +"_Z16fiat_25519_carryPmPKm:"; +"mov rax, QWORD PTR [rsi]"; +"mov rcx, rdi"; +"mov r9, rax"; +"shr r9, 51"; +"add r9, QWORD PTR [rsi+8]"; +"mov r8, r9"; +"shr r8, 51"; +"add r8, QWORD PTR [rsi+16]"; +"mov r10, r8"; +"shr r10, 51"; +"add r10, QWORD PTR [rsi+24]"; +"mov rdi, r10"; +"shr rdi, 51"; +"add rdi, QWORD PTR [rsi+32]"; +"movabs rsi, 2251799813685247"; +"mov rdx, rdi"; +"and rax, rsi"; +"and r9, rsi"; +"and r8, rsi"; +"shr rdx, 51"; +"and r10, rsi"; +"and rdi, rsi"; +"imul rdx, rdx, 19"; +"mov QWORD PTR [rcx+24], r10"; +"mov QWORD PTR [rcx+32], rdi"; +"add rdx, rax"; +"mov rax, rdx"; +"and rdx, rsi"; +"shr rax, 51"; +"mov QWORD PTR [rcx], rdx"; +"add rax, r9"; +"mov rdx, rax"; +"shr rax, 51"; +"and rdx, rsi"; +"add rax, r8"; +"mov QWORD PTR [rcx+8], rdx"; +"mov QWORD PTR [rcx+16], rax"; +"ret"; +"_Z14fiat_25519_addPmPKmS1_:"; +"mov r9, QWORD PTR [rdx+8]"; +"mov r8, QWORD PTR [rdx+16]"; +"mov rax, rdi"; +"mov rcx, QWORD PTR [rdx+32]"; +"mov rdi, QWORD PTR [rdx+24]"; +"add r9, QWORD PTR [rsi+8]"; +"mov rdx, QWORD PTR [rdx]"; +"add r8, QWORD PTR [rsi+16]"; +"add rdi, QWORD PTR [rsi+24]"; +"add rcx, QWORD PTR [rsi+32]"; +"add rdx, QWORD PTR [rsi]"; +"mov QWORD PTR [rax+8], r9"; +"mov QWORD PTR [rax], rdx"; +"mov QWORD PTR [rax+16], r8"; +"mov QWORD PTR [rax+24], rdi"; +"mov QWORD PTR [rax+32], rcx"; +"ret"; +"_Z14fiat_25519_subPmPKmS1_:"; +"mov r9, QWORD PTR [rsi+16]"; +"mov r8, QWORD PTR [rsi+24]"; +"mov rcx, rdi"; +"movabs rax, 4503599627370494"; +"mov rdi, QWORD PTR [rsi+8]"; +"sub rdi, QWORD PTR [rdx+8]"; +"add rdi, rax"; +"add r9, rax"; +"add r8, rax"; +"add rax, QWORD PTR [rsi+32]"; +"mov rsi, QWORD PTR [rsi]"; +"sub rsi, QWORD PTR [rdx]"; +"sub r9, QWORD PTR [rdx+16]"; +"sub r8, QWORD PTR [rdx+24]"; +"sub rax, QWORD PTR [rdx+32]"; +"mov rdx, rsi"; +"mov QWORD PTR [rcx+8], rdi"; +"movabs rsi, 4503599627370458"; +"add rdx, rsi"; +"mov QWORD PTR [rcx+16], r9"; +"mov QWORD PTR [rcx], rdx"; +"mov QWORD PTR [rcx+24], r8"; +"mov QWORD PTR [rcx+32], rax"; +"ret"; +"_Z14fiat_25519_oppPmPKm:"; +"movabs rax, 4503599627370494"; +"movabs rdx, 4503599627370458"; +"sub rdx, QWORD PTR [rsi]"; +"mov r9, rax"; +"mov r8, rax"; +"sub r9, QWORD PTR [rsi+8]"; +"sub r8, QWORD PTR [rsi+16]"; +"mov rcx, rax"; +"sub rax, QWORD PTR [rsi+32]"; +"sub rcx, QWORD PTR [rsi+24]"; +"mov QWORD PTR [rdi], rdx"; +"mov QWORD PTR [rdi+8], r9"; +"mov QWORD PTR [rdi+16], r8"; +"mov QWORD PTR [rdi+24], rcx"; +"mov QWORD PTR [rdi+32], rax"; +"ret"; +"_Z20fiat_25519_selectznzPmhPKmS1_:"; +"mov r8, rdx"; +"cmp sil, 1"; +"push rbp"; +"sbb rdx, rdx"; +"mov r9, QWORD PTR [r8+8]"; +"xor eax, eax"; +"push rbx"; +"test sil, sil"; +"mov rbx, rax"; +"cmovne rbx, QWORD PTR [rcx+8]"; +"mov r11, rax"; +"and r9, rdx"; +"mov r10, rax"; +"mov rbp, QWORD PTR [r8+32]"; +"or rbx, r9"; +"mov r9, QWORD PTR [r8+16]"; +"test sil, sil"; +"cmovne r11, QWORD PTR [rcx+16]"; +"and r9, rdx"; +"or r11, r9"; +"mov r9, QWORD PTR [r8+24]"; +"test sil, sil"; +"cmovne r10, QWORD PTR [rcx+24]"; +"and r9, rdx"; +"or r10, r9"; +"test sil, sil"; +"mov r9, rax"; +"cmovne r9, QWORD PTR [rcx+32]"; +"and rbp, rdx"; +"or r9, rbp"; +"test sil, sil"; +"cmovne rax, QWORD PTR [rcx]"; +"and rdx, QWORD PTR [r8]"; +"mov QWORD PTR [rdi+8], rbx"; +"pop rbx"; +"or rax, rdx"; +"mov QWORD PTR [rdi+16], r11"; +"pop rbp"; +"mov QWORD PTR [rdi], rax"; +"mov QWORD PTR [rdi+24], r10"; +"mov QWORD PTR [rdi+32], r9"; +"ret"; +"_Z19fiat_25519_to_bytesPhPKm:"; +"movabs rdx, -2251799813685247"; +"push rbp"; +"xor r9d, r9d"; +"push rbx"; +"mov rcx, QWORD PTR [rsi+8]"; +"movabs rbx, -2251799813685229"; +"add rbx, QWORD PTR [rsi]"; +"mov r11, QWORD PTR [rsi+24]"; +"mov rax, rbx"; +"sar rax, 51"; +"add r11, rdx"; +"neg eax"; +"movzx eax, al"; +"sub rcx, rax"; +"mov rax, QWORD PTR [rsi+16]"; +"add rcx, rdx"; +"mov r8, rcx"; +"add rax, rdx"; +"add rdx, QWORD PTR [rsi+32]"; +"sar r8, 51"; +"neg r8d"; +"movzx r8d, r8b"; +"sub rax, r8"; +"movabs r8, 2251799813685247"; +"mov r10, rax"; +"sar rax, 51"; +"neg eax"; +"movzx eax, al"; +"sub r11, rax"; +"mov rax, r11"; +"sar rax, 51"; +"neg eax"; +"movzx eax, al"; +"sub rdx, rax"; +"movabs rax, 2251799813685229"; +"mov rbp, rdx"; +"sar rbp, 51"; +"test bpl, bpl"; +"cmove rax, r9"; +"and rbx, r8"; +"add rax, rbx"; +"movabs rbx, 144115188075855808"; +"mov rsi, rax"; +"and rsi, r8"; +"test bpl, bpl"; +"cmovne r9, r8"; +"and rcx, r8"; +"shr rax, 51"; +"and r11, r8"; +"and rdx, r8"; +"mov DWORD PTR [rdi], esi"; +"add rcx, r9"; +"add r11, r9"; +"add rdx, r9"; +"add rcx, rax"; +"mov rax, r10"; +"and rax, r8"; +"mov r10, rcx"; +"sal rcx, 3"; +"shr r10, 51"; +"add rax, r9"; +"add rax, r10"; +"mov r10, rax"; +"sal rax, 6"; +"shr r10, 51"; +"and rax, rbx"; +"add r11, r10"; +"movabs r10, 18014398509481976"; +"and rcx, r10"; +"mov r10, rsi"; +"shr r10, 48"; +"add r10, rcx"; +"shr rcx, 48"; +"add rax, rcx"; +"mov rcx, r11"; +"shr r11, 51"; +"mov DWORD PTR [rdi+6], r10d"; +"and rcx, r8"; +"mov rbx, rax"; +"add rdx, r11"; +"mov DWORD PTR [rdi+12], eax"; +"shr rbx, 56"; +"add rcx, rcx"; +"sal rdx, 4"; +"movabs r8, 36028797018963952"; +"add rcx, rbx"; +"and rdx, r8"; +"pop rbx"; +"pop rbp"; +"mov r8, rcx"; +"mov DWORD PTR [rdi+19], ecx"; +"shr r8, 48"; +"add rdx, r8"; +"mov r8, rsi"; +"shr r8, 32"; +"shr rsi, 40"; +"mov DWORD PTR [rdi+25], edx"; +"mov BYTE PTR [rdi+5], sil"; +"mov rsi, r10"; +"shr r10, 40"; +"shr rsi, 32"; +"mov BYTE PTR [rdi+4], r8b"; +"mov BYTE PTR [rdi+10], sil"; +"mov rsi, rax"; +"shr rsi, 32"; +"mov BYTE PTR [rdi+11], r10b"; +"mov BYTE PTR [rdi+16], sil"; +"mov rsi, rax"; +"shr rax, 48"; +"mov BYTE PTR [rdi+18], al"; +"mov rax, rcx"; +"shr rsi, 40"; +"shr rax, 32"; +"shr rcx, 40"; +"mov BYTE PTR [rdi+17], sil"; +"mov BYTE PTR [rdi+23], al"; +"mov rax, rdx"; +"shr rax, 32"; +"mov BYTE PTR [rdi+24], cl"; +"mov BYTE PTR [rdi+29], al"; +"mov rax, rdx"; +"shr rdx, 48"; +"shr rax, 40"; +"mov BYTE PTR [rdi+31], dl"; +"mov BYTE PTR [rdi+30], al"; +"ret"; +"_Z21fiat_25519_from_bytesPmPKh:"; +"mov r8, rdi"; +"movzx edx, BYTE PTR [rsi+5]"; +"movzx edi, BYTE PTR [rsi+6]"; +"mov rax, rsi"; +"movzx ecx, BYTE PTR [rax+18]"; +"movzx r10d, BYTE PTR [rax+30]"; +"sal rdx, 40"; +"sal rdi, 48"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi]"; +"sal rcx, 42"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+4]"; +"sal rdx, 32"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+3]"; +"sal rdx, 24"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+2]"; +"sal rdx, 16"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rsi+1]"; +"movzx esi, BYTE PTR [rsi+12]"; +"sal rdx, 8"; +"sal rsi, 45"; +"add rdi, rdx"; +"movzx edx, BYTE PTR [rax+11]"; +"sal rdx, 37"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+10]"; +"sal rdx, 29"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+9]"; +"sal rdx, 21"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+8]"; +"sal rdx, 13"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+7]"; +"sal rdx, 5"; +"add rsi, rdx"; +"mov rdx, rdi"; +"shr rdx, 51"; +"add rsi, rdx"; +"movzx edx, BYTE PTR [rax+19]"; +"sal rdx, 50"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+17]"; +"sal rcx, 34"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+16]"; +"sal rcx, 26"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+15]"; +"sal rcx, 18"; +"sal r10, 36"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+14]"; +"sal rcx, 10"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+13]"; +"lea r9, [rdx+rcx*4]"; +"mov rdx, rsi"; +"movzx ecx, BYTE PTR [rax+24]"; +"shr rdx, 51"; +"add r9, rdx"; +"movzx edx, BYTE PTR [rax+25]"; +"sal rcx, 39"; +"sal rdx, 47"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+23]"; +"sal rcx, 31"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+22]"; +"sal rcx, 23"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+21]"; +"sal rcx, 15"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+20]"; +"sal rcx, 7"; +"add rdx, rcx"; +"mov rcx, r9"; +"shr rcx, 51"; +"add rdx, rcx"; +"movzx ecx, BYTE PTR [rax+31]"; +"sal rcx, 44"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+29]"; +"sal r10, 28"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+28]"; +"sal r10, 20"; +"add rcx, r10"; +"movzx r10d, BYTE PTR [rax+27]"; +"movzx eax, BYTE PTR [rax+26]"; +"sal r10, 12"; +"sal rax, 4"; +"add rcx, r10"; +"add rax, rcx"; +"mov rcx, rdx"; +"shr rcx, 51"; +"add rax, rcx"; +"movabs rcx, 2251799813685247"; +"and rdi, rcx"; +"and rsi, rcx"; +"and r9, rcx"; +"and rdx, rcx"; +"mov QWORD PTR [r8], rdi"; +"mov QWORD PTR [r8+8], rsi"; +"mov QWORD PTR [r8+16], r9"; +"mov QWORD PTR [r8+24], rdx"; +"mov QWORD PTR [r8+32], rax"; +""]. diff --git a/src/Assembly/Parse/Examples/make-example.sh b/src/Assembly/Parse/Examples/make-example.sh new file mode 100755 index 0000000000..8ce4131248 --- /dev/null +++ b/src/Assembly/Parse/Examples/make-example.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +cat << EOF +From Coq Require Import String List. +Import ListNotations. +Local Open Scope string_scope. +Local Open Scope list_scope. +Example example : list string := [ +EOF + +while read -r line; do + echo "\"$line\";" +done + +echo '""].' diff --git a/src/Assembly/Parse/TestAsm.v b/src/Assembly/Parse/TestAsm.v index 471a79767f..258e84685a 100644 --- a/src/Assembly/Parse/TestAsm.v +++ b/src/Assembly/Parse/TestAsm.v @@ -13,6 +13,16 @@ Require Crypto.Assembly.Parse.Examples.fiat_p256_square_optimised_seed103. Require Crypto.Assembly.Parse.Examples.fiat_p256_square_optimised_seed46. Require Crypto.Assembly.Parse.Examples.fiat_p256_square_optimised_seed6. Require Crypto.Assembly.Parse.Examples.boringssl_nasm_full_mul_p256. +Require Crypto.Assembly.Parse.Examples.fiat_25519_all_gcc_14_1_O0. +Require Crypto.Assembly.Parse.Examples.fiat_25519_all_gcc_14_1_O1. +Require Crypto.Assembly.Parse.Examples.fiat_25519_all_gcc_14_1_O2. +Require Crypto.Assembly.Parse.Examples.fiat_25519_all_gcc_14_1_O3. +Require Crypto.Assembly.Parse.Examples.fiat_25519_all_gcc_14_1_Os. +Require Crypto.Assembly.Parse.Examples.fiat_25519_all_clang_19_1_0_O0. +Require Crypto.Assembly.Parse.Examples.fiat_25519_all_clang_19_1_0_O1. +Require Crypto.Assembly.Parse.Examples.fiat_25519_all_clang_19_1_0_O2. +Require Crypto.Assembly.Parse.Examples.fiat_25519_all_clang_19_1_0_O3. +Require Crypto.Assembly.Parse.Examples.fiat_25519_all_clang_19_1_0_Os. Import ListNotations. Local Open Scope list_scope. Local Open Scope string_scope. @@ -48,3 +58,33 @@ Proof. Time native_compute. exact eq_refl. Abort. Goal parse_correct_on_debug boringssl_nasm_full_mul_p256.example. Proof. Time native_compute. exact eq_refl. Abort. (*Redirect "log" Compute parse boringssl_nasm_full_mul_p256.example.*) +Goal parse_correct_on_debug fiat_25519_all_gcc_14_1_O0.example. +Proof. Time native_compute. exact eq_refl. Abort. +(* Redirect "log" Compute parse fiat_25519_all_gcc_14_1_O0.example. *) +Goal parse_correct_on_debug fiat_25519_all_gcc_14_1_O1.example. +Proof. Time native_compute. exact eq_refl. Abort. +(*Redirect "log" Compute parse fiat_25519_all_gcc_14_1_O1.example.*) +Goal parse_correct_on_debug fiat_25519_all_gcc_14_1_O2.example. +Proof. Time native_compute. exact eq_refl. Abort. +(*Redirect "log" Compute parse fiat_25519_all_gcc_14_1_O2.example.*) +Goal parse_correct_on_debug fiat_25519_all_gcc_14_1_O3.example. +Proof. Time native_compute. exact eq_refl. Abort. +(*Redirect "log" Compute parse fiat_25519_all_gcc_14_1_O3.example.*) +Goal parse_correct_on_debug fiat_25519_all_gcc_14_1_Os.example. +Proof. Time native_compute. exact eq_refl. Abort. +(*Redirect "log" Compute parse fiat_25519_all_gcc_14_1_Os.example.*) +Goal parse_correct_on_debug fiat_25519_all_clang_19_1_0_O0.example. +Proof. Time native_compute. exact eq_refl. Abort. +(*Redirect "log" Compute parse fiat_25519_all_clang_19_1_0_O0.example.*) +Goal parse_correct_on_debug fiat_25519_all_clang_19_1_0_O1.example. +Proof. Time native_compute. exact eq_refl. Abort. +(*Redirect "log" Compute parse fiat_25519_all_clang_19_1_0_O1.example.*) +Goal parse_correct_on_debug fiat_25519_all_clang_19_1_0_O2.example. +Proof. Time native_compute. exact eq_refl. Abort. +(*Redirect "log" Compute parse fiat_25519_all_clang_19_1_0_O2.example.*) +Goal parse_correct_on_debug fiat_25519_all_clang_19_1_0_O3.example. +Proof. Time native_compute. exact eq_refl. Abort. +(*Redirect "log" Compute parse fiat_25519_all_clang_19_1_0_O3.example.*) +Goal parse_correct_on_debug fiat_25519_all_clang_19_1_0_Os.example. +Proof. Time native_compute. exact eq_refl. Abort. +(*Redirect "log" Compute parse fiat_25519_all_clang_19_1_0_Os.example.*) diff --git a/src/Assembly/Syntax.v b/src/Assembly/Syntax.v index 50dd2e5046..651e58d2c5 100644 --- a/src/Assembly/Syntax.v +++ b/src/Assembly/Syntax.v @@ -3,7 +3,9 @@ From Coq Require Import NArith. From Coq Require Import String. From Coq Require Import List. From Coq Require Import Derive. +Require Import Crypto.Util.Prod. Require Import Crypto.Util.Option. +Require Import Crypto.Util.Bool.Reflect. Require Crypto.Util.Tuple. Require Crypto.Util.OptionList. Import ListNotations. @@ -11,34 +13,64 @@ Import ListNotations. Local Open Scope list_scope. Local Set Implicit Arguments. -Local Set Boolean Equality Schemes. -Local Set Decidable Equality Schemes. Local Set Primitive Projections. Inductive REG := -| rax | rcx | rdx | rbx | rsp | rbp | rsi | rdi | r8 | r9 | r10 | r11 | r12 | r13 | r14 | r15 -| eax | ecx | edx | ebx | esp | ebp | esi | edi | r8d | r9d | r10d | r11d | r12d | r13d | r14d | r15d -| ax | cx | dx | bx | sp | bp | si | di | r8w | r9w | r10w | r11w | r12w | r13w | r14w | r15w +(* XMM/YMM/ZMM registers *) +| zmm0 | zmm1 | zmm2 | zmm3 | zmm4 | zmm5 | zmm6 | zmm7 | zmm8 | zmm9 | zmm10 | zmm11 | zmm12 | zmm13 | zmm14 | zmm15 | zmm16 | zmm17 | zmm18 | zmm19 | zmm20 | zmm21 | zmm22 | zmm23 | zmm24 | zmm25 | zmm26 | zmm27 | zmm28 | zmm29 | zmm30 | zmm31 +| ymm0 | ymm1 | ymm2 | ymm3 | ymm4 | ymm5 | ymm6 | ymm7 | ymm8 | ymm9 | ymm10 | ymm11 | ymm12 | ymm13 | ymm14 | ymm15 +| xmm0 | xmm1 | xmm2 | xmm3 | xmm4 | xmm5 | xmm6 | xmm7 | xmm8 | xmm9 | xmm10 | xmm11 | xmm12 | xmm13 | xmm14 | xmm15 +(* Segment registers *) +| cs | ds | es | fs | gs | ss +(* Control registers *) +| cr0 | cr1 | cr2 | cr3 | cr4 | cr8 | cr9 | cr10 | cr11 | cr12 | cr13 | cr14 | cr15 +| msw +| mxcsr +(* Debug registers *) +| dr0 | dr1 | dr2 | dr3 | dr4 | dr5 | dr6 | dr7 | dr8 | dr9 | dr10 | dr11 | dr12 | dr13 | dr14 | dr15 +(* General purpose registers (64/32/16/8 bit) *) +| rax | rcx | rdx | rbx | rsp | rbp | rsi | rdi | r8 | r9 | r10 | r11 | r12 | r13 | r14 | r15 | rip +| eax | ecx | edx | ebx | esp | ebp | esi | edi | r8d | r9d | r10d | r11d | r12d | r13d | r14d | r15d | eip +| ax | cx | dx | bx | sp | bp | si | di | r8w | r9w | r10w | r11w | r12w | r13w | r14w | r15w | ip | ah | al | ch | cl | dh | dl | bh | bl | spl | bpl | sil | dil | r8b | r9b | r10b | r11b | r12b | r13b | r14b | r15b +(* MMX registers *) +| mm0 | mm1 | mm2 | mm3 | mm4 | mm5 | mm6 | mm7 +(* Special registers *) +(*| st0 | st1 | st2 | st3 | st4 | st5 | st6 | st7 (* FPU stack registers *)*) +| k0 | k1 | k2 | k3 | k4 | k5 | k6 | k7 (* AVX-512 mask registers *) +| gdtr | idtr | ldtr | tr +| cw | sw | tw | fp_cs | fp_opc | fp_ds +(* Flags registers *) +| rflags +| eflags +| flags . Definition CONST := Z. Coercion CONST_of_Z (x : Z) : CONST := x. - -Inductive AccessSize := byte | word | dword | qword. +Local Set Boolean Equality Schemes. +Local Set Decidable Equality Schemes. +Inductive AccessSize := byte | word | dword | qword | xmmword | ymmword | zmmword. +Local Unset Boolean Equality Schemes. +Local Unset Decidable Equality Schemes. Coercion bits_of_AccessSize (x : AccessSize) : N := match x with | byte => 8 | word => 16 | dword => 32 | qword => 64 + | xmmword => 128 + | ymmword => 256 + | zmmword => 512 end. -Record MEM := { mem_bits_access_size : option AccessSize ; mem_base_reg : option REG ; mem_scale_reg : option (Z * REG) ; mem_base_label : option string ; mem_offset : option Z }. +Record MEM := { mem_bits_access_size : option AccessSize ; mem_constant_location_label : option string ; mem_base_reg : option REG ; mem_scale_reg : option (Z * REG) ; mem_base_label : option string ; mem_offset : option Z }. Definition mem_of_reg (r : REG) : MEM := - {| mem_base_reg := Some r ; mem_offset := None ; mem_scale_reg := None ; mem_bits_access_size := None ; mem_base_label := None |}. + {| mem_base_reg := Some r ; mem_constant_location_label := None ; mem_offset := None ; mem_scale_reg := None ; mem_bits_access_size := None ; mem_base_label := None |}. +Local Set Boolean Equality Schemes. +Local Set Decidable Equality Schemes. Inductive FLAG := CF | PF | AF | ZF | SF | OF. Inductive OpPrefix := @@ -58,6 +90,8 @@ Inductive OpCode := | clc | cmovb | cmovc +| cmove (* Conditional move if equal *) +| cmovne (* Conditional move if not equal *) | cmovnz | cmovo | cmp @@ -71,21 +105,51 @@ Inductive OpCode := | je | jmp | lea +| leave (* Function epilogue instruction *) | mov +| movabs (* Move absolute value into register *) +| movdqa (* Move aligned packed data *) +| movdqu (* Move unaligned packed data *) +| movq (* Move quadword *) +| movd (* Move doubleword *) +| movsx (* Move with sign extension *) +| movups (* Move unaligned packed single-precision floating-point values *) | movzx | mul | mulx +| neg (* Two's complement negation *) +| nop (* No operation *) +| not (* Bitwise NOT *) | or +| paddq (* Add packed quadword integers *) | pop +| psubq (* Subtract packed quadword integers *) +| pshufd (* Shuffle packed doublewords *) +| pshufw (* Shuffle packed words *) +| punpcklqdq (* Unpack and interleave low quadwords *) +| punpckhqdq (* Unpack and interleave high quadwords *) +| pslld (* Shift packed single-precision floating-point values left *) +| psrld (* Shift packed single-precision floating-point values right *) +| pand (* Bitwise AND *) +| pandn (* Bitwise AND NOT *) +| por (* Bitwise OR *) +| pxor (* Bitwise XOR *) +| psrad (* Shift packed signed integers right arithmetic *) | push | rcr | ret -| sar -| sbb +| rol (* Rotate left *) +| ror (* Rotate right *) +| sal (* Shift arithmetic left (functionally equivalent to shl) *) +| sar (* Shift arithmetic right *) +| sbb (* Subtract with borrow *) | setc +| sete (* Set byte if equal *) +| setne (* Set byte if not equal *) | seto | shl | shlx +| shld | shr | shrx | shrd @@ -119,14 +183,38 @@ Definition Lines := list Line. Definition reg_size (r : REG) : N := match r with - |( rax | rcx | rdx | rbx | rsp | rbp | rsi | rdi | r8 | r9 | r10 | r11 | r12 | r13 | r14 | r15 ) + |(xmm0 | xmm1 | xmm2 | xmm3 | xmm4 | xmm5 | xmm6 | xmm7 | xmm8 | xmm9 | xmm10 | xmm11 | xmm12 | xmm13 | xmm14 | xmm15) + => 128 + |(zmm0 | zmm1 | zmm2 | zmm3 | zmm4 | zmm5 | zmm6 | zmm7 | zmm8 | zmm9 | zmm10 | zmm11 | zmm12 | zmm13 | zmm14 | zmm15 | zmm16 | zmm17 | zmm18 | zmm19 | zmm20 | zmm21 | zmm22 | zmm23 | zmm24 | zmm25 | zmm26 | zmm27 | zmm28 | zmm29 | zmm30 | zmm31) + => 512 + |(ymm0 | ymm1 | ymm2 | ymm3 | ymm4 | ymm5 | ymm6 | ymm7 | ymm8 | ymm9 | ymm10 | ymm11 | ymm12 | ymm13 | ymm14 | ymm15) + => 256 + |( rax | rcx | rdx | rbx | rsp | rbp | rsi | rdi | r8 | r9 | r10 | r11 | r12 | r13 | r14 | r15 | rip | rflags) => 64 - |( eax | ecx | edx | ebx | esp | ebp | esi | edi | r8d | r9d | r10d | r11d | r12d | r13d | r14d | r15d) + |( eax | ecx | edx | ebx | esp | ebp | esi | edi | r8d | r9d | r10d | r11d | r12d | r13d | r14d | r15d | eip | eflags) => 32 - |( ax | cx | dx | bx | sp | bp | si | di | r8w | r9w | r10w | r11w | r12w | r13w | r14w | r15w) + |( ax | cx | dx | bx | sp | bp | si | di | r8w | r9w | r10w | r11w | r12w | r13w | r14w | r15w | ip | flags) + => 16 + |(cs | ds | es | fs | gs | ss) => 16 |(ah | al | ch | cl | dh | dl | bh | bl | spl | bpl | sil | dil | r8b | r9b | r10b | r11b | r12b | r13b | r14b | r15b) => 8 + |(cr0 | cr1 | cr2 | cr3 | cr4 | cr8 | cr9 | cr10 | cr11 | cr12 | cr13 | cr14 | cr15) + => 64 + |(dr0 | dr1 | dr2 | dr3 | dr4 | dr5 | dr6 | dr7 | dr8 | dr9 | dr10 | dr11 | dr12 | dr13 | dr14 | dr15) + => 64 + |(mm0 | mm1 | mm2 | mm3 | mm4 | mm5 | mm6 | mm7) + => 64 + (* |(st0 | st1 | st2 | st3 | st4 | st5 | st6 | st7) + => 80 *) + |(k0 | k1 | k2 | k3 | k4 | k5 | k6 | k7) + => 64 + |(gdtr | idtr | ldtr | tr) + => 16 + |(cw | sw | tw | fp_cs | fp_opc | fp_ds) + => 16 + | msw => 16 + | mxcsr => 32 end. Definition standalone_operand_size (x : ARG) : option N := @@ -173,7 +261,7 @@ Definition operand_size (x : ARG) (operation_size : N) : N := end. -Definition reg_index (r : REG) : nat +Definition reg_index (r : REG) : N := match r with | rax | eax @@ -255,62 +343,358 @@ Definition reg_index (r : REG) : nat | r15w | r15b => 15 - end. + | rip + | eip + | ip + => 16 + | rflags + | eflags + | flags + => 17 + | xmm0 + | ymm0 + | zmm0 + => 18 + | xmm1 + | ymm1 + | zmm1 + => 19 + | xmm2 + | ymm2 + | zmm2 + => 20 + | xmm3 + | ymm3 + | zmm3 + => 21 + | xmm4 + | ymm4 + | zmm4 + => 22 + | xmm5 + | ymm5 + | zmm5 + => 23 + | xmm6 + | ymm6 + | zmm6 + => 24 + | xmm7 + | ymm7 + | zmm7 + => 25 + | xmm8 + | ymm8 + | zmm8 + => 26 + | xmm9 + | ymm9 + | zmm9 + => 27 + | xmm10 + | ymm10 + | zmm10 + => 28 + | xmm11 + | ymm11 + | zmm11 + => 29 + | xmm12 + | ymm12 + | zmm12 + => 30 + | xmm13 + | ymm13 + | zmm13 + => 31 + | xmm14 + | ymm14 + | zmm14 + => 32 + | xmm15 + | ymm15 + | zmm15 + => 33 + | zmm16 => 34 + | zmm17 => 35 + | zmm18 => 36 + | zmm19 => 37 + | zmm20 => 38 + | zmm21 => 39 + | zmm22 => 40 + | zmm23 => 41 + | zmm24 => 42 + | zmm25 => 43 + | zmm26 => 44 + | zmm27 => 45 + | zmm28 => 46 + | zmm29 => 47 + | zmm30 => 48 + | zmm31 => 49 + | cr0 + | msw + => 50 + | cr1 + => 51 + | cr2 + => 52 + | cr3 + => 53 + | cr4 + => 54 + | cr8 + => 55 + | cr9 + => 56 + | cr10 + => 57 + | cr11 + => 58 + | cr12 + => 59 + | cr13 + => 60 + | cr14 + => 61 + | cr15 + => 62 + | mm0 + (* | st0 *) + => 63 + | mm1 + (* | st1 *) + => 64 + | mm2 + (* | st2 *) + => 65 + | mm3 + (* | st3 *) + => 66 + | mm4 + (* | st4 *) + => 67 + | mm5 + (* | st5 *) + => 68 + | mm6 + (* | st6 *) + => 69 + | mm7 + (* | st7 *) + => 70 + | k0 + => 71 + | k1 + => 72 + | k2 + => 73 + | k3 + => 74 + | k4 + => 75 + | k5 + => 76 + | k6 + => 77 + | k7 + => 78 + | gdtr + => 79 + | idtr + => 80 + | ldtr + => 81 + | tr + => 82 + | fp_cs + => 83 + | fp_opc + => 84 + | fp_ds + => 85 + | mxcsr + => 86 + | dr0 + => 87 + | dr1 + => 88 + | dr2 + => 89 + | dr3 + => 90 + | dr4 + => 91 + | dr5 + => 92 + | dr6 + => 93 + | dr7 + => 94 + | dr8 + => 95 + | dr9 + => 96 + | dr10 + => 97 + | dr11 + => 98 + | dr12 + => 99 + | dr13 + => 100 + | dr14 + => 101 + | dr15 + => 102 + | cs + => 103 + | ds + => 104 + | es + => 105 + | fs + => 106 + | gs + => 107 + | ss + => 108 + | cw + => 109 + | sw + => 110 + | tw + => 111 + end%N. + Definition reg_offset (r : REG) : N := match r with - |( rax | rcx | rdx | rbx | rsp | rbp | rsi | rdi | r8 | r9 | r10 | r11 | r12 | r13 | r14 | r15 ) - |( eax | ecx | edx | ebx | esp | ebp | esi | edi | r8d | r9d | r10d | r11d | r12d | r13d | r14d | r15d) - |( ax | cx | dx | bx | sp | bp | si | di | r8w | r9w | r10w | r11w | r12w | r13w | r14w | r15w) - |( al | cl | dl | bl | spl | bpl | sil | dil | r8b | r9b | r10b | r11b | r12b | r13b | r14b | r15b) - => 0 |(ah | ch | dh | bh ) => 8 + | _ => 0 end. Definition index_and_shift_and_bitcount_of_reg (r : REG) := (reg_index r, reg_offset r, reg_size r). -Definition regs_of_index (index : nat) : list (list REG) := +Definition regs_of_index (index : N) : list (list REG) := match index with - | 0 => [ [ al ; ah] ; [ ax] ; [ eax] ; [rax] ] - | 1 => [ [ cl ; ch] ; [ cx] ; [ ecx] ; [rcx] ] - | 2 => [ [ dl ; dh] ; [ dx] ; [ edx] ; [rdx] ] - | 3 => [ [ bl ; bh] ; [ bx] ; [ ebx] ; [rbx] ] - | 4 => [ [ spl ] ; [ sp] ; [ esp] ; [rsp] ] - | 5 => [ [ bpl ] ; [ bp] ; [ ebp] ; [rbp] ] - | 6 => [ [ sil ] ; [ si] ; [ esi] ; [rsi] ] - | 7 => [ [ dil ] ; [ di] ; [ edi] ; [rdi] ] - | 8 => [ [ r8b ] ; [ r8w] ; [ r8d] ; [r8 ] ] - | 9 => [ [ r9b ] ; [ r9w] ; [ r9d] ; [r9 ] ] - | 10 => [ [r10b ] ; [r10w] ; [r10d] ; [r10] ] - | 11 => [ [r11b ] ; [r11w] ; [r11d] ; [r11] ] - | 12 => [ [r12b ] ; [r12w] ; [r12d] ; [r12] ] - | 13 => [ [r13b ] ; [r13w] ; [r13d] ; [r13] ] - | 14 => [ [r14b ] ; [r14w] ; [r14d] ; [r14] ] - | 15 => [ [r15b ] ; [r15w] ; [r15d] ; [r15] ] + | 0 => [ [ al ; ah] ; [ ax] ; [ eax] ; [rax] ] + | 1 => [ [ cl ; ch] ; [ cx] ; [ ecx] ; [rcx] ] + | 2 => [ [ dl ; dh] ; [ dx] ; [ edx] ; [rdx] ] + | 3 => [ [ bl ; bh] ; [ bx] ; [ ebx] ; [rbx] ] + | 4 => [ [ spl ] ; [ sp] ; [ esp] ; [rsp] ] + | 5 => [ [ bpl ] ; [ bp] ; [ ebp] ; [rbp] ] + | 6 => [ [ sil ] ; [ si] ; [ esi] ; [rsi] ] + | 7 => [ [ dil ] ; [ di] ; [ edi] ; [rdi] ] + | 8 => [ [ r8b ] ; [ r8w] ; [ r8d] ; [r8 ] ] + | 9 => [ [ r9b ] ; [ r9w] ; [ r9d] ; [r9 ] ] + | 10 => [ [r10b ] ; [r10w] ; [r10d] ; [r10] ] + | 11 => [ [r11b ] ; [r11w] ; [r11d] ; [r11] ] + | 12 => [ [r12b ] ; [r12w] ; [r12d] ; [r12] ] + | 13 => [ [r13b ] ; [r13w] ; [r13d] ; [r13] ] + | 14 => [ [r14b ] ; [r14w] ; [r14d] ; [r14] ] + | 15 => [ [r15b ] ; [r15w] ; [r15d] ; [r15] ] + | 16 => [ [] ; [ip] ; [eip] ; [rip] ] + | 17 => [ [] ; [flags] ; [eflags]; [rflags] ] + | 18 => [ [] ; [] ; [] ; [] ; [xmm0] ; [ymm0] ; [zmm0] ] + | 19 => [ [] ; [] ; [] ; [] ; [xmm1] ; [ymm1] ; [zmm1] ] + | 20 => [ [] ; [] ; [] ; [] ; [xmm2] ; [ymm2] ; [zmm2] ] + | 21 => [ [] ; [] ; [] ; [] ; [xmm3] ; [ymm3] ; [zmm3] ] + | 22 => [ [] ; [] ; [] ; [] ; [xmm4] ; [ymm4] ; [zmm4] ] + | 23 => [ [] ; [] ; [] ; [] ; [xmm5] ; [ymm5] ; [zmm5] ] + | 24 => [ [] ; [] ; [] ; [] ; [xmm6] ; [ymm6] ; [zmm6] ] + | 25 => [ [] ; [] ; [] ; [] ; [xmm7] ; [ymm7] ; [zmm7] ] + | 26 => [ [] ; [] ; [] ; [] ; [xmm8] ; [ymm8] ; [zmm8] ] + | 27 => [ [] ; [] ; [] ; [] ; [xmm9] ; [ymm9] ; [zmm9] ] + | 28 => [ [] ; [] ; [] ; [] ; [xmm10]; [ymm10]; [zmm10] ] + | 29 => [ [] ; [] ; [] ; [] ; [xmm11]; [ymm11]; [zmm11] ] + | 30 => [ [] ; [] ; [] ; [] ; [xmm12]; [ymm12]; [zmm12] ] + | 31 => [ [] ; [] ; [] ; [] ; [xmm13]; [ymm13]; [zmm13] ] + | 32 => [ [] ; [] ; [] ; [] ; [xmm14]; [ymm14]; [zmm14] ] + | 33 => [ [] ; [] ; [] ; [] ; [xmm15]; [ymm15]; [zmm15] ] + | 34 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm16] ] + | 36 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm18] ] + | 35 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm17] ] + | 37 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm19] ] + | 38 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm20] ] + | 39 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm21] ] + | 40 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm22] ] + | 41 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm23] ] + | 42 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm24] ] + | 43 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm25] ] + | 44 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm26] ] + | 45 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm27] ] + | 46 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm28] ] + | 47 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm29] ] + | 48 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm30] ] + | 49 => [ [] ; [] ; [] ; [] ; [] ; [] ; [zmm31] ] + | 50 => [ [] ; [msw] ; [] ; [cr0] ] + | 51 => [ [] ; [] ; [] ; [cr1] ] + | 52 => [ [] ; [] ; [] ; [cr2] ] + | 53 => [ [] ; [] ; [] ; [cr3] ] + | 54 => [ [] ; [] ; [] ; [cr4] ] + | 55 => [ [] ; [] ; [] ; [cr8] ] + | 56 => [ [] ; [] ; [] ; [cr9] ] + | 57 => [ [] ; [] ; [] ; [cr10] ] + | 58 => [ [] ; [] ; [] ; [cr11] ] + | 59 => [ [] ; [] ; [] ; [cr12] ] + | 60 => [ [] ; [] ; [] ; [cr13] ] + | 61 => [ [] ; [] ; [] ; [cr14] ] + | 62 => [ [] ; [] ; [] ; [cr15] ] + | 63 => [ [] ; [] ; [] ; [mm0] ] + | 64 => [ [] ; [] ; [] ; [mm1] ] + | 65 => [ [] ; [] ; [] ; [mm2] ] + | 66 => [ [] ; [] ; [] ; [mm3] ] + | 67 => [ [] ; [] ; [] ; [mm4] ] + | 68 => [ [] ; [] ; [] ; [mm5] ] + | 69 => [ [] ; [] ; [] ; [mm6] ] + | 70 => [ [] ; [] ; [] ; [mm7] ] + | 71 => [ [] ; [] ; [] ; [k0] ] + | 72 => [ [] ; [] ; [] ; [k1] ] + | 73 => [ [] ; [] ; [] ; [k2] ] + | 74 => [ [] ; [] ; [] ; [k3] ] + | 75 => [ [] ; [] ; [] ; [k4] ] + | 76 => [ [] ; [] ; [] ; [k5] ] + | 77 => [ [] ; [] ; [] ; [k6] ] + | 78 => [ [] ; [] ; [] ; [k7] ] + | 79 => [ [] ; [gdtr] ; [] ; [] ] + | 80 => [ [] ; [idtr] ; [] ; [] ] + | 81 => [ [] ; [ldtr] ; [] ; [] ] + | 82 => [ [] ; [tr] ; [] ; [] ] + | 83 => [ [] ; [fp_cs] ; [] ; [] ] + | 84 => [ [] ; [fp_opc]; [] ; [] ] + | 85 => [ [] ; [fp_ds] ; [] ; [] ] + | 86 => [ [] ; [] ; [mxcsr] ; [] ] + | 87 => [ [] ; [] ; [] ; [dr0] ] + | 88 => [ [] ; [] ; [] ; [dr1] ] + | 89 => [ [] ; [] ; [] ; [dr2] ] + | 90 => [ [] ; [] ; [] ; [dr3] ] + | 91 => [ [] ; [] ; [] ; [dr4] ] + | 92 => [ [] ; [] ; [] ; [dr5] ] + | 93 => [ [] ; [] ; [] ; [dr6] ] + | 94 => [ [] ; [] ; [] ; [dr7] ] + | 95 => [ [] ; [] ; [] ; [dr8] ] + | 96 => [ [] ; [] ; [] ; [dr9] ] + | 97 => [ [] ; [] ; [] ; [dr10] ] + | 98 => [ [] ; [] ; [] ; [dr11] ] + | 99 => [ [] ; [] ; [] ; [dr12] ] + | 100 => [ [] ; [] ; [] ; [dr13] ] + | 101 => [ [] ; [] ; [] ; [dr14] ] + | 102 => [ [] ; [] ; [] ; [dr15] ] + | 103 => [ [] ; [cs] ; [] ; [] ] + | 104 => [ [] ; [ds] ; [] ; [] ] + | 105 => [ [] ; [es] ; [] ; [] ] + | 106 => [ [] ; [fs] ; [] ; [] ] + | 107 => [ [] ; [gs] ; [] ; [] ] + | 108 => [ [] ; [ss] ; [] ; [] ] + | 109 => [ [] ; [cw] ; [] ; [] ] + | 110 => [ [] ; [sw] ; [] ; [] ] + | 111 => [ [] ; [tw] ; [] ; [] ] | _ => [] - end. + end%N. (** convenience printing function *) -Definition widest_register_of_index (n : nat) : REG - := match n with - | 0 => rax - | 1 => rcx - | 2 => rdx - | 3 => rbx - | 4 => rsp - | 5 => rbp - | 6 => rsi - | 7 => rdi - | 8 => r8 - | 9 => r9 - | 10 => r10 - | 11 => r11 - | 12 => r12 - | 13 => r13 - | 14 => r14 - | 15 => r15 - | _ => rax - end%nat. +Definition widest_register_of_index (n : N) : REG + := List.hd rax (List.rev (List.concat (regs_of_index n))). Definition reg_of_index_and_shift_and_bitcount_opt := fun '(index, offset, size) => @@ -327,6 +711,8 @@ Definition reg_of_index_and_shift_and_bitcount := | None => widest_register_of_index index end. +Local Coercion N.of_nat : nat >-> N. + Lemma widest_register_of_index_correct : forall n, (~exists r, reg_index r = n) @@ -335,14 +721,20 @@ Lemma widest_register_of_index_correct Proof. intro n; set (r := widest_register_of_index n). cbv in r. - repeat match goal with r := context[match ?n with _ => _ end] |- _ => destruct n; [ right | ] end; - [ .. | left; intros [ [] H]; cbv in H; congruence ]. - all: subst r; split; [ reflexivity | ]. - all: intros [] H; cbv in H; try (exfalso; congruence). - all: try (left; reflexivity). - all: try (right; vm_compute; reflexivity). + repeat match goal with r := context[match ?n with _ => _ end] |- _ => is_var n; destruct n end. + all: try (right; vm_compute; split; [ reflexivity | ]). + all: try (intros [] H; cbv in H; try (exfalso; congruence)). + all: try (constructor; reflexivity). + all: try (left; intros [ [] H ]; cbv in H; congruence). Qed. +Lemma reg_of_index_and_shift_and_bitcount_opt_of_index_and_shift_and_bitcount_of_reg : forall r : REG, reg_of_index_and_shift_and_bitcount_opt (index_and_shift_and_bitcount_of_reg r) = Some r. +Proof. destruct r; vm_compute; try reflexivity. Defined. + +Lemma reg_of_index_and_shift_and_bitcount_of_index_and_shift_and_bitcount_of_reg : forall r : REG, reg_of_index_and_shift_and_bitcount (index_and_shift_and_bitcount_of_reg r) = r. +Proof. destruct r; vm_compute; reflexivity. Defined. + + Lemma reg_of_index_and_shift_and_bitcount_opt_correct v r : reg_of_index_and_shift_and_bitcount_opt v = Some r <-> index_and_shift_and_bitcount_of_reg r = v. Proof. diff --git a/src/Assembly/WithBedrock/Semantics.v b/src/Assembly/WithBedrock/Semantics.v index f436d155d7..3566d62a1e 100644 --- a/src/Assembly/WithBedrock/Semantics.v +++ b/src/Assembly/WithBedrock/Semantics.v @@ -59,17 +59,17 @@ Definition bitmask_of_reg (r : REG) : Z Z.shiftl (Z.ones (Z.of_N bitcount)) (Z.of_N shift). Definition get_reg (st : reg_state) (r : REG) : Z := let '(idx, shift, bitcount) := index_and_shift_and_bitcount_of_reg r in - let rv := Tuple.nth_default 0%Z idx st in + let rv := Tuple.nth_default 0%Z (N.to_nat idx) st in Z.land (Z.shiftr rv (Z.of_N shift)) (Z.ones (Z.of_N bitcount)). Definition set_reg (st : reg_state) (r : REG) (v : Z) : reg_state := let '(idx, shift, bitcount) := index_and_shift_and_bitcount_of_reg r in Tuple.from_list_default 0%Z _ (ListUtil.update_nth - idx + (N.to_nat idx) (fun curv => Z.lor (Z.shiftl (Z.land v (Z.ones (Z.of_N bitcount))) (Z.of_N shift)) (Z.ldiff curv (Z.shiftl (Z.ones (Z.of_N bitcount)) (Z.of_N shift)))) (Tuple.to_list _ st)). Definition annotate_reg_state (st : reg_state) : list (REG * Z) - := List.map (fun '(n, v) => (widest_register_of_index n, v)) (enumerate (Tuple.to_list _ st)). + := List.map (fun '(n, v) => (widest_register_of_index (N.of_nat n), v)) (enumerate (Tuple.to_list _ st)). Ltac print_reg_state st := let st' := (eval cbv in (annotate_reg_state st)) in idtac st'. (* Kludge since [byte] isn't present in Coq 8.9 *) @@ -415,6 +415,40 @@ Definition DenoteNormalInstruction (st : machine_state) (instr : NormalInstructi | test, _ | xor, _ | xchg, _ => None + (* not yet supported *) + | cmove, _ + | cmovne, _ + | leave, _ + | movabs, _ + | movdqa, _ + | movdqu, _ + | movq, _ + | movd, _ + | movsx, _ + | movups, _ + | neg, _ + | nop, _ + | not, _ + | paddq, _ + | psubq, _ + | pshufd, _ + | pshufw, _ + | punpcklqdq, _ + | punpckhqdq, _ + | pslld, _ + | psrld, _ + | pand, _ + | pandn, _ + | por, _ + | pxor, _ + | psrad, _ + | rol, _ + | ror, _ + | sal, _ + | sete, _ + | setne, _ + | shld, _ + => None end | _ => None end | _ => None end%Z%option. diff --git a/src/Util/Strings/ParseArithmetic.v b/src/Util/Strings/ParseArithmetic.v index 178a4c6813..be571d1bc4 100644 --- a/src/Util/Strings/ParseArithmetic.v +++ b/src/Util/Strings/ParseArithmetic.v @@ -89,43 +89,39 @@ Local Coercion N.of_nat : nat >-> N. Local Coercion Z.of_N : N >-> Z. Local Coercion inject_Z : Z >-> Q. -Definition parse_N_digits (base : N) : ParserAction N - := (parse_map (digits_to_N base) ((parse_digits_gen_step base)+)). +Definition parse_N_digits (base : N) (first_digit_numeric : bool) : ParserAction N + := (parse_map (digits_to_N base) ((parse_digits_gen_step (if first_digit_numeric then N.min 10 base else base);;->{cons}(parse_digits_gen_step base)* ))). Definition parse_num_gen {P P'} (allow_neg : bool) (base : N) (parse_prefix : option (ParserAction P)) (parse_postfix : option (ParserAction P')) : ParserAction Q := (let parse_E_exponent := (("e" || "E") ;;->{ fun _ v => Qpower 10 v } (((strip_whitespace_after "-")?) ;;->{ fun n (v:N) => if n:option _ then (-v)%Z else v } - (parse_N_digits base)))%parse in + (parse_N_digits base false)))%parse in let parse_P_exponent := (("p" || "P") ;;->{ fun _ v => Qpower 2 v } (((strip_whitespace_after "-")?) ;;->{ fun n (v:N) => if n:option _ then (-v)%Z else v } - (parse_N_digits base)))%parse in + (parse_N_digits base false)))%parse in (if allow_neg then ((strip_whitespace_after "-")?) else parse_map (fun _ => None) "") ;;->{ fun n v => if n:option _ then (-v)%Q else v } - let parse_main - := let parse_main_digits := (parse_digits_gen_step base)* in - (((match parse_prefix with - | Some _ => parse_main_digits - | None => parse_digits_gen_step (N.min 10 base) ;;->{cons} parse_main_digits - end) - ;;->{ fun ds decimals - => (digits_to_N base ds + let parse_main first_digit_numeric + := ((((parse_N_digits base first_digit_numeric) + ;;->{ fun (d:N) decimals + => (d + digits_to_N base decimals / base^List.length decimals)%Q } "." ;;R (parse_digits_gen_step base)* ) - || parse_map (digits_to_N base : _ -> Q) ((parse_digits_gen_step base)+)) + || parse_map (digits_to_N base : _ -> Q) ((parse_digits_gen_step (if first_digit_numeric then N.min 10 base else base))+))) ;;->{ fun n e => match e with Some e => n * e | None => n end%Q } ((if base_accepts_E base then parse_P_exponent (* if [e] is a valid character in the base, then we don't permit [e] as an exponent *) else (parse_E_exponent || parse_P_exponent))?) in match parse_prefix, parse_postfix with - | None, None => parse_main - | Some parse_prefix, None => parse_prefix ;;R parse_main - | Some parse_prefix, Some parse_postfix => parse_prefix ;;R parse_main ;;L parse_postfix - | None, Some parse_postfix => parse_main ;;L parse_postfix + | None, None => parse_main true + | Some parse_prefix, None => parse_prefix ;;R parse_main false + | Some parse_prefix, Some parse_postfix => parse_prefix ;;R parse_main false ;;L parse_postfix + | None, Some parse_postfix => parse_main true ;;L parse_postfix end)%parse. Definition parse_num_gen_prefix {P} (allow_neg : bool) (base : N) (parse_prefix : ParserAction P) : ParserAction Q @@ -142,28 +138,22 @@ Definition parse_num (allow_neg : bool) : ParserAction Q Definition parse_int_gen {P P'} (allow_neg : bool) (base : N) (parse_prefix : option (ParserAction P)) (parse_postfix : option (ParserAction P')) : ParserAction Z := (let parse_E_exponent - := (("e" || "E") ;;->{ fun _ (v:N) => Z.pow 10 v } (parse_N_digits base))%parse in + := (("e" || "E") ;;->{ fun _ (v:N) => Z.pow 10 v } (parse_N_digits base false))%parse in let parse_P_exponent - := (("p" || "P") ;;->{ fun _ (v:N) => Z.pow 2 v } (parse_N_digits base))%parse in + := (("p" || "P") ;;->{ fun _ (v:N) => Z.pow 2 v } (parse_N_digits base false))%parse in (if allow_neg then ((strip_whitespace_after "-")?) else parse_map (fun _ => None) "") ;;->{ fun n v => if n:option _ then (-v)%Z else v } - let parse_main - := let parse_main_digits := (parse_digits_gen_step base)* in - (parse_map - (digits_to_N base) - match parse_prefix with - | Some _ => parse_main_digits - | None => parse_digits_gen_step (N.min 10 base) ;;->{cons} parse_main_digits - end) + let parse_main first_digit_numeric + := (parse_N_digits base first_digit_numeric) ;;->{ fun (n:N) e => match e with Some e => n * e | None => n end%Z } ((if base_accepts_E base then parse_P_exponent (* if [e] is a valid character in the base, then we don't permit [e] as an exponent *) else (parse_E_exponent || parse_P_exponent))?) in match parse_prefix, parse_postfix with - | None, None => parse_main - | Some parse_prefix, None => parse_prefix ;;R parse_main - | Some parse_prefix, Some parse_postfix => parse_prefix ;;R parse_main ;;L parse_postfix - | None, Some parse_postfix => parse_main ;;L parse_postfix + | None, None => parse_main true + | Some parse_prefix, None => parse_prefix ;;R parse_main false + | Some parse_prefix, Some parse_postfix => parse_prefix ;;R parse_main false ;;L parse_postfix + | None, Some parse_postfix => parse_main true ;;L parse_postfix end)%parse. Definition parse_int_gen_prefix {P} (allow_neg : bool) (base : N) (parse_prefix : ParserAction P) : ParserAction Z