diff --git a/src/Assembly/Equality.v b/src/Assembly/Equality.v index 4575629772..336da900e8 100644 --- a/src/Assembly/Equality.v +++ b/src/Assembly/Equality.v @@ -35,8 +35,8 @@ Bind Scope REG_scope with REG. 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. @@ -95,8 +95,8 @@ Bind Scope AccessSize_scope with AccessSize. Infix "=?" := AccessSize_beq : AccessSize_scope. Global Instance AccessSize_beq_spec : reflect_rel (@eq AccessSize) AccessSize_beq | 10 - := reflect_of_beq internal_AccessSize_dec_bl internal_AccessSize_dec_lb. -Definition AccessSize_beq_eq x y : (x =? y)%AccessSize = true <-> x = y := conj (@internal_AccessSize_dec_bl _ _) (@internal_AccessSize_dec_lb _ _). + := reflect_of_beq AccessSize_dec_bl AccessSize_dec_lb. +Definition AccessSize_beq_eq x y : (x =? y)%AccessSize = true <-> x = y := conj (@AccessSize_dec_bl _ _) (@AccessSize_dec_lb _ _). Lemma AccessSize_beq_neq x y : (x =? y)%AccessSize = false <-> x <> y. Proof. rewrite <- AccessSize_beq_eq; destruct (x =? y)%AccessSize; intuition congruence. Qed. Global Instance AccessSize_beq_compat : Proper (eq ==> eq ==> eq) AccessSize_beq | 10. @@ -141,8 +141,8 @@ Bind Scope FLAG_scope with FLAG. Infix "=?" := FLAG_beq : FLAG_scope. Global Instance FLAG_beq_spec : reflect_rel (@eq FLAG) FLAG_beq | 10 - := reflect_of_beq internal_FLAG_dec_bl internal_FLAG_dec_lb. -Definition FLAG_beq_eq x y : (x =? y)%FLAG = true <-> x = y := conj (@internal_FLAG_dec_bl _ _) (@internal_FLAG_dec_lb _ _). + := reflect_of_beq FLAG_dec_bl FLAG_dec_lb. +Definition FLAG_beq_eq x y : (x =? y)%FLAG = true <-> x = y := conj (@FLAG_dec_bl _ _) (@FLAG_dec_lb _ _). Lemma FLAG_beq_neq x y : (x =? y)%FLAG = false <-> x <> y. Proof. rewrite <- FLAG_beq_eq; destruct (x =? y)%FLAG; intuition congruence. Qed. Global Instance FLAG_beq_compat : Proper (eq ==> eq ==> eq) FLAG_beq | 10. @@ -155,8 +155,8 @@ Bind Scope OpCode_scope with OpCode. Infix "=?" := OpCode_beq : OpCode_scope. Global Instance OpCode_beq_spec : reflect_rel (@eq OpCode) OpCode_beq | 10 - := reflect_of_beq internal_OpCode_dec_bl internal_OpCode_dec_lb. -Definition OpCode_beq_eq x y : (x =? y)%OpCode = true <-> x = y := conj (@internal_OpCode_dec_bl _ _) (@internal_OpCode_dec_lb _ _). + := reflect_of_beq OpCode_dec_bl OpCode_dec_lb. +Definition OpCode_beq_eq x y : (x =? y)%OpCode = true <-> x = y := conj (@OpCode_dec_bl _ _) (@OpCode_dec_lb _ _). Lemma OpCode_beq_neq x y : (x =? y)%OpCode = false <-> x <> y. Proof. rewrite <- OpCode_beq_eq; destruct (x =? y)%OpCode; intuition congruence. Qed. Global Instance OpCode_beq_compat : Proper (eq ==> eq ==> eq) OpCode_beq | 10. @@ -169,8 +169,8 @@ Bind Scope OpPrefix_scope with OpPrefix. Infix "=?" := OpPrefix_beq : OpPrefix_scope. Global Instance OpPrefix_beq_spec : reflect_rel (@eq OpPrefix) OpPrefix_beq | 10 - := reflect_of_beq internal_OpPrefix_dec_bl internal_OpPrefix_dec_lb. -Definition OpPrefix_beq_eq x y : (x =? y)%OpPrefix = true <-> x = y := conj (@internal_OpPrefix_dec_bl _ _) (@internal_OpPrefix_dec_lb _ _). + := reflect_of_beq OpPrefix_dec_bl OpPrefix_dec_lb. +Definition OpPrefix_beq_eq x y : (x =? y)%OpPrefix = true <-> x = y := conj (@OpPrefix_dec_bl _ _) (@OpPrefix_dec_lb _ _). Lemma OpPrefix_beq_neq x y : (x =? y)%OpPrefix = false <-> x <> y. Proof. rewrite <- OpPrefix_beq_eq; destruct (x =? y)%OpPrefix; intuition congruence. Qed. Global Instance OpPrefix_beq_compat : Proper (eq ==> eq ==> eq) OpPrefix_beq | 10. diff --git a/src/Assembly/Equivalence.v b/src/Assembly/Equivalence.v index aff15463cd..8aab2442f9 100644 --- a/src/Assembly/Equivalence.v +++ b/src/Assembly/Equivalence.v @@ -4,6 +4,7 @@ From Coq Require Import ZArith. From Coq Require Import NArith. Require Import Crypto.Assembly.Syntax. Require Import Crypto.Assembly.Parse. +Require Import Crypto.Assembly.Equality. Require Import Crypto.Assembly.Symbolic. Require Import Crypto.Util.Strings.Parse.Common. Require Import Crypto.Util.ErrorT. @@ -277,8 +278,8 @@ Definition show_annotated_Line : Show AnnotatedLine end)%string. Global Instance show_lines_AnnotatedLines : ShowLines AnnotatedLines - := fun '(ls, ss) - => let d := dag.eager.force ss.(dag_state) in + := fun '(ls, sst) + => let d := dag.eager.force sst.(dag_state) in List.map (fun l => show_annotated_Line (l, d)) ls. Fixpoint remove_common_indices {T} (eqb : T -> T -> bool) (xs ys : list T) (start_idx : nat) : list (nat * T) * list T @@ -1275,10 +1276,10 @@ Definition init_symbolic_state_descr : description := Build_description "init_sy Definition init_symbolic_state (d : dag) : symbolic_state := let _ := init_symbolic_state_descr in - let '(initial_reg_idxs, d) := dag_gensym_n 16 d in + let '(initial_reg_idxs, d) := dag_gensym_n (List.length widest_registers) d in {| dag_state := d; - symbolic_reg_state := Tuple.from_list_default None 16 (List.map Some initial_reg_idxs); + symbolic_reg_state := Tuple.from_list_default None _ (List.map Some initial_reg_idxs); symbolic_mem_state := []; symbolic_flag_state := Tuple.repeat None 6; |}. diff --git a/src/Assembly/EquivalenceProofs.v b/src/Assembly/EquivalenceProofs.v index a4340e146f..f086330c74 100644 --- a/src/Assembly/EquivalenceProofs.v +++ b/src/Assembly/EquivalenceProofs.v @@ -1847,7 +1847,7 @@ Qed. (* TODO: this is Symbolic.get_reg; move to SymbolicProofs? *) Lemma get_reg_set_reg_full s rn rn' v : get_reg (set_reg s rn v) rn' - = if ((rn n) _ s)) && (rn =? rn'))%nat%bool + = if ((rn N.of_nat n) _ s)) && (rn =? rn'))%N%bool then Some v else get_reg s rn'. Proof. @@ -1863,7 +1863,7 @@ Qed. (* TODO: this is Symbolic.get_reg; move to SymbolicProofs? *) Local Lemma get_reg_set_reg_same s rn v - (H : (rn < (fun n (_ : Tuple.tuple _ n) => n) _ s)%nat) + (H : (rn < (fun n (_ : Tuple.tuple _ n) => N.of_nat n) _ s)%N) : get_reg (set_reg s rn v) rn = Some v. Proof. rewrite get_reg_set_reg_full; break_innermost_match; reflect_hyps; cbv beta in *; try reflexivity; lia. diff --git a/src/Assembly/Parse.v b/src/Assembly/Parse.v index 7b0f313d2a..9461f321ce 100644 --- a/src/Assembly/Parse.v +++ b/src/Assembly/Parse.v @@ -22,34 +22,18 @@ Local Open Scope list_scope. Local Open Scope string_scope. Local Open Scope parse_scope. -Derive REG_Listable SuchThat (@FinitelyListable REG REG_Listable) As REG_FinitelyListable. -Proof. prove_ListableDerive. Qed. -Global Existing Instances REG_Listable REG_FinitelyListable. - Global Instance show_REG : Show REG. Proof. prove_Show_enum (). Defined. Global Instance show_lvl_REG : ShowLevel REG := show_REG. -Derive FLAG_Listable SuchThat (@FinitelyListable FLAG FLAG_Listable) As FLAG_FinitelyListable. -Proof. prove_ListableDerive. Qed. -Global Existing Instances FLAG_Listable FLAG_FinitelyListable. - Global Instance show_FLAG : Show FLAG. Proof. prove_Show_enum (). Defined. Global Instance show_lvl_FLAG : ShowLevel FLAG := show_FLAG. -Derive OpCode_Listable SuchThat (@FinitelyListable OpCode OpCode_Listable) As OpCode_FinitelyListable. -Proof. prove_ListableDerive. Qed. -Global Existing Instances OpCode_Listable OpCode_FinitelyListable. - Global Instance show_OpCode : Show OpCode. Proof. prove_Show_enum (). Defined. Global Instance show_lvl_OpCode : ShowLevel OpCode := show_OpCode. -Derive OpPrefix_Listable SuchThat (@FinitelyListable OpPrefix OpPrefix_Listable) As OpPrefix_FinitelyListable. -Proof. prove_ListableDerive. Qed. -Global Existing Instances OpPrefix_Listable OpPrefix_FinitelyListable. - Global Instance show_OpPrefix : Show OpPrefix. Proof. prove_Show_enum (). Defined. Global Instance show_lvl_OpPrefix : ShowLevel OpPrefix := show_OpPrefix. @@ -72,10 +56,6 @@ Definition parse_FLAG_list : list (string * FLAG) Definition parse_FLAG : ParserAction FLAG := parse_strs parse_FLAG_list. -Derive AccessSize_Listable SuchThat (@FinitelyListable AccessSize AccessSize_Listable) As AccessSize_FinitelyListable. -Proof. prove_ListableDerive. Qed. -Global Existing Instances AccessSize_Listable AccessSize_FinitelyListable. - Global Instance show_AccessSize : Show AccessSize. Proof. prove_Show_enum (). Defined. Global Instance show_lvl_AccessSize : ShowLevel AccessSize := show_AccessSize. @@ -100,16 +80,26 @@ 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)) - => {| mem_bits_access_size := access_size:option AccessSize - ; mem_base_reg := br:option REG - ; mem_base_label := base_label - ; mem_scale_reg := sr:option (Z * REG) - ; mem_offset := offset:option Z |}) + := parse_option_list_map + (fun '(access_size, (constant_location_label, (br (*base reg*), sr (*scale reg, including z *), offset, base_label))) + => match base_label, constant_location_label with + | Some _, Some _ => (* invalid? *) None + | Some _ as lbl, None + | None, Some _ as lbl + | None, None as lbl => + Some + {| mem_bits_access_size := access_size:option AccessSize + ; mem_base_reg := br:option REG + ; mem_base_label := lbl + ; mem_scale_reg := sr:option (Z * REG) + ; mem_offset := offset:option Z |} + end) (((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 +150,13 @@ Definition parse_OpCode_list : list (string * OpCode) := Eval vm_compute in List.map (fun r => (show r, r)) - (list_all OpCode). + (list_all OpCode) + ++ [(".byte", db) + ; (".word", dw) + ; (".long", dd) + ; (".int", dd) + ; (".quad", dq) + ; (".octa", do)]. Definition parse_OpCode : ParserAction OpCode := parse_strs_case_insensitive parse_OpCode_list. @@ -254,7 +250,14 @@ 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 @@ -275,11 +278,21 @@ 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 - | None => reg_part ++ offset_part - | Some l => "((" ++ l ++ offset_part ++ "))" - end - ++ "]"). + match m.(mem_base_label), m.(mem_base_reg), m.(mem_offset), m.(mem_scale_reg) with + | Some lbl, Some rip, None, None => lbl ++ "[" ++ reg_part ++ offset_part ++ "]" + | Some lbl, _, _, _ => let l_offset := lbl ++ offset_part in + "[" ++ + (if reg_part =? "" + then "((" ++ l_offset ++ "))" + else reg_part ++ " + " ++ l_offset) + ++ "]" + | None, _, _, _ => + "[" ++ + (if reg_part =? "" + then "((" ++ offset_part ++ "))" + else reg_part ++ offset_part) + ++ "]" + end). Global Instance show_MEM : Show MEM := show_lvl_MEM. Global Instance show_lvl_JUMP_LABEL : ShowLevel JUMP_LABEL @@ -498,20 +511,86 @@ Definition find_globals (ls : Lines) : list string end) ls. -Fixpoint split_code_to_functions' (globals : list string) (ls : Lines) : Lines (* prefix *) * list (string (* global name *) * Lines) +Definition find_labels (ls : Lines) : list string + := Option.List.map + (fun l => match l.(rawline) with + | LABEL name => Some name + | _ => None + end) + ls. + +Fixpoint split_code_to_functions' (label_is_function : string -> bool) (ls : Lines) : Lines (* prefix *) * list (string (* global name *) * Lines) := match ls with | [] => ([], []) | l :: ls - => let '(prefix, rest) := split_code_to_functions' globals ls in + => let '(prefix, rest) := split_code_to_functions' label_is_function ls in let default := (l :: prefix, rest) in match l.(rawline) with - | LABEL name => if List.existsb (fun n => name =? n)%string globals + | LABEL name => if label_is_function name then ([], (name, l::prefix) :: rest) else default | _ => default end end. -Definition split_code_to_functions (ls : Lines) : Lines (* prefix *) * list (string (* global name *) * Lines) +Definition string_matches_loose (allow_prefix : bool) (allow_suffix : bool) (longer_string shorter_string : string) : bool + := match allow_prefix, allow_suffix with + | false, false => shorter_string =? longer_string + | true, false => String.endswith shorter_string longer_string + | false, true => String.startswith shorter_string longer_string + | true, true => String.is_substring shorter_string longer_string + end. +Definition split_code_to_listed_functions {allow_prefix allow_suffix : bool} (functions : list string) (ls : Lines) : Lines (* prefix *) * list (string (* global name *) * Lines) + := split_code_to_functions' (fun name => List.existsb (fun f => string_matches_loose allow_prefix allow_suffix f name)%string functions) ls. +Definition split_code_to_global_functions (ls : Lines) : Lines (* prefix *) * list (string (* global name *) * Lines) := let globals := find_globals ls in - split_code_to_functions' globals ls. + split_code_to_listed_functions (allow_prefix:=false) (allow_suffix:=false) globals ls. +Definition split_code_at_labels (ls : Lines) : Lines (* prefix *) * list (string (* label name *) * Lines) + := let labels := find_labels ls in + split_code_to_listed_functions (allow_prefix:=false) (allow_suffix:=false) labels ls. + +Fixpoint get_initial_data (ls : Lines) : list (AccessSize * list Z) + := let get_arg_consts args := + Option.List.lift + (List.map (fun arg => match arg with + | const c => Some c + | _ => None + end) + args) in + match ls with + | [] => [] + | l :: ls + => match l.(rawline) with + | INSTR instr => + match accesssize_of_declaration instr.(op) with + | None => [] + | Some size => + let csts := get_arg_consts instr.(args) in + match csts with + | Some csts => (size, csts) :: get_initial_data ls + | None => [] + end + end + | LABEL _ + | EMPTY + | GLOBAL _ + | DEFAULT_REL + => get_initial_data ls + | SECTION _ + | ALIGN _ + => [] + end + end. + +Definition get_labeled_data (ls : Lines) : list (string * list (AccessSize * list Z)) := + let '(_, labeled_data) := split_code_at_labels ls in + let labeled_data := List.map (fun '(lbl, lines) => (lbl, get_initial_data lines)) labeled_data in + let labeled_data := List.filter (fun '(_, data) => match data with nil => false | _ => true end) labeled_data in + labeled_data. + +Definition parse_assembly_options (ls : Lines) : assembly_program_options + := {| default_rel := Option.is_Some (List.find (fun l => match l.(rawline) with + | DEFAULT_REL => true + | _ => false + end) ls) + |}. diff --git a/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O0.s b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O0.s new file mode 100644 index 0000000000..5b4e23c0cc --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O0.s @@ -0,0 +1,1907 @@ +_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 + ret \ No newline at end of file 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.s b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O1.s new file mode 100644 index 0000000000..de53194df2 --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O1.s @@ -0,0 +1,905 @@ +_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 + ret \ No newline at end of file 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.s b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O2.s new file mode 100644 index 0000000000..660fd3bd49 --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O2.s @@ -0,0 +1,893 @@ +_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 + ret \ No newline at end of file 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.s b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O3.s new file mode 100644 index 0000000000..660fd3bd49 --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_O3.s @@ -0,0 +1,893 @@ +_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 + ret \ No newline at end of file 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.s b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_Os.s new file mode 100644 index 0000000000..ea36238564 --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_clang_19_1_0_Os.s @@ -0,0 +1,894 @@ +_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 + ret \ No newline at end of file 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.s b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O0.s new file mode 100644 index 0000000000..b3cdee1ae8 --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O0.s @@ -0,0 +1,2856 @@ +_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 + ret \ No newline at end of file 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.s b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O1.s new file mode 100644 index 0000000000..3901ac0fdc --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O1.s @@ -0,0 +1,922 @@ +_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 + ret \ No newline at end of file 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.s b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O2.s new file mode 100644 index 0000000000..06e5ec8770 --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O2.s @@ -0,0 +1,851 @@ +_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 + .quad 4503599627370494 \ No newline at end of file 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.s b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O3.s new file mode 100644 index 0000000000..06e5ec8770 --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_O3.s @@ -0,0 +1,851 @@ +_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 + .quad 4503599627370494 \ No newline at end of file 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.s b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_Os.s new file mode 100644 index 0000000000..0d5d63e7da --- /dev/null +++ b/src/Assembly/Parse/Examples/fiat_25519_all_gcc_14_1_Os.s @@ -0,0 +1,843 @@ +_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 + ret \ No newline at end of file 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/Symbolic.v b/src/Assembly/Symbolic.v index 593a30c720..e0321dcf91 100644 --- a/src/Assembly/Symbolic.v +++ b/src/Assembly/Symbolic.v @@ -3829,7 +3829,7 @@ Definition simplify {opts : symbolic_options_computed_opt} (dag : dag) (e : node Lemma eval_simplify {opts : symbolic_options_computed_opt} G d n v : gensym_dag_ok G d -> eval_node G d n v -> eval G d (simplify d n) v. Proof using Type. eauto using Rewrite.eval_expr, eval_node_reveal_node_at_least. Qed. -Definition reg_state := Tuple.tuple (option idx) 16. +Definition reg_state := Tuple.tuple (option idx) (cbv! (List.length widest_registers)). Definition flag_state := Tuple.tuple (option idx) 6. Definition mem_state := list (idx * idx). @@ -3863,16 +3863,16 @@ Definition reverse_lookup_flag (st : flag_state) (i : idx) : option FLAG (List.find (fun v => option_beq N.eqb (Some i) (fst v)) (Tuple.to_list _ (Tuple.map2 (@pair _ _) st (CF, PF, AF, ZF, SF, OF)))). -Definition get_reg (st : reg_state) (ri : nat) : option idx - := Tuple.nth_default None ri st. -Definition set_reg (st : reg_state) ri (i : idx) : reg_state +Definition get_reg (st : reg_state) (ri : N) : option idx + := Tuple.nth_default None (N.to_nat ri) st. +Definition set_reg (st : reg_state) (ri : N) (i : idx) : reg_state := Tuple.from_list_default None _ (ListUtil.set_nth - ri + (N.to_nat ri) (Some i) (Tuple.to_list _ st)). Definition reverse_lookup_widest_reg (st : reg_state) (i : idx) : option REG := option_map - (fun v => widest_register_of_index (fst v)) + (fun v => widest_register_of_index (N.of_nat (fst v))) (List.find (fun v => option_beq N.eqb (Some i) (snd v)) (List.enumerate (Tuple.to_list _ st))). @@ -3906,7 +3906,7 @@ Definition update_mem_with (st : symbolic_state) (f : mem_state -> mem_state) : := {| dag_state := st.(dag_state); symbolic_reg_state := st.(symbolic_reg_state) ; symbolic_flag_state := st.(symbolic_flag_state) ; symbolic_mem_state := f st.(symbolic_mem_state) |}. Global Instance show_reg_state : Show reg_state := fun st => - show (List.map (fun '(n, v) => (widest_register_of_index n, v)) (ListUtil.List.enumerate (Option.List.map id (Tuple.to_list _ st)))). + show (List.map (fun '(n, v) => (widest_register_of_index (N.of_nat n), v)) (ListUtil.List.enumerate (Option.List.map id (Tuple.to_list _ st)))). Global Instance show_flag_state : Show flag_state := fun '(cfv, pfv, afv, zfv, sfv, ofv) => ( @@ -3934,15 +3934,15 @@ Global Instance ShowLines_symbolic_state : ShowLines symbolic_state := fun X : symbolic_state => match X with | {| - dag_state := ds; + dag_state := dagst; symbolic_reg_state := rs; - symbolic_flag_state := fs; + symbolic_flag_state := flst; symbolic_mem_state := ms |} => ["(*symbolic_state*) {|"; - " dag_state :="] ++ show_lines ds ++ [";"; + " dag_state :="] ++ show_lines dagst ++ [";"; (" symbolic_reg_state := " ++ show rs ++ ";")%string; - (" symbolic_flag_state := " ++ show fs ++";")%string; + (" symbolic_flag_state := " ++ show flst ++";")%string; " symbolic_mem_state :="] ++show_lines ms ++ [";"; "|}"] end%list%string. @@ -4042,9 +4042,9 @@ Definition mapM_ {A B} (f: A -> M B) l : M unit := _ <- mapM f l; ret tt. Definition error_get_reg_of_reg_index ri : symbolic_state -> error := error.get_reg (let r := widest_register_of_index ri in - if (reg_index r =? ri)%nat + if (reg_index r =? ri)%N then inr r - else inl ri). + else inl (N.to_nat ri)). Definition GetFlag f : M idx := some_or (fun s => get_flag s f) (error.get_flag f). diff --git a/src/Assembly/Syntax.v b/src/Assembly/Syntax.v index 50dd2e5046..ef4a722a91 100644 --- a/src/Assembly/Syntax.v +++ b/src/Assembly/Syntax.v @@ -3,7 +3,11 @@ 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 Import Crypto.Util.Listable. +Require Import Crypto.Util.ListUtil. Require Crypto.Util.Tuple. Require Crypto.Util.OptionList. Import ListNotations. @@ -11,27 +15,70 @@ 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 *) . +Derive REG_Listable SuchThat (@FinitelyListable REG REG_Listable) As REG_FinitelyListable. +Proof. prove_ListableDerive. Qed. +Global Existing Instances REG_Listable REG_FinitelyListable. +Definition REG_beq : REG -> REG -> bool := eqb_of_listable. +Definition REG_dec_bl : forall x y, REG_beq x y = true -> x = y := eqb_of_listable_bl. +Definition REG_dec_lb : forall x y, x = y -> REG_beq x y = true := eqb_of_listable_lb. +Definition REG_eq_dec : forall x y : REG, {x = y} + {x <> y} := eq_dec_of_listable. + Definition CONST := Z. Coercion CONST_of_Z (x : Z) : CONST := x. -Inductive AccessSize := byte | word | dword | qword. +Inductive AccessSize := byte | word | dword | qword | tbyte | xmmword | ymmword | zmmword. + +Derive AccessSize_Listable SuchThat (@FinitelyListable AccessSize AccessSize_Listable) As AccessSize_FinitelyListable. +Proof. prove_ListableDerive. Qed. +Global Existing Instances AccessSize_Listable AccessSize_FinitelyListable. +Definition AccessSize_beq : AccessSize -> AccessSize -> bool := eqb_of_listable. +Definition AccessSize_dec_bl : forall x y, AccessSize_beq x y = true -> x = y := eqb_of_listable_bl. +Definition AccessSize_dec_lb : forall x y, x = y -> AccessSize_beq x y = true := eqb_of_listable_lb. +Definition AccessSize_eq_dec : forall x y : AccessSize, {x = y} + {x <> y} := eq_dec_of_listable. + Coercion bits_of_AccessSize (x : AccessSize) : N := match x with | byte => 8 | word => 16 | dword => 32 | qword => 64 + | tbyte => 80 + | 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 }. @@ -41,12 +88,28 @@ Definition mem_of_reg (r : REG) : MEM := Inductive FLAG := CF | PF | AF | ZF | SF | OF. +Derive FLAG_Listable SuchThat (@FinitelyListable FLAG FLAG_Listable) As FLAG_FinitelyListable. +Proof. prove_ListableDerive. Qed. +Global Existing Instances FLAG_Listable FLAG_FinitelyListable. +Definition FLAG_beq : FLAG -> FLAG -> bool := eqb_of_listable. +Definition FLAG_dec_bl : forall x y, FLAG_beq x y = true -> x = y := eqb_of_listable_bl. +Definition FLAG_dec_lb : forall x y, x = y -> FLAG_beq x y = true := eqb_of_listable_lb. +Definition FLAG_eq_dec : forall x y : FLAG, {x = y} + {x <> y} := eq_dec_of_listable. + Inductive OpPrefix := | rep | repz | repnz . +Derive OpPrefix_Listable SuchThat (@FinitelyListable OpPrefix OpPrefix_Listable) As OpPrefix_FinitelyListable. +Proof. prove_ListableDerive. Qed. +Global Existing Instances OpPrefix_Listable OpPrefix_FinitelyListable. +Definition OpPrefix_beq : OpPrefix -> OpPrefix -> bool := eqb_of_listable. +Definition OpPrefix_dec_bl : forall x y, OpPrefix_beq x y = true -> x = y := eqb_of_listable_bl. +Definition OpPrefix_dec_lb : forall x y, x = y -> OpPrefix_beq x y = true := eqb_of_listable_lb. +Definition OpPrefix_eq_dec : forall x y : OpPrefix, {x = y} + {x <> y} := eq_dec_of_listable. + Inductive OpCode := | adc | adcx @@ -58,34 +121,70 @@ Inductive OpCode := | clc | cmovb | cmovc +| cmove (* Conditional move if equal *) +| cmovne (* Conditional move if not equal *) | cmovnz | cmovo | cmp | db +| dw | dd -| dec | dq -| dw +| dt +| do +| dy +| dz +| dec | imul | inc | 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 @@ -95,6 +194,100 @@ Inductive OpCode := | xor . +Derive OpCode_Listable SuchThat (@FinitelyListable OpCode OpCode_Listable) As OpCode_FinitelyListable. +Proof. prove_ListableDerive. Qed. +Global Existing Instances OpCode_Listable OpCode_FinitelyListable. +Definition OpCode_beq : OpCode -> OpCode -> bool := eqb_of_listable. +Definition OpCode_dec_bl : forall x y, OpCode_beq x y = true -> x = y := eqb_of_listable_bl. +Definition OpCode_dec_lb : forall x y, x = y -> OpCode_beq x y = true := eqb_of_listable_lb. +Definition OpCode_eq_dec : forall x y : OpCode, {x = y} + {x <> y} := eq_dec_of_listable. + +Definition accesssize_of_declaration (opc : OpCode) : option AccessSize := + match opc with + | db => Some byte + | dd => Some dword + | dq => Some qword + | dw => Some word + | dt => Some tbyte + | do => Some xmmword + | dy => Some ymmword + | dz => Some zmmword + | adc + | adcx + | add + | adox + | and + | bzhi + | call + | clc + | cmovb + | cmovc + | cmove + | cmovne + | cmovnz + | cmovo + | cmp + | dec + | imul + | inc + | je + | jmp + | lea + | leave + | mov + | movabs + | movdqa + | movdqu + | movq + | movd + | movsx + | movups + | movzx + | mul + | mulx + | neg + | nop + | not + | or + | paddq + | pop + | psubq + | pshufd + | pshufw + | punpcklqdq + | punpckhqdq + | pslld + | psrld + | pand + | pandn + | por + | pxor + | psrad + | push + | rcr + | ret + | rol + | ror + | sal + | sar + | sbb + | setc + | sete + | setne + | seto + | shl + | shlx + | shld + | shr + | shrx + | shrd + | sub + | test + | xchg + | xor + => None + end. + Record JUMP_LABEL := { jump_near : bool ; label_name : string }. Inductive ARG := reg (r : REG) | mem (m : MEM) | const (c : CONST) | label (l : JUMP_LABEL). @@ -119,14 +312,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) => 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) => 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) + => 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 := @@ -172,154 +389,90 @@ Definition operand_size (x : ARG) (operation_size : N) : N := | None => operation_size end. - -Definition reg_index (r : REG) : nat - := match r with - | rax - | eax - | ax - |(ah | al) - => 0 - | rcx - | ecx - | cx - |(ch | cl) - => 1 - | rdx - | edx - | dx - |(dh | dl) - => 2 - | rbx - | ebx - | bx - |(bh | bl) - => 3 - | rsp - | esp - | sp - |( spl) - => 4 - | rbp - | ebp - | bp - |( bpl) - => 5 - | rsi - | esi - | si - |( sil) - => 6 - | rdi - | edi - | di - |( dil) - => 7 - | r8 - | r8d - | r8w - | r8b - => 8 - | r9 - | r9d - | r9w - | r9b - => 9 - | r10 - | r10d - | r10w - | r10b - => 10 - | r11 - | r11d - | r11w - | r11b - => 11 - | r12 - | r12d - | r12w - | r12b - => 12 - | r13 - | r13d - | r13w - | r13b - => 13 - | r14 - | r14d - | r14w - | r14b - => 14 - | r15 - | r15d - | r15w - | r15b - => 15 - end. 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 - end. -Definition index_and_shift_and_bitcount_of_reg (r : REG) := - (reg_index r, reg_offset r, reg_size r). + match r with + |(ah | ch | dh | bh ) + => 8 + | _ => 0 + end. -Definition regs_of_index (index : nat) : 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] ] - | _ => [] +Definition widest_register_of (r : REG) : REG := + match r with + | ((al | ah) | ax | eax | rax) => rax + | ((cl | ch) | cx | ecx | rcx) => rcx + | ((dl | dh) | dx | edx | rdx) => rdx + | ((bl | bh) | bx | ebx | rbx) => rbx + | (spl | sp | esp | rsp) => rsp + | (bpl | bp | ebp | rbp) => rbp + | (sil | si | esi | rsi) => rsi + | (dil | di | edi | rdi) => rdi + | (r8b | r8w | r8d | r8) => r8 + | (r9b | r9w | r9d | r9) => r9 + | (r10b | r10w | r10d | r10) => r10 + | (r11b | r11w | r11d | r11) => r11 + | (r12b | r12w | r12d | r12) => r12 + | (r13b | r13w | r13d | r13) => r13 + | (r14b | r14w | r14d | r14) => r14 + | (r15b | r15w | r15d | r15) => r15 + | (ip | eip | rip) => rip + (* | (flags | eflags | rflags) => rflags *) + | (xmm0 | ymm0 | zmm0) => zmm0 + | (xmm1 | ymm1 | zmm1) => zmm1 + | (xmm2 | ymm2 | zmm2) => zmm2 + | (xmm3 | ymm3 | zmm3) => zmm3 + | (xmm4 | ymm4 | zmm4) => zmm4 + | (xmm5 | ymm5 | zmm5) => zmm5 + | (xmm6 | ymm6 | zmm6) => zmm6 + | (xmm7 | ymm7 | zmm7) => zmm7 + | (xmm8 | ymm8 | zmm8) => zmm8 + | (xmm9 | ymm9 | zmm9) => zmm9 + | (xmm10 | ymm10 | zmm10) => zmm10 + | (xmm11 | ymm11 | zmm11) => zmm11 + | (xmm12 | ymm12 | zmm12) => zmm12 + | (xmm13 | ymm13 | zmm13) => zmm13 + | (xmm14 | ymm14 | zmm14) => zmm14 + | (xmm15 | ymm15 | zmm15) => zmm15 + | (msw | cr0) => cr0 + | _ => r end. +Definition widest_registers := Eval lazy in List.filter (fun x => REG_beq x (widest_register_of x)) (list_all REG). + +Definition wide_reg_index_pairs := Eval lazy in List.map (fun '(n, r) => (N.of_nat n, r)) (List.enumerate widest_registers). + +Definition eta_reg {A} : (REG -> A) -> (REG -> A). +Proof. + intros f r; pose (f r) as fr; destruct r. + all: let v := eval cbv in fr in exact v. +Defined. + +Definition reg_index (r : REG) : N := Eval lazy in + eta_reg (fun r => + Option.value + (option_map (@fst _ _) (find (fun '(n, r') => REG_beq (widest_register_of r) r') wide_reg_index_pairs)) + 0%N) + r. + +Definition widest_register_of_index_opt (n : N) : option REG + := List.nth_error (List.map (@snd _ _) wide_reg_index_pairs) (N.to_nat 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 + := Option.value (widest_register_of_index_opt n) rax. + +Definition index_and_shift_and_bitcount_of_reg (r : REG) := + (reg_index r, reg_offset r, reg_size r). + +Definition overlapping_registers (r : REG) : list REG := Eval lazy in eta_reg + (fun r => List.filter (fun r' => REG_beq (widest_register_of r) (widest_register_of r')) (list_all REG)) + r. Definition reg_of_index_and_shift_and_bitcount_opt := fun '(index, offset, size) => - let sz := N.log2 (size / 8) in - let offset_n := (offset / 8)%N in - if ((8 * 2^sz =? size) && (offset =? offset_n * 8))%N%bool - then (rs <- nth_error (regs_of_index index) (N.to_nat sz); - nth_error rs (N.to_nat offset_n))%option - else None. + (wr <- widest_register_of_index_opt index; + let rs := overlapping_registers wr in + List.find (fun r => ((reg_size r =? size) && (reg_offset r =? offset))%N%bool) rs)%option. + Definition reg_of_index_and_shift_and_bitcount := fun '(index, offset, size) => match reg_of_index_and_shift_and_bitcount_opt (index, offset, size) with @@ -327,59 +480,6 @@ Definition reg_of_index_and_shift_and_bitcount := | None => widest_register_of_index index end. -Lemma widest_register_of_index_correct - : forall n, - (~exists r, reg_index r = n) - \/ (let r := widest_register_of_index n in reg_index r = n - /\ forall r', reg_index r' = n -> r = r' \/ (reg_size r' < reg_size r)%N). -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). -Qed. - -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. - split; [ | intro; subst; destruct r; vm_compute; reflexivity ]. - cbv [index_and_shift_and_bitcount_of_reg]; destruct v as [ [index shift] bitcount ]. - cbv [reg_of_index_and_shift_and_bitcount_opt]. - generalize (shift / 8)%N (N.log2 (bitcount / 8)); intros *. - repeat first [ congruence - | progress subst - | match goal with - | [ H : _ /\ _ |- _ ] => destruct H - | [ H : N.to_nat _ = _ |- _ ] => apply (f_equal N.of_nat) in H; rewrite N2Nat.id in H; subst - | [ |- Some _ = Some _ -> _ ] => inversion 1; subst - | [ |- context[match ?x with _ => _ end] ] => destruct x eqn:?; subst - end - | progress cbv [regs_of_index] - | match goal with - | [ |- context[nth_error _ ?n] ] => destruct n eqn:?; cbn [nth_error Option.bind] - end - | rewrite Bool.andb_true_iff, ?N.eqb_eq in * |- ]. - all: vm_compute; reflexivity. -Qed. - -Lemma reg_of_index_and_shift_and_bitcount_of_reg r - : reg_of_index_and_shift_and_bitcount (index_and_shift_and_bitcount_of_reg r) = r. -Proof. destruct r; vm_compute; reflexivity. Qed. - -Lemma reg_of_index_and_shift_and_bitcount_eq v r - : reg_of_index_and_shift_and_bitcount v = r - -> (index_and_shift_and_bitcount_of_reg r = v - \/ ((~exists r, index_and_shift_and_bitcount_of_reg r = v) - /\ r = widest_register_of_index (fst (fst v)))). -Proof. - cbv [reg_of_index_and_shift_and_bitcount]. - destruct v as [ [index offset] size ]. - destruct reg_of_index_and_shift_and_bitcount_opt eqn:H; - [ left | right; split; [ intros [r' H'] | ] ]; subst; try reflexivity. - { rewrite reg_of_index_and_shift_and_bitcount_opt_correct in H; assumption. } - { rewrite <- reg_of_index_and_shift_and_bitcount_opt_correct in H'; congruence. } -Qed. +Class assembly_program_options := { + default_rel : bool ; +}. diff --git a/src/Assembly/SyntaxTests.v b/src/Assembly/SyntaxTests.v new file mode 100644 index 0000000000..4659c239df --- /dev/null +++ b/src/Assembly/SyntaxTests.v @@ -0,0 +1,155 @@ +From Coq Require Import ZArith. +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 Import Crypto.Util.Listable. +Require Import Crypto.Util.ListUtil. +Require Import Crypto.Assembly.Syntax. +Require Crypto.Util.Tuple. +Require Crypto.Util.OptionList. +Import ListNotations. + +Local Open Scope list_scope. + +Local Set Implicit Arguments. +Local Set Primitive Projections. + +Local Coercion N.of_nat : nat >-> N. + +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_index_widest_register_of : forall r : REG, reg_index (widest_register_of r) = reg_index r. +Proof. destruct r; reflexivity. Defined. + +Lemma reg_index_widest_register_of_index_opt : forall index : N, (N.to_nat index option_map reg_index (widest_register_of_index_opt index) = Some index. +Proof. + intros index; cbv [widest_register_of_index_opt]. + rewrite <- (N2Nat.id index), Nat2N.id; generalize (N.to_nat index); clear index; intro index. + vm_compute List.map. + vm_compute List.length. + cbv [Nat.ltb]; cbn [Nat.leb]. + repeat lazymatch goal with + | [ |- false = true -> _ ] => discriminate + | [ |- (?index <=? _) = true -> _ ] => + is_var index; destruct index; [ reflexivity | cbn [Nat.leb] ] + end. +Qed. + +Lemma widest_register_of_index_opt_Some_length_iff : forall index : N, (exists r, widest_register_of_index_opt index = Some r) <-> (N.to_nat index _ ] => is_var index; destruct index; cbn [nth_error] + | [ |- _ <-> false = true ] => split; [ | discriminate ] + | [ |- _ <-> true = true ] => repeat esplit + | [ |- _ <-> (?index <=? _) = true ] => + is_var index; destruct index; cbn [Nat.leb nth_error] + end. + all: intros [? H]; discriminate. +Qed. + +Lemma reg_index_widest_register_of_index : forall index : N, (N.to_nat index reg_index (widest_register_of_index index) = index. +Proof. + intros index H; cbv [widest_register_of_index]. + apply reg_index_widest_register_of_index_opt in H. + destruct widest_register_of_index_opt; cbv [option_map] in *; inversion H; subst. + reflexivity. +Qed. + +Lemma reg_index_overlapping_registers : forall r r' n, nth_error (overlapping_registers r) n = Some r' -> reg_index r' = reg_index r. +Proof. + intros r r' n; destruct r. + all: vm_compute overlapping_registers. + all: repeat lazymatch goal with + | [ |- nth_error (_ :: _) ?v = Some _ -> _ ] => is_var v; destruct v; cbn [nth_error] + | [ |- nth_error [] ?v = Some _ -> _ ] => is_var v; destruct v; cbn [nth_error] + | [ |- Some _ = Some _ -> _ ] => let H := fresh in intro H; inversion H + | [ |- None = Some _ -> _ ] => let H := fresh in intro H; inversion H + end. + all: subst; reflexivity. +Qed. + +Lemma reg_of_index_and_shift_and_bitcount_of_reg r + : reg_of_index_and_shift_and_bitcount (index_and_shift_and_bitcount_of_reg r) = r. +Proof. destruct r; vm_compute; reflexivity. Qed. + +Lemma widest_register_of_index_opt_correct + : forall n r, widest_register_of_index_opt n = Some r -> + reg_index r = n + /\ forall r', reg_index r' = n -> r = r' \/ (reg_size r' < reg_size r)%N. +Proof. + intros n r H. + epose proof (proj1 (widest_register_of_index_opt_Some_length_iff _) (ex_intro _ _ H)) as H'. + pose proof H' as H''. + apply reg_index_widest_register_of_index_opt in H''. + rewrite H in H''; cbn in H''; inversion H''; subst. + split; [ reflexivity | ]. + destruct r, r'. + all: vm_compute; try (constructor; reflexivity); try discriminate. +Qed. + +Lemma widest_register_of_index_correct + : forall n, + (~exists r, reg_index r = n) + \/ (let r := widest_register_of_index n in reg_index r = n + /\ forall r', reg_index r' = n -> r = r' \/ (reg_size r' < reg_size r)%N). +Proof. + intro n; pose proof (widest_register_of_index_opt_correct n) as H. + cbv [widest_register_of_index]. + destruct (widest_register_of_index_opt n) as [r |] eqn:H'; [ right; apply H; reflexivity | left ]. + intros [ [] H'' ]; subst; cbv in H'. + all: inversion H'. +Qed. + +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. + split; [ | intro; subst; destruct r; vm_compute; reflexivity ]. + cbv [index_and_shift_and_bitcount_of_reg]; destruct v as [ [index shift] bitcount ]. + cbv [reg_of_index_and_shift_and_bitcount_opt]. + pose proof (reg_index_widest_register_of_index index) as H''. + cbv [widest_register_of_index] in H''. + rewrite <- widest_register_of_index_opt_Some_length_iff in H''. + destruct widest_register_of_index_opt eqn:H; [ | intro H'; cbv in H'; now inversion H' ]. + cbv [Option.bind Option.sequence_return] in *. + specialize (H'' (ex_intro _ _ eq_refl)). + subst. + rewrite find_some_iff. + repeat first + [ progress intros + | progress destruct_head'_ex + | progress destruct_head'_and + | progress reflect_hyps + | progress subst + | match goal with + | [ H : nth_error (overlapping_registers _) _ = Some _ |- _ ] => + apply reg_index_overlapping_registers in H; try rewrite H + end + | reflexivity ]. +Qed. + +Lemma reg_of_index_and_shift_and_bitcount_eq v r + : reg_of_index_and_shift_and_bitcount v = r + -> (index_and_shift_and_bitcount_of_reg r = v + \/ ((~exists r, index_and_shift_and_bitcount_of_reg r = v) + /\ r = widest_register_of_index (fst (fst v)))). +Proof. + cbv [reg_of_index_and_shift_and_bitcount]. + destruct v as [ [index offset] size ]. + destruct reg_of_index_and_shift_and_bitcount_opt eqn:H; + [ left | right; split; [ intros [r' H'] | ] ]; subst; try reflexivity. + { rewrite reg_of_index_and_shift_and_bitcount_opt_correct in H; assumption. } + { rewrite <- reg_of_index_and_shift_and_bitcount_opt_correct in H'; congruence. } +Qed. diff --git a/src/Assembly/WithBedrock/Semantics.v b/src/Assembly/WithBedrock/Semantics.v index f436d155d7..81165d2d52 100644 --- a/src/Assembly/WithBedrock/Semantics.v +++ b/src/Assembly/WithBedrock/Semantics.v @@ -9,6 +9,7 @@ Require Import Crypto.Util.Option. Require Import Crypto.Util.Bool. Require Import Crypto.Util.Bool.Reflect. Require Import Crypto.Util.ListUtil. +Require Import Crypto.Util.Strings.StringMap. Require Import Crypto.Util.Tactics.DestructHead. Require Import Crypto.Util.Tactics.BreakMatch. Require Import Crypto.Util.Notations. @@ -53,23 +54,23 @@ Definition havoc_flag (st : flag_state) (f : FLAG) : flag_state Definition havoc_flags : flag_state := (None, None, None, None, None, None). -Definition reg_state := Tuple.tuple Z 16. +Definition reg_state := Tuple.tuple Z (cbv! (List.length widest_registers)). Definition bitmask_of_reg (r : REG) : Z := let '(idx, shift, bitcount) := index_and_shift_and_bitcount_of_reg r in 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.combine widest_registers (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 *) @@ -86,10 +87,19 @@ Require Import coqutil.Map.Interface. (* coercions *) Require Import coqutil.Word.LittleEndianList. Require Import bedrock2.Memory. Import WithoutTuples. Require coqutil.Word.Naive coqutil.Map.SortedListWord. + Definition mem_state := (SortedListWord.map (Naive.word 64) Byte.byte). -Definition get_mem (st : mem_state) (addr : Z) (nbytes : nat) : option Z - := (bs <- load_bytes st (word.of_Z addr) nbytes; Some (LittleEndianList.le_combine bs))%option. +Definition get_mem (st : mem_state) (addr : option (string * bool) * Z) (nbytes : nat) : option Z := + let '(base_label, offset) := addr in + match base_label with + | Some (base_label, true) => None (* TODO: NOT YET IMPLEMENTED *) + | Some (_, false) => None + | None => + bs <- load_bytes st (word.of_Z offset) nbytes; + Some (LittleEndianList.le_combine bs) + end%option. + Definition set_mem (st : mem_state) (addr : Z) (nbytes : nat) (v : Z) : option mem_state := store_bytes st (word.of_Z addr) (LittleEndianList.le_split nbytes v). @@ -104,29 +114,36 @@ Definition update_mem_with (st : machine_state) (f : mem_state -> mem_state) : m Definition DenoteConst (sz : N) (a : CONST) : Z := Z.land a (Z.ones (Z.of_N sz)). -Definition DenoteAddress (sa : N) (st : machine_state) (a : MEM) : Z := +Definition DenoteAddress {opts:assembly_program_options} (sa : N) (st : machine_state) (a : MEM) : option (string * bool) * Z := + let '(lbl, base_reg) := + match mem_base_label a, mem_base_reg a with + | Some lbl, Some rip => (Some (lbl, true), None) + | Some lbl, r => (Some (lbl, default_rel), r) + | None, r => (None, r) + end in + (lbl, Z.land ( - match mem_base_reg a with Some r => get_reg st r | _ => 0 end + + match base_reg with Some r => get_reg st r | _ => 0 end + match mem_scale_reg a with Some (z, r) => get_reg st r * DenoteConst sa z | _ => 0 end + match mem_offset a with Some z => DenoteConst sa z | _ => 0 end - ) (Z.ones (Z.of_N sa)). + ) (Z.ones (Z.of_N sa))). -Definition DenoteOperand (sa s : N) (st : machine_state) (a : ARG) : option Z := +Definition DenoteOperand {opts:assembly_program_options} (sa s : N) (st : machine_state) (a : ARG) : option Z := match a with | reg a => Some (get_reg st a) | mem a => get_mem st (DenoteAddress sa st a) (N.to_nat (N.div (operand_size a s) 8)) | const a => Some (DenoteConst (operand_size a s) a) | label _ => None - end. + end%option. Definition SetMem (st : machine_state) (addr : Z) (nbytes : nat) (v : Z) : option machine_state := ms <- set_mem st addr nbytes v; Some (update_mem_with st (fun _ => ms)). -Definition SetOperand (sa s : N) (st : machine_state) (a : ARG) (v : Z) : option machine_state := +Definition SetOperand {opts:assembly_program_options} (sa s : N) (st : machine_state) (a : ARG) (v : Z) : option machine_state := match a with | reg a => Some (update_reg_with st (fun rs => set_reg rs a v)) - | mem a => SetMem st (DenoteAddress sa st a) (N.to_nat (N.div (operand_size a s) 8)) v + | mem a => let '(_lbl, addr) := DenoteAddress sa st a in SetMem st addr (N.to_nat (N.div (operand_size a s) 8)) v | const a => None | label _ => None end. @@ -158,7 +175,7 @@ Definition rcrcnt s cnt : Z := (* NOTE: currently immediate operands are treated as if sign-extension has been * performed ahead of time. *) -Definition DenoteNormalInstruction (st : machine_state) (instr : NormalInstruction) : option machine_state := +Definition DenoteNormalInstruction {opts:assembly_program_options} (st : machine_state) (instr : NormalInstruction) : option machine_state := let sa := 64%N in let stack_addr_size := 64%N in match operation_size instr with Some s => @@ -196,7 +213,9 @@ Definition DenoteNormalInstruction (st : machine_state) (instr : NormalInstructi then SetOperand sa s st dst v else Some st | lea, [reg dst; mem src] => (* Flags Affected: None *) - Some (update_reg_with st (fun rs => set_reg rs dst (DenoteAddress sa st src))) + let '(lbl, addr) := DenoteAddress sa st src in + _ <- match lbl with None => Some tt | Some _ => None end; (* We don't support extracting label addresses *) + Some (update_reg_with st (fun rs => set_reg rs dst addr)) | (add | adc) as opc, [dst; src] => c <- (match opc with adc => get_flag st CF | _ => Some false end); let c := Z.b2z c in @@ -381,6 +400,10 @@ Definition DenoteNormalInstruction (st : machine_state) (instr : NormalInstructi | dw, _ | dd, _ | dq, _ + | do, _ + | dt, _ + | dy, _ + | dz, _ | mulx, _ | mul, _ | call, _ @@ -415,10 +438,44 @@ 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. -Definition DenoteRawLine (st : machine_state) (rawline : RawLine) : option machine_state := +Definition DenoteRawLine {opts:assembly_program_options} (st : machine_state) (rawline : RawLine) : option machine_state := match rawline with | EMPTY | LABEL _ @@ -432,10 +489,10 @@ Definition DenoteRawLine (st : machine_state) (rawline : RawLine) : option machi => None end. -Definition DenoteLine (st : machine_state) (line : Line) : option machine_state +Definition DenoteLine {opts:assembly_program_options} (st : machine_state) (line : Line) : option machine_state := DenoteRawLine st line.(rawline). -Fixpoint DenoteLines (st : machine_state) (lines : Lines) : option machine_state +Fixpoint DenoteLines {opts:assembly_program_options} (st : machine_state) (lines : Lines) : option machine_state := match lines with | [] => Some st | line :: lines diff --git a/src/Assembly/WithBedrock/SymbolicProofs.v b/src/Assembly/WithBedrock/SymbolicProofs.v index 38e9c0ccaf..88142b9110 100644 --- a/src/Assembly/WithBedrock/SymbolicProofs.v +++ b/src/Assembly/WithBedrock/SymbolicProofs.v @@ -95,6 +95,7 @@ Local Notation eval := (Symbolic.eval G d). Definition R_reg (x : option idx) (v : Z) : Prop := (forall i, x = Some i -> eval i v) /\ (v = Z.land v (Z.ones 64)). + Definition R_regs : Symbolic.reg_state -> Semantics.reg_state -> Prop := Tuple.fieldwise R_reg. @@ -231,8 +232,10 @@ Qed. Lemma R_flags_subsumed d s m (HR : R_flags d s m) d' (Hlt : d :< d') : R_flags' d' s m. Proof using Type. - cbv [R_flags Tuple.fieldwise Tuple.fieldwise'] in *; - intuition eauto using R_flag_subsumed. + cbv [R_flags] in *. + revert HR. + eapply Tuple.fieldwise_Proper; [ repeat intro | reflexivity .. ]. + eapply R_flag_subsumed; eassumption. Qed. Lemma R_reg_subsumed d s m (HR : R_reg d s m) d' (Hlt : d :< d') @@ -242,8 +245,10 @@ Proof using Type. cbv [R_reg] in *; intuition eauto. Qed. Lemma R_regs_subsumed d s m (HR : R_regs d s m) d' (Hlt : d :< d') : R_regs' d' s m. Proof using Type. - cbv [R_regs Tuple.fieldwise Tuple.fieldwise'] in *; - intuition eauto using R_reg_subsumed. + cbv [R_regs] in *. + revert HR. + eapply Tuple.fieldwise_Proper; [ repeat intro | reflexivity .. ]. + eapply R_reg_subsumed; eassumption. Qed. Local Existing Instance Naive.word64_ok. @@ -314,7 +319,7 @@ Qed. Lemma get_reg_R_regs d s m (HR : R_regs d s m) ri : forall i, Symbolic.get_reg s ri = Some i -> - exists v, eval d i v /\ Tuple.nth_default 0 ri m = v. + exists v, eval d i v /\ Tuple.nth_default 0 (N.to_nat ri) m = v. Proof using Type. cbv [Symbolic.get_reg]; intros. rewrite <-Tuple.nth_default_to_list in H. @@ -336,7 +341,7 @@ Qed. Lemma get_reg_R s m (HR : R s m) ri : forall i, Symbolic.get_reg s ri = Some i -> - exists v, eval s i v /\ Tuple.nth_default 0 ri (m : reg_state) = v. + exists v, eval s i v /\ Tuple.nth_default 0 (N.to_nat ri) (m : reg_state) = v. Proof using Type. destruct s, m; apply get_reg_R_regs, HR. Qed. @@ -347,7 +352,7 @@ Proof using Type. cbv; destruct v; trivial. Qed. (* workaround: using cbn instead of this lemma makes Qed hang after next rewrite in same hyp *) Lemma unfold_bind {A B} ma amb s : - @bind A B ma amb s = ltac:(let t := eval unfold bind, ErrorT.bind in (@bind A B ma amb s) in exact t). + @bind A B ma amb s = ltac:(let t := eval unfold bind, ErrorT.bind in ( @bind A B ma amb s ) in exact t). Proof using Type. exact eq_refl. Qed. Local Hint Resolve gensym_dag_ok_of_R : core. @@ -497,8 +502,8 @@ Ltac step_GetReg := [eassumption|..|clear H] end. -Lemma Address_R {opts : symbolic_options_computed_opt} {descr:description} s m (HR : R s m) (sa:AddressSize) o a s' (H : Symbolic.Address o s = Success (a, s')) - : R s' m /\ s :< s' /\ exists v, eval s' a v /\ @DenoteAddress sa m o = v. +Lemma Address_R {popts : assembly_program_options} {opts : symbolic_options_computed_opt} {descr:description} s m (HR : R s m) (sa:AddressSize) o a s' (H : Symbolic.Address o s = Success (a, s')) + : R s' m /\ s :< s' /\ exists v, eval s' a v /\ @DenoteAddress popts sa m o = (None, v). Proof using Type. destruct o as [? ? ? ?]; cbv [Address DenoteAddress Syntax.mem_base_reg Syntax.mem_offset Syntax.mem_scale_reg err ret] in *; repeat step_symex. all : repeat first [ progress inversion_ErrorT @@ -546,18 +551,18 @@ Qed. Lemma Load64_R s m (HR : R s m) (a : idx) va (Ha : eval s a va) i s' (H : Load64 a s = Success (i, s')) - : s' = s /\ exists v, eval s i v /\ get_mem m va 8 = Some v /\ v = Z.land v (Z.ones 64). + : s' = s /\ exists v, eval s i v /\ get_mem m (None, va) 8 = Some v /\ v = Z.land v (Z.ones 64). Proof using Type. cbv [Load64 some_or Symbolic.load option_map] in *. destruct find as [(?&?)|] eqn:? in *; inversion_ErrorT; Prod.inversion_prod; subst. split;trivial. eapply ListUtil.find_some_iff in Heqo; - repeat (cbn in *; destruct_head'_and; destruct_head'_ex). + repeat (cbn [fst] in *; destruct_head'_and; destruct_head'_ex). clear H1. autoforward with typeclass_instances in H0; subst. eapply nth_error_split in H; - repeat (cbn in *; destruct_head'_and; destruct_head'_ex). - destruct s'; cbn in *; destruct_head'_and; subst. + repeat (destruct_head'_and; destruct_head'_ex). + destruct s'; cbn [Symbolic.symbolic_mem_state Symbolic.dag_state R] in *; destruct_head'_and; subst. progress unfold machine_mem_state in *. eapply R_mem_Permutation in H4; [|symmetry; eapply Permutation.Permutation_middle]. @@ -565,7 +570,7 @@ Proof using Type. eapply load_bytes_Rcell64 in H4; eauto; []; repeat (destruct_head'_and; destruct_head'_ex). eexists; split; try eassumption; split. - { destruct_one_match; simpl in *; try congruence. } + { destruct_one_match; congruence. } { epose proof le_combine_bound x as HH. erewrite length_load_bytes in HH by eassumption. rewrite Z.land_ones, Z.mod_small; lia. } @@ -645,7 +650,7 @@ Proof using Type. Qed. Lemma store8 m a - old (Hold : get_mem m a 8 = Some old) b + old (Hold : get_mem m (None, a) 8 = Some old) b m' (Hm': set_mem m a 8 (Z.lor (Z.land b (Z.ones 8)) (Z.ldiff old (Z.ones 8))) = Some m') : set_mem m a 1 b = Some m'. Proof using Type. @@ -710,9 +715,9 @@ Proof using Type. Qed. -Lemma GetOperand_R {opts : symbolic_options_computed_opt} {descr:description} s m (HR: R s m) (so:OperationSize) (sa:AddressSize) a i s' +Lemma GetOperand_R {popts : assembly_program_options} {opts : symbolic_options_computed_opt} {descr:description} s m (HR: R s m) (so:OperationSize) (sa:AddressSize) a i s' (H : GetOperand a s = Success (i, s')) - : R s' m /\ s :< s' /\ exists v, eval s' i v /\ DenoteOperand sa so m a = Some v. + : R s' m /\ s :< s' /\ exists v, eval s' i v /\ @DenoteOperand popts sa so m a = Some v. Proof using Type. cbv [GetOperand DenoteOperand err] in *; break_innermost_match; inversion_ErrorT. { eapply GetReg_R in H; intuition eauto. } @@ -800,7 +805,7 @@ Proof using Type. { eexists; split; [exact eq_refl|]. repeat (step_symex; []). cbv [GetReg64 some_or] in *. - pose proof (get_reg_R s _ ltac:(eassumption) (reg_index r)) as Hr. + pose proof (get_reg_R s _ ltac:(eassumption) (N.to_nat (reg_index r))) as Hr. destruct (Symbolic.get_reg _ _) in *; cbn [ErrorT.bind] in H; ErrorT.inversion_ErrorT; Prod.inversion_prod; subst;cbn [fst snd] in *. specialize (Hr _ eq_refl); case Hr as (?&?&?). @@ -817,7 +822,7 @@ Proof using Type. cbv [R_reg]; intuition idtac; try Option.inversion_option; subst; try eval_same_expr_goal; cbv [bitmask_of_reg index_and_shift_and_bitcount_of_reg]. { rewrite <-Tuple.nth_default_to_list. cbv [nth_default]; rewrite H5. trivial. } - assert (Z.of_N (reg_size r) + Z.of_N (reg_offset r) <= 64) by (destruct r; clear; cbv; discriminate). + (* assert (Z.of_N (reg_size r) + Z.of_N (reg_offset r) <= 64) by (destruct r; clear; cbv; discriminate). *) eapply Z.bits_inj_iff'; intros j Hj. rewrite Z.land_spec, Z.testbit_ones_nonneg by (clear -Hj; lia). destr.destr (j nat }. Arguments find_index {T} {_} _. 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