sidh 0.2.3

An efficient supersingular isogeny-based cryptography library.
Documentation
;*******************************************************************************************
; SIDH: an efficient supersingular isogeny cryptography library
;
; Abstract: utility functions in x64 assembly for P751 on Windows
;*******************************************************************************************

  .const
; Under Windows we need to use RCX and RDX as registers for the first two parameters as that is 
; the usual calling convention (cf. https://docs.microsoft.com/en-us/cpp/build/parameter-passing).
reg_p1 equ rcx
reg_p2 equ rdx

; Digits of 3^238 - 1
three238m1_0 equ 0EDCD718A828384F8h
three238m1_1 equ 0733B35BFD4427A14h
three238m1_2 equ 0F88229CF94D7CF38h
three238m1_3 equ 063C56C990C7C2AD6h
three238m1_4 equ 0B858A87E8F4222C7h
three238m1_5 equ 0254C9C6B525EAF5h

  .code
;***********************************************************************
;  Check less than 3^238
;  Operation: 
;  Set result [reg_p2] to 0 if the input [reg_p1] scalar is <= 3^238.
;*********************************************************************** 
checklt238_asm proc
  push   r12
  push   r13
  push   r14
  push   r15

  ; Zero rax for later use.
  xor    rax, rax

  ; Set [R10,...,R15] = 3^238
  mov    r10, three238m1_0
  mov    r11, three238m1_1
  mov    r12, three238m1_2
  mov    r13, three238m1_3
  mov    r14, three238m1_4
  mov    r15, three238m1_5

  ; Set [R10,...,R15] = 3^238 - scalar
  sub    r10, [reg_p1]
  sbb    r11, [reg_p1+8]
  sbb    r12, [reg_p1+16]
  sbb    r13, [reg_p1+24]
  sbb    r14, [reg_p1+32]
  sbb    r15, [reg_p1+40]

  ; Save borrow flag indicating 3^238 - scalar < 0 as a mask in AX
  sbb    rax, 0
  mov    [reg_p2], rax

  pop    r15
  pop    r14
  pop    r13
  pop    r12
  ret
checklt238_asm endp

;***********************************************************************
;  Multiply by 3.
;  Operation: 
;  Set scalar [reg_p1] = 3*scalar [reg_p1].
;*********************************************************************** 
mulby3_asm proc
  push   r12
  push   r13
  push   r14
  push   r15

  ; Set [R10,...,R15] = scalar
  mov    r10, [reg_p1]
  mov    r11, [reg_p1+8]
  mov    r12, [reg_p1+16]
  mov    r13, [reg_p1+24]
  mov    r14, [reg_p1+32]
  mov    r15, [reg_p1+40]

  ; Add scalar twice to compute 3*scalar
  add    [reg_p1], r10
  adc    [reg_p1+8], r11
  adc    [reg_p1+16], r12
  adc    [reg_p1+24], r13
  adc    [reg_p1+32], r14
  adc    [reg_p1+40], r15
  add    [reg_p1], r10
  adc    [reg_p1+8], r11
  adc    [reg_p1+16], r12
  adc    [reg_p1+24], r13
  adc    [reg_p1+32], r14
  adc    [reg_p1+40], r15

  pop    r15
  pop    r14
  pop    r13
  pop    r12
  ret
mulby3_asm endp
  end