Lines Matching refs:inst

14 func GNUSyntax(inst Inst) string {
21 switch inst.Op {
28 _, reg1 := inst.Args[0].(Reg)
29 _, reg2 := inst.Args[1].(Reg)
30 if reg1 && reg2 && (inst.Opcode>>24 == 0xDC || inst.Opcode>>24 == 0xDE) {
31 switch inst.Op {
33 inst.Op = FDIVR
35 inst.Op = FDIV
37 inst.Op = FSUBR
39 inst.Op = FSUB
41 inst.Op = FDIVRP
43 inst.Op = FDIVP
45 inst.Op = FSUBRP
47 inst.Op = FSUBP
58 if countPrefix(&inst, 0xF3) > 0 {
60 for i := len(inst.Prefix) - 1; i >= 0; i-- {
61 switch inst.Prefix[i] & 0xFF {
65 inst.Prefix[i] |= PrefixImplicit
68 inst.Prefix[i] &^= PrefixImplicit
71 inst.Op = MOVNTSS
76 switch inst.Op {
78 inst.Args[0] = EDX
79 inst.Args[1] = ECX
80 inst.Args[2] = EAX
81 if inst.AddrSize == 16 {
82 inst.Args[2] = AX
86 if inst.Mode == 64 {
87 inst.Args[0] = RCX
88 inst.Args[1] = RAX
90 inst.Args[0] = ECX
91 inst.Args[1] = EAX
100 switch inst.Op {
108 if countPrefix(&inst, 0xF2) > 1 {
109 unmarkImplicit(&inst, 0xF2)
110 markLastImplicit(&inst, 0xF2)
117 unmarkImplicit(&inst, PrefixDataSize)
118 markLastImplicit(&inst, PrefixDataSize)
121 if !isMem(inst.Args[1]) {
122 markLastImplicit(&inst, PrefixDataSize)
128 markLastImplicit(&inst, PrefixDataSize)
131 markLastImplicit(&inst, PrefixAddrSize)
142 dst, _ := inst.Args[0].(Reg)
143 src, _ := inst.Args[1].(Reg)
144 …if ES <= src && src <= GS && isMem(inst.Args[0]) || ES <= dst && dst <= GS && isMem(inst.Args[1]) {
145 unmarkImplicit(&inst, PrefixDataSize)
149 if countPrefix(&inst, 0xF3) > 1 {
150 unmarkImplicit(&inst, 0xF3)
151 markLastImplicit(&inst, 0xF3)
155 markLastImplicit(&inst, PrefixDataSize)
158 if isMem(inst.Args[0]) {
159 unmarkImplicit(&inst, PrefixDataSize)
163 unmarkImplicit(&inst, PrefixDataSize)
166 …if isCondJmp[inst.Op] || isLoop[inst.Op] || inst.Op == JCXZ || inst.Op == JECXZ || inst.Op == JRCX…
167 if countPrefix(&inst, PrefixCS) > 0 && countPrefix(&inst, PrefixDS) > 0 {
168 for i, p := range inst.Prefix {
171 inst.Prefix[i] &= 0xF0FF // cut interpretation bits, producing original segment prefix
178 if inst.Op == MOV {
183 for i := len(inst.Prefix) - 1; i >= 0; i-- {
184 switch inst.Prefix[i] &^ PrefixIgnored {
189 inst.Prefix[i] = PrefixREP
198 for i := len(inst.Prefix) - 1; i >= 0; i-- {
199 switch inst.Prefix[i] &^ PrefixIgnored {
204 inst.Prefix[i] = PrefixREP
211 inst.Prefix[i] = PrefixREPN
217 op := strings.ToLower(inst.Op.String())
218 if alt := gnuOp[inst.Op]; alt != "" {
231 for i, a := range inst.Args {
237 switch inst.Op {
275 switch inst.Op {
282 op += byteSizeSuffix(argBytes(&inst, inst.Args[1]))
285 op += byteSizeSuffix(inst.DataSize / 8)
289 …op = op[:4] + byteSizeSuffix(argBytes(&inst, inst.Args[1])) + byteSizeSuffix(argBytes(&inst, inst.…
293 if inst.AddrSize == 16 {
300 if inst.Opcode>>24 == 0xEB {
303 if inst.DataSize == 16 && inst.Mode != 16 {
304 markLastImplicit(&inst, PrefixDataSize)
306 } else if inst.Mode == 64 {
312 if inst.DataSize == 16 {
317 if markLastImplicit(&inst, PrefixDataSize) {
318 op += byteSizeSuffix(inst.DataSize / 8)
319 } else if inst.Mode == 64 {
322 op += byteSizeSuffix(inst.MemBytes)
326 if isFloat(inst.Op) {
328 switch inst.MemBytes {
330 if (inst.Op == FLD || inst.Op == FSTP) && isMem(inst.Args[0]) {
334 if isFloatInt(inst.Op) {
340 if isFloatInt(inst.Op) {
349 op += byteSizeSuffix(inst.MemBytes)
354 switch inst.Op {
356 if inst.Prefix[0] != 0 {
357 return strings.ToLower(inst.Prefix[0].String())
361 if inst.Opcode>>24 == 0xCC {
362 inst.Args[0] = nil
367 imm, ok := inst.Args[2].(Imm)
369 inst.Args[2] = nil
374 imm, ok := inst.Args[2].(Imm)
376 inst.Args[2] = nil
381 if markLastImplicit(&inst, PrefixAddrSize) {
391 for i, a := range inst.Args {
395 switch inst.Op {
403 if a == Imm(1) && (inst.Opcode>>24)&^1 == 0xD0 {
406 args = append(args, gnuArg(&inst, a, &usedPrefixes))
411 switch inst.Op {
429 for _, p := range inst.Prefix {
434 for _, p := range inst.Prefix {
467 if inst.Mode == 32 {
471 if countPrefix(&inst, PrefixAddrSize) > numAddr {
472 n = inst.Mode
478 if implicitData && countPrefix(&inst, PrefixDataSize) > 1 {
482 if inst.Mode == 16 {
486 if countPrefix(&inst, PrefixDataSize) > numData {
487 if inst.Mode == 16 {
505 …if (inst.Op == CALL || inst.Op == JMP || inst.Op == LJMP || inst.Op == LCALL) && (isMem(inst.Args[…
516 func gnuArg(inst *Inst, x Arg, usedPrefixes *bool) string {
522 switch inst.Op {
524 if inst.DataSize == 16 && EAX <= x && x <= R15L {
554 switch inst.Op {
561 for i := len(inst.Prefix) - 1; i >= 0; i-- {
562 p := inst.Prefix[i] &^ PrefixIgnored
570 inst.Prefix[i] |= PrefixImplicit
575 inst.Prefix[i] |= PrefixImplicit
580 inst.Prefix[i] |= PrefixImplicit
585 inst.Prefix[i] |= PrefixImplicit
590 inst.Prefix[i] |= PrefixImplicit
595 inst.Prefix[i] |= PrefixImplicit
623 ….Index == 0 && x.Scale == 1 && (x.Base == ESP || x.Base == RSP || x.Base == 0 && inst.Mode == 64) {
635 if inst.AddrSize == 64 {
649 if inst.Mode == 32 {
863 func countPrefix(inst *Inst, target Prefix) int {
865 for _, p := range inst.Prefix {
873 func markLastImplicit(inst *Inst, prefix Prefix) bool {
874 for i := len(inst.Prefix) - 1; i >= 0; i-- {
875 p := inst.Prefix[i]
877 inst.Prefix[i] |= PrefixImplicit
884 func unmarkImplicit(inst *Inst, prefix Prefix) {
885 for i := len(inst.Prefix) - 1; i >= 0; i-- {
886 p := inst.Prefix[i]
888 inst.Prefix[i] &^= PrefixImplicit
907 func argBytes(inst *Inst, arg Arg) int {
909 return inst.MemBytes