Chris.Dewhurst via llvm-dev
2015-Nov-16 11:36 UTC
[llvm-dev] Sparc CASA instruction encoding
Hi,
I have tried to add the LEON CASArr instruction as part of a Sparc Subtarget to
the Sparc instructions. Almost all the tests I've written have worked
without problem, but when I try to encode the instruction, it doesn't work.
I modelled it on the CASrr instruction which it basically mimics in every regard
except the ASI.
// The CAS instruction, unlike other instructions, only comes in a
// form which requires an ASI be provided. The ASI value hardcoded
// here is ASI_PRIMARY, the default unprivileged ASI for SparcV9.
let Predicates = [HasV9], Constraints = "$swap = $rd", asi =
0b10000000 in
def CASrr: F3_1_asi<3, 0b111100,
(outs IntRegs:$rd), (ins IntRegs:$rs1, IntRegs:$rs2,
IntRegs:$swap),
"cas [$rs1], $rs2, $rd",
[(set i32:$rd,
(atomic_cmp_swap iPTR:$rs1, i32:$rs2, i32:$swap))],
NoItinerary>;
// CASA supported on some LEON3 and all LEON4 processors. Same pattern as
// CASrr, above, but with a different ASI.
// Requires the use of SparcV8's default ASI, 0xA ("User Data").
let Predicates = [CASASupported], Constraints = "$swap = $rd", asi =
0b00001010 in
def CASArr: F3_1_asi<3, 0b111100,
(outs IntRegs:$rd), (ins IntRegs:$rs1, IntRegs:$rs2,
IntRegs:$swap),
"casa [$rs1], $rs2, $rd",
[(set i32:$rd,
(atomic_cmp_swap iPTR:$rs1, i32:$rs2, i32:$swap))],
NoItinerary>;
However, when I get the following trying to encode the instruction to binary:
$ llvm-mc leon-atomic-instructions.s -arch=sparc -mcpu=gr712rc -show-encoding
.text
leon-atomic-instructions.s:4:15: error: invalid operand for instruction
casa [%i0], %l6, %o2
The only operative line in leon-atomic-instructions is the one that throws the
error. gr712rc is the name of the CPU I've added, which switches on the
"CASASupported" feature that you can see in the instruction definition
above. All this part of the system works, so it's almost certainly nothing
there - plus I've performed many tests to verify this.
I've also run the pre-existing test in test/MC/Sparc: llvm-mc
sparcv9-atomic-instructions -arch=sparc -show-encoding. This works fine and I
don't get any such error ("invalid operand for instruction") on
"cas [%i0], %l6, %o2".
Can anyone explain why I get a difference between the two and what I need to
change?
Best Regards,
Chris Dewhurst.
University of Limerick.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20151116/ec66901b/attachment.html>
Tim Northover via llvm-dev
2015-Nov-16 15:20 UTC
[llvm-dev] Sparc CASA instruction encoding
Hi Chris, On 16 November 2015 at 03:36, Chris.Dewhurst via llvm-dev <llvm-dev at lists.llvm.org> wrote:> Can anyone explain why I get a difference between the two and what I need to > change?It looks like Sparc has a special hack for "cas" and "casx" in AsmParser/SparcAsmParser.cpp (top of the parseOperand function). You probably need to add "casa" to the list of mnemonics checked. Cheers. Tim.