@@ -122,7 +122,7 @@ typedef struct TLVDescriptor TLVDescriptor;
122
122
123
123
#define IS_SIGNED_32BIT(val) ((((intptr_t)(val)) <= 0x7fffffff) && (((intptr_t)(val)) >= (-2147483647 - 1)))
124
124
125
- /* Encoding of immediate. TODO: shift mode may be supported in the near future. */
125
+ /* Encoding of immediate. */
126
126
#define MAX_IMM12 0xfff // maximum value for imm12
127
127
#define MAX_IMM16 0xffff // maximum value for imm16
128
128
#define CMP_IMM MAX_IMM12 // cmp insn
@@ -172,6 +172,11 @@ static bool arm64_may_use_adrp(const void *addr)
172
172
return 0;
173
173
}
174
174
175
+ static bool arm64_may_encode_imm12(const int64_t val)
176
+ {
177
+ return (val >= 0 && (val < (1<<12) || !(val & 0xffffffffff000fff)));
178
+ }
179
+
175
180
/* Determine whether an immediate value can be encoded as the immediate operand of logical instructions. */
176
181
static bool logical_immediate_p(uint64_t value, uint32_t reg_size)
177
182
{
@@ -364,9 +369,9 @@ static bool logical_immediate_p(uint64_t value, uint32_t reg_size)
364
369
|.macro CMP_32_WITH_CONST, reg, val, tmp_reg
365
370
|| if (val == 0) {
366
371
| cmp reg, wzr
367
- || } else if (((int32_t )(val)) > 0 && ((int32_t)(val)) <= CMP_IMM ) {
372
+ || } else if (arm64_may_encode_imm12((int64_t )(val))) {
368
373
| cmp reg, #val
369
- || } else if (((int32_t)( val)) < 0 && ((int32_t)(val)) >= -CMP_IMM ) {
374
+ || } else if (arm64_may_encode_imm12((int64_t)(- val))) {
370
375
| cmn reg, #-val
371
376
|| } else {
372
377
| LOAD_32BIT_VAL tmp_reg, val
@@ -377,9 +382,9 @@ static bool logical_immediate_p(uint64_t value, uint32_t reg_size)
377
382
|.macro CMP_64_WITH_CONST_32, reg, val, tmp_reg
378
383
|| if (val == 0) {
379
384
| cmp reg, xzr
380
- || } else if (((int32_t )(val)) > 0 && ((int32_t)(val)) <= CMP_IMM ) {
385
+ || } else if (arm64_may_encode_imm12((int64_t )(val))) {
381
386
| cmp reg, #val
382
- || } else if (((int32_t)( val)) < 0 && ((int32_t)(val)) >= -CMP_IMM ) {
387
+ || } else if (arm64_may_encode_imm12((int64_t)(- val))) {
383
388
| cmn reg, #-val
384
389
|| } else {
385
390
| LOAD_32BIT_VAL tmp_reg, val
@@ -390,9 +395,9 @@ static bool logical_immediate_p(uint64_t value, uint32_t reg_size)
390
395
|.macro CMP_64_WITH_CONST, reg, val, tmp_reg
391
396
|| if (val == 0) {
392
397
| cmp reg, xzr
393
- || } else if (((int64_t)(val)) > 0 && ((int64_t)(val)) <= CMP_IMM ) {
398
+ || } else if (arm64_may_encode_imm12 ((int64_t)(val))) {
394
399
| cmp reg, #val
395
- || } else if (((int64_t)(val)) < 0 && ((int64_t)(val)) >= -CMP_IMM ) {
400
+ || } else if (arm64_may_encode_imm12 ((int64_t)(- val))) {
396
401
| cmn reg, #-val
397
402
|| } else {
398
403
| LOAD_64BIT_VAL tmp_reg, val
@@ -406,7 +411,7 @@ static bool logical_immediate_p(uint64_t value, uint32_t reg_size)
406
411
|.macro ADD_SUB_32_WITH_CONST, add_sub_ins, dst_reg, src_reg1, val, tmp_reg
407
412
|| if (val == 0) {
408
413
| add_sub_ins dst_reg, src_reg1, wzr
409
- || } else if (((int32_t )(val)) > 0 && ((int32_t)(val)) <= ADD_SUB_IMM ) {
414
+ || } else if (arm64_may_encode_imm12((int64_t )(val))) {
410
415
| add_sub_ins dst_reg, src_reg1, #val
411
416
|| } else {
412
417
| LOAD_32BIT_VAL tmp_reg, val
@@ -417,7 +422,7 @@ static bool logical_immediate_p(uint64_t value, uint32_t reg_size)
417
422
|.macro ADD_SUB_64_WITH_CONST_32, add_sub_ins, dst_reg, src_reg1, val, tmp_reg
418
423
|| if (val == 0) {
419
424
| add_sub_ins dst_reg, src_reg1, xzr
420
- || } else if (((int32_t )(val)) > 0 && ((int32_t)(val)) <= ADD_SUB_IMM ) {
425
+ || } else if (arm64_may_encode_imm12((int64_t )(val))) {
421
426
| add_sub_ins dst_reg, src_reg1, #val
422
427
|| } else {
423
428
| LOAD_32BIT_VAL tmp_reg, val
@@ -428,7 +433,7 @@ static bool logical_immediate_p(uint64_t value, uint32_t reg_size)
428
433
|.macro ADD_SUB_64_WITH_CONST, add_sub_ins, dst_reg, src_reg1, val, tmp_reg
429
434
|| if (val == 0) {
430
435
| add_sub_ins dst_reg, src_reg1, xzr
431
- || } else if (((int64_t)(val)) > 0 && ((int64_t)(val)) <= ADD_SUB_IMM ) {
436
+ || } else if (arm64_may_encode_imm12 ((int64_t)(val))) {
432
437
| add_sub_ins dst_reg, src_reg1, #val
433
438
|| } else {
434
439
| LOAD_64BIT_VAL tmp_reg, val
0 commit comments