From 284542dc3d8225ce2416660403bdd3c061467dc5 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Mon, 13 Jan 2025 07:49:25 -0800 Subject: [PATCH] Replace pow now that it is published separately on npm. --- package-lock.json | 25 +- package.json | 8 +- src/lib/block.ts | 4 +- src/lib/nano-pow/classes/gl.ts | 199 - src/lib/nano-pow/classes/gpu.ts | 202 - src/lib/nano-pow/classes/index.ts | 7 - src/lib/nano-pow/index.ts | 18 - src/lib/nano-pow/shaders/gl-fragment.ts | 203 - src/lib/nano-pow/shaders/gl-vertex.ts | 13 - src/lib/nano-pow/shaders/gpu-compute.ts | 7667 ----------------------- src/lib/nano-pow/shaders/index.ts | 9 - src/lib/workers/index.ts | 4 +- src/lib/workers/nano-pow.ts | 10 +- src/main.ts | 3 +- test/perf.block.js | 34 +- 15 files changed, 37 insertions(+), 8369 deletions(-) delete mode 100644 src/lib/nano-pow/classes/gl.ts delete mode 100644 src/lib/nano-pow/classes/gpu.ts delete mode 100644 src/lib/nano-pow/classes/index.ts delete mode 100644 src/lib/nano-pow/index.ts delete mode 100644 src/lib/nano-pow/shaders/gl-fragment.ts delete mode 100644 src/lib/nano-pow/shaders/gl-vertex.ts delete mode 100644 src/lib/nano-pow/shaders/gpu-compute.ts delete mode 100644 src/lib/nano-pow/shaders/index.ts diff --git a/package-lock.json b/package-lock.json index 7ce0489..bab5394 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.21", "license": "(GPL-3.0-or-later AND MIT)", "dependencies": { - "nano-pow": "^1.2.2" + "nano-pow": "^1.2.3" }, "devDependencies": { "@types/node": "^22.10.1", @@ -31,6 +31,23 @@ "@ledgerhq/hw-transport-webusb": "^6.29.4" } }, + "../nano-pow": { + "version": "1.2.3", + "extraneous": true, + "license": "(GPL-3.0-or-later AND MIT)", + "devDependencies": { + "@types/node": "^22.10.5", + "@webgpu/types": "^0.1.52", + "esbuild": "^0.24.2", + "esbuild-plugin-glsl": "^1.2.2", + "nano-webgl-pow": "^1.1.1", + "typescript": "^5.7.3" + }, + "funding": { + "type": "nano", + "url": "nano:nano_1zosoqs47yt47bnfg7sdf46kj7asn58b7uzm9ek95jw7ccatq37898u1zoso" + } + }, "node_modules/@esbuild/linux-x64": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", @@ -217,9 +234,9 @@ } }, "node_modules/nano-pow": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/nano-pow/-/nano-pow-1.2.2.tgz", - "integrity": "sha512-hOHzDTN9Vanl5GZZDA+bU+a8Iz8SdU1vWAgUL7sQq3TzLK8f+hsg2N65aXchCuBYWzmadEdQlZkox4nwx/U+cQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/nano-pow/-/nano-pow-1.2.3.tgz", + "integrity": "sha512-wy6AkUIXYdX8KYB2tErQn97dfN4L7/qqsPJCQ63BZ5UnuqSEiy0HyPaFnS3aYUOtL1rtcmsoTXk6mNU+QRMnJQ==", "license": "(GPL-3.0-or-later AND MIT)", "funding": { "type": "nano", diff --git a/package.json b/package.json index 69db714..6c24809 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,9 @@ "#workers": "./src/lib/workers/index.js", "#workers/*": "./src/lib/workers/*" }, + "dependencies": { + "nano-pow": "^1.2.3" + }, "optionalDependencies": { "@ledgerhq/hw-transport-web-ble": "^6.29.4", "@ledgerhq/hw-transport-webhid": "^6.29.4", @@ -76,8 +79,5 @@ "type": "module", "exports": "./dist/main.js", "types": "dist/main.d.ts", - "unpkg": "dist/main.min.js", - "dependencies": { - "nano-pow": "^1.2.2" - } + "unpkg": "dist/main.min.js" } diff --git a/src/lib/block.ts b/src/lib/block.ts index d32c5e1..5de8977 100644 --- a/src/lib/block.ts +++ b/src/lib/block.ts @@ -8,7 +8,7 @@ import { dec, hex } from './convert.js' import { NanoNaCl } from '#workers/nano-nacl.js' import { Pool } from './pool.js' import { Rpc } from './rpc.js' -import { NanoPow } from '#workers' +import { NanoPowWorker } from '#workers' /** * Represents a block as defined by the Nano cryptocurrency protocol. The Block @@ -16,7 +16,7 @@ import { NanoPow } from '#workers' * of three derived classes: SendBlock, ReceiveBlock, ChangeBlock. */ abstract class Block { - static #pool: Pool = new Pool(NanoPow) + static #pool: Pool = new Pool(NanoPowWorker) account: Account type: string = 'state' abstract subtype: 'send' | 'receive' | 'change' diff --git a/src/lib/nano-pow/classes/gl.ts b/src/lib/nano-pow/classes/gl.ts deleted file mode 100644 index e2bca1b..0000000 --- a/src/lib/nano-pow/classes/gl.ts +++ /dev/null @@ -1,199 +0,0 @@ -// SPDX-FileCopyrightText: 2024 Chris Duncan -// SPDX-License-Identifier: GPL-3.0-or-later -// Based on nano-webgl-pow by Ben Green (numtel) -// https://github.com/numtel/nano-webgl-pow -import { NanoPowGlFragmentShader, NanoPowGlVertexShader } from '../shaders/index.js' - -export class NanoPowGl { - /** Used to set canvas size. Must be a multiple of 256. */ - static #WORKLOAD: number = 256 * Math.max(1, Math.floor(navigator.hardwareConcurrency)) - - static #hexify (arr: number[] | Uint8Array): string { - let out = '' - for (let i = arr.length - 1; i >= 0; i--) { - out += arr[i].toString(16).padStart(2, '0') - } - return out - } - - static #gl: WebGL2RenderingContext | null - static #program: WebGLProgram | null - static #vertexShader: WebGLShader | null - static #fragmentShader: WebGLShader | null - static #positionBuffer: WebGLBuffer | null - static #uvBuffer: WebGLBuffer | null - static #uboBuffer: WebGLBuffer | null - static #workBuffer: WebGLBuffer | null - static #query: WebGLQuery | null - static #pixels: Uint8Array - /**Vertex Positions, 2 triangles */ - static #positions = new Float32Array([ - -1, -1, 0, -1, 1, 0, 1, 1, 0, - 1, -1, 0, 1, 1, 0, -1, -1, 0 - ]) - /** Texture Positions */ - static #uvPosArray = new Float32Array([ - 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1 - ]) - - /** Compile */ - static { - this.#gl = new OffscreenCanvas(this.#WORKLOAD, this.#WORKLOAD).getContext('webgl2') - if (this.#gl == null) throw new Error('WebGL 2 is required') - this.#gl.clearColor(0, 0, 0, 1) - - this.#program = this.#gl.createProgram() - if (this.#program == null) throw new Error('Failed to create shader program') - - this.#vertexShader = this.#gl.createShader(this.#gl.VERTEX_SHADER) - if (this.#vertexShader == null) throw new Error('Failed to create vertex shader') - this.#gl.shaderSource(this.#vertexShader, NanoPowGlVertexShader) - this.#gl.compileShader(this.#vertexShader) - if (!this.#gl.getShaderParameter(this.#vertexShader, this.#gl.COMPILE_STATUS)) - throw new Error(this.#gl.getShaderInfoLog(this.#vertexShader) ?? `Failed to compile vertex shader`) - - this.#fragmentShader = this.#gl.createShader(this.#gl.FRAGMENT_SHADER) - if (this.#fragmentShader == null) throw new Error('Failed to create fragment shader') - this.#gl.shaderSource(this.#fragmentShader, NanoPowGlFragmentShader) - this.#gl.compileShader(this.#fragmentShader) - if (!this.#gl.getShaderParameter(this.#fragmentShader, this.#gl.COMPILE_STATUS)) - throw new Error(this.#gl.getShaderInfoLog(this.#fragmentShader) ?? `Failed to compile fragment shader`) - - this.#gl.attachShader(this.#program, this.#vertexShader) - this.#gl.attachShader(this.#program, this.#fragmentShader) - this.#gl.linkProgram(this.#program) - if (!this.#gl.getProgramParameter(this.#program, this.#gl.LINK_STATUS)) - throw new Error(this.#gl.getProgramInfoLog(this.#program) ?? `Failed to link program`) - - /** Construct simple 2D geometry */ - this.#gl.useProgram(this.#program) - const triangleArray = this.#gl.createVertexArray() - this.#gl.bindVertexArray(triangleArray) - - this.#positionBuffer = this.#gl.createBuffer() - this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, this.#positionBuffer) - this.#gl.bufferData(this.#gl.ARRAY_BUFFER, this.#positions, this.#gl.STATIC_DRAW) - this.#gl.vertexAttribPointer(0, 3, this.#gl.FLOAT, false, 0, 0) - this.#gl.enableVertexAttribArray(0) - - this.#uvBuffer = this.#gl.createBuffer() - this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, this.#uvBuffer) - this.#gl.bufferData(this.#gl.ARRAY_BUFFER, this.#uvPosArray, this.#gl.STATIC_DRAW) - this.#gl.vertexAttribPointer(1, 2, this.#gl.FLOAT, false, 0, 0) - this.#gl.enableVertexAttribArray(1) - - this.#uboBuffer = this.#gl.createBuffer() - this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#uboBuffer) - this.#gl.bufferData(this.#gl.UNIFORM_BUFFER, 144, this.#gl.DYNAMIC_DRAW) - this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null) - this.#gl.bindBufferBase(this.#gl.UNIFORM_BUFFER, 0, this.#uboBuffer) - this.#gl.uniformBlockBinding(this.#program, this.#gl.getUniformBlockIndex(this.#program, 'UBO'), 0) - - this.#workBuffer = this.#gl.createBuffer() - this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#workBuffer) - this.#gl.bufferData(this.#gl.UNIFORM_BUFFER, 32, this.#gl.STREAM_DRAW) - this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null) - this.#gl.bindBufferBase(this.#gl.UNIFORM_BUFFER, 1, this.#workBuffer) - this.#gl.uniformBlockBinding(this.#program, this.#gl.getUniformBlockIndex(this.#program, 'WORK'), 1) - - this.#pixels = new Uint8Array(this.#gl.drawingBufferWidth * this.#gl.drawingBufferHeight * 4) - this.#query = this.#gl.createQuery() - } - - /** - * Finds a nonce that satisfies the Nano proof-of-work requirements. - * - * @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts - * @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation - */ - static async search (hash: string, threshold: number = 0xfffffff8): Promise { - if (NanoPowGl.#gl == null) throw new Error('WebGL 2 is required') - if (!/^[A-F-a-f0-9]{64}$/.test(hash)) throw new Error(`invalid_hash ${hash}`) - if (typeof threshold !== 'number') throw new TypeError(`Invalid threshold ${threshold}`) - if (this.#gl == null) throw new Error('WebGL 2 is required') - - /** Set up uniform buffer object */ - const uboView = new DataView(new ArrayBuffer(144)) - for (let i = 0; i < 64; i += 8) { - const uint32 = hash.slice(i, i + 8) - uboView.setUint32(i * 2, parseInt(uint32, 16)) - } - uboView.setUint32(128, threshold, true) - uboView.setFloat32(132, NanoPowGl.#WORKLOAD - 1, true) - NanoPowGl.#gl.bindBuffer(NanoPowGl.#gl.UNIFORM_BUFFER, NanoPowGl.#uboBuffer) - NanoPowGl.#gl.bufferSubData(NanoPowGl.#gl.UNIFORM_BUFFER, 0, uboView) - NanoPowGl.#gl.bindBuffer(NanoPowGl.#gl.UNIFORM_BUFFER, null) - - /** Start drawing to calculate one nonce per pixel */ - let nonce = null - const work = new Uint8Array(8) - while (nonce == null) { - this.draw(work) - const found = await this.checkQueryResult() - if (found) { - nonce = this.readResult(work) - } - } - return nonce - } - - static draw (work: Uint8Array): void { - if (this.#gl == null || this.#query == null) throw new Error('WebGL 2 is required to draw and query pixels') - if (this.#workBuffer == null) throw new Error('Work buffer is required to draw') - this.#gl.clear(this.#gl.COLOR_BUFFER_BIT) - - /** Upload work buffer */ - crypto.getRandomValues(work) - this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#workBuffer) - this.#gl.bufferSubData(this.#gl.UNIFORM_BUFFER, 0, Uint32Array.from(work)) - this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null) - - this.#gl.beginQuery(this.#gl.ANY_SAMPLES_PASSED_CONSERVATIVE, this.#query) - this.#gl.drawArrays(this.#gl.TRIANGLES, 0, 6) - this.#gl.endQuery(this.#gl.ANY_SAMPLES_PASSED_CONSERVATIVE) - } - - static async checkQueryResult (): Promise { - if (this.#gl == null || this.#query == null) throw new Error('WebGL 2 is required to check query results') - if (this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT_AVAILABLE)) { - return this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT) - } - /** Query result not yet available, check again in the next frame */ - return new Promise((resolve, reject): void => { - try { - requestAnimationFrame(async (): Promise => { - const result = await NanoPowGl.checkQueryResult() - resolve(result) - }) - } catch (err) { - reject(err) - } - }) - } - - /** - * Reads pixels into the work buffer, checks every 4th pixel for the 'found' - * byte, converts the subsequent 3 pixels with the nonce byte values to a hex - * string, and returns the result. - * - * @param work - Buffer with the original random nonce value - * @returns Nonce as an 8-byte (16-char) hexadecimal string - */ - static readResult (work: Uint8Array): string { - if (this.#gl == null) throw new Error('WebGL 2 is required to read pixels') - this.#gl.readPixels(0, 0, this.#gl.drawingBufferWidth, this.#gl.drawingBufferHeight, this.#gl.RGBA, this.#gl.UNSIGNED_BYTE, this.#pixels) - for (let i = 0; i < this.#pixels.length; i += 4) { - if (this.#pixels[i] !== 0) { - /** Return the work value with the custom bits */ - const hex = this.#hexify(work.subarray(4, 8)) + this.#hexify([ - this.#pixels[i + 2], - this.#pixels[i + 3], - work[2] ^ (this.#pixels[i] - 1), - work[3] ^ (this.#pixels[i + 1] - 1) - ]) - return hex - } - } - throw new Error('Query reported result but nonce value not found') - } -} diff --git a/src/lib/nano-pow/classes/gpu.ts b/src/lib/nano-pow/classes/gpu.ts deleted file mode 100644 index a09a11c..0000000 --- a/src/lib/nano-pow/classes/gpu.ts +++ /dev/null @@ -1,202 +0,0 @@ -// SPDX-FileCopyrightText: 2024 Chris Duncan -// SPDX-License-Identifier: GPL-3.0-or-later -// BLAKE2b hashing implementation derived from nano-webgl-pow by Ben Green (https://github.com/numtel/nano-webgl-pow) -/// -import { NanoPowGpuComputeShader } from '../shaders/index.js' - -/** -* Nano proof-of-work using WebGPU. -*/ -export class NanoPowGpu { - - // Initialize WebGPU - static #busy: boolean = false - static #device: GPUDevice | null = null - static #uboBuffer: GPUBuffer - static #gpuBuffer: GPUBuffer - static #cpuBuffer: GPUBuffer - static #bindGroupLayout: GPUBindGroupLayout - static #pipeline: GPUComputePipeline - - static { - this.init() - } - - // Initialize WebGPU - static async init (): Promise { - if (this.#busy) return - this.#busy = true - // Request device and adapter - if (navigator.gpu == null) { - throw new Error('WebGPU is not supported in this browser.') - } - try { - const adapter = await navigator.gpu.requestAdapter() - if (adapter == null) { - throw new Error('WebGPU adapter refused by browser.') - } - const device = await adapter.requestDevice() - if (!(device instanceof GPUDevice)) { - throw new Error('WebGPU device failed to load.') - } - device.lost.then(this.reset) - this.#device = device - this.setup() - } catch (err) { - throw new Error(`WebGPU initialization failed. ${err}`) - } finally { - this.#busy = false - } - } - - static setup (): void { - if (this.#device == null) throw new Error(`WebGPU device failed to load.`) - // Create buffers for writing GPU calculations and reading from Javascript - this.#uboBuffer = this.#device.createBuffer({ - size: 48, - usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST - }) - this.#gpuBuffer = this.#device.createBuffer({ - size: 16, - usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC - }) - this.#cpuBuffer = this.#device.createBuffer({ - size: 16, - usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ - }) - // Create binding group data structure and use it later once UBO is known - this.#bindGroupLayout = this.#device.createBindGroupLayout({ - entries: [ - { - binding: 0, - visibility: GPUShaderStage.COMPUTE, - buffer: { type: 'uniform' }, - }, - { - binding: 1, - visibility: GPUShaderStage.COMPUTE, - buffer: { type: 'storage' }, - } - ] - }) - // Create pipeline to connect compute shader to binding layout - this.#pipeline = this.#device.createComputePipeline({ - layout: this.#device.createPipelineLayout({ - bindGroupLayouts: [this.#bindGroupLayout] - }), - compute: { - entryPoint: 'main', - module: this.#device.createShaderModule({ - code: NanoPowGpuComputeShader - }) - } - }) - } - - static reset (): void { - console.warn(`GPU device lost. Reinitializing...`) - NanoPowGpu.#cpuBuffer?.destroy() - NanoPowGpu.#gpuBuffer?.destroy() - NanoPowGpu.#uboBuffer?.destroy() - NanoPowGpu.#busy = false - NanoPowGpu.init() - } - - /** - * Finds a nonce that satisfies the Nano proof-of-work requirements. - * - * @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts - * @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation - */ - static async search (hash: string, threshold: number = 0xfffffff8): Promise { - if (this.#busy) { - return new Promise(resolve => { - setTimeout(async () => { - const result = this.search(hash, threshold) - resolve(result) - }, 100) - }) - } - this.#busy = true - if (!/^[A-Fa-f0-9]{64}$/.test(hash)) throw new TypeError(`Invalid hash ${hash}`) - if (typeof threshold !== 'number') throw new TypeError(`Invalid threshold ${threshold}`) - - // Ensure WebGPU is initialized before calculating - let loads = 0 - while (this.#device == null && loads < 20) { - await new Promise(resolve => { - setTimeout(resolve, 500) - }) - } - if (this.#device == null) throw new Error(`WebGPU device failed to load.`) - - let nonce = 0n - do { - // Set up uniform buffer object - // Note: u32 size is 4, but total alignment must be multiple of 16 - const uboView = new DataView(new ArrayBuffer(48)) - for (let i = 0; i < 64; i += 8) { - const uint32 = hash.slice(i, i + 8) - uboView.setUint32(i / 2, parseInt(uint32, 16)) - } - const random = Math.floor((Math.random() * 0xffffffff)) - uboView.setUint32(32, random, true) - uboView.setUint32(36, threshold, true) - this.#device.queue.writeBuffer(this.#uboBuffer, 0, uboView) - - // Reset `found` flag to 0u in WORK before each calculation - this.#device.queue.writeBuffer(this.#gpuBuffer, 8, new Uint32Array([0])) - - // Bind UBO read and GPU write buffers - const bindGroup = this.#device.createBindGroup({ - layout: this.#bindGroupLayout, - entries: [ - { - binding: 0, - resource: { - buffer: this.#uboBuffer - }, - }, - { - binding: 1, - resource: { - buffer: this.#gpuBuffer - }, - }, - ], - }) - - // Create command encoder to issue commands to GPU and initiate computation - const commandEncoder = this.#device.createCommandEncoder() - const passEncoder = commandEncoder.beginComputePass() - - // Issue commands and end compute pass structure - passEncoder.setPipeline(this.#pipeline) - passEncoder.setBindGroup(0, bindGroup) - passEncoder.dispatchWorkgroups(0xff, 0xff) - passEncoder.end() - - // Copy 8-byte nonce and 4-byte found flag from GPU to CPU for reading - commandEncoder.copyBufferToBuffer(this.#gpuBuffer, 0, this.#cpuBuffer, 0, 12) - - // End computation by passing array of command buffers to command queue for execution - this.#device.queue.submit([commandEncoder.finish()]) - - // Read results back to Javascript and then unmap buffer after reading - let data = null - try { - await this.#cpuBuffer.mapAsync(GPUMapMode.READ) - await this.#device.queue.onSubmittedWorkDone() - data = new DataView(this.#cpuBuffer.getMappedRange().slice(0)) - this.#cpuBuffer.unmap() - } catch (err) { - console.warn(`Error getting data from GPU. ${err}`) - return this.search(hash, threshold) - } - if (data == null) throw new Error(`Failed to get data from buffer.`) - nonce = data.getBigUint64(0, true) - this.#busy = !data.getUint32(8) - } while (this.#busy) - return nonce.toString(16).padStart(16, '0') - } -} diff --git a/src/lib/nano-pow/classes/index.ts b/src/lib/nano-pow/classes/index.ts deleted file mode 100644 index b7298fa..0000000 --- a/src/lib/nano-pow/classes/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { NanoPowGl } from "./gl" -import { NanoPowGpu } from "./gpu" - -export { - NanoPowGl, - NanoPowGpu -} diff --git a/src/lib/nano-pow/index.ts b/src/lib/nano-pow/index.ts deleted file mode 100644 index 3e00b77..0000000 --- a/src/lib/nano-pow/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { - NanoPowGpuComputeShader, - NanoPowGlFragmentShader, - NanoPowGlVertexShader -} from "./shaders" - -import { - NanoPowGl, - NanoPowGpu -} from "./classes/" - -export { - NanoPowGpuComputeShader, - NanoPowGlFragmentShader, - NanoPowGlVertexShader, - NanoPowGl, - NanoPowGpu -} diff --git a/src/lib/nano-pow/shaders/gl-fragment.ts b/src/lib/nano-pow/shaders/gl-fragment.ts deleted file mode 100644 index 2179e16..0000000 --- a/src/lib/nano-pow/shaders/gl-fragment.ts +++ /dev/null @@ -1,203 +0,0 @@ -export const NanoPowGlFragmentShader = `#version 300 es -#pragma vscode_glsllint_stage: frag -precision highp float; -precision highp int; - -in vec2 uv_pos; -out vec4 fragColor; - -// blockhash - array of precalculated block hash components -// threshold - 0xfffffff8 for send/change blocks, 0xfffffe00 for all else -// workload - Defines canvas size -layout(std140) uniform UBO { - uint blockhash[8]; - uint threshold; - float workload; -}; - -// Random work values -// First 2 bytes will be overwritten by texture pixel position -// Second 2 bytes will be modified if the canvas size is greater than 256x256 -// Last 4 bytes remain as generated externally -layout(std140) uniform WORK { - uvec4 work[2]; -}; - -// Defined separately from uint v[32] below as the original value is required -// to calculate the second uint32 of the digest for threshold comparison -const uint BLAKE2B_IV32_1 = 0x6A09E667u; - -// Both buffers represent 16 uint64s as 32 uint32s -// because that's what GLSL offers, just like Javascript - -// Compression buffer, intialized to 2 instances of the initialization vector -// The following values have been modified from the BLAKE2B_IV: -// OUTLEN is constant 8 bytes -// v[0] ^= 0x01010000u ^ uint(OUTLEN); -// INLEN is constant 40 bytes: work value (8) + block hash (32) -// v[24] ^= uint(INLEN); -// It's always the "last" compression at this INLEN -// v[28] = ~v[28]; -// v[29] = ~v[29]; -uint v[32] = uint[32]( - 0xF2BDC900u, 0x6A09E667u, 0x84CAA73Bu, 0xBB67AE85u, - 0xFE94F82Bu, 0x3C6EF372u, 0x5F1D36F1u, 0xA54FF53Au, - 0xADE682D1u, 0x510E527Fu, 0x2B3E6C1Fu, 0x9B05688Cu, - 0xFB41BD6Bu, 0x1F83D9ABu, 0x137E2179u, 0x5BE0CD19u, - 0xF3BCC908u, 0x6A09E667u, 0x84CAA73Bu, 0xBB67AE85u, - 0xFE94F82Bu, 0x3C6EF372u, 0x5F1D36F1u, 0xA54FF53Au, - 0xADE682F9u, 0x510E527Fu, 0x2B3E6C1Fu, 0x9B05688Cu, - 0x04BE4294u, 0xE07C2654u, 0x137E2179u, 0x5BE0CD19u -); -// Input data buffer -uint m[32]; - -// These are offsets into the input data buffer for each mixing step. -// They are multiplied by 2 from the original SIGMA values in -// the C reference implementation, which refered to uint64s. -const uint SIGMA82[192] = uint[192]( - 0u,2u,4u,6u,8u,10u,12u,14u,16u,18u,20u,22u,24u,26u,28u,30u, - 28u,20u,8u,16u,18u,30u,26u,12u,2u,24u,0u,4u,22u,14u,10u,6u, - 22u,16u,24u,0u,10u,4u,30u,26u,20u,28u,6u,12u,14u,2u,18u,8u, - 14u,18u,6u,2u,26u,24u,22u,28u,4u,12u,10u,20u,8u,0u,30u,16u, - 18u,0u,10u,14u,4u,8u,20u,30u,28u,2u,22u,24u,12u,16u,6u,26u, - 4u,24u,12u,20u,0u,22u,16u,6u,8u,26u,14u,10u,30u,28u,2u,18u, - 24u,10u,2u,30u,28u,26u,8u,20u,0u,14u,12u,6u,18u,4u,16u,22u, - 26u,22u,14u,28u,24u,2u,6u,18u,10u,0u,30u,8u,16u,12u,4u,20u, - 12u,30u,28u,18u,22u,6u,0u,16u,24u,4u,26u,14u,2u,8u,20u,10u, - 20u,4u,16u,8u,14u,12u,2u,10u,30u,22u,18u,28u,6u,24u,26u,0u, - 0u,2u,4u,6u,8u,10u,12u,14u,16u,18u,20u,22u,24u,26u,28u,30u, - 28u,20u,8u,16u,18u,30u,26u,12u,2u,24u,0u,4u,22u,14u,10u,6u -); - -// G mixing function -void G (uint ix, uint iy, uint a, uint b, uint c, uint d) { - bool carry; - uint o0; - uint o1; - uint xor0; - uint xor1; - - // a = a + b; - o0 = v[a] + v[b]; - o1 = v[a+1u] + v[b+1u]; - carry = o0 < v[a]; - o1 = o1 + uint(mix(0.0, 1.0, float(carry))); - v[a] = o0; - v[a+1u] = o1; - - // a = a + m[sigma[r][2*i+0]]; - o0 = v[a] + m[ix]; - o1 = v[a+1u] + m[ix+1u]; - carry = o0 < v[a]; - o1 = o1 + uint(mix(0.0, 1.0, float(carry))); - v[a] = o0; - v[a+1u] = o1; - - // d = rotr64(d ^ a, 32); - xor0 = v[d] ^ v[a]; - xor1 = v[d+1u] ^ v[a+1u]; - v[d] = xor1; - v[d+1u] = xor0; - - // c = c + d; - o0 = v[c] + v[d]; - o1 = v[c+1u] + v[d+1u]; - carry = o0 < v[c]; - o1 = o1 + uint(mix(0.0, 1.0, float(carry))); - v[c] = o0; - v[c+1u] = o1; - - // b = rotr64(b ^ c, 24); - xor0 = v[b] ^ v[c]; - xor1 = v[b+1u] ^ v[c+1u]; - v[b] = (xor0 >> 24u) ^ (xor1 << 8u); - v[b+1u] = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b; - o0 = v[a] + v[b]; - o1 = v[a+1u] + v[b+1u]; - carry = o0 < v[a]; - o1 = o1 + uint(mix(0.0, 1.0, float(carry))); - v[a] = o0; - v[a+1u] = o1; - - // a = a + m[sigma[r][2*i+1]]; - o0 = v[a] + m[iy]; - o1 = v[a+1u] + m[iy+1u]; - carry = o0 < v[a]; - o1 = o1 + uint(mix(0.0, 1.0, float(carry))); - v[a] = o0; - v[a+1u] = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v[d] ^ v[a]; - xor1 = v[d+1u] ^ v[a+1u]; - v[d] = (xor0 >> 16u) ^ (xor1 << 16u); - v[d+1u] = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d; - o0 = v[c] + v[d]; - o1 = v[c+1u] + v[d+1u]; - carry = o0 < v[c]; - o1 = o1 + uint(mix(0.0, 1.0, float(carry))); - v[c] = o0; - v[c+1u] = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v[b] ^ v[c]; - xor1 = v[b+1u] ^ v[c+1u]; - v[b] = (xor1 >> 31u) ^ (xor0 << 1u); - v[b+1u] = (xor0 >> 31u) ^ (xor1 << 1u); -} - -void main() { - int i; - uvec4 u_work0 = work[0u]; - uvec4 u_work1 = work[1u]; - uint uv_x = uint(uv_pos.x * workload); - uint uv_y = uint(uv_pos.y * workload); - uint x_pos = uv_x % 256u; - uint y_pos = uv_y % 256u; - uint x_index = (uv_x - x_pos) / 256u; - uint y_index = (uv_y - y_pos) / 256u; - - // First 2 work bytes are the x,y pos within the 256x256 area, the next - // two bytes are modified from the random generated value, XOR'd with - // the x,y area index of where this pixel is located - m[0u] = (x_pos ^ (y_pos << 8u) ^ ((u_work0.b ^ x_index) << 16u) ^ ((u_work0.a ^ y_index) << 24u)); - - // Remaining bytes are un-modified from the random generated value - m[1u] = (u_work1.r ^ (u_work1.g << 8u) ^ (u_work1.b << 16u) ^ (u_work1.a << 24u)); - - // Block hash - for (uint i = 0u; i < 8u; i = i + 1u) { - m[i+2u] = blockhash[i]; - } - - // twelve rounds of mixing - for(uint i = 0u; i < 12u; i = i + 1u) { - G(SIGMA82[i * 16u + 0u], SIGMA82[i * 16u + 1u], 0u, 8u, 16u, 24u); - G(SIGMA82[i * 16u + 2u], SIGMA82[i * 16u + 3u], 2u, 10u, 18u, 26u); - G(SIGMA82[i * 16u + 4u], SIGMA82[i * 16u + 5u], 4u, 12u, 20u, 28u); - G(SIGMA82[i * 16u + 6u], SIGMA82[i * 16u + 7u], 6u, 14u, 22u, 30u); - G(SIGMA82[i * 16u + 8u], SIGMA82[i * 16u + 9u], 0u, 10u, 20u, 30u); - G(SIGMA82[i * 16u + 10u], SIGMA82[i * 16u + 11u], 2u, 12u, 22u, 24u); - G(SIGMA82[i * 16u + 12u], SIGMA82[i * 16u + 13u], 4u, 14u, 16u, 26u); - G(SIGMA82[i * 16u + 14u], SIGMA82[i * 16u + 15u], 6u, 8u, 18u, 28u); - } - - // Pixel data is multipled by threshold test result (0 or 1) - // First 4 bytes insignificant, only calculate digest of second 4 bytes - if ((BLAKE2B_IV32_1 ^ v[1u] ^ v[17u]) > threshold) { - fragColor = vec4( - float(x_index + 1u)/255.0, // +1 to distinguish from 0 (unsuccessful) pixels - float(y_index + 1u)/255.0, // Same as previous - float(x_pos)/255.0, // Return the 2 custom bytes used in work value - float(y_pos)/255.0 // Second custom byte - ); - } else { - discard; - } -} -` diff --git a/src/lib/nano-pow/shaders/gl-vertex.ts b/src/lib/nano-pow/shaders/gl-vertex.ts deleted file mode 100644 index 5480627..0000000 --- a/src/lib/nano-pow/shaders/gl-vertex.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const NanoPowGlVertexShader = `#version 300 es -#pragma vscode_glsllint_stage: vert -precision highp float; -layout (location=0) in vec4 position; -layout (location=1) in vec2 uv; - -out vec2 uv_pos; - -void main() { - uv_pos = uv; - gl_Position = position; -} -` diff --git a/src/lib/nano-pow/shaders/gpu-compute.ts b/src/lib/nano-pow/shaders/gpu-compute.ts deleted file mode 100644 index 2e7c140..0000000 --- a/src/lib/nano-pow/shaders/gpu-compute.ts +++ /dev/null @@ -1,7667 +0,0 @@ -export const NanoPowGpuComputeShader = ` -struct UBO { - blockhash: array, 2>, - random: u32, - threshold: u32 -}; -@group(0) @binding(0) var ubo: UBO; - -struct WORK { - nonce: vec2, - found: atomic -}; -@group(0) @binding(1) var work: WORK; - -/** -* Defined separately from uint v[32] below as the original value is required -* to calculate the second uint32 of the digest for threshold comparison -*/ -const BLAKE2B_IV32_1: u32 = 0x6A09E667u; - -/** -* Main compute function -* 8-byte work is split into two 4-byte u32. Low 4 bytes are random u32 from -* UBO. High 4 bytes are the random value XOR'd with index of each thread. -*/ -@compute @workgroup_size(256) -fn main(@builtin(global_invocation_id) global_id: vec3) { - if (atomicLoad(&work.found) != 0u) { return; } - - let threshold: u32 = ubo.threshold; - - /** - * Initialize (nonce||blockhash) concatenation - */ - var m0: u32 = ubo.random ^ global_id.x; - var m1: u32 = ubo.random ^ global_id.y; - var m2: u32 = ubo.blockhash[0u].x; - var m3: u32 = ubo.blockhash[0u].y; - var m4: u32 = ubo.blockhash[0u].z; - var m5: u32 = ubo.blockhash[0u].w; - var m6: u32 = ubo.blockhash[1u].x; - var m7: u32 = ubo.blockhash[1u].y; - var m8: u32 = ubo.blockhash[1u].z; - var m9: u32 = ubo.blockhash[1u].w; - - /** - * Compression buffer intialized to 2 instances of initialization vector - * The following values have been modified from the BLAKE2B_IV: - * OUTLEN is constant 8 bytes - * v[0u] ^= 0x01010000u ^ uint(OUTLEN); - * INLEN is constant 40 bytes: work value (8) + block hash (32) - * v[24u] ^= uint(INLEN); - * It is always the "last" compression at this INLEN - * v[28u] = ~v[28u]; - * v[29u] = ~v[29u]; - */ - var v0: u32 = 0xF2BDC900u; - var v1: u32 = 0x6A09E667u; - var v2: u32 = 0x84CAA73Bu; - var v3: u32 = 0xBB67AE85u; - var v4: u32 = 0xFE94F82Bu; - var v5: u32 = 0x3C6EF372u; - var v6: u32 = 0x5F1D36F1u; - var v7: u32 = 0xA54FF53Au; - var v8: u32 = 0xADE682D1u; - var v9: u32 = 0x510E527Fu; - var v10: u32 = 0x2B3E6C1Fu; - var v11: u32 = 0x9B05688Cu; - var v12: u32 = 0xFB41BD6Bu; - var v13: u32 = 0x1F83D9ABu; - var v14: u32 = 0x137E2179u; - var v15: u32 = 0x5BE0CD19u; - var v16: u32 = 0xF3BCC908u; - var v17: u32 = 0x6A09E667u; - var v18: u32 = 0x84CAA73Bu; - var v19: u32 = 0xBB67AE85u; - var v20: u32 = 0xFE94F82Bu; - var v21: u32 = 0x3C6EF372u; - var v22: u32 = 0x5F1D36F1u; - var v23: u32 = 0xA54FF53Au; - var v24: u32 = 0xADE682F9u; - var v25: u32 = 0x510E527Fu; - var v26: u32 = 0x2B3E6C1Fu; - var v27: u32 = 0x9B05688Cu; - var v28: u32 = 0x04BE4294u; - var v29: u32 = 0xE07C2654u; - var v30: u32 = 0x137E2179u; - var v31: u32 = 0x5BE0CD19u; - - - - - - /** - * Twelve rounds of G mixing as part of BLAKE2b compression step. - * Each sigma r index correlates with the reference implementation, but each - * sigma i index, and each v index, is doubled due to using two u32 array - * elements to represent one uint64_t. - */ - var o0: u32; - var o1: u32; - var xor0: u32; - var xor1: u32; - - /**************************************************************************** - * ROUND(0) * - ****************************************************************************/ - - /** - * r=0, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v0 + m0; - o1 = v1 + m1; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v0 + m2; - o1 = v1 + m3; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=0, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v2 + m4; - o1 = v3 + m5; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v2 + m6; - o1 = v3 + m7; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=0, i=2(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v4 + m8; - o1 = v5 + m9; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=0, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=0, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=0, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=0, i=6(x2), a=v[4-6], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=0, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * ROUND(1) * - ****************************************************************************/ - - /** - * r=1, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=1, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v2 + m8; - o1 = v3 + m9; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=1, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=1, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=1, i=4(x2), a=v[0-1], b=v[11-12], c=v[21-22], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v0 + m2; - o1 = v1 + m3; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=1, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v2 + m0; - o1 = v3 + m1; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v2 + m4; - o1 = v3 + m5; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=1, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=1, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v6 + m6; - o1 = v7 + m7; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * ROUND(2) * - ****************************************************************************/ - - /** - * r=2, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=2, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v2 + m0; - o1 = v3 + m1; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=2, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v4 + m4; - o1 = v5 + m5; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=2, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=2, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=2, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v2 + m6; - o1 = v3 + m7; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=2, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v4 + m2; - o1 = v5 + m3; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=2, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v6 + m8; - o1 = v7 + m9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * ROUND(3) * - ****************************************************************************/ - - /** - * r=3, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=3, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v2 + m6; - o1 = v3 + m7; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v2 + m2; - o1 = v3 + m3; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=3, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=3, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=3, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v0 + m4; - o1 = v1 + m5; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=3, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=3, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v4 + m8; - o1 = v5 + m9; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v4 + m0; - o1 = v5 + m1; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=3, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * ROUND(4) * - ****************************************************************************/ - - /** - * r=4, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v0 + m0; - o1 = v1 + m1; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=4, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=4, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v4 + m4; - o1 = v5 + m5; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v4 + m8; - o1 = v5 + m9; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=4, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=4, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v0 + m2; - o1 = v1 + m3; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=4, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=4, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=4, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v6 + m6; - o1 = v7 + m7; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * ROUND(5) * - ****************************************************************************/ - - /** - * r=5, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v0 + m4; - o1 = v1 + m5; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=5, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=5, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v4 + m0; - o1 = v5 + m1; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=5, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v6 + m6; - o1 = v7 + m7; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=5, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v0 + m8; - o1 = v1 + m9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=5, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=5, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=5, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v6 + m2; - o1 = v7 + m3; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * ROUND(6) * - ****************************************************************************/ - - /** - * r=6, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=6, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v2 + m2; - o1 = v3 + m3; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=6, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=6, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v6 + m8; - o1 = v7 + m9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=6, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v0 + m0; - o1 = v1 + m1; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=6, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v2 + m6; - o1 = v3 + m7; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=6, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v4 + m4; - o1 = v5 + m5; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=6, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * ROUND(7) * - ****************************************************************************/ - - /** - * r=7, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=7, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=7, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v4 + m2; - o1 = v5 + m3; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=7, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v6 + m6; - o1 = v7 + m7; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=7, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v0 + m0; - o1 = v1 + m1; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=7, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v2 + m8; - o1 = v3 + m9; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=7, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=7, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v6 + m4; - o1 = v7 + m5; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * ROUND(8) * - ****************************************************************************/ - - /** - * r=8, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=8, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=8, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v4 + m6; - o1 = v5 + m7; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=8, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v6 + m0; - o1 = v7 + m1; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=8, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v0 + m4; - o1 = v1 + m5; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=8, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=8, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v4 + m2; - o1 = v5 + m3; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v4 + m8; - o1 = v5 + m9; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=8, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * ROUND(9) * - ****************************************************************************/ - - /** - * r=9, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v0 + m4; - o1 = v1 + m5; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=9, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v2 + m8; - o1 = v3 + m9; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=9, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=9, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v6 + m2; - o1 = v7 + m3; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=9, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=9, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=9, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v4 + m6; - o1 = v5 + m7; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=9, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v6 + m0; - o1 = v7 + m1; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * ROUND(10) * - ****************************************************************************/ - - /** - * r=10, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v0 + m0; - o1 = v1 + m1; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v0 + m2; - o1 = v1 + m3; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=10, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v2 + m4; - o1 = v3 + m5; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v2 + m6; - o1 = v3 + m7; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=10, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v4 + m8; - o1 = v5 + m9; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=10, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=10, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=10, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=10, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=10, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * ROUND(11) * - ****************************************************************************/ - - /** - * r=11, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25] - */ - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v8; - o1 = v1 + v9; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v0; - xor1 = v25 ^ v1; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v24; - o1 = v17 + v25; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v16; - xor1 = v9 ^ v17; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=11, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27] - */ - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v2 + m8; - o1 = v3 + m9; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v10; - o1 = v3 + v11; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v2 + 0u; - // o1 = v3 + 0u; - // if (v2 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v2 = o0; - // v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v2; - xor1 = v27 ^ v3; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v26; - o1 = v19 + v27; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v18; - xor1 = v11 ^ v19; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=11, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29] - */ - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v12; - o1 = v5 + v13; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v4; - xor1 = v29 ^ v5; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v28; - o1 = v21 + v29; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v20; - xor1 = v13 ^ v21; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=11, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31] - */ - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v14; - o1 = v7 + v15; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v6; - xor1 = v31 ^ v7; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v30; - o1 = v23 + v31; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v22; - xor1 = v15 ^ v23; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=11, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31] - */ - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v0 + m2; - o1 = v1 + m3; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = xor1; - v31 = xor0; - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor0 >> 24u) ^ (xor1 << 8u); - v11 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v0 + v10; - o1 = v1 + v11; - o1 = o1 + select(0u, 1u, o0 < v0); - v0 = o0; - v1 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v0 + 0u; - // o1 = v1 + 0u; - // if (v0 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v0 = o0; - // v1 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v30 ^ v0; - xor1 = v31 ^ v1; - v30 = (xor0 >> 16u) ^ (xor1 << 16u); - v31 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v20 + v30; - o1 = v21 + v31; - o1 = o1 + select(0u, 1u, o0 < v20); - v20 = o0; - v21 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v10 ^ v20; - xor1 = v11 ^ v21; - v10 = (xor1 >> 31u) ^ (xor0 << 1u); - v11 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=11, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25] - */ - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+0]] - o0 = v2 + m0; - o1 = v3 + m1; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = xor1; - v25 = xor0; - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor0 >> 24u) ^ (xor1 << 8u); - v13 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v2 + v12; - o1 = v3 + v13; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v2 + m4; - o1 = v3 + m5; - o1 = o1 + select(0u, 1u, o0 < v2); - v2 = o0; - v3 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v24 ^ v2; - xor1 = v25 ^ v3; - v24 = (xor0 >> 16u) ^ (xor1 << 16u); - v25 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v22 + v24; - o1 = v23 + v25; - o1 = o1 + select(0u, 1u, o0 < v22); - v22 = o0; - v23 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v12 ^ v22; - xor1 = v13 ^ v23; - v12 = (xor1 >> 31u) ^ (xor0 << 1u); - v13 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=11, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27] - */ - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = xor1; - v27 = xor0; - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor0 >> 24u) ^ (xor1 << 8u); - v15 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v4 + v14; - o1 = v5 + v15; - o1 = o1 + select(0u, 1u, o0 < v4); - v4 = o0; - v5 = o1; - - // // a = a + m[sigma[r][2*i+1]] - // // skip since adding 0u does nothing - // o0 = v4 + 0u; - // o1 = v5 + 0u; - // if (v4 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v4 = o0; - // v5 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v26 ^ v4; - xor1 = v27 ^ v5; - v26 = (xor0 >> 16u) ^ (xor1 << 16u); - v27 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v16 + v26; - o1 = v17 + v27; - o1 = o1 + select(0u, 1u, o0 < v16); - v16 = o0; - v17 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v14 ^ v16; - xor1 = v15 ^ v17; - v14 = (xor1 >> 31u) ^ (xor0 << 1u); - v15 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /** - * r=11, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29] - */ - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // // a = a + m[sigma[r][2*i+0]] - // // skip since adding 0u does nothing - // o0 = v6 + 0u; - // o1 = v7 + 0u; - // if (v6 > 0xFFFFFFFFu - 0u) { - // o1 = o1 + 1u; - // } - // v6 = o0; - // v7 = o1; - - // d = rotr64(d ^ a, 32) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = xor1; - v29 = xor0; - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 24) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor0 >> 24u) ^ (xor1 << 8u); - v9 = (xor1 >> 24u) ^ (xor0 << 8u); - - // a = a + b - o0 = v6 + v8; - o1 = v7 + v9; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // a = a + m[sigma[r][2*i+1]] - o0 = v6 + m6; - o1 = v7 + m7; - o1 = o1 + select(0u, 1u, o0 < v6); - v6 = o0; - v7 = o1; - - // d = rotr64(d ^ a, 16) - xor0 = v28 ^ v6; - xor1 = v29 ^ v7; - v28 = (xor0 >> 16u) ^ (xor1 << 16u); - v29 = (xor1 >> 16u) ^ (xor0 << 16u); - - // c = c + d - o0 = v18 + v28; - o1 = v19 + v29; - o1 = o1 + select(0u, 1u, o0 < v18); - v18 = o0; - v19 = o1; - - // b = rotr64(b ^ c, 63) - xor0 = v8 ^ v18; - xor1 = v9 ^ v19; - v8 = (xor1 >> 31u) ^ (xor0 << 1u); - v9 = (xor0 >> 31u) ^ (xor1 << 1u); - - - - - - /**************************************************************************** - * NONCE CHECK * - ****************************************************************************/ - - /** - * Set nonce if it passes the threshold and no other thread has set it - */ - if ((BLAKE2B_IV32_1 ^ v1 ^ v17) > threshold && atomicLoad(&work.found) == 0u) { - atomicStore(&work.found, 1u); - work.nonce.x = m0; - work.nonce.y = m1; - } - return; -} -` diff --git a/src/lib/nano-pow/shaders/index.ts b/src/lib/nano-pow/shaders/index.ts deleted file mode 100644 index 9629261..0000000 --- a/src/lib/nano-pow/shaders/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NanoPowGpuComputeShader } from "./gpu-compute" -import { NanoPowGlFragmentShader } from "./gl-fragment" -import { NanoPowGlVertexShader } from "./gl-vertex" - -export { - NanoPowGpuComputeShader, - NanoPowGlFragmentShader, - NanoPowGlVertexShader -} diff --git a/src/lib/workers/index.ts b/src/lib/workers/index.ts index bdb75d9..d1358bc 100644 --- a/src/lib/workers/index.ts +++ b/src/lib/workers/index.ts @@ -2,10 +2,10 @@ // SPDX-License-Identifier: GPL-3.0-or-later import { default as Bip44Ckd } from '#~/workers/bip44-ckd.js' import { default as NanoNaCl } from '#~/workers/nano-nacl.js' -import { default as NanoPow } from '#~/workers/nano-pow.js' +import { default as NanoPowWorker } from '#~/workers/nano-pow.js' export { Bip44Ckd, NanoNaCl, - NanoPow + NanoPowWorker } diff --git a/src/lib/workers/nano-pow.ts b/src/lib/workers/nano-pow.ts index ef6860a..cbba79d 100644 --- a/src/lib/workers/nano-pow.ts +++ b/src/lib/workers/nano-pow.ts @@ -1,8 +1,6 @@ // SPDX-FileCopyrightText: 2024 Chris Duncan // SPDX-License-Identifier: GPL-3.0-or-later import { WorkerInterface } from '#~/pool.js' -import { NanoPowGpuComputeShader, NanoPowGlFragmentShader, NanoPowGlVertexShader } from '#nano-pow/shaders/index.js' -import { NanoPowGl, NanoPowGpu } from '#nano-pow/classes/index.js' import { NanoPow } from 'nano-pow' /** @@ -35,11 +33,7 @@ export class NanoPowWorker extends WorkerInterface { } export default ` - const NanoPowGpuComputeShader = \`${NanoPowGpuComputeShader}\` - const NanoPowGlFragmentShader = \`${NanoPowGlFragmentShader}\` - const NanoPowGlVertexShader = \`${NanoPowGlVertexShader}\` - const NanoPowGl = ${NanoPowGl} - const NanoPowGpu = ${NanoPowGpu} - const WorkerInterface = ${WorkerInterface} const NanoPow = ${NanoPow} + const WorkerInterface = ${WorkerInterface} + const NanoPowWorker = ${NanoPowWorker} ` diff --git a/src/main.ts b/src/main.ts index 41c393d..8d008c5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,11 +4,10 @@ import { Account } from './lib/account.js' import { Blake2b } from './lib/blake2b.js' import { SendBlock, ReceiveBlock, ChangeBlock } from './lib/block.js' -import { NanoPowGl, NanoPowGpu } from '#nano-pow' import { Rpc } from './lib/rpc.js' import { Rolodex } from './lib/rolodex.js' import { Safe } from './lib/safe.js' import { Tools } from './lib/tools.js' import { Bip44Wallet, Blake2bWallet, LedgerWallet } from './lib/wallet.js' -export { Account, Blake2b, SendBlock, ReceiveBlock, ChangeBlock, NanoPowGl as PowGl, NanoPowGpu, Rpc, Rolodex, Safe, Tools, Bip44Wallet, Blake2bWallet, LedgerWallet } +export { Account, Blake2b, SendBlock, ReceiveBlock, ChangeBlock, Rpc, Rolodex, Safe, Tools, Bip44Wallet, Blake2bWallet, LedgerWallet } diff --git a/test/perf.block.js b/test/perf.block.js index 73f8b91..46382a7 100644 --- a/test/perf.block.js +++ b/test/perf.block.js @@ -5,13 +5,15 @@ import { assert, average, skip, suite, test } from '#test/GLOBALS.mjs' import { NANO_TEST_VECTORS } from '#test/VECTORS.js' -import { PowGl, NanoPowGpu, SendBlock } from '#dist/main.js' +import { SendBlock } from '#dist/main.js' +import { NanoPow } from 'nano-pow' import 'nano-webgl-pow' await suite('Block performance', async () => { const COUNT = 0x200 - await test(`PowGpu: Calculate proof-of-work for 6 unique block hashes`, async () => { + await test(`NanoPow: Calculate proof-of-work for 6 unique block hashes`, async () => { + if (NanoPow == null) throw new Error('Failed to import NanoPow') const times = [] const hashes = [ NANO_TEST_VECTORS.PRIVATE_0, @@ -23,33 +25,7 @@ await suite('Block performance', async () => { ] for (let i = 0; i < 6; i++) { const start = performance.now() - const work = await NanoPowGpu.search(hashes[i]) - const end = performance.now() - times.push(end - start) - console.log(`${work} (${end - start} ms) ${hashes[i]}`) - } - const { total, arithmetic, harmonic, geometric, min, max } = average(times) - console.log(`Total: ${total} ms`) - console.log(`Average: ${arithmetic} ms`) - console.log(`Harmonic: ${harmonic} ms`) - console.log(`Geometric: ${geometric} ms`) - console.log(`Minimum: ${min} ms`) - console.log(`Maximum: ${max} ms`) - }) - - await skip(`PowGl: Calculate proof-of-work for 6 unique block hashes`, async () => { - const times = [] - const hashes = [ - NANO_TEST_VECTORS.PRIVATE_0, - NANO_TEST_VECTORS.PRIVATE_1, - NANO_TEST_VECTORS.PRIVATE_2, - NANO_TEST_VECTORS.PUBLIC_0, - NANO_TEST_VECTORS.PUBLIC_1, - NANO_TEST_VECTORS.PUBLIC_2 - ] - for (let i = 0; i < 6; i++) { - const start = performance.now() - const work = await PowGl.search(hashes[i]) + const work = await NanoPow.search(hashes[i]) const end = performance.now() times.push(end - start) console.log(`${work} (${end - start} ms) ${hashes[i]}`) -- 2.34.1