Browse Source

Merge branch 'marucoin'

Conflicts:
	Makefile.am
	configure.ac
	driver-opencl.c
	miner.h
	ocl.c
	sgminer.c
djm34
phm 11 years ago
parent
commit
0001517ac0
  1. 1
      Makefile.am
  2. 1
      configure.ac
  3. 6
      driver-opencl.c
  4. 56
      kernel/fugue.cl
  5. 232
      kernel/hamsi.cl
  6. 4
      kernel/hamsi_helper.cl
  7. 844
      kernel/marucoin.cl
  8. 238
      marucoin.c
  9. 10
      marucoin.h
  10. 1
      miner.h
  11. 5
      ocl.c
  12. 6
      sgminer.c

1
Makefile.am

@ -52,6 +52,7 @@ sgminer_SOURCES += animecoin.c animecoin.h @@ -52,6 +52,7 @@ sgminer_SOURCES += animecoin.c animecoin.h
sgminer_SOURCES += groestlcoin.c groestlcoin.h
sgminer_SOURCES += sifcoin.c sifcoin.h
sgminer_SOURCES += twecoin.c twecoin.h
sgminer_SOURCES += marucoin.c marucoin.h
sgminer_SOURCES += kernel/*.cl
bin_SCRIPTS = $(top_srcdir)/kernel/*.cl

1
configure.ac

@ -355,6 +355,7 @@ AC_DEFINE_UNQUOTED([ANIMECOIN_KERNNAME], ["animecoin"], [Filename for AnimeCoin @@ -355,6 +355,7 @@ AC_DEFINE_UNQUOTED([ANIMECOIN_KERNNAME], ["animecoin"], [Filename for AnimeCoin
AC_DEFINE_UNQUOTED([GROESTLCOIN_KERNNAME], ["groestlcoin"], [Filename for GroestlCoin optimised kernel])
AC_DEFINE_UNQUOTED([SIFCOIN_KERNNAME], ["sifcoin"], [Filename for Sifcoin optimised kernel])
AC_DEFINE_UNQUOTED([TWECOIN_KERNNAME], ["twecoin"], [Filename for Twecoin optimised kernel])
AC_DEFINE_UNQUOTED([MARUCOIN_KERNNAME], ["marucoin"], [Filename for MaruCoin optimised kernel])
AC_SUBST(OPENCL_LIBS)
AC_SUBST(OPENCL_FLAGS)

6
driver-opencl.c

@ -227,6 +227,8 @@ static enum cl_kernels select_kernel(char *arg) @@ -227,6 +227,8 @@ static enum cl_kernels select_kernel(char *arg)
return KL_SIFCOIN;
if (!strcmp(arg, TWECOIN_KERNNAME))
return KL_TWECOIN;
if (!strcmp(arg, MARUCOIN_KERNNAME))
return KL_MARUCOIN;
return KL_NONE;
}
@ -1397,6 +1399,9 @@ static bool opencl_thread_prepare(struct thr_info *thr) @@ -1397,6 +1399,9 @@ static bool opencl_thread_prepare(struct thr_info *thr)
case KL_TWECOIN:
cgpu->kname = TWECOIN_KERNNAME;
break;
case KL_MARUCOIN:
cgpu->kname = MARUCOIN_KERNNAME;
break;
default:
break;
}
@ -1442,6 +1447,7 @@ static bool opencl_thread_init(struct thr_info *thr) @@ -1442,6 +1447,7 @@ static bool opencl_thread_init(struct thr_info *thr)
case KL_GROESTLCOIN:
case KL_SIFCOIN:
case KL_TWECOIN:
case KL_MARUCOIN:
thrdata->queue_kernel_parameters = &queue_sph_kernel;
break;
default:

56
kernel/fugue.cl

@ -614,4 +614,60 @@ __constant static const sph_u32 mixtab3[] = { @@ -614,4 +614,60 @@ __constant static const sph_u32 mixtab3[] = {
SMIX(S06, S07, S08, S09); \
} while (0)
#define ROR3 do { \
sph_u32 B33 = S33, B34 = S34, B35 = S35; \
S35 = S32; S34 = S31; S33 = S30; S32 = S29; S31 = S28; S30 = S27; S29 = S26; S28 = S25; S27 = S24; \
S26 = S23; S25 = S22; S24 = S21; S23 = S20; S22 = S19; S21 = S18; S20 = S17; S19 = S16; S18 = S15; \
S17 = S14; S16 = S13; S15 = S12; S14 = S11; S13 = S10; S12 = S09; S11 = S08; S10 = S07; S09 = S06; \
S08 = S05; S07 = S04; S06 = S03; S05 = S02; S04 = S01; S03 = S00; S02 = B35; S01 = B34; S00 = B33; \
} while (0)
#define ROR8 do { \
sph_u32 B28 = S28, B29 = S29, B30 = S30, B31 = S31, B32 = S32, B33 = S33, B34 = S34, B35 = S35; \
S35 = S27; S34 = S26; S33 = S25; S32 = S24; S31 = S23; S30 = S22; S29 = S21; S28 = S20; S27 = S19; \
S26 = S18; S25 = S17; S24 = S16; S23 = S15; S22 = S14; S21 = S13; S20 = S12; S19 = S11; S18 = S10; \
S17 = S09; S16 = S08; S15 = S07; S14 = S06; S13 = S05; S12 = S04; S11 = S03; S10 = S02; S09 = S01; \
S08 = S00; S07 = B35; S06 = B34; S05 = B33; S04 = B32; S03 = B31; S02 = B30; S01 = B29; S00 = B28; \
} while (0)
#define ROR9 do { \
sph_u32 B27 = S27, B28 = S28, B29 = S29, B30 = S30, B31 = S31, B32 = S32, B33 = S33, B34 = S34, B35 = S35; \
S35 = S26; S34 = S25; S33 = S24; S32 = S23; S31 = S22; S30 = S21; S29 = S20; S28 = S19; S27 = S18; \
S26 = S17; S25 = S16; S24 = S15; S23 = S14; S22 = S13; S21 = S12; S20 = S11; S19 = S10; S18 = S09; \
S17 = S08; S16 = S07; S15 = S06; S14 = S05; S13 = S04; S12 = S03; S11 = S02; S10 = S01; S09 = S00; \
S08 = B35; S07 = B34; S06 = B33; S05 = B32; S04 = B31; S03 = B30; S02 = B29; S01 = B28; S00 = B27; \
} while (0)
#define FUGUE512_3(x, y, z) do { \
TIX4(x, S00, S01, S04, S07, S08, S22, S24, S27, S30); \
CMIX36(S33, S34, S35, S01, S02, S03, S15, S16, S17); \
SMIX(S33, S34, S35, S00); \
CMIX36(S30, S31, S32, S34, S35, S00, S12, S13, S14); \
SMIX(S30, S31, S32, S33); \
CMIX36(S27, S28, S29, S31, S32, S33, S09, S10, S11); \
SMIX(S27, S28, S29, S30); \
CMIX36(S24, S25, S26, S28, S29, S30, S06, S07, S08); \
SMIX(S24, S25, S26, S27); \
\
TIX4(y, S24, S25, S28, S31, S32, S10, S12, S15, S18); \
CMIX36(S21, S22, S23, S25, S26, S27, S03, S04, S05); \
SMIX(S21, S22, S23, S24); \
CMIX36(S18, S19, S20, S22, S23, S24, S00, S01, S02); \
SMIX(S18, S19, S20, S21); \
CMIX36(S15, S16, S17, S19, S20, S21, S33, S34, S35); \
SMIX(S15, S16, S17, S18); \
CMIX36(S12, S13, S14, S16, S17, S18, S30, S31, S32); \
SMIX(S12, S13, S14, S15); \
\
TIX4(z, S12, S13, S16, S19, S20, S34, S00, S03, S06); \
CMIX36(S09, S10, S11, S13, S14, S15, S27, S28, S29); \
SMIX(S09, S10, S11, S12); \
CMIX36(S06, S07, S08, S10, S11, S12, S24, S25, S26); \
SMIX(S06, S07, S08, S09); \
CMIX36(S03, S04, S05, S07, S08, S09, S21, S22, S23); \
SMIX(S03, S04, S05, S06); \
CMIX36(S00, S01, S02, S04, S05, S06, S18, S19, S20); \
SMIX(S00, S01, S02, S03); \
} while (0)

232
kernel/hamsi.cl

@ -200,22 +200,22 @@ __constant static const sph_u32 alpha_f[] = { @@ -200,22 +200,22 @@ __constant static const sph_u32 alpha_f[] = {
h[0x7] = c7; \
} while (0)
#define s0 m0
#define s1 m1
#define s2 c0
#define s3 c1
#define s4 c2
#define s5 c3
#define s6 m2
#define s7 m3
#define s8 m4
#define s9 m5
#define sA c4
#define sB c5
#define sC c6
#define sD c7
#define sE m6
#define sF m7
#define hamsi_s0 m0
#define hamsi_s1 m1
#define hamsi_s2 c0
#define hamsi_s3 c1
#define hamsi_s4 c2
#define hamsi_s5 c3
#define hamsi_s6 m2
#define hamsi_s7 m3
#define hamsi_s8 m4
#define hamsi_s9 m5
#define hamsi_sA c4
#define hamsi_sB c5
#define hamsi_sC c6
#define hamsi_sD c7
#define hamsi_sE m6
#define hamsi_sF m7
#define SBOX(a, b, c, d) do { \
sph_u32 t; \
@ -240,7 +240,7 @@ __constant static const sph_u32 alpha_f[] = { @@ -240,7 +240,7 @@ __constant static const sph_u32 alpha_f[] = {
(d) = SPH_T32(~t); \
} while (0)
#define L(a, b, c, d) do { \
#define HAMSI_L(a, b, c, d) do { \
(a) = SPH_ROTL32(a, 13); \
(c) = SPH_ROTL32(c, 3); \
(b) ^= (a) ^ (c); \
@ -254,30 +254,30 @@ __constant static const sph_u32 alpha_f[] = { @@ -254,30 +254,30 @@ __constant static const sph_u32 alpha_f[] = {
} while (0)
#define ROUND_SMALL(rc, alpha) do { \
s0 ^= alpha[0x00]; \
s1 ^= alpha[0x01] ^ (sph_u32)(rc); \
s2 ^= alpha[0x02]; \
s3 ^= alpha[0x03]; \
s4 ^= alpha[0x08]; \
s5 ^= alpha[0x09]; \
s6 ^= alpha[0x0A]; \
s7 ^= alpha[0x0B]; \
s8 ^= alpha[0x10]; \
s9 ^= alpha[0x11]; \
sA ^= alpha[0x12]; \
sB ^= alpha[0x13]; \
sC ^= alpha[0x18]; \
sD ^= alpha[0x19]; \
sE ^= alpha[0x1A]; \
sF ^= alpha[0x1B]; \
SBOX(s0, s4, s8, sC); \
SBOX(s1, s5, s9, sD); \
SBOX(s2, s6, sA, sE); \
SBOX(s3, s7, sB, sF); \
L(s0, s5, sA, sF); \
L(s1, s6, sB, sC); \
L(s2, s7, s8, sD); \
L(s3, s4, s9, sE); \
hamsi_s0 ^= alpha[0x00]; \
hamsi_s1 ^= alpha[0x01] ^ (sph_u32)(rc); \
hamsi_s2 ^= alpha[0x02]; \
hamsi_s3 ^= alpha[0x03]; \
hamsi_s4 ^= alpha[0x08]; \
hamsi_s5 ^= alpha[0x09]; \
hamsi_s6 ^= alpha[0x0A]; \
hamsi_s7 ^= alpha[0x0B]; \
hamsi_s8 ^= alpha[0x10]; \
hamsi_s9 ^= alpha[0x11]; \
hamsi_sA ^= alpha[0x12]; \
hamsi_sB ^= alpha[0x13]; \
hamsi_sC ^= alpha[0x18]; \
hamsi_sD ^= alpha[0x19]; \
hamsi_sE ^= alpha[0x1A]; \
hamsi_sF ^= alpha[0x1B]; \
SBOX(hamsi_s0, hamsi_s4, hamsi_s8, hamsi_sC); \
SBOX(hamsi_s1, hamsi_s5, hamsi_s9, hamsi_sD); \
SBOX(hamsi_s2, hamsi_s6, hamsi_sA, hamsi_sE); \
SBOX(hamsi_s3, hamsi_s7, hamsi_sB, hamsi_sF); \
HAMSI_L(hamsi_s0, hamsi_s5, hamsi_sA, hamsi_sF); \
HAMSI_L(hamsi_s1, hamsi_s6, hamsi_sB, hamsi_sC); \
HAMSI_L(hamsi_s2, hamsi_s7, hamsi_s8, hamsi_sD); \
HAMSI_L(hamsi_s3, hamsi_s4, hamsi_s9, hamsi_sE); \
} while (0)
#define P_SMALL do { \
@ -297,13 +297,147 @@ __constant static const sph_u32 alpha_f[] = { @@ -297,13 +297,147 @@ __constant static const sph_u32 alpha_f[] = {
#define T_SMALL do { \
/* order is important */ \
c7 = (h[7] ^= sB); \
c6 = (h[6] ^= sA); \
c5 = (h[5] ^= s9); \
c4 = (h[4] ^= s8); \
c3 = (h[3] ^= s3); \
c2 = (h[2] ^= s2); \
c1 = (h[1] ^= s1); \
c0 = (h[0] ^= s0); \
c7 = (h[7] ^= hamsi_sB); \
c6 = (h[6] ^= hamsi_sA); \
c5 = (h[5] ^= hamsi_s9); \
c4 = (h[4] ^= hamsi_s8); \
c3 = (h[3] ^= hamsi_s3); \
c2 = (h[2] ^= hamsi_s2); \
c1 = (h[1] ^= hamsi_s1); \
c0 = (h[0] ^= hamsi_s0); \
} while (0)
#define hamsi_s00 m0
#define hamsi_s01 m1
#define hamsi_s02 c0
#define hamsi_s03 c1
#define hamsi_s04 m2
#define hamsi_s05 m3
#define hamsi_s06 c2
#define hamsi_s07 c3
#define hamsi_s08 c4
#define hamsi_s09 c5
#define hamsi_s0A m4
#define hamsi_s0B m5
#define hamsi_s0C c6
#define hamsi_s0D c7
#define hamsi_s0E m6
#define hamsi_s0F m7
#define hamsi_s10 m8
#define hamsi_s11 m9
#define hamsi_s12 c8
#define hamsi_s13 c9
#define hamsi_s14 mA
#define hamsi_s15 mB
#define hamsi_s16 cA
#define hamsi_s17 cB
#define hamsi_s18 cC
#define hamsi_s19 cD
#define hamsi_s1A mC
#define hamsi_s1B mD
#define hamsi_s1C cE
#define hamsi_s1D cF
#define hamsi_s1E mE
#define hamsi_s1F mF
#define ROUND_BIG(rc, alpha) do { \
hamsi_s00 ^= alpha[0x00]; \
hamsi_s01 ^= alpha[0x01] ^ (sph_u32)(rc); \
hamsi_s02 ^= alpha[0x02]; \
hamsi_s03 ^= alpha[0x03]; \
hamsi_s04 ^= alpha[0x04]; \
hamsi_s05 ^= alpha[0x05]; \
hamsi_s06 ^= alpha[0x06]; \
hamsi_s07 ^= alpha[0x07]; \
hamsi_s08 ^= alpha[0x08]; \
hamsi_s09 ^= alpha[0x09]; \
hamsi_s0A ^= alpha[0x0A]; \
hamsi_s0B ^= alpha[0x0B]; \
hamsi_s0C ^= alpha[0x0C]; \
hamsi_s0D ^= alpha[0x0D]; \
hamsi_s0E ^= alpha[0x0E]; \
hamsi_s0F ^= alpha[0x0F]; \
hamsi_s10 ^= alpha[0x10]; \
hamsi_s11 ^= alpha[0x11]; \
hamsi_s12 ^= alpha[0x12]; \
hamsi_s13 ^= alpha[0x13]; \
hamsi_s14 ^= alpha[0x14]; \
hamsi_s15 ^= alpha[0x15]; \
hamsi_s16 ^= alpha[0x16]; \
hamsi_s17 ^= alpha[0x17]; \
hamsi_s18 ^= alpha[0x18]; \
hamsi_s19 ^= alpha[0x19]; \
hamsi_s1A ^= alpha[0x1A]; \
hamsi_s1B ^= alpha[0x1B]; \
hamsi_s1C ^= alpha[0x1C]; \
hamsi_s1D ^= alpha[0x1D]; \
hamsi_s1E ^= alpha[0x1E]; \
hamsi_s1F ^= alpha[0x1F]; \
SBOX(hamsi_s00, hamsi_s08, hamsi_s10, hamsi_s18); \
SBOX(hamsi_s01, hamsi_s09, hamsi_s11, hamsi_s19); \
SBOX(hamsi_s02, hamsi_s0A, hamsi_s12, hamsi_s1A); \
SBOX(hamsi_s03, hamsi_s0B, hamsi_s13, hamsi_s1B); \
SBOX(hamsi_s04, hamsi_s0C, hamsi_s14, hamsi_s1C); \
SBOX(hamsi_s05, hamsi_s0D, hamsi_s15, hamsi_s1D); \
SBOX(hamsi_s06, hamsi_s0E, hamsi_s16, hamsi_s1E); \
SBOX(hamsi_s07, hamsi_s0F, hamsi_s17, hamsi_s1F); \
HAMSI_L(hamsi_s00, hamsi_s09, hamsi_s12, hamsi_s1B); \
HAMSI_L(hamsi_s01, hamsi_s0A, hamsi_s13, hamsi_s1C); \
HAMSI_L(hamsi_s02, hamsi_s0B, hamsi_s14, hamsi_s1D); \
HAMSI_L(hamsi_s03, hamsi_s0C, hamsi_s15, hamsi_s1E); \
HAMSI_L(hamsi_s04, hamsi_s0D, hamsi_s16, hamsi_s1F); \
HAMSI_L(hamsi_s05, hamsi_s0E, hamsi_s17, hamsi_s18); \
HAMSI_L(hamsi_s06, hamsi_s0F, hamsi_s10, hamsi_s19); \
HAMSI_L(hamsi_s07, hamsi_s08, hamsi_s11, hamsi_s1A); \
HAMSI_L(hamsi_s00, hamsi_s02, hamsi_s05, hamsi_s07); \
HAMSI_L(hamsi_s10, hamsi_s13, hamsi_s15, hamsi_s16); \
HAMSI_L(hamsi_s09, hamsi_s0B, hamsi_s0C, hamsi_s0E); \
HAMSI_L(hamsi_s19, hamsi_s1A, hamsi_s1C, hamsi_s1F); \
} while (0)
#define P_BIG do { \
ROUND_BIG(0, alpha_n); \
ROUND_BIG(1, alpha_n); \
ROUND_BIG(2, alpha_n); \
ROUND_BIG(3, alpha_n); \
ROUND_BIG(4, alpha_n); \
ROUND_BIG(5, alpha_n); \
} while (0)
#define PF_BIG do { \
ROUND_BIG(0, alpha_f); \
ROUND_BIG(1, alpha_f); \
ROUND_BIG(2, alpha_f); \
ROUND_BIG(3, alpha_f); \
ROUND_BIG(4, alpha_f); \
ROUND_BIG(5, alpha_f); \
ROUND_BIG(6, alpha_f); \
ROUND_BIG(7, alpha_f); \
ROUND_BIG(8, alpha_f); \
ROUND_BIG(9, alpha_f); \
ROUND_BIG(10, alpha_f); \
ROUND_BIG(11, alpha_f); \
} while (0)
#define T_BIG do { \
/* order is important */ \
cF = (h[0xF] ^= hamsi_s17); \
cE = (h[0xE] ^= hamsi_s16); \
cD = (h[0xD] ^= hamsi_s15); \
cC = (h[0xC] ^= hamsi_s14); \
cB = (h[0xB] ^= hamsi_s13); \
cA = (h[0xA] ^= hamsi_s12); \
c9 = (h[0x9] ^= hamsi_s11); \
c8 = (h[0x8] ^= hamsi_s10); \
c7 = (h[0x7] ^= hamsi_s07); \
c6 = (h[0x6] ^= hamsi_s06); \
c5 = (h[0x5] ^= hamsi_s05); \
c4 = (h[0x4] ^= hamsi_s04); \
c3 = (h[0x3] ^= hamsi_s03); \
c2 = (h[0x2] ^= hamsi_s02); \
c1 = (h[0x1] ^= hamsi_s01); \
c0 = (h[0x0] ^= hamsi_s00); \
} while (0)

4
kernel/hamsi_helper.cl

@ -8371,7 +8371,7 @@ __constant static const sph_u32 T512[64][16] = { @@ -8371,7 +8371,7 @@ __constant static const sph_u32 T512[64][16] = {
};
#define INPUT_BIG do { \
const sph_u32 *tp = &T512[0][0]; \
__constant const sph_u32 *tp = &T512[0][0]; \
unsigned u, v; \
m0 = 0; \
m1 = 0; \
@ -8390,7 +8390,7 @@ __constant static const sph_u32 T512[64][16] = { @@ -8390,7 +8390,7 @@ __constant static const sph_u32 T512[64][16] = {
mE = 0; \
mF = 0; \
for (u = 0; u < 8; u ++) { \
unsigned db = buf[u]; \
unsigned db = buf(u); \
for (v = 0; v < 8; v ++, db >>= 1) { \
sph_u32 dm = SPH_T32(-(sph_u32)(db & 1)); \
m0 ^= dm & *tp ++; \

844
kernel/marucoin.cl

@ -0,0 +1,844 @@ @@ -0,0 +1,844 @@
/*
* X13 kernel implementation.
*
* ==========================(LICENSE BEGIN)============================
*
* Copyright (c) 2014 phm
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* ===========================(LICENSE END)=============================
*
* @author phm <phm@inbox.com>
*/
#ifndef MARUCOIN_CL
#define MARUCOIN_CL
#if __ENDIAN_LITTLE__
#define SPH_LITTLE_ENDIAN 1
#else
#define SPH_BIG_ENDIAN 1
#endif
#define SPH_UPTR sph_u64
typedef unsigned int sph_u32;
typedef int sph_s32;
#ifndef __OPENCL_VERSION__
typedef unsigned long long sph_u64;
typedef long long sph_s64;
#else
typedef unsigned long sph_u64;
typedef long sph_s64;
#endif
#define SPH_64 1
#define SPH_64_TRUE 1
#define SPH_C32(x) ((sph_u32)(x ## U))
#define SPH_T32(x) ((x) & SPH_C32(0xFFFFFFFF))
#define SPH_ROTL32(x, n) SPH_T32(((x) << (n)) | ((x) >> (32 - (n))))
#define SPH_ROTR32(x, n) SPH_ROTL32(x, (32 - (n)))
#define SPH_C64(x) ((sph_u64)(x ## UL))
#define SPH_T64(x) ((x) & SPH_C64(0xFFFFFFFFFFFFFFFF))
#define SPH_ROTL64(x, n) SPH_T64(((x) << (n)) | ((x) >> (64 - (n))))
#define SPH_ROTR64(x, n) SPH_ROTL64(x, (64 - (n)))
#define SPH_ECHO_64 1
#define SPH_KECCAK_64 1
#define SPH_JH_64 1
#define SPH_SIMD_NOCOPY 0
#define SPH_KECCAK_NOCOPY 0
#define SPH_COMPACT_BLAKE_64 0
#define SPH_LUFFA_PARALLEL 0
#define SPH_SMALL_FOOTPRINT_GROESTL 0
#define SPH_GROESTL_BIG_ENDIAN 0
#define SPH_CUBEHASH_UNROLL 0
#define SPH_KECCAK_UNROLL 0
#define SPH_HAMSI_EXPAND_BIG 1
#include "blake.cl"
#include "bmw.cl"
#include "groestl.cl"
#include "jh.cl"
#include "keccak.cl"
#include "skein.cl"
#include "luffa.cl"
#include "cubehash.cl"
#include "shavite.cl"
#include "simd.cl"
#include "echo.cl"
#include "hamsi.cl"
#include "fugue.cl"
#define SWAP4(x) as_uint(as_uchar4(x).wzyx)
#define SWAP8(x) as_ulong(as_uchar8(x).s76543210)
#if SPH_BIG_ENDIAN
#define DEC64E(x) (x)
#define DEC64BE(x) (*(const __global sph_u64 *) (x));
#else
#define DEC64E(x) SWAP8(x)
#define DEC64BE(x) SWAP8(*(const __global sph_u64 *) (x));
#endif
__attribute__((reqd_work_group_size(WORKSIZE, 1, 1)))
__kernel void search(__global unsigned char* block, volatile __global uint* output, const ulong target)
{
uint gid = get_global_id(0);
union {
unsigned char h1[64];
uint h4[16];
ulong h8[8];
} hash;
__local sph_u32 AES0[256], AES1[256], AES2[256], AES3[256];
int init = get_local_id(0);
int step = get_local_size(0);
for (int i = init; i < 256; i += step)
{
AES0[i] = AES0_C[i];
AES1[i] = AES1_C[i];
AES2[i] = AES2_C[i];
AES3[i] = AES3_C[i];
}
barrier(CLK_LOCAL_MEM_FENCE);
// blake
{
sph_u64 H0 = SPH_C64(0x6A09E667F3BCC908), H1 = SPH_C64(0xBB67AE8584CAA73B);
sph_u64 H2 = SPH_C64(0x3C6EF372FE94F82B), H3 = SPH_C64(0xA54FF53A5F1D36F1);
sph_u64 H4 = SPH_C64(0x510E527FADE682D1), H5 = SPH_C64(0x9B05688C2B3E6C1F);
sph_u64 H6 = SPH_C64(0x1F83D9ABFB41BD6B), H7 = SPH_C64(0x5BE0CD19137E2179);
sph_u64 S0 = 0, S1 = 0, S2 = 0, S3 = 0;
sph_u64 T0 = SPH_C64(0xFFFFFFFFFFFFFC00) + (80 << 3), T1 = 0xFFFFFFFFFFFFFFFF;;
if ((T0 = SPH_T64(T0 + 1024)) < 1024)
{
T1 = SPH_T64(T1 + 1);
}
sph_u64 M0, M1, M2, M3, M4, M5, M6, M7;
sph_u64 M8, M9, MA, MB, MC, MD, ME, MF;
sph_u64 V0, V1, V2, V3, V4, V5, V6, V7;
sph_u64 V8, V9, VA, VB, VC, VD, VE, VF;
M0 = DEC64BE(block + 0);
M1 = DEC64BE(block + 8);
M2 = DEC64BE(block + 16);
M3 = DEC64BE(block + 24);
M4 = DEC64BE(block + 32);
M5 = DEC64BE(block + 40);
M6 = DEC64BE(block + 48);
M7 = DEC64BE(block + 56);
M8 = DEC64BE(block + 64);
M9 = DEC64BE(block + 72);
M9 &= 0xFFFFFFFF00000000;
M9 ^= SWAP4(gid);
MA = 0x8000000000000000;
MB = 0;
MC = 0;
MD = 1;
ME = 0;
MF = 0x280;
COMPRESS64;
hash.h8[0] = H0;
hash.h8[1] = H1;
hash.h8[2] = H2;
hash.h8[3] = H3;
hash.h8[4] = H4;
hash.h8[5] = H5;
hash.h8[6] = H6;
hash.h8[7] = H7;
}
// bmw
sph_u64 BMW_H[16];
for(unsigned u = 0; u < 16; u++)
BMW_H[u] = BMW_IV512[u];
sph_u64 BMW_h1[16], BMW_h2[16];
sph_u64 mv[16];
mv[ 0] = SWAP8(hash.h8[0]);
mv[ 1] = SWAP8(hash.h8[1]);
mv[ 2] = SWAP8(hash.h8[2]);
mv[ 3] = SWAP8(hash.h8[3]);
mv[ 4] = SWAP8(hash.h8[4]);
mv[ 5] = SWAP8(hash.h8[5]);
mv[ 6] = SWAP8(hash.h8[6]);
mv[ 7] = SWAP8(hash.h8[7]);
mv[ 8] = 0x80;
mv[ 9] = 0;
mv[10] = 0;
mv[11] = 0;
mv[12] = 0;
mv[13] = 0;
mv[14] = 0;
mv[15] = 0x200;
#define M(x) (mv[x])
#define H(x) (BMW_H[x])
#define dH(x) (BMW_h2[x])
FOLDb;
#undef M
#undef H
#undef dH
#define M(x) (BMW_h2[x])
#define H(x) (final_b[x])
#define dH(x) (BMW_h1[x])
FOLDb;
#undef M
#undef H
#undef dH
hash.h8[0] = SWAP8(BMW_h1[8]);
hash.h8[1] = SWAP8(BMW_h1[9]);
hash.h8[2] = SWAP8(BMW_h1[10]);
hash.h8[3] = SWAP8(BMW_h1[11]);
hash.h8[4] = SWAP8(BMW_h1[12]);
hash.h8[5] = SWAP8(BMW_h1[13]);
hash.h8[6] = SWAP8(BMW_h1[14]);
hash.h8[7] = SWAP8(BMW_h1[15]);
// groestl
sph_u64 H[16];
for (unsigned int u = 0; u < 15; u ++)
H[u] = 0;
#if USE_LE
H[15] = ((sph_u64)(512 & 0xFF) << 56) | ((sph_u64)(512 & 0xFF00) << 40);
#else
H[15] = (sph_u64)512;
#endif
sph_u64 g[16], m[16];
m[0] = DEC64E(hash.h8[0]);
m[1] = DEC64E(hash.h8[1]);
m[2] = DEC64E(hash.h8[2]);
m[3] = DEC64E(hash.h8[3]);
m[4] = DEC64E(hash.h8[4]);
m[5] = DEC64E(hash.h8[5]);
m[6] = DEC64E(hash.h8[6]);
m[7] = DEC64E(hash.h8[7]);
for (unsigned int u = 0; u < 16; u ++)
g[u] = m[u] ^ H[u];
m[8] = 0x80; g[8] = m[8] ^ H[8];
m[9] = 0; g[9] = m[9] ^ H[9];
m[10] = 0; g[10] = m[10] ^ H[10];
m[11] = 0; g[11] = m[11] ^ H[11];
m[12] = 0; g[12] = m[12] ^ H[12];
m[13] = 0; g[13] = m[13] ^ H[13];
m[14] = 0; g[14] = m[14] ^ H[14];
m[15] = 0x100000000000000; g[15] = m[15] ^ H[15];
PERM_BIG_P(g);
PERM_BIG_Q(m);
for (unsigned int u = 0; u < 16; u ++)
H[u] ^= g[u] ^ m[u];
sph_u64 xH[16];
for (unsigned int u = 0; u < 16; u ++)
xH[u] = H[u];
PERM_BIG_P(xH);
for (unsigned int u = 0; u < 16; u ++)
H[u] ^= xH[u];
for (unsigned int u = 0; u < 8; u ++)
hash.h8[u] = DEC64E(H[u + 8]);
// skein
sph_u64 h0 = SPH_C64(0x4903ADFF749C51CE), h1 = SPH_C64(0x0D95DE399746DF03), h2 = SPH_C64(0x8FD1934127C79BCE), h3 = SPH_C64(0x9A255629FF352CB1), h4 = SPH_C64(0x5DB62599DF6CA7B0), h5 = SPH_C64(0xEABE394CA9D5C3F4), h6 = SPH_C64(0x991112C71A75B523), h7 = SPH_C64(0xAE18A40B660FCC33);
sph_u64 m0, m1, m2, m3, m4, m5, m6, m7;
sph_u64 bcount = 0;
m0 = SWAP8(hash.h8[0]);
m1 = SWAP8(hash.h8[1]);
m2 = SWAP8(hash.h8[2]);
m3 = SWAP8(hash.h8[3]);
m4 = SWAP8(hash.h8[4]);
m5 = SWAP8(hash.h8[5]);
m6 = SWAP8(hash.h8[6]);
m7 = SWAP8(hash.h8[7]);
UBI_BIG(480, 64);
bcount = 0;
m0 = m1 = m2 = m3 = m4 = m5 = m6 = m7 = 0;
UBI_BIG(510, 8);
hash.h8[0] = SWAP8(h0);
hash.h8[1] = SWAP8(h1);
hash.h8[2] = SWAP8(h2);
hash.h8[3] = SWAP8(h3);
hash.h8[4] = SWAP8(h4);
hash.h8[5] = SWAP8(h5);
hash.h8[6] = SWAP8(h6);
hash.h8[7] = SWAP8(h7);
// jh
sph_u64 h0h = C64e(0x6fd14b963e00aa17), h0l = C64e(0x636a2e057a15d543), h1h = C64e(0x8a225e8d0c97ef0b), h1l = C64e(0xe9341259f2b3c361), h2h = C64e(0x891da0c1536f801e), h2l = C64e(0x2aa9056bea2b6d80), h3h = C64e(0x588eccdb2075baa6), h3l = C64e(0xa90f3a76baf83bf7);
sph_u64 h4h = C64e(0x0169e60541e34a69), h4l = C64e(0x46b58a8e2e6fe65a), h5h = C64e(0x1047a7d0c1843c24), h5l = C64e(0x3b6e71b12d5ac199), h6h = C64e(0xcf57f6ec9db1f856), h6l = C64e(0xa706887c5716b156), h7h = C64e(0xe3c2fcdfe68517fb), h7l = C64e(0x545a4678cc8cdd4b);
sph_u64 tmp;
for(int i = 0; i < 2; i++)
{
if (i == 0) {
h0h ^= DEC64E(hash.h8[0]);
h0l ^= DEC64E(hash.h8[1]);
h1h ^= DEC64E(hash.h8[2]);
h1l ^= DEC64E(hash.h8[3]);
h2h ^= DEC64E(hash.h8[4]);
h2l ^= DEC64E(hash.h8[5]);
h3h ^= DEC64E(hash.h8[6]);
h3l ^= DEC64E(hash.h8[7]);
} else if(i == 1) {
h4h ^= DEC64E(hash.h8[0]);
h4l ^= DEC64E(hash.h8[1]);
h5h ^= DEC64E(hash.h8[2]);
h5l ^= DEC64E(hash.h8[3]);
h6h ^= DEC64E(hash.h8[4]);
h6l ^= DEC64E(hash.h8[5]);
h7h ^= DEC64E(hash.h8[6]);
h7l ^= DEC64E(hash.h8[7]);
h0h ^= 0x80;
h3l ^= 0x2000000000000;
}
E8;
}
h4h ^= 0x80;
h7l ^= 0x2000000000000;
hash.h8[0] = DEC64E(h4h);
hash.h8[1] = DEC64E(h4l);
hash.h8[2] = DEC64E(h5h);
hash.h8[3] = DEC64E(h5l);
hash.h8[4] = DEC64E(h6h);
hash.h8[5] = DEC64E(h6l);
hash.h8[6] = DEC64E(h7h);
hash.h8[7] = DEC64E(h7l);
// keccak
sph_u64 a00 = 0, a01 = 0, a02 = 0, a03 = 0, a04 = 0;
sph_u64 a10 = 0, a11 = 0, a12 = 0, a13 = 0, a14 = 0;
sph_u64 a20 = 0, a21 = 0, a22 = 0, a23 = 0, a24 = 0;
sph_u64 a30 = 0, a31 = 0, a32 = 0, a33 = 0, a34 = 0;
sph_u64 a40 = 0, a41 = 0, a42 = 0, a43 = 0, a44 = 0;
a10 = SPH_C64(0xFFFFFFFFFFFFFFFF);
a20 = SPH_C64(0xFFFFFFFFFFFFFFFF);
a31 = SPH_C64(0xFFFFFFFFFFFFFFFF);
a22 = SPH_C64(0xFFFFFFFFFFFFFFFF);
a23 = SPH_C64(0xFFFFFFFFFFFFFFFF);
a04 = SPH_C64(0xFFFFFFFFFFFFFFFF);
a00 ^= SWAP8(hash.h8[0]);
a10 ^= SWAP8(hash.h8[1]);
a20 ^= SWAP8(hash.h8[2]);
a30 ^= SWAP8(hash.h8[3]);
a40 ^= SWAP8(hash.h8[4]);
a01 ^= SWAP8(hash.h8[5]);
a11 ^= SWAP8(hash.h8[6]);
a21 ^= SWAP8(hash.h8[7]);
a31 ^= 0x8000000000000001;
KECCAK_F_1600;
// Finalize the "lane complement"
a10 = ~a10;
a20 = ~a20;
hash.h8[0] = SWAP8(a00);
hash.h8[1] = SWAP8(a10);
hash.h8[2] = SWAP8(a20);
hash.h8[3] = SWAP8(a30);
hash.h8[4] = SWAP8(a40);
hash.h8[5] = SWAP8(a01);
hash.h8[6] = SWAP8(a11);
hash.h8[7] = SWAP8(a21);
// luffa
sph_u32 V00 = SPH_C32(0x6d251e69), V01 = SPH_C32(0x44b051e0), V02 = SPH_C32(0x4eaa6fb4), V03 = SPH_C32(0xdbf78465), V04 = SPH_C32(0x6e292011), V05 = SPH_C32(0x90152df4), V06 = SPH_C32(0xee058139), V07 = SPH_C32(0xdef610bb);
sph_u32 V10 = SPH_C32(0xc3b44b95), V11 = SPH_C32(0xd9d2f256), V12 = SPH_C32(0x70eee9a0), V13 = SPH_C32(0xde099fa3), V14 = SPH_C32(0x5d9b0557), V15 = SPH_C32(0x8fc944b3), V16 = SPH_C32(0xcf1ccf0e), V17 = SPH_C32(0x746cd581);
sph_u32 V20 = SPH_C32(0xf7efc89d), V21 = SPH_C32(0x5dba5781), V22 = SPH_C32(0x04016ce5), V23 = SPH_C32(0xad659c05), V24 = SPH_C32(0x0306194f), V25 = SPH_C32(0x666d1836), V26 = SPH_C32(0x24aa230a), V27 = SPH_C32(0x8b264ae7);
sph_u32 V30 = SPH_C32(0x858075d5), V31 = SPH_C32(0x36d79cce), V32 = SPH_C32(0xe571f7d7), V33 = SPH_C32(0x204b1f67), V34 = SPH_C32(0x35870c6a), V35 = SPH_C32(0x57e9e923), V36 = SPH_C32(0x14bcb808), V37 = SPH_C32(0x7cde72ce);
sph_u32 V40 = SPH_C32(0x6c68e9be), V41 = SPH_C32(0x5ec41e22), V42 = SPH_C32(0xc825b7c7), V43 = SPH_C32(0xaffb4363), V44 = SPH_C32(0xf5df3999), V45 = SPH_C32(0x0fc688f1), V46 = SPH_C32(0xb07224cc), V47 = SPH_C32(0x03e86cea);
DECL_TMP8(M);
M0 = hash.h4[1];
M1 = hash.h4[0];
M2 = hash.h4[3];
M3 = hash.h4[2];
M4 = hash.h4[5];
M5 = hash.h4[4];
M6 = hash.h4[7];
M7 = hash.h4[6];
for(uint i = 0; i < 5; i++)
{
MI5;
LUFFA_P5;
if(i == 0) {
M0 = hash.h4[9];
M1 = hash.h4[8];
M2 = hash.h4[11];
M3 = hash.h4[10];
M4 = hash.h4[13];
M5 = hash.h4[12];
M6 = hash.h4[15];
M7 = hash.h4[14];
} else if(i == 1) {
M0 = 0x80000000;
M1 = M2 = M3 = M4 = M5 = M6 = M7 = 0;
} else if(i == 2) {
M0 = M1 = M2 = M3 = M4 = M5 = M6 = M7 = 0;
} else if(i == 3) {
hash.h4[1] = V00 ^ V10 ^ V20 ^ V30 ^ V40;
hash.h4[0] = V01 ^ V11 ^ V21 ^ V31 ^ V41;
hash.h4[3] = V02 ^ V12 ^ V22 ^ V32 ^ V42;
hash.h4[2] = V03 ^ V13 ^ V23 ^ V33 ^ V43;
hash.h4[5] = V04 ^ V14 ^ V24 ^ V34 ^ V44;
hash.h4[4] = V05 ^ V15 ^ V25 ^ V35 ^ V45;
hash.h4[7] = V06 ^ V16 ^ V26 ^ V36 ^ V46;
hash.h4[6] = V07 ^ V17 ^ V27 ^ V37 ^ V47;
}
}
hash.h4[9] = V00 ^ V10 ^ V20 ^ V30 ^ V40;
hash.h4[8] = V01 ^ V11 ^ V21 ^ V31 ^ V41;
hash.h4[11] = V02 ^ V12 ^ V22 ^ V32 ^ V42;
hash.h4[10] = V03 ^ V13 ^ V23 ^ V33 ^ V43;
hash.h4[13] = V04 ^ V14 ^ V24 ^ V34 ^ V44;
hash.h4[12] = V05 ^ V15 ^ V25 ^ V35 ^ V45;
hash.h4[15] = V06 ^ V16 ^ V26 ^ V36 ^ V46;
hash.h4[14] = V07 ^ V17 ^ V27 ^ V37 ^ V47;
// cubehash.h1
sph_u32 x0 = SPH_C32(0x2AEA2A61), x1 = SPH_C32(0x50F494D4), x2 = SPH_C32(0x2D538B8B), x3 = SPH_C32(0x4167D83E);
sph_u32 x4 = SPH_C32(0x3FEE2313), x5 = SPH_C32(0xC701CF8C), x6 = SPH_C32(0xCC39968E), x7 = SPH_C32(0x50AC5695);
sph_u32 x8 = SPH_C32(0x4D42C787), x9 = SPH_C32(0xA647A8B3), xa = SPH_C32(0x97CF0BEF), xb = SPH_C32(0x825B4537);
sph_u32 xc = SPH_C32(0xEEF864D2), xd = SPH_C32(0xF22090C4), xe = SPH_C32(0xD0E5CD33), xf = SPH_C32(0xA23911AE);
sph_u32 xg = SPH_C32(0xFCD398D9), xh = SPH_C32(0x148FE485), xi = SPH_C32(0x1B017BEF), xj = SPH_C32(0xB6444532);
sph_u32 xk = SPH_C32(0x6A536159), xl = SPH_C32(0x2FF5781C), xm = SPH_C32(0x91FA7934), xn = SPH_C32(0x0DBADEA9);
sph_u32 xo = SPH_C32(0xD65C8A2B), xp = SPH_C32(0xA5A70E75), xq = SPH_C32(0xB1C62456), xr = SPH_C32(0xBC796576);
sph_u32 xs = SPH_C32(0x1921C8F7), xt = SPH_C32(0xE7989AF1), xu = SPH_C32(0x7795D246), xv = SPH_C32(0xD43E3B44);
x0 ^= SWAP4(hash.h4[1]);
x1 ^= SWAP4(hash.h4[0]);
x2 ^= SWAP4(hash.h4[3]);
x3 ^= SWAP4(hash.h4[2]);
x4 ^= SWAP4(hash.h4[5]);
x5 ^= SWAP4(hash.h4[4]);
x6 ^= SWAP4(hash.h4[7]);
x7 ^= SWAP4(hash.h4[6]);
for (int i = 0; i < 13; i ++) {
SIXTEEN_ROUNDS;
if (i == 0) {
x0 ^= SWAP4(hash.h4[9]);
x1 ^= SWAP4(hash.h4[8]);
x2 ^= SWAP4(hash.h4[11]);
x3 ^= SWAP4(hash.h4[10]);
x4 ^= SWAP4(hash.h4[13]);
x5 ^= SWAP4(hash.h4[12]);
x6 ^= SWAP4(hash.h4[15]);
x7 ^= SWAP4(hash.h4[14]);
} else if(i == 1) {
x0 ^= 0x80;
} else if (i == 2) {
xv ^= SPH_C32(1);
}
}
hash.h4[0] = x0;
hash.h4[1] = x1;
hash.h4[2] = x2;
hash.h4[3] = x3;
hash.h4[4] = x4;
hash.h4[5] = x5;
hash.h4[6] = x6;
hash.h4[7] = x7;
hash.h4[8] = x8;
hash.h4[9] = x9;
hash.h4[10] = xa;
hash.h4[11] = xb;
hash.h4[12] = xc;
hash.h4[13] = xd;
hash.h4[14] = xe;
hash.h4[15] = xf;
// shavite
{
// IV
sph_u32 h0 = SPH_C32(0x72FCCDD8), h1 = SPH_C32(0x79CA4727), h2 = SPH_C32(0x128A077B), h3 = SPH_C32(0x40D55AEC);
sph_u32 h4 = SPH_C32(0xD1901A06), h5 = SPH_C32(0x430AE307), h6 = SPH_C32(0xB29F5CD1), h7 = SPH_C32(0xDF07FBFC);
sph_u32 h8 = SPH_C32(0x8E45D73D), h9 = SPH_C32(0x681AB538), hA = SPH_C32(0xBDE86578), hB = SPH_C32(0xDD577E47);
sph_u32 hC = SPH_C32(0xE275EADE), hD = SPH_C32(0x502D9FCD), hE = SPH_C32(0xB9357178), hF = SPH_C32(0x022A4B9A);
// state
sph_u32 rk00, rk01, rk02, rk03, rk04, rk05, rk06, rk07;
sph_u32 rk08, rk09, rk0A, rk0B, rk0C, rk0D, rk0E, rk0F;
sph_u32 rk10, rk11, rk12, rk13, rk14, rk15, rk16, rk17;
sph_u32 rk18, rk19, rk1A, rk1B, rk1C, rk1D, rk1E, rk1F;
sph_u32 sc_count0 = (64 << 3), sc_count1 = 0, sc_count2 = 0, sc_count3 = 0;
rk00 = hash.h4[0];
rk01 = hash.h4[1];
rk02 = hash.h4[2];
rk03 = hash.h4[3];
rk04 = hash.h4[4];
rk05 = hash.h4[5];
rk06 = hash.h4[6];
rk07 = hash.h4[7];
rk08 = hash.h4[8];
rk09 = hash.h4[9];
rk0A = hash.h4[10];
rk0B = hash.h4[11];
rk0C = hash.h4[12];
rk0D = hash.h4[13];
rk0E = hash.h4[14];
rk0F = hash.h4[15];
rk10 = 0x80;
rk11 = rk12 = rk13 = rk14 = rk15 = rk16 = rk17 = rk18 = rk19 = rk1A = 0;
rk1B = 0x2000000;
rk1C = rk1D = rk1E = 0;
rk1F = 0x2000000;
c512(buf);
hash.h4[0] = h0;
hash.h4[1] = h1;
hash.h4[2] = h2;
hash.h4[3] = h3;
hash.h4[4] = h4;
hash.h4[5] = h5;
hash.h4[6] = h6;
hash.h4[7] = h7;
hash.h4[8] = h8;
hash.h4[9] = h9;
hash.h4[10] = hA;
hash.h4[11] = hB;
hash.h4[12] = hC;
hash.h4[13] = hD;
hash.h4[14] = hE;
hash.h4[15] = hF;
}
// simd
{
s32 q[256];
unsigned char x[128];
for(unsigned int i = 0; i < 64; i++)
x[i] = hash.h1[i];
for(unsigned int i = 64; i < 128; i++)
x[i] = 0;
u32 A0 = C32(0x0BA16B95), A1 = C32(0x72F999AD), A2 = C32(0x9FECC2AE), A3 = C32(0xBA3264FC), A4 = C32(0x5E894929), A5 = C32(0x8E9F30E5), A6 = C32(0x2F1DAA37), A7 = C32(0xF0F2C558);
u32 B0 = C32(0xAC506643), B1 = C32(0xA90635A5), B2 = C32(0xE25B878B), B3 = C32(0xAAB7878F), B4 = C32(0x88817F7A), B5 = C32(0x0A02892B), B6 = C32(0x559A7550), B7 = C32(0x598F657E);
u32 C0 = C32(0x7EEF60A1), C1 = C32(0x6B70E3E8), C2 = C32(0x9C1714D1), C3 = C32(0xB958E2A8), C4 = C32(0xAB02675E), C5 = C32(0xED1C014F), C6 = C32(0xCD8D65BB), C7 = C32(0xFDB7A257);
u32 D0 = C32(0x09254899), D1 = C32(0xD699C7BC), D2 = C32(0x9019B6DC), D3 = C32(0x2B9022E4), D4 = C32(0x8FA14956), D5 = C32(0x21BF9BD3), D6 = C32(0xB94D0943), D7 = C32(0x6FFDDC22);
FFT256(0, 1, 0, ll1);
for (int i = 0; i < 256; i ++) {
s32 tq;
tq = q[i] + yoff_b_n[i];
tq = REDS2(tq);
tq = REDS1(tq);
tq = REDS1(tq);
q[i] = (tq <= 128 ? tq : tq - 257);
}
A0 ^= hash.h4[0];
A1 ^= hash.h4[1];
A2 ^= hash.h4[2];
A3 ^= hash.h4[3];
A4 ^= hash.h4[4];
A5 ^= hash.h4[5];
A6 ^= hash.h4[6];
A7 ^= hash.h4[7];
B0 ^= hash.h4[8];
B1 ^= hash.h4[9];
B2 ^= hash.h4[10];
B3 ^= hash.h4[11];
B4 ^= hash.h4[12];
B5 ^= hash.h4[13];
B6 ^= hash.h4[14];
B7 ^= hash.h4[15];
ONE_ROUND_BIG(0_, 0, 3, 23, 17, 27);
ONE_ROUND_BIG(1_, 1, 28, 19, 22, 7);
ONE_ROUND_BIG(2_, 2, 29, 9, 15, 5);
ONE_ROUND_BIG(3_, 3, 4, 13, 10, 25);
STEP_BIG(
C32(0x0BA16B95), C32(0x72F999AD), C32(0x9FECC2AE), C32(0xBA3264FC),
C32(0x5E894929), C32(0x8E9F30E5), C32(0x2F1DAA37), C32(0xF0F2C558),
IF, 4, 13, PP8_4_);
STEP_BIG(
C32(0xAC506643), C32(0xA90635A5), C32(0xE25B878B), C32(0xAAB7878F),
C32(0x88817F7A), C32(0x0A02892B), C32(0x559A7550), C32(0x598F657E),
IF, 13, 10, PP8_5_);
STEP_BIG(
C32(0x7EEF60A1), C32(0x6B70E3E8), C32(0x9C1714D1), C32(0xB958E2A8),
C32(0xAB02675E), C32(0xED1C014F), C32(0xCD8D65BB), C32(0xFDB7A257),
IF, 10, 25, PP8_6_);
STEP_BIG(
C32(0x09254899), C32(0xD699C7BC), C32(0x9019B6DC), C32(0x2B9022E4),
C32(0x8FA14956), C32(0x21BF9BD3), C32(0xB94D0943), C32(0x6FFDDC22),
IF, 25, 4, PP8_0_);
u32 COPY_A0 = A0, COPY_A1 = A1, COPY_A2 = A2, COPY_A3 = A3, COPY_A4 = A4, COPY_A5 = A5, COPY_A6 = A6, COPY_A7 = A7;
u32 COPY_B0 = B0, COPY_B1 = B1, COPY_B2 = B2, COPY_B3 = B3, COPY_B4 = B4, COPY_B5 = B5, COPY_B6 = B6, COPY_B7 = B7;
u32 COPY_C0 = C0, COPY_C1 = C1, COPY_C2 = C2, COPY_C3 = C3, COPY_C4 = C4, COPY_C5 = C5, COPY_C6 = C6, COPY_C7 = C7;
u32 COPY_D0 = D0, COPY_D1 = D1, COPY_D2 = D2, COPY_D3 = D3, COPY_D4 = D4, COPY_D5 = D5, COPY_D6 = D6, COPY_D7 = D7;
#define q SIMD_Q
A0 ^= 0x200;
ONE_ROUND_BIG(0_, 0, 3, 23, 17, 27);
ONE_ROUND_BIG(1_, 1, 28, 19, 22, 7);
ONE_ROUND_BIG(2_, 2, 29, 9, 15, 5);
ONE_ROUND_BIG(3_, 3, 4, 13, 10, 25);
STEP_BIG(
COPY_A0, COPY_A1, COPY_A2, COPY_A3,
COPY_A4, COPY_A5, COPY_A6, COPY_A7,
IF, 4, 13, PP8_4_);
STEP_BIG(
COPY_B0, COPY_B1, COPY_B2, COPY_B3,
COPY_B4, COPY_B5, COPY_B6, COPY_B7,
IF, 13, 10, PP8_5_);
STEP_BIG(
COPY_C0, COPY_C1, COPY_C2, COPY_C3,
COPY_C4, COPY_C5, COPY_C6, COPY_C7,
IF, 10, 25, PP8_6_);
STEP_BIG(
COPY_D0, COPY_D1, COPY_D2, COPY_D3,
COPY_D4, COPY_D5, COPY_D6, COPY_D7,
IF, 25, 4, PP8_0_);
#undef q
hash.h4[0] = A0;
hash.h4[1] = A1;
hash.h4[2] = A2;
hash.h4[3] = A3;
hash.h4[4] = A4;
hash.h4[5] = A5;
hash.h4[6] = A6;
hash.h4[7] = A7;
hash.h4[8] = B0;
hash.h4[9] = B1;
hash.h4[10] = B2;
hash.h4[11] = B3;
hash.h4[12] = B4;
hash.h4[13] = B5;
hash.h4[14] = B6;
hash.h4[15] = B7;
}
// echo
sph_u64 W00, W01, W10, W11, W20, W21, W30, W31, W40, W41, W50, W51, W60, W61, W70, W71, W80, W81, W90, W91, WA0, WA1, WB0, WB1, WC0, WC1, WD0, WD1, WE0, WE1, WF0, WF1;
sph_u64 Vb00, Vb01, Vb10, Vb11, Vb20, Vb21, Vb30, Vb31, Vb40, Vb41, Vb50, Vb51, Vb60, Vb61, Vb70, Vb71;
Vb00 = Vb10 = Vb20 = Vb30 = Vb40 = Vb50 = Vb60 = Vb70 = 512UL;
Vb01 = Vb11 = Vb21 = Vb31 = Vb41 = Vb51 = Vb61 = Vb71 = 0;
sph_u32 K0 = 512;
sph_u32 K1 = 0;
sph_u32 K2 = 0;
sph_u32 K3 = 0;
W00 = Vb00;
W01 = Vb01;
W10 = Vb10;
W11 = Vb11;
W20 = Vb20;
W21 = Vb21;
W30 = Vb30;
W31 = Vb31;
W40 = Vb40;
W41 = Vb41;
W50 = Vb50;
W51 = Vb51;
W60 = Vb60;
W61 = Vb61;
W70 = Vb70;
W71 = Vb71;
W80 = hash.h8[0];
W81 = hash.h8[1];
W90 = hash.h8[2];
W91 = hash.h8[3];
WA0 = hash.h8[4];
WA1 = hash.h8[5];
WB0 = hash.h8[6];
WB1 = hash.h8[7];
WC0 = 0x80;
WC1 = 0;
WD0 = 0;
WD1 = 0;
WE0 = 0;
WE1 = 0x200000000000000;
WF0 = 0x200;
WF1 = 0;
for (unsigned u = 0; u < 10; u ++) {
BIG_ROUND;
}
Vb00 ^= hash.h8[0] ^ W00 ^ W80;
Vb01 ^= hash.h8[1] ^ W01 ^ W81;
Vb10 ^= hash.h8[2] ^ W10 ^ W90;
Vb11 ^= hash.h8[3] ^ W11 ^ W91;
Vb20 ^= hash.h8[4] ^ W20 ^ WA0;
Vb21 ^= hash.h8[5] ^ W21 ^ WA1;
Vb30 ^= hash.h8[6] ^ W30 ^ WB0;
Vb31 ^= hash.h8[7] ^ W31 ^ WB1;
hash.h8[0] = Vb00;
hash.h8[1] = Vb01;
hash.h8[2] = Vb10;
hash.h8[3] = Vb11;
hash.h8[4] = Vb20;
hash.h8[5] = Vb21;
hash.h8[6] = Vb30;
hash.h8[7] = Vb31;
{
sph_u32 c0 = HAMSI_IV512[0], c1 = HAMSI_IV512[1], c2 = HAMSI_IV512[2], c3 = HAMSI_IV512[3];
sph_u32 c4 = HAMSI_IV512[4], c5 = HAMSI_IV512[5], c6 = HAMSI_IV512[6], c7 = HAMSI_IV512[7];
sph_u32 c8 = HAMSI_IV512[8], c9 = HAMSI_IV512[9], cA = HAMSI_IV512[10], cB = HAMSI_IV512[11];
sph_u32 cC = HAMSI_IV512[12], cD = HAMSI_IV512[13], cE = HAMSI_IV512[14], cF = HAMSI_IV512[15];
sph_u32 m0, m1, m2, m3, m4, m5, m6, m7;
sph_u32 m8, m9, mA, mB, mC, mD, mE, mF;
sph_u32 h[16] = { c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, cA, cB, cC, cD, cE, cF };
#define buf(u) hash.h1[i + u]
for(int i = 0; i < 64; i += 8) {
INPUT_BIG;
P_BIG;
T_BIG;
}
#undef buf
#define buf(u) (u == 0 ? 0x80 : 0)
INPUT_BIG;
P_BIG;
T_BIG;
#undef buf
#define buf(u) (u == 6 ? 2 : 0)
INPUT_BIG;
PF_BIG;
T_BIG;
for (unsigned u = 0; u < 16; u ++)
hash.h4[u] = h[u];
}
{
// fugue
sph_u32 S00, S01, S02, S03, S04, S05, S06, S07, S08, S09;
sph_u32 S10, S11, S12, S13, S14, S15, S16, S17, S18, S19;
sph_u32 S20, S21, S22, S23, S24, S25, S26, S27, S28, S29;
sph_u32 S30, S31, S32, S33, S34, S35;
ulong fc_bit_count = (sph_u64) 64 << 3;
S00 = S01 = S02 = S03 = S04 = S05 = S06 = S07 = S08 = S09 = S10 = S11 = S12 = S13 = S14 = S15 = S16 = S17 = S18 = S19 = 0;
S20 = SPH_C32(0x8807a57e); S21 = SPH_C32(0xe616af75); S22 = SPH_C32(0xc5d3e4db); S23 = SPH_C32(0xac9ab027);
S24 = SPH_C32(0xd915f117); S25 = SPH_C32(0xb6eecc54); S26 = SPH_C32(0x06e8020b); S27 = SPH_C32(0x4a92efd1);
S28 = SPH_C32(0xaac6e2c9); S29 = SPH_C32(0xddb21398); S30 = SPH_C32(0xcae65838); S31 = SPH_C32(0x437f203f);
S32 = SPH_C32(0x25ea78e7); S33 = SPH_C32(0x951fddd6); S34 = SPH_C32(0xda6ed11d); S35 = SPH_C32(0xe13e3567);
FUGUE512_3((hash.h4[0x0]), (hash.h4[0x1]), (hash.h4[0x2]));
FUGUE512_3((hash.h4[0x3]), (hash.h4[0x4]), (hash.h4[0x5]));
FUGUE512_3((hash.h4[0x6]), (hash.h4[0x7]), (hash.h4[0x8]));
FUGUE512_3((hash.h4[0x9]), (hash.h4[0xA]), (hash.h4[0xB]));
FUGUE512_3((hash.h4[0xC]), (hash.h4[0xD]), (hash.h4[0xE]));
FUGUE512_3((hash.h4[0xF]), as_uint2(fc_bit_count).y, as_uint2(fc_bit_count).x);
// apply round shift if necessary
int i;
for (i = 0; i < 32; i ++) {
ROR3;
CMIX36(S00, S01, S02, S04, S05, S06, S18, S19, S20);
SMIX(S00, S01, S02, S03);
}
for (i = 0; i < 13; i ++) {
S04 ^= S00;
S09 ^= S00;
S18 ^= S00;
S27 ^= S00;
ROR9;
SMIX(S00, S01, S02, S03);
S04 ^= S00;
S10 ^= S00;
S18 ^= S00;
S27 ^= S00;
ROR9;
SMIX(S00, S01, S02, S03);
S04 ^= S00;
S10 ^= S00;
S19 ^= S00;
S27 ^= S00;
ROR9;
SMIX(S00, S01, S02, S03);
S04 ^= S00;
S10 ^= S00;
S19 ^= S00;
S28 ^= S00;
ROR8;
SMIX(S00, S01, S02, S03);
}
S04 ^= S00;
S09 ^= S00;
S18 ^= S00;
S27 ^= S00;
hash.h4[0] = SWAP4(S01);
hash.h4[1] = SWAP4(S02);
hash.h4[2] = SWAP4(S03);
hash.h4[3] = SWAP4(S04);
hash.h4[4] = SWAP4(S09);
hash.h4[5] = SWAP4(S10);
hash.h4[6] = SWAP4(S11);
hash.h4[7] = SWAP4(S12);
hash.h4[8] = SWAP4(S18);
hash.h4[9] = SWAP4(S19);
hash.h4[10] = SWAP4(S20);
hash.h4[11] = SWAP4(S21);
hash.h4[12] = SWAP4(S27);
hash.h4[13] = SWAP4(S28);
hash.h4[14] = SWAP4(S29);
hash.h4[15] = SWAP4(S30);
}
bool result = (hash.h8[3] <= target);
if (result)
output[output[0xFF]++] = SWAP4(gid);
}
#endif // MARUCOIN_CL

238
marucoin.c

@ -0,0 +1,238 @@ @@ -0,0 +1,238 @@
/*-
* Copyright 2009 Colin Percival, 2011 ArtForz
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* This file was originally written by Colin Percival as part of the Tarsnap
* online backup system.
*/
#include "config.h"
#include "miner.h"
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "sph/sph_blake.h"
#include "sph/sph_bmw.h"
#include "sph/sph_groestl.h"
#include "sph/sph_jh.h"
#include "sph/sph_keccak.h"
#include "sph/sph_skein.h"
#include "sph/sph_luffa.h"
#include "sph/sph_cubehash.h"
#include "sph/sph_shavite.h"
#include "sph/sph_simd.h"
#include "sph/sph_echo.h"
#include "sph/sph_hamsi.h"
#include "sph/sph_fugue.h"
/* Move init out of loop, so init once externally, and then use one single memcpy with that bigger memory block */
typedef struct {
sph_blake512_context blake1;
sph_bmw512_context bmw1;
sph_groestl512_context groestl1;
sph_skein512_context skein1;
sph_jh512_context jh1;
sph_keccak512_context keccak1;
sph_luffa512_context luffa1;
sph_cubehash512_context cubehash1;
sph_shavite512_context shavite1;
sph_simd512_context simd1;
sph_echo512_context echo1;
sph_hamsi512_context hamsi1;
sph_fugue512_context fugue1;
} Xhash_context_holder;
Xhash_context_holder base_contexts;
void init_Mhash_contexts()
{
sph_blake512_init(&base_contexts.blake1);
sph_bmw512_init(&base_contexts.bmw1);
sph_groestl512_init(&base_contexts.groestl1);
sph_skein512_init(&base_contexts.skein1);
sph_jh512_init(&base_contexts.jh1);
sph_keccak512_init(&base_contexts.keccak1);
sph_luffa512_init(&base_contexts.luffa1);
sph_cubehash512_init(&base_contexts.cubehash1);
sph_shavite512_init(&base_contexts.shavite1);
sph_simd512_init(&base_contexts.simd1);
sph_echo512_init(&base_contexts.echo1);
sph_hamsi512_init(&base_contexts.hamsi1);
sph_fugue512_init(&base_contexts.fugue1);
}
/*
* Encode a length len/4 vector of (uint32_t) into a length len vector of
* (unsigned char) in big-endian form. Assumes len is a multiple of 4.
*/
static inline void
be32enc_vect(uint32_t *dst, const uint32_t *src, uint32_t len)
{
uint32_t i;
for (i = 0; i < len; i++)
dst[i] = htobe32(src[i]);
}
inline void maruhash(void *state, const void *input)
{
init_Mhash_contexts();
Xhash_context_holder ctx;
uint32_t hashA[16], hashB[16];
//blake-bmw-groestl-sken-jh-meccak-luffa-cubehash-shivite-simd-echo
memcpy(&ctx, &base_contexts, sizeof(base_contexts));
sph_blake512 (&ctx.blake1, input, 80);
sph_blake512_close (&ctx.blake1, hashA);
sph_bmw512 (&ctx.bmw1, hashA, 64);
sph_bmw512_close(&ctx.bmw1, hashB);
sph_groestl512 (&ctx.groestl1, hashB, 64);
sph_groestl512_close(&ctx.groestl1, hashA);
sph_skein512 (&ctx.skein1, hashA, 64);
sph_skein512_close(&ctx.skein1, hashB);
sph_jh512 (&ctx.jh1, hashB, 64);
sph_jh512_close(&ctx.jh1, hashA);
sph_keccak512 (&ctx.keccak1, hashA, 64);
sph_keccak512_close(&ctx.keccak1, hashB);
sph_luffa512 (&ctx.luffa1, hashB, 64);
sph_luffa512_close (&ctx.luffa1, hashA);
sph_cubehash512 (&ctx.cubehash1, hashA, 64);
sph_cubehash512_close(&ctx.cubehash1, hashB);
sph_shavite512 (&ctx.shavite1, hashB, 64);
sph_shavite512_close(&ctx.shavite1, hashA);
sph_simd512 (&ctx.simd1, hashA, 64);
sph_simd512_close(&ctx.simd1, hashB);
sph_echo512 (&ctx.echo1, hashB, 64);
sph_echo512_close(&ctx.echo1, hashA);
sph_hamsi512 (&ctx.hamsi1, hashA, 64);
sph_hamsi512_close(&ctx.hamsi1, hashB);
sph_fugue512 (&ctx.fugue1, hashB, 64);
sph_fugue512_close(&ctx.fugue1, hashA);
memcpy(state, hashA, 32);
}
static const uint32_t diff1targ = 0x0000ffff;
/* Used externally as confirmation of correct OCL code */
int marucoin_test(unsigned char *pdata, const unsigned char *ptarget, uint32_t nonce)
{
uint32_t tmp_hash7, Htarg = le32toh(((const uint32_t *)ptarget)[7]);
uint32_t data[20], ohash[8];
//char *scratchbuf;
be32enc_vect(data, (const uint32_t *)pdata, 19);
data[19] = htobe32(nonce);
//scratchbuf = alloca(SCRATCHBUF_SIZE);
maruhash(ohash, data);
tmp_hash7 = be32toh(ohash[7]);
applog(LOG_DEBUG, "htarget %08lx diff1 %08lx hash %08lx",
(long unsigned int)Htarg,
(long unsigned int)diff1targ,
(long unsigned int)tmp_hash7);
if (tmp_hash7 > diff1targ)
return -1;
if (tmp_hash7 > Htarg)
return 0;
return 1;
}
void marucoin_regenhash(struct work *work)
{
uint32_t data[20];
char *scratchbuf;
uint32_t *nonce = (uint32_t *)(work->data + 76);
uint32_t *ohash = (uint32_t *)(work->hash);
be32enc_vect(data, (const uint32_t *)work->data, 19);
data[19] = htobe32(*nonce);
maruhash(ohash, data);
}
bool scanhash_marucoin(struct thr_info *thr, const unsigned char __maybe_unused *pmidstate,
unsigned char *pdata, unsigned char __maybe_unused *phash1,
unsigned char __maybe_unused *phash, const unsigned char *ptarget,
uint32_t max_nonce, uint32_t *last_nonce, uint32_t n)
{
uint32_t *nonce = (uint32_t *)(pdata + 76);
char *scratchbuf;
uint32_t data[20];
uint32_t tmp_hash7;
uint32_t Htarg = le32toh(((const uint32_t *)ptarget)[7]);
bool ret = false;
be32enc_vect(data, (const uint32_t *)pdata, 19);
while(1) {
uint32_t ostate[8];
*nonce = ++n;
data[19] = (n);
maruhash(ostate, data);
tmp_hash7 = (ostate[7]);
applog(LOG_INFO, "data7 %08lx",
(long unsigned int)data[7]);
if (unlikely(tmp_hash7 <= Htarg)) {
((uint32_t *)pdata)[19] = htobe32(n);
*last_nonce = n;
ret = true;
break;
}
if (unlikely((n >= max_nonce) || thr->work_restart)) {
*last_nonce = n;
break;
}
}
return ret;
}

10
marucoin.h

@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
#ifndef MARUCOIN_H
#define MARUCOIN_H
#include "miner.h"
extern int marucoin_test(unsigned char *pdata, const unsigned char *ptarget,
uint32_t nonce);
extern void marucoin_regenhash(struct work *work);
#endif /* MARUCOIN_H */

1
miner.h

@ -391,6 +391,7 @@ enum cl_kernels { @@ -391,6 +391,7 @@ enum cl_kernels {
KL_FUGUECOIN,
KL_GROESTLCOIN,
KL_TWECOIN,
KL_MARUCOIN,
};
enum dev_reason {

5
ocl.c

@ -504,6 +504,11 @@ _clState *initCl(unsigned int gpu, char *name, size_t nameSize) @@ -504,6 +504,11 @@ _clState *initCl(unsigned int gpu, char *name, size_t nameSize)
strcpy(filename, TWECOIN_KERNNAME".cl");
strcpy(binaryfilename, TWECOIN_KERNNAME);
break;
case KL_MARUCOIN:
applog(LOG_WARNING, "Kernel marucoin is experimental.");
strcpy(filename, MARUCOIN_KERNNAME".cl");
strcpy(binaryfilename, MARUCOIN_KERNNAME);
break;
case KL_NONE: /* Shouldn't happen */
break;
}

6
sgminer.c

@ -4273,6 +4273,9 @@ void write_config(FILE *fcfg) @@ -4273,6 +4273,9 @@ void write_config(FILE *fcfg)
case KL_TWECOIN:
fprintf(fcfg, TWECOIN_KERNNAME);
break;
case KL_MARUCOIN:
fprintf(fcfg, MARUCOIN_KERNNAME);
break;
}
}
@ -6110,6 +6113,9 @@ static void rebuild_nonce(struct work *work, uint32_t nonce) @@ -6110,6 +6113,9 @@ static void rebuild_nonce(struct work *work, uint32_t nonce)
case KL_TWECOIN:
twecoin_regenhash(work);
break;
case KL_MARUCOIN:
marucoin_regenhash(work);
break;
default:
scrypt_regenhash(work);
break;

Loading…
Cancel
Save