mirror of
				https://git.wownero.com/wownero/RandomWOW.git
				synced 2024-08-15 00:23:14 +00:00 
			
		
		
		
	Fixed a chance of CBRANCH looping
Fixed CBRANCH jump probability being lower than expected
This commit is contained in:
		
							parent
							
								
									5241cb902e
								
							
						
					
					
						commit
						9e5eac8645
					
				
					 8 changed files with 73 additions and 46 deletions
				
			
		|  | @ -18,8 +18,8 @@ randomx_isn_5: | |||
| 	xchg r12, r8 | ||||
| randomx_isn_6: | ||||
| 	; CBRANCH -188214077, COND 5 | ||||
| 	add r9, -188214045 | ||||
| 	test r9, 8160 | ||||
| 	add r9, -188209981 | ||||
| 	test r9, 2088960 | ||||
| 	jz randomx_isn_0 | ||||
| randomx_isn_7: | ||||
| 	; ISTORE L3[r0-784322734], r3 | ||||
|  | @ -52,13 +52,13 @@ randomx_isn_12: | |||
| 	imul r15, r12 | ||||
| randomx_isn_13: | ||||
| 	; CBRANCH 179989705, COND 3 | ||||
| 	add r8, 179989705 | ||||
| 	test r8, 2040 | ||||
| 	add r8, 179988681 | ||||
| 	test r8, 522240 | ||||
| 	jz randomx_isn_7 | ||||
| randomx_isn_14: | ||||
| 	; CBRANCH 1801296358, COND 3 | ||||
| 	add r10, 1801296366 | ||||
| 	test r10, 2040 | ||||
| 	add r10, 1801296358 | ||||
| 	test r10, 522240 | ||||
| 	jz randomx_isn_14 | ||||
| randomx_isn_15: | ||||
| 	; IADD_RS r6, r2, SHFT 3 | ||||
|  | @ -80,8 +80,8 @@ randomx_isn_19: | |||
| 	mulpd xmm5, xmm10 | ||||
| randomx_isn_20: | ||||
| 	; CBRANCH 1593588996, COND 3 | ||||
| 	add r11, 1593589004 | ||||
| 	test r11, 2040 | ||||
| 	add r11, 1593587972 | ||||
| 	test r11, 522240 | ||||
| 	jz randomx_isn_15 | ||||
| randomx_isn_21: | ||||
| 	; IROR_R r7, r2 | ||||
|  | @ -102,7 +102,7 @@ randomx_isn_23: | |||
| randomx_isn_24: | ||||
| 	; CBRANCH 149087159, COND 13 | ||||
| 	add r12, 149087159 | ||||
| 	test r12, 2088960 | ||||
| 	test r12, 534773760 | ||||
| 	jz randomx_isn_21 | ||||
| randomx_isn_25: | ||||
| 	; FADD_R f3, a0 | ||||
|  | @ -208,8 +208,8 @@ randomx_isn_50: | |||
| 	subpd xmm3, xmm8 | ||||
| randomx_isn_51: | ||||
| 	; CBRANCH -1975981803, COND 14 | ||||
| 	add r9, -1975981803 | ||||
| 	test r9, 4177920 | ||||
| 	add r9, -1973884651 | ||||
| 	test r9, 1069547520 | ||||
| 	jz randomx_isn_25 | ||||
| randomx_isn_52: | ||||
| 	; IADD_M r1, L3[1622792] | ||||
|  | @ -219,8 +219,8 @@ randomx_isn_53: | |||
| 	subpd xmm2, xmm8 | ||||
| randomx_isn_54: | ||||
| 	; CBRANCH 1917049931, COND 12 | ||||
| 	add r13, 1917049931 | ||||
| 	test r13, 1044480 | ||||
| 	add r13, 1918098507 | ||||
| 	test r13, 267386880 | ||||
| 	jz randomx_isn_52 | ||||
| randomx_isn_55: | ||||
| 	; IXOR_R r2, r3 | ||||
|  | @ -249,7 +249,7 @@ randomx_isn_61: | |||
| randomx_isn_62: | ||||
| 	; CBRANCH 1111898647, COND 1 | ||||
| 	add r14, 1111898647 | ||||
| 	test r14, 510 | ||||
| 	test r14, 130560 | ||||
| 	jz randomx_isn_55 | ||||
| randomx_isn_63: | ||||
| 	; IMUL_R r6, r5 | ||||
|  | @ -288,8 +288,8 @@ randomx_isn_73: | |||
| 	mulpd xmm4, xmm8 | ||||
| randomx_isn_74: | ||||
| 	; CBRANCH -1200328848, COND 4 | ||||
| 	add r15, -1200328848 | ||||
| 	test r15, 4080 | ||||
| 	add r15, -1200326800 | ||||
| 	test r15, 1044480 | ||||
| 	jz randomx_isn_63 | ||||
| randomx_isn_75: | ||||
| 	; FSQRT_R e0 | ||||
|  | @ -346,8 +346,8 @@ randomx_isn_88: | |||
| 	imul r9, qword ptr [rsi+rax] | ||||
| randomx_isn_89: | ||||
| 	; CBRANCH -122257389, COND 13 | ||||
| 	add r8, -122249197 | ||||
| 	test r8, 2088960 | ||||
| 	add r8, -123305965 | ||||
| 	test r8, 534773760 | ||||
| 	jz randomx_isn_75 | ||||
| randomx_isn_90: | ||||
| 	; ISTORE L1[r5+228116180], r7 | ||||
|  | @ -481,8 +481,8 @@ randomx_isn_122: | |||
| 	subpd xmm0, xmm9 | ||||
| randomx_isn_123: | ||||
| 	; CBRANCH 269211216, COND 3 | ||||
| 	add r9, 269211224 | ||||
| 	test r9, 2040 | ||||
| 	add r9, 269212240 | ||||
| 	test r9, 522240 | ||||
| 	jz randomx_isn_100 | ||||
| randomx_isn_124: | ||||
| 	; FSUB_M f2, L1[r6-1615966581] | ||||
|  | @ -564,8 +564,8 @@ randomx_isn_142: | |||
| 	addpd xmm1, xmm8 | ||||
| randomx_isn_143: | ||||
| 	; CBRANCH 880467599, COND 5 | ||||
| 	add r14, 880467631 | ||||
| 	test r14, 8160 | ||||
| 	add r14, 880471695 | ||||
| 	test r14, 2088960 | ||||
| 	jz randomx_isn_124 | ||||
| randomx_isn_144: | ||||
| 	; FMUL_R e1, a1 | ||||
|  | @ -585,8 +585,8 @@ randomx_isn_147: | |||
| 	add r9, qword ptr [rsi+rax] | ||||
| randomx_isn_148: | ||||
| 	; CBRANCH -1843326985, COND 14 | ||||
| 	add r10, -1843310601 | ||||
| 	test r10, 4177920 | ||||
| 	add r10, -1841229833 | ||||
| 	test r10, 1069547520 | ||||
| 	jz randomx_isn_144 | ||||
| randomx_isn_149: | ||||
| 	; IADD_RS r4, r3, SHFT 2 | ||||
|  | @ -655,8 +655,8 @@ randomx_isn_163: | |||
| 	shufpd xmm3, xmm3, 1 | ||||
| randomx_isn_164: | ||||
| 	; CBRANCH -2107581963, COND 4 | ||||
| 	add r11, -2107581963 | ||||
| 	test r11, 4080 | ||||
| 	add r11, -2107584011 | ||||
| 	test r11, 1044480 | ||||
| 	jz randomx_isn_149 | ||||
| randomx_isn_165: | ||||
| 	; FSUB_R f1, a2 | ||||
|  | @ -720,8 +720,8 @@ randomx_isn_180: | |||
| 	subpd xmm3, xmm9 | ||||
| randomx_isn_181: | ||||
| 	; CBRANCH 556152230, COND 12 | ||||
| 	add r12, 556152230 | ||||
| 	test r12, 1044480 | ||||
| 	add r12, 557200806 | ||||
| 	test r12, 267386880 | ||||
| 	jz randomx_isn_165 | ||||
| randomx_isn_182: | ||||
| 	; FSQRT_R e2 | ||||
|  | @ -956,8 +956,8 @@ randomx_isn_246: | |||
| 	imul r15, r10 | ||||
| randomx_isn_247: | ||||
| 	; CBRANCH -8545330, COND 4 | ||||
| 	add r8, -8545314 | ||||
| 	test r8, 4080 | ||||
| 	add r8, -8547378 | ||||
| 	test r8, 1044480 | ||||
| 	jz randomx_isn_213 | ||||
| randomx_isn_248: | ||||
| 	; ISTORE L1[r0+1951752498], r5 | ||||
|  |  | |||
							
								
								
									
										27
									
								
								doc/specs.md
									
										
									
									
									
								
							
							
						
						
									
										27
									
								
								doc/specs.md
									
										
									
									
									
								
							|  | @ -55,7 +55,8 @@ RandomX has several configurable parameters that are listed in Table 1.2.1 with | |||
