Changeset 251966 in webkit
- Timestamp:
- Nov 2, 2019 1:12:38 PM (4 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r251963 r251966 1 2019-11-02 Robin Morisset <rmorisset@apple.com> 2 3 The offline assembler is wrong about which immediates are supported by and/or/xor on ARM64 4 https://bugs.webkit.org/show_bug.cgi?id=203752 5 6 Reviewed by Tadeu Zagallo. 7 8 See https://dinfuehr.github.io/blog/encoding-of-immediate-values-on-aarch64/ for the details of which immediates are supported. 9 This patch is a minimal fix, ideally we should refactor all of the code dealing with immediates in risc.rb, but considering that I don't know ruby and this code is poorly/not tested, I went for the simplest possible fix. 10 11 * offlineasm/arm64.rb: 12 * offlineasm/mips.rb: 13 * offlineasm/risc.rb: 14 1 15 2019-11-02 Devin Rousso <drousso@apple.com> 2 16 -
trunk/Source/JavaScriptCore/offlineasm/arm.rb
r251893 r251966 301 301 result = riscLowerMalformedAddressesDouble(result) 302 302 result = riscLowerMisplacedImmediates(result, ["storeb", "storei", "storep", "storeq"]) 303 result = riscLowerMalformedImmediates(result, 0..0xff )303 result = riscLowerMalformedImmediates(result, 0..0xff, 0..0x0ff) 304 304 result = riscLowerMisplacedAddresses(result) 305 305 result = riscLowerRegisterReuse(result) -
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) { -
trunk/Source/JavaScriptCore/offlineasm/mips.rb
r251893 r251966 730 730 result = riscLowerMisplacedImmediates(result, ["storeb", "storei", "storep"]) 731 731 result = mipsLowerMisplacedImmediates(result) 732 result = riscLowerMalformedImmediates(result, -0x7fff..0x7fff )732 result = riscLowerMalformedImmediates(result, -0x7fff..0x7fff, -0x7fff..0x7fff) 733 733 result = mipsLowerMisplacedAddresses(result) 734 734 result = riscLowerMisplacedAddresses(result) -
trunk/Source/JavaScriptCore/offlineasm/risc.rb
r229481 r251966 363 363 end 364 364 365 def riscLowerMalformedImmediates(list, validImmediates )365 def riscLowerMalformedImmediates(list, validImmediates, validLogicalImmediates) 366 366 newList = [] 367 367 list.each { … … 396 396 newList << node.riscLowerMalformedImmediatesRecurse(newList, validImmediates) 397 397 end 398 when "ori", "orh", "orp", "oris", "xori", "xorp", "andi", "andp" 399 newList << node.riscLowerMalformedImmediatesRecurse(newList, validLogicalImmediates) 398 400 else 399 401 newList << node.riscLowerMalformedImmediatesRecurse(newList, validImmediates)
Note: See TracChangeset
for help on using the changeset viewer.