From 1f14182585c90050f347f8591ec43efdbcbf869b Mon Sep 17 00:00:00 2001 From: Jens Steube Date: Sat, 6 Feb 2016 10:58:20 +0100 Subject: [PATCH] Converted to new SIMD: -m 8300 -a 0 --- OpenCL/m08300_a0.cl | 206 +++++++++++++++++--------------------------- 1 file changed, 81 insertions(+), 125 deletions(-) diff --git a/OpenCL/m08300_a0.cl b/OpenCL/m08300_a0.cl index 3346c6489..794c96224 100644 --- a/OpenCL/m08300_a0.cl +++ b/OpenCL/m08300_a0.cl @@ -5,6 +5,8 @@ #define _SHA1_ +#define NEW_SIMD_CODE + #include "include/constants.h" #include "include/kernel_vendor.h" @@ -18,34 +20,32 @@ #include "OpenCL/common.c" #include "include/rp_kernel.h" #include "OpenCL/rp.c" +#include "OpenCL/simd.c" -#define COMPARE_S "OpenCL/check_single_comp4.c" -#define COMPARE_M "OpenCL/check_multi_comp4.c" - -static void sha1_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5]) +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) { - u32 A = digest[0]; - u32 B = digest[1]; - u32 C = digest[2]; - u32 D = digest[3]; - u32 E = digest[4]; + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; - u32 w0_t = w0[0]; - u32 w1_t = w0[1]; - u32 w2_t = w0[2]; - u32 w3_t = w0[3]; - u32 w4_t = w1[0]; - u32 w5_t = w1[1]; - u32 w6_t = w1[2]; - u32 w7_t = w1[3]; - u32 w8_t = w2[0]; - u32 w9_t = w2[1]; - u32 wa_t = w2[2]; - u32 wb_t = w2[3]; - u32 wc_t = w3[0]; - u32 wd_t = w3[1]; - u32 we_t = w3[2]; - u32 wf_t = w3[3]; + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; #undef K #define K SHA1C00 @@ -224,54 +224,37 @@ __kernel void m08300_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, * loop */ - for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos += VECT_SIZE) { - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; - w0[0] = pw_buf0[0]; - w0[1] = pw_buf0[1]; - w0[2] = pw_buf0[2]; - w0[3] = pw_buf0[3]; - w1[0] = pw_buf1[0]; - w1[1] = pw_buf1[1]; - w1[2] = pw_buf1[2]; - w1[3] = pw_buf1[3]; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; + const u32 out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); - const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); - - u32 w0_t[4]; + u32x w0_t[4]; w0_t[0] = w0[0]; w0_t[1] = w0[1]; w0_t[2] = w0[2]; w0_t[3] = w0[3]; - u32 w1_t[4]; + u32x w1_t[4]; w1_t[0] = w1[0]; w1_t[1] = w1[1]; w1_t[2] = w1[2]; w1_t[3] = w1[3]; - u32 w2_t[4]; + u32x w2_t[4]; w2_t[0] = w2[0]; w2_t[1] = w2[1]; w2_t[2] = w2[2]; w2_t[3] = w2[3]; - u32 w3_t[4]; + u32x w3_t[4]; w3_t[0] = w3[0]; w3_t[1] = w3[1]; @@ -286,28 +269,28 @@ __kernel void m08300_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, * salt */ - u32 s0[4]; + u32x s0[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; - u32 s1[4]; + u32x s1[4]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; - u32 s2[4]; + u32x s2[4]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; - u32 s3[4]; + u32x s3[4]; s3[0] = 0; s3[1] = 0; @@ -316,28 +299,28 @@ __kernel void m08300_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, switch_buffer_by_offset_le (s0, s1, s2, s3, 1 + out_len + domain_len + 1); - u32 d0[4]; + u32x d0[4]; d0[0] = domain_buf0[0]; d0[1] = domain_buf0[1]; d0[2] = domain_buf0[2]; d0[3] = domain_buf0[3]; - u32 d1[4]; + u32x d1[4]; d1[0] = domain_buf1[0]; d1[1] = domain_buf1[1]; d1[2] = domain_buf1[2]; d1[3] = 0; - u32 d2[4]; + u32x d2[4]; d2[0] = 0; d2[1] = 0; d2[2] = 0; d2[3] = 0; - u32 d3[4]; + u32x d3[4]; d3[0] = 0; d3[1] = 0; @@ -350,35 +333,35 @@ __kernel void m08300_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, * sha1 */ - u32 w0_t2[4]; + u32x w0_t2[4]; w0_t2[0] = swap32 (w0_t[0] | d0[0] | s0[0]); w0_t2[1] = swap32 (w0_t[1] | d0[1] | s0[1]); w0_t2[2] = swap32 (w0_t[2] | d0[2] | s0[2]); w0_t2[3] = swap32 (w0_t[3] | d0[3] | s0[3]); - u32 w1_t2[4]; + u32x w1_t2[4]; w1_t2[0] = swap32 (w1_t[0] | d1[0] | s1[0]); w1_t2[1] = swap32 (w1_t[1] | d1[1] | s1[1]); w1_t2[2] = swap32 (w1_t[2] | d1[2] | s1[2]); w1_t2[3] = swap32 (w1_t[3] | d1[3] | s1[3]); - u32 w2_t2[4]; + u32x w2_t2[4]; w2_t2[0] = swap32 (w2_t[0] | d2[0] | s2[0]); w2_t2[1] = swap32 (w2_t[1] | d2[1] | s2[1]); w2_t2[2] = swap32 (w2_t[2] | d2[2] | s2[2]); w2_t2[3] = swap32 (w2_t[3] | d2[3] | s2[3]); - u32 w3_t2[4]; + u32x w3_t2[4]; w3_t2[0] = swap32 (w3_t[0] | d3[0] | s3[0]); w3_t2[1] = swap32 (w3_t[1] | d3[1] | s3[1]); w3_t2[2] = 0; w3_t2[3] = (1 + out_len + domain_len + 1 + salt_len) * 8; - u32 digest[5]; + u32x digest[5]; digest[0] = SHA1M_A; digest[1] = SHA1M_B; @@ -392,28 +375,28 @@ __kernel void m08300_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, for (u32 i = 0; i < salt_iter; i++) { - u32 w0_t3[4]; + u32x w0_t3[4]; w0_t3[0] = digest[0]; w0_t3[1] = digest[1]; w0_t3[2] = digest[2]; w0_t3[3] = digest[3]; - u32 w1_t3[4]; + u32x w1_t3[4]; w1_t3[0] = digest[4]; w1_t3[1] = swap32 (salt_buf0[0]); w1_t3[2] = swap32 (salt_buf0[1]); w1_t3[3] = swap32 (salt_buf0[2]); - u32 w2_t3[4]; + u32x w2_t3[4]; w2_t3[0] = swap32 (salt_buf0[3]); w2_t3[1] = swap32 (salt_buf1[0]); w2_t3[2] = swap32 (salt_buf1[1]); w2_t3[3] = swap32 (salt_buf1[2]); - u32 w3_t3[4]; + u32x w3_t3[4]; w3_t3[0] = swap32 (salt_buf1[3]); w3_t3[1] = 0; @@ -429,12 +412,7 @@ __kernel void m08300_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); } - const u32 r0 = digest[3]; - const u32 r1 = digest[4]; - const u32 r2 = digest[2]; - const u32 r3 = digest[1]; - - #include COMPARE_M + COMPARE_M_SIMD (digest[3], digest[4], digest[2], digest[1]); } } @@ -532,54 +510,37 @@ __kernel void m08300_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, * loop */ - for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos += VECT_SIZE) { - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; - w0[0] = pw_buf0[0]; - w0[1] = pw_buf0[1]; - w0[2] = pw_buf0[2]; - w0[3] = pw_buf0[3]; - w1[0] = pw_buf1[0]; - w1[1] = pw_buf1[1]; - w1[2] = pw_buf1[2]; - w1[3] = pw_buf1[3]; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; + const u32 out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); - const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); - - u32 w0_t[4]; + u32x w0_t[4]; w0_t[0] = w0[0]; w0_t[1] = w0[1]; w0_t[2] = w0[2]; w0_t[3] = w0[3]; - u32 w1_t[4]; + u32x w1_t[4]; w1_t[0] = w1[0]; w1_t[1] = w1[1]; w1_t[2] = w1[2]; w1_t[3] = w1[3]; - u32 w2_t[4]; + u32x w2_t[4]; w2_t[0] = w2[0]; w2_t[1] = w2[1]; w2_t[2] = w2[2]; w2_t[3] = w2[3]; - u32 w3_t[4]; + u32x w3_t[4]; w3_t[0] = w3[0]; w3_t[1] = w3[1]; @@ -594,28 +555,28 @@ __kernel void m08300_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, * salt */ - u32 s0[4]; + u32x s0[4]; s0[0] = salt_buf0[0]; s0[1] = salt_buf0[1]; s0[2] = salt_buf0[2]; s0[3] = salt_buf0[3]; - u32 s1[4]; + u32x s1[4]; s1[0] = salt_buf1[0]; s1[1] = salt_buf1[1]; s1[2] = salt_buf1[2]; s1[3] = salt_buf1[3]; - u32 s2[4]; + u32x s2[4]; s2[0] = 0; s2[1] = 0; s2[2] = 0; s2[3] = 0; - u32 s3[4]; + u32x s3[4]; s3[0] = 0; s3[1] = 0; @@ -624,28 +585,28 @@ __kernel void m08300_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, switch_buffer_by_offset_le (s0, s1, s2, s3, 1 + out_len + domain_len + 1); - u32 d0[4]; + u32x d0[4]; d0[0] = domain_buf0[0]; d0[1] = domain_buf0[1]; d0[2] = domain_buf0[2]; d0[3] = domain_buf0[3]; - u32 d1[4]; + u32x d1[4]; d1[0] = domain_buf1[0]; d1[1] = domain_buf1[1]; d1[2] = domain_buf1[2]; d1[3] = 0; - u32 d2[4]; + u32x d2[4]; d2[0] = 0; d2[1] = 0; d2[2] = 0; d2[3] = 0; - u32 d3[4]; + u32x d3[4]; d3[0] = 0; d3[1] = 0; @@ -658,35 +619,35 @@ __kernel void m08300_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, * sha1 */ - u32 w0_t2[4]; + u32x w0_t2[4]; w0_t2[0] = swap32 (w0_t[0] | d0[0] | s0[0]); w0_t2[1] = swap32 (w0_t[1] | d0[1] | s0[1]); w0_t2[2] = swap32 (w0_t[2] | d0[2] | s0[2]); w0_t2[3] = swap32 (w0_t[3] | d0[3] | s0[3]); - u32 w1_t2[4]; + u32x w1_t2[4]; w1_t2[0] = swap32 (w1_t[0] | d1[0] | s1[0]); w1_t2[1] = swap32 (w1_t[1] | d1[1] | s1[1]); w1_t2[2] = swap32 (w1_t[2] | d1[2] | s1[2]); w1_t2[3] = swap32 (w1_t[3] | d1[3] | s1[3]); - u32 w2_t2[4]; + u32x w2_t2[4]; w2_t2[0] = swap32 (w2_t[0] | d2[0] | s2[0]); w2_t2[1] = swap32 (w2_t[1] | d2[1] | s2[1]); w2_t2[2] = swap32 (w2_t[2] | d2[2] | s2[2]); w2_t2[3] = swap32 (w2_t[3] | d2[3] | s2[3]); - u32 w3_t2[4]; + u32x w3_t2[4]; w3_t2[0] = swap32 (w3_t[0] | d3[0] | s3[0]); w3_t2[1] = swap32 (w3_t[1] | d3[1] | s3[1]); w3_t2[2] = 0; w3_t2[3] = (1 + out_len + domain_len + 1 + salt_len) * 8; - u32 digest[5]; + u32x digest[5]; digest[0] = SHA1M_A; digest[1] = SHA1M_B; @@ -700,28 +661,28 @@ __kernel void m08300_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, for (u32 i = 0; i < salt_iter; i++) { - u32 w0_t3[4]; + u32x w0_t3[4]; w0_t3[0] = digest[0]; w0_t3[1] = digest[1]; w0_t3[2] = digest[2]; w0_t3[3] = digest[3]; - u32 w1_t3[4]; + u32x w1_t3[4]; w1_t3[0] = digest[4]; w1_t3[1] = swap32 (salt_buf0[0]); w1_t3[2] = swap32 (salt_buf0[1]); w1_t3[3] = swap32 (salt_buf0[2]); - u32 w2_t3[4]; + u32x w2_t3[4]; w2_t3[0] = swap32 (salt_buf0[3]); w2_t3[1] = swap32 (salt_buf1[0]); w2_t3[2] = swap32 (salt_buf1[1]); w2_t3[3] = swap32 (salt_buf1[2]); - u32 w3_t3[4]; + u32x w3_t3[4]; w3_t3[0] = swap32 (salt_buf1[3]); w3_t3[1] = 0; @@ -737,12 +698,7 @@ __kernel void m08300_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); } - const u32 r0 = digest[3]; - const u32 r1 = digest[4]; - const u32 r2 = digest[2]; - const u32 r3 = digest[1]; - - #include COMPARE_S + COMPARE_S_SIMD (digest[3], digest[4], digest[2], digest[1]); } }