| |`RANDOMX_PROGRAM_SIZE`|The number of instructions in a RandomX program|`256`| | ||||
| |`RANDOMX_PROGRAM_ITERATIONS`|The number of iterations per program|`2048`| | ||||
| |`RANDOMX_PROGRAM_COUNT`|The number of programs per hash|`8`| | ||||
| |`RANDOMX_JUMP_BITS`|How many register bits must be zero for the CBRANCH instruction to jump|`8`| | ||||
| |`RANDOMX_JUMP_BITS`|Jump condition mask size in bits|`8`| | ||||
| |`RANDOMX_JUMP_OFFSET`|Jump condition mask offset in bits|`8`| | ||||
| |`RANDOMX_SCRATCHPAD_L3`|Scratchpad L3 size in bytes|`2097152`| | ||||
| |`RANDOMX_SCRATCHPAD_L2`|Scratchpad L2 size in bytes|`262144`| | ||||
| |`RANDOMX_SCRATCHPAD_L1`|Scratchpad L1 size in bytes|`16384`| | ||||
|  | @ -613,16 +614,28 @@ A register is considered as modified by an instruction in the following cases: | |||
| There are 3 rules for the selection of the `creg` register, evaluated in this order: | ||||
| 
 | ||||
| 1. The register with the lowest value of `lastUsed` tag is selected. | ||||
| 2. In case multiple registers have the same value of the `lastUsed` tag, the register with the lowest value of the `count` tag is selected. | ||||
| 3. In case multiple registers have the same values of both `lastUsed` and `count` tags, a register with the lowest index is selected (`r0` before `r1` etc.). | ||||
| 1. In case multiple registers have the same value of the `lastUsed` tag, the register with the lowest value of the `count` tag is selected. | ||||
| 1. In case multiple registers have the same values of both `lastUsed` and `count` tags, a register with the lowest index is selected (`r0` before `r1` etc.). | ||||
| 
 | ||||
| Whenever a register is selected as the operand of a CBRANCH instruction, its `count` tag is increased by 1. | ||||
| 
 | ||||
| The CBRANCH instruction performs the following steps (`|` represents a bitwise OR operation, `&` is a bitwise AND operation): | ||||
| The CBRANCH instruction performs the following steps: | ||||
| 
 | ||||
| 1. A constant value of `imm32 | (1 << mod.cond)` is added to `creg`. | ||||
| 2. `conditionMask` is constructed as `RANDOMX_JUMP_BITS` one-bits shifted left by `mod.cond`.  | ||||
| 3. If `creg & conditionMask` is zero, execution jumps to instruction `creg.lastUsed + 1` (the instruction following the instruction where `creg` was last modified). | ||||
| 1. A constant `b` is calculated as `mod.cond + RANDOMX_JUMP_OFFSET`. | ||||
| 1. A constant `conditionImmediate` is constructed as sign-extended `imm32` with bit `b` set to 1 and bit `b-1` set to 0 (if `b > 0`). | ||||
| 1. `conditionImmediate` is added to `creg`. | ||||
| 1. If bits `b` to `b + RANDOMX_JUMP_BITS - 1` of `creg` are zero, execution jumps to instruction `creg.lastUsed + 1` (the instruction following the instruction where `creg` was last modified). | ||||
| 
 | ||||
| Bits in immediate and register values are numbered from 0 to 63 with 0 being the least significant bit. For example, for `b = 10` and `RANDOMX_JUMP_BITS = 8`, the bits are arranged like this: | ||||
| 
 | ||||
| ``` | ||||
| conditionImmediate = SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSMMMMMMMMMMMMMMMMMMMMM10MMMMMMMMM | ||||
|               creg = ..............................................XXXXXXXX.......... | ||||
| ``` | ||||
| 
 | ||||
| `S` is a copied sign bit from `imm32`. `M` denotes bits of `imm32`. The 9th bit is set to 0 and the 10th bit is set to 1. This value would be added to `creg`. | ||||
| 
 | ||||
| The second line uses `X` to mark bits of `creg` that would be checked by the condition. If all these bits are 0 after adding `conditionImmediate`, the jump is executed. | ||||
| 
 | ||||
| The construction of the CBRANCH instruction ensures that no inifinite loops are possible in the program. | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue