[Mesa-dev] [PATCH 1/2] gm107/ir: make use of FADD32I for all immediates
Ilia Mirkin
imirkin at alum.mit.edu
Tue Jun 28 03:10:51 UTC 2016
On Mon, Jun 27, 2016 at 6:08 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
>
>
> On 06/28/2016 12:06 AM, Ilia Mirkin wrote:
>>
>> On Mon, Jun 27, 2016 at 6:05 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>>>
>>> On Mon, Jun 27, 2016 at 6:04 PM, Samuel Pitoiset
>>> <samuel.pitoiset at gmail.com> wrote:
>>>>
>>>>
>>>>
>>>> On 06/28/2016 12:02 AM, Ilia Mirkin wrote:
>>>>>
>>>>>
>>>>> This loses you saturation. Does the target account for this?
>>>>
>>>>
>>>>
>>>> No saturate flag for FADD32I.
>>>
>>>
>>> That's not what I asked.
>>
>>
>> Specifically look at this code:
>>
>> bool
>> TargetNVC0::isSatSupported(const Instruction *insn) const
>> {
>> if (insn->op == OP_CVT)
>> return true;
>> if (!(opInfo[insn->op].dstMods & NV50_IR_MOD_SAT))
>> return false;
>>
>> if (insn->dType == TYPE_U32)
>> return (insn->op == OP_ADD) || (insn->op == OP_MAD);
>>
>> // add f32 LIMM cannot saturate
>> if (insn->op == OP_ADD && insn->sType == TYPE_F32) {
>> if (insn->getSrc(1)->asImm() &&
>> insn->getSrc(1)->reg.data.u32 & 0xfff)
>> return false;
>> }
>>
>> Note how it will say that sat is supported for SIMMs with FADD? So the
>> compiler will generate those ops, but then the emitter won't be able
>> to handle it.
>>
>
> Okay, I get it.
By the way, instead of trying to fight the longIMMD, you should just fix it -
/*0008*/ @P0 FADD R0, R0, 1.NEG; /*
0x3858203f80000000 */
which corresponds nicely to
emitNEG(0x2d, insn->src(1));
The issue is that emitIMMD does
if (len == 19) {
...
emitField( 56, 1, (val & 0x80000) >> 19);
emitField(pos, len, (val & 0x7ffff));
So the problem is that the 56 isn't as fixed as the emission code had
hoped. I suspect that adjusting it will fix all these silly cases.
-ilia
More information about the mesa-dev
mailing list