@@ -256,6 +256,11 @@ struct InstructionPrintingContext {
256256 " offset: \( offset) "
257257 }
258258
259+ func branchTarget( _ instructionOffset: Int , _ offset: Int ) -> String {
260+ let iseqOffset = instructionOffset + offset
261+ return " \( offset > 0 ? " + " : " " ) \( offset) ; 0x \( String ( iseqOffset, radix: 16 ) ) "
262+ }
263+
259264 mutating func callee( _ callee: InternalFunction ) -> String {
260265 return " ' " + nameRegistry. symbolicate ( callee) + " ' "
261266 }
@@ -278,11 +283,25 @@ struct InstructionPrintingContext {
278283 instructionOffset: Int ,
279284 to target: inout Target
280285 ) where Target: TextOutputStream {
286+ func binop( _ name: String , _ op: Instruction . BinaryOperand ) {
287+ target. write ( " \( reg ( op. result) ) = \( name) \( reg ( op. lhs) ) , \( reg ( op. rhs) ) " )
288+ }
289+ func unop( _ name: String , _ op: Instruction . UnaryOperand ) {
290+ target. write ( " \( reg ( op. result) ) = \( name) \( reg ( op. input) ) " )
291+ }
292+ func load( _ name: String , _ op: Instruction . LoadOperand ) {
293+ target. write ( " \( reg ( op. result) ) = \( name) \( reg ( op. pointer) ) , \( offset ( op. offset) ) " )
294+ }
295+ func store( _ name: String , _ op: Instruction . StoreOperand ) {
296+ target. write ( " \( name) \( reg ( op. pointer) ) + \( offset ( op. offset) ) , \( reg ( op. value) ) " )
297+ }
281298 switch instruction {
282299 case . unreachable:
283300 target. write ( " unreachable " )
284301 case . nop:
285302 target. write ( " nop " )
303+ case . copyStack( let op) :
304+ target. write ( " \( reg ( op. dest) ) = copy \( reg ( op. source) ) " )
286305 case . globalGet( let op) :
287306 target. write ( " \( reg ( op. reg) ) = global.get \( global ( op. global) ) " )
288307 case . globalSet( let op) :
@@ -295,39 +314,51 @@ struct InstructionPrintingContext {
295314 target. write ( " call_indirect \( reg ( op. index) ) , \( op. tableIndex) , (func_ty id: \( op. type. id) ), sp: + \( op. spAddend) " )
296315 case . compilingCall( let op) :
297316 target. write ( " compiling_call \( callee ( op. callee) ) , sp: + \( op. spAddend) " )
298- case . i32Load( let op) :
299- target. write ( " \( reg ( op. result) ) = i32.load \( reg ( op. pointer) ) , \( offset ( op. offset) ) " )
300- case . i64Load( let op) :
301- target. write ( " \( reg ( op. result) ) = i64.load \( reg ( op. pointer) ) , \( offset ( op. offset) ) " )
302- case . f32Load( let op) :
303- target. write ( " \( reg ( op. result) ) = f32.load \( reg ( op. pointer) ) , \( offset ( op. offset) ) " )
304- case . f64Load( let op) :
305- target. write ( " \( reg ( op. result) ) = f64.load \( reg ( op. pointer) ) , \( offset ( op. offset) ) " )
306- case . copyStack( let op) :
307- target. write ( " \( reg ( op. dest) ) = copy \( reg ( op. source) ) " )
308- case . i32Add( let op) :
309- target. write ( " \( reg ( op. result) ) = i32.add \( reg ( op. lhs) ) , \( reg ( op. rhs) ) " )
310- case . i32Sub( let op) :
311- target. write ( " \( reg ( op. result) ) = i32.sub \( reg ( op. lhs) ) , \( reg ( op. rhs) ) " )
312- case . i32LtU( let op) :
313- target. write ( " \( reg ( op. result) ) = i32.lt_u \( reg ( op. lhs) ) , \( reg ( op. rhs) ) " )
314- case . i32Eq( let op) :
315- target. write ( " \( reg ( op. result) ) = i32.eq \( reg ( op. lhs) ) , \( reg ( op. rhs) ) " )
316- case . i32Eqz( let op) :
317- target. write ( " \( reg ( op. result) ) = i32.eqz \( reg ( op. input) ) " )
318- case . i32Store( let op) :
319- target. write ( " i32.store \( reg ( op. pointer) ) , \( reg ( op. value) ) , \( offset ( op. offset) ) " )
317+ case . i32Load( let op) : load ( " i32.load " , op)
318+ case . i64Load( let op) : load ( " i64.load " , op)
319+ case . f32Load( let op) : load ( " f32.load " , op)
320+ case . f64Load( let op) : load ( " f64.load " , op)
321+ case . i32Add( let op) : binop ( " i32.add " , op)
322+ case . i32Sub( let op) : binop ( " i32.sub " , op)
323+ case . i32Mul( let op) : binop ( " i32.mul " , op)
324+ case . i32DivS( let op) : binop ( " i32.div_s " , op)
325+ case . i32RemS( let op) : binop ( " i32.rem_s " , op)
326+ case . i32And( let op) : binop ( " i32.and " , op)
327+ case . i32Or( let op) : binop ( " i32.or " , op)
328+ case . i32Xor( let op) : binop ( " i32.xor " , op)
329+ case . i32Shl( let op) : binop ( " i32.shl " , op)
330+ case . i32ShrS( let op) : binop ( " i32.shr_s " , op)
331+ case . i32ShrU( let op) : binop ( " i32.shr_u " , op)
332+ case . i32Rotl( let op) : binop ( " i32.rotl " , op)
333+ case . i32Rotr( let op) : binop ( " i32.rotr " , op)
334+ case . i32LtU( let op) : binop ( " i32.lt_u " , op)
335+ case . i32GeU( let op) : binop ( " i32.ge_u " , op)
336+ case . i32Eq( let op) : binop ( " i32.eq " , op)
337+ case . i32Eqz( let op) : unop ( " i32.eqz " , op)
338+ case . i64Add( let op) : binop ( " i64.add " , op)
339+ case . i64Sub( let op) : binop ( " i64.sub " , op)
340+ case . i64Mul( let op) : binop ( " i64.mul " , op)
341+ case . i64DivS( let op) : binop ( " i64.div_s " , op)
342+ case . i64RemS( let op) : binop ( " i64.rem_s " , op)
343+ case . i64And( let op) : binop ( " i64.and " , op)
344+ case . i64Or( let op) : binop ( " i64.or " , op)
345+ case . i64Xor( let op) : binop ( " i64.xor " , op)
346+ case . i64Shl( let op) : binop ( " i64.shl " , op)
347+ case . i64ShrS( let op) : binop ( " i64.shr_s " , op)
348+ case . i64ShrU( let op) : binop ( " i64.shr_u " , op)
349+ case . i64Eq( let op) : binop ( " i64.eq " , op)
350+ case . i64Eqz( let op) : unop ( " i64.eqz " , op)
351+ case . i32Store( let op) : store ( " i32.store " , op)
320352 case . brIfNot( let op) :
321- target. write ( " br_if_not \( reg ( op. condition) ) , + \( op. offset) " )
353+ target. write ( " br_if_not \( reg ( op. condition) ) , \( branchTarget ( instructionOffset , Int ( op. offset) ) ) " )
322354 case . brIf( let op) :
323- target. write ( " br_if \( reg ( op. condition) ) , + \( op. offset) " )
355+ target. write ( " br_if \( reg ( op. condition) ) , \( branchTarget ( instructionOffset , Int ( op. offset) ) ) " )
324356 case . br( let offset) :
325- let iseqOffset = instructionOffset + Int( offset)
326- target. write ( " br \( offset > 0 ? " + " : " " ) \( offset) ; 0x \( String ( iseqOffset, radix: 16 ) ) " )
357+ target. write ( " br \( branchTarget ( instructionOffset, Int ( offset) ) ) " )
327358 case . brTable( let table) :
328359 target. write ( " br_table \( reg ( table. index) ) , \( table. count) cases " )
329360 for i in 0 ..< table. count {
330- target. write ( " \n \( i) : + \( table. baseAddress [ Int ( i) ] . offset) " )
361+ target. write ( " \n \( i) : \( branchTarget ( instructionOffset , Int ( table. baseAddress [ Int ( i) ] . offset) ) ) " )
331362 }
332363 case . _return:
333364 target. write ( " return " )
0 commit comments