mirror of
git://c9x.me/qbe.git
synced 2026-04-05 09:59:47 +00:00
Replacement of tiny conditional jump graphlets with conditional move instructions. Currently enabled only for x86. Arm64 support using cselXX will be essentially identical. Adds (internal) frontend sel0/sel1 ops with flag-specific backend xselXX following jnz implementation pattern. Testing: standard QBE, cproc, harec, hare, roland
239 lines
4.6 KiB
Plaintext
239 lines
4.6 KiB
Plaintext
export
|
|
function l $ifc1(l %v0, l %v1, w %c) {
|
|
@start
|
|
jnz %c, @true, @false
|
|
@true
|
|
%v =l copy %v1
|
|
jmp @end
|
|
@false
|
|
%v =l copy %v0
|
|
jmp @end
|
|
@end
|
|
ret %v
|
|
}
|
|
|
|
export
|
|
function l $ifc2(l %v0, l %v1, w %p) {
|
|
@start
|
|
%c =w cnew %p, 42
|
|
jnz %c, @true, @false
|
|
@true
|
|
%v =l copy %v1
|
|
jmp @end
|
|
@false
|
|
%v =l copy %v0
|
|
jmp @end
|
|
@end
|
|
ret %v
|
|
}
|
|
|
|
export
|
|
function l $ifc3(l %v0, l %v1, w %p) {
|
|
@start
|
|
%c =w cugtw %p, 42
|
|
jnz %c, @true, @false
|
|
@true
|
|
%v =l copy %v1
|
|
jmp @end
|
|
@false
|
|
%v =l copy %v0
|
|
jmp @end
|
|
@end
|
|
ret %v
|
|
}
|
|
|
|
export
|
|
function l $ifclts(s %s0, s %s1, l %v0, l %v1) {
|
|
@start
|
|
%c =w clts %s0, %s1
|
|
jnz %c, @true, @false
|
|
@true
|
|
%v =l copy %v1
|
|
jmp @end
|
|
@false
|
|
%v =l copy %v0
|
|
jmp @end
|
|
@end
|
|
ret %v
|
|
}
|
|
|
|
export
|
|
function l $ifcles(s %s0, s %s1, l %v0, l %v1) {
|
|
@start
|
|
%c =w cles %s0, %s1
|
|
jnz %c, @true, @false
|
|
@true
|
|
%v =l copy %v1
|
|
jmp @end
|
|
@false
|
|
%v =l copy %v0
|
|
jmp @end
|
|
@end
|
|
ret %v
|
|
}
|
|
|
|
export
|
|
function l $ifcgts(s %s0, s %s1, l %v0, l %v1) {
|
|
@start
|
|
%c =w cgts %s0, %s1
|
|
jnz %c, @true, @false
|
|
@true
|
|
%v =l copy %v1
|
|
jmp @end
|
|
@false
|
|
%v =l copy %v0
|
|
jmp @end
|
|
@end
|
|
ret %v
|
|
}
|
|
|
|
export
|
|
function l $ifcges(s %s0, s %s1, l %v0, l %v1) {
|
|
@start
|
|
%c =w cges %s0, %s1
|
|
jnz %c, @true, @false
|
|
@true
|
|
%v =l copy %v1
|
|
jmp @end
|
|
@false
|
|
%v =l copy %v0
|
|
jmp @end
|
|
@end
|
|
ret %v
|
|
}
|
|
|
|
export
|
|
function l $ifceqs(s %s0, s %s1, l %v0, l %v1) {
|
|
@start
|
|
%c =w ceqs %s0, %s1
|
|
jnz %c, @true, @false
|
|
@true
|
|
%v =l copy %v1
|
|
jmp @end
|
|
@false
|
|
%v =l copy %v0
|
|
jmp @end
|
|
@end
|
|
ret %v
|
|
}
|
|
|
|
export
|
|
function l $ifcnes(s %s0, s %s1, l %v0, l %v1) {
|
|
@start
|
|
%c =w cnes %s0, %s1
|
|
jnz %c, @true, @false
|
|
@true
|
|
%v =l copy %v1
|
|
jmp @end
|
|
@false
|
|
%v =l copy %v0
|
|
jmp @end
|
|
@end
|
|
ret %v
|
|
}
|
|
|
|
export
|
|
function l $ifcos(s %s0, s %s1, l %v0, l %v1) {
|
|
@start
|
|
%c =w cos %s0, %s1
|
|
jnz %c, @true, @false
|
|
@true
|
|
%v =l copy %v1
|
|
jmp @end
|
|
@false
|
|
%v =l copy %v0
|
|
jmp @end
|
|
@end
|
|
ret %v
|
|
}
|
|
|
|
export
|
|
function l $ifcuos(s %s0, s %s1, l %v0, l %v1) {
|
|
@start
|
|
%c =w cuos %s0, %s1
|
|
jnz %c, @true, @false
|
|
@true
|
|
%v =l copy %v1
|
|
jmp @end
|
|
@false
|
|
%v =l copy %v0
|
|
jmp @end
|
|
@end
|
|
ret %v
|
|
}
|
|
|
|
# >>> driver
|
|
# extern long ifc1(long, long, int);
|
|
# extern long ifc2(long, long, int);
|
|
# extern long ifc3(long, long, int);
|
|
# extern long ifclts(float, float, long, long);
|
|
# extern long ifcles(float, float, long, long);
|
|
# extern long ifcgts(float, float, long, long);
|
|
# extern long ifcges(float, float, long, long);
|
|
# extern long ifceqs(float, float, long, long);
|
|
# extern long ifcnes(float, float, long, long);
|
|
# extern long ifcos(float, float, long, long);
|
|
# extern long ifcuos(float, float, long, long);
|
|
# int main() {
|
|
# return
|
|
# ifc1(7, 5, 0) != 7
|
|
# || ifc1(7, 5, 1) != 5
|
|
# || ifc1(7, 5, 33) != 5
|
|
# || ifc2(7, 5, 42) != 7
|
|
# || ifc2(7, 5, 41) != 5
|
|
# || ifc2(7, 5, 43) != 5
|
|
# || ifc3(7, 5, 42) != 7
|
|
# || ifc3(7, 5, 41) != 7
|
|
# || ifc3(7, 5, 43) != 5
|
|
# || ifclts(5.0f, 6.0f, 7, 5) != 5
|
|
# || ifclts(5.0f, 5.0f, 7, 5) != 7
|
|
# || ifclts(5.0f, 4.0f, 7, 5) != 7
|
|
# || ifclts(5.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifclts(0.0f/0.0f, 5.0f, 7, 5) != 7
|
|
# || ifclts(0.0f/0.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifcles(5.0f, 6.0f, 7, 5) != 5
|
|
# || ifcles(5.0f, 5.0f, 7, 5) != 5
|
|
# || ifcles(5.0f, 4.0f, 7, 5) != 7
|
|
# || ifcles(5.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifcles(0.0f/0.0f, 5.0f, 7, 5) != 7
|
|
# || ifcles(0.0f/0.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifcgts(5.0f, 6.0f, 7, 5) != 7
|
|
# || ifcgts(5.0f, 5.0f, 7, 5) != 7
|
|
# || ifcgts(5.0f, 4.0f, 7, 5) != 5
|
|
# || ifcgts(5.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifcgts(0.0f/0.0f, 5.0f, 7, 5) != 7
|
|
# || ifcgts(0.0f/0.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifcges(5.0f, 6.0f, 7, 5) != 7
|
|
# || ifcges(5.0f, 5.0f, 7, 5) != 5
|
|
# || ifcges(5.0f, 4.0f, 7, 5) != 5
|
|
# || ifcges(5.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifcges(0.0f/0.0f, 5.0f, 7, 5) != 7
|
|
# || ifcges(0.0f/0.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifceqs(5.0f, 6.0f, 7, 5) != 7
|
|
# || ifceqs(5.0f, 5.0f, 7, 5) != 5
|
|
# || ifceqs(5.0f, 4.0f, 7, 5) != 7
|
|
# || ifceqs(5.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifceqs(0.0f/0.0f, 5.0f, 7, 5) != 7
|
|
# || ifceqs(0.0f/0.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifcnes(5.0f, 6.0f, 7, 5) != 5
|
|
# || ifcnes(5.0f, 5.0f, 7, 5) != 7
|
|
# || ifcnes(5.0f, 4.0f, 7, 5) != 5
|
|
# || ifcnes(5.0f, 0.0f/0.0f, 7, 5) != 5
|
|
# || ifcnes(0.0f/0.0f, 5.0f, 7, 5) != 5
|
|
# || ifcnes(0.0f/0.0f, 0.0f/0.0f, 7, 5) != 5
|
|
# || ifcos(5.0f, 6.0f, 7, 5) != 5
|
|
# || ifcos(5.0f, 5.0f, 7, 5) != 5
|
|
# || ifcos(5.0f, 4.0f, 7, 5) != 5
|
|
# || ifcos(5.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifcos(0.0f/0.0f, 5.0f, 7, 5) != 7
|
|
# || ifcos(0.0f/0.0f, 0.0f/0.0f, 7, 5) != 7
|
|
# || ifcuos(5.0f, 6.0f, 7, 5) != 7
|
|
# || ifcuos(5.0f, 5.0f, 7, 5) != 7
|
|
# || ifcuos(5.0f, 4.0f, 7, 5) != 7
|
|
# || ifcuos(5.0f, 0.0f/0.0f, 7, 5) != 5
|
|
# || ifcuos(0.0f/0.0f, 5.0f, 7, 5) != 5
|
|
# || ifcuos(0.0f/0.0f, 0.0f/0.0f, 7, 5) != 5
|
|
# ;
|
|
# }
|
|
# <<<
|