optimize mulPre and mul_UnitPre

dev
MITSUNARI Shigeo 9 years ago
parent e3ce87198b
commit a20dd317f2
  1. 61
      src/mul.txt
  2. 6
      src/once.txt

@ -19,14 +19,14 @@ noinline
ret i$(bu) %t$(N-2)
}
@define bu = bit + unit
@define u2 = unit*2
define void @mcl_fp_mul_UnitPre$(bit)(i$(unit) *%pz, i$(unit) *%px, i$(unit) %y)
define i$(bu) @mulPv$(bit)x$(unit)(i$(unit)* %px, i$(unit) %y)
{
@for i, 0, N
%x$(i)y = call i$(u2) @mulPos$(unit)x$(unit)(i$(unit) *%px, i$(unit) %y, i$(unit) $(i))
%L$(i) = trunc i$(u2) %x$(i)y to i$(unit)
%H$(i) = call i$(unit) @extractLow$(unit)(i$(u2) %x$(i)y)
call void @storePos$(unit)(i$(unit) *%pz, i$(unit) %L$(i), i$(unit) $(i))
%H$(i) = call i$(unit) @extractHigh$(unit)(i$(u2) %x$(i)y)
@endfor
@for i, 1, N
@ -56,35 +56,48 @@ define void @mcl_fp_mul_UnitPre$(bit)(i$(unit) *%pz, i$(unit) *%px, i$(unit) %y)
@else
%t = add i$(bit) %Ht$(N-1), %Lt$(N-2)
@endif
%pz1 = getelementptr i$(unit)* %pz, i$(unit) 1
%pz2 = bitcast i$(unit)* %pz1 to i$(bit)*
store i$(bit) %t, i$(bit)* %pz2
%t1 = zext i$(bit) %t to i$(bu)
%t2 = shl i$(bu) %t1, $(unit)
%t3 = zext i$(unit) %L0 to i$(bu)
%t4 = or i$(bu) %t2, %t3
ret i$(bu) %t4
}
@define u2 = unit*2
define void @mcl_fp_mul_UnitPre$(bit)(i$(bu) *%pz, i$(unit) *%px, i$(unit) %y)
{
%z = call i$(bu) @mulPv$(bit)x$(unit)(i$(unit)* %px, i$(unit) %y)
store i$(bu) %z, i$(bu) *%pz
ret void
}
define void @mcl_fpDbl_mulPre$(bit)(i$(unit)* %pz, i$(bit)* %px, i$(bit)* %py) {
%x = load i$(bit)* %px
%y = load i$(bit)* %py
@for i, 0, N
%y$(i) = call i$(unit) @extract$(bit)(i$(bit) %y, i$(bit) $(unit*i))
@endfor
%sum0 = call i$(bu) @mul$(bit)x$(unit)(i$(bit) %x, i$(unit) %y0)
%t0 = trunc i$(bu) %sum0 to i$(unit)
store i$(unit) %t0, i$(unit)* %pz
@for i, 1, N
%s$(i-1) = lshr i$(bu) %sum$(i-1), $(unit)
%xy$(i) = call i$(bu) @mul$(bit)x$(unit)(i$(bit) %x, i$(unit) %y$(i))
%sum$(i) = add i$(bu) %s$(i-1), %xy$(i)
%z$(i) = getelementptr i$(unit)* %pz, i32 $(i)
define void @mcl_fpDbl_mulPre$(bit)(i$(unit)* %pz, i$(unit)* %px, i$(unit)* %py) {
%y0 = load i$(unit)* %py
%xy0 = call i$(bu) @mulPv$(bit)x$(unit)(i$(unit) *%px, i$(unit) %y0)
%z0 = trunc i$(bu) %xy0 to i$(unit)
store i$(unit) %z0, i$(unit)* %pz
%t0 = lshr i$(bu) %xy0, $(unit)
@for i, 1, N
%py$(i) = getelementptr i$(unit)* %py, i32 $(i)
%y$(i) = load i$(unit)* %py$(i)
%xy$(i) = call i$(bu) @mulPv$(bit)x$(unit)(i$(unit)* %px, i$(unit) %y$(i))
%a$(i) = add i$(bu) %t$(i-1), %xy$(i)
%z$(i) = trunc i$(bu) %a$(i) to i$(unit)
%pz$(i) = getelementptr i$(unit)* %pz, i32 $(i)
@if i < N - 1
%ts$(i) = trunc i$(bu) %sum$(i) to i$(unit)
store i$(unit) %ts$(i), i$(unit)* %z$(i)
store i$(unit) %z$(i), i$(unit)* %pz$(i)
%t$(i) = lshr i$(bu) %a$(i), $(unit)
@endif
@endfor
%p = bitcast i$(unit)* %z$(N-1) to i$(bu)*
store i$(bu) %sum$(N-1), i$(bu)* %p
%pz$(N-1)e = bitcast i$(unit)* %pz$(N-1) to i$(bu)*
store i$(bu) %a$(N-1), i$(bu)* %pz$(N-1)e
ret void
}
define void @mcl_fpDbl_sqrPre$(bit)(i$(unit)* %py, i$(bit)* %px) {
%x = load i$(bit)* %px
@for i, 0, N

@ -7,7 +7,7 @@ define i$(unit*2) @mul$(unit)x$(unit)(i$(unit) %x, i$(unit) %y) {
}
@define u2 = unit * 2
define private i$(unit) @extractLow$(unit)(i$(u2) %x)
define private i$(unit) @extractHigh$(unit)(i$(u2) %x)
{
%t0 = lshr i$(unit*2) %x, $(unit)
%t1 = trunc i$(unit*2) %t0 to i$(unit)
@ -118,10 +118,10 @@ define void @mcl_fp_sqr_NIST_P192(i192* %py, i192* %px) {
call void @mcl_fpDbl_mod_NIST_P192(i192* %py, i192* %buf)
ret void
}
define void @mcl_fp_mul_NIST_P192(i192* %pz, i192* %px, i192* %py) {
define void @mcl_fp_mul_NIST_P192(i192* %pz, i$(unit)* %px, i$(unit)* %py) {
%buf = alloca i192, i32 2
%p = bitcast i192* %buf to i$(unit)*
call void @mcl_fpDbl_mulPre192(i$(unit)* %p, i192* %px, i192* %py)
call void @mcl_fpDbl_mulPre192(i$(unit)* %p, i$(unit)* %px, i$(unit)* %py)
call void @mcl_fpDbl_mod_NIST_P192(i192* %pz, i192* %buf)
ret void
}

Loading…
Cancel
Save