aboutsummaryrefslogtreecommitdiff
path: root/dynasm
diff options
context:
space:
mode:
authorMike Pall <mike>2015-01-07 13:17:11 +0100
committerMike Pall <mike>2015-01-07 13:17:11 +0100
commit1b1bd08d3c98a936058f4bee9de59dc7505e741c (patch)
tree5ec7f5986442b1529ff49de03d618e2d879af383 /dynasm
parent0a5045c34e0d2902e38c1f8f65c5bbc2fdc63535 (diff)
downloadluajit-1b1bd08d3c98a936058f4bee9de59dc7505e741c.tar.gz
luajit-1b1bd08d3c98a936058f4bee9de59dc7505e741c.tar.bz2
luajit-1b1bd08d3c98a936058f4bee9de59dc7505e741c.zip
DynASM/ARM64: Fix checks for scaled immediates.
Diffstat (limited to 'dynasm')
-rw-r--r--dynasm/dasm_arm64.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/dynasm/dasm_arm64.h b/dynasm/dasm_arm64.h
index 78451bf6..d912e61d 100644
--- a/dynasm/dasm_arm64.h
+++ b/dynasm/dasm_arm64.h
@@ -281,8 +281,9 @@ void dasm_put(Dst_DECL, int start, ...)
281 b[pos++] = ofs; /* Store pass1 offset estimate. */ 281 b[pos++] = ofs; /* Store pass1 offset estimate. */
282 break; 282 break;
283 case DASM_IMM: 283 case DASM_IMM:
284#ifdef DASM_CHECKS
285 CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I); 284 CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I);
285 n >>= ((ins>>10)&31);
286#ifdef DASM_CHECKS
286 if ((ins & 0x8000)) 287 if ((ins & 0x8000))
287 CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I); 288 CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I);
288 else 289 else
@@ -451,7 +452,7 @@ int dasm_encode(Dst_DECL, void *buffer)
451 break; 452 break;
452 case DASM_LABEL_PC: break; 453 case DASM_LABEL_PC: break;
453 case DASM_IMM: 454 case DASM_IMM:
454 cp[-1] |= ((n>>((ins>>10)&31)) & ((1<<((ins>>5)&31))-1)) << (ins&31); 455 cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31);
455 break; 456 break;
456 case DASM_IMM6: 457 case DASM_IMM6:
457 cp[-1] |= ((n&31) << 19) | ((n&32) << 26); 458 cp[-1] |= ((n&31) << 19) | ((n&32) << 26);