18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * ARMv6 integer SIMD operations.
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 2007 CodeSourcery.
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Written by Paul Brook
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
70b4c9e8457959b01cd26f60ef214e9b5b7a297d4David 'Digit' Turner * This code is licensed under the GPL.
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef ARITH_GE
115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define GE_ARG , void *gep
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DECLARE_GE uint32_t ge = 0
135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define SET_GE *(uint32_t *)gep = ge
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define GE_ARG
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DECLARE_GE do{}while(0)
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SET_GE do{}while(0)
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define RESULT(val, n, width) \
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    res |= ((uint32_t)(glue(glue(uint,width),_t))(val)) << (n * width)
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint32_t HELPER(glue(PFX,add16))(uint32_t a, uint32_t b GE_ARG)
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t res = 0;
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DECLARE_GE;
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ADD16(a, b, 0);
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ADD16(a >> 16, b >> 16, 1);
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SET_GE;
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return res;
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint32_t HELPER(glue(PFX,add8))(uint32_t a, uint32_t b GE_ARG)
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t res = 0;
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DECLARE_GE;
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ADD8(a, b, 0);
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ADD8(a >> 8, b >> 8, 1);
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ADD8(a >> 16, b >> 16, 2);
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ADD8(a >> 24, b >> 24, 3);
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SET_GE;
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return res;
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint32_t HELPER(glue(PFX,sub16))(uint32_t a, uint32_t b GE_ARG)
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t res = 0;
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DECLARE_GE;
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SUB16(a, b, 0);
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SUB16(a >> 16, b >> 16, 1);
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SET_GE;
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return res;
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint32_t HELPER(glue(PFX,sub8))(uint32_t a, uint32_t b GE_ARG)
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t res = 0;
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DECLARE_GE;
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SUB8(a, b, 0);
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SUB8(a >> 8, b >> 8, 1);
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SUB8(a >> 16, b >> 16, 2);
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SUB8(a >> 24, b >> 24, 3);
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SET_GE;
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return res;
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint32_t HELPER(glue(PFX,subaddx))(uint32_t a, uint32_t b GE_ARG)
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t res = 0;
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DECLARE_GE;
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
765285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    ADD16(a, b >> 16, 0);
775285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    SUB16(a >> 16, b, 1);
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SET_GE;
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return res;
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint32_t HELPER(glue(PFX,addsubx))(uint32_t a, uint32_t b GE_ARG)
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t res = 0;
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    DECLARE_GE;
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
875285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    SUB16(a, b >> 16, 0);
885285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    ADD16(a >> 16, b, 1);
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SET_GE;
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return res;
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef GE_ARG
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef DECLARE_GE
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SET_GE
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef RESULT
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ARITH_GE
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef PFX
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ADD16
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SUB16
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ADD8
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SUB8
104