Skip to content

Conversation

@PalumboN
Copy link
Collaborator

@PalumboN PalumboN commented Nov 18, 2025

This PR adds a decompiler from Cogit IR -> RTL.

I think that it is nice to debug the JIT compiler / analyze / learn about how is the JIT generates machine code for a complete method.
A big difference between this and the use of the machine code debugger is that:

  • this is code. You can edit, add spaces, comments. It is easier to navigate.
  • this is Cogit. If you develop the JIT compiler you don't need to learn details about the instructions of a particular architecture.

I added a smoke test compiling the method SequenceableCollection >> #do: and you get this:

gen_do: aBlock

	| label1 label2 label3 label4 label5 label6 label7 label8 label9 label10 label11 label12 label13 label14 |
	cogit MoveCq: 0 R: ReceiverResultReg.
	cogit PushR: LinkReg.
	cogit CallRT: 16r3200002D8.
	label1 := cogit Label.
	cogit AndCq: 7 R: ReceiverResultReg R: TempReg.
	cogit JumpNonZero: label2.
	cogit MoveMw: 0 r: ReceiverResultReg R: TempReg.
	cogit AndCq: 16r3FFFFF R: TempReg.
	label2 := cogit Label.
	cogit CmpR: ClassReg R: TempReg.
	cogit JumpNonZero: label30.
	label3 := cogit Label.
	cogit PushR: ReceiverResultReg.
	cogit PushR: Arg0Reg.
	cogit PushR: LinkReg.
	cogit PushR: FPReg.
	cogit MoveR: SPReg R: FPReg.
	cogit PushCw: 16r320000430.
	cogit MoveCq: 16r10000000000 R: SendNumArgsReg.
	cogit PushR: SendNumArgsReg.
	cogit PushR: ReceiverResultReg.
	cogit PushR: SendNumArgsReg.
	cogit PushR: SendNumArgsReg.
	cogit MoveAw: 16r7FFFFFFFFFFFFC88 R: TempReg.
	cogit CmpR: TempReg R: SPReg.
	cogit JumpBelow: label0.
	label4 := cogit Label.
	cogit MoveMw: -24 r: FPReg R: ReceiverResultReg.
	cogit MovePatcheableC32: -19 R: ClassReg.
	cogit CallRT: 16r3200002A8.
	label5 := cogit Label.
	cogit MoveR: ReceiverResultReg Mw: -32 r: FPReg.
	cogit MoveCq: 9 R: TempReg.
	cogit MoveR: TempReg Mw: -40 r: FPReg.
	cogit PushCq: 9.
	label6 := cogit Label.
	cogit MoveMw: -32 r: FPReg R: Arg0Reg.
	cogit MoveMw: -40 r: FPReg R: ReceiverResultReg.
	cogit MoveR: ReceiverResultReg R: TempReg.
	cogit AndR: Arg0Reg R: TempReg.
	cogit TstCq: 1 R: TempReg.
	cogit JumpZero: label7.
	cogit CmpR: Arg0Reg R: ReceiverResultReg.
	cogit JumpGreater: label14.
	cogit Jump: label9.
	label7 := cogit Label.
	cogit MovePatcheableC32: -5 R: ClassReg.
	cogit CallRT: 16r3200002B0.
	cogit MoveR: ReceiverResultReg R: TempReg.
	cogit SubCq: 16r10000000010 R: TempReg.
	cogit JumpZero: label14.
	cogit CmpCq: 16 R: TempReg.
	cogit JumpZero: label8.
	cogit CallRT: 16r3200002F8.
	label8 := cogit Label.
	label9 := cogit Label.
	cogit MoveMw: 16 r: FPReg R: TempReg.
	cogit PushR: TempReg.
	cogit MoveMw: -40 r: FPReg R: Arg0Reg.
	cogit MoveMw: -24 r: FPReg R: ReceiverResultReg.
	cogit MovePatcheableC32: -17 R: ClassReg.
	cogit CallRT: 16r3200002B0.
	cogit MoveR: ReceiverResultReg R: Arg0Reg.
	cogit MoveMw: -56 r: FPReg R: ReceiverResultReg.
	cogit AddCq: 8 R: SPReg.
	cogit MovePatcheableC32: -27 R: ClassReg.
	cogit CallRT: 16r3200002B0.
	cogit MoveMw: -40 r: FPReg R: ReceiverResultReg.
	cogit TstCq: 1 R: ReceiverResultReg.
	cogit JumpZero: label10.
	cogit AddCq: 8 R: ReceiverResultReg.
	cogit JumpNoOverflow: label11.
	cogit SubCq: 8 R: ReceiverResultReg.
	label10 := cogit Label.
	cogit MoveCq: 9 R: Arg0Reg.
	cogit MovePatcheableC32: -1 R: ClassReg.
	cogit CallRT: 16r3200002B0.
	label11 := cogit Label.
	label12 := cogit Label.
	cogit MoveR: ReceiverResultReg Mw: -40 r: FPReg.
	cogit MoveAw: 16r7FFFFFFFFFFFFC88 R: TempReg.
	cogit CmpR: TempReg R: SPReg.
	cogit JumpAboveOrEqual: label6.
	cogit CallRT: 16r320000308.
	label13 := cogit Label.
	cogit Jump: label6.
	cogit Nop.
	label14 := cogit Label.
	cogit AddCq: 8 R: SPReg.
	cogit MoveMw: -24 r: FPReg R: ReceiverResultReg.
	cogit MoveR: FPReg R: SPReg.
	cogit PopR: FPReg.
	cogit PopR: LinkReg.
	cogit RetN: 16.
	cogit Nop.
	cogit Nop

- Smoke test to generate a generator Cogit handler form a bytecode method
@PalumboN PalumboN changed the title Hi CogitDecompiler! Hi CogitDecompiler Nov 18, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant