Beispiel #1
0
int test__modsi3(si_int a, si_int b, si_int expected) {
    si_int x = __modsi3(a, b);
    if (x != expected)
        fprintf(stderr, "error in __modsi3: %d %% %d = %d, expected %d\n",
               a, b, x, expected);
    return x != expected;
}
Beispiel #2
0
static void trap_dispatch(struct trapframe *tf)
{
	int i;
	int code = GET_CAUSE_EXCODE(tf->tf_cause);
	switch (code) {
	case EX_IRQ:
		interrupt_handler(tf);
		break;
	case EX_MOD:
		handle_tlbmiss(tf, 1, 1);
		break;
	case EX_TLBL:
		handle_tlbmiss(tf, 0, 0);
		break;
	case EX_TLBS:
		handle_tlbmiss(tf, 1, 0);
		break;
  case EX_RI: {
    if(tf->tf_cause & (1 << 31)) {
      print_trapframe(tf);
      panic("Cannot fix unimplemented instruction in branch delay slot.");
    }
    const uint32_t DIV_OPCODE_MASK = 0xFC00FFFF;
    const uint32_t DIV_OPCODE = 0x0000001A;
    const uint32_t DIVU_OPCODE = 0x0000001B;
    const uint32_t MULTU_OPCODE = 0x00000019;
    uint32_t instruction = *(uint32_t*)tf->tf_epc;
    if((instruction & DIV_OPCODE_MASK) == DIV_OPCODE) {
      int rt = (instruction >> 16) & 0x1F;
      int rs = (instruction >> 21) & 0x1F;
      int dividend = rs == 0 ? 0 : tf->tf_regs.reg_r[rs - 1];
      int division = rt == 0 ? 0 : tf->tf_regs.reg_r[rt - 1];
      tf->tf_lo = __divsi3(dividend, division);
      tf->tf_hi = __modsi3(dividend, division);
      tf->tf_epc = (void*)((uint32_t)tf->tf_epc + 4);
      break;
    }
    else if((instruction & DIV_OPCODE_MASK) == DIVU_OPCODE) {
      int rt = (instruction >> 16) & 0x1F;
      int rs = (instruction >> 21) & 0x1F;
      int dividend = rs == 0 ? 0 : tf->tf_regs.reg_r[rs - 1];
      int division = rt == 0 ? 0 : tf->tf_regs.reg_r[rt - 1];
      tf->tf_lo = udivmodsi4(dividend, division, 0);
      tf->tf_hi = udivmodsi4(dividend, division, 1);
      tf->tf_epc = (void*)((uint32_t)tf->tf_epc + 4);
      break;
    }
Beispiel #3
0
int main()
{
    // Shift left 64 bits, less than 32 bit shift, unsigned value
    print64bit(__ashldi3(0x1257493827394374LL, 3));
    // CHECK: 0x92ba49c139ca1ba0

    // Shift left 64 bits, more than 32 bit shift, unsigned value
    print64bit(__ashldi3(0x1257493827394374LL, 34));
    // CHECK: 0x9ce50dd000000000

    // Logical shift right 64 bits, less than 32 bit shift, unsigned value
    print64bit(__lshrdi3(0x1d348856d51c4737LL, 7));
    // CHECK: 0x003a6910adaa388e

    // Signed value
    print64bit(__lshrdi3(0xfd348856d51c4737LL, 7));
    // CHECK: 0x01fa6910adaa388e

    // Logical shift right 64 bits, more than 32 bit shift, unsigned value
    print64bit(__lshrdi3(0x1d348856d51c4737LL, 37));
    // CHECK: 0x0000000000e9a442

    // Signed value
    print64bit(__lshrdi3(0xfd348856d51c4737LL, 37));
    // CHECK: 0x0000000007e9a442

    // Unsigned 32 bit integer division, signed value
    printf("0x%08x\n", __udivsi3(0xf39eca1b, 17));
    // CHECK: 0x0e54a27a

    // Unsigned value
    printf("0x%08x\n", __udivsi3(0x5b0a6c63, 17));
    // CHECK: 0x055af751

    // Signed 32 bit integer division, signed value
    printf("0x%08x\n", __divsi3(0xf39eca1b, 17));
    // CHECK: 0xff45936b

    // Unsigned value
    printf("0x%08x\n", __divsi3(0x539eca1b, 17));
    // CHECK: 0x04eb3910

    // Unsigned 32 bit integer modulus, signed value
    printf("0x%08x\n", __umodsi3(0xf39eca1b, 495));
    // CHECK: 0x000001d1

    // Unsigned value
    printf("0x%08x\n", __umodsi3(0x539eca1b, 495));
    // CHECK: 0x000000d7

    // Signed 32 bit integer modulus, signed value
    printf("0x%08x\n", __modsi3(0xf39eca1b, 495));
    // CHECK: 0xfffffeb5

    // Unsigned value
    printf("0x%08x\n", __modsi3(0x539eca1b, 495));
    // CHECK: 0x000000d7

    // Unsigned 64 bit integer division, signed value
    print64bit(__udivdi3(0xf3c367523e29230aLL, 495));
    // CHECK: 0x007e114680625881

    // Unsigned value
    print64bit(__udivdi3(0x53c367523e29230aLL, 495));
    // CHECK: 0x002b51ebff175b17

    // Signed 64 bit integer division, signed value
    print64bit(__divdi3(0xf3c367523e29230aLL, 495));
    // CHECK: 0xfff9abe8e4b72972

    // Unsigned value
    print64bit(__divdi3(0x53c367523e29230aLL, 495));
    // CHECK: 0x002b51ebff175b17

    // Unsigned 64 bit integer modulus, signed value
    print64bit(__umoddi3(0xf3c367523e29230aLL, 495));
    // CHECK: 0x000000000000019b

    // Unsigned value
    print64bit(__umoddi3(0x53c367523e29230aLL, 495));
    // CHECK: 0x0000000000000191

    // Signed 64 bit integer modulus, signed value
    print64bit(__moddi3(0xf3c367523e29230aLL, 495));
    // CHECK: 0xffffffffffffff9c

    // Unsigned value
    print64bit(__moddi3(0x53c367523e29230aLL, 495));
    // CHECK: 0x0000000000000191

    // Convert 64 bit value to float, greater than > 32 bits
    printfloathex(__floatundisf(1674874919848732277LL));
    // CHECK: 0x5db9f2cf

    // < 32 bits
    printfloathex(__floatundisf(1674877LL));
    // CHECK: 0x49cc73e8
}