Changeset 251966 in webkit for trunk/Source/JavaScriptCore/offlineasm/arm64.rb
- Timestamp:
- Nov 2, 2019, 1:12:38 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/offlineasm/arm64.rb
r251886 r251966 215 215 class Immediate 216 216 def arm64Operand(kind) 217 raise "Invalid immediate #{value} at #{codeOriginString}" if value < 0 or value > 4095218 217 "\##{value}" 219 218 end … … 419 418 end 420 419 } 420 421 421 result = riscLowerMisplacedImmediates(result, ["storeb", "storei", "storep", "storeq"]) 422 result = riscLowerMalformedImmediates(result, 0..4095) 422 423 # The rules for which immediates are valid for and/or/xor instructions are fairly involved, see https://dinfuehr.github.io/blog/encoding-of-immediate-values-on-aarch64/ 424 validLogicalImmediates = [] 425 def rotate(value, n, size) 426 mask = (1 << size) - 1 427 shiftedValue = value << n 428 result = (shiftedValue & mask) | ((shiftedValue & ~mask) >> size) 429 return result 430 end 431 def replicate(value, size) 432 until size == 64 do 433 value = value | (value << size) 434 size *= 2 435 end 436 return value 437 end 438 size = 2 439 until size > 64 do 440 for numberOfOnes in 1..(size-1) do 441 for rotation in 0..(size-1) do 442 immediate = 0; 443 for i in 0..(numberOfOnes-1) do 444 immediate = immediate*2 + 1 445 end 446 immediate = rotate(immediate, rotation, size) 447 immediate = replicate(immediate, size) 448 validLogicalImmediates << immediate 449 end 450 end 451 size *= 2 452 end 453 result = riscLowerMalformedImmediates(result, 0..4095, validLogicalImmediates) 454 423 455 result = riscLowerMisplacedAddresses(result) 424 456 result = riscLowerMalformedAddresses(result) {
Note:
See TracChangeset
for help on using the changeset viewer.