Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1251mov y0, a ; y0 = a1252add h, y2 ; h = h + S1 + CH + k + w1253mov y2, a ; y2 = a1254pshufb XTMP4, SHUF_00BA ; XTMP4 = s1 {00BA}1255or y0, c ; y0 = a|c1256add d, h ; d = d + h + S1 + CH + k + w1257and y2, c ; y2 = a&c1258paddd XTMP0, XTMP4 ; XTMP0 = {..., ..., W[1], W[0]}1259and y0, b ; y0 = (a|c)&b1260add h, y1 ; h = h + S1 + CH + k + w + S01261;; compute high s11262pshufd XTMP2, XTMP0, 01010000b ; XTMP2 = W[-2] {DDCC}1263or y0, y2 ; y0 = MAJ = (a|c)&b)|(a&c)1264add h, y0 ; h = h + S1 + CH + k + w + S0 + MAJ1266ROTATE_ARGS1267movdqa XTMP3, XTMP2 ; XTMP3 = W[-2] {DDCC}1268mov y0, e ; y0 = e1269ror y0, (25-11) ; y0 = e >> (25-11)1270mov y1, a ; y1 = a1271movdqa X0, XTMP2 ; X0 = W[-2] {DDCC}1272ror y1, (22-13) ; y1 = a >> (22-13)1273xor y0, e ; y0 = e ^ (e >> (25-11))1274mov y2, f ; y2 = f1275ror y0, (11-6) ; y0 = (e >> (11-6)) ^ (e >> (25-6))1276psrlq XTMP2, 17 ; XTMP2 = W[-2] ror 17 {xDxC}1277xor y1, a ; y1 = a ^ (a >> (22-13)1278xor y2, g ; y2 = f^g1279psrlq XTMP3, 19 ; XTMP3 = W[-2] ror 19 {xDxC}1280xor y0, e ; y0 = e ^ (e >> (11-6)) ^ (e >> (25-6))1281and y2, e ; y2 = (f^g)&e1282ror y1, (13-2) ; y1 = (a >> (13-2)) ^ (a >> (22-2))1283psrld X0, 10 ; X0 = W[-2] >> 10 {DDCC}1284xor y1, a ; y1 = a ^ (a >> (13-2)) ^ (a >> (22-2))1285ror y0, 6 ; y0 = S1 = (e>>6) & (e>>11) ^ (e>>25)1286xor y2, g ; y2 = CH = ((f^g)&e)^g1287pxor XTMP2, XTMP31288ror y1, 2 ; y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22)1289add y2, y0 ; y2 = S1 + CH1290add y2, [rsp + _XFER + 3*4] ; y2 = k + w + S1 + CH1291pxor X0, XTMP2 ; X0 = s1 {xDxC}1292mov y0, a ; y0 = a1293add h, y2 ; h = h + S1 + CH + k + w1294mov y2, a ; y2 = a1295pshufb X0, SHUF_DC00 ; X0 = s1 {DC00}1296or y0, c ; y0 = a|c1297add d, h ; d = d + h + S1 + CH + k + w1298and y2, c ; y2 = a&c1299paddd X0, XTMP0 ; X0 = {W[3], W[2], W[1], W[0]}1300and y0, b ; y0 = (a|c)&b1301add h, y1 ; h = h + S1 + CH + k + w + S01302or y0, y2 ; y0 = MAJ = (a|c)&b)|(a&c)1303add h, y0 ; h = h + S1 + CH + k + w + S0 + MAJ1305ROTATE_ARGS1306rotate_Xs1307%endm1309;; input is [rsp + _XFER + %1 * 4]1310%macro DO_ROUND 11311mov y0, e ; y0 = e1312ror y0, (25-11) ; y0 = e >> (25-11)1313mov y1, a ; y1 = a1314xor y0, e ; y0 = e ^ (e >> (25-11))1315ror y1, (22-13) ; y1 = a >> (22-13)1316mov y2, f ; y2 = f1317xor y1, a ; y1 = a ^ (a >> (22-13)1318ror y0, (11-6) ; y0 = (e >> (11-6)) ^ (e >> (25-6))1319xor y2, g ; y2 = f^g1320xor y0, e ; y0 = e ^ (e >> (11-6)) ^ (e >> (25-6))1321ror y1, (13-2) ; y1 = (a >> (13-2)) ^ (a >> (22-2))1322and y2, e ; y2 = (f^g)&e1323xor y1, a ; y1 = a ^ (a >> (13-2)) ^ (a >> (22-2))1324ror y0, 6 ; y0 = S1 = (e>>6) & (e>>11) ^ (e>>25)1325xor y2, g ; y2 = CH = ((f^g)&e)^g1326add y2, y0 ; y2 = S1 + CH1327ror y1, 2 ; y1 = S0 = (a>>2) ^ (a>>13) ^ (a>>22)1328add y2, [rsp + _XFER + %1 * 4] ; y2 = k + w + S1 + CH1329mov y0, a ; y0 = a1330add h, y2 ; h = h + S1 + CH + k + w1331mov y2, a ; y2 = a1332or y0, c ; y0 = a|c1333add d, h ; d = d + h + S1 + CH + k + w1334and y2, c ; y2 = a&c1335and y0, b ; y0 = (a|c)&b1336add h, y1 ; h = h + S1 + CH + k + w + S01337or y0, y2 ; y0 = MAJ = (a|c)&b)|(a&c)1338add h, y0 ; h = h + S1 + CH + k + w + S0 + MAJ1339ROTATE_ARGS1340%endm1342;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1344;; void sha256_sse4(void *input_data, UINT32 digest[8], UINT64 num_blks)1345;; arg 1 : pointer to input data1346;; arg 2 : pointer to digest1347;; arg 3 : Num blocks1348section .text1349global sha256_sse41350align 321351sha256_sse4:1352push rbx1353%ifndef LINUX1354push rsi1355push rdi1356%endif1357push rbp1358push r131359push r141360push r151362sub rsp,STACK_SIZE1363%ifndef LINUX1364movdqa [rsp + _XMM_SAVE + 0*16],xmm61365movdqa [rsp + _XMM_SAVE + 1*16],xmm71366movdqa [rsp + _XMM_SAVE + 2*16],xmm81367movdqa [rsp + _XMM_SAVE + 3*16],xmm91368movdqa [rsp + _XMM_SAVE + 4*16],xmm101369movdqa [rsp + _XMM_SAVE + 5*16],xmm111370movdqa [rsp + _XMM_SAVE + 6*16],xmm121371%endif1373shl NUM_BLKS, 6 ; convert to bytes1374jz done_hash1375add NUM_BLKS, INP ; pointer to end of data1376mov [rsp + _INP_END], NUM_BLKS1378;; load initial digest1379mov a,[4*0 + CTX]1380mov b,[4*1 + CTX]1381mov c,[4*2 + CTX]1382mov d,[4*3 + CTX]1383mov e,[4*4 + CTX]1384mov f,[4*5 + CTX]1385mov g,[4*6 + CTX]1386mov h,[4*7 + CTX]1388movdqa BYTE_FLIP_MASK, [PSHUFFLE_BYTE_FLIP_MASK wrt rip]1389movdqa SHUF_00BA, [_SHUF_00BA wrt rip]1390movdqa SHUF_DC00, [_SHUF_DC00 wrt rip]1392loop0:1393lea TBL,[K256 wrt rip]1395;; byte swap first 16 dwords1396COPY_XMM_AND_BSWAP X0, [INP + 0*16], BYTE_FLIP_MASK1397COPY_XMM_AND_BSWAP X1, [INP + 1*16], BYTE_FLIP_MASK1398COPY_XMM_AND_BSWAP X2, [INP + 2*16], BYTE_FLIP_MASK1399COPY_XMM_AND_BSWAP X3, [INP + 3*16], BYTE_FLIP_MASK1401mov [rsp + _INP], INP1403;; schedule 48 input dwords, by doing 3 rounds of 16 each1404mov SRND, 31405align 161406loop1:1407movdqa XFER, [TBL + 0*16]1408paddd XFER, X01409movdqa [rsp + _XFER], XFER1410FOUR_ROUNDS_AND_SCHED1412movdqa XFER, [TBL + 1*16]1413paddd XFER, X01414movdqa [rsp + _XFER], XFER1415FOUR_ROUNDS_AND_SCHED1417movdqa XFER, [TBL + 2*16]1418paddd XFER, X01419movdqa [rsp + _XFER], XFER1420FOUR_ROUNDS_AND_SCHED1422movdqa XFER, [TBL + 3*16]1423paddd XFER, X01424movdqa [rsp + _XFER], XFER1425add TBL, 4*161426FOUR_ROUNDS_AND_SCHED1428sub SRND, 11429jne loop11431mov SRND, 21432loop2:1433paddd X0, [TBL + 0*16]1434movdqa [rsp + _XFER], X01435DO_ROUND 01436DO_ROUND 11437DO_ROUND 21438DO_ROUND 31439paddd X1, [TBL + 1*16]1440movdqa [rsp + _XFER], X11441add TBL, 2*161442DO_ROUND 01443DO_ROUND 11444DO_ROUND 21445DO_ROUND 31447movdqa X0, X21448movdqa X1, X31450sub SRND, 11451jne loop21453addm [4*0 + CTX],a1454addm [4*1 + CTX],b1455addm [4*2 + CTX],c1456addm [4*3 + CTX],d1457addm [4*4 + CTX],e1458addm [4*5 + CTX],f1459addm [4*6 + CTX],g1460addm [4*7 + CTX],h1462mov INP, [rsp + _INP]1463add INP, 641464cmp INP, [rsp + _INP_END]1465jne loop01467done_hash:1468%ifndef LINUX1469movdqa xmm6,[rsp + _XMM_SAVE + 0*16]1470movdqa xmm7,[rsp + _XMM_SAVE + 1*16]1471movdqa xmm8,[rsp + _XMM_SAVE + 2*16]1472movdqa xmm9,[rsp + _XMM_SAVE + 3*16]1473movdqa xmm10,[rsp + _XMM_SAVE + 4*16]1474movdqa xmm11,[rsp + _XMM_SAVE + 5*16]1475movdqa xmm12,[rsp + _XMM_SAVE + 6*16]1476%endif1478add rsp, STACK_SIZE1480pop r151481pop r141482pop r131483pop rbp1484%ifndef LINUX1485pop rdi1486pop rsi1487%endif1488pop rbx1490ret1493section .data1494align 641495K256:1496dd 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba51497dd 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed51498dd 0xd807aa98,0x12835b01,0x243185be,0x550c7dc31499dd 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf1741500dd 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.