.version 8.4 .target sm_75 .address_size 64 .visible .func add_u16( .param .b64 out_c, .param .align 16 .b8 in_a[16], .param .align 16 .b8 in_b[16] ) { .reg .u64 %ra<2>, %rb<2>; .reg .b64 %rdc; ld.param.b64 %rdc, [out_c]; ld.param.v2.u64 {%ra1, %ra0}, [in_a]; ld.param.v2.u64 {%rb1, %rb0}, [in_b]; add.cc.u64 %ra0, %ra0, %rb0; addc.u64 %ra1, %ra1, %rb1; st.v2.u64 [%rdc], {%ra1, %ra0}; ret; } .visible .func sub_u16( .param .b64 out_c, .param .align 16 .b8 in_a[16], .param .align 16 .b8 in_b[16] ) { .reg .u64 %ra<2>, %rb<2>; .reg .b64 %rdc; ld.param.b64 %rdc, [out_c]; ld.param.v2.u64 {%ra1, %ra0}, [in_a]; ld.param.v2.u64 {%rb1, %rb0}, [in_b]; sub.cc.u64 %ra0, %ra0, %rb0; subc.u64 %ra1, %ra1, %rb1; st.v2.u64 [%rdc], {%ra1, %ra0}; ret; } .visible .func add_u32( .param .b64 out_c, .param .align 16 .b8 in_a[32], .param .align 16 .b8 in_b[32] ) { .reg .u64 %ra<4>, %rb<4>; .reg .b64 %rdc; ld.param.b64 %rdc, [out_c]; ld.param.v2.u64 {%ra3, %ra2}, [in_a]; ld.param.v2.u64 {%ra1, %ra0}, [in_a + 16]; ld.param.v2.u64 {%rb3, %rb2}, [in_b]; ld.param.v2.u64 {%rb1, %rb0}, [in_b + 16]; add.cc.u64 %ra0, %ra0, %rb0; addc.cc.u64 %ra1, %ra1, %rb1; addc.cc.u64 %ra2, %ra2, %rb2; addc.u64 %ra3, %ra3, %rb3; st.v2.u64 [%rdc], {%ra3, %ra2}; st.v2.u64 [%rdc + 16], {%ra1, %ra0}; ret; } .visible .func sub_u32( .param .b64 out_c, .param .align 16 .b8 in_a[32], .param .align 16 .b8 in_b[32] ) { .reg .u64 %ra<4>, %rb<4>; .reg .b64 %rdc; ld.param.b64 %rdc, [out_c]; ld.param.v2.u64 {%ra3, %ra2}, [in_a]; ld.param.v2.u64 {%ra1, %ra0}, [in_a + 16]; ld.param.v2.u64 {%rb3, %rb2}, [in_b]; ld.param.v2.u64 {%rb1, %rb0}, [in_b + 16]; sub.cc.u64 %ra0, %ra0, %rb0; subc.cc.u64 %ra1, %ra1, %rb1; subc.cc.u64 %ra2, %ra2, %rb2; subc.u64 %ra3, %ra3, %rb3; st.v2.u64 [%rdc], {%ra3, %ra2}; st.v2.u64 [%rdc + 16], {%ra1, %ra0}; ret; } .visible .func mul_lo_u16( .param .b64 out_c, .param .align 16 .b8 in_a[16], .param .align 16 .b8 in_b[16] ) { .reg .u64 %a, %b, %c, %d, %a_b, %c_d; .reg .u64 %ac, %bd_hi, %bd_lo, %p; .reg .b64 %rdc; ld.param.b64 %rdc, [out_c]; ld.param.v2.u64 {%a, %b}, [in_a]; ld.param.v2.u64 {%c, %d}, [in_b]; mul.lo.u64 %ac, %a, %c; mul.lo.u64 %bd_lo, %b, %d; mul.hi.u64 %bd_hi, %b, %d; add.u64 %a_b, %a, %b; add.u64 %c_d, %c, %d; mul.lo.u64 %p, %a_b, %c_d; sub.u64 %p, %p, %ac; sub.u64 %p, %p, %bd_lo; add.u64 %p, %p, %bd_hi; st.v2.u64 [%rdc], {%p, %bd_lo}; ret; } .visible .func mul_u16( .param .b64 out_c_hi, .param .b64 out_c_lo, .param .align 16 .b8 in_a[16], .param .align 16 .b8 in_b[16] ) { .reg .u64 %a, %b, %c, %d; .reg .u64 %a_b_hi, %a_b_lo, %c_d_hi, %c_d_lo; .reg .u64 %p_hi, %p_lo, %p_hi2, %p_lo2; .reg .u64 %ac_hi, %ac_lo, %bd_hi, %bd_lo; .reg .b64 %rdc_hi, %rdc_lo; ld.param.b64 %rdc_hi, [out_c_hi]; ld.param.b64 %rdc_lo, [out_c_lo]; ld.param.v2.u64 {%a, %b}, [in_a]; ld.param.v2.u64 {%c, %d}, [in_b]; mul.lo.u64 %ac_lo, %a, %c; mul.hi.u64 %ac_hi, %a, %c; mul.lo.u64 %bd_lo, %b, %d; mul.hi.u64 %bd_hi, %b, %d; add.cc.u64 %a_b_lo, %a, %b; addc.u64 %a_b_hi, %a, %b; add.cc.u64 %c_d_lo, %c, %d; addc.u64 %c_d_hi, %c, %d; mul.lo.u64 %p_lo, %a_b_lo, %c_d_lo; mul.hi.u64 %p_hi, %a_b_lo, %c_d_lo; mul.lo.u64 %p_hi2, %a_b_hi, %c_d_hi; st.v2.u64 [%rdc_lo], {%p_hi, %p_lo}; st.v2.u64 [%rdc_hi], {%a_b_lo, %p_hi2}; ret; }