| // Copyright 2014 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package ppc64asm |
| |
| import ( |
| "encoding/binary" |
| "strings" |
| "testing" |
| ) |
| |
| func TestObjdumpPowerTestdata(t *testing.T) { testObjdump(t, testdataCases(t)) } |
| func TestObjdumpPowerManual(t *testing.T) { testObjdump(t, hexCases(t, objdumpManualTests)) } |
| |
| // Disable this for now since generating all possible bit combinations within a word |
| // generates lots of ppc64x instructions not possible with golang so not worth supporting.. |
| //func TestObjdumpPowerRandom(t *testing.T) { testObjdump(t, randomCases(t)) } |
| |
| // objdumpManualTests holds test cases that will be run by TestObjdumpPowerManual. |
| // If you are debugging a few cases that turned up in a longer run, it can be useful |
| // to list them here and then use -run=Manual, particularly with tracing enabled. |
| // Note that these are byte sequences, so they must be reversed from the usual |
| // word presentation. |
| var objdumpManualTests = ` |
| 6d746162 |
| 4c040000 |
| 88000017 |
| ` |
| |
| // allowedMismatchObjdump reports whether the mismatch between text and dec |
| // should be allowed by the test. |
| func allowedMismatchObjdump(text string, size int, inst *Inst, dec ExtInst) bool { |
| // we support more instructions than binutils |
| if strings.Contains(dec.text, ".long") { |
| return true |
| } |
| |
| switch inst.Op { |
| case BC: // We don't print PC relative branches the same way. |
| return true |
| case DCBF, DCBT: // We only support extended mnemonics, and may not print 0 where R0 == 0. |
| return true |
| case MTVSRWA, MTVSRWZ, MFVSRWZ, MFVSRD, MTVSRD: // We don't support extended mnemonics using VRs or FPRs |
| return true |
| case ISEL: // We decode the BI similar to conditional branch insn, objdump doesn't. |
| return true |
| case SYNC, WAIT, RFEBB: // ISA 3.1 adds more bits and extended mnemonics for these book ii instructions. |
| return true |
| case BL: |
| // TODO: Ignore these for now. The output format from gnu objdump is dependent on more than the |
| // instruction itself e.g: decode(48100009) = "bl 0x100008", 4, want "bl .+0x100008", 4 |
| return true |
| } |
| |
| if len(dec.enc) >= 4 { |
| _ = binary.BigEndian.Uint32(dec.enc[:4]) |
| } |
| |
| return false |
| } |