From: Spam Killer on
Hi!

It was definitely a drag, that everything I wrote with cmovcc in it
didn't run on my Classic Pentium, so I wrote me the macros below.
They might come in handy for some of you too, so I post them here:

cmovcc.inc
%macro cmova 2.nolist
jna %%1
mov %1,%2
%%1:
%endmacro

%macro cmovae 2.nolist
jnae %%1
mov %1,%2
%%1:
%endmacro

%macro cmovb 2.nolist
jnb %%1
mov %1,%2
%%1:
%endmacro

%macro cmovbe 2.nolist
jnbe %%1
mov %1,%2
%%1:
%endmacro

%macro cmovc 2.nolist
jnc %%1
mov %1,%2
%%1:
%endmacro

%macro cmove 2.nolist
jne %%1
mov %1,%2
%%1:
%endmacro

%macro cmovg 2.nolist
jng %%1
mov %1,%2
%%1:
%endmacro

%macro cmovge 2.nolist
jnge %%1
mov %1,%2
%%1:
%endmacro

%macro cmovl 2.nolist
jnl %%1
mov %1,%2
%%1:
%endmacro

%macro cmovle 2.nolist
jnle %%1
mov %1,%2
%%1:
%endmacro

%macro cmovna 2.nolist
ja %%1
mov %1,%2
%%1:
%endmacro

%macro cmovnae 2.nolist
jae %%1
mov %1,%2
%%1:
%endmacro

%macro cmovnb 2.nolist
jb %%1
mov %1,%2
%%1:
%endmacro

%macro cmovnbe 2.nolist
jbe %%1
mov %1,%2
%%1:
%endmacro

%macro cmovnc 2.nolist
jc %%1
mov %1,%2
%%1:
%endmacro

%macro cmovne 2.nolist
je %%1
mov %1,%2
%%1:
%endmacro

%macro cmovng 2.nolist
jg %%1
mov %1,%2
%%1:
%endmacro

%macro cmovnge 2.nolist
jge %%1
mov %1,%2
%%1:
%endmacro

%macro cmovnl 2.nolist
jl %%1
mov %1,%2
%%1:
%endmacro

%macro cmovnle 2.nolist
jle %%1
mov %1,%2
%%1:
%endmacro

%macro cmovno 2.nolist
jo %%1
mov %1,%2
%%1:
%endmacro

%macro cmovnp 2.nolist
jp %%1
mov %1,%2
%%1:
%endmacro

%macro cmovns 2.nolist
js %%1
mov %1,%2
%%1:
%endmacro

%macro cmovnz 2.nolist
jz %%1
mov %1,%2
%%1:
%endmacro

%macro cmovo 2.nolist
jno %%1
mov %1,%2
%%1:
%endmacro

%macro cmovp 2.nolist
jnp %%1
mov %1,%2
%%1:
%endmacro

%macro cmovpe 2.nolist
jpo %%1
mov %1,%2
%%1:
%endmacro

%macro cmovpo 2.nolist
jpe %%1
mov %1,%2
%%1:
%endmacro

%macro cmovs 2.nolist
jns %%1
mov %1,%2
%%1:
%endmacro

%macro cmovz 2.nolist
jnz %%1
mov %1,%2
%%1:
%endmacro
--
wfz
From: Frank Kotler on
Spam Killer wrote:
> Hi!
>
> It was definitely a drag, that everything I wrote with cmovcc in it
> didn't run on my Classic Pentium, so I wrote me the macros below.
> They might come in handy for some of you too, so I post them here:
>
> cmovcc.inc

Thank you!

Best,
Frank
From: Wolfgang Kern on

"Spam Killer" wrote:

> It was definitely a drag, that everything I wrote with cmovcc in it
> didn't run on my Classic Pentium, so I wrote me the macros below.
> They might come in handy for some of you too, so I post them here:
>
> cmovcc.inc

Well, but the CPU know only 16 variants.
So if your macro-engine accept double names you could save on almost
half of it.

in their numerical opcode order (70..7f):

Jo
Jno
Jc = Jb = Jnae ;J<
Jnc = Jnb = Jae ;J>=
Jz = Je ;J=
Jnz = Jne ;J<> ;J!=
Jbe = Jna ;Jcoz ;J<=
Jnbe= Ja ;Jncnz;J>
Js ;J- ;J<0
Jns ;J+
Jp = Jpe
Jnp = Jpo
Jl = Jnge ;Js<
Jle = Jge ;Js>=
Jle = Jng ;Js<=
Jnle= Jg ;Js>

The ones after the semicolons are rare seen, even perhaps more explaining.
__
wolfgang



From: Spam Killer on
On Fri, 18 Jan 2008 13:55:55 +0100, "Wolfgang Kern" wrote:
>Well, but the CPU know only 16 variants.
>So if your macro-engine accept double names you could save on almost
>half of it.
>
>in their numerical opcode order (70..7f):
>
>Jo
>Jno
>Jc = Jb = Jnae ;J<
>...
I could do:
%define jb jc
%define jnae jc
....
Yes, that saves many lines! :-)
--
wfz
From: Spam Killer on
On Fri, 18 Jan 2008 13:55:55 +0100, "Wolfgang Kern" wrote:
>
>Well, but the CPU know only 16 variants.
>So if your macro-engine accept double names you could save on almost
>half of it.
>
Condition codes as macro parameters aren't bad either. ;-) I saved 100
lines! Do you see any errors? The "j%-1" inverts the conditions.

[list -]
%macro cmovcc 3
j%-1 %%skip
mov %2,%3
%%skip:
%endmacro

%imacro cmovo 2.nolist
cmovcc O, %1, %2
%endmacro

%imacro cmovno 2.nolist
cmovcc no, %1, %2
%endmacro

%imacro cmovc 2.nolist
cmovcc c, %1, %2
%endmacro
%define cmovb cmovc
%define cmovnae cmovc

%imacro cmovnc 2.nolist
cmovcc nc, %1, %2
%endmacro
%define cmovnb cmovnc
%define cmovae cmovnc

%imacro cmovz 2.nolist
cmovcc z, %1, %2
%endmacro
%define cmove cmovz

%imacro cmovnz 2.nolist
cmovcc nz, %1, %2
%endmacro
%define cmovne cmovnz

%imacro cmovna 2.nolist
cmovcc na, %1, %2
%endmacro
%define cmovbe cmovna

%imacro cmova 2.nolist
cmovcc a, %1, %2
%endmacro
%define cmovnbe cmova

%imacro cmovs 2.nolist
cmovcc s, %1, %2
%endmacro

%imacro cmovns 2.nolist
cmovcc ns, %1, %2
%endmacro

%imacro cmovpe 2.nolist
cmovcc pe, %1, %2
%endmacro
%define cmovp cmovpe

%imacro cmovpo 2.nolist
cmovcc po, %1, %2
%endmacro
%define cmovnp cmovpo

%imacro cmovl 2.nolist
cmovcc l, %1, %2
%endmacro
%define cmovnge cmovl

%imacro cmovnl 2.nolist
cmovcc nl, %1, %2
%endmacro
%define cmovge cmovnl

%imacro cmovng 2.nolist
cmovcc ng, %1, %2
%endmacro
%define cmovle cmovng

%imacro cmovg 2.nolist
cmovcc g, %1, %2
%endmacro
%define cmovnle cmovg
[list +]
--
wfz
 |  Next  |  Last
Pages: 1 2
Prev: 64bit MenuetOS 0.76 and downloadable CD
Next: exception