Skip to content

Commit 5e2fa3c

Browse files
committed
add: madhyasthal+jit/x64: GTE and GTEI impl
1 parent fb9cf78 commit 5e2fa3c

4 files changed

Lines changed: 92 additions & 1 deletion

File tree

src/bali/runtime/compiler/amd64/midtier.nim

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,66 @@ proc compileLowered(cgen: MidtierJIT, pipeline: pipeline.Pipeline): Option[JITSe
371371
cgen.s.mov(regRsi.reg, regRax)
372372
cgen.s.mov(regRdx, int64(inst.args[0].vreg))
373373
cgen.s.call(cgen.callbacks.addAtom)
374+
of InstKind.GreaterThanInt:
375+
let
376+
a = inst.args[0].vreg
377+
b = inst.args[1].vreg
378+
379+
alignStack 8:
380+
cgen.s.mov(regRdi, cast[int64](cgen.vm))
381+
cgen.s.mov(regRsi, int64(a))
382+
cgen.s.call(cgen.callbacks.getAtom)
383+
384+
cgen.s.mov(regRdi.reg, regRax)
385+
cgen.s.call(getRawFloat)
386+
387+
cgen.s.movsd(regXmm1, regXmm0.reg)
388+
389+
cgen.s.mov(regRdi, cast[int64](cgen.vm))
390+
cgen.s.mov(regRsi, int64(b))
391+
cgen.s.call(cgen.callbacks.getAtom)
392+
393+
cgen.s.comisd(regXmm0, regXmm1.reg)
394+
395+
# A <= B: pc += 1
396+
cgen.patchConditionalJmps &=
397+
ConditionalJump(label: cgen.s.label(), op: i + 1, condition: condNotBelow)
398+
cgen.s.jcc(condNotBelow, BackwardsLabel(EnsureNoInt8Align))
399+
400+
# A > B: pc += 2
401+
cgen.patchConditionalJmps &=
402+
ConditionalJump(label: cgen.s.label(), op: i + 2, condition: condBelow)
403+
cgen.s.jcc(condBelow, BackwardsLabel(EnsureNoInt8Align))
404+
of InstKind.GreaterThanEqualInt:
405+
let
406+
a = inst.args[0].vreg
407+
b = inst.args[1].vreg
408+
409+
alignStack 8:
410+
cgen.s.mov(regRdi, cast[int64](cgen.vm))
411+
cgen.s.mov(regRsi, int64(a))
412+
cgen.s.call(cgen.callbacks.getAtom)
413+
414+
cgen.s.mov(regRdi.reg, regRax)
415+
cgen.s.call(getRawFloat)
416+
417+
cgen.s.movsd(regXmm1, regXmm0.reg)
418+
419+
cgen.s.mov(regRdi, cast[int64](cgen.vm))
420+
cgen.s.mov(regRsi, int64(b))
421+
cgen.s.call(cgen.callbacks.getAtom)
422+
423+
cgen.s.comisd(regXmm0, regXmm1.reg)
424+
425+
# A >= B: pc += 1
426+
cgen.patchConditionalJmps &=
427+
ConditionalJump(label: cgen.s.label(), op: i + 1, condition: condNbequal)
428+
cgen.s.jcc(condNbequal, BackwardsLabel(EnsureNoInt8Align))
429+
430+
# A > B: pc += 2
431+
cgen.patchConditionalJmps &=
432+
ConditionalJump(label: cgen.s.label(), op: i + 2, condition: condBequal)
433+
cgen.s.jcc(condBequal, BackwardsLabel(EnsureNoInt8Align))
374434
else:
375435
debug "jit/amd64: midtier cannot lower op into x64 code: " & $inst.kind
376436
return

src/bali/runtime/compiler/madhyasthal/ir.nim

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ type
2727
Equate
2828
LesserThanInt
2929
Increment
30+
GreaterThanInt
31+
GreaterThanEqualInt
3032

3133
Register* {.size: sizeof(uint8), pure.} = enum
3234
ReturnValue = 0
@@ -183,4 +185,16 @@ func increment*(a: uint32): Inst =
183185
Inst(
184186
kind: InstKind.Increment, args: [ArgVariant(kind: avkPos, vreg: a), ArgVariant()]
185187
)
188+
189+
func greaterThanI*(a, b: uint32): Inst =
190+
Inst(
191+
kind: InstKind.GreaterThanInt,
192+
args: [ArgVariant(kind: avkPos, vreg: a), ArgVariant(kind: avkPos, vreg: b)],
193+
)
194+
195+
func greaterThanEqI*(a, b: uint32): Inst =
196+
Inst(
197+
kind: InstKind.GreaterThanEqualInt,
198+
args: [ArgVariant(kind: avkPos, vreg: a), ArgVariant(kind: avkPos, vreg: b)],
199+
)
186200
{.pop.}

src/bali/runtime/compiler/madhyasthal/lowering.nim

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,20 @@ proc lowerStream*(fn: var Function, stream: var OpStream): bool =
258258
lesserThanI(
259259
uint32(&op.arguments[0].getInt()), uint32(&op.arguments[1].getInt())
260260
)
261+
of GreaterThanInt:
262+
let op = stream.consume()
263+
264+
fn.insts &=
265+
greaterThanI(
266+
uint32(&op.arguments[0].getInt()), uint32(&op.arguments[1].getInt())
267+
)
268+
of GreaterThanEqualInt:
269+
let op = stream.consume()
270+
271+
fn.insts &=
272+
greaterThanEqI(
273+
uint32(&op.arguments[0].getInt()), uint32(&op.arguments[1].getInt())
274+
)
261275
of Increment:
262276
let op = stream.consume()
263277

src/bali/runtime/compiler/madhyasthal/naive_dce.nim

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,10 @@ func scanForUsedRegs*(
112112
used.incl(inst.args[0].vreg)
113113
of InstKind.ReadProperty:
114114
used.incl(inst.args[0].vreg)
115-
of {InstKind.Equate, InstKind.LesserThanInt}:
115+
of {
116+
InstKind.Equate, InstKind.LesserThanInt, InstKind.GreaterThanInt,
117+
InstKind.GreaterThanEqualInt,
118+
}:
116119
used.incl(inst.args[0].vreg)
117120
used.incl(inst.args[1].vreg)
118121
else:

0 commit comments

Comments
 (0)