-
Notifications
You must be signed in to change notification settings - Fork 3
/
condition_codes.go
87 lines (76 loc) · 2.15 KB
/
condition_codes.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package x64
type ConditionCode byte
const (
CCUnsignedLT ConditionCode = 2
CCUnsignedGTE ConditionCode = 3
CCEq ConditionCode = 4
CCNeq ConditionCode = 5
CCUnsignedLTE ConditionCode = 6
CCUnsignedGT ConditionCode = 7
CCSignedLT ConditionCode = 0xC
CCSignedGTE ConditionCode = 0xD
CCSignedLTE ConditionCode = 0xE
CCSignedGT ConditionCode = 0xF
)
var invccTable = [...]ConditionCode{
CCUnsignedGTE, // CCUnsignedLT
CCUnsignedLT, // CCUnsignedGTE
CCNeq, // CCEq
CCEq, // CCNeq
CCUnsignedGT, // CCUnsignedLTE
CCUnsignedLTE, // CCUnsignedGT
CCSignedGTE, // CCSignedLT
CCSignedLT, // CCSignedGTE
CCSignedGT, // CCSignedLTE
CCSignedLTE, // CCSignedGT
}
var jccTable = [...]Inst{
JB, // CCUnsignedLT
JNB, // CCUnsignedGTE
JZ, // CCEq
JNZ, // CCNeq
JBE, // CCUnsignedLTE
JNBE, // CCUnsignedGT
JL, // CCSignedLT
JNL, // CCSignedGTE
JLE, // CCSignedLTE
JNLE, // CCSignedGT
}
var setccTable = [...]Inst{
SETB, // CCUnsignedLT
SETNB, // CCUnsignedGTE
SETZ, // CCEq
SETNZ, // CCNeq
SETBE, // CCUnsignedLTE
SETNBE, // CCUnsignedGT
SETL, // CCSignedLT
SETNL, // CCSignedGTE
SETLE, // CCSignedLTE
SETNLE, // CCSignedGT
}
var cmovccTable = [...]Inst{
CMOVB, // CCUnsignedLT
CMOVNB, // CCUnsignedGTE
CMOVZ, // CCEq
CMOVNZ, // CCNeq
CMOVBE, // CCUnsignedLTE
CMOVNBE, // CCUnsignedGT
CMOVL, // CCSignedLT
CMOVNL, // CCSignedGTE
CMOVLE, // CCSignedLTE
CMOVNLE, // CCSignedGT
}
func ccTableOffset(cc ConditionCode) uint8 {
if cc < CCSignedLT {
return uint8(cc - CCUnsignedLT)
}
return uint8(((CCUnsignedGT + 1) - CCUnsignedLT) + (cc - CCSignedLT))
}
// Get the conditional-jump instruction for a condition code.
func Jcc(cc ConditionCode) Inst { return jccTable[ccTableOffset(cc)] }
// Get the conditional-set instruction for a condition code.
func Setcc(cc ConditionCode) Inst { return setccTable[ccTableOffset(cc)] }
// Get the conditional-move instruction for a condition code.
func Cmovcc(cc ConditionCode) Inst { return cmovccTable[ccTableOffset(cc)] }
// Invert a condition code.
func Invcc(cc ConditionCode) ConditionCode { return invccTable[ccTableOffset(cc)] }