2022-10-20 17:35:43 -04:00
|
|
|
/// Note: uncomment this to test
|
|
|
|
|
|
2022-10-17 11:02:24 -04:00
|
|
|
global test_mul_Fp12:
|
2022-10-20 16:48:31 -04:00
|
|
|
// stack: in0, f, in0', f', in1, g, in1', g', in1, out, in0, out
|
|
|
|
|
%store_fp6
|
|
|
|
|
%store_fp6
|
|
|
|
|
%store_fp6
|
|
|
|
|
%store_fp6
|
|
|
|
|
// stack: in1, out, in0, out
|
2022-10-17 11:02:24 -04:00
|
|
|
PUSH return_on_stack
|
2022-10-20 16:18:41 -04:00
|
|
|
SWAP3
|
2022-10-20 16:48:31 -04:00
|
|
|
// stack: in0, in1, out, return_on_stack, out
|
2022-10-17 11:02:24 -04:00
|
|
|
%jump(mul_Fp12)
|
|
|
|
|
return_on_stack:
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: out
|
2022-10-20 16:48:31 -04:00
|
|
|
DUP1
|
|
|
|
|
%add_const(6)
|
|
|
|
|
// stack: out', out
|
|
|
|
|
%load_fp6
|
|
|
|
|
%load_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: h, h'
|
2022-10-17 11:02:24 -04:00
|
|
|
%jump(0xdeadbeef)
|
2022-10-13 20:06:19 -04:00
|
|
|
|
2022-10-20 17:35:43 -04:00
|
|
|
|
2022-10-20 16:18:41 -04:00
|
|
|
/// fp6 macros:
|
2022-10-18 11:23:43 -04:00
|
|
|
/// macro | num | ops | cost
|
|
|
|
|
/// -------------------------
|
2022-10-18 12:47:31 -04:00
|
|
|
/// load | 8 | 40 | 320
|
|
|
|
|
/// store | 5 | 40 | 200
|
|
|
|
|
/// dup | 5 | 6 | 30
|
|
|
|
|
/// swap | 4 | 16 | 64
|
2022-10-20 17:30:23 -04:00
|
|
|
/// add | 4 | 16 | 64
|
2022-10-20 17:35:43 -04:00
|
|
|
/// subr | 1 | 17 | 17
|
2022-10-22 13:44:01 -04:00
|
|
|
/// mul | 3 | 157 | 471
|
2022-10-18 12:47:31 -04:00
|
|
|
/// i9 | 1 | 9 | 9
|
2022-10-18 11:23:43 -04:00
|
|
|
///
|
2022-10-20 16:18:41 -04:00
|
|
|
/// lone stack operations:
|
|
|
|
|
/// op | num
|
|
|
|
|
/// ------------
|
|
|
|
|
/// ADD | 3
|
|
|
|
|
/// SWAP | 2
|
|
|
|
|
/// DUP | 6
|
|
|
|
|
/// PUSH | 6
|
|
|
|
|
/// POP | 2
|
|
|
|
|
/// JUMP | 1
|
|
|
|
|
///
|
2022-10-22 13:44:01 -04:00
|
|
|
/// TOTAL: 1196
|
2022-10-18 11:23:43 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
/// F = f + f'z
|
|
|
|
|
/// G = g + g'z
|
|
|
|
|
///
|
|
|
|
|
/// H = h + h'z = FG
|
|
|
|
|
///
|
|
|
|
|
/// h = fg + sh(f'g')
|
|
|
|
|
/// h' = (f+f')(g+g') - fg - f'g'
|
|
|
|
|
///
|
2022-10-20 11:55:05 -04:00
|
|
|
/// Note: f, f', g, g' consist of six terms on the stack
|
2022-10-18 11:23:43 -04:00
|
|
|
|
2022-10-17 11:02:24 -04:00
|
|
|
global mul_Fp12:
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: in0, in1, out
|
2022-10-20 17:30:23 -04:00
|
|
|
DUP1 %add_const(6)
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: in0', in0, in1, out
|
2022-10-20 16:07:39 -04:00
|
|
|
%load_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: f', in0, in1, out
|
2022-10-20 17:30:23 -04:00
|
|
|
DUP7 %add_const(6)
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: in1', f', in0, in1, out
|
2022-10-20 16:07:39 -04:00
|
|
|
%load_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: g', f', in0, in1, out
|
|
|
|
|
PUSH ret_1
|
|
|
|
|
// stack: ret_1, g', f', in0, in1, out
|
2022-10-20 16:07:39 -04:00
|
|
|
%dup_fp6_7
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: f', ret_1, g', f', in0, in1, out
|
2022-10-20 16:07:39 -04:00
|
|
|
%dup_fp6_7
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: g', f', ret_1, g', f', in0, in1, out
|
2022-10-20 11:55:05 -04:00
|
|
|
%jump(mul_fp6)
|
2022-10-22 13:44:01 -04:00
|
|
|
ret_1:
|
|
|
|
|
// stack: f'g', g' , f', in0, in1, out
|
2022-10-20 16:07:39 -04:00
|
|
|
%dup_fp6_0
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: f'g', f'g', g' , f', in0, in1, out
|
|
|
|
|
%store_fp6_sh(100)
|
|
|
|
|
// stack: f'g', g' , f', in0, in1, out {100: sh(f'g')}
|
|
|
|
|
%store_fp6(106)
|
|
|
|
|
// stack: g' , f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
2022-10-20 11:55:05 -04:00
|
|
|
DUP13
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: in0, g' , f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
2022-10-20 16:07:39 -04:00
|
|
|
DUP15
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: in1, in0, g' , f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
2022-10-20 16:07:39 -04:00
|
|
|
%load_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: g , in0, g' , f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
2022-10-20 11:55:05 -04:00
|
|
|
%swap_fp6_hole
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: g', in0, g , f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
2022-10-22 13:16:07 -04:00
|
|
|
%dup_fp6_7
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: g,g', in0, g , f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
2022-10-07 15:41:46 -07:00
|
|
|
%add_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: g+g', in0, g , f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
2022-10-20 11:55:05 -04:00
|
|
|
%swap_fp6_hole
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: g, in0, g+g', f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
|
|
|
|
PUSH ret_2
|
|
|
|
|
// stack: ret_2, g, in0, g+g', f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
2022-10-20 11:55:05 -04:00
|
|
|
SWAP7
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: in0, g, ret_2, g+g', f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
2022-10-20 11:55:05 -04:00
|
|
|
%load_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: f, g, ret_2, g+g', f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
2022-10-20 11:55:05 -04:00
|
|
|
%jump(mul_fp6)
|
2022-10-22 13:44:01 -04:00
|
|
|
ret_2:
|
|
|
|
|
// stack: fg, g+g', f', in0, in1, out {100: sh(f'g'), 106: f'g'}
|
|
|
|
|
%store_fp6(112)
|
|
|
|
|
// stack: g+g', f', in0, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-07 15:41:46 -07:00
|
|
|
%swap_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: f', g+g', in0, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
|
|
|
|
PUSH ret_3
|
|
|
|
|
// stack: ret_3, f', g+g', in0, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-20 17:30:23 -04:00
|
|
|
SWAP13
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: in0, f', g+g', ret_3, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-20 16:07:39 -04:00
|
|
|
%load_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: f,f', g+g', ret_3, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-07 15:41:46 -07:00
|
|
|
%add_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: f+f', g+g', ret_3, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-20 11:55:05 -04:00
|
|
|
%jump(mul_fp6)
|
2022-10-22 13:44:01 -04:00
|
|
|
ret_3:
|
|
|
|
|
// stack: (f+f')(g+g'), in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
|
|
|
|
%load_fp6(112)
|
|
|
|
|
// stack: fg, (f+f')(g+g'), in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-07 15:41:46 -07:00
|
|
|
%swap_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: (f+f')(g+g'), fg, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-20 16:07:39 -04:00
|
|
|
%dup_fp6_6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: fg, (f+f')(g+g'), fg, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
|
|
|
|
%load_fp6(106)
|
|
|
|
|
// stack: f'g',fg, (f+f')(g+g'), fg, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-20 16:48:31 -04:00
|
|
|
%add_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: f'g'+fg, (f+f')(g+g'), fg, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-20 10:56:55 -04:00
|
|
|
%subr_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: (f+f')(g+g') - (f'g'+fg), fg, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-22 13:16:07 -04:00
|
|
|
DUP14 %add_const(6)
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: out', (f+f')(g+g') - (f'g'+fg), fg, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-20 16:07:39 -04:00
|
|
|
%store_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: fg, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
|
|
|
|
%load_fp6(100)
|
|
|
|
|
// stack: sh(f'g') , fg, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-07 15:41:46 -07:00
|
|
|
%add_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: sh(f'g') + fg, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-20 17:30:23 -04:00
|
|
|
DUP8
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: out, sh(f'g') + fg, in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-20 16:07:39 -04:00
|
|
|
%store_fp6
|
2022-10-22 13:44:01 -04:00
|
|
|
// stack: in1, out {100: sh(f'g'), 106: f'g', 112: fg}
|
2022-10-20 16:07:39 -04:00
|
|
|
%pop2
|
|
|
|
|
JUMP
|