- u16 out = 0x03E0; // don't need the mask after starting to write output
- u32 db,dg,gtmp;
- asm ("and %[dg], %[out], %[src] \n\t"
- "and %[gtmp],%[out], %[gCol], lsr #0x0B \n\t"
- "and %[db], %[out], %[src], lsr #0x05 \n\t"
- "orr %[dg], %[dg], %[gtmp], lsr #0x05 \n\t"
- "and %[gtmp],%[out], %[gCol] \n\t"
- "ldrb %[dg], [%[lut], %[dg]] \n\t"
- "and %[out], %[out], %[src], lsl #0x05 \n\t"
- "orr %[out], %[out], %[gCol], lsr #0x1B \n\t"
- "orr %[db], %[db], %[gtmp], lsr #0x05 \n\t"
- "ldrb %[out], [%[lut], %[out]] \n\t"
- "ldrb %[db], [%[lut], %[db]] \n\t"
- "orr %[out], %[out], %[dg], lsl #0x05 \n\t"
- "orr %[out], %[out], %[db], lsl #0x0A \n\t"
- : [out] "=&r" (out), [db] "=&r" (db), [dg] "=&r" (dg),
- [gtmp] "=&r" (gtmp) \
- : [gCol] "r" (gCol), [lut] "r" (gpu_unai.LightLUT), "0" (out), [src] "r" (uSrc)
- : "cc");
+ uint_fast16_t out = 0x03E0; // don't need the mask after starting to write output
+ u32 db,dg,gtmp;
+
+ // Using `g` for src, `G` for dest
+ asm ("and %[dg], %[out], %[src] \n\t" // dg holds 0x000000ggggg00000
+ "and %[gtmp],%[out], %[gCol], lsr #0x0B \n\t" // gtmp holds 0x000000GGGGG00000
+ "and %[db], %[out], %[src], lsr #0x05 \n\t" // db holds 0x000000bbbbb00000
+ "orr %[dg], %[dg], %[gtmp], lsr #0x05 \n\t" // dg holds 0x000000gggggGGGGG
+ "and %[gtmp],%[out], %[gCol] \n\t" // gtmp holds 0x000000BBBBB00000
+ "ldrb %[dg], [%[lut], %[dg]] \n\t" // dg holds result 0x00000000000ggggg
+ "and %[out], %[out], %[src], lsl #0x05 \n\t" // out holds 0x000000rrrrr00000
+ "orr %[out], %[out], %[gCol], lsr #0x1B \n\t" // out holds 0x000000rrrrrRRRRR
+ "orr %[db], %[db], %[gtmp], lsr #0x05 \n\t" // db holds 0x000000bbbbbBBBBB
+ "ldrb %[out], [%[lut], %[out]] \n\t" // out holds result 0x00000000000rrrrr
+ "ldrb %[db], [%[lut], %[db]] \n\t" // db holds result 0x00000000000bbbbb
+ "tst %[src], #0x8000\n\t" // check whether msb was set on uSrc
+ "orr %[out], %[out], %[dg], lsl #0x05 \n\t" // out holds 0x000000gggggrrrrr
+ "orrne %[out], %[out], #0x8000\n\t" // add msb to out if set on uSrc
+ "orr %[out], %[out], %[db], lsl #0x0A \n\t" // out holds 0xmbbbbbgggggrrrrr
+ : [out] "=&r" (out), [db] "=&r" (db), [dg] "=&r" (dg),
+ [gtmp] "=&r" (gtmp) \
+ : [gCol] "r" (gCol), [lut] "r" (gpu_unai.LightLUT), "0" (out), [src] "r" (uSrc)
+ : "cc");