diff --git a/smalltalksrc/VMMaker/DruidJIT.class.st b/smalltalksrc/VMMaker/DruidJIT.class.st index e27b0cec42..9704bc94e0 100644 --- a/smalltalksrc/VMMaker/DruidJIT.class.st +++ b/smalltalksrc/VMMaker/DruidJIT.class.st @@ -242,9 +242,11 @@ DruidJIT class >> bytecodeTable [ { 1. 115. 115. #gen_BytecodePrimNext. #isMapped }. { 1. 116. 116. #gen_BytecodePrimNextPut. #isMapped }. { 1. 117. 117. #gen_BytecodePrimAtEnd. #isMapped }. - { 1. 118. 118. #unknownBytecode }. + { 1. 118. 118. #gen_BytecodePrimIdenticalSistaV1. + #isMapped }. { 1. 119. 119. #unknownBytecode }. - { 1. 120. 120. #unknownBytecode }. + { 1. 120. 120. #gen_BytecodePrimNotIdenticalSistaV1. + #isMapped }. { 1. 121. 121. #gen_BytecodePrimValue. #isMapped }. { 1. 122. 122. #gen_BytecodePrimValueWithArg. #isMapped }. @@ -399,29 +401,29 @@ DruidJIT class >> bytecodeTable [ { 1. 199. 199. #gen_ShortConditionalJumpFalse7. #branch. #isBranchFalse. #isMapped. #v3:ShortForward:Branch:Distance: }. { 1. 200. 200. #gen_StoreAndPopReceiverVariableBytecode0. - #isInstVarRef. #is1ByteInstVarStore. #isMappedIfImmutability. - #needsFrameIfImmutability:. -1 }. + #isInstVarRef. #isMappedIfImmutability. #needsFrameIfImmutability:. + -1 }. { 1. 201. 201. #gen_StoreAndPopReceiverVariableBytecode1. - #isInstVarRef. #is1ByteInstVarStore. #isMappedIfImmutability. - #needsFrameIfImmutability:. -1 }. + #isInstVarRef. #isMappedIfImmutability. #needsFrameIfImmutability:. + -1 }. { 1. 202. 202. #gen_StoreAndPopReceiverVariableBytecode2. - #isInstVarRef. #is1ByteInstVarStore. #isMappedIfImmutability. - #needsFrameIfImmutability:. -1 }. + #isInstVarRef. #isMappedIfImmutability. #needsFrameIfImmutability:. + -1 }. { 1. 203. 203. #gen_StoreAndPopReceiverVariableBytecode3. - #isInstVarRef. #is1ByteInstVarStore. #isMappedIfImmutability. - #needsFrameIfImmutability:. -1 }. + #isInstVarRef. #isMappedIfImmutability. #needsFrameIfImmutability:. + -1 }. { 1. 204. 204. #gen_StoreAndPopReceiverVariableBytecode4. - #isInstVarRef. #is1ByteInstVarStore. #isMappedIfImmutability. - #needsFrameIfImmutability:. -1 }. + #isInstVarRef. #isMappedIfImmutability. #needsFrameIfImmutability:. + -1 }. { 1. 205. 205. #gen_StoreAndPopReceiverVariableBytecode5. - #isInstVarRef. #is1ByteInstVarStore. #isMappedIfImmutability. - #needsFrameIfImmutability:. -1 }. + #isInstVarRef. #isMappedIfImmutability. #needsFrameIfImmutability:. + -1 }. { 1. 206. 206. #gen_StoreAndPopReceiverVariableBytecode6. - #isInstVarRef. #is1ByteInstVarStore. #isMappedIfImmutability. - #needsFrameIfImmutability:. -1 }. + #isInstVarRef. #isMappedIfImmutability. #needsFrameIfImmutability:. + -1 }. { 1. 207. 207. #gen_StoreAndPopReceiverVariableBytecode7. - #isInstVarRef. #is1ByteInstVarStore. #isMappedIfImmutability. - #needsFrameIfImmutability:. -1 }. + #isInstVarRef. #isMappedIfImmutability. #needsFrameIfImmutability:. + -1 }. { 1. 208. 208. #gen_StoreAndPopTemporaryVariableBytecode0 }. { 1. 209. 209. #gen_StoreAndPopTemporaryVariableBytecode1 }. { 1. 210. 210. #gen_StoreAndPopTemporaryVariableBytecode2 }. @@ -441,7 +443,8 @@ DruidJIT class >> bytecodeTable [ { 1. 223. 223. #unknownBytecode }. { 2. 224. 224. #gen_ExtABytecode. #extension }. { 2. 225. 225. #gen_ExtBBytecode. #extension }. - { 2. 226. 226. #unknownBytecode }. + { 2. 226. 226. #gen_ExtPushReceiverVariableBytecode. + #isInstVarRef }. { 2. 227. 227. #gen_ExtPushLiteralVariableBytecode. #needsFrameNever:. 1 }. { 2. 228. 228. #gen_ExtPushLiteralBytecode. @@ -454,7 +457,7 @@ DruidJIT class >> bytecodeTable [ { 2. 233. 233. #gen_ExtPushCharacterBytecode. #needsFrameNever:. 1 }. { 2. 234. 234. #gen_ExtSendBytecode. #isMapped }. - { 2. 235. 235. #unknownBytecode }. + { 2. 235. 235. #gen_ExtSendSuperBytecode. #isMapped }. { 2. 236. 236. #unknownBytecode }. { 2. 237. 237. #gen_ExtUnconditionalJump. #branch. #isMapped. #v4:Long:Branch:Distance: }. @@ -464,16 +467,16 @@ DruidJIT class >> bytecodeTable [ #isMapped. #v4:Long:Branch:Distance: }. { 2. 240. 240. #unknownBytecode }. { 2. 241. 241. #unknownBytecode }. - { 2. 242. 242. #gen_LongStoreAndPopTemporaryVariableBytecode }. + { 2. 242. 242. #unknownBytecode }. { 2. 243. 243. #unknownBytecode }. { 2. 244. 244. #unknownBytecode }. { 2. 245. 245. #gen_LongStoreTemporaryVariableBytecode }. { 2. 246. 246. #unknownBytecode }. { 2. 247. 247. #unknownBytecode }. { 3. 248. 248. #unknownBytecode }. - { 3. 249. 249. #unknownBytecode }. + { 3. 249. 249. #gen_ExtPushFullClosureBytecode }. { 3. 250. 250. #unknownBytecode }. - { 3. 251. 251. #gen_PushRemoteTempLongBytecode }. + { 3. 251. 251. #unknownBytecode }. { 3. 252. 252. #unknownBytecode }. { 3. 253. 253. #unknownBytecode }. { 3. 254. 254. #unknownBytecode }. @@ -1845,174 +1848,13 @@ DruidJIT >> gen_BytecodePrimGreaterThanSistaV1 [ DruidJIT >> gen_BytecodePrimIdenticalSistaV1 [ "AutoGenerated by Druid" - | t2 t3 t4 t5 t6 t7 t8 jumpTrue t20 t9 t21 t22 b456 t10 t23 t11 t24 t12 t25 t13 t26 t14 t27 t15 jump1 t28 t16 jump2 t29 t17 jump3 t18 jump4 b461 t0 currentBlock t19 t1 jumpNext | - t0 := self allocateRegNotConflictingWith: 0. - (self ssValue: 1) moveToReg: t0. - t1 := self allocateRegNotConflictingWith: 0. - (self ssValue: 0) moveToReg: t1. - t2 := self allocateRegNotConflictingWith: 0. - self MoveR: t0 R: t2. - self AndCq: 7 R: t2. - self CmpCq: 0 R: t2. - jump1 := self JumpZero: 0. - t3 := self allocateRegNotConflictingWith: 0. - self MoveCq: 0 R: t3. - t4 := self allocateRegNotConflictingWith: 0. - self MoveR: t3 R: t4. - jump2 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. - t5 := self allocateRegNotConflictingWith: 0. - self MoveM64: 0 r: t0 R: t5. - self AndCq: 16r3FFFF7 R: t5. - t6 := self allocateRegNotConflictingWith: 0. - self CmpCq: 0 R: t5. - jumpTrue := self JumpZero: 0. - self MoveCq: 0 R: t6. - jumpNext := self Jump: 0. - jumpTrue jmpTarget: self Label. - self MoveCq: 1 R: t6. - jumpNext jmpTarget: self Label. - self MoveR: t6 R: t4. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - self CmpCq: 0 R: t4. - jump2 := self JumpNonZero: 0. - t7 := self allocateRegNotConflictingWith: 0. - self MoveR: t0 R: t7. - jump1 := self Jump: 0. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - t8 := self allocateRegNotConflictingWith: 0. - self MoveM64: 8 r: t0 R: t8. - t9 := self allocateRegNotConflictingWith: 0. - self MoveR: t8 R: t9. - b456 := self Label. - t10 := self allocateRegNotConflictingWith: 0. - self MoveR: t9 R: t10. - self AndCq: 7 R: t10. - self CmpCq: 0 R: t10. - jump2 := self JumpZero: 0. - t11 := self allocateRegNotConflictingWith: 0. - self MoveCq: 0 R: t11. - t12 := self allocateRegNotConflictingWith: 0. - self MoveR: t11 R: t12. - jump3 := self Jump: 0. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - t13 := self allocateRegNotConflictingWith: 0. - self MoveM64: 0 r: t9 R: t13. - self AndCq: 16r3FFFF7 R: t13. - t14 := self allocateRegNotConflictingWith: 0. - self CmpCq: 0 R: t13. - jumpTrue := self JumpZero: 0. - self MoveCq: 0 R: t14. - jumpNext := self Jump: 0. - jumpTrue jmpTarget: self Label. - self MoveCq: 1 R: t14. - jumpNext jmpTarget: self Label. - self MoveR: t14 R: t12. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. - self CmpCq: 0 R: t12. - jump3 := self JumpNonZero: 0. - self MoveR: t9 R: t7. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. - t15 := self allocateRegNotConflictingWith: 0. - self MoveR: t1 R: t15. - self AndCq: 7 R: t15. - self CmpCq: 0 R: t15. - jump1 := self JumpZero: 0. - t16 := self allocateRegNotConflictingWith: 0. - self MoveCq: 0 R: t16. - t17 := self allocateRegNotConflictingWith: 0. - self MoveR: t16 R: t17. - jump2 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. - t18 := self allocateRegNotConflictingWith: 0. - self MoveM64: 0 r: t1 R: t18. - self AndCq: 16r3FFFF7 R: t18. - t19 := self allocateRegNotConflictingWith: 0. - self CmpCq: 0 R: t18. - jumpTrue := self JumpZero: 0. - self MoveCq: 0 R: t19. - jumpNext := self Jump: 0. - jumpTrue jmpTarget: self Label. - self MoveCq: 1 R: t19. - jumpNext jmpTarget: self Label. - self MoveR: t19 R: t17. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - self CmpCq: 0 R: t17. - jump2 := self JumpNonZero: 0. - t20 := self allocateRegNotConflictingWith: 0. - self MoveR: t1 R: t20. - jump1 := self Jump: 0. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - t21 := self allocateRegNotConflictingWith: 0. - self MoveM64: 8 r: t1 R: t21. - t22 := self allocateRegNotConflictingWith: 0. - self MoveR: t21 R: t22. - b461 := self Label. - t23 := self allocateRegNotConflictingWith: 0. - self MoveR: t22 R: t23. - self AndCq: 7 R: t23. - self CmpCq: 0 R: t23. - jump2 := self JumpZero: 0. - t24 := self allocateRegNotConflictingWith: 0. - self MoveCq: 0 R: t24. - t25 := self allocateRegNotConflictingWith: 0. - self MoveR: t24 R: t25. - jump4 := self Jump: 0. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - t26 := self allocateRegNotConflictingWith: 0. - self MoveM64: 0 r: t22 R: t26. - self AndCq: 16r3FFFF7 R: t26. - t27 := self allocateRegNotConflictingWith: 0. - self CmpCq: 0 R: t26. - jumpTrue := self JumpZero: 0. - self MoveCq: 0 R: t27. - jumpNext := self Jump: 0. - jumpTrue jmpTarget: self Label. - self MoveCq: 1 R: t27. - jumpNext jmpTarget: self Label. - self MoveR: t27 R: t25. - currentBlock := self Label. - jump4 jmpTarget: currentBlock. - self CmpCq: 0 R: t25. - jump4 := self JumpNonZero: 0. - self MoveR: t22 R: t20. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. - self CmpR: t20 R: t7. - jump1 := self JumpZero: 0. - self ssPushConstant: objectMemory falseObject. - jump2 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. - self ssPop: 2. - self ssPushConstant: objectMemory trueObject. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - jump2 := self Jump: 0. - currentBlock := self Label. - jump4 jmpTarget: currentBlock. - t28 := self allocateRegNotConflictingWith: 0. - self MoveM64: 8 r: t22 R: t28. - self MoveR: t28 R: t22. - jump4 := self Jump: b461. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. - t29 := self allocateRegNotConflictingWith: 0. - self MoveM64: 8 r: t9 R: t29. - self MoveR: t29 R: t9. - jump3 := self Jump: b456. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. + | live currentBlock | + live := 0. + self marshallSendArguments: 1. + self + genMarshalledSend: -23 + numArgs: 1 + sendTable: ordinarySendTrampolines. ^ 0 ] @@ -2160,174 +2002,13 @@ DruidJIT >> gen_BytecodePrimNotEqualSistaV1 [ DruidJIT >> gen_BytecodePrimNotIdenticalSistaV1 [ "AutoGenerated by Druid" - | t2 t3 t4 t5 t6 t7 t8 jumpTrue t20 t9 t21 t22 b456 t10 t23 t11 t24 t12 t25 t13 t26 t14 t27 t15 jump1 t28 t16 jump2 t29 t17 jump3 t18 jump4 b461 t0 currentBlock t19 t1 jumpNext | - t0 := self allocateRegNotConflictingWith: 0. - (self ssValue: 1) moveToReg: t0. - t1 := self allocateRegNotConflictingWith: 0. - (self ssValue: 0) moveToReg: t1. - t2 := self allocateRegNotConflictingWith: 0. - self MoveR: t0 R: t2. - self AndCq: 7 R: t2. - self CmpCq: 0 R: t2. - jump1 := self JumpZero: 0. - t3 := self allocateRegNotConflictingWith: 0. - self MoveCq: 0 R: t3. - t4 := self allocateRegNotConflictingWith: 0. - self MoveR: t3 R: t4. - jump2 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. - t5 := self allocateRegNotConflictingWith: 0. - self MoveM64: 0 r: t0 R: t5. - self AndCq: 16r3FFFF7 R: t5. - t6 := self allocateRegNotConflictingWith: 0. - self CmpCq: 0 R: t5. - jumpTrue := self JumpZero: 0. - self MoveCq: 0 R: t6. - jumpNext := self Jump: 0. - jumpTrue jmpTarget: self Label. - self MoveCq: 1 R: t6. - jumpNext jmpTarget: self Label. - self MoveR: t6 R: t4. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - self CmpCq: 0 R: t4. - jump2 := self JumpNonZero: 0. - t7 := self allocateRegNotConflictingWith: 0. - self MoveR: t0 R: t7. - jump1 := self Jump: 0. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - t8 := self allocateRegNotConflictingWith: 0. - self MoveM64: 8 r: t0 R: t8. - t9 := self allocateRegNotConflictingWith: 0. - self MoveR: t8 R: t9. - b456 := self Label. - t10 := self allocateRegNotConflictingWith: 0. - self MoveR: t9 R: t10. - self AndCq: 7 R: t10. - self CmpCq: 0 R: t10. - jump2 := self JumpZero: 0. - t11 := self allocateRegNotConflictingWith: 0. - self MoveCq: 0 R: t11. - t12 := self allocateRegNotConflictingWith: 0. - self MoveR: t11 R: t12. - jump3 := self Jump: 0. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - t13 := self allocateRegNotConflictingWith: 0. - self MoveM64: 0 r: t9 R: t13. - self AndCq: 16r3FFFF7 R: t13. - t14 := self allocateRegNotConflictingWith: 0. - self CmpCq: 0 R: t13. - jumpTrue := self JumpZero: 0. - self MoveCq: 0 R: t14. - jumpNext := self Jump: 0. - jumpTrue jmpTarget: self Label. - self MoveCq: 1 R: t14. - jumpNext jmpTarget: self Label. - self MoveR: t14 R: t12. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. - self CmpCq: 0 R: t12. - jump3 := self JumpNonZero: 0. - self MoveR: t9 R: t7. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. - t15 := self allocateRegNotConflictingWith: 0. - self MoveR: t1 R: t15. - self AndCq: 7 R: t15. - self CmpCq: 0 R: t15. - jump1 := self JumpZero: 0. - t16 := self allocateRegNotConflictingWith: 0. - self MoveCq: 0 R: t16. - t17 := self allocateRegNotConflictingWith: 0. - self MoveR: t16 R: t17. - jump2 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. - t18 := self allocateRegNotConflictingWith: 0. - self MoveM64: 0 r: t1 R: t18. - self AndCq: 16r3FFFF7 R: t18. - t19 := self allocateRegNotConflictingWith: 0. - self CmpCq: 0 R: t18. - jumpTrue := self JumpZero: 0. - self MoveCq: 0 R: t19. - jumpNext := self Jump: 0. - jumpTrue jmpTarget: self Label. - self MoveCq: 1 R: t19. - jumpNext jmpTarget: self Label. - self MoveR: t19 R: t17. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - self CmpCq: 0 R: t17. - jump2 := self JumpNonZero: 0. - t20 := self allocateRegNotConflictingWith: 0. - self MoveR: t1 R: t20. - jump1 := self Jump: 0. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - t21 := self allocateRegNotConflictingWith: 0. - self MoveM64: 8 r: t1 R: t21. - t22 := self allocateRegNotConflictingWith: 0. - self MoveR: t21 R: t22. - b461 := self Label. - t23 := self allocateRegNotConflictingWith: 0. - self MoveR: t22 R: t23. - self AndCq: 7 R: t23. - self CmpCq: 0 R: t23. - jump2 := self JumpZero: 0. - t24 := self allocateRegNotConflictingWith: 0. - self MoveCq: 0 R: t24. - t25 := self allocateRegNotConflictingWith: 0. - self MoveR: t24 R: t25. - jump4 := self Jump: 0. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - t26 := self allocateRegNotConflictingWith: 0. - self MoveM64: 0 r: t22 R: t26. - self AndCq: 16r3FFFF7 R: t26. - t27 := self allocateRegNotConflictingWith: 0. - self CmpCq: 0 R: t26. - jumpTrue := self JumpZero: 0. - self MoveCq: 0 R: t27. - jumpNext := self Jump: 0. - jumpTrue jmpTarget: self Label. - self MoveCq: 1 R: t27. - jumpNext jmpTarget: self Label. - self MoveR: t27 R: t25. - currentBlock := self Label. - jump4 jmpTarget: currentBlock. - self CmpCq: 0 R: t25. - jump4 := self JumpNonZero: 0. - self MoveR: t22 R: t20. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. - self CmpR: t20 R: t7. - jump1 := self JumpNonZero: 0. - self ssPushConstant: objectMemory falseObject. - jump2 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. - self ssPop: 2. - self ssPushConstant: objectMemory trueObject. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. - jump2 := self Jump: 0. - currentBlock := self Label. - jump4 jmpTarget: currentBlock. - t28 := self allocateRegNotConflictingWith: 0. - self MoveM64: 8 r: t22 R: t28. - self MoveR: t28 R: t22. - jump4 := self Jump: b461. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. - t29 := self allocateRegNotConflictingWith: 0. - self MoveM64: 8 r: t9 R: t29. - self MoveR: t29 R: t9. - jump3 := self Jump: b456. - currentBlock := self Label. - jump2 jmpTarget: currentBlock. + | live currentBlock | + live := 0. + self marshallSendArguments: 1. + self + genMarshalledSend: -25 + numArgs: 1 + sendTable: ordinarySendTrampolines. ^ 0 ] @@ -2472,7 +2153,7 @@ DruidJIT >> gen_ExtBBytecode [ DruidJIT >> gen_ExtJumpIfFalse [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock r3 live jump2 | + | t0 jump1 currentBlock r3 live jump2 | live := 0. self annotateBytecode: self Label. r3 := extB. @@ -2487,21 +2168,21 @@ DruidJIT >> gen_ExtJumpIfFalse [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory falseObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory trueObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 1 + (byte1 + (r3 << 8)) + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory trueObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -2509,7 +2190,7 @@ DruidJIT >> gen_ExtJumpIfFalse [ DruidJIT >> gen_ExtJumpIfTrue [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock r3 live jump2 | + | t0 jump1 currentBlock r3 live jump2 | live := 0. self annotateBytecode: self Label. r3 := extB. @@ -2524,21 +2205,21 @@ DruidJIT >> gen_ExtJumpIfTrue [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory trueObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory falseObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 1 + (byte1 + (r3 << 8)) + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory falseObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -2567,6 +2248,75 @@ DruidJIT >> gen_ExtPushCharacterBytecode [ ^ 0 ] +{ #category : #generated } +DruidJIT >> gen_ExtPushFullClosureBytecode [ + "AutoGenerated by Druid" + + | t0 b10 r2 t1 currentBlock r42 live | + live := 0. + r2 := extA. + extA := 0. + t0 := self + allocateRegNotConflictingWith: live + ifNone: [ ^ self unknownBytecode ]. + live := live bitOr: (self registerMaskFor: t0). + self + genCreateFullClosureInIndex: (byte1 + (r2 << 8)) + numCopied: (byte2 bitAnd: 63) + ignoreContext: (byte2 anyMask: 64) + contextNumArgs: (byte2 anyMask: 128) + large: (coInterpreter methodNeedsLargeContext: methodObj) + inBlock: inBlock + intoRegister: t0. + r42 := 1. + b10 := self Label. + r42 := r42. + [ r42<=(byte2 bitAnd: 63) ] whileTrue: [ + | r42 t1 t2 | + t1 := self + allocateRegNotConflictingWith: live + ifNone: [ ^ self unknownBytecode ]. + live := live bitOr: (self registerMaskFor: t1). + (self ssValue: 0) copyToReg: t1. + self ssPop: 1. + t2 := self + allocateRegNotConflictingWith: live + ifNone: [ ^ self unknownBytecode ]. + live := live bitOr: (self registerMaskFor: t2). + self MoveR: t0 R: t2. + self + AddCq: + (((FullClosureFirstCopiedValueIndex + (byte2 bitAnd: 63)) - r42) << 3) + R: t2. + self MoveR: t1 M64: 8 r: t2. + r42 := r42 + 1 ]. + (byte2 anyMask: 128)=true ifTrue: [ + | t1 t2 | + t1 := self + allocateRegNotConflictingWith: live + ifNone: [ ^ self unknownBytecode ]. + live := live bitOr: (self registerMaskFor: t1). + (self ssValue: 0) copyToReg: t1. + self ssPop: 1. + t2 := self + allocateRegNotConflictingWith: live + ifNone: [ ^ self unknownBytecode ]. + live := live bitOr: (self registerMaskFor: t2). + self MoveR: t1 R: t2. + self MoveR: t2 M64: FullClosureReceiverIndex << 3 + 8 r: t0. + self ssPushRegister: t0. + ^ 0 ]. + self ensureReceiverResultRegContainsSelf. + t1 := self + allocateRegNotConflictingWith: live + ifNone: [ ^ self unknownBytecode ]. + live := live bitOr: (self registerMaskFor: t1). + self MoveR: ReceiverResultReg R: t1. + self MoveR: t1 M64: FullClosureReceiverIndex << 3 + 8 r: t0. + self ssPushRegister: t0. + ^ 0 +] + { #category : #generated } DruidJIT >> gen_ExtPushIntegerBytecode [ "AutoGenerated by Druid" @@ -2658,64 +2408,94 @@ DruidJIT >> gen_ExtPushLiteralVariableBytecode [ ] { #category : #generated } -DruidJIT >> gen_ExtSendBytecode [ +DruidJIT >> gen_ExtPushReceiverVariableBytecode [ "AutoGenerated by Druid" - | live r5 r13 currentBlock | + | live r2 currentBlock t0 | live := 0. - r5 := extA. + r2 := extA. extA := 0. - r13 := extB. - extB := 0. - numExtB := 0. - self marshallSendArguments: ((byte1 bitAnd: 7) + (r13 << 3)). - self - genMarshalledSend: ((byte1 >> 3) + (r5 << 5)) - numArgs: ((byte1 bitAnd: 7) + (r13 << 3)) - sendTable: ordinarySendTrampolines. - ^ 0 + self ensureReceiverResultRegContainsSelf. + t0 := self + allocateRegNotConflictingWith: live + ifNone: [ ^ self unknownBytecode ]. + live := live bitOr: (self registerMaskFor: t0). + self MoveR: ReceiverResultReg R: t0. + (byte1 + (r2 << 8))<=StackPointerIndex ifTrue: [ + | jump1 jump2 t1 | + t1 := self + allocateRegNotConflictingWith: live + ifNone: [ ^ self unknownBytecode ]. + live := live bitOr: (self registerMaskFor: t1). + self MoveM64: 0 r: t0 R: t1. + self AndCq: 16r3FFFFF R: t1. + self CmpCq: ClassMethodContextCompactIndex R: t1. + jump1 := self JumpNonZero: 0. + self ssFlushStack. + self deoptimize. + jump2 := self Jump: 0. + deadCode := false. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self ssPushBase: t0 offset: byte1 + (r2 << 8) << 3 + 8. + currentBlock := self Label. + jump2 jmpTarget: currentBlock. + ^ 0 ]. + self ssPushBase: t0 offset: byte1 + (r2 << 8) << 3 + 8. + ^ 0 +] + +{ #category : #generated } +DruidJIT >> gen_ExtSendBytecode [ + "AutoGenerated by Druid" + + | live r5 r13 currentBlock | + live := 0. + r5 := extA. + extA := 0. + r13 := extB. + extB := 0. + numExtB := 0. + self marshallSendArguments: ((byte1 bitAnd: 7) + (r13 << 3)). + self + genMarshalledSend: ((byte1 >> 3) + (r5 << 5)) + numArgs: ((byte1 bitAnd: 7) + (r13 << 3)) + sendTable: ordinarySendTrampolines. + ^ 0 ] { #category : #generated } DruidJIT >> gen_ExtSendSuperBytecode [ "AutoGenerated by Druid" - | live r5 r43 currentBlock | + | live r5 r46 currentBlock | live := 0. r5 := extA. extA := 0. BytecodeSetHasDirectedSuperSend=true ifTrue: [ - | r12 r43 | + | r12 r46 | r12 := extB. r12>=64 ifTrue: [ - | r17 | - r17 := extB. - extB := 0. - numExtB := 0. - self marshallSendArguments: ((byte1 bitAnd: 7) + ((r17 - 64) << 3)). - self - genMarshalledSend: ((byte1 >> 3) + (r5 << 5)) - numArgs: ((byte1 bitAnd: 7) + ((r17 - 64) << 3)) - sendTable: (directedSendUsesBinding - ifTrue: [directedSuperBindingSendTrampolines] - ifFalse: [directedSuperSendTrampolines]). + self ssFlushStack. + self deoptimize. + deadCode := false. ^ 0 ]. - r43 := extB. + r46 := extB. extB := 0. numExtB := 0. - self marshallSendArguments: ((byte1 bitAnd: 7) + (r43 << 3)). + self marshallSendArguments: ((byte1 bitAnd: 7) + (r46 << 3)). self genMarshalledSend: ((byte1 >> 3) + (r5 << 5)) - numArgs: ((byte1 bitAnd: 7) + (r43 << 3)) + numArgs: ((byte1 bitAnd: 7) + (r46 << 3)) sendTable: superSendTrampolines. ^ 0 ]. - r43 := extB. + r46 := extB. extB := 0. numExtB := 0. - self marshallSendArguments: ((byte1 bitAnd: 7) + (r43 << 3)). + self marshallSendArguments: ((byte1 bitAnd: 7) + (r46 << 3)). self genMarshalledSend: ((byte1 >> 3) + (r5 << 5)) - numArgs: ((byte1 bitAnd: 7) + (r43 << 3)) + numArgs: ((byte1 bitAnd: 7) + (r46 << 3)) sendTable: superSendTrampolines. ^ 0 ] @@ -3211,12 +2991,12 @@ DruidJIT >> gen_PrimitiveEqual [ jump1 := self JumpZero: 0. self MoveR: ReceiverResultReg R: ClassReg. self CmpR: Arg0Reg R: ClassReg. - jump2 := self JumpZero: 0. - self MoveCq: objectMemory falseObject R: ReceiverResultReg. + jump2 := self JumpNonZero: 0. + self MoveCq: objectMemory trueObject R: ReceiverResultReg. jump3 := self Jump: 0. currentBlock := self Label. jump2 jmpTarget: currentBlock. - self MoveCq: objectMemory trueObject R: ReceiverResultReg. + self MoveCq: objectMemory falseObject R: ReceiverResultReg. currentBlock := self Label. jump3 jmpTarget: currentBlock. self genPrimReturn. @@ -3237,12 +3017,12 @@ DruidJIT >> gen_PrimitiveGreaterOrEqual [ jump1 := self JumpZero: 0. self MoveR: ReceiverResultReg R: ClassReg. self CmpR: Arg0Reg R: ClassReg. - jump2 := self JumpGreaterOrEqual: 0. - self MoveCq: objectMemory falseObject R: ReceiverResultReg. + jump2 := self JumpLess: 0. + self MoveCq: objectMemory trueObject R: ReceiverResultReg. jump3 := self Jump: 0. currentBlock := self Label. jump2 jmpTarget: currentBlock. - self MoveCq: objectMemory trueObject R: ReceiverResultReg. + self MoveCq: objectMemory falseObject R: ReceiverResultReg. currentBlock := self Label. jump3 jmpTarget: currentBlock. self genPrimReturn. @@ -3263,12 +3043,12 @@ DruidJIT >> gen_PrimitiveGreaterThan [ jump1 := self JumpZero: 0. self MoveR: ReceiverResultReg R: ClassReg. self CmpR: Arg0Reg R: ClassReg. - jump2 := self JumpGreater: 0. - self MoveCq: objectMemory falseObject R: ReceiverResultReg. + jump2 := self JumpLessOrEqual: 0. + self MoveCq: objectMemory trueObject R: ReceiverResultReg. jump3 := self Jump: 0. currentBlock := self Label. jump2 jmpTarget: currentBlock. - self MoveCq: objectMemory trueObject R: ReceiverResultReg. + self MoveCq: objectMemory falseObject R: ReceiverResultReg. currentBlock := self Label. jump3 jmpTarget: currentBlock. self genPrimReturn. @@ -3289,12 +3069,12 @@ DruidJIT >> gen_PrimitiveLessOrEqual [ jump1 := self JumpZero: 0. self MoveR: ReceiverResultReg R: ClassReg. self CmpR: Arg0Reg R: ClassReg. - jump2 := self JumpLessOrEqual: 0. - self MoveCq: objectMemory falseObject R: ReceiverResultReg. + jump2 := self JumpGreater: 0. + self MoveCq: objectMemory trueObject R: ReceiverResultReg. jump3 := self Jump: 0. currentBlock := self Label. jump2 jmpTarget: currentBlock. - self MoveCq: objectMemory trueObject R: ReceiverResultReg. + self MoveCq: objectMemory falseObject R: ReceiverResultReg. currentBlock := self Label. jump3 jmpTarget: currentBlock. self genPrimReturn. @@ -3315,12 +3095,12 @@ DruidJIT >> gen_PrimitiveLessThan [ jump1 := self JumpZero: 0. self MoveR: ReceiverResultReg R: ClassReg. self CmpR: Arg0Reg R: ClassReg. - jump2 := self JumpLess: 0. - self MoveCq: objectMemory falseObject R: ReceiverResultReg. + jump2 := self JumpGreaterOrEqual: 0. + self MoveCq: objectMemory trueObject R: ReceiverResultReg. jump3 := self Jump: 0. currentBlock := self Label. jump2 jmpTarget: currentBlock. - self MoveCq: objectMemory trueObject R: ReceiverResultReg. + self MoveCq: objectMemory falseObject R: ReceiverResultReg. currentBlock := self Label. jump3 jmpTarget: currentBlock. self genPrimReturn. @@ -5671,7 +5451,7 @@ DruidJIT >> gen_PushReceiverVariableBytecode9 [ DruidJIT >> gen_PushRemoteTempLongBytecode [ "AutoGenerated by Druid" - | live currentBlock t0 | + | live t1 currentBlock t0 | live := 0. t0 := self allocateRegNotConflictingWith: live @@ -5679,7 +5459,7 @@ DruidJIT >> gen_PushRemoteTempLongBytecode [ live := live bitOr: (self registerMaskFor: t0). (self simStackTempAt: byte2) copyToReg: t0. TempVectReadBarrier=true ifTrue: [ - | jumpTrue jumpNext jump1 jump3 b201 t1 jump2 t2 | + | jumpTrue jumpNext jump1 jump3 b201 t1 jump4 jump2 t2 | t1 := self allocateRegNotConflictingWith: live ifNone: [ ^ self unknownBytecode ]. @@ -5687,53 +5467,52 @@ DruidJIT >> gen_PushRemoteTempLongBytecode [ self MoveM64: 0 r: t0 R: t1. self AndCq: 16r3FFFF7 R: t1. self CmpCq: 0 R: t1. - jump1 := self JumpZero: 0. - self MoveR: t0 R: t1. - jump2 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self MoveM64: 8 r: t0 R: t1. + b201 := self Label. + self MoveR: t1 R: t0. + self AndCq: 7 R: t0. + self CmpCq: 0 R: t0. + jump2 := self JumpNonZero: 0. + self MoveM64: 0 r: t1 R: t0. + self AndCq: 16r3FFFF7 R: t0. t2 := self allocateRegNotConflictingWith: live ifNone: [ ^ self unknownBytecode ]. live := live bitOr: (self registerMaskFor: t2). - self MoveR: t1 R: t2. - b201 := self Label. - self MoveR: t2 R: t1. - self AndCq: 7 R: t1. - self CmpCq: 0 R: t1. - jump1 := self JumpNonZero: 0. - self MoveM64: 0 r: t2 R: t1. - self AndCq: 16r3FFFF7 R: t1. - self MoveR: t1 R: t0. - self CmpCq: 0 R: t0. + self MoveR: t0 R: t2. + self CmpCq: 0 R: t2. jumpTrue := self JumpZero: 0. - self MoveCq: 0 R: t0. + self MoveCq: 0 R: t2. jumpNext := self Jump: 0. jumpTrue jmpTarget: self Label. - self MoveCq: 1 R: t0. + self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. - self CmpCq: 0 R: t1. - jump3 := self JumpZero: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + self CmpCq: 0 R: t0. + jump3 := self JumpNonZero: 0. + self MoveM64: 8 r: t1 R: t2. self MoveR: t2 R: t1. + jump4 := self Jump: b201. currentBlock := self Label. jump2 jmpTarget: currentBlock. - self MoveR: t1 R: t0. - jump2 := self Jump: 0. - currentBlock := self Label. jump3 jmpTarget: currentBlock. - self MoveM64: 8 r: t2 R: t0. + self MoveR: t1 R: t2. + jump3 := self Jump: 0. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. self MoveR: t0 R: t2. - jump3 := self Jump: b201. currentBlock := self Label. - jump2 jmpTarget: currentBlock. - self AddCq: (byte1 << 3) R: t0. - self ssPushBase: t0 offset: 8. + jump3 jmpTarget: currentBlock. + self AddCq: (byte1 << 3) R: t2. + self ssPushBase: t2 offset: 8. ^ 0 ]. - self AddCq: (byte1 << 3) R: t0. - self ssPushBase: t0 offset: 8. + t1 := self + allocateRegNotConflictingWith: live + ifNone: [ ^ self unknownBytecode ]. + live := live bitOr: (self registerMaskFor: t1). + self MoveR: t0 R: t1. + self AddCq: (byte1 << 3) R: t1. + self ssPushBase: t1 offset: 8. ^ 0 ] @@ -6708,7 +6487,7 @@ DruidJIT >> gen_SendLiteralSelector2ArgsBytecode9 [ DruidJIT >> gen_ShortConditionalJumpFalse0 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -6719,20 +6498,20 @@ DruidJIT >> gen_ShortConditionalJumpFalse0 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory falseObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory trueObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 1 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory trueObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -6740,7 +6519,7 @@ DruidJIT >> gen_ShortConditionalJumpFalse0 [ DruidJIT >> gen_ShortConditionalJumpFalse1 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -6751,20 +6530,20 @@ DruidJIT >> gen_ShortConditionalJumpFalse1 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory falseObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory trueObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 2 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory trueObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -6772,7 +6551,7 @@ DruidJIT >> gen_ShortConditionalJumpFalse1 [ DruidJIT >> gen_ShortConditionalJumpFalse2 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -6783,20 +6562,20 @@ DruidJIT >> gen_ShortConditionalJumpFalse2 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory falseObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory trueObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 3 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory trueObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -6804,7 +6583,7 @@ DruidJIT >> gen_ShortConditionalJumpFalse2 [ DruidJIT >> gen_ShortConditionalJumpFalse3 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -6815,20 +6594,20 @@ DruidJIT >> gen_ShortConditionalJumpFalse3 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory falseObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory trueObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 4 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory trueObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -6836,7 +6615,7 @@ DruidJIT >> gen_ShortConditionalJumpFalse3 [ DruidJIT >> gen_ShortConditionalJumpFalse4 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -6847,20 +6626,20 @@ DruidJIT >> gen_ShortConditionalJumpFalse4 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory falseObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory trueObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 5 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory trueObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -6868,7 +6647,7 @@ DruidJIT >> gen_ShortConditionalJumpFalse4 [ DruidJIT >> gen_ShortConditionalJumpFalse5 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -6879,20 +6658,20 @@ DruidJIT >> gen_ShortConditionalJumpFalse5 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory falseObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory trueObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 6 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory trueObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -6900,7 +6679,7 @@ DruidJIT >> gen_ShortConditionalJumpFalse5 [ DruidJIT >> gen_ShortConditionalJumpFalse6 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -6911,20 +6690,20 @@ DruidJIT >> gen_ShortConditionalJumpFalse6 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory falseObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory trueObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 7 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory trueObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -6932,7 +6711,7 @@ DruidJIT >> gen_ShortConditionalJumpFalse6 [ DruidJIT >> gen_ShortConditionalJumpFalse7 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -6943,20 +6722,20 @@ DruidJIT >> gen_ShortConditionalJumpFalse7 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory falseObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory trueObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 8 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory trueObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -6964,7 +6743,7 @@ DruidJIT >> gen_ShortConditionalJumpFalse7 [ DruidJIT >> gen_ShortConditionalJumpTrue0 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -6975,20 +6754,20 @@ DruidJIT >> gen_ShortConditionalJumpTrue0 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory trueObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory falseObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 1 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory falseObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -6996,7 +6775,7 @@ DruidJIT >> gen_ShortConditionalJumpTrue0 [ DruidJIT >> gen_ShortConditionalJumpTrue1 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -7007,20 +6786,20 @@ DruidJIT >> gen_ShortConditionalJumpTrue1 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory trueObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory falseObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 2 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory falseObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -7028,7 +6807,7 @@ DruidJIT >> gen_ShortConditionalJumpTrue1 [ DruidJIT >> gen_ShortConditionalJumpTrue2 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -7039,20 +6818,20 @@ DruidJIT >> gen_ShortConditionalJumpTrue2 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory trueObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory falseObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 3 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory falseObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -7060,7 +6839,7 @@ DruidJIT >> gen_ShortConditionalJumpTrue2 [ DruidJIT >> gen_ShortConditionalJumpTrue3 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -7071,20 +6850,20 @@ DruidJIT >> gen_ShortConditionalJumpTrue3 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory trueObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory falseObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 4 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory falseObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -7092,7 +6871,7 @@ DruidJIT >> gen_ShortConditionalJumpTrue3 [ DruidJIT >> gen_ShortConditionalJumpTrue4 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -7103,20 +6882,20 @@ DruidJIT >> gen_ShortConditionalJumpTrue4 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory trueObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory falseObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 5 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory falseObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -7124,7 +6903,7 @@ DruidJIT >> gen_ShortConditionalJumpTrue4 [ DruidJIT >> gen_ShortConditionalJumpTrue5 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -7135,20 +6914,20 @@ DruidJIT >> gen_ShortConditionalJumpTrue5 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory trueObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory falseObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 6 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory falseObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -7156,7 +6935,7 @@ DruidJIT >> gen_ShortConditionalJumpTrue5 [ DruidJIT >> gen_ShortConditionalJumpTrue6 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -7167,20 +6946,20 @@ DruidJIT >> gen_ShortConditionalJumpTrue6 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory trueObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory falseObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 7 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory falseObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -7188,7 +6967,7 @@ DruidJIT >> gen_ShortConditionalJumpTrue6 [ DruidJIT >> gen_ShortConditionalJumpTrue7 [ "AutoGenerated by Druid" - | t0 jump3 jump1 currentBlock jump2 live | + | t0 jump1 currentBlock jump2 live | live := 0. self annotateBytecode: self Label. t0 := self @@ -7199,20 +6978,20 @@ DruidJIT >> gen_ShortConditionalJumpTrue7 [ self ssPop: 1. self ssFlushStack. self CmpCq: objectMemory trueObject R: t0. - jump1 := self JumpZero: 0. - self CmpCq: objectMemory falseObject R: t0. - jump2 := self JumpZero: 0. - self MoveR: t0 R: TempReg. - self CallRT: ceSendMustBeBooleanTrampoline. - jump3 := self Jump: 0. - currentBlock := self Label. - jump1 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self Jump: (self ensureFixupAt: bytecodePC + 0 + 8 + 1). deadCode := true. + jump2 := self Jump: 0. deadCode := false. currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self CmpCq: objectMemory falseObject R: t0. + jump1 := self JumpZero: 0. + self MoveR: t0 R: TempReg. + self CallRT: ceSendMustBeBooleanTrampoline. + currentBlock := self Label. jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. ^ 0 ] @@ -7316,7 +7095,7 @@ DruidJIT >> gen_ShortUnconditionalJump7 [ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode0 [ "AutoGenerated by Druid" - | jump1 jump7 jumpNext t1 jump6 jump3 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | + | jump1 jump7 jumpNext t1 jump6 jump3 jump9 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | live := 0. self annotateBytecode: self Label. self ensureReceiverResultRegContainsSelf. @@ -7330,7 +7109,6 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode0 [ ifNone: [ ^ self unknownBytecode ]. live := live bitOr: (self registerMaskFor: t1). (self ssValue: 0) copyToReg: t1. - self ssPop: 1. t2 := self allocateRegNotConflictingWith: live ifNone: [ ^ self unknownBytecode ]. @@ -7338,13 +7116,19 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode0 [ self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 23 R: t2. self AndCq: 1 R: t2. + self ssFlushStack. self CmpCq: 0 R: t2. - jump1 := self JumpNonZero: 0. + jump1 := self JumpZero: 0. + self deoptimize. + jump2 := self Jump: 0. + deadCode := false. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self ssPop: 1. self MoveR: t0 R: t2. self AndCq: 7 R: t2. - self ssFlushStack. self CmpCq: 0 R: t2. - jump2 := self JumpNonZero: 0. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getOldSpaceMask R: t2. @@ -7356,11 +7140,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode0 [ self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceMask R: t2. - jump5 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump5 := self JumpNonZero: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t2. jumpTrue := self JumpGreaterOrEqual: 0. @@ -7370,39 +7150,34 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode0 [ self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. self CmpCq: 1 R: t2. - jump5 := self JumpZero: 0. - currentBlock := self Label. - jump6 jmpTarget: currentBlock. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump6 := self JumpNonZero: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. self TstCq: 7 R: t1. - jump7 := self JumpNonZero: 0. - jump8 := self JumpZero: 0. + jump8 := self JumpNonZero: 0. + jump9 := self JumpZero: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump5 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. self TstCq: 7 R: t1. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. self CmpCq: objectMemory nilObject R: t1. - jump8 := self JumpAboveOrEqual: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 := self JumpBelow: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory trueObject R: t2. jumpTrue := self JumpLessOrEqual: 0. @@ -7411,25 +7186,25 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode0 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump4 := self Jump: 0. currentBlock := self Label. - jump6 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump4 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump6 := self JumpZero: 0. + jump4 := self JumpZero: 0. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t1. - jump8 := self JumpLess: 0. + jump9 := self JumpLess: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump4 := self JumpNonZero: 0. + jump3 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: 7 R: t2. self CmpCq: 0 R: t2. - jump3 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump2 := self Jump: 0. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. @@ -7439,32 +7214,32 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode0 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump6 := self Jump: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump2 := self JumpNonZero: 0. + jump6 := self JumpNonZero: 0. self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. - jump3 := self JumpZero: 0. + jump1 := self JumpZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. currentBlock := self Label. - jump7 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. jump8 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump2 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. - self MoveR: t1 M64: 8 r: t0. - jump3 := self Jump: 0. - currentBlock := self Label. + jump6 jmpTarget: currentBlock. jump1 jmpTarget: currentBlock. - self deoptimize. + self MoveR: t1 M64: 8 r: t0. currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump2 jmpTarget: currentBlock. ^ 0 ] @@ -7472,7 +7247,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode0 [ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode1 [ "AutoGenerated by Druid" - | jump1 jump7 jumpNext t1 jump6 jump3 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | + | jump1 jump7 jumpNext t1 jump6 jump3 jump9 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | live := 0. self annotateBytecode: self Label. self ensureReceiverResultRegContainsSelf. @@ -7486,7 +7261,6 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode1 [ ifNone: [ ^ self unknownBytecode ]. live := live bitOr: (self registerMaskFor: t1). (self ssValue: 0) copyToReg: t1. - self ssPop: 1. t2 := self allocateRegNotConflictingWith: live ifNone: [ ^ self unknownBytecode ]. @@ -7494,13 +7268,19 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode1 [ self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 23 R: t2. self AndCq: 1 R: t2. + self ssFlushStack. self CmpCq: 0 R: t2. - jump1 := self JumpNonZero: 0. + jump1 := self JumpZero: 0. + self deoptimize. + jump2 := self Jump: 0. + deadCode := false. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self ssPop: 1. self MoveR: t0 R: t2. self AndCq: 7 R: t2. - self ssFlushStack. self CmpCq: 0 R: t2. - jump2 := self JumpNonZero: 0. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getOldSpaceMask R: t2. @@ -7512,11 +7292,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode1 [ self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceMask R: t2. - jump5 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump5 := self JumpNonZero: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t2. jumpTrue := self JumpGreaterOrEqual: 0. @@ -7526,39 +7302,34 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode1 [ self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. self CmpCq: 1 R: t2. - jump5 := self JumpZero: 0. - currentBlock := self Label. - jump6 jmpTarget: currentBlock. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump6 := self JumpNonZero: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. self TstCq: 7 R: t1. - jump7 := self JumpNonZero: 0. - jump8 := self JumpZero: 0. + jump8 := self JumpNonZero: 0. + jump9 := self JumpZero: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. - jump3 jmpTarget: currentBlock. - jump4 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. jump5 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. + jump3 jmpTarget: currentBlock. + jump4 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. self TstCq: 7 R: t1. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. self CmpCq: objectMemory nilObject R: t1. - jump8 := self JumpAboveOrEqual: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 := self JumpBelow: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory trueObject R: t2. jumpTrue := self JumpLessOrEqual: 0. @@ -7567,25 +7338,25 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode1 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump4 := self Jump: 0. currentBlock := self Label. - jump6 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump4 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump6 := self JumpZero: 0. + jump4 := self JumpZero: 0. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t1. - jump8 := self JumpLess: 0. + jump9 := self JumpLess: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump4 := self JumpNonZero: 0. + jump3 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: 7 R: t2. self CmpCq: 0 R: t2. - jump3 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump2 := self Jump: 0. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. @@ -7595,32 +7366,32 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode1 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump6 := self Jump: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump2 := self JumpNonZero: 0. + jump6 := self JumpNonZero: 0. self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. - jump3 := self JumpZero: 0. + jump1 := self JumpZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. currentBlock := self Label. - jump7 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. jump8 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump2 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. - self MoveR: t1 M64: 16 r: t0. - jump3 := self Jump: 0. - currentBlock := self Label. + jump6 jmpTarget: currentBlock. jump1 jmpTarget: currentBlock. - self deoptimize. + self MoveR: t1 M64: 16 r: t0. currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump2 jmpTarget: currentBlock. ^ 0 ] @@ -7628,7 +7399,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode1 [ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode2 [ "AutoGenerated by Druid" - | jump1 jump7 jumpNext t1 jump6 jump3 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | + | jump1 jump7 jumpNext t1 jump6 jump3 jump9 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | live := 0. self annotateBytecode: self Label. self ensureReceiverResultRegContainsSelf. @@ -7642,7 +7413,6 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode2 [ ifNone: [ ^ self unknownBytecode ]. live := live bitOr: (self registerMaskFor: t1). (self ssValue: 0) copyToReg: t1. - self ssPop: 1. t2 := self allocateRegNotConflictingWith: live ifNone: [ ^ self unknownBytecode ]. @@ -7650,13 +7420,19 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode2 [ self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 23 R: t2. self AndCq: 1 R: t2. + self ssFlushStack. self CmpCq: 0 R: t2. - jump1 := self JumpNonZero: 0. + jump1 := self JumpZero: 0. + self deoptimize. + jump2 := self Jump: 0. + deadCode := false. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self ssPop: 1. self MoveR: t0 R: t2. self AndCq: 7 R: t2. - self ssFlushStack. self CmpCq: 0 R: t2. - jump2 := self JumpNonZero: 0. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getOldSpaceMask R: t2. @@ -7668,11 +7444,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode2 [ self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceMask R: t2. - jump5 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump5 := self JumpNonZero: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t2. jumpTrue := self JumpGreaterOrEqual: 0. @@ -7682,39 +7454,34 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode2 [ self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. self CmpCq: 1 R: t2. - jump5 := self JumpZero: 0. - currentBlock := self Label. - jump6 jmpTarget: currentBlock. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump6 := self JumpNonZero: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. self TstCq: 7 R: t1. - jump7 := self JumpNonZero: 0. - jump8 := self JumpZero: 0. + jump8 := self JumpNonZero: 0. + jump9 := self JumpZero: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump5 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. self TstCq: 7 R: t1. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. self CmpCq: objectMemory nilObject R: t1. - jump8 := self JumpAboveOrEqual: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 := self JumpBelow: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory trueObject R: t2. jumpTrue := self JumpLessOrEqual: 0. @@ -7723,25 +7490,25 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode2 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump4 := self Jump: 0. currentBlock := self Label. - jump6 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump4 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump6 := self JumpZero: 0. + jump4 := self JumpZero: 0. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t1. - jump8 := self JumpLess: 0. + jump9 := self JumpLess: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump4 := self JumpNonZero: 0. + jump3 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: 7 R: t2. self CmpCq: 0 R: t2. - jump3 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump2 := self Jump: 0. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. @@ -7751,32 +7518,32 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode2 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump6 := self Jump: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump2 := self JumpNonZero: 0. + jump6 := self JumpNonZero: 0. self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. - jump3 := self JumpZero: 0. + jump1 := self JumpZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. currentBlock := self Label. - jump7 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. jump8 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump2 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. - self MoveR: t1 M64: 24 r: t0. - jump3 := self Jump: 0. - currentBlock := self Label. + jump6 jmpTarget: currentBlock. jump1 jmpTarget: currentBlock. - self deoptimize. + self MoveR: t1 M64: 24 r: t0. currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump2 jmpTarget: currentBlock. ^ 0 ] @@ -7784,7 +7551,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode2 [ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode3 [ "AutoGenerated by Druid" - | jump1 jump7 jumpNext t1 jump6 jump3 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | + | jump1 jump7 jumpNext t1 jump6 jump3 jump9 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | live := 0. self annotateBytecode: self Label. self ensureReceiverResultRegContainsSelf. @@ -7798,7 +7565,6 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode3 [ ifNone: [ ^ self unknownBytecode ]. live := live bitOr: (self registerMaskFor: t1). (self ssValue: 0) copyToReg: t1. - self ssPop: 1. t2 := self allocateRegNotConflictingWith: live ifNone: [ ^ self unknownBytecode ]. @@ -7806,13 +7572,19 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode3 [ self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 23 R: t2. self AndCq: 1 R: t2. + self ssFlushStack. self CmpCq: 0 R: t2. - jump1 := self JumpNonZero: 0. + jump1 := self JumpZero: 0. + self deoptimize. + jump2 := self Jump: 0. + deadCode := false. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self ssPop: 1. self MoveR: t0 R: t2. self AndCq: 7 R: t2. - self ssFlushStack. self CmpCq: 0 R: t2. - jump2 := self JumpNonZero: 0. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getOldSpaceMask R: t2. @@ -7824,11 +7596,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode3 [ self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceMask R: t2. - jump5 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump5 := self JumpNonZero: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t2. jumpTrue := self JumpGreaterOrEqual: 0. @@ -7838,39 +7606,34 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode3 [ self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. self CmpCq: 1 R: t2. - jump5 := self JumpZero: 0. - currentBlock := self Label. - jump6 jmpTarget: currentBlock. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump6 := self JumpNonZero: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. self TstCq: 7 R: t1. - jump7 := self JumpNonZero: 0. - jump8 := self JumpZero: 0. + jump8 := self JumpNonZero: 0. + jump9 := self JumpZero: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump5 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. self TstCq: 7 R: t1. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. self CmpCq: objectMemory nilObject R: t1. - jump8 := self JumpAboveOrEqual: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 := self JumpBelow: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory trueObject R: t2. jumpTrue := self JumpLessOrEqual: 0. @@ -7879,25 +7642,25 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode3 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump4 := self Jump: 0. currentBlock := self Label. - jump6 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump4 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump6 := self JumpZero: 0. + jump4 := self JumpZero: 0. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t1. - jump8 := self JumpLess: 0. + jump9 := self JumpLess: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump4 := self JumpNonZero: 0. + jump3 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: 7 R: t2. self CmpCq: 0 R: t2. - jump3 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump2 := self Jump: 0. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. @@ -7907,32 +7670,32 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode3 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump6 := self Jump: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump2 := self JumpNonZero: 0. + jump6 := self JumpNonZero: 0. self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. - jump3 := self JumpZero: 0. + jump1 := self JumpZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. currentBlock := self Label. - jump7 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. jump8 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump2 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. - self MoveR: t1 M64: 32 r: t0. - jump3 := self Jump: 0. - currentBlock := self Label. + jump6 jmpTarget: currentBlock. jump1 jmpTarget: currentBlock. - self deoptimize. + self MoveR: t1 M64: 32 r: t0. currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump2 jmpTarget: currentBlock. ^ 0 ] @@ -7940,7 +7703,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode3 [ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode4 [ "AutoGenerated by Druid" - | jump1 jump7 jumpNext t1 jump6 jump3 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | + | jump1 jump7 jumpNext t1 jump6 jump3 jump9 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | live := 0. self annotateBytecode: self Label. self ensureReceiverResultRegContainsSelf. @@ -7954,7 +7717,6 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode4 [ ifNone: [ ^ self unknownBytecode ]. live := live bitOr: (self registerMaskFor: t1). (self ssValue: 0) copyToReg: t1. - self ssPop: 1. t2 := self allocateRegNotConflictingWith: live ifNone: [ ^ self unknownBytecode ]. @@ -7962,13 +7724,19 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode4 [ self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 23 R: t2. self AndCq: 1 R: t2. + self ssFlushStack. self CmpCq: 0 R: t2. - jump1 := self JumpNonZero: 0. + jump1 := self JumpZero: 0. + self deoptimize. + jump2 := self Jump: 0. + deadCode := false. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self ssPop: 1. self MoveR: t0 R: t2. self AndCq: 7 R: t2. - self ssFlushStack. self CmpCq: 0 R: t2. - jump2 := self JumpNonZero: 0. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getOldSpaceMask R: t2. @@ -7980,11 +7748,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode4 [ self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceMask R: t2. - jump5 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump5 := self JumpNonZero: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t2. jumpTrue := self JumpGreaterOrEqual: 0. @@ -7994,39 +7758,34 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode4 [ self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. self CmpCq: 1 R: t2. - jump5 := self JumpZero: 0. - currentBlock := self Label. - jump6 jmpTarget: currentBlock. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump6 := self JumpNonZero: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. self TstCq: 7 R: t1. - jump7 := self JumpNonZero: 0. - jump8 := self JumpZero: 0. + jump8 := self JumpNonZero: 0. + jump9 := self JumpZero: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump5 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. self TstCq: 7 R: t1. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. self CmpCq: objectMemory nilObject R: t1. - jump8 := self JumpAboveOrEqual: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 := self JumpBelow: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory trueObject R: t2. jumpTrue := self JumpLessOrEqual: 0. @@ -8035,25 +7794,25 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode4 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump4 := self Jump: 0. currentBlock := self Label. - jump6 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump4 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump6 := self JumpZero: 0. + jump4 := self JumpZero: 0. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t1. - jump8 := self JumpLess: 0. + jump9 := self JumpLess: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump4 := self JumpNonZero: 0. + jump3 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: 7 R: t2. self CmpCq: 0 R: t2. - jump3 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump2 := self Jump: 0. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. @@ -8063,32 +7822,32 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode4 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump6 := self Jump: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump2 := self JumpNonZero: 0. + jump6 := self JumpNonZero: 0. self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. - jump3 := self JumpZero: 0. + jump1 := self JumpZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. currentBlock := self Label. - jump7 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. jump8 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump2 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. - self MoveR: t1 M64: 40 r: t0. - jump3 := self Jump: 0. - currentBlock := self Label. + jump6 jmpTarget: currentBlock. jump1 jmpTarget: currentBlock. - self deoptimize. + self MoveR: t1 M64: 40 r: t0. currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump2 jmpTarget: currentBlock. ^ 0 ] @@ -8096,7 +7855,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode4 [ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode5 [ "AutoGenerated by Druid" - | jump1 jump7 jumpNext t1 jump6 jump3 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | + | jump1 jump7 jumpNext t1 jump6 jump3 jump9 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | live := 0. self annotateBytecode: self Label. self ensureReceiverResultRegContainsSelf. @@ -8110,7 +7869,6 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode5 [ ifNone: [ ^ self unknownBytecode ]. live := live bitOr: (self registerMaskFor: t1). (self ssValue: 0) copyToReg: t1. - self ssPop: 1. t2 := self allocateRegNotConflictingWith: live ifNone: [ ^ self unknownBytecode ]. @@ -8118,13 +7876,19 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode5 [ self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 23 R: t2. self AndCq: 1 R: t2. + self ssFlushStack. self CmpCq: 0 R: t2. - jump1 := self JumpNonZero: 0. + jump1 := self JumpZero: 0. + self deoptimize. + jump2 := self Jump: 0. + deadCode := false. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self ssPop: 1. self MoveR: t0 R: t2. self AndCq: 7 R: t2. - self ssFlushStack. self CmpCq: 0 R: t2. - jump2 := self JumpNonZero: 0. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getOldSpaceMask R: t2. @@ -8136,11 +7900,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode5 [ self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceMask R: t2. - jump5 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump5 := self JumpNonZero: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t2. jumpTrue := self JumpGreaterOrEqual: 0. @@ -8150,39 +7910,34 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode5 [ self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. self CmpCq: 1 R: t2. - jump5 := self JumpZero: 0. - currentBlock := self Label. - jump6 jmpTarget: currentBlock. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump6 := self JumpNonZero: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. self TstCq: 7 R: t1. - jump7 := self JumpNonZero: 0. - jump8 := self JumpZero: 0. + jump8 := self JumpNonZero: 0. + jump9 := self JumpZero: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump5 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. self TstCq: 7 R: t1. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. self CmpCq: objectMemory nilObject R: t1. - jump8 := self JumpAboveOrEqual: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 := self JumpBelow: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory trueObject R: t2. jumpTrue := self JumpLessOrEqual: 0. @@ -8191,25 +7946,25 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode5 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump4 := self Jump: 0. currentBlock := self Label. - jump6 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump4 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump6 := self JumpZero: 0. + jump4 := self JumpZero: 0. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t1. - jump8 := self JumpLess: 0. + jump9 := self JumpLess: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump4 := self JumpNonZero: 0. + jump3 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: 7 R: t2. self CmpCq: 0 R: t2. - jump3 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump2 := self Jump: 0. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. @@ -8219,32 +7974,32 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode5 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump6 := self Jump: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump2 := self JumpNonZero: 0. + jump6 := self JumpNonZero: 0. self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. - jump3 := self JumpZero: 0. + jump1 := self JumpZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. currentBlock := self Label. - jump7 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. jump8 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump2 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. - self MoveR: t1 M64: 48 r: t0. - jump3 := self Jump: 0. - currentBlock := self Label. + jump6 jmpTarget: currentBlock. jump1 jmpTarget: currentBlock. - self deoptimize. + self MoveR: t1 M64: 48 r: t0. currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump2 jmpTarget: currentBlock. ^ 0 ] @@ -8252,7 +8007,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode5 [ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode6 [ "AutoGenerated by Druid" - | jump1 jump7 jumpNext t1 jump6 jump3 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | + | jump1 jump7 jumpNext t1 jump6 jump3 jump9 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | live := 0. self annotateBytecode: self Label. self ensureReceiverResultRegContainsSelf. @@ -8266,7 +8021,6 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode6 [ ifNone: [ ^ self unknownBytecode ]. live := live bitOr: (self registerMaskFor: t1). (self ssValue: 0) copyToReg: t1. - self ssPop: 1. t2 := self allocateRegNotConflictingWith: live ifNone: [ ^ self unknownBytecode ]. @@ -8274,13 +8028,19 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode6 [ self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 23 R: t2. self AndCq: 1 R: t2. + self ssFlushStack. self CmpCq: 0 R: t2. - jump1 := self JumpNonZero: 0. + jump1 := self JumpZero: 0. + self deoptimize. + jump2 := self Jump: 0. + deadCode := false. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self ssPop: 1. self MoveR: t0 R: t2. self AndCq: 7 R: t2. - self ssFlushStack. self CmpCq: 0 R: t2. - jump2 := self JumpNonZero: 0. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getOldSpaceMask R: t2. @@ -8292,11 +8052,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode6 [ self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceMask R: t2. - jump5 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump5 := self JumpNonZero: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t2. jumpTrue := self JumpGreaterOrEqual: 0. @@ -8306,39 +8062,34 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode6 [ self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. self CmpCq: 1 R: t2. - jump5 := self JumpZero: 0. - currentBlock := self Label. - jump6 jmpTarget: currentBlock. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump6 := self JumpNonZero: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. self TstCq: 7 R: t1. - jump7 := self JumpNonZero: 0. - jump8 := self JumpZero: 0. + jump8 := self JumpNonZero: 0. + jump9 := self JumpZero: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump5 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. self TstCq: 7 R: t1. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. self CmpCq: objectMemory nilObject R: t1. - jump8 := self JumpAboveOrEqual: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 := self JumpBelow: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory trueObject R: t2. jumpTrue := self JumpLessOrEqual: 0. @@ -8347,25 +8098,25 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode6 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump4 := self Jump: 0. currentBlock := self Label. - jump6 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump4 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump6 := self JumpZero: 0. + jump4 := self JumpZero: 0. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t1. - jump8 := self JumpLess: 0. + jump9 := self JumpLess: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump4 := self JumpNonZero: 0. + jump3 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: 7 R: t2. self CmpCq: 0 R: t2. - jump3 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump2 := self Jump: 0. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. @@ -8375,32 +8126,32 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode6 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump6 := self Jump: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump2 := self JumpNonZero: 0. + jump6 := self JumpNonZero: 0. self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. - jump3 := self JumpZero: 0. + jump1 := self JumpZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. currentBlock := self Label. - jump7 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. jump8 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump2 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. - self MoveR: t1 M64: 56 r: t0. - jump3 := self Jump: 0. - currentBlock := self Label. + jump6 jmpTarget: currentBlock. jump1 jmpTarget: currentBlock. - self deoptimize. + self MoveR: t1 M64: 56 r: t0. currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump2 jmpTarget: currentBlock. ^ 0 ] @@ -8408,7 +8159,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode6 [ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode7 [ "AutoGenerated by Druid" - | jump1 jump7 jumpNext t1 jump6 jump3 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | + | jump1 jump7 jumpNext t1 jump6 jump3 jump9 currentBlock t0 jump5 jump2 jumpTrue jump8 live t2 jump4 | live := 0. self annotateBytecode: self Label. self ensureReceiverResultRegContainsSelf. @@ -8422,7 +8173,6 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode7 [ ifNone: [ ^ self unknownBytecode ]. live := live bitOr: (self registerMaskFor: t1). (self ssValue: 0) copyToReg: t1. - self ssPop: 1. t2 := self allocateRegNotConflictingWith: live ifNone: [ ^ self unknownBytecode ]. @@ -8430,13 +8180,19 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode7 [ self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 23 R: t2. self AndCq: 1 R: t2. + self ssFlushStack. self CmpCq: 0 R: t2. - jump1 := self JumpNonZero: 0. + jump1 := self JumpZero: 0. + self deoptimize. + jump2 := self Jump: 0. + deadCode := false. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. + self ssPop: 1. self MoveR: t0 R: t2. self AndCq: 7 R: t2. - self ssFlushStack. self CmpCq: 0 R: t2. - jump2 := self JumpNonZero: 0. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getOldSpaceMask R: t2. @@ -8448,11 +8204,7 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode7 [ self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceMask R: t2. - jump5 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump5 := self JumpNonZero: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t2. jumpTrue := self JumpGreaterOrEqual: 0. @@ -8462,39 +8214,34 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode7 [ self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. self CmpCq: 1 R: t2. - jump5 := self JumpZero: 0. - currentBlock := self Label. - jump6 jmpTarget: currentBlock. - jump6 := self Jump: 0. - currentBlock := self Label. - jump5 jmpTarget: currentBlock. + jump6 := self JumpNonZero: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. self TstCq: 7 R: t1. - jump7 := self JumpNonZero: 0. - jump8 := self JumpZero: 0. + jump8 := self JumpNonZero: 0. + jump9 := self JumpZero: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump5 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. + currentBlock := self Label. + jump1 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. self TstCq: 7 R: t1. - jump5 := self JumpNonZero: 0. + jump7 := self JumpNonZero: 0. currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. self CmpCq: objectMemory nilObject R: t1. - jump8 := self JumpAboveOrEqual: 0. - self MoveCq: 0 R: t2. - jump6 := self Jump: 0. - currentBlock := self Label. - jump8 jmpTarget: currentBlock. + jump9 := self JumpBelow: 0. self MoveR: t1 R: t2. self CmpCq: objectMemory trueObject R: t2. jumpTrue := self JumpLessOrEqual: 0. @@ -8503,25 +8250,25 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode7 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump4 := self Jump: 0. currentBlock := self Label. - jump6 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump4 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump6 := self JumpZero: 0. + jump4 := self JumpZero: 0. self CmpCq: objectMemory getMemoryMap getNewSpaceStart R: t1. - jump8 := self JumpLess: 0. + jump9 := self JumpLess: 0. self MoveM64: 0 r: t0 R: t2. self ArithmeticShiftRightCq: 29 R: t2. self AndCq: 1 R: t2. self CmpCq: 0 R: t2. - jump4 := self JumpNonZero: 0. + jump3 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: 7 R: t2. self CmpCq: 0 R: t2. - jump3 := self JumpZero: 0. - self MoveCq: 0 R: t2. - jump2 := self Jump: 0. - currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump1 := self JumpNonZero: 0. self MoveR: t0 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. @@ -8531,32 +8278,32 @@ DruidJIT >> gen_StoreAndPopReceiverVariableBytecode7 [ jumpTrue jmpTarget: self Label. self MoveCq: 1 R: t2. jumpNext jmpTarget: self Label. + jump6 := self Jump: 0. currentBlock := self Label. - jump2 jmpTarget: currentBlock. + jump1 jmpTarget: currentBlock. + self MoveCq: 0 R: t2. + currentBlock := self Label. + jump6 jmpTarget: currentBlock. self CmpCq: 1 R: t2. - jump2 := self JumpNonZero: 0. + jump6 := self JumpNonZero: 0. self MoveR: t1 R: t2. self AndCq: objectMemory getMemoryMap getSpaceMaskToUse R: t2. self CmpCq: objectMemory getMemoryMap getPermSpaceMask R: t2. - jump3 := self JumpZero: 0. + jump1 := self JumpZero: 0. self MoveR: t0 R: TempReg. backEnd saveAndRestoreLinkRegAround: [ self CallRT: ceStoreCheckTrampoline ]. currentBlock := self Label. - jump7 jmpTarget: currentBlock. - jump5 jmpTarget: currentBlock. - jump6 jmpTarget: currentBlock. jump8 jmpTarget: currentBlock. + jump7 jmpTarget: currentBlock. jump4 jmpTarget: currentBlock. - jump2 jmpTarget: currentBlock. + jump9 jmpTarget: currentBlock. jump3 jmpTarget: currentBlock. - self MoveR: t1 M64: 64 r: t0. - jump3 := self Jump: 0. - currentBlock := self Label. + jump6 jmpTarget: currentBlock. jump1 jmpTarget: currentBlock. - self deoptimize. + self MoveR: t1 M64: 64 r: t0. currentBlock := self Label. - jump3 jmpTarget: currentBlock. + jump2 jmpTarget: currentBlock. ^ 0 ] diff --git a/smalltalksrc/VMMaker/SpurMemoryManager.class.st b/smalltalksrc/VMMaker/SpurMemoryManager.class.st index e5f0f769ba..fe679b7d5d 100644 --- a/smalltalksrc/VMMaker/SpurMemoryManager.class.st +++ b/smalltalksrc/VMMaker/SpurMemoryManager.class.st @@ -12488,6 +12488,28 @@ SpurMemoryManager >> storePointerUnchecked: fieldIndex ofObject: objOop withValu put: valuePointer ] +{ #category : #'object access' } +SpurMemoryManager >> storePopPointerImmutabilityCheck: fieldIndex ofObject: objOop withValue: valuePointer [ + "Note must check here for stores of young objects into old ones." + + "Must be inlined for the normal send in cannotAssign:to:withIndex:" + + + + self cppIf: IMMUTABILITY ifTrue: [ + self deny: (self isImmediate: objOop). + (self isImmutable: objOop) ifTrue: [ + self druidForceIntepretation. + self druidIgnore: [ + self pop: 1. + ^ coInterpreter cannotAssign: valuePointer to: objOop withIndex: fieldIndex ] ] ]. + + self pop: 1. + self storePointer: fieldIndex ofObject: objOop withValue: valuePointer. + + +] + { #category : #'object access' } SpurMemoryManager >> storeShort16: shortIndex ofObject: objOop withValue: value [ ^self diff --git a/smalltalksrc/VMMaker/StackInterpreter.class.st b/smalltalksrc/VMMaker/StackInterpreter.class.st index 1533aae962..933207a5d4 100644 --- a/smalltalksrc/VMMaker/StackInterpreter.class.st +++ b/smalltalksrc/VMMaker/StackInterpreter.class.st @@ -2980,18 +2980,21 @@ StackInterpreter >> bytecodePrimGreaterThanSistaV1 [ { #category : #'common selector sends' } StackInterpreter >> bytecodePrimIdenticalSistaV1 [ - - + + - | rcvr arg | - rcvr := self stackValue: 1. - arg := self stackValue: 0. - (objectMemory isOopForwarded: rcvr) ifTrue: - [rcvr := self handleSpecialSelectorSendFaultFor: rcvr]. - (objectMemory isOopForwarded: arg) ifTrue: - [arg := self handleSpecialSelectorSendFaultFor: arg]. - self booleanCheatSistaV1: rcvr = arg + self druidIgnore: [ + rcvr := self stackValue: 1. + arg := self stackValue: 0. + (objectMemory isOopForwarded: rcvr) ifTrue: [ + rcvr := self handleSpecialSelectorSendFaultFor: rcvr ]. + (objectMemory isOopForwarded: arg) ifTrue: [ + arg := self handleSpecialSelectorSendFaultFor: arg ]. + self booleanCheatSistaV1: rcvr = arg. + ^ self ]. + + self normalSendSpecialSelector: 22 argumentCount: 1 ] { #category : #'common selector sends' } @@ -3182,18 +3185,20 @@ StackInterpreter >> bytecodePrimNotEqualSistaV1 [ { #category : #'common selector sends' } StackInterpreter >> bytecodePrimNotIdenticalSistaV1 [ - - + - | rcvr arg | - rcvr := self stackValue: 1. - arg := self stackValue: 0. - (objectMemory isOopForwarded: rcvr) ifTrue: [ - rcvr := self handleSpecialSelectorSendFaultFor: rcvr ]. - (objectMemory isOopForwarded: arg) ifTrue: [ - arg := self handleSpecialSelectorSendFaultFor: arg ]. - self booleanCheatSistaV1: rcvr ~= arg + self druidIgnore: [ + rcvr := self stackValue: 1. + arg := self stackValue: 0. + (objectMemory isOopForwarded: rcvr) ifTrue: [ + rcvr := self handleSpecialSelectorSendFaultFor: rcvr ]. + (objectMemory isOopForwarded: arg) ifTrue: [ + arg := self handleSpecialSelectorSendFaultFor: arg ]. + self booleanCheatSistaV1: rcvr ~= arg. + ^ self ]. + + self normalSendSpecialSelector: 24 argumentCount: 1 ] { #category : #'common selector sends' } @@ -12602,13 +12607,14 @@ StackInterpreter >> pushMaybeContext: obj receiverVariable: fieldIndex [ of married contexts are correctly initialized so they don't need special treatment on read. Only sender, instruction pointer and stack pointer need to be intercepted on reads." + - ((self isReadMediatedContextInstVarIndex: fieldIndex) - and: [objectMemory isContextNonImm: obj]) - ifTrue: - [self push: (self instVar: fieldIndex ofContext: obj)] - ifFalse: - [self push: (objectMemory fetchPointer: fieldIndex ofObject: obj)] + ((self isReadMediatedContextInstVarIndex: fieldIndex) and: [ + objectMemory isContextNonImm: obj ]) + ifTrue: [ + self druidForceIntepretation. + self druidIgnore: [ self push: (self instVar: fieldIndex ofContext: obj) ] ] + ifFalse: [ self push: (objectMemory fetchPointer: fieldIndex ofObject: obj) ] ] { #category : #'stack bytecodes' } @@ -14668,15 +14674,18 @@ StackInterpreter >> storeAndPopReceiverVariableBytecode [ | rcvr top instVarIndex | - + + "Avoid this annotation for now. + It governs the two path compilation" + "" + rcvr := self receiver. top := self stackTop. instVarIndex := currentBytecode bitAnd: 7. - self pop: 1. objectMemory - storePointerImmutabilityCheck: instVarIndex + storePopPointerImmutabilityCheck: instVarIndex ofObject: rcvr withValue: top. self fetchNextBytecode diff --git a/smalltalksrc/VMMaker/StackToRegisterMappingCogit.class.st b/smalltalksrc/VMMaker/StackToRegisterMappingCogit.class.st index 324caf54bc..e6fa1bf657 100644 --- a/smalltalksrc/VMMaker/StackToRegisterMappingCogit.class.st +++ b/smalltalksrc/VMMaker/StackToRegisterMappingCogit.class.st @@ -1125,7 +1125,8 @@ StackToRegisterMappingCogit >> debugStackPointers: aCArrayAccessor [ { #category : #'bytecode generators' } StackToRegisterMappingCogit >> deoptimize [ - self ssFlushStack. + "Where to flush the stack is calculated for each bytecode" + "self ssFlushStack." super deoptimize ]