@@ -6102,18 +6102,22 @@ static void test58(void)
61026102 successful_tests ++ ;
61036103}
61046104
6105+ #if (defined SLJIT_SUBC_SETS_SIGNED + defined SLJIT_SHARED_COMPARISON_FLAGS ) != 1
6106+ #error "Currently all cpus supports exactly one of these features"
6107+ #endif
6108+
61056109static void test59 (void )
61066110{
61076111 /* Test carry flag. */
61086112 executable_code code ;
61096113 struct sljit_compiler * compiler = sljit_create_compiler (NULL );
6110- sljit_sw wbuf [15 ];
6114+ sljit_sw wbuf [31 ];
61116115 sljit_s32 i ;
61126116
61136117 if (verbose )
61146118 printf ("Run test59\n" );
61156119
6116- for (i = 0 ; i < 15 ; i ++ )
6120+ for (i = 0 ; i < 31 ; i ++ )
61176121 wbuf [i ] = -1 ;
61186122
61196123 FAILED (!compiler , "cannot create compiler\n" );
@@ -6215,6 +6219,132 @@ static void test59(void)
62156219 /* wbuf[14] */
62166220 sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 14 * sizeof (sljit_sw ), SLJIT_R1 , 0 );
62176221
6222+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R0 , 0 , SLJIT_IMM , 0 );
6223+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_S1 , 0 , SLJIT_IMM , 1 );
6224+ sljit_emit_op2 (compiler , SLJIT_SUB | SLJIT_SET_CARRY , SLJIT_R0 , 0 , SLJIT_R0 , 0 , SLJIT_S1 , 0 );
6225+ cond_set (compiler , SLJIT_R0 , 0 , SLJIT_CARRY );
6226+ /* wbuf[15] */
6227+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 15 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6228+
6229+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R2 , 0 , SLJIT_IMM , 0 );
6230+ sljit_emit_op2u (compiler , SLJIT_SUB | SLJIT_SET_CARRY , SLJIT_R2 , 0 , SLJIT_IMM , 1 );
6231+ sljit_emit_op2u (compiler , SLJIT_SUBC | SLJIT_SET_CARRY , SLJIT_IMM , 1 , SLJIT_R2 , 0 );
6232+ cond_set (compiler , SLJIT_R0 , 0 , SLJIT_CARRY );
6233+ /* wbuf[16] */
6234+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 16 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6235+
6236+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_S1 , 0 , SLJIT_IMM , 3 );
6237+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R0 , 0 , SLJIT_IMM , 3 );
6238+ sljit_emit_op2 (compiler , SLJIT_SUB | SLJIT_SET_CARRY , SLJIT_R0 , 0 , SLJIT_S1 , 0 , SLJIT_R0 , 0 );
6239+ /* wbuf[17] */
6240+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 17 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6241+ cond_set (compiler , SLJIT_R0 , 0 , SLJIT_NOT_CARRY );
6242+ /* wbuf[18] */
6243+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 18 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6244+
6245+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R1 , 0 , SLJIT_IMM , 1 );
6246+ sljit_emit_op2u (compiler , SLJIT_SUB | SLJIT_SET_CARRY , SLJIT_R1 , 0 , SLJIT_IMM , 1 );
6247+ sljit_emit_op2 (compiler , SLJIT_SUBC | SLJIT_SET_CARRY , SLJIT_R2 , 0 , SLJIT_R1 , 0 , SLJIT_IMM , 2 );
6248+ /* wbuf[19] */
6249+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 19 * sizeof (sljit_sw ), SLJIT_R2 , 0 );
6250+ cond_set (compiler , SLJIT_R0 , 0 , SLJIT_NOT_CARRY );
6251+ /* wbuf[20] */
6252+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 20 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6253+
6254+ #ifdef SLJIT_SUBC_SETS_SIGNED
6255+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R0 , 0 , SLJIT_IMM , 0 );
6256+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R1 , 0 , SLJIT_IMM , (sljit_sw )((sljit_uw )1 << ((sizeof (sljit_sw ) * 8 ) - 1 )));
6257+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R2 , 0 , SLJIT_R1 , 0 );
6258+ sljit_emit_op2 (compiler , SLJIT_SUB | SLJIT_SET_CARRY , SLJIT_R0 , 0 , SLJIT_R0 , 0 , SLJIT_IMM , 1 );
6259+ sljit_emit_op2 (compiler , SLJIT_SUBC | SLJIT_SET_CARRY , SLJIT_R2 , 0 , SLJIT_R2 , 0 , SLJIT_R1 , 0 );
6260+ sljit_set_current_flags (compiler , SLJIT_CURRENT_FLAGS_SUB | SLJIT_SET_SIG_LESS );
6261+ cond_set (compiler , SLJIT_R0 , 0 , SLJIT_SIG_LESS );
6262+ /* wbuf[21] */
6263+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 21 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6264+
6265+ sljit_emit_op1 (compiler , SLJIT_MOV32 , SLJIT_R0 , 0 , SLJIT_IMM , 0 );
6266+ sljit_emit_op1 (compiler , SLJIT_MOV32 , SLJIT_S1 , 0 , SLJIT_IMM , 0x7fffffff );
6267+ sljit_emit_op2 (compiler , SLJIT_SUB32 | SLJIT_SET_CARRY , SLJIT_R0 , 0 , SLJIT_R0 , 0 , SLJIT_IMM , -1 );
6268+ sljit_emit_op2 (compiler , SLJIT_SUBC32 | SLJIT_SET_CARRY , SLJIT_S1 , 0 , SLJIT_S1 , 0 , SLJIT_IMM , (sljit_sw )0x80000000 );
6269+ sljit_set_current_flags (compiler , SLJIT_CURRENT_FLAGS_SUB | SLJIT_CURRENT_FLAGS_32 | SLJIT_SET_SIG_LESS );
6270+ cond_set (compiler , SLJIT_R0 , 0 , SLJIT_SIG_LESS );
6271+ /* wbuf[22] */
6272+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 22 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6273+
6274+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R0 , 0 , SLJIT_IMM , 879 );
6275+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R1 , 0 , SLJIT_IMM , (sljit_sw )((sljit_uw )1 << ((sizeof (sljit_sw ) * 8 ) - 1 )));
6276+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R2 , 0 , SLJIT_IMM , (sljit_sw )(~(sljit_uw )0 >> 1 ));
6277+ sljit_emit_op2 (compiler , SLJIT_SUB | SLJIT_SET_CARRY , SLJIT_R0 , 0 , SLJIT_R0 , 0 , SLJIT_IMM , 300 );
6278+ sljit_emit_op2 (compiler , SLJIT_SUBC | SLJIT_SET_CARRY , SLJIT_R2 , 0 , SLJIT_R2 , 0 , SLJIT_R1 , 0 );
6279+ sljit_set_current_flags (compiler , SLJIT_CURRENT_FLAGS_SUB | SLJIT_SET_SIG_GREATER );
6280+ cond_set (compiler , SLJIT_R0 , 0 , SLJIT_SIG_GREATER );
6281+ /* wbuf[23] */
6282+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 23 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6283+
6284+ sljit_emit_op1 (compiler , SLJIT_MOV32 , SLJIT_R0 , 0 , SLJIT_IMM , -1 );
6285+ sljit_emit_op1 (compiler , SLJIT_MOV32 , SLJIT_S1 , 0 , SLJIT_IMM , -1 );
6286+ sljit_emit_op2 (compiler , SLJIT_SUB32 | SLJIT_SET_CARRY , SLJIT_R0 , 0 , SLJIT_R0 , 0 , SLJIT_IMM , 0 );
6287+ sljit_emit_op2 (compiler , SLJIT_SUBC32 | SLJIT_SET_CARRY , SLJIT_S1 , 0 , SLJIT_S1 , 0 , SLJIT_IMM , 0 );
6288+ sljit_set_current_flags (compiler , SLJIT_CURRENT_FLAGS_SUB | SLJIT_CURRENT_FLAGS_32 | SLJIT_SET_SIG_GREATER );
6289+ cond_set (compiler , SLJIT_S1 , 0 , SLJIT_SIG_GREATER );
6290+ /* wbuf[24] */
6291+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 24 * sizeof (sljit_sw ), SLJIT_S1 , 0 );
6292+
6293+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R0 , 0 , SLJIT_IMM , 678934 );
6294+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R1 , 0 , SLJIT_IMM , -589123 );
6295+ sljit_emit_op2 (compiler , SLJIT_SUB | SLJIT_SET_CARRY , SLJIT_R0 , 0 , SLJIT_R0 , 0 , SLJIT_IMM , 678934 );
6296+ sljit_emit_op2 (compiler , SLJIT_SUBC | SLJIT_SET_CARRY , SLJIT_R2 , 0 , SLJIT_R2 , 0 , SLJIT_IMM , -589123 );
6297+ sljit_set_current_flags (compiler , SLJIT_CURRENT_FLAGS_SUB | SLJIT_SET_SIG_LESS );
6298+ cond_set (compiler , SLJIT_R0 , 0 , SLJIT_SIG_GREATER_EQUAL );
6299+ /* wbuf[25] */
6300+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 25 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6301+
6302+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R0 , 0 , SLJIT_IMM , -1 );
6303+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R1 , 0 , SLJIT_IMM , (sljit_sw )(~(sljit_uw )0 >> 1 ));
6304+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R2 , 0 , SLJIT_IMM , 0 );
6305+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_S1 , 0 , SLJIT_IMM , (sljit_sw )((sljit_uw )1 << ((sizeof (sljit_sw ) * 8 ) - 1 )));
6306+ sljit_emit_op2 (compiler , SLJIT_SUB | SLJIT_SET_CARRY , SLJIT_R0 , 0 , SLJIT_R0 , 0 , SLJIT_R2 , 0 );
6307+ sljit_emit_op2 (compiler , SLJIT_SUBC | SLJIT_SET_CARRY , SLJIT_R1 , 0 , SLJIT_R1 , 0 , SLJIT_S1 , 0 );
6308+ sljit_set_current_flags (compiler , SLJIT_CURRENT_FLAGS_SUB | SLJIT_SET_SIG_LESS );
6309+ cond_set (compiler , SLJIT_R0 , 0 , SLJIT_SIG_LESS );
6310+ /* wbuf[26] */
6311+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 26 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6312+ #endif /* SLJIT_SUBC_SETS_SIGNED */
6313+
6314+ #ifdef SLJIT_SHARED_COMPARISON_FLAGS
6315+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R0 , 0 , SLJIT_IMM , 32 );
6316+ sljit_emit_op2u (compiler , SLJIT_SUB | SLJIT_SET_LESS , SLJIT_R0 , 0 , SLJIT_IMM , -5 );
6317+ sljit_emit_op2u (compiler , SLJIT_SUB | SLJIT_SET_SIG_LESS , SLJIT_R0 , 0 , SLJIT_IMM , -5 );
6318+ sljit_set_current_flags (compiler , SLJIT_CURRENT_FLAGS_SUB | SLJIT_CURRENT_FLAGS_COMPARE | SLJIT_SET_LESS );
6319+ cond_set (compiler , SLJIT_R0 , 0 , SLJIT_LESS );
6320+ /* wbuf[27] */
6321+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 27 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6322+
6323+ sljit_emit_op1 (compiler , SLJIT_MOV32 , SLJIT_R0 , 0 , SLJIT_IMM , -434 );
6324+ sljit_emit_op2u (compiler , SLJIT_SUB32 | SLJIT_SET_SIG_GREATER , SLJIT_R0 , 0 , SLJIT_IMM , 819 );
6325+ sljit_emit_op2u (compiler , SLJIT_SUB32 | SLJIT_SET_GREATER , SLJIT_R0 , 0 , SLJIT_IMM , 819 );
6326+ sljit_set_current_flags (compiler , SLJIT_CURRENT_FLAGS_SUB | SLJIT_CURRENT_FLAGS_COMPARE | SLJIT_CURRENT_FLAGS_32 | SLJIT_SET_SIG_GREATER );
6327+ cond_set (compiler , SLJIT_R1 , 0 , SLJIT_SIG_GREATER );
6328+ /* wbuf[28] */
6329+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 28 * sizeof (sljit_sw ), SLJIT_R1 , 0 );
6330+
6331+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_R0 , 0 , SLJIT_IMM , 55 );
6332+ sljit_emit_op2u (compiler , SLJIT_SUB | SLJIT_SET_GREATER , SLJIT_R0 , 0 , SLJIT_IMM , -234 );
6333+ sljit_emit_op2u (compiler , SLJIT_SUB | SLJIT_SET_SIG_GREATER , SLJIT_R0 , 0 , SLJIT_IMM , -234 );
6334+ sljit_set_current_flags (compiler , SLJIT_CURRENT_FLAGS_SUB | SLJIT_CURRENT_FLAGS_COMPARE | SLJIT_SET_GREATER );
6335+ cond_set (compiler , SLJIT_R0 , 0 , SLJIT_GREATER );
6336+ /* wbuf[29] */
6337+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 29 * sizeof (sljit_sw ), SLJIT_R0 , 0 );
6338+
6339+ sljit_emit_op1 (compiler , SLJIT_MOV32 , SLJIT_R0 , 0 , SLJIT_IMM , 576 );
6340+ sljit_emit_op2u (compiler , SLJIT_SUB32 | SLJIT_SET_SIG_GREATER_EQUAL , SLJIT_R0 , 0 , SLJIT_IMM , -645 );
6341+ sljit_emit_op2u (compiler , SLJIT_SUB32 | SLJIT_SET_GREATER_EQUAL , SLJIT_R0 , 0 , SLJIT_IMM , -645 );
6342+ sljit_set_current_flags (compiler , SLJIT_CURRENT_FLAGS_SUB | SLJIT_CURRENT_FLAGS_COMPARE | SLJIT_CURRENT_FLAGS_32 | SLJIT_SET_SIG_GREATER_EQUAL );
6343+ cond_set (compiler , SLJIT_S1 , 0 , SLJIT_SIG_GREATER_EQUAL );
6344+ /* wbuf[30] */
6345+ sljit_emit_op1 (compiler , SLJIT_MOV , SLJIT_MEM1 (SLJIT_S0 ), 30 * sizeof (sljit_sw ), SLJIT_S1 , 0 );
6346+ #endif /* SLJIT_SHARED_COMPARISON_FLAGS */
6347+
62186348 sljit_emit_return_void (compiler );
62196349
62206350 code .code = sljit_generate_code (compiler , 0 , NULL );
@@ -6238,6 +6368,26 @@ static void test59(void)
62386368 FAILED (wbuf [12 ] != 1 , "test59 case 13 failed\n" );
62396369 FAILED (wbuf [13 ] != 1 , "test59 case 14 failed\n" );
62406370 FAILED (wbuf [14 ] != 1 , "test59 case 15 failed\n" );
6371+ FAILED (wbuf [15 ] != 1 , "test59 case 16 failed\n" );
6372+ FAILED (wbuf [16 ] != 2 , "test59 case 17 failed\n" );
6373+ FAILED (wbuf [17 ] != 0 , "test59 case 18 failed\n" );
6374+ FAILED (wbuf [18 ] != 1 , "test59 case 19 failed\n" );
6375+ FAILED (wbuf [19 ] != -1 , "test59 case 20 failed\n" );
6376+ FAILED (wbuf [20 ] != 2 , "test59 case 21 failed\n" );
6377+ #ifdef SLJIT_SUBC_SETS_SIGNED
6378+ FAILED (wbuf [21 ] != 1 , "test59 case 22 failed\n" );
6379+ FAILED (wbuf [22 ] != 2 , "test59 case 23 failed\n" );
6380+ FAILED (wbuf [23 ] != 1 , "test59 case 24 failed\n" );
6381+ FAILED (wbuf [24 ] != 2 , "test59 case 25 failed\n" );
6382+ FAILED (wbuf [25 ] != 1 , "test59 case 26 failed\n" );
6383+ FAILED (wbuf [26 ] != 2 , "test59 case 27 failed\n" );
6384+ #endif /* SLJIT_SUBC_SETS_SIGNED */
6385+ #ifdef SLJIT_SHARED_COMPARISON_FLAGS
6386+ FAILED (wbuf [27 ] != 2 , "test59 case 28 failed\n" );
6387+ FAILED (wbuf [28 ] != 1 , "test59 case 29 failed\n" );
6388+ FAILED (wbuf [29 ] != 1 , "test59 case 30 failed\n" );
6389+ FAILED (wbuf [30 ] != 2 , "test59 case 31 failed\n" );
6390+ #endif /* SLJIT_SHARED_COMPARISON_FLAGS */
62416391 sljit_free_code (code .code , NULL );
62426392
62436393 successful_tests ++ ;
0 commit comments