Lars Wassermann uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-lw.192.mcz
==================== Summary ====================
Name: VMMaker.oscog-lw.192 Author: lw Time: 31 July 2012, 5:24:08.957 pm UUID: 78ce4bd7-8218-dc4e-9469-0c6ac53a8ced Ancestors: VMMaker.oscog-lw.191
Implemented all the methods used when initializing the Simulator for any of the Stack organizations. Now the debugging begins.
=============== Diff against VMMaker.oscog-lw.191 ===============
Item was added: + ----- Method: CogARMCompiler>>callerSavedRegisterMask (in category 'accessing') ----- + callerSavedRegisterMask + "registers r0-r3, the lowest four" + ^16rF!
Item was changed: ----- Method: CogARMCompiler>>computeMaximumSize (in category 'generate machine code') ----- computeMaximumSize "Because we don't use Thumb, each instruction has a multiple of 4 bytes. Most have exactly 4, but some abstract opcodes need more than one instruction." + ({CmpCqR. AddCqR. SubCqR. AndCqR. OrCqR. XorCqR} + anySatisfy: [ :each | each = opcode]) + ifTrue: [^self rotateable8bitImmediate: (operands at: 0) - (opcode = CmpCqR) | (opcode = AddCqR) | (opcode = SubCqR) | (opcode = AndCqR) | (opcode = OrCqR) | (opcode = XorCqR) ifTrue: [^self rotateable8bitImmediate: (operands at: 0) ifTrue: [:r :i| maxSize := 4] ifFalse: [maxSize := 20]]. + ({CmpCwR. AddCwR. SubCwR. AndCwR. OrCwR. XorCwR} + anySatisfy: [ :each | each = opcode]) + ifTrue: [^maxSize := 20]. + + ({Jump. JumpR. JumpZero. JumpNonZero. JumpNegative. JumpNonNegative. JumpOverflow. + JumpOverflow. JumpNoOverflow. JumpCarry. JumpNoCarry. JumpLess. JumpGreaterOrEqual. JumpGreater. JumpLessOrEqual. JumpBelow. JumpAboveOrEqual} + anySatisfy: [ :each | each = opcode]) + ifTrue: [^maxSize := 20]. + - (opcode = CmpCwR) | (opcode = AddCwR) | (opcode = SubCwR) | (opcode = AndCwR) | (opcode = OrCwR) | (opcode = XorCwR) ifTrue: [^maxSize := 20]. - opcode caseOf: { [Label] -> [^maxSize := 0]. [AlignmentNops] -> [^maxSize := (operands at: 0) - 1]. [MoveAwR] -> [^maxSize := 16]. [MoveCqR] -> [^self rotateable8bitImmediate: (operands at: 0) ifTrue: [:r :i| maxSize := 4] ifFalse: [maxSize := 16]]. [MoveCwR] -> [^maxSize := 16]. [MoveRAw] -> [^maxSize := 16]. + [MoveMwrR] -> [self is12BitValue: (operands at: 0) + ifTrue: [ :u :i | ^maxSize := 4] + ifFalse: [ ^maxSize := 20 ]]. [RetN] -> [^(operands at: 0) = 0 + ifTrue: [maxSize := 4] + ifFalse: [maxSize := 8]]. + [JumpR] -> [^maxSize := 8]. - ifTrue: [maxSize := 4] - ifFalse: [maxSize := 8]]. [JumpFPEqual] -> [^maxSize := 8]. [JumpFPNotEqual] -> [^maxSize := 8]. [JumpFPLess] -> [^maxSize := 8]. [JumpFPGreaterOrEqual] -> [^maxSize := 8]. [JumpFPGreater] -> [^maxSize := 8]. [JumpFPLessOrEqual] -> [^maxSize := 8]. [JumpFPOrdered] -> [^maxSize := 8]. [JumpFPUnordered] -> [^maxSize := 8]. + [JumpLong] -> [^maxSize := 20]. + [JumpLongZero] -> [^maxSize := 20]. + [JumpLongNonZero] -> [^maxSize := 20]. } otherwise: [^maxSize := 4]. ^4 "to keep C compiler quiet" !
Item was changed: ----- Method: CogARMCompiler>>concretizeArithmeticShiftRightCqR (in category 'generate machine code - concretize') ----- concretizeArithmeticShiftRightCqR "Will get inlined into concretizeAt: switch." <inline: true> | distance reg | distance := (operands at: 0) min: 31. reg := self concreteRegister: (operands at: 1). "cond 000 1101 0 0000 dest dist -100 srcR" + self machineCodeAt: 0 put: (self t: 0 o: 16rD s: 0 rn: 0 rd: reg + shifterOperand: (distance << 7 bitOr: (64 bitOr: reg))). - self machineCodeAt: 0 put: ((self t: 0 o: 16rD s: 0 rn: 0 rd: reg) - bitOr: (distance << 7 bitOr: (64 bitOr: reg))). ^machineCodeSize := 4!
Item was changed: ----- Method: CogARMCompiler>>concretizeArithmeticShiftRightRR (in category 'generate machine code - concretize') ----- concretizeArithmeticShiftRightRR "Will get inlined into concretizeAt: switch." <inline: true> | destReg distReg | distReg := self concreteRegister: (operands at: 0). destReg := self concreteRegister: (operands at: 1). "cond 000 1101 0 0000 dest dist 0101 srcR" + self machineCodeAt: 0 put: (self t: 0 o: 16rD s: 0 rn: 0 rd: destReg + shifterOperand: (distReg << 8 bitOr: (80 bitOr: destReg))). - self machineCodeAt: 0 put: ((self t: 0 o: 16rD s: 0 rn: 0 rd: destReg) - bitOr: (distReg << 8 bitOr: (80 bitOr: destReg))). ^machineCodeSize := 4!
Item was changed: ----- Method: CogARMCompiler>>concretizeConditionalJumpLong: (in category 'generate machine code - concretize') ----- concretizeConditionalJumpLong: conditionCode "Will get inlined into concretizeAt: switch." "Sizing/generating jumps. Jump targets can be to absolute addresses or other abstract instructions. Generating initial trampolines instructions may have no maxSize and be to absolute addresses. Otherwise instructions must have a machineCodeSize which must be kept to." <inline: true> + | jumpTarget | + <var: #jumpTarget type: #'AbstractInstruction *'> + jumpTarget := self jumpTargetAddress. + self at: 0 moveCw: jumpTarget intoR: RISCTempReg. + "mov lr, pc" + "Because the pc always points to the actual address + 8, the value at pc is the address of the instruction after the branch (add pc, r3, #<byte0>" + self machineCodeAt: 12 put: (self t: 0 o: 16rD s: 0 rn: 0 rd: LR shifterOperand: PC). + "add pc, r3, #<byte 0>" + self machineCodeAt: 16 put: (self t: 1 o: 4 s: 0 rn: RISCTempReg rd: PC shifterOperand: (jumpTarget bitAnd: 16rFF)). + ^machineCodeSize := 20! - | offset | - offset := self computeJumpTargetOffsetPlus: 24 "16+8". - !
Item was changed: ----- Method: CogARMCompiler>>concretizeDataOperationRR: (in category 'generate machine code - concretize') ----- concretizeDataOperationRR: opcode "Will get inlined into concretizeAt: switch." "Load the word into the RISCTempReg, then cmp R, RISCTempReg" <inline: true> | destReg srcReg | srcReg := self concreteRegister: (operands at: 0). destReg := (self concreteRegister: (operands at: 1)). self machineCodeAt: 0 + put: (self t: 0 o: opcode s: 1 rn: destReg rd: destReg shifterOperand: srcReg). - put: ((self t: 0 o: opcode s: 1 rn: destReg rd: destReg) bitOr: srcReg). ^machineCodeSize := 4.!
Item was added: + ----- Method: CogARMCompiler>>concretizeJumpR (in category 'generate machine code - concretize') ----- + concretizeJumpR + "Will get inlined into concretizeAt: switch." + "Sizing/generating jumps. + Jump targets can be to absolute addresses or other abstract instructions. + Generating initial trampolines instructions may have no maxSize and be to absolute addresses. + Otherwise instructions must have a machineCodeSize which must be kept to." + <inline: true> + | reg | + reg := self concreteRegister: (operands at: 0). + "mov lr, pc" + "Because the pc always points to the actual address + 8, the value at pc is the address of the instruction after the branch (add pc, r3, #<byte0>" + self machineCodeAt: 0 put: (self t: 0 o: 16rD s: 0 rn: 0 rd: LR shifterOperand: PC). + "mov pc, r?, #0" + self machineCodeAt: 4 put: (self t: 0 o: 16rD s: 0 rn: 0 rd: PC shifterOperand: reg). + ^machineCodeSize := 8!
Item was changed: ----- Method: CogARMCompiler>>concretizeLogicalShiftLeftCqR (in category 'generate machine code - concretize') ----- concretizeLogicalShiftLeftCqR "Will get inlined into concretizeAt: switch." <inline: true> | distance reg | distance := (operands at: 0) min: 31. reg := self concreteRegister: (operands at: 1). "cond 000 1101 0 0000 dest dista 000 srcR" + self machineCodeAt: 0 put: (self t: 0 o: 16rD s: 0 rn: 0 rd: reg shifterOperand: (distance << 7 bitOr: reg)). - self machineCodeAt: 0 put: ((self t: 0 o: 16rD s: 0 rn: 0 rd: reg) - bitOr: (distance << 7 bitOr: reg)). ^machineCodeSize := 4!
Item was changed: ----- Method: CogARMCompiler>>concretizeLogicalShiftLeftRR (in category 'generate machine code - concretize') ----- concretizeLogicalShiftLeftRR "Will get inlined into concretizeAt: switch." <inline: true> | destReg distReg | distReg := self concreteRegister: (operands at: 0). destReg := self concreteRegister: (operands at: 1). "cond 000 1101 0 0000 dest dist 0001 srcR" + self machineCodeAt: 0 put: (self t: 0 o: 16rD s: 0 rn: 0 rd: destReg + shifterOperand: (distReg << 8 bitOr: (16 bitOr: destReg))). - self machineCodeAt: 0 put: ((self t: 0 o: 16rD s: 0 rn: 0 rd: destReg) - bitOr: (distReg << 8 bitOr: (16 bitOr: destReg))). ^machineCodeSize := 4!
Item was changed: ----- Method: CogARMCompiler>>concretizeLogicalShiftRightCqR (in category 'generate machine code - concretize') ----- concretizeLogicalShiftRightCqR "Will get inlined into concretizeAt: switch." <inline: true> | distance reg | distance := (operands at: 0) min: 31. reg := self concreteRegister: (operands at: 1). "cond 000 1101 0 0000 dest dist -010 srcR" + self machineCodeAt: 0 put: (self t: 0 o: 16rD s: 0 rn: 0 rd: reg + shifterOperand: (distance << 7 bitOr: (32 bitOr: reg))). - self machineCodeAt: 0 put: ((self t: 0 o: 16rD s: 0 rn: 0 rd: reg) - bitOr: (distance << 7 bitOr: (32 bitOr: reg))). ^machineCodeSize := 4!
Item was changed: ----- Method: CogARMCompiler>>concretizeLogicalShiftRightRR (in category 'generate machine code - concretize') ----- concretizeLogicalShiftRightRR "Will get inlined into concretizeAt: switch." <inline: true> | destReg distReg | distReg := self concreteRegister: (operands at: 0). destReg := self concreteRegister: (operands at: 1). "cond 000 1101 0 0000 dest dist 0011 srcR" + self machineCodeAt: 0 put: (self t: 0 o: 16rD s: 0 rn: 0 rd: destReg + shifterOperand: (distReg << 8 bitOr: (48 bitOr: destReg))). - self machineCodeAt: 0 put: ((self t: 0 o: 16rD s: 0 rn: 0 rd: destReg) - bitOr: (distReg << 8 bitOr: (48 bitOr: destReg))). ^machineCodeSize := 4!
Item was changed: ----- Method: CogARMCompiler>>concretizeMoveMwrR (in category 'generate machine code - concretize') ----- concretizeMoveMwrR "Will get inlined into concretizeAt: switch." <inline: true> | srcReg offset destReg | offset := operands at: 0. srcReg := self concreteRegister: (operands at: 1). destReg := self concreteRegister: (operands at: 2). self is12BitValue: offset ifTrue: [ :u :immediate | self machineCodeAt: 0 + put: (self t: 2 o: (8 bitOr: u <<2) s: 1 rn: srcReg rd: destReg shifterOperand: immediate). - put: ((self t: 2 o: (8 bitOr: u <<2) s: 1 rn: srcReg rd: destReg) bitOr: immediate). ^machineCodeSize := 4] + ifFalse: [ + self at: 0 moveCw: offset intoR: RISCTempReg. + self machineCodeAt: 16 put: (self t: 0 o: 4 s: 0 rn: srcReg rd: destReg shifterOperand: RISCTempReg). + ^machineCodeSize := 20 ]! - ifFalse: [ self halt. ]!
Item was added: + ----- Method: CogARMCompiler>>concretizeMoveRMwr (in category 'generate machine code - concretize') ----- + concretizeMoveRMwr + "Will get inlined into concretizeAt: switch." + <inline: true> + | srcReg offset destReg | + srcReg := self concreteRegister: (operands at: 0). + offset := operands at: 1. + destReg := self concreteRegister: (operands at: 2). + self is12BitValue: offset + ifTrue: [ :u :immediate | + "LDR" + "STR: (self t: 2 o: (8 bitOr: u <<2) s: 1 rn: srcReg rd: destReg shifterOperand: immediate)." + self machineCodeAt: 0 + put: (self t: 2 o: (8 bitOr: u<<2) s: 0 rn: destReg rd: srcReg shifterOperand: immediate). + ^machineCodeSize := 4] + ifFalse: [ + self halt. + + ^machineCodeSize := 20 ]!
Item was changed: ----- Method: CogARMCompiler>>concretizeMoveRR (in category 'generate machine code - concretize') ----- concretizeMoveRR "Will get inlined into concretizeAt: switch." <inline: true> | srcReg destReg | srcReg := self concreteRegister: (operands at: 0). destReg := self concreteRegister: (operands at: 1). "cond 000 1101 0 0000 dest 0000 0000 srcR" + self machineCodeAt: 0 put: (self t: 0 o: 16rD s: 0 rn: 0 rd: destReg shifterOperand: srcReg). - self machineCodeAt: 0 put: ((self t: 0 o: 16rD s: 0 rn: 0 rd: destReg) bitOr: srcReg). ^machineCodeSize := 4!
Item was changed: ----- Method: CogARMCompiler>>concretizeNegateR (in category 'generate machine code - concretize') ----- concretizeNegateR "Will get inlined into concretizeAt: switch." <inline: true> | reg | reg := self concreteRegister: (operands at: 0). + "rsb r?, r?, #0" - "rsb r0, r0, #0" self machineCodeAt: 0 put: (self t: 1 o: 3 s: 0 rn: reg rd: reg). ^machineCodeSize := 4!
Item was changed: ----- Method: CogARMCompiler>>concretizePopR (in category 'generate machine code - concretize') ----- concretizePopR "Will get inlined into concretizeAt: switch." <inline: true> | destReg | destReg := self concreteRegister: (operands at: 0). "cond | 010 | 0100 | 1 | -Rn- | -Rd- | 0000 0000 0100 " "LDR destReg, [SP], #4" + self machineCodeAt: 0 put: (self t: 2 o: 4 s: 1 rn: SP rd: destReg shifterOperand: 4). - self machineCodeAt: 0 put: ((self t: 2 o: 4 s: 1 rn: SP rd: destReg) bitOr: 4). ^machineCodeSize := 4!
Item was changed: ----- Method: CogARMCompiler>>concretizePushR (in category 'generate machine code - concretize') ----- concretizePushR "Will get inlined into concretizeAt: switch." <inline: true> | srcReg | srcReg := self concreteRegister: (operands at: 0). "cond | 010 | 1001 | 1 | -Rn- | -Rd- | 0000 0000 0100" "STR srcReg, [sp, #-4]" + self machineCodeAt: 0 put: (self t: 2 o: 9 s: 1 rn: SP rd: srcReg shifterOperand: 4). - self machineCodeAt: 0 put: ((self t: 2 o: 9 s: 1 rn: SP rd: srcReg) bitOr: 4). ^machineCodeSize := 4!
Item was added: + ----- Method: CogARMCompiler>>t:o:s:rn:rd:shifterOperand: (in category 'encoding') ----- + t: type o: flagsOrOpcode s: doUpdateStatusRegister rn: sourceRegister rd: targetRegister shifterOperand: so + <inline: true> + ^(self t: type o: flagsOrOpcode s: doUpdateStatusRegister rn: sourceRegister rd: targetRegister) bitOr: so!
Item was changed: ----- Method: CogAbstractInstruction>>computeJumpTargetOffsetPlus: (in category 'generate machine code') ----- computeJumpTargetOffsetPlus: anInteger <inline: true> "Since it's an extraction from other methods." | jumpTarget | <var: #jumpTarget type: #'AbstractInstruction *'> + jumpTarget := self jumpTargetAddress. - jumpTarget := cogit cCoerceSimple: (operands at: 0) to: #'AbstractInstruction *'. - cogit assertSaneJumpTarget: jumpTarget. - (self isAnInstruction: jumpTarget) ifTrue: - [jumpTarget := cogit cCoerceSimple: jumpTarget address to: #'AbstractInstruction *']. - self assert: jumpTarget ~= 0. ^jumpTarget signedIntFromLong - (address + anInteger) signedIntFromLong.!
Item was added: + ----- Method: CogAbstractInstruction>>jumpTargetAddress (in category 'generate machine code') ----- + jumpTargetAddress + <inline: true> "Since it's an extraction from other methods." + | jumpTarget | + <var: #jumpTarget type: #'AbstractInstruction *'> + jumpTarget := cogit cCoerceSimple: (operands at: 0) to: #'AbstractInstruction *'. + cogit assertSaneJumpTarget: jumpTarget. + (self isAnInstruction: jumpTarget) ifTrue: + [jumpTarget := cogit cCoerceSimple: jumpTarget address to: #'AbstractInstruction *']. + self assert: jumpTarget ~= 0. + ^jumpTarget!
vm-dev@lists.squeakfoundation.org