X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/4be4e30906bcb8ee30b4d189205cb70bad6707ce..81345200c95645a1b0d2635520f96ad55dfde63f:/offlineasm/arm.rb diff --git a/offlineasm/arm.rb b/offlineasm/arm.rb index 3c69ef0..c922436 100644 --- a/offlineasm/arm.rb +++ b/offlineasm/arm.rb @@ -63,13 +63,15 @@ class SpecialRegister end end -ARM_EXTRA_GPRS = [SpecialRegister.new("r9"), SpecialRegister.new("r8"), SpecialRegister.new("r3")] +ARM_EXTRA_GPRS = [SpecialRegister.new("r6"), SpecialRegister.new("r10"), SpecialRegister.new("r12")] ARM_EXTRA_FPRS = [SpecialRegister.new("d7")] ARM_SCRATCH_FPR = SpecialRegister.new("d6") def armMoveImmediate(value, register) # Currently we only handle the simple cases, and fall back to mov/movt for the complex ones. - if value >= 0 && value < 256 + if value.is_a? String + $asm.puts "mov #{register.armOperand}, (#{value})" + elsif value >= 0 && value < 256 $asm.puts "mov #{register.armOperand}, \##{value}" elsif (~value) >= 0 && (~value) < 256 $asm.puts "mvn #{register.armOperand}, \##{~value}" @@ -97,13 +99,17 @@ class RegisterID when "t3" "r4" when "t4" - "r10" + "r8" + when "t5" + "r9" when "cfr" - "r5" + isARMv7 ? "r7" : "r11" when "lr" "lr" when "sp" "sp" + when "pc" + "pc" else raise "Bad register #{name} for ARM at #{codeOriginString}" end @@ -333,7 +339,7 @@ class Instruction else $asm.puts "adds #{operands[2].armOperand}, #{operands[1].armOperand}, #{operands[0].armOperand}" end - elsif operands.size == 3 and operands[0].immediate? + elsif operands.size == 3 and operands[0].register? raise unless operands[1].register? raise unless operands[2].register? $asm.puts "adds #{armFlippedOperands(operands)}" @@ -451,15 +457,36 @@ class Instruction # FIXME: either support this or remove it. raise "ARM does not support this opcode yet, #{codeOrigin}" when "pop" - $asm.puts "pop #{operands[0].armOperand}" + operands.each { + | op | + $asm.puts "pop { #{op.armOperand} }" + } when "push" - $asm.puts "push #{operands[0].armOperand}" + operands.each { + | op | + $asm.puts "push { #{op.armOperand} }" + } + when "popCalleeSaves" + if isARMv7 + $asm.puts "pop {r4-r6, r8-r11}" + else + $asm.puts "pop {r4-r10}" + end + when "pushCalleeSaves" + if isARMv7 + $asm.puts "push {r4-r6, r8-r11}" + else + $asm.puts "push {r4-r10}" + end when "move" if operands[0].immediate? armMoveImmediate(operands[0].value, operands[1]) else $asm.puts "mov #{armFlippedOperands(operands)}" end + when "mvlbl" + $asm.puts "movw #{operands[1].armOperand}, \#:lower16:#{operands[0].value}" + $asm.puts "movt #{operands[1].armOperand}, \#:upper16:#{operands[0].value}" when "nop" $asm.puts "nop" when "bieq", "bpeq", "bbeq" @@ -579,6 +606,10 @@ class Instruction when "smulli" raise "Wrong number of arguments to smull in #{self.inspect} at #{codeOriginString}" unless operands.length == 4 $asm.puts "smull #{operands[2].armOperand}, #{operands[3].armOperand}, #{operands[0].armOperand}, #{operands[1].armOperand}" + when "memfence" + $asm.puts "dmb sy" + when "clrbp" + $asm.puts "bic #{operands[2].armOperand}, #{operands[0].armOperand}, #{operands[1].armOperand}" else lowerDefault